loading-games 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme.ts","../src/dpad.ts","../src/games/snake/index.ts","../src/games/brick-breaker/index.ts","../src/games/flappy/index.ts","../src/games/2048/index.ts","../src/games/wordle-lite/index.ts","../src/games/asteroids/index.ts","../src/games/memory-cards/index.ts","../src/games/whack-a-mole/index.ts","../src/controller.ts","../src/delay.ts","../src/scores.ts","../src/component.ts","../src/index.ts"],"names":["readCSSVar","varName","getSystemDefaults","DARK_DEFAULTS","LIGHT_DEFAULTS","resolveTheme","theme","resolved","key","cssVar","CSS_VAR_MAP","cssValue","value","applyThemeToElement","element","init_theme","__esmMin","ARROWS","Dpad","init_dpad","options","parent","primaryColor","textColor","showFire","overlay","cells","cell","btn","bg","text","target","snake_exports","__export","SnakeGame","GRID_SIZE","BASE_TICK_MS","SPEED_INCREASE","SWIPE_THRESHOLD","init_snake","onScore","onGameOver","canvas","dpr","rect","mid","occupied","p","pos","now","head","next","ctx","cellSize","W","H","x","y","fx","fy","i","padding","alpha","r","px","py","pw","ph","dir","touch","dx","dy","absDx","absDy","brick_breaker_exports","BrickBreakerGame","init_brick_breaker","_onGameOver","flappy_exports","FlappyGame","GRAVITY","JUMP_VELOCITY","PIPE_WIDTH","PIPE_GAP","PIPE_SPEED","BIRD_X","BIRD_RADIUS","init_flappy","e","maxTop","topHeight","t","dt","pipe","inX","inY","bY","__exports","Game2048","init__","_onScore","wordle_lite_exports","WordleLiteGame","init_wordle_lite","asteroids_exports","AsteroidsGame","init_asteroids","memory_cards_exports","MemoryCardsGame","EMOJIS","GRID","FLIP_MS","init_memory_cards","pairs","j","emoji","id","cols","rows","w","h","b","total","idx","card","a","elapsed","timeBonus","c","scaleX","cx","cy","pulse","n","whack_a_mole_exports","WhackAMoleGame","ROUND_DURATION","HOLE_COUNT","SPAWN_START_MS","SPAWN_END_MS","MOLE_MIN_STAY","MOLE_STAY_RANGE","init_whack_a_mole","available","interval","hole","padX","padY","cellW","cellH","col","row","num","step","progress","prog","offsetY","DelayController","remaining","STORAGE_KEY","readStore","raw","writeStore","store","buildKey","game","namespace","getPersonalBest","saveScore","score","existing","isNewRecord","getAllScores","clearScores","prefix","filtered","SIZE_MAP","GameController","host","callbacks","opts","resolvedName","GameClass","err","size","dimensions","animation","message","toast","el","duration","personalBest","badge","name","games","state","ms","resolve","LoadingGameElement","result","oldValue","newValue","delay","minDisplay","exitAnimation","saveScores"],"mappings":"kIAoCA,SAASA,EAAAA,CAAWC,CAAAA,CAAgC,CAClD,OAAI,OAAO,OAAW,GAAA,CAAoB,IAAA,CAC5B,gBAAA,CAAiB,QAAA,CAAS,eAAe,CAAA,CACpD,iBAAiBA,CAAO,CAAA,CACxB,IAAA,EAAK,EACQ,IAClB,CAKA,SAASC,EAAAA,EAAmC,CAC1C,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OAAOC,EAC1C,GAAI,CAEF,OADoB,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA,CACjDA,CAAAA,CAAgBC,EACvC,CAAA,KAAQ,CACN,OAAOD,CACT,CACF,CAMO,SAASE,CAAAA,CAAaC,CAAAA,CAAoC,CAG/D,IAAMC,CAAAA,CAA0B,CAAE,GAFXL,EAAAA,EAE6B,CAAA,CAGpD,IAAA,GAAW,CAACM,EAAKC,CAAM,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQC,CAAW,CAAA,CAAsC,CAC1F,IAAMC,CAAAA,CAAWX,EAAAA,CAAWS,CAAM,CAAA,CAC9BE,CAAAA,GACFJ,CAAAA,CAASC,CAAG,CAAA,CAAIG,CAAAA,EAEpB,CAGA,GAAIL,CAAAA,CACF,IAAA,GAAW,CAACE,CAAAA,CAAKI,CAAK,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQN,CAAK,CAAA,CACzCM,IACFL,CAAAA,CAASC,CAAG,CAAA,CAAII,CAAAA,CAAAA,CAKtB,OAAOL,CACT,CAMO,SAASM,CAAAA,CAAoBC,CAAAA,CAAsBR,CAAAA,CAA4B,CACpF,IAAA,GAAW,CAACE,EAAKC,CAAM,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQC,CAAW,CAAA,CACpDI,CAAAA,CAAQ,KAAA,CAAM,WAAA,CAAYL,CAAAA,CAAQH,CAAAA,CAAME,CAAG,CAAC,EAEhD,CA9FA,IASML,CAAAA,CAQAC,EAAAA,CAQAM,CAAAA,CAzBNK,CAAAA,CAAAC,CAAAA,CAAA,IAAA,CASMb,CAAAA,CAA+B,CACnC,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,UACT,IAAA,CAAM,SAAA,CACN,MAAA,CAAQ,SACV,CAAA,CAEMC,EAAAA,CAAgC,CACpC,OAAA,CAAS,SAAA,CACT,UAAA,CAAY,SAAA,CACZ,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,UACN,MAAA,CAAQ,SACV,CAAA,CAEMM,CAAAA,CAAmD,CACvD,OAAA,CAAS,cAAA,CACT,UAAA,CAAY,iBAAA,CACZ,OAAA,CAAS,cAAA,CACT,IAAA,CAAM,WAAA,CACN,MAAA,CAAQ,aACV,EAAA,CAAA,CAAA,CC/BA,IA+BMO,EAAAA,CAOOC,CAAAA,CAtCbC,CAAAA,CAAAH,CAAAA,CAAA,IAAA,CA+BMC,EAAAA,CAAwC,CAC5C,EAAA,CAAI,QAAA,CACJ,IAAA,CAAM,QAAA,CACN,IAAA,CAAM,SACN,KAAA,CAAO,QACT,CAAA,CAEaC,CAAAA,CAAN,KAAW,CAKhB,WAAA,CAAoBE,CAAAA,CAAsB,CAAtB,IAAA,CAAA,OAAA,CAAAA,CAAAA,CAClB,IAAA,CAAK,UAAA,CAAa,IAAA,CAAK,YAAY,IAAA,CAAK,IAAI,CAAA,CAC5C,IAAA,CAAK,UAAA,CAAa,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,EAC9C,CAPQ,OAAA,CAAiC,IAAA,CACjC,UAAA,CACA,WAQR,KAAA,EAAc,CAEZ,GADI,EAAE,cAAA,GAAkB,MAAA,CAAA,EACpB,IAAA,CAAK,OAAA,CAAS,OAElB,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,YAAA,CAAAC,EAAc,SAAA,CAAAC,CAAAA,CAAW,QAAA,CAAAC,CAAS,CAAA,CAAI,IAAA,CAAK,OAAA,CAG5C,gBAAA,CAAiBH,CAAM,CAAA,CAC3B,QAAA,GAAa,QAAA,GAAUA,CAAAA,CAAO,KAAA,CAAM,SAAW,UAAA,CAAA,CAE1D,IAAMI,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC5CA,CAAAA,CAAQ,YAAA,CAAa,cAAA,CAAgB,EAAE,CAAA,CACvCA,CAAAA,CAAQ,KAAA,CAAM,QAAU,CACtB,mBAAA,CACA,aAAA,CACA,UAAA,CACA,4BAAA,CACA,cAAA,CACA,sCAAA,CACA,mCAAA,CACA,SAAA,CACA,qBAAA,CACA,YACF,CAAA,CAAE,IAAA,CAAK,GAAG,EAGV,IAAMC,CAAAA,CAA2C,CAC/C,IAAA,CAAM,IAAA,CAAM,IAAA,CACZ,MAAA,CAAQF,CAAAA,CAAW,MAAA,CAAS,IAAA,CAAM,OAAA,CAClC,IAAA,CAAM,MAAA,CAAQ,IAChB,EAEA,IAAA,IAAWG,CAAAA,IAAQD,CAAAA,CAAO,CACxB,IAAME,CAAAA,CAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CACvCD,CAAAA,EAAQA,CAAAA,GAAS,MAAA,EACnBC,CAAAA,CAAI,YAAcX,EAAAA,CAAOU,CAAI,CAAA,CAC7BC,CAAAA,CAAI,YAAA,CAAa,YAAA,CAAcD,CAAI,CAAA,CACnCC,CAAAA,CAAI,OAAA,CAAQ,GAAA,CAAMD,CAAAA,CAClBC,CAAAA,CAAI,KAAA,CAAM,QAAU,IAAA,CAAK,WAAA,CAAYN,CAAAA,CAAcC,CAAS,CAAA,EACnDI,CAAAA,GAAS,MAAA,EAClBC,CAAAA,CAAI,WAAA,CAAc,QAAA,CAClBA,CAAAA,CAAI,YAAA,CAAa,YAAA,CAAc,MAAM,EACrCA,CAAAA,CAAI,OAAA,CAAQ,MAAA,CAAS,MAAA,CACrBA,CAAAA,CAAI,KAAA,CAAM,OAAA,CAAU,IAAA,CAAK,WAAA,CAAYN,CAAAA,CAAcC,CAAS,CAAA,EAE5DK,CAAAA,CAAI,KAAA,CAAM,QAAU,oBAAA,CAEtBH,CAAAA,CAAQ,WAAA,CAAYG,CAAG,EACzB,CAEAH,CAAAA,CAAQ,gBAAA,CAAiB,OAAA,CAAS,IAAA,CAAK,UAAU,CAAA,CACjDA,CAAAA,CAAQ,gBAAA,CAAiB,aAAc,IAAA,CAAK,UAAA,CAAY,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CAEzEJ,CAAAA,CAAO,WAAA,CAAYI,CAAO,CAAA,CAC1B,IAAA,CAAK,OAAA,CAAUA,EACjB,CAGA,OAAA,EAAgB,CACT,IAAA,CAAK,OAAA,GACV,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,OAAA,CAAS,IAAA,CAAK,UAAU,CAAA,CACzD,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,aAAc,IAAA,CAAK,UAAU,CAAA,CAC9D,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,CACpB,IAAA,CAAK,OAAA,CAAU,IAAA,EACjB,CAEQ,WAAA,CAAYI,CAAAA,CAAYC,CAAAA,CAAsB,CACpD,OAAO,CACL,qBAAA,CACA,YAAA,CACA,aAAA,CACA,aAAA,CACA,mBAAA,CACA,CAAA,WAAA,EAAcD,CAAE,CAAA,EAAA,CAAA,CAChB,CAAA,MAAA,EAASC,CAAI,CAAA,CAAA,CACb,gBAAA,CACA,eACA,oBAAA,CACA,wBAAA,CACA,2BAAA,CACA,gBAAA,CACA,yCACF,CAAA,CAAE,IAAA,CAAK,GAAG,CACZ,CAEQ,WAAA,CAAY,CAAA,CAAqB,CACvC,IAAMC,EAAU,CAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,0BAA0B,CAAA,CACtEA,CAAAA,GACDA,CAAAA,CAAO,OAAA,CAAQ,GAAA,CACjB,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAYA,CAAAA,CAAO,OAAA,CAAQ,GAAoB,CAAA,CACnDA,CAAAA,CAAO,OAAA,CAAQ,MAAA,GAAW,MAAA,EACnC,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAS,EAE1B,CAEQ,WAAA,CAAY,CAAA,CAAqB,CACvC,IAAMA,EAAU,CAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,0BAA0B,CAAA,CACtEA,CAAAA,GACDA,CAAAA,CAAO,OAAA,CAAQ,GAAA,CACjB,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAYA,CAAAA,CAAO,OAAA,CAAQ,GAAoB,CAAA,CACnDA,CAAAA,CAAO,OAAA,CAAQ,MAAA,GAAW,MAAA,EACnC,IAAA,CAAK,OAAA,CAAQ,MAAA,IAAS,EAE1B,CACF,EAAA,CAAA,ECzJA,IAAAC,CAAAA,CAAA,EAAA,CAAAC,EAAAD,CAAAA,CAAA,CAAA,SAAA,CAAA,IAAAE,CAAAA,CAAAA,CAAAA,CAAA,IAkBMC,CAAAA,CACAC,CAAAA,CACAC,EAAAA,CACAC,EAAAA,CAEOJ,CAAAA,CAvBbK,CAAAA,CAAAvB,CAAAA,CAAA,IAAA,CAYAD,CAAAA,EAAAA,CACAI,CAAAA,EAAAA,CAKMgB,EAAY,EAAA,CACZC,CAAAA,CAAe,GAAA,CACfC,EAAAA,CAAiB,CAAA,CACjBC,EAAAA,CAAkB,EAAA,CAEXJ,CAAAA,CAAN,KAAsC,CAClC,IAAA,CAAO,OAAA,CACP,UAAA,CAAa,GAAA,CAEd,OACA,GAAA,CACA,KAAA,CAEA,KAAA,CAAiB,EAAC,CAClB,IAAA,CAAc,CAAE,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAE,CAAA,CAC3B,SAAA,CAAuB,OAAA,CACvB,cAA2B,OAAA,CAC3B,KAAA,CAAQ,CAAA,CACR,MAAA,CAASE,CAAAA,CACT,QAAA,CAAW,CAAA,CACX,WAAA,CAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CACV,QAAA,CAAW,CAAA,CAEX,YAAA,CACA,gBACA,aAAA,CACA,WAAA,CAAc,CAAA,CACd,WAAA,CAAc,CAAA,CACd,aAAA,CAAgB,KAAA,CAChB,IAAA,CAAoB,IAAA,CAEpB,eAAA,CACA,kBAAA,CAER,WAAA,CAAYI,CAAAA,CAAmCC,CAAAA,CAAyB,CACtE,IAAA,CAAK,eAAA,CAAkBD,CAAAA,CACvB,IAAA,CAAK,kBAAA,CAAqBC,CAAAA,CAC1B,IAAA,CAAK,YAAA,CAAe,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,CAChD,IAAA,CAAK,gBAAkB,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,CACtD,IAAA,CAAK,aAAA,CAAgB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAI,EACpD,CAEA,IAAA,CAAKC,EAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,CAAAA,CACd,IAAA,CAAK,GAAA,CAAMA,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACjC,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAE/BoC,CAAAA,CAAO,YAAA,CAAa,YAAA,CAAc,yCAAyC,CAAA,CAC3EA,CAAAA,CAAO,YAAA,CAAa,MAAA,CAAQ,KAAK,CAAA,CAGjC,IAAMC,CAAAA,CAAM,MAAA,CAAO,kBAAoB,CAAA,CACjCC,CAAAA,CAAOF,CAAAA,CAAO,qBAAA,EAAsB,CAC1CA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,CAAAA,CAC5BD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,EAC9B,IAAA,CAAK,GAAA,CAAI,KAAA,CAAMA,CAAAA,CAAKA,CAAG,CAAA,CACvBD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,CAAA,EAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAClCF,CAAAA,CAAO,MAAM,MAAA,CAAS,CAAA,EAAGE,CAAAA,CAAK,MAAM,CAAA,EAAA,CAAA,CAEpC,IAAA,CAAK,QAAA,CAAW,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAK,KAAA,CAAQT,CAAS,CAAA,CACjD,IAAA,CAAK,cAAgB,cAAA,GAAkB,MAAA,CACvC,IAAA,CAAK,KAAA,GACP,CAEQ,KAAA,EAAc,CAEpB,IAAMU,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAMV,CAAAA,CAAY,CAAC,EACpC,IAAA,CAAK,KAAA,CAAQ,CACX,CAAE,CAAA,CAAGU,CAAAA,CAAK,CAAA,CAAGA,CAAI,CAAA,CACjB,CAAE,CAAA,CAAGA,CAAAA,CAAM,CAAA,CAAG,CAAA,CAAGA,CAAI,CAAA,CACrB,CAAE,CAAA,CAAGA,CAAAA,CAAM,CAAA,CAAG,CAAA,CAAGA,CAAI,CACvB,CAAA,CACA,IAAA,CAAK,SAAA,CAAY,OAAA,CACjB,IAAA,CAAK,aAAA,CAAgB,QACrB,IAAA,CAAK,KAAA,CAAQ,CAAA,CACb,IAAA,CAAK,MAAA,CAAST,CAAAA,CACd,IAAA,CAAK,SAAA,GACP,CAEQ,SAAA,EAAkB,CACxB,IAAMU,CAAAA,CAAW,IAAI,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIC,CAAAA,EAAK,CAAA,EAAGA,CAAAA,CAAE,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,CACzDC,EACJ,GACEA,CAAAA,CAAM,CACJ,CAAA,CAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,CAAIb,CAAS,CAAA,CACvC,CAAA,CAAG,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,CAAIA,CAAS,CACzC,CAAA,CAAA,MACOW,CAAAA,CAAS,GAAA,CAAI,CAAA,EAAGE,CAAAA,CAAI,CAAC,CAAA,CAAA,EAAIA,CAAAA,CAAI,CAAC,CAAA,CAAE,GACzC,IAAA,CAAK,IAAA,CAAOA,EACd,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,OAAA,CAAU,IAAA,CACf,IAAA,CAAK,QAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAChC,KAAK,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,CAAA,CAC3B,IAAA,CAAK,oBAAA,EAAqB,CACtB,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,SAAA,GAC/B,CAEA,OAAc,CACZ,IAAA,CAAK,OAAA,CAAU,KAAA,CACX,IAAA,CAAK,WAAA,GAAgB,IAAA,GACvB,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,CACrC,IAAA,CAAK,WAAA,CAAc,IAAA,EAEvB,CAEA,MAAA,EAAe,CACR,IAAA,CAAK,OAAA,GACR,IAAA,CAAK,OAAA,CAAU,IAAA,CACf,IAAA,CAAK,QAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAChC,IAAA,CAAK,IAAA,CAAK,YAAY,GAAA,EAAK,CAAA,EAE/B,CAEA,OAAA,EAAgB,CACd,IAAA,CAAK,KAAA,EAAM,CACX,IAAA,CAAK,oBAAA,EAAqB,CAC1B,IAAA,CAAK,IAAA,EAAM,SAAQ,CACnB,IAAA,CAAK,IAAA,CAAO,KACd,CAEA,QAAA,EAAmB,CACjB,OAAO,IAAA,CAAK,KACd,CAIQ,IAAA,CAAKC,CAAAA,CAAmB,CACzB,KAAK,OAAA,GAEV,IAAA,CAAK,WAAA,CAAc,qBAAA,CAAsB,CAAA,EAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA,CAEtDA,CAAAA,CAAM,IAAA,CAAK,QAAA,EAAY,IAAA,CAAK,SAC9B,IAAA,CAAK,QAAA,CAAWA,CAAAA,CAChB,IAAA,CAAK,IAAA,EAAK,CAAA,CAGZ,IAAA,CAAK,MAAA,EAAO,EACd,CAEQ,IAAA,EAAa,CACnB,IAAA,CAAK,SAAA,CAAY,KAAK,aAAA,CAEtB,IAAMC,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CACnBC,CAAAA,CAAc,CAClB,CAAA,CAAA,CAAID,CAAAA,CAAK,CAAA,EAAK,IAAA,CAAK,SAAA,GAAc,QAAU,CAAA,CAAI,IAAA,CAAK,SAAA,GAAc,MAAA,CAAS,EAAA,CAAK,CAAA,CAAA,CAAKf,CAAAA,EAAaA,CAAAA,CAClG,CAAA,CAAA,CAAIe,CAAAA,CAAK,CAAA,EAAK,IAAA,CAAK,SAAA,GAAc,MAAA,CAAS,EAAI,IAAA,CAAK,SAAA,GAAc,IAAA,CAAO,EAAA,CAAK,CAAA,CAAA,CAAKf,CAAAA,EAAaA,CACjG,CAAA,CAGA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAKY,CAAAA,EAAKA,CAAAA,CAAE,IAAMI,CAAAA,CAAK,CAAA,EAAKJ,CAAAA,CAAE,CAAA,GAAMI,CAAAA,CAAK,CAAC,CAAA,CAAG,CAC1D,IAAA,CAAK,kBAAA,IAAqB,CAC1B,IAAA,CAAK,KAAA,EAAM,CACX,MACF,CAEA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,CAEnBA,EAAK,CAAA,GAAM,IAAA,CAAK,IAAA,CAAK,CAAA,EAAKA,CAAAA,CAAK,CAAA,GAAM,KAAK,IAAA,CAAK,CAAA,EACjD,IAAA,CAAK,KAAA,EAAS,EAAA,CACd,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,KAAK,CAAA,CAG7B,IAAA,CAAK,KAAA,CAAQ,EAAA,GAAO,CAAA,GACtB,KAAK,MAAA,CAAS,IAAA,CAAK,GAAA,CAAI,EAAA,CAAI,IAAA,CAAK,MAAA,CAASd,EAAc,CAAA,CAAA,CAGzD,IAAA,CAAK,SAAA,EAAU,EAEf,IAAA,CAAK,KAAA,CAAM,GAAA,GAEf,CAIQ,MAAA,EAAe,CACrB,GAAM,CAAE,GAAA,CAAAe,CAAAA,CAAK,QAAA,CAAAC,CAAAA,CAAU,KAAA,CAAA/C,CAAM,CAAA,CAAI,IAAA,CAC3BsC,CAAAA,CAAO,KAAK,MAAA,CAAO,qBAAA,EAAsB,CACzCU,CAAAA,CAAIV,CAAAA,CAAK,KAAA,CACTW,CAAAA,CAAIX,CAAAA,CAAK,MAAA,CAGfQ,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,UAAA,CACtB8C,CAAAA,CAAI,SAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CAGvBH,CAAAA,CAAI,WAAA,CAAc9C,CAAAA,CAAM,OAAA,CACxB8C,CAAAA,CAAI,SAAA,CAAY,EAAA,CAChBA,CAAAA,CAAI,WAAA,CAAc,GAClB,IAAA,IAASI,CAAAA,CAAI,CAAA,CAAGA,CAAAA,EAAKF,CAAAA,CAAGE,CAAAA,EAAKH,CAAAA,CAC3BD,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,MAAA,CAAOI,CAAAA,CAAG,CAAC,EAAGJ,CAAAA,CAAI,MAAA,CAAOI,CAAAA,CAAGD,CAAC,CAAA,CAAGH,CAAAA,CAAI,MAAA,EAAO,CAElE,IAAA,IAASK,CAAAA,CAAI,CAAA,CAAGA,CAAAA,EAAKF,CAAAA,CAAGE,CAAAA,EAAKJ,EAC3BD,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,MAAA,CAAO,CAAA,CAAGK,CAAC,CAAA,CAAGL,CAAAA,CAAI,MAAA,CAAOE,CAAAA,CAAGG,CAAC,CAAA,CAAGL,CAAAA,CAAI,QAAO,CAElEA,CAAAA,CAAI,WAAA,CAAc,CAAA,CAGlB,IAAMM,CAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAA,CAAIL,CAAAA,CAAWA,CAAAA,CAAW,CAAA,CACzCM,CAAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAIN,CAAAA,CAAWA,CAAAA,CAAW,CAAA,CAC/CD,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,MAAA,CACtB8C,CAAAA,CAAI,SAAA,EAAU,CACdA,CAAAA,CAAI,GAAA,CAAIM,CAAAA,CAAIC,EAAIN,CAAAA,CAAW,EAAA,CAAK,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAC9CD,CAAAA,CAAI,IAAA,EAAK,CAGT,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAACL,EAAGa,CAAAA,GAAM,CAC3B,IAAMJ,CAAAA,CAAIT,CAAAA,CAAE,CAAA,CAAIM,CAAAA,CACVI,CAAAA,CAAIV,CAAAA,CAAE,CAAA,CAAIM,CAAAA,CACVQ,CAAAA,CAAU,CAAA,CAEhB,GAAID,IAAM,CAAA,CAERR,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,OAAA,CAAA,KACjB,CAEL,IAAMwD,EAAAA,CAAQ,CAAA,CAAKF,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAU,EAAA,CAC5CR,EAAI,WAAA,CAAcU,EAAAA,CAClBV,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,QACxB,CAEA,IAAMyD,EAAAA,CAAI,CAAA,CACJC,EAAAA,CAAKR,CAAAA,CAAIK,CAAAA,CACTI,EAAAA,CAAKR,EAAII,CAAAA,CACTK,EAAAA,CAAKb,CAAAA,CAAWQ,CAAAA,CAAU,CAAA,CAC1BM,EAAAA,CAAKd,CAAAA,CAAWQ,CAAAA,CAAU,CAAA,CAEhCT,CAAAA,CAAI,SAAA,EAAU,CACdA,CAAAA,CAAI,SAAA,CAAUY,GAAIC,EAAAA,CAAIC,EAAAA,CAAIC,EAAAA,CAAIJ,EAAC,CAAA,CAC/BX,CAAAA,CAAI,IAAA,EAAK,CACTA,CAAAA,CAAI,WAAA,CAAc,EACpB,CAAC,CAAA,CAGDA,CAAAA,CAAI,UAAY9C,CAAAA,CAAM,IAAA,CACtB8C,CAAAA,CAAI,IAAA,CAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAA,CAAMC,CAAAA,CAAW,EAAG,CAAC,CAAA,YAAA,CAAA,CAC7CD,CAAAA,CAAI,SAAA,CAAY,OAAA,CAChBA,EAAI,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,CAAIE,CAAAA,CAAI,CAAA,CAAGD,CAAQ,EAC/C,CAIQ,oBAAA,EAA6B,CACnC,QAAA,CAAS,gBAAA,CAAiB,UAAW,IAAA,CAAK,YAAY,CAAA,CACtD,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,YAAA,CAAc,IAAA,CAAK,eAAA,CAAiB,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CAClF,KAAK,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAY,IAAA,CAAK,aAAA,CAAe,CAAE,OAAA,CAAS,IAAK,CAAC,EAChF,CAEQ,oBAAA,EAA6B,CACnC,QAAA,CAAS,oBAAoB,SAAA,CAAW,IAAA,CAAK,YAAY,CAAA,CACzD,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,YAAA,CAAc,IAAA,CAAK,eAAe,CAAA,CAClE,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,WAAY,IAAA,CAAK,aAAa,EAChE,CAEQ,aAAA,CAAc,CAAA,CAAwB,CAO5C,IAAMe,CAAAA,CANiC,CACrC,OAAA,CAAS,IAAA,CACT,SAAA,CAAW,MAAA,CACX,UAAW,MAAA,CACX,UAAA,CAAY,OACd,CAAA,CACgB,CAAA,CAAE,GAAG,CAAA,CACrB,GAAI,CAACA,CAAAA,CAAK,OAAA,CAGsC,CAC9C,EAAA,CAAI,MAAA,CAAQ,KAAM,IAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,MAChD,CAAA,EACcA,CAAG,CAAA,GAAM,IAAA,CAAK,SAAA,GAC1B,IAAA,CAAK,aAAA,CAAgBA,CAAAA,CACrB,CAAA,CAAE,gBAAe,EAErB,CAEQ,gBAAA,CAAiB,CAAA,CAAqB,CAC5C,IAAMC,CAAAA,CAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CACpBA,CAAAA,GACL,IAAA,CAAK,WAAA,CAAcA,EAAM,OAAA,CACzB,IAAA,CAAK,WAAA,CAAcA,CAAAA,CAAM,OAAA,EAC3B,CAEQ,cAAA,CAAe,CAAA,CAAqB,CAC1C,IAAMA,CAAAA,CAAQ,CAAA,CAAE,cAAA,CAAe,CAAC,EAChC,GAAI,CAACA,CAAAA,CAAO,OAEZ,IAAMC,CAAAA,CAAKD,CAAAA,CAAM,OAAA,CAAU,IAAA,CAAK,WAAA,CAC1BE,CAAAA,CAAKF,CAAAA,CAAM,OAAA,CAAU,IAAA,CAAK,YAC1BG,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAIF,CAAE,CAAA,CACnBG,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAIF,CAAE,CAAA,CAEzB,GAAI,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAOC,CAAK,CAAA,CAAInC,EAAAA,CAAiB,OAE9C,IAAI8B,CAAAA,CACAI,CAAAA,CAAQC,CAAAA,CACVL,CAAAA,CAAME,CAAAA,CAAK,CAAA,CAAI,OAAA,CAAU,MAAA,CAEzBF,CAAAA,CAAMG,CAAAA,CAAK,EAAI,MAAA,CAAS,IAAA,CAGsB,CAC9C,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,MAChD,CAAA,CACcH,CAAG,CAAA,GAAM,KAAK,SAAA,GAC1B,IAAA,CAAK,aAAA,CAAgBA,CAAAA,EAEzB,CAIQ,SAAA,EAAkB,CACxB,IAAM/C,CAAAA,CAAS,IAAA,CAAK,MAAA,CAAO,aAAA,CACtBA,CAAAA,GAEL,IAAA,CAAK,KAAO,IAAIH,CAAAA,CAAK,CACnB,MAAA,CAAAG,CAAAA,CACA,YAAA,CAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CACzB,SAAA,CAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CACtB,WAAA,CAAc+C,GAAQ,CAAA,CAC4B,CAC9C,EAAA,CAAI,MAAA,CAAQ,IAAA,CAAM,IAAA,CAAM,IAAA,CAAM,OAAA,CAAS,KAAA,CAAO,MAChD,CAAA,EACcA,CAAG,CAAA,GAAM,IAAA,CAAK,YAC1B,IAAA,CAAK,aAAA,CAAgBA,CAAAA,EAEzB,CACF,CAAC,CAAA,CACD,IAAA,CAAK,IAAA,CAAK,KAAA,EAAM,EAClB,CACF,EAAA,CAAA,CAAA,CC5VA,IAAAM,CAAAA,CAAA,GAAAzC,CAAAA,CAAAyC,CAAAA,CAAA,CAAA,gBAAA,CAAA,IAAAC,CAAAA,CAAAA,CAAAA,CAAA,IASaA,CAAAA,CATbC,EAAAA,CAAA5D,CAAAA,CAAA,IAAA,CAOAD,CAAAA,EAAAA,CAEa4D,CAAAA,CAAN,KAA6C,CAWlD,WAAA,CAAoBnC,EAAuCqC,CAAAA,CAA0B,CAAjE,IAAA,CAAA,OAAA,CAAArC,CAAAA,CAAuC,IAAA,CAAA,WAAA,CAAAqC,EAA2B,CAV7E,IAAA,CAAO,eAAA,CACP,UAAA,CAAa,GAAA,CAEd,MAAA,CACA,GAAA,CACA,KAAA,CACA,YAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CACV,KAAA,CAAQ,CAAA,CAIhB,IAAA,CAAKnC,CAAAA,CAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,CAAAA,CACd,IAAA,CAAK,GAAA,CAAMA,EAAO,UAAA,CAAW,IAAI,CAAA,CACjC,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAE/B,IAAMqC,CAAAA,CAAM,MAAA,CAAO,gBAAA,EAAoB,CAAA,CACjCC,CAAAA,CAAOF,EAAO,qBAAA,EAAsB,CAC1CA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,CAAAA,CAC5BD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,CAAAA,CAC9B,IAAA,CAAK,GAAA,CAAI,MAAMA,CAAAA,CAAKA,CAAG,CAAA,CACvBD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,CAAA,EAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAClCF,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EAAGE,EAAK,MAAM,CAAA,EAAA,EACtC,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,OAAA,CAAU,IAAA,CACf,IAAA,CAAK,MAAA,GACP,CAEA,KAAA,EAAc,CACZ,KAAK,OAAA,CAAU,KAAA,CACX,IAAA,CAAK,WAAA,GAAgB,IAAA,GACvB,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,CACrC,IAAA,CAAK,WAAA,CAAc,IAAA,EAEvB,CAEA,MAAA,EAAe,CACR,IAAA,CAAK,OAAA,GACR,IAAA,CAAK,OAAA,CAAU,IAAA,CACf,IAAA,CAAK,MAAA,EAAO,EAEhB,CAEA,OAAA,EAAgB,CACd,IAAA,CAAK,KAAA,GACP,CAEA,QAAA,EAAmB,CAAE,OAAO,IAAA,CAAK,KAAM,CAE/B,MAAA,EAAe,CACrB,IAAMA,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB,CACzCU,EAAIV,CAAAA,CAAK,KAAA,CACTW,CAAAA,CAAIX,CAAAA,CAAK,MAAA,CACT,CAAE,GAAA,CAAAQ,CAAAA,CAAK,KAAA,CAAA9C,CAAM,CAAA,CAAI,IAAA,CAEvB8C,CAAAA,CAAI,SAAA,CAAY9C,EAAM,UAAA,CACtB8C,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CACvBH,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,IAAA,CACtB8C,CAAAA,CAAI,IAAA,CAAO,sBACXA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAChBA,CAAAA,CAAI,YAAA,CAAe,QAAA,CACnBA,CAAAA,CAAI,QAAA,CAAS,eAAA,CAAiBE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,EAC/CH,CAAAA,CAAI,IAAA,CAAO,gBAAA,CACXA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAClBA,CAAAA,CAAI,QAAA,CAAS,cAAA,CAAgBE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,EAC9CH,CAAAA,CAAI,WAAA,CAAc,EACpB,CACF,EAAA,CAAA,CAAA,CChFA,IAAA0B,EAAAA,CAAA,EAAA,CAAA7C,CAAAA,CAAA6C,EAAAA,CAAA,CAAA,UAAA,CAAA,IAAAC,CAAAA,CAAAA,CAAAA,CAAA,IAmBMC,EAAAA,CACAC,GACAC,CAAAA,CACAC,CAAAA,CACAC,EAAAA,CACAC,CAAAA,CACAC,CAAAA,CAQOP,CAAAA,CAjCbQ,EAAAA,CAAAvE,CAAAA,CAAA,IAAA,CAiBAD,CAAAA,EAAAA,CAEMiE,EAAAA,CAAU,EAAA,CACVC,EAAAA,CAAgB,EAAA,CAChBC,EAAa,EAAA,CACbC,CAAAA,CAAW,GAAA,CACXC,EAAAA,CAAa,GAAA,CACbC,CAAAA,CAAS,EAAA,CACTC,CAAAA,CAAc,EAAA,CAQPP,CAAAA,CAAN,KAAuC,CACnC,IAAA,CAAO,QAAA,CACP,WAAa,GAAA,CAEd,MAAA,CACA,GAAA,CACA,KAAA,CACA,CAAA,CAAI,CAAA,CACJ,CAAA,CAAI,CAAA,CAEJ,KAAA,CAAQ,CAAA,CACR,MAAA,CAAS,CAAA,CACT,KAAA,CAAgB,GAChB,KAAA,CAAQ,CAAA,CACR,YAAA,CAAe,CAAA,CACf,WAAA,CAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CACV,IAAA,CAAO,KAAA,CACP,UAAA,CAAa,CAAA,CACb,QAAA,CAAW,CAAA,CAEX,UACA,QAAA,CACA,UAAA,CAEA,OAAA,CACA,UAAA,CAER,WAAA,CAAYvC,CAAAA,CAAmCC,CAAAA,CAAyB,CACtE,IAAA,CAAK,OAAA,CAAUD,CAAAA,CACf,IAAA,CAAK,UAAA,CAAaC,CAAAA,CAClB,KAAK,SAAA,CAAY,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CACpC,IAAA,CAAK,QAAA,CAAY+C,CAAAA,EAAqB,CAAMA,CAAAA,CAAE,IAAA,GAAS,OAAA,GAAWA,CAAAA,CAAE,gBAAe,CAAG,IAAA,CAAK,IAAA,EAAK,EAAI,CAAA,CACpG,IAAA,CAAK,UAAA,CAAa,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,EACvC,CAEA,IAAA,CAAK9C,EAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,CAAAA,CACd,IAAA,CAAK,GAAA,CAAMA,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACjC,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAE/B,IAAMqC,CAAAA,CAAM,MAAA,CAAO,gBAAA,EAAoB,CAAA,CACjCC,CAAAA,CAAOF,CAAAA,CAAO,qBAAA,EAAsB,CAC1CA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,EAC5BD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,CAAAA,CAC9B,IAAA,CAAK,GAAA,CAAI,KAAA,CAAMA,CAAAA,CAAKA,CAAG,CAAA,CACvBD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,GAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAClCF,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EAAGE,CAAAA,CAAK,MAAM,CAAA,EAAA,CAAA,CACpC,IAAA,CAAK,CAAA,CAAIA,CAAAA,CAAK,KAAA,CACd,KAAK,CAAA,CAAIA,CAAAA,CAAK,MAAA,CAEdF,CAAAA,CAAO,YAAA,CAAa,YAAA,CAAc,+CAA+C,CAAA,CACjFA,CAAAA,CAAO,YAAA,CAAa,MAAA,CAAQ,KAAK,CAAA,CAEjC,IAAA,CAAK,QACP,CAEQ,KAAA,EAAc,CACpB,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,CAAA,CAAI,CAAA,CACtB,IAAA,CAAK,MAAA,CAAS,CAAA,CACd,IAAA,CAAK,KAAA,CAAQ,EAAC,CACd,IAAA,CAAK,KAAA,CAAQ,CAAA,CACb,IAAA,CAAK,IAAA,CAAO,KAAA,CACZ,IAAA,CAAK,UAAA,CAAa,CAAA,CAClB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAA,CAAI,GAAG,EAC7B,CAEQ,SAAA,CAAUc,CAAAA,CAAkB,CAElC,IAAMiC,EAAS,IAAA,CAAK,CAAA,CAAIN,CAAAA,CAAW,EAAA,CAC7BO,CAAAA,CAAY,EAAA,CAAS,KAAK,MAAA,EAAO,EAAKD,CAAAA,CAAS,EAAA,CAAA,CACrD,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAE,CAAA,CAAGjC,CAAAA,EAAK,IAAA,CAAK,CAAA,CAAI,EAAA,CAAI,SAAA,CAAAkC,EAAW,MAAA,CAAQ,KAAM,CAAC,EACnE,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,OAAA,CAAU,IAAA,CACf,IAAA,CAAK,QAAA,CAAW,WAAA,CAAY,GAAA,GAC5B,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,CAAA,CAC3B,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAAS,IAAA,CAAK,SAAS,CAAA,CACpD,QAAA,CAAS,iBAAiB,SAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,CAClD,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,YAAA,CAAc,IAAA,CAAK,UAAA,CAAY,CAAE,OAAA,CAAS,IAAK,CAAC,EAC/E,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,OAAA,CAAU,KAAA,CACX,IAAA,CAAK,WAAA,GAAgB,IAAA,GACvB,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,CACrC,IAAA,CAAK,YAAc,IAAA,EAEvB,CAEA,MAAA,EAAe,CACR,IAAA,CAAK,OAAA,GACR,IAAA,CAAK,OAAA,CAAU,IAAA,CACf,IAAA,CAAK,QAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAChC,KAAK,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,CAAA,EAE/B,CAEA,OAAA,EAAgB,CACd,IAAA,CAAK,KAAA,EAAM,CACX,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,QAAS,IAAA,CAAK,SAAS,CAAA,CACvD,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,CACrD,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,YAAA,CAAc,IAAA,CAAK,UAAU,EAC/D,CAEA,QAAA,EAAmB,CAAE,OAAO,IAAA,CAAK,KAAM,CAE/B,IAAA,EAAa,CACnB,GAAI,IAAA,CAAK,IAAA,CAAM,CAAE,KAAK,KAAA,EAAM,CAAG,MAAO,CACtC,IAAA,CAAK,MAAA,CAAST,GAChB,CAEQ,IAAA,CAAKhC,CAAAA,CAAmB,CAC9B,GAAI,CAAC,IAAA,CAAK,QAAS,OACnB,IAAA,CAAK,WAAA,CAAc,qBAAA,CAAsB0C,CAAAA,EAAK,IAAA,CAAK,IAAA,CAAKA,CAAC,CAAC,CAAA,CAC1D,IAAMC,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAA,CAAK3C,EAAM,IAAA,CAAK,QAAA,EAAY,KAAA,CAAO,CAAC,CAAA,CACpD,IAAA,CAAK,QAAA,CAAWA,CAAAA,CACX,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAA,CAAO2C,CAAE,CAAA,CAC9B,KAAK,MAAA,GACP,CAEQ,MAAA,CAAOA,CAAAA,CAAkB,CAK/B,GAJA,IAAA,CAAK,UAAA,EAAA,CACL,IAAA,CAAK,MAAA,EAAUZ,EAAAA,CAAUY,CAAAA,CACzB,IAAA,CAAK,OAAS,IAAA,CAAK,MAAA,CAASA,CAAAA,CAExB,IAAA,CAAK,KAAA,CAAQN,CAAAA,EAAe,IAAA,CAAK,CAAA,EAAK,IAAA,CAAK,KAAA,CAAQA,CAAAA,EAAe,CAAA,CAAG,CACvE,IAAA,CAAK,KAAI,CAAG,MACd,CAEI,IAAA,CAAK,UAAA,CAAa,EAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAA,EAAU,CAE/C,IAAA,IAAWO,CAAAA,IAAQ,IAAA,CAAK,KAAA,CAAO,CAC7BA,CAAAA,CAAK,CAAA,EAAKT,EAAAA,CAAaQ,CAAAA,CACnB,CAACC,CAAAA,CAAK,MAAA,EAAUA,CAAAA,CAAK,CAAA,CAAIX,CAAAA,CAAaG,CAAAA,GACxCQ,CAAAA,CAAK,MAAA,CAAS,IAAA,CACd,KAAK,KAAA,EAAA,CACD,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,YAAA,GAAc,IAAA,CAAK,YAAA,CAAe,IAAA,CAAK,KAAA,CAAA,CAC7D,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAK,CAAA,CAAA,CAG3B,IAAMC,CAAAA,CAAMT,CAAAA,CAASC,CAAAA,CAAcO,CAAAA,CAAK,CAAA,EAAKR,CAAAA,CAASC,CAAAA,CAAcO,CAAAA,CAAK,CAAA,CAAIX,CAAAA,CACvEa,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAQT,CAAAA,CAAcO,EAAK,SAAA,EAAa,IAAA,CAAK,KAAA,CAAQP,CAAAA,CAAcO,CAAAA,CAAK,SAAA,CAAYV,CAAAA,CACrG,GAAIW,CAAAA,EAAOC,CAAAA,CAAK,CAAE,IAAA,CAAK,GAAA,EAAI,CAAG,MAAO,CACvC,CACA,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CAAOhD,CAAAA,EAAKA,CAAAA,CAAE,CAAA,CAAImC,CAAAA,CAAa,GAAG,EAC5D,CAEQ,KAAY,CAClB,IAAA,CAAK,IAAA,CAAO,IAAA,CACZ,IAAA,CAAK,MAAA,CAASD,EAAAA,CAAgB,EAAA,CAC9B,IAAA,CAAK,UAAA,KACP,CAEQ,MAAA,EAAe,CACrB,GAAM,CAAE,GAAA,CAAA7B,CAAAA,CAAK,CAAA,CAAAE,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,KAAA,CAAAjD,CAAM,CAAA,CAAI,IAAA,CAC7B8C,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,WACtB8C,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CAEvB,IAAA,IAAWsC,CAAAA,IAAQ,IAAA,CAAK,KAAA,CAAO,CAC7BzC,CAAAA,CAAI,SAAA,CAAY9C,EAAM,OAAA,CACtB8C,CAAAA,CAAI,QAAA,CAASyC,CAAAA,CAAK,CAAA,CAAI,CAAA,CAAGA,CAAAA,CAAK,SAAA,CAAY,EAAA,CAAIX,CAAAA,CAAa,CAAA,CAAG,EAAE,CAAA,CAChE9B,CAAAA,CAAI,WAAU,CAAGA,CAAAA,CAAI,SAAA,CAAUyC,CAAAA,CAAK,CAAA,CAAG,CAAA,CAAGX,CAAAA,CAAYW,CAAAA,CAAK,SAAA,CAAY,CAAA,CAAG,CAAC,CAAA,CAAE,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA,CAAGzC,CAAAA,CAAI,IAAA,EAAK,CAC/F,IAAM4C,CAAAA,CAAKH,CAAAA,CAAK,SAAA,CAAYV,CAAAA,CAC5B/B,CAAAA,CAAI,QAAA,CAASyC,CAAAA,CAAK,CAAA,CAAI,EAAGG,CAAAA,CAAId,CAAAA,CAAa,CAAA,CAAG,EAAE,CAAA,CAC/C9B,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,SAAA,CAAUyC,CAAAA,CAAK,CAAA,CAAGG,CAAAA,CAAK,CAAA,CAAGd,EAAY3B,CAAAA,CAAIyC,CAAAA,CAAI,CAAC,CAAA,CAAE,CAAA,CAAE,CAAA,CAAE,CAAC,CAAC,CAAA,CAAG5C,CAAAA,CAAI,IAAA,GACrF,CAEAA,CAAAA,CAAI,MAAK,CACTA,CAAAA,CAAI,SAAA,CAAUiC,CAAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CAChCjC,CAAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,OAAS,GAAA,CAAM,IAAI,CAAA,CAAG,CAAG,CAAC,CAAA,CACxD,IAAA,CAAK,IAAA,GAAMA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAAA,CACjCA,CAAAA,CAAI,SAAA,CAAY,SAAA,CAChBA,EAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAI,CAAA,CAAG,CAAA,CAAGkC,CAAAA,CAAa,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAAGlC,CAAAA,CAAI,IAAA,GACjEA,CAAAA,CAAI,SAAA,CAAY,MAAA,CAAQA,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAI,CAAA,CAAG,EAAA,CAAI,CAAA,CAAG,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAAGA,CAAAA,CAAI,IAAA,EAAK,CACrFA,CAAAA,CAAI,SAAA,CAAY,MAAA,CAAQA,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAI,CAAA,CAAG,EAAA,CAAI,IAAK,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAAGA,CAAAA,CAAI,IAAA,EAAK,CACvFA,CAAAA,CAAI,SAAA,CAAY,SAAA,CAChBA,CAAAA,CAAI,SAAA,EAAU,CAAGA,EAAI,MAAA,CAAOkC,CAAAA,CAAc,CAAA,CAAG,CAAC,CAAA,CAAGlC,CAAAA,CAAI,MAAA,CAAOkC,CAAAA,CAAc,CAAA,CAAG,EAAE,CAAA,CAAGlC,CAAAA,CAAI,MAAA,CAAOkC,CAAAA,CAAc,EAAG,CAAC,CAAA,CAAGlC,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,IAAA,EAAK,CAC5IA,CAAAA,CAAI,OAAA,EAAQ,CAEZA,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,KACtB8C,CAAAA,CAAI,IAAA,CAAO,qBAAA,CACXA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAChBA,CAAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAGE,CAAAA,CAAI,CAAA,CAAG,EAAE,CAAA,CAEtC,IAAA,CAAK,IAAA,GACPF,CAAAA,CAAI,SAAA,CAAY,kBAAA,CAChBA,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CACvBH,CAAAA,CAAI,UAAY9C,CAAAA,CAAM,IAAA,CACtB8C,CAAAA,CAAI,IAAA,CAAO,qBAAA,CACXA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAChBA,CAAAA,CAAI,QAAA,CAAS,cAAA,CAAgBE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAC,CAAA,CACzCH,CAAAA,CAAI,IAAA,CAAO,gBAAA,CAAkBA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAC/CA,CAAAA,CAAI,QAAA,CAAS,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAA,CAAIE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,CAAA,CAClFH,CAAAA,CAAI,WAAA,CAAc,CAAA,EAEtB,CACF,EAAA,CAAA,CAAA,CCvOA,IAAA6C,EAAAA,CAAA,GAAAhE,CAAAA,CAAAgE,EAAAA,CAAA,CAAA,QAAA,CAAA,IAAAC,CAAAA,CAAAA,CAAAA,CAAA,IASaA,CAAAA,CATbC,EAAAA,CAAAnF,CAAAA,CAAA,IAAA,CAOAD,CAAAA,EAAAA,CAEamF,CAAAA,CAAN,KAAqC,CAW1C,WAAA,CAAoBE,EAAwCvB,CAAAA,CAA0B,CAAlE,IAAA,CAAA,QAAA,CAAAuB,CAAAA,CAAwC,IAAA,CAAA,WAAA,CAAAvB,EAA2B,CAV9E,IAAA,CAAO,MAAA,CACP,UAAA,CAAa,GAAA,CAEd,MAAA,CACA,GAAA,CACA,KAAA,CACA,YAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CACV,KAAA,CAAQ,CAAA,CAIhB,IAAA,CAAKnC,CAAAA,CAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,CAAAA,CACd,IAAA,CAAK,GAAA,CAAMA,EAAO,UAAA,CAAW,IAAI,CAAA,CACjC,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAC/B,IAAMqC,CAAAA,CAAM,MAAA,CAAO,gBAAA,EAAoB,CAAA,CACjCC,CAAAA,CAAOF,EAAO,qBAAA,EAAsB,CAC1CA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,CAAAA,CAC5BD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,CAAAA,CAC9B,IAAA,CAAK,GAAA,CAAI,MAAMA,CAAAA,CAAKA,CAAG,CAAA,CACvBD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,CAAA,EAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAClCF,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EAAGE,EAAK,MAAM,CAAA,EAAA,EACtC,CAEA,KAAA,EAAc,CAAE,IAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CACnD,KAAA,EAAc,CAAE,KAAK,OAAA,CAAU,KAAA,CAAW,IAAA,CAAK,WAAA,GAAgB,IAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,CAAG,IAAA,CAAK,WAAA,CAAc,IAAA,EAAO,CACzI,MAAA,EAAe,CAAO,IAAA,CAAK,OAAA,GAAW,IAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,MAAA,EAAO,EAAI,CAC3E,OAAA,EAAgB,CAAE,IAAA,CAAK,KAAA,GAAQ,CAC/B,QAAA,EAAmB,CAAE,OAAO,IAAA,CAAK,KAAM,CAE/B,MAAA,EAAe,CACrB,IAAMA,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB,CACzCU,EAAIV,CAAAA,CAAK,KAAA,CAAOW,CAAAA,CAAIX,CAAAA,CAAK,MAAA,CACzB,CAAE,GAAA,CAAAQ,CAAAA,CAAK,KAAA,CAAA9C,CAAM,CAAA,CAAI,IAAA,CACvB8C,CAAAA,CAAI,SAAA,CAAY9C,EAAM,UAAA,CAAY8C,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CACzDH,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,IAAA,CAAM8C,CAAAA,CAAI,IAAA,CAAO,sBAAuBA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAAUA,CAAAA,CAAI,YAAA,CAAe,QAAA,CAC3GA,CAAAA,CAAI,QAAA,CAAS,MAAA,CAAQE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,EACtCH,CAAAA,CAAI,IAAA,CAAO,gBAAA,CAAkBA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAC/CA,CAAAA,CAAI,QAAA,CAAS,cAAA,CAAgBE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,EAAGH,CAAAA,CAAI,WAAA,CAAc,EACrE,CACF,EAAA,CAAA,CAAA,CCnDA,IAAAiD,EAAAA,CAAA,EAAA,CAAApE,CAAAA,CAAAoE,EAAAA,CAAA,CAAA,cAAA,CAAA,IAAAC,CAAAA,CAAAA,CAAAA,CAAA,IASaA,CAAAA,CATbC,GAAAvF,CAAAA,CAAA,IAAA,CAOAD,CAAAA,EAAAA,CAEauF,CAAAA,CAAN,KAA2C,CAWhD,WAAA,CAAoBF,CAAAA,CAAwCvB,CAAAA,CAA0B,CAAlE,IAAA,CAAA,QAAA,CAAAuB,CAAAA,CAAwC,IAAA,CAAA,WAAA,CAAAvB,EAA2B,CAV9E,IAAA,CAAO,aAAA,CACP,UAAA,CAAa,GAAA,CAEd,MAAA,CACA,GAAA,CACA,KAAA,CACA,WAAA,CAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CACV,KAAA,CAAQ,CAAA,CAIhB,IAAA,CAAKnC,EAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,CAAAA,CACd,IAAA,CAAK,GAAA,CAAMA,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACjC,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAC/B,IAAMqC,CAAAA,CAAM,MAAA,CAAO,gBAAA,EAAoB,CAAA,CACjCC,CAAAA,CAAOF,CAAAA,CAAO,qBAAA,EAAsB,CAC1CA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,EAC5BD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,CAAAA,CAC9B,IAAA,CAAK,GAAA,CAAI,KAAA,CAAMA,CAAAA,CAAKA,CAAG,CAAA,CACvBD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,GAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAClCF,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EAAGE,CAAAA,CAAK,MAAM,CAAA,EAAA,EACtC,CAEA,KAAA,EAAc,CAAE,IAAA,CAAK,QAAU,IAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CACnD,KAAA,EAAc,CAAE,IAAA,CAAK,OAAA,CAAU,KAAA,CAAW,IAAA,CAAK,WAAA,GAAgB,IAAA,GAAQ,oBAAA,CAAqB,KAAK,WAAW,CAAA,CAAG,IAAA,CAAK,WAAA,CAAc,IAAA,EAAO,CACzI,MAAA,EAAe,CAAO,IAAA,CAAK,OAAA,GAAW,IAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,QAAO,EAAI,CAC3E,OAAA,EAAgB,CAAE,IAAA,CAAK,KAAA,GAAQ,CAC/B,QAAA,EAAmB,CAAE,OAAO,IAAA,CAAK,KAAM,CAE/B,QAAe,CACrB,IAAMA,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB,CACzCU,CAAAA,CAAIV,CAAAA,CAAK,KAAA,CAAOW,CAAAA,CAAIX,CAAAA,CAAK,MAAA,CACzB,CAAE,IAAAQ,CAAAA,CAAK,KAAA,CAAA9C,CAAM,CAAA,CAAI,IAAA,CACvB8C,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,UAAA,CAAY8C,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CACzDH,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,IAAA,CAAM8C,CAAAA,CAAI,IAAA,CAAO,qBAAA,CAAuBA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAAUA,CAAAA,CAAI,YAAA,CAAe,QAAA,CAC3GA,EAAI,QAAA,CAAS,aAAA,CAAeE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,CAAA,CAC7CH,CAAAA,CAAI,IAAA,CAAO,gBAAA,CAAkBA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAC/CA,EAAI,QAAA,CAAS,cAAA,CAAgBE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,CAAA,CAAGH,CAAAA,CAAI,WAAA,CAAc,EACrE,CACF,EAAA,CAAA,CAAA,CCnDA,IAAAoD,GAAA,EAAA,CAAAvE,CAAAA,CAAAuE,EAAAA,CAAA,CAAA,aAAA,CAAA,IAAAC,CAAAA,CAAAA,CAAAA,CAAA,IASaA,CAAAA,CATbC,EAAAA,CAAA1F,CAAAA,CAAA,IAAA,CAOAD,CAAAA,EAAAA,CAEa0F,CAAAA,CAAN,KAA0C,CAW/C,YAAoBL,CAAAA,CAAwCvB,CAAAA,CAA0B,CAAlE,IAAA,CAAA,QAAA,CAAAuB,CAAAA,CAAwC,IAAA,CAAA,WAAA,CAAAvB,EAA2B,CAV9E,IAAA,CAAO,WAAA,CACP,UAAA,CAAa,GAAA,CAEd,MAAA,CACA,GAAA,CACA,MACA,WAAA,CAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CACV,KAAA,CAAQ,CAAA,CAIhB,IAAA,CAAKnC,CAAAA,CAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,CAAAA,CACd,IAAA,CAAK,IAAMA,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CACjC,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAC/B,IAAMqC,CAAAA,CAAM,MAAA,CAAO,gBAAA,EAAoB,CAAA,CACjCC,EAAOF,CAAAA,CAAO,qBAAA,EAAsB,CAC1CA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,CAAAA,CAC5BD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,CAAAA,CAC9B,IAAA,CAAK,IAAI,KAAA,CAAMA,CAAAA,CAAKA,CAAG,CAAA,CACvBD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,CAAA,EAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAClCF,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,GAAGE,CAAAA,CAAK,MAAM,CAAA,EAAA,EACtC,CAEA,KAAA,EAAc,CAAE,IAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CACnD,KAAA,EAAc,CAAE,IAAA,CAAK,OAAA,CAAU,KAAA,CAAW,IAAA,CAAK,WAAA,GAAgB,IAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,CAAG,IAAA,CAAK,WAAA,CAAc,IAAA,EAAO,CACzI,QAAe,CAAO,IAAA,CAAK,OAAA,GAAW,IAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,MAAA,EAAO,EAAI,CAC3E,OAAA,EAAgB,CAAE,IAAA,CAAK,KAAA,GAAQ,CAC/B,QAAA,EAAmB,CAAE,OAAO,IAAA,CAAK,KAAM,CAE/B,MAAA,EAAe,CACrB,IAAMA,CAAAA,CAAO,IAAA,CAAK,MAAA,CAAO,qBAAA,GACnBU,CAAAA,CAAIV,CAAAA,CAAK,KAAA,CAAOW,CAAAA,CAAIX,CAAAA,CAAK,MAAA,CACzB,CAAE,GAAA,CAAAQ,CAAAA,CAAK,KAAA,CAAA9C,CAAM,CAAA,CAAI,IAAA,CACvB8C,CAAAA,CAAI,UAAY9C,CAAAA,CAAM,UAAA,CAAY8C,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CACzDH,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,IAAA,CAAM8C,CAAAA,CAAI,KAAO,qBAAA,CAAuBA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAAUA,CAAAA,CAAI,YAAA,CAAe,QAAA,CAC3GA,CAAAA,CAAI,QAAA,CAAS,WAAA,CAAaE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,CAAA,CAC3CH,CAAAA,CAAI,IAAA,CAAO,gBAAA,CAAkBA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAC/CA,CAAAA,CAAI,QAAA,CAAS,cAAA,CAAgBE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAA,CAAI,EAAE,CAAA,CAAGH,CAAAA,CAAI,WAAA,CAAc,EACrE,CACF,EAAA,CAAA,CAAA,CCnDA,IAAAuD,EAAAA,CAAA,EAAA,CAAA1E,CAAAA,CAAA0E,EAAAA,CAAA,CAAA,eAAA,CAAA,IAAAC,CAAAA,CAAAA,CAAAA,CAAA,IASMC,EACAC,CAAAA,CACAC,CAAAA,CAMOH,CAAAA,CAjBbI,EAAAA,CAAAhG,CAAAA,CAAA,IAAA,CAOAD,CAAAA,EAAAA,CAEM8F,CAAAA,CAAS,CAAC,WAAA,CAAK,WAAA,CAAK,WAAA,CAAK,WAAA,CAAK,WAAA,CAAK,YAAK,WAAA,CAAK,WAAI,CAAA,CACjDC,CAAAA,CAAO,CAAA,CACPC,CAAAA,CAAU,GAAA,CAMHH,CAAAA,CAAN,KAA4C,CACxC,IAAA,CAAO,cAAA,CACR,MAAA,CACA,GAAA,CACA,MACA,CAAA,CAAI,CAAA,CAAW,CAAA,CAAI,CAAA,CACnB,KAAA,CAAgB,EAAC,CACjB,WAAA,CAAwB,EAAC,CACzB,MAAA,CAAS,KAAA,CACT,KAAA,CAAQ,CAAA,CAAW,WAAa,CAAA,CAAW,SAAA,CAAY,CAAA,CACvD,WAAA,CAAc,CAAA,CACd,WAAA,CAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CAAe,QAAA,CAAW,CAAA,CACpC,UAAA,CACA,UAAA,CACA,YAAA,CAEA,QACA,UAAA,CAER,WAAA,CAAYpE,CAAAA,CAA+BC,CAAAA,CAAyB,CAClE,IAAA,CAAK,OAAA,CAAUD,CAAAA,CACf,IAAA,CAAK,UAAA,CAAaC,CAAAA,CAClB,IAAA,CAAK,UAAA,CAAa,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAI,CAAA,CACxC,IAAA,CAAK,UAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,CACxC,IAAA,CAAK,YAAA,CAAe,IAAA,CAAK,SAAA,CAAU,KAAK,IAAI,EAC9C,CAEA,IAAA,CAAKC,CAAAA,CAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,CAAAA,CAAQ,IAAA,CAAK,GAAA,CAAMA,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAAI,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAE1FoC,CAAAA,CAAO,YAAA,CAAa,YAAA,CAAc,gDAAgD,CAAA,CAClFA,CAAAA,CAAO,YAAA,CAAa,MAAA,CAAQ,KAAK,CAAA,CACjCA,CAAAA,CAAO,YAAA,CAAa,UAAA,CAAY,GAAG,CAAA,CAEnC,IAAMC,CAAAA,CAAM,MAAA,CAAO,gBAAA,EAAoB,CAAA,CAASC,CAAAA,CAAOF,CAAAA,CAAO,qBAAA,GAC9DA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,CAAAA,CAAKD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,CAAAA,CAC/D,IAAA,CAAK,GAAA,CAAI,KAAA,CAAMA,CAAAA,CAAKA,CAAG,CAAA,CAAGD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,CAAA,EAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAAMF,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EAAGE,CAAAA,CAAK,MAAM,KACtG,IAAA,CAAK,CAAA,CAAIA,CAAAA,CAAK,KAAA,CAAO,IAAA,CAAK,CAAA,CAAIA,CAAAA,CAAK,MAAA,CAAQ,IAAA,CAAK,KAAA,GAClD,CAEQ,KAAA,EAAc,CACpB,IAAMqE,CAAAA,CAAQ,CAAC,GAAGJ,CAAAA,CAAQ,GAAGA,CAAM,CAAA,CACnC,IAAA,IAASjD,CAAAA,CAAIqD,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAGrD,CAAAA,CAAI,CAAA,CAAGA,IAAK,CAAE,IAAMsD,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,EAAKtD,CAAAA,CAAI,CAAA,CAAE,CAAA,CAAG,CAACqD,CAAAA,CAAMrD,CAAC,EAAGqD,CAAAA,CAAMC,CAAC,CAAC,CAAA,CAAI,CAACD,CAAAA,CAAMC,CAAC,CAAA,CAAID,CAAAA,CAAMrD,CAAC,CAAE,EAAE,CAC1I,IAAA,CAAK,MAAQqD,CAAAA,CAAM,GAAA,CAAI,CAACE,CAAAA,CAAOC,CAAAA,IAAQ,CAAE,EAAA,CAAAA,CAAAA,CAAI,KAAA,CAAAD,CAAAA,CAAO,OAAA,CAAS,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,aAAc,CAAA,CAAG,UAAA,CAAY,CAAE,CAAA,CAAE,CAAA,CACrH,IAAA,CAAK,WAAA,CAAc,EAAC,CAAG,IAAA,CAAK,MAAA,CAAS,KAAA,CAAO,IAAA,CAAK,KAAA,CAAQ,EAAG,IAAA,CAAK,UAAA,CAAa,CAAA,CAC9E,IAAA,CAAK,SAAA,CAAY,IAAA,CAAK,GAAA,EAAI,CAAG,IAAA,CAAK,WAAA,CAAc,EAClD,CAEA,KAAA,EAAc,CACZ,KAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,QAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAAG,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,CAAA,CACnF,IAAA,CAAK,OAAO,gBAAA,CAAiB,OAAA,CAAS,IAAA,CAAK,UAAU,CAAA,CACrD,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAY,IAAA,CAAK,UAAA,CAAY,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CAC3E,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAW,IAAA,CAAK,YAAY,EACxD,CAEA,KAAA,EAAc,CAAE,IAAA,CAAK,OAAA,CAAU,KAAA,CAAW,IAAA,CAAK,cAAgB,IAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,CAAG,IAAA,CAAK,WAAA,CAAc,IAAA,EAAO,CACzI,MAAA,EAAe,CAAO,IAAA,CAAK,OAAA,GAAW,IAAA,CAAK,QAAU,IAAA,CAAM,IAAA,CAAK,QAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAAG,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,CAAA,EAAI,CAE7H,OAAA,EAAgB,CACd,IAAA,CAAK,KAAA,EAAM,CACX,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAAS,IAAA,CAAK,UAAU,CAAA,CACxD,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,UAAA,CAAY,KAAK,UAAU,CAAA,CAC3D,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAW,IAAA,CAAK,YAAY,EAC3D,CAEA,QAAA,EAAmB,CAAE,OAAO,IAAA,CAAK,KAAM,CAE/B,MAAA,CAAOvD,CAAAA,CAAW,CACT,IAAMyD,CAAAA,CAAOP,CAAAA,CAAYQ,CAAAA,CAAOR,CAAAA,CACzCS,CAAAA,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAI,CAAA,EAAOF,CAAAA,CAAO,CAAA,CAAA,EAAMA,EAAYG,CAAAA,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAI,CAAA,EAAOF,CAAAA,CAAO,CAAA,CAAA,EAAMA,CAAAA,CACtF,OAAO,CAAE,CAAA,CAAG,CAAA,CAAO1D,CAAAA,CAAIyD,CAAAA,EAASE,CAAAA,CAAI,GAAM,CAAA,CAAG,CAAA,CAAM,IAAA,CAAK,KAAA,CAAM3D,CAAAA,CAAIyD,CAAI,CAAA,EAAKG,CAAAA,CAAI,CAAA,CAAA,CAAM,CAAA,CAAAD,CAAAA,CAAG,CAAA,CAAAC,CAAE,CAC5F,CAEQ,MAAA,CAAOxD,CAAAA,CAAYC,CAAAA,CAAoB,CAC7C,IAAA,IAASL,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CAAE,IAAM6D,EAAI,IAAA,CAAK,MAAA,CAAO7D,CAAC,CAAA,CAAG,GAAII,CAAAA,EAAMyD,CAAAA,CAAE,CAAA,EAAKzD,CAAAA,EAAMyD,CAAAA,CAAE,CAAA,CAAIA,CAAAA,CAAE,CAAA,EAAKxD,CAAAA,EAAMwD,EAAE,CAAA,EAAKxD,CAAAA,EAAMwD,CAAAA,CAAE,CAAA,CAAIA,CAAAA,CAAE,CAAA,CAAG,OAAO7D,CAAE,CACnJ,OAAO,GACT,CAEQ,OAAA,CAAQ,CAAA,CAAqB,CAAE,IAAMG,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB,CAAG,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,OAAA,CAAUA,CAAAA,CAAE,IAAA,CAAM,CAAA,CAAE,OAAA,CAAUA,EAAE,GAAG,EAAE,CAClI,OAAA,CAAQ,CAAA,CAAqB,CAAE,IAAM,CAAA,CAAI,CAAA,CAAE,cAAA,CAAe,CAAC,CAAA,CAAG,GAAI,CAAC,EAAG,OAAQ,IAAMA,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB,CAAG,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,OAAA,CAAUA,CAAAA,CAAE,IAAA,CAAM,CAAA,CAAE,QAAUA,CAAAA,CAAE,GAAG,EAAE,CAEjL,SAAA,CAAU,CAAA,CAAwB,CACxC,IAAM2D,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,CACzB,OAAQ,CAAA,CAAE,KACR,KAAK,KAAA,CACH,CAAA,CAAE,cAAA,EAAe,CACjB,IAAA,CAAK,WAAA,CAAA,CAAe,IAAA,CAAK,WAAA,EAAe,CAAA,CAAE,QAAA,CAAWA,CAAAA,CAAQ,CAAA,CAAI,IAAMA,CAAAA,CACvE,MACF,KAAK,YAAA,CAAc,CAAA,CAAE,cAAA,EAAe,CAAG,IAAA,CAAK,WAAA,CAAA,CAAe,IAAA,CAAK,WAAA,CAAc,CAAA,EAAKA,CAAAA,CAAO,MAC1F,KAAK,WAAA,CAAa,CAAA,CAAE,cAAA,EAAe,CAAG,IAAA,CAAK,WAAA,CAAA,CAAe,IAAA,CAAK,WAAA,CAAcA,CAAAA,CAAQ,CAAA,EAAKA,CAAAA,CAAO,MACjG,KAAK,WAAA,CAAa,EAAE,cAAA,EAAe,CAAG,IAAA,CAAK,WAAA,CAAA,CAAe,IAAA,CAAK,WAAA,CAAcZ,CAAAA,EAAQY,CAAAA,CAAO,MAC5F,KAAK,SAAA,CAAW,CAAA,CAAE,cAAA,EAAe,CAAG,KAAK,WAAA,CAAA,CAAe,IAAA,CAAK,WAAA,CAAcA,CAAAA,CAAQZ,CAAAA,EAAQY,CAAAA,CAAO,MAClG,KAAK,OAAA,CACL,KAAK,GAAA,CACH,CAAA,CAAE,cAAA,EAAe,CACjB,KAAK,YAAA,CAAa,IAAA,CAAK,WAAW,CAAA,CAClC,KACJ,CACF,CAEQ,YAAA,CAAaC,CAAAA,CAAmB,CACtC,GAAI,IAAA,CAAK,MAAA,CAAQ,OACjB,IAAMC,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMD,CAAG,CAAA,CAAQC,CAAAA,CAAK,OAAA,EAAWA,CAAAA,CAAK,OAAA,GACxDA,CAAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,WAAA,CAAY,KAAKD,CAAG,CAAA,CAC9C,IAAA,CAAK,UAAA,EAAW,EAClB,CAEQ,QAAQnE,CAAAA,CAAWC,CAAAA,CAAiB,CAC1C,GAAI,IAAA,CAAK,MAAA,CAAQ,OACjB,IAAMkE,CAAAA,CAAM,IAAA,CAAK,MAAA,CAAOnE,CAAAA,CAAGC,CAAC,CAAA,CAAG,GAAIkE,CAAAA,GAAQ,EAAA,CAAI,OAC/C,IAAMC,CAAAA,CAAO,IAAA,CAAK,MAAMD,CAAG,CAAA,CAAQC,CAAAA,CAAK,OAAA,EAAWA,CAAAA,CAAK,OAAA,GACxDA,CAAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAKD,CAAG,CAAA,CAAG,KAAK,WAAA,CAAcA,CAAAA,CACpE,IAAA,CAAK,UAAA,EAAW,EAClB,CAEQ,UAAA,EAAmB,CACzB,GAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAW,CAAA,CAAG,OACnC,KAAK,MAAA,CAAS,IAAA,CACd,GAAM,CAACE,CAAAA,CAAGJ,CAAC,CAAA,CAAI,IAAA,CAAK,WAAA,CAChB,IAAA,CAAK,KAAA,CAAMI,CAAC,CAAA,CAAG,KAAA,GAAU,KAAK,KAAA,CAAMJ,CAAC,CAAA,CAAG,KAAA,CAC1C,UAAA,CAAW,IAAM,CAIf,GAHA,IAAA,CAAK,KAAA,CAAMI,CAAC,CAAA,CAAG,OAAA,CAAU,IAAA,CAAM,KAAK,KAAA,CAAMJ,CAAC,CAAA,CAAG,OAAA,CAAU,IAAA,CACxD,IAAA,CAAK,UAAA,EAAA,CAAc,IAAA,CAAK,KAAA,EAAS,EAAA,CAAI,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAK,EAC9D,IAAA,CAAK,WAAA,CAAc,EAAC,CAAG,IAAA,CAAK,MAAA,CAAS,KAAA,CACjC,IAAA,CAAK,UAAA,GAAeZ,CAAAA,CAAO,MAAA,CAAQ,CAErC,IAAMiB,CAAAA,CAAAA,CAAW,KAAK,GAAA,EAAI,CAAI,IAAA,CAAK,SAAA,EAAa,GAAA,CAC1CC,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,IAAA,CAAK,KAAA,CAAA,CAAO,EAAA,CAAKD,CAAAA,EAAW,CAAC,CAAC,CAAA,CAC5D,IAAA,CAAK,KAAA,EAASC,CAAAA,CAAW,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAK,CAAA,CAClD,IAAA,CAAK,UAAA,IAAa,CAClB,UAAA,CAAW,IAAM,KAAK,KAAA,EAAM,CAAG,GAAI,EACrC,CACF,CAAA,CAAGhB,CAAAA,CAAU,GAAG,CAAA,CAEhB,UAAA,CAAW,IAAM,CACf,IAAA,CAAK,KAAA,CAAMc,CAAC,CAAA,CAAG,OAAA,CAAU,KAAA,CAAO,IAAA,CAAK,KAAA,CAAMJ,CAAC,CAAA,CAAG,OAAA,CAAU,KAAA,CACzD,IAAA,CAAK,WAAA,CAAc,EAAC,CAAG,IAAA,CAAK,OAAS,MACvC,CAAA,CAAGV,CAAAA,CAAU,GAAG,EAEpB,CAEQ,IAAA,CAAK9D,CAAAA,CAAmB,CAC9B,GAAI,CAAC,IAAA,CAAK,OAAA,CAAS,OACnB,KAAK,WAAA,CAAc,qBAAA,CAAsB0C,CAAAA,EAAK,IAAA,CAAK,IAAA,CAAKA,CAAC,CAAC,CAAA,CAC1D,IAAMC,CAAAA,CAAAA,CAAM3C,CAAAA,CAAM,IAAA,CAAK,QAAA,EAAY8D,CAAAA,CAAS,KAAK,QAAA,CAAW9D,CAAAA,CAC5D,IAAA,IAAW+E,CAAAA,IAAK,IAAA,CAAK,KAAA,CACfA,CAAAA,CAAE,OAAA,EAAWA,CAAAA,CAAE,YAAA,CAAe,CAAA,CAAGA,CAAAA,CAAE,YAAA,CAAe,IAAA,CAAK,IAAI,CAAA,CAAGA,CAAAA,CAAE,YAAA,CAAepC,CAAE,CAAA,CAC5E,CAACoC,CAAAA,CAAE,OAAA,EAAWA,CAAAA,CAAE,YAAA,CAAe,CAAA,GAAGA,CAAAA,CAAE,YAAA,CAAe,IAAA,CAAK,IAAI,CAAA,CAAGA,CAAAA,CAAE,YAAA,CAAepC,CAAE,CAAA,CAAA,CACvFoC,CAAAA,CAAE,OAAA,GAASA,CAAAA,CAAE,UAAA,CAAA,CAAcA,CAAAA,CAAE,UAAA,CAAapC,CAAAA,CAAK,GAAA,GAAS,IAAA,CAAK,GAAK,CAAA,CAAA,CAAA,CAExE,IAAA,CAAK,MAAA,GACP,CAEQ,MAAA,EAAe,CACrB,GAAM,CAAE,GAAA,CAAAxC,CAAAA,CAAK,CAAA,CAAAE,CAAAA,CAAG,CAAA,CAAAC,EAAG,KAAA,CAAAjD,CAAM,CAAA,CAAI,IAAA,CAC7B8C,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,UAAA,CAAY8C,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,EACzD,IAAA,IAASK,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CAC1C,IAAMgE,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMhE,CAAC,EAAU6D,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO7D,CAAC,CAAA,CAC9CqE,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIL,CAAAA,CAAK,YAAA,CAAe,IAAA,CAAK,EAAE,CAAC,CAAA,CACvDM,CAAAA,CAAKT,CAAAA,CAAE,CAAA,CAAIA,CAAAA,CAAE,CAAA,CAAI,CAAA,CAASU,CAAAA,CAAKV,CAAAA,CAAE,CAAA,CAAIA,CAAAA,CAAE,CAAA,CAAI,CAAA,CAGjD,GAFArE,EAAI,IAAA,EAAK,CAAGA,CAAAA,CAAI,SAAA,CAAU8E,CAAAA,CAAIC,CAAE,CAAA,CAAG/E,CAAAA,CAAI,KAAA,CAAM6E,CAAAA,CAAQ,CAAC,CAAA,CAAG7E,CAAAA,CAAI,SAAA,CAAU,CAACqE,CAAAA,CAAE,CAAA,CAAI,CAAA,CAAG,CAACA,CAAAA,CAAE,CAAA,CAAI,CAAC,CAAA,CACzFrE,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,SAAA,CAAU,CAAA,CAAG,EAAGqE,CAAAA,CAAE,CAAA,CAAGA,CAAAA,CAAE,CAAA,CAAG,CAAC,CAAA,CAC5CG,CAAAA,CAAK,YAAA,CAAe,EAAA,CAAK,CAC3B,GAAIA,CAAAA,CAAK,OAAA,CAAS,CAEhB,IAAMQ,CAAAA,CAAQ,EAAA,CAAM,IAAA,CAAK,GAAA,CAAIR,CAAAA,CAAK,UAAU,CAAA,CAAI,EAAA,CAChDxE,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,OAAA,CAAU,IAAA,CAAM8C,CAAAA,CAAI,MAAK,CAC/CA,CAAAA,CAAI,WAAA,CAAc9C,CAAAA,CAAM,OAAA,CAAS8C,CAAAA,CAAI,SAAA,CAAY,CAAA,CACjDA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAAMgF,CAAAA,CAAOhF,CAAAA,CAAI,MAAA,GAAUA,CAAAA,CAAI,WAAA,CAAc,CAAA,CAE/DA,CAAAA,CAAI,WAAA,CAAc9C,CAAAA,CAAM,OAAA,CAAS8C,CAAAA,CAAI,UAAA,CAAa,CAAA,CAClDA,CAAAA,CAAI,MAAA,EAAO,CAAGA,CAAAA,CAAI,WAAa,EACjC,CAAA,KACEA,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,OAAA,CAAS8C,CAAAA,CAAI,IAAA,EAAK,CAE1CA,CAAAA,CAAI,IAAA,CAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIqE,EAAE,CAAA,CAAGA,CAAAA,CAAE,CAAC,CAAA,CAAI,GAAI,CAAA,QAAA,CAAA,CAAYrE,CAAAA,CAAI,SAAA,CAAY,QAAA,CAAUA,CAAAA,CAAI,YAAA,CAAe,QAAA,CAChGA,CAAAA,CAAI,QAAA,CAASwE,EAAK,KAAA,CAAOH,CAAAA,CAAE,CAAA,CAAI,CAAA,CAAGA,CAAAA,CAAE,CAAA,CAAI,CAAC,EAC3C,CAAA,KAAO,CACLrE,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,OAAA,CAAU,KAAM8C,CAAAA,CAAI,IAAA,EAAK,CAC/CA,CAAAA,CAAI,WAAA,CAAc9C,CAAAA,CAAM,OAAA,CAAS8C,CAAAA,CAAI,SAAA,CAAY,CAAA,CAAGA,CAAAA,CAAI,WAAA,CAAc,GAAA,CACtE,IAAA,IAAS8D,EAAI,CAAA,CAAGA,CAAAA,CAAI,CAAA,CAAGA,CAAAA,EAAAA,CAAK,CAAE,IAAMmB,CAAAA,CAAI,CAAA,CAAInB,CAAAA,CAAI,CAAA,CAAG9D,CAAAA,CAAI,UAAA,CAAWiF,CAAAA,CAAGA,CAAAA,CAAGZ,EAAE,CAAA,CAAIY,CAAAA,CAAI,CAAA,CAAGZ,CAAAA,CAAE,CAAA,CAAIY,CAAAA,CAAI,CAAC,EAAE,CAClGjF,CAAAA,CAAI,WAAA,CAAc,EACpB,CAEIQ,CAAAA,GAAM,KAAK,WAAA,GACbR,CAAAA,CAAI,WAAA,CAAc9C,CAAAA,CAAM,IAAA,CAAM8C,CAAAA,CAAI,SAAA,CAAY,CAAA,CAAGA,CAAAA,CAAI,WAAA,CAAY,CAAC,CAAA,CAAG,CAAC,CAAC,EACvEA,CAAAA,CAAI,UAAA,CAAW,CAAA,CAAG,CAAA,CAAGqE,CAAAA,CAAE,CAAA,CAAGA,CAAAA,CAAE,CAAC,CAAA,CAAGrE,CAAAA,CAAI,WAAA,CAAY,EAAE,CAAA,CAAA,CAEpDA,EAAI,OAAA,GACN,CACAA,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,IAAA,CAAM8C,CAAAA,CAAI,WAAA,CAAc,EAAA,CAAKA,CAAAA,CAAI,IAAA,CAAO,gBAAA,CAAkBA,CAAAA,CAAI,UAAY,OAAA,CAChGA,CAAAA,CAAI,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,CAAA,EAAIyD,CAAAA,CAAO,MAAM,CAAA,MAAA,EAAW,IAAA,CAAK,KAAK,CAAA,GAAA,CAAA,CAAOvD,CAAAA,CAAI,EAAGC,CAAAA,CAAI,CAAC,CAAA,CAAGH,CAAAA,CAAI,WAAA,CAAc,EAC/G,CACF,EAAA,CAAA,CAAA,CCnNA,IAAAkF,EAAAA,CAAA,EAAA,CAAArG,CAAAA,CAAAqG,EAAAA,CAAA,CAAA,cAAA,CAAA,IAAAC,IAAA,IAeMzB,CAAAA,CACA0B,CAAAA,CACAC,EAAAA,CACAC,EAAAA,CACAC,EAAAA,CACAC,EAAAA,CACAC,EAAAA,CAUON,CAAAA,CA/BbO,EAAAA,CAAA9H,CAAAA,CAAA,IAAA,CAaAD,CAAAA,EAAAA,CAEM+F,CAAAA,CAAO,EACP0B,CAAAA,CAAiB,GAAA,CACjBC,EAAAA,CAAa3B,CAAAA,CAAOA,CAAAA,CACpB4B,EAAAA,CAAiB,GAAA,CACjBC,EAAAA,CAAe,GAAA,CACfC,EAAAA,CAAgB,GAAA,CAChBC,EAAAA,CAAkB,GAAA,CAUXN,CAAAA,CAAN,KAA2C,CACvC,IAAA,CAAO,cAAA,CACP,UAAA,CAAa,GAAA,CAEd,MAAA,CACA,GAAA,CACA,KAAA,CACA,CAAA,CAAI,CAAA,CAAW,CAAA,CAAI,CAAA,CAEnB,KAAA,CAAgB,GAChB,KAAA,CAAQ,CAAA,CACR,QAAA,CAAWC,CAAAA,CACX,UAAA,CAAa,CAAA,CACb,WAAA,CAA6B,IAAA,CAC7B,OAAA,CAAU,KAAA,CACV,QAAA,CAAW,CAAA,CACX,SAAA,CAAY,KAAA,CACZ,cAAgB,CAAA,CAEhB,UAAA,CACA,UAAA,CACA,YAAA,CAEA,OAAA,CACA,UAAA,CAER,WAAA,CAAYhG,CAAAA,CAA+BC,CAAAA,CAAyB,CAClE,IAAA,CAAK,OAAA,CAAUD,CAAAA,CACf,IAAA,CAAK,WAAaC,CAAAA,CAClB,IAAA,CAAK,UAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,CACxC,IAAA,CAAK,UAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,EACxC,IAAA,CAAK,YAAA,CAAe,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,EAC9C,CAEA,IAAA,CAAKC,CAAAA,CAA2BpC,CAAAA,CAA0B,CACxD,IAAA,CAAK,MAAA,CAASoC,EAAQ,IAAA,CAAK,GAAA,CAAMA,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAAI,IAAA,CAAK,KAAA,CAAQrC,CAAAA,CAAaC,CAAK,CAAA,CAE1FoC,CAAAA,CAAO,YAAA,CAAa,YAAA,CAAc,gDAAgD,CAAA,CAClFA,CAAAA,CAAO,YAAA,CAAa,MAAA,CAAQ,KAAK,CAAA,CAEjC,IAAMC,CAAAA,CAAM,MAAA,CAAO,gBAAA,EAAoB,CAAA,CAASC,CAAAA,CAAOF,CAAAA,CAAO,qBAAA,GAC9DA,CAAAA,CAAO,KAAA,CAAQE,CAAAA,CAAK,KAAA,CAAQD,CAAAA,CAAKD,CAAAA,CAAO,MAAA,CAASE,CAAAA,CAAK,MAAA,CAASD,CAAAA,CAC/D,IAAA,CAAK,GAAA,CAAI,KAAA,CAAMA,CAAAA,CAAKA,CAAG,CAAA,CAAGD,CAAAA,CAAO,KAAA,CAAM,KAAA,CAAQ,CAAA,EAAGE,CAAAA,CAAK,KAAK,CAAA,EAAA,CAAA,CAAMF,CAAAA,CAAO,KAAA,CAAM,MAAA,CAAS,CAAA,EAAGE,CAAAA,CAAK,MAAM,KACtG,IAAA,CAAK,CAAA,CAAIA,CAAAA,CAAK,KAAA,CAAO,IAAA,CAAK,CAAA,CAAIA,CAAAA,CAAK,MAAA,CACnC,IAAA,CAAK,KAAA,GACP,CAEQ,KAAA,EAAc,CACpB,KAAK,KAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQ6F,EAAW,CAAA,CAAG,KAAO,CACrD,MAAA,CAAQ,KAAA,CAAO,YAAA,CAAc,CAAA,CAAG,MAAA,CAAQ,EAAG,GAAA,CAAK,KAAA,CAAO,WAAA,CAAa,CACtE,CAAA,CAAE,CAAA,CACF,IAAA,CAAK,KAAA,CAAQ,CAAA,CAAG,IAAA,CAAK,QAAA,CAAWD,CAAAA,CAAgB,IAAA,CAAK,SAAA,CAAY,MACjE,IAAA,CAAK,aAAA,CAAgB,EACvB,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,UAAA,CAAa,WAAA,CAAY,GAAA,EAAI,CAAG,KAAK,QAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CAC1F,IAAA,CAAK,aAAA,CAAgB,WAAA,CAAY,GAAA,EAAI,CACrC,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,EAC3B,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAAS,IAAA,CAAK,UAAU,CAAA,CACrD,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAY,IAAA,CAAK,UAAA,CAAY,CAAE,QAAS,IAAK,CAAC,CAAA,CAC3E,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAW,IAAA,CAAK,YAAY,EACxD,CAEA,KAAA,EAAc,CACZ,IAAA,CAAK,OAAA,CAAU,MACX,IAAA,CAAK,WAAA,GAAgB,IAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,WAAW,CAAA,CAAG,IAAA,CAAK,WAAA,CAAc,IAAA,EAC9F,CAEA,MAAA,EAAe,CACR,IAAA,CAAK,UACR,IAAA,CAAK,OAAA,CAAU,IAAA,CAAM,IAAA,CAAK,QAAA,CAAW,WAAA,CAAY,GAAA,EAAI,CACrD,IAAA,CAAK,aAAA,CAAgB,WAAA,CAAY,GAAA,EAAI,CACrC,IAAA,CAAK,KAAK,WAAA,CAAY,GAAA,EAAK,CAAA,EAE/B,CAEA,OAAA,EAAgB,CACd,IAAA,CAAK,KAAA,EAAM,CACX,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAAS,KAAK,UAAU,CAAA,CACxD,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,UAAA,CAAY,IAAA,CAAK,UAAU,CAAA,CAC3D,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAW,IAAA,CAAK,YAAY,EAC3D,CAEA,QAAA,EAAmB,CAAE,OAAO,IAAA,CAAK,KAAM,CAI/B,YAAA,CAAavF,CAAAA,CAAmB,CACtC,GAAI,IAAA,CAAK,SAAA,EAAaA,CAAAA,CAAM,KAAK,aAAA,CAAe,OAEhD,IAAM8F,CAAAA,CAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAACvB,CAAAA,CAAG5D,CAAAA,GAAO,CAAC4D,CAAAA,CAAE,MAAA,EAAU,CAACA,EAAE,GAAA,CAAM5D,CAAAA,CAAI,EAAG,CAAA,CAAE,MAAA,CAAOA,CAAAA,EAAKA,CAAAA,EAAK,CAAC,CAAA,CAC7F,GAAImF,CAAAA,CAAU,MAAA,CAAS,CAAA,CAAG,CACxB,IAAMpB,CAAAA,CAAMoB,CAAAA,CAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAWA,CAAAA,CAAU,MAAM,CAAC,CAAA,CAClE,IAAA,CAAK,YAAA,CAAapB,EAAK1E,CAAG,EAC5B,CAGA,IAAM6E,CAAAA,CAAU7E,CAAAA,CAAM,IAAA,CAAK,UAAA,CACrB0C,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGmC,CAAAA,CAAUU,CAAc,EACxCQ,CAAAA,CAAWN,EAAAA,CAAiB/C,CAAAA,EAAK+C,EAAAA,CAAiBC,EAAAA,CAAAA,CACxD,IAAA,CAAK,aAAA,CAAgB1F,CAAAA,CAAM+F,EAC7B,CAEQ,YAAA,CAAarB,CAAAA,CAAa1E,CAAAA,CAAmB,CACnD,IAAMgG,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMtB,CAAG,CAAA,CAC3BsB,CAAAA,CAAK,MAAA,CAAS,IAAA,CAAMA,CAAAA,CAAK,GAAA,CAAM,KAAA,CAAOA,CAAAA,CAAK,WAAA,CAAc,CAAA,CACzDA,EAAK,MAAA,CAAShG,CAAAA,CAAM2F,EAAAA,CAAgB,IAAA,CAAK,MAAA,EAAO,CAAIC,GACtD,CAEQ,UAAA,CAAWjF,CAAAA,CAAkD,CACnE,IAAMyD,CAAAA,CAAOP,CAAAA,CAAYQ,EAAOR,CAAAA,CAC1BoC,CAAAA,CAAO,EAAA,CAAUC,CAAAA,CAAO,EAAA,CACxBC,CAAAA,CAAAA,CAAS,IAAA,CAAK,CAAA,CAAIF,CAAAA,CAAO,CAAA,EAAK7B,CAAAA,CAAYgC,CAAAA,CAAAA,CAAS,IAAA,CAAK,CAAA,CAAIF,EAAO,CAAA,CAAI,EAAA,EAAM7B,CAAAA,CAC7EgC,CAAAA,CAAM1F,CAAAA,CAAIyD,CAAAA,CAAYkC,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAM3F,CAAAA,CAAIyD,CAAI,CAAA,CAC/Ca,CAAAA,CAAKgB,CAAAA,CAAOI,EAAMF,CAAAA,CAAQA,CAAAA,CAAQ,CAAA,CAClCjB,CAAAA,CAAKgB,CAAAA,CAAOI,CAAAA,CAAMF,CAAAA,CAAQA,CAAAA,CAAQ,CAAA,CAAI,EAAA,CACtCtF,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAIqF,CAAAA,CAAOC,CAAK,CAAA,CAAI,GAAA,CACnC,OAAO,CAAE,EAAA,CAAAnB,CAAAA,CAAI,EAAA,CAAAC,CAAAA,CAAI,CAAA,CAAApE,CAAE,CACrB,CAIQ,OAAA,CAAQ,CAAA,CAAqB,CAAE,IAAMA,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB,CAAG,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,OAAA,CAAUA,CAAAA,CAAE,IAAA,CAAM,CAAA,CAAE,OAAA,CAAUA,EAAE,GAAG,EAAE,CACjI,OAAA,CAAQ,CAAA,CAAqB,CAAE,IAAM,CAAA,CAAI,CAAA,CAAE,cAAA,CAAe,CAAC,CAAA,CAAG,GAAI,CAAC,EAAG,OAAQ,IAAMA,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB,CAAG,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,OAAA,CAAUA,CAAAA,CAAE,IAAA,CAAM,CAAA,CAAE,QAAUA,CAAAA,CAAE,GAAG,EAAE,CAEhL,SAAA,CAAU,CAAA,CAAwB,CAExC,IAAMyF,CAAAA,CAAM,QAAA,CAAS,CAAA,CAAE,GAAA,CAAK,EAAE,CAAA,CAC9B,GAAIA,CAAAA,EAAO,CAAA,EAAKA,CAAAA,EAAO,CAAA,CAAG,CAExB,GADA,CAAA,CAAE,cAAA,EAAe,CACb,IAAA,CAAK,SAAA,CAAW,CAAE,IAAA,CAAK,KAAA,GAAS,IAAA,CAAK,aAAA,CAAgB,WAAA,CAAY,GAAA,EAAI,CAAG,MAAO,CACnF,IAAM7B,CAAAA,CAAM6B,CAAAA,CAAM,CAAA,CACZP,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMtB,CAAG,CAAA,CACvBsB,CAAAA,EAAQA,CAAAA,CAAK,MAAA,EAAU,CAACA,CAAAA,CAAK,GAAA,GAC/BA,CAAAA,CAAK,MAAA,CAAS,KAAA,CAAOA,CAAAA,CAAK,GAAA,CAAM,IAAA,CAAMA,CAAAA,CAAK,YAAc,CAAA,CAAGA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAC1E,IAAA,CAAK,KAAA,EAAA,CAAS,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAK,CAAA,EAE3C,CACF,CAEQ,MAAA,CAAOjF,EAAYC,CAAAA,CAAkB,CAC3C,GAAI,IAAA,CAAK,SAAA,CAAW,CAAE,IAAA,CAAK,KAAA,EAAM,CAAG,IAAA,CAAK,aAAA,CAAgB,WAAA,CAAY,GAAA,EAAI,CAAG,MAAO,CACnF,IAAA,IAASL,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CAC1C,IAAMqF,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMrF,CAAC,CAAA,CAAI,GAAI,CAACqF,CAAAA,CAAK,MAAA,EAAUA,CAAAA,CAAK,GAAA,CAAK,SAC3D,IAAMxB,CAAAA,CAAI,IAAA,CAAK,UAAA,CAAW7D,CAAC,CAAA,CAE3B,GADa,IAAA,CAAK,KAAA,CAAMI,CAAAA,CAAKyD,CAAAA,CAAE,EAAA,CAAIxD,CAAAA,CAAKwD,CAAAA,CAAE,EAAE,CAAA,CACjCA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAK,CACpBwB,CAAAA,CAAK,OAAS,KAAA,CAAOA,CAAAA,CAAK,GAAA,CAAM,IAAA,CAAMA,CAAAA,CAAK,WAAA,CAAc,CAAA,CAAGA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAC1E,IAAA,CAAK,KAAA,EAAA,CAAS,IAAA,CAAK,OAAA,GAAU,KAAK,KAAK,CAAA,CACvC,MACF,CACF,CACF,CAIQ,IAAA,CAAKhG,CAAAA,CAAmB,CAC9B,GAAI,CAAC,IAAA,CAAK,OAAA,CAAS,OACnB,KAAK,WAAA,CAAc,qBAAA,CAAsB0C,CAAAA,EAAK,IAAA,CAAK,IAAA,CAAKA,CAAC,CAAC,CAAA,CAC1D,IAAMC,CAAAA,CAAK3C,CAAAA,CAAM,IAAA,CAAK,QAAA,CAAU,IAAA,CAAK,SAAWA,CAAAA,CAChD,IAAA,CAAK,MAAA,CAAOA,CAAAA,CAAK2C,CAAE,CAAA,CAAG,IAAA,CAAK,MAAA,GAC7B,CAEQ,MAAA,CAAO3C,CAAAA,CAAa2C,CAAAA,CAAkB,CAC5C,GAAI,IAAA,CAAK,SAAA,CAAW,OAGpB,GADA,IAAA,CAAK,QAAA,CAAW,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG4C,CAAAA,EAAkBvF,CAAAA,CAAM,IAAA,CAAK,UAAA,CAAW,CAAA,CAChE,KAAK,QAAA,GAAa,CAAA,CAAG,CAAE,IAAA,CAAK,SAAA,CAAY,IAAA,CAAM,IAAA,CAAK,UAAA,IAAa,CAAG,MAAO,CAG9E,IAAA,CAAK,YAAA,CAAaA,CAAG,EAGrB,IAAA,IAAWgG,CAAAA,IAAQ,IAAA,CAAK,KAAA,CAClBA,CAAAA,CAAK,MAAA,EAAUA,CAAAA,CAAK,MAAA,CAAS,CAAA,EAAKhG,CAAAA,EAAOgG,CAAAA,CAAK,MAAA,GAChDA,CAAAA,CAAK,MAAA,CAAS,MAAOA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAAA,CAIvC,IAAMQ,CAAAA,CAAO7D,CAAAA,CAAK,GAAA,CAClB,IAAA,IAAWqD,CAAAA,IAAQ,IAAA,CAAK,KAAA,CAClBA,CAAAA,CAAK,MAAA,CAAQA,CAAAA,CAAK,aAAe,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,CAAAA,CAAK,YAAA,CAAeQ,CAAI,CAAA,CAChER,CAAAA,CAAK,GAAA,EAAOA,CAAAA,CAAK,WAAA,CAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,EAAK,WAAA,CAAcQ,CAAI,CAAA,CAAOR,CAAAA,CAAK,WAAA,EAAe,CAAA,GAAGA,CAAAA,CAAK,GAAA,CAAM,KAAA,CAAA,EAC/GA,CAAAA,CAAK,YAAA,CAAe,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGA,EAAK,YAAA,CAAeQ,CAAI,EAEjE,CAEQ,MAAA,EAAe,CACrB,GAAM,CAAE,GAAA,CAAArG,CAAAA,CAAK,CAAA,CAAAE,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,MAAAjD,CAAM,CAAA,CAAI,IAAA,CAC7B8C,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,UAAA,CAAY8C,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CAGzD,IAAMmG,CAAAA,CAAW,IAAA,CAAK,QAAA,CAAWlB,CAAAA,CACjCpF,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,OAAA,CAAS8C,CAAAA,CAAI,QAAA,CAAS,EAAA,CAAI,EAAA,CAAIE,CAAAA,CAAI,EAAA,CAAI,EAAE,CAAA,CAC9DF,CAAAA,CAAI,SAAA,CAAYsG,CAAAA,CAAW,EAAA,CAAMpJ,CAAAA,CAAM,OAAA,CAAUA,CAAAA,CAAM,MAAA,CACvD8C,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,SAAA,CAAU,GAAI,EAAA,CAAA,CAAKE,CAAAA,CAAI,EAAA,EAAMoG,CAAAA,CAAU,EAAA,CAAI,CAAC,CAAA,CAAGtG,CAAAA,CAAI,IAAA,EAAK,CAG7EA,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,IAAA,CAAM8C,EAAI,IAAA,CAAO,qBAAA,CAAuBA,CAAAA,CAAI,SAAA,CAAY,MAAA,CAC9EA,CAAAA,CAAI,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,CAAI,EAAA,CAAIG,CAAAA,CAAI,CAAC,EACvCH,CAAAA,CAAI,SAAA,CAAY,OAAA,CAASA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAAKA,CAAAA,CAAI,IAAA,CAAO,gBAAA,CAC3DA,CAAAA,CAAI,QAAA,CAAS,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,KAAK,QAAA,CAAW,GAAI,CAAC,CAAA,CAAA,CAAA,CAAKE,CAAAA,CAAI,EAAA,CAAIC,CAAAA,CAAI,CAAC,CAAA,CAAGH,CAAAA,CAAI,WAAA,CAAc,CAAA,CAGtF,IAAA,IAASQ,CAAAA,CAAI,EAAGA,CAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAQA,CAAAA,EAAAA,CAAK,CAC1C,IAAMqF,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMrF,CAAC,CAAA,CAAU6D,CAAAA,CAAI,IAAA,CAAK,WAAW7D,CAAC,CAAA,CAGxDR,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,OAAA,CAAS8C,CAAAA,CAAI,WAAA,CAAc,EAAA,CACjDA,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,OAAA,CAAQqE,EAAE,EAAA,CAAIA,CAAAA,CAAE,EAAA,CAAKA,CAAAA,CAAE,CAAA,CAAI,EAAA,CAAKA,CAAAA,CAAE,CAAA,CAAGA,CAAAA,CAAE,CAAA,CAAI,EAAA,CAAK,CAAA,CAAG,CAAA,CAAG,IAAA,CAAK,GAAK,CAAC,CAAA,CAAGrE,CAAAA,CAAI,IAAA,EAAK,CAClGA,CAAAA,CAAI,WAAA,CAAc,CAAA,CAGlBA,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,IAAA,CAAM8C,CAAAA,CAAI,WAAA,CAAc,GAAKA,CAAAA,CAAI,IAAA,CAAO,CAAA,KAAA,EAAQqE,CAAAA,CAAE,CAAA,CAAI,EAAG,CAAA,YAAA,CAAA,CAC/ErE,CAAAA,CAAI,SAAA,CAAY,QAAA,CAAUA,CAAAA,CAAI,QAAA,CAAS,CAAA,EAAGQ,CAAAA,CAAI,CAAC,CAAA,CAAA,CAAI6D,CAAAA,CAAE,EAAA,CAAIA,CAAAA,CAAE,EAAA,CAAKA,CAAAA,CAAE,CAAA,CAAI,GAAI,CAAA,CAAGrE,CAAAA,CAAI,WAAA,CAAc,CAAA,CAG/F,IAAMuG,CAAAA,CAAAA,CAAOV,EAAK,MAAA,EAAUA,CAAAA,CAAK,GAAA,GAAOA,CAAAA,CAAK,GAAA,CAAM,CAAA,CAAIA,CAAAA,CAAK,WAAA,CAAmCA,CAAAA,CAAK,YAAA,CACpG,GAAIU,CAAAA,EAAQ,CAAA,CAAG,SAEf,IAAMC,CAAAA,CAAAA,CAAW,CAAA,CAAID,CAAAA,EAAQlC,CAAAA,CAAE,CAAA,CAAI,GAAA,CAC7BU,CAAAA,CAAKV,CAAAA,CAAE,EAAA,CAAKmC,CAAAA,CAElBxG,CAAAA,CAAI,IAAA,EAAK,CACTA,CAAAA,CAAI,WAAU,CACdA,CAAAA,CAAI,OAAA,CAAQqE,CAAAA,CAAE,EAAA,CAAIA,CAAAA,CAAE,EAAA,CAAKA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAE,CAAA,CAAGA,CAAAA,CAAE,CAAA,CAAI,IAAM,CAAA,CAAG,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CACvErE,CAAAA,CAAI,IAAA,EAAK,CAGTA,CAAAA,CAAI,SAAA,CAAY6F,CAAAA,CAAK,GAAA,CAAM3I,CAAAA,CAAM,OAAS,SAAA,CAC1C8C,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAIqE,CAAAA,CAAE,EAAA,CAAIU,CAAAA,CAAIV,CAAAA,CAAE,CAAA,CAAI,EAAA,CAAK,CAAA,CAAG,IAAA,CAAK,GAAK,CAAC,CAAA,CAAGrE,CAAAA,CAAI,IAAA,EAAK,CAExEA,CAAAA,CAAI,SAAA,CAAY,MAAA,CAChBA,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAIqE,CAAAA,CAAE,GAAKA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMU,CAAAA,CAAKV,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAM,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,EAAGrE,CAAAA,CAAI,IAAA,EAAK,CACnGA,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAIqE,CAAAA,CAAE,EAAA,CAAKA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMU,CAAAA,CAAKV,EAAE,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAM,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAAGrE,CAAAA,CAAI,IAAA,EAAK,CACnGA,CAAAA,CAAI,UAAY,MAAA,CAChBA,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAIqE,CAAAA,CAAE,EAAA,CAAKA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMU,CAAAA,CAAKV,CAAAA,CAAE,CAAA,CAAI,IAAMA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAM,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAAGrE,CAAAA,CAAI,IAAA,EAAK,CACnGA,CAAAA,CAAI,SAAA,EAAU,CAAGA,EAAI,GAAA,CAAIqE,CAAAA,CAAE,EAAA,CAAKA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMU,CAAAA,CAAKV,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAM,CAAA,CAAG,KAAK,EAAA,CAAK,CAAC,CAAA,CAAGrE,CAAAA,CAAI,IAAA,EAAK,CAEnGA,CAAAA,CAAI,SAAA,CAAY,SAAA,CAChBA,CAAAA,CAAI,SAAA,EAAU,CAAGA,CAAAA,CAAI,GAAA,CAAIqE,EAAE,EAAA,CAAIU,CAAAA,CAAKV,CAAAA,CAAE,CAAA,CAAI,GAAA,CAAMA,CAAAA,CAAE,CAAA,CAAI,EAAA,CAAK,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAAGrE,CAAAA,CAAI,MAAK,CAEjF6F,CAAAA,CAAK,GAAA,GACP7F,CAAAA,CAAI,SAAA,CAAY,SAAA,CAAWA,CAAAA,CAAI,IAAA,CAAO,CAAA,KAAA,EAAQqE,CAAAA,CAAE,CAAA,CAAI,EAAG,CAAA,YAAA,CAAA,CACvDrE,CAAAA,CAAI,UAAY,QAAA,CAAUA,CAAAA,CAAI,QAAA,CAAS,QAAA,CAAUqE,CAAAA,CAAE,EAAA,CAAIU,CAAAA,CAAKV,CAAAA,CAAE,CAAA,CAAI,EAAG,CAAA,CAAA,CAGvErE,CAAAA,CAAI,OAAA,GACN,CAGI,IAAA,CAAK,SAAA,GACPA,CAAAA,CAAI,SAAA,CAAY,kBAAA,CAAoBA,CAAAA,CAAI,QAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CAC3DH,CAAAA,CAAI,SAAA,CAAY9C,EAAM,IAAA,CAAM8C,CAAAA,CAAI,IAAA,CAAO,qBAAA,CAAuBA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAC9EA,CAAAA,CAAI,QAAA,CAAS,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,CAAA,CAAIE,CAAAA,CAAI,EAAGC,CAAAA,CAAI,CAAC,CAAA,CACjDH,CAAAA,CAAI,IAAA,CAAO,gBAAA,CAAkBA,CAAAA,CAAI,WAAA,CAAc,EAAA,CAC/CA,CAAAA,CAAI,QAAA,CAAS,mBAAA,CAAqBE,CAAAA,CAAI,CAAA,CAAGC,EAAI,CAAA,CAAI,EAAE,CAAA,CAAGH,CAAAA,CAAI,WAAA,CAAc,CAAA,EAE5E,CACF,EAAA,CAAA,CAAA,CC7QArC,CAAAA,EAAAA,CCFO,IAAM8I,CAAAA,CAAN,KAAsB,CAQ3B,YAAoBzI,CAAAA,CAAuB,CAAvB,IAAA,CAAA,OAAA,CAAAA,EAAwB,CAPpC,UAAA,CAAmD,IAAA,CACnD,eAAA,CAAwD,IAAA,CACxD,QAAA,CAA0B,IAAA,CAC1B,6BAAA,CAAgC,KAAA,CAChC,SAAA,CAAY,MACZ,SAAA,CAAY,KAAA,CAQpB,KAAA,EAAc,CACR,IAAA,CAAK,SAAA,GACT,IAAA,CAAK,6BAAA,CAAgC,KAAA,CAErC,IAAA,CAAK,UAAA,CAAa,UAAA,CAAW,IAAM,CACjC,KAAK,UAAA,CAAa,IAAA,CACd,CAAA,IAAA,CAAK,SAAA,GAEL,IAAA,CAAK,6BAAA,GAKT,IAAA,CAAK,SAAA,CAAY,IAAA,CACjB,IAAA,CAAK,QAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CACzB,KAAK,OAAA,CAAQ,MAAA,EAAO,CAAA,EACtB,CAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,EACvB,CAMA,GAAA,EAAY,CACV,GAAI,IAAA,CAAK,SAAA,CAAW,OAEpB,GAAI,IAAA,CAAK,UAAA,GAAe,IAAA,CAAM,CAE5B,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA,CAC5B,IAAA,CAAK,UAAA,CAAa,IAAA,CAClB,IAAA,CAAK,6BAAA,CAAgC,KACrC,MACF,CAEA,GAAI,CAAC,IAAA,CAAK,SAAA,CAAW,OAErB,IAAM0G,CAAAA,CAAU,IAAA,CAAK,GAAA,EAAI,EAAK,IAAA,CAAK,QAAA,EAAY,GACzCgC,CAAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAahC,CAAAA,CAExCgC,CAAAA,EAAa,CAAA,CAEf,IAAA,CAAK,WAAA,EAAY,CAGjB,IAAA,CAAK,eAAA,CAAkB,UAAA,CAAW,IAAM,CACjC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,WAAA,GAC5B,CAAA,CAAGA,CAAS,EAEhB,CAEQ,WAAA,EAAoB,CAC1B,IAAA,CAAK,SAAA,CAAY,KAAA,CACjB,KAAK,OAAA,CAAQ,MAAA,GACf,CAGA,OAAA,EAAgB,CACd,IAAA,CAAK,SAAA,CAAY,IAAA,CACb,IAAA,CAAK,UAAA,GAAe,IAAA,GACtB,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA,CAC5B,IAAA,CAAK,UAAA,CAAa,IAAA,CAAA,CAEhB,IAAA,CAAK,eAAA,GAAoB,IAAA,GAC3B,YAAA,CAAa,IAAA,CAAK,eAAe,CAAA,CACjC,IAAA,CAAK,eAAA,CAAkB,IAAA,EAE3B,CACF,EC9FA,IAAMC,CAAAA,CAAc,sBAAA,CAUpB,SAASC,CAAAA,EAAwB,CAC/B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,CAAC,MAAA,CAAO,YAAA,CAAc,OAAO,EAAC,CACnE,GAAI,CACF,IAAMC,CAAAA,CAAM,YAAA,CAAa,OAAA,CAAQF,CAAW,CAAA,CAC5C,OAAOE,CAAAA,CAAO,IAAA,CAAK,KAAA,CAAMA,CAAG,CAAA,CAAmB,EACjD,CAAA,KAAQ,CACN,OAAO,EACT,CACF,CAEA,SAASC,CAAAA,CAAWC,CAAAA,CAAyB,CAC3C,GAAI,EAAA,OAAO,MAAA,CAAW,GAAA,EAAe,CAAC,MAAA,CAAO,YAAA,CAAA,CAC7C,GAAI,CACF,YAAA,CAAa,OAAA,CAAQJ,CAAAA,CAAa,IAAA,CAAK,SAAA,CAAUI,CAAK,CAAC,EACzD,CAAA,KAAQ,CAER,CACF,CAKA,SAASC,CAAAA,CAASC,CAAAA,CAAmCC,CAAAA,CAA4B,CAC/E,OAAOA,CAAAA,CAAY,CAAA,EAAGA,CAAS,IAAID,CAAI,CAAA,CAAA,CAAKA,CAC9C,CAMO,SAASE,CAAAA,CACdF,CAAAA,CACAC,CAAAA,CACQ,CACR,IAAMH,CAAAA,CAAQH,CAAAA,EAAU,CAClBxJ,CAAAA,CAAM4J,EAASC,CAAAA,CAAMC,CAAS,CAAA,CACpC,OAAOH,CAAAA,CAAM3J,CAAG,CAAA,EAAG,YAAA,EAAgB,CACrC,CAKO,SAASgK,CAAAA,CACdH,CAAAA,CACAI,CAAAA,CACAH,EACS,CACT,IAAMH,CAAAA,CAAQH,CAAAA,EAAU,CAClBxJ,CAAAA,CAAM4J,CAAAA,CAASC,CAAAA,CAAMC,CAAS,CAAA,CAC9BI,CAAAA,CAAWP,CAAAA,CAAM3J,CAAG,CAAA,CAEpBmK,EAAcF,CAAAA,EAASC,CAAAA,EAAU,YAAA,EAAgB,CAAA,CAAA,CAEvD,OAAAP,CAAAA,CAAM3J,CAAG,CAAA,CAAI,CACX,YAAA,CAAcmK,CAAAA,CAAcF,CAAAA,CAASC,CAAAA,EAAU,YAAA,EAAgB,EAC/D,UAAA,CAAY,IAAI,IAAA,EAAK,CAAE,WAAA,EAAY,CACnC,UAAA,CAAA,CAAaA,CAAAA,EAAU,UAAA,EAAc,CAAA,EAAK,CAC5C,CAAA,CAEAR,CAAAA,CAAWC,CAAK,EACTQ,CACT,CAKO,SAASC,EAAAA,CAAaN,CAAAA,CAAgD,CAC3E,IAAMH,CAAAA,CAAQH,CAAAA,EAAU,CACxB,OAAKM,CAAAA,CAEE,MAAA,CAAO,WAAA,CACZ,OAAO,OAAA,CAAQH,CAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC3J,CAAG,CAAA,GAAMA,CAAAA,CAAI,UAAA,CAAW,CAAA,EAAG8J,CAAS,CAAA,CAAA,CAAG,CAAC,CACzE,CAAA,CAJuBH,CAKzB,CAKO,SAASU,EAAAA,CAAYP,CAAAA,CAA0B,CACpD,GAAI,CAACA,CAAAA,CAAW,CACV,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,YAAA,EAC1C,YAAA,CAAa,UAAA,CAAWP,CAAW,CAAA,CAErC,MACF,CAEA,IAAMI,CAAAA,CAAQH,CAAAA,EAAU,CAClBc,CAAAA,CAAS,CAAA,EAAGR,CAAS,IACrBS,CAAAA,CAAW,MAAA,CAAO,WAAA,CACtB,MAAA,CAAO,OAAA,CAAQZ,CAAK,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC3J,CAAG,CAAA,GAAM,CAACA,CAAAA,CAAI,WAAWsK,CAAM,CAAC,CACjE,CAAA,CACAZ,CAAAA,CAAWa,CAAQ,EACrB,CF5EA,IAAMC,EAAAA,CAAW,CACf,EAAA,CAAI,CAAE,KAAA,CAAO,IAAK,MAAA,CAAQ,GAAI,CAAA,CAC9B,EAAA,CAAI,CAAE,KAAA,CAAO,GAAA,CAAK,MAAA,CAAQ,GAAI,CAAA,CAC9B,EAAA,CAAI,CAAE,KAAA,CAAO,GAAA,CAAK,OAAQ,GAAI,CAAA,CAC9B,IAAA,CAAM,CAAE,KAAA,CAAO,CAAA,CAAG,MAAA,CAAQ,CAAE,CAC9B,CAAA,CAEaC,CAAAA,CAAN,KAAqB,CAC1B,gBAAA,CAAmB,MAEX,IAAA,CACA,SAAA,CACA,OAAA,CAA8B,EAAC,CAC/B,KAAA,CAAmB,MAAA,CAEnB,MAAA,CAAmC,IAAA,CACnC,OAAA,CAA8B,IAAA,CAC9B,QAAA,CAAqC,IAAA,CAErC,WAAA,CAAiC,KACjC,eAAA,CAA0C,IAAA,CAC1C,cAAA,CAAiB,CAAA,CACjB,aAAA,CAAgB,CAAA,CAEhB,qBAAA,CAER,WAAA,CAAYC,CAAAA,CAAmBC,CAAAA,CAAgC,CAC7D,IAAA,CAAK,IAAA,CAAOD,CAAAA,CACZ,KAAK,SAAA,CAAYC,CAAAA,CACjB,IAAA,CAAK,qBAAA,CAAwB,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,CAClE,QAAA,CAAS,gBAAA,CAAiB,kBAAA,CAAoB,IAAA,CAAK,qBAAqB,EAC1E,CAIA,QAAA,CAAS/J,CAAAA,CAAmC,CAC1C,IAAA,CAAK,gBAAA,CAAmB,IAAA,CACxB,IAAA,CAAK,OAAA,CAAUA,CAAAA,CACX,IAAA,CAAK,KAAA,GAAU,MAAA,GAEnB,IAAA,CAAK,SAAS,UAAU,CAAA,CAExB,IAAA,CAAK,eAAA,CAAkB,IAAIyI,CAAAA,CAAgB,CACzC,KAAA,CAAOzI,CAAAA,CAAQ,KAAA,EAAS,GAAA,CACxB,UAAA,CAAYA,CAAAA,CAAQ,UAAA,EAAc,EAClC,MAAA,CAAQ,IAAM,IAAA,CAAK,QAAA,EAAS,CAC5B,MAAA,CAAQ,IAAM,IAAA,CAAK,QAAA,EACrB,CAAC,CAAA,CAED,IAAA,CAAK,eAAA,CAAgB,OAAM,EAC7B,CAEA,UAAA,CAAWgK,CAAAA,CAA0C,CAGnD,GAFA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAgBA,CAAAA,CAAK,SAAA,CAE9B,IAAA,CAAK,KAAA,GAAU,UAAA,CAAY,CAC7B,IAAA,CAAK,eAAA,EAAiB,GAAA,EAAI,CAC1B,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CACpB,MACF,CAEI,IAAA,CAAK,KAAA,GAAU,SAAA,GACjB,IAAA,CAAK,aAAa,KAAA,EAAM,CACxB,IAAA,CAAK,eAAA,EAAiB,GAAA,EAAI,EAE9B,CAGA,eAAA,EAAwB,CACtB,IAAA,CAAK,eAAA,EAAiB,OAAA,EAAQ,CAC9B,IAAA,CAAK,gBAAkB,IAAA,CACvB,IAAA,CAAK,WAAA,EAAa,OAAA,EAAQ,CAC1B,IAAA,CAAK,WAAA,CAAc,IAAA,CACnB,IAAA,CAAK,WAAA,EAAY,CACjB,IAAA,CAAK,QAAA,CAAS,MAAM,EACtB,CAEA,aAAA,CAAchK,CAAAA,CAAmC,CAC/C,IAAA,CAAK,OAAA,CAAU,CAAE,GAAG,IAAA,CAAK,OAAA,CAAS,GAAGA,CAAQ,EAC/C,CAEA,SAAgB,CACd,IAAA,CAAK,eAAA,EAAiB,OAAA,EAAQ,CAC9B,IAAA,CAAK,WAAA,EAAa,OAAA,EAAQ,CAC1B,IAAA,CAAK,WAAA,CAAc,IAAA,CACnB,IAAA,CAAK,WAAA,GACL,QAAA,CAAS,mBAAA,CAAoB,kBAAA,CAAoB,IAAA,CAAK,qBAAqB,EAC7E,CAIA,MAAc,QAAA,EAA0B,CACtC,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,CAE5B,IAAMiK,CAAAA,CAAe,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAQ,QAAQ,CAAA,CAEvE,GAAI,CACF,IAAMC,CAAAA,CAAY,MAAM,IAAA,CAAK,cAAcD,CAAY,CAAA,CACvD,IAAA,CAAK,QAAA,EAAS,CAEd,IAAM/K,CAAAA,CAAQD,CAAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAS7C,GARI,IAAA,CAAK,SAASQ,CAAAA,CAAoB,IAAA,CAAK,OAAA,CAASP,CAAK,CAAA,CAGrD,IAAA,CAAK,MAAA,EACP,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,YAAA,CAAc,CAAA,EAAG+K,CAAY,CAAA,kCAAA,CAA+B,EAInF,MAAA,CAAO,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA,CAAS,CACjE,IAAA,CAAK,yBAAA,CAA0B/K,CAAK,CAAA,CACpC,MACF,CAEA,IAAA,CAAK,WAAA,CAAc,IAAIgL,CAAAA,CACpBb,CAAAA,EAAkB,IAAA,CAAK,iBAAA,CAAkBA,CAAAA,CAAOY,CAAY,CAAA,CAC7D,IAAM,IAAA,CAAK,mBAAA,CAAoBA,CAAY,CAC7C,CAAA,CACA,MAAM,KAAK,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,MAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAS,EAAE,CAAA,CAElE,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,CACvB,KAAK,cAAA,CAAiB,IAAA,CAAK,GAAA,EAAI,CAC/B,IAAA,CAAK,aAAA,CAAgB,CAAA,CACrB,IAAA,CAAK,WAAA,CAAY,KAAA,EAAM,CAEvB,IAAA,CAAK,SAAA,CAAU,uDAAkD,EACnE,CAAA,MAASE,CAAAA,CAAK,CACZ,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQA,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAC,CAAA,CAC1E,IAAA,CAAK,WAAA,EAAY,CACjB,IAAA,CAAK,QAAA,CAAS,MAAM,EACtB,CACF,CAEA,MAAc,QAAA,EAA0B,CAAA,CAClC,IAAA,CAAK,QAAU,SAAA,EAAa,IAAA,CAAK,KAAA,GAAU,aAAA,IAC7C,IAAA,CAAK,WAAA,EAAa,KAAA,EAAM,CACxB,IAAA,CAAK,qBAAA,EAAsB,CAG3B,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAA,CAGvB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,CACvB,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAiB,MAAM,CAAA,CAE3D,IAAA,CAAK,aAAa,OAAA,EAAQ,CAC1B,IAAA,CAAK,WAAA,CAAc,IAAA,CACnB,IAAA,CAAK,WAAA,EAAY,CACjB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CACpB,IAAA,CAAK,SAAA,CAAU,aACjB,CAIQ,QAAA,EAAiB,CACvB,IAAMC,CAAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAQ,IAAA,CAC5BC,CAAAA,CAAaT,EAAAA,CAASQ,CAAI,CAAA,CAGhC,KAAK,OAAA,CAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC3C,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,iBAAA,CAAmB,EAAE,CAAA,CAC/C,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAA,CAAO,CAChC,QAAA,CAAUA,CAAAA,GAAS,MAAA,CAAS,OAAA,CAAU,UAAA,CACtC,KAAA,CAAOA,CAAAA,GAAS,MAAA,CAAS,GAAA,CAAM,MAAA,CAC/B,KAAA,CAAOA,CAAAA,GAAS,OAAS,MAAA,CAAS,CAAA,EAAGC,CAAAA,CAAW,KAAK,CAAA,EAAA,CAAA,CACrD,MAAA,CAAQD,CAAAA,GAAS,MAAA,CAAS,MAAA,CAAS,CAAA,EAAGC,CAAAA,CAAW,MAAM,CAAA,EAAA,CAAA,CACvD,OAAA,CAAS,OACT,aAAA,CAAe,QAAA,CACf,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,MAAA,CAAQD,CAAAA,GAAS,MAAA,CAAS,MAAA,CAAS,MAAA,CACnC,OAAA,CAAS,GAAA,CACT,UAAA,CAAY,2CACZ,SAAA,CAAW,aAAA,CACX,QAAA,CAAU,QAAA,CACV,YAAA,CAAcA,CAAAA,GAAS,MAAA,CAAS,GAAA,CAAM,MACxC,CAAC,CAAA,CAGD,IAAA,CAAK,QAAA,CAAW,QAAA,CAAS,cAAc,GAAG,CAAA,CAC1C,IAAA,CAAK,QAAA,CAAS,IAAA,CAAO,GAAA,CACrB,IAAA,CAAK,QAAA,CAAS,WAAA,CAAc,6BAAA,CAC5B,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,cAAA,CAAgB,EAAE,CAAA,CAC7C,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAO,CACjC,QAAA,CAAU,UAAA,CACV,GAAA,CAAK,SAAA,CACL,IAAA,CAAM,SACR,CAAC,EACD,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,OAAA,CAAS,IAAM,CAC5C,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAA,CAAU,KAAA,CAAO,CAAE,GAAA,CAAK,KAAA,CAAO,KAAM,KAAM,CAAC,EACjE,CAAC,CAAA,CACD,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,MAAA,CAAQ,IAAM,CAC3C,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAU,KAAA,CAAO,CAAE,GAAA,CAAK,SAAA,CAAW,IAAA,CAAM,SAAU,CAAC,EACzE,CAAC,CAAA,CACD,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,OAAA,CAAUhG,GAAM,CAC7CA,CAAAA,CAAE,cAAA,EAAe,CACjB,IAAA,CAAK,UAAA,CAAW,CAAE,SAAA,CAAW,MAAO,CAAC,EACvC,CAAC,CAAA,CAGD,IAAA,CAAK,OAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC7C,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,MAAA,CAAQ,aAAa,CAAA,CAC9C,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,UAAA,CAAY,GAAG,CAAA,CACxC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAO,CAC/B,KAAA,CAAO,MAAA,CACP,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,OACX,CAAC,EAED,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA,CACtC,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA,CACpC,IAAA,CAAK,IAAA,CAAK,YAAY,IAAA,CAAK,OAAO,CAAA,CAGlC,qBAAA,CAAsB,IAAM,CAC1B,qBAAA,CAAsB,IAAM,CACtB,IAAA,CAAK,OAAA,GACP,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,QAAU,GAAA,CAC7B,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAY,UAAA,EAEnC,CAAC,EACH,CAAC,EACH,CAEQ,WAAA,EAAoB,CAC1B,IAAA,CAAK,SAAS,MAAA,EAAO,CACrB,IAAA,CAAK,OAAA,CAAU,IAAA,CACf,IAAA,CAAK,MAAA,CAAS,IAAA,CACd,IAAA,CAAK,QAAA,CAAW,KAClB,CAEA,MAAc,WAAA,CAAYkG,EAAyC,CAC7D,CAAC,IAAA,CAAK,OAAA,EAAWA,CAAAA,GAAc,MAAA,GAE/BA,CAAAA,GAAc,MAAA,CAChB,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,GAAA,CACpBA,CAAAA,GAAc,UACvB,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAY,mBAAA,CAC/B,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAU,GAAA,CAAA,CAG/B,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,GACtB,CAIQ,SAAA,CAAUC,CAAAA,CAAuB,CACvC,IAAMC,CAAAA,CAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC1CA,CAAAA,CAAM,WAAA,CAAcD,CAAAA,CACpB,MAAA,CAAO,OAAOC,CAAAA,CAAM,KAAA,CAAO,CACzB,QAAA,CAAU,UAAA,CACV,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,KAAA,CACN,SAAA,CAAW,kBAAA,CACX,UAAA,CAAY,iBAAA,CACZ,KAAA,CAAO,OACP,OAAA,CAAS,UAAA,CACT,YAAA,CAAc,KAAA,CACd,QAAA,CAAU,MAAA,CACV,UAAA,CAAY,QAAA,CACZ,OAAA,CAAS,GAAA,CACT,UAAA,CAAY,oBAAA,CACZ,aAAA,CAAe,MACjB,CAAC,CAAA,CAED,IAAA,CAAK,OAAA,EAAS,WAAA,CAAYA,CAAK,CAAA,CAC/B,qBAAA,CAAsB,IAAM,CAAEA,CAAAA,CAAM,KAAA,CAAM,OAAA,CAAU,IAAI,CAAC,EAEzD,UAAA,CAAW,IAAM,CACfA,CAAAA,CAAM,KAAA,CAAM,OAAA,CAAU,GAAA,CACtB,UAAA,CAAW,IAAMA,CAAAA,CAAM,MAAA,EAAO,CAAG,GAAG,EACtC,EAAG,GAAI,EACT,CAEQ,qBAAA,EAA8B,CACpC,IAAMC,CAAAA,CAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CACvCA,CAAAA,CAAG,WAAA,CAAc,gCAAA,CACjB,OAAO,MAAA,CAAOA,CAAAA,CAAG,KAAA,CAAO,CACtB,QAAA,CAAU,UAAA,CACV,KAAA,CAAO,GAAA,CACP,OAAA,CAAS,MAAA,CACT,UAAA,CAAY,QAAA,CACZ,cAAA,CAAgB,QAAA,CAChB,WAAY,iBAAA,CACZ,KAAA,CAAO,MAAA,CACP,QAAA,CAAU,MAAA,CACV,UAAA,CAAY,MAAA,CACZ,UAAA,CAAY,uBAAA,CACZ,OAAA,CAAS,GAAA,CACT,UAAA,CAAY,oBACd,CAAC,EACD,IAAA,CAAK,OAAA,EAAS,WAAA,CAAYA,CAAE,CAAA,CAC5B,qBAAA,CAAsB,IAAM,CAAEA,CAAAA,CAAG,KAAA,CAAM,OAAA,CAAU,IAAI,CAAC,EACxD,CAEQ,yBAAA,CAA0BvL,CAAAA,CAA8C,CAC9E,GAAI,CAAC,IAAA,CAAK,MAAA,CAAQ,OAClB,IAAM8C,CAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAI,EACjCE,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAChBC,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CACtBH,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,UAAA,CACtB8C,CAAAA,CAAI,QAAA,CAAS,EAAG,CAAA,CAAGE,CAAAA,CAAGC,CAAC,CAAA,CACvBH,CAAAA,CAAI,SAAA,CAAY9C,CAAAA,CAAM,OAAA,CACtB8C,CAAAA,CAAI,IAAA,CAAO,gBAAA,CACXA,CAAAA,CAAI,SAAA,CAAY,QAAA,CAChBA,EAAI,QAAA,CAAS,eAAA,CAAiBE,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAC,CAAA,CAC1C,IAAA,CAAK,QAAA,CAAS,SAAS,EACzB,CAIQ,mBAAA,CAAoB8G,CAAAA,CAAyC,CACnE,IAAMyB,CAAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAI,IAAA,CAAK,cAAA,CAC7BC,CAAAA,CAAexB,CAAAA,CAAgBF,CAAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CACjE,KAAK,SAAA,CAAU,UAAA,CAAW,CACxB,IAAA,CAAAA,CAAAA,CACA,UAAA,CAAY,IAAA,CAAK,aAAA,CACjB,QAAA,CAAAyB,CAAAA,CACA,WAAA,CAAa,IAAA,CAAK,aAAA,CAAgBC,CACpC,CAAC,EACH,CAEQ,iBAAA,CAAkBtB,CAAAA,CAAeJ,CAAAA,CAAyC,CAChF,IAAA,CAAK,aAAA,CAAgBI,CAAAA,CACrB,IAAMsB,CAAAA,CAAexB,CAAAA,CAAgBF,CAAAA,CAAM,IAAA,CAAK,QAAQ,SAAS,CAAA,CAC7DM,CAAAA,CAAc,KAAA,CAEd,IAAA,CAAK,OAAA,CAAQ,UAAA,GAAe,KAAA,EAASF,CAAAA,CAAQsB,CAAAA,GAC/CpB,CAAAA,CAAcH,CAAAA,CAAUH,CAAAA,CAAMI,CAAAA,CAAO,KAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,CAG7D,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAE,IAAA,CAAAJ,CAAAA,CAAM,OAAA,CAASI,CAAAA,CAAO,YAAA,CAAc,IAAA,CAAK,GAAA,CAAIA,EAAOsB,CAAY,CAAA,CAAG,WAAA,CAAApB,CAAY,CAAC,CAAA,CAErGA,CAAAA,EAAa,IAAA,CAAK,kBAAA,GACxB,CAEQ,kBAAA,EAA2B,CACjC,IAAMqB,EAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC1CA,CAAAA,CAAM,WAAA,CAAc,uBAAA,CACpB,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAM,KAAA,CAAO,CACzB,QAAA,CAAU,UAAA,CACV,IAAK,MAAA,CACL,IAAA,CAAM,KAAA,CACN,SAAA,CAAW,6BAAA,CACX,UAAA,CAAY,MAAA,CACZ,KAAA,CAAO,MAAA,CACP,OAAA,CAAS,UAAA,CACT,YAAA,CAAc,KAAA,CACd,QAAA,CAAU,OACV,UAAA,CAAY,MAAA,CACZ,UAAA,CAAY,uBAAA,CACZ,OAAA,CAAS,GAAA,CACT,UAAA,CAAY,0CAAA,CACZ,aAAA,CAAe,MACjB,CAAC,CAAA,CACD,IAAA,CAAK,OAAA,EAAS,YAAYA,CAAK,CAAA,CAC/B,qBAAA,CAAsB,IAAM,CAC1BA,CAAAA,CAAM,KAAA,CAAM,OAAA,CAAU,GAAA,CACtBA,CAAAA,CAAM,KAAA,CAAM,SAAA,CAAY,4BAC1B,CAAC,EACD,UAAA,CAAW,IAAM,CACfA,CAAAA,CAAM,KAAA,CAAM,OAAA,CAAU,GAAA,CACtB,UAAA,CAAW,IAAMA,CAAAA,CAAM,MAAA,EAAO,CAAG,GAAG,EACtC,EAAG,IAAI,EACT,CAIA,MAAc,aAAA,CAAcC,CAAAA,CAAwH,CAClJ,OAAQA,CAAAA,EACN,KAAK,OAAA,CACH,OAAA,CAAQ,2CAAwC,SAAA,CAClD,KAAK,eAAA,CACH,OAAA,CAAQ,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,EAAA,CAAA,CAAA,CAAA,CAAA,EAA0C,gBAAA,CAC1D,KAAK,QAAA,CACH,OAAA,CAAQ,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAmC,UAAA,CACnD,KAAK,OACH,OAAA,CAAQ,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAiC,QAAA,CACjD,KAAK,aAAA,CACH,OAAA,CAAQ,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAwC,cAAA,CACxD,KAAK,WAAA,CACH,OAAA,CAAQ,6CAA4C,aAAA,CACtD,KAAK,cAAA,CACH,OAAA,CAAQ,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAyC,eAAA,CACzD,KAAK,cAAA,CACH,OAAA,CAAQ,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,KAAA,EAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAyC,cAAA,CACzD,QACE,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiBA,CAAI,CAAA,CAAE,CAC3C,CACF,CAIQ,eAAA,CAAgBA,CAAAA,CAA6C,CACnE,GAAIA,CAAAA,GAAS,QAAA,CAAU,OAAOA,CAAAA,CAC9B,IAAMC,CAAAA,CAAuC,CAC3C,OAAA,CAAS,eAAA,CAAiB,QAAA,CAAU,MAAA,CACpC,aAAA,CAAe,WAAA,CAAa,cAAA,CAAgB,cAC9C,CAAA,CACA,OAAOA,EAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,CAAIA,CAAAA,CAAM,MAAM,CAAC,CACvD,CAEQ,QAAA,CAASC,CAAAA,CAAwB,CACvC,IAAA,CAAK,MAAQA,EACf,CAEQ,sBAAA,EAA+B,CAChC,IAAA,CAAK,WAAA,GACN,QAAA,CAAS,eAAA,GAAoB,QAAA,CAC/B,IAAA,CAAK,WAAA,CAAY,KAAA,EAAM,CACd,IAAA,CAAK,QAAU,SAAA,EACxB,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAE5B,CAEQ,KAAA,CAAMC,CAAAA,CAA2B,CACvC,OAAO,IAAI,OAAA,CAAQC,CAAAA,EAAW,UAAA,CAAWA,EAASD,CAAE,CAAC,CACvD,CACF,EGhbO,IAAME,CAAAA,CAAN,cAAiC,WAAY,CAClD,OAAO,kBAAA,CAAqB,CAC1B,MAAA,CACA,SACA,MAAA,CACA,OAAA,CACA,aAAA,CACA,gBAAA,CACA,aAAA,CACA,WACF,CAAA,CAEQ,UAAA,CAAoC,IAAA,CACpC,MAAA,CAAsB,EAAC,CAI/B,iBAAA,EAA0B,CACxB,KAAK,YAAA,CAAa,MAAA,CAAQ,QAAQ,CAAA,CAClC,IAAA,CAAK,YAAA,CAAa,YAAA,CAAc,cAAc,CAAA,CAE9C,IAAA,CAAK,UAAA,CAAa,IAAIrB,CAAAA,CAAe,IAAA,CAAM,CACzC,OAAA,CAAUR,CAAAA,EAAU,IAAA,CAAK,aAAA,CAAc,IAAI,WAAA,CAAY,UAAA,CAAY,CAAE,MAAA,CAAQA,CAAAA,CAAO,OAAA,CAAS,IAAK,CAAC,CAAC,EACpG,UAAA,CAAa8B,CAAAA,EAAW,IAAA,CAAK,aAAA,CAAc,IAAI,WAAA,CAAY,aAAA,CAAe,CAAE,MAAA,CAAQA,CAAAA,CAAQ,OAAA,CAAS,IAAK,CAAC,CAAC,EAC5G,UAAA,CAAY,IAAM,IAAA,CAAK,aAAA,CAAc,IAAI,WAAA,CAAY,aAAA,CAAe,CAAE,OAAA,CAAS,IAAK,CAAC,CAAC,CAAA,CACtF,OAAA,CAAUhB,GAAQ,CAChB,IAAA,CAAK,UAAA,EAAY,eAAA,EAAgB,CACjC,IAAA,CAAK,aAAA,CAAc,IAAI,WAAA,CAAY,UAAA,CAAY,CAAE,MAAA,CAAQA,CAAAA,CAAK,OAAA,CAAS,IAAK,CAAC,CAAC,EAChF,CACF,CAAC,CAAA,CAEG,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,GAAM,MAAA,EAClC,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,KAAK,YAAA,EAAc,EAEhD,CAEA,oBAAA,EAA6B,CAC3B,IAAA,CAAK,UAAA,EAAY,OAAA,EAAQ,CACzB,IAAA,CAAK,UAAA,CAAa,KACpB,CAEA,yBAAyBU,CAAAA,CAAcO,CAAAA,CAAyBC,CAAAA,CAA+B,CACzFD,CAAAA,GAAaC,CAAAA,EAAY,CAAC,IAAA,CAAK,UAAA,GAE/BR,CAAAA,GAAS,QAAA,CACPQ,CAAAA,GAAa,MAAA,CACf,IAAA,CAAK,WAAW,QAAA,CAAS,IAAA,CAAK,YAAA,EAAc,CAAA,CAE5C,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,CAAE,SAAA,CAAW,IAAA,CAAK,gBAAA,EAAmB,CAAC,EAInE,IAAA,CAAK,UAAA,CAAW,aAAA,CAAc,IAAA,CAAK,YAAA,EAAc,CAAA,EAErD,CAIA,IAAI,KAAA,CAAM7L,CAAAA,CAAoB,CAC5B,IAAA,CAAK,MAAA,CAASA,EACd,IAAA,CAAK,UAAA,EAAY,aAAA,CAAc,IAAA,CAAK,YAAA,EAAc,EACpD,CAEA,IAAI,KAAA,EAAqB,CACvB,OAAO,IAAA,CAAK,MACd,CAKA,KAAA,EAAc,CACZ,IAAA,CAAK,YAAA,CAAa,QAAA,CAAU,MAAM,EACpC,CAGA,IAAA,EAAa,CACX,IAAA,CAAK,eAAA,CAAgB,QAAQ,EAC/B,CAGA,QAAA,CAASN,CAAAA,CAA0B,CACjC,IAAA,CAAK,KAAA,CAAQA,EACf,CAIQ,YAAA,EAAmC,CACzC,IAAM+J,CAAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,GAAK,QAAA,CACrCmB,CAAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,EAAK,IAAA,CACrCkB,CAAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA,EAAK,KAAA,CAAO,EAAE,CAAA,CACxDC,CAAAA,CAAa,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,EAAK,GAAA,CAAK,EAAE,CAAA,CACjEC,CAAAA,CAAiB,IAAA,CAAK,YAAA,CAAa,gBAAgB,GAAK,MAAA,CACxDC,CAAAA,CAAa,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,GAAM,OAAA,CAClDvC,CAAAA,CAAY,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA,EAAK,MAAA,CAEpD,OAAO,CACL,IAAA,CAAAD,CAAAA,CACA,IAAA,CAAAmB,CAAAA,CACA,KAAA,CAAAkB,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,SAAA,CAAAvC,CAAAA,CACA,MAAO,IAAA,CAAK,MACd,CACF,CAEQ,gBAAA,EAAkC,CACxC,OAAQ,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA,EAAK,MACjD,CACF,ECxGAvJ,IAGAI,CAAAA,EAAAA,CAMI,OAAO,cAAA,CAAmB,GAAA,EAAe,CAAC,cAAA,CAAe,GAAA,CAAI,cAAc,CAAA,EAC7E,cAAA,CAAe,MAAA,CAAO,cAAA,CAAgBmL,CAAkB,CAAA","file":"index.js","sourcesContent":["/**\r\n * Theme resolution — 3-level priority:\r\n * 1. Explicit theme prop (highest)\r\n * 2. CSS variables on :root (--lg-primary, etc.)\r\n * 3. prefers-color-scheme detection (lowest)\r\n */\r\n\r\nimport type { ThemeObject, ResolvedTheme } from './types.js'\r\n\r\nconst DARK_DEFAULTS: ResolvedTheme = {\r\n primary: '#6366F1',\r\n background: '#0F0F0F',\r\n surface: '#1A1A2E',\r\n text: '#F8F8F8',\r\n accent: '#E94560',\r\n}\r\n\r\nconst LIGHT_DEFAULTS: ResolvedTheme = {\r\n primary: '#4F46E5',\r\n background: '#FFFFFF',\r\n surface: '#F3F4F6',\r\n text: '#111827',\r\n accent: '#E94560',\r\n}\r\n\r\nconst CSS_VAR_MAP: Record<keyof ResolvedTheme, string> = {\r\n primary: '--lg-primary',\r\n background: '--lg-background',\r\n surface: '--lg-surface',\r\n text: '--lg-text',\r\n accent: '--lg-accent',\r\n}\r\n\r\n/**\r\n * Read a CSS variable from :root, returns null if not set.\r\n */\r\nfunction readCSSVar(varName: string): string | null {\r\n if (typeof window === 'undefined') return null\r\n const value = getComputedStyle(document.documentElement)\r\n .getPropertyValue(varName)\r\n .trim()\r\n return value || null\r\n}\r\n\r\n/**\r\n * Detect system color scheme preference.\r\n */\r\nfunction getSystemDefaults(): ResolvedTheme {\r\n if (typeof window === 'undefined') return DARK_DEFAULTS\r\n try {\r\n const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches\r\n return prefersDark ? DARK_DEFAULTS : LIGHT_DEFAULTS\r\n } catch {\r\n return DARK_DEFAULTS\r\n }\r\n}\r\n\r\n/**\r\n * Resolve the final theme from all sources.\r\n * Priority: explicit prop > CSS variables > system defaults.\r\n */\r\nexport function resolveTheme(theme?: ThemeObject): ResolvedTheme {\r\n const systemDefaults = getSystemDefaults()\r\n\r\n const resolved: ResolvedTheme = { ...systemDefaults }\r\n\r\n // Level 2: CSS variables\r\n for (const [key, cssVar] of Object.entries(CSS_VAR_MAP) as [keyof ResolvedTheme, string][]) {\r\n const cssValue = readCSSVar(cssVar)\r\n if (cssValue) {\r\n resolved[key] = cssValue\r\n }\r\n }\r\n\r\n // Level 1: Explicit theme prop\r\n if (theme) {\r\n for (const [key, value] of Object.entries(theme) as [keyof ThemeObject, string | undefined][]) {\r\n if (value) {\r\n resolved[key] = value\r\n }\r\n }\r\n }\r\n\r\n return resolved\r\n}\r\n\r\n/**\r\n * Apply resolved theme as CSS variables to a container element.\r\n * This allows games to reference CSS variables for dynamic theming.\r\n */\r\nexport function applyThemeToElement(element: HTMLElement, theme: ResolvedTheme): void {\r\n for (const [key, cssVar] of Object.entries(CSS_VAR_MAP) as [keyof ResolvedTheme, string][]) {\r\n element.style.setProperty(cssVar, theme[key])\r\n }\r\n}\r\n","/**\n * Virtual D-pad — Reusable touch controller overlay.\n *\n * Renders 4 directional arrows (+ optional center/fire button) as an\n * overlay positioned at the bottom-center of a parent element.\n * Only renders when touch is available ('ontouchstart' in window).\n *\n * Each button meets the 44×44px minimum touch target requirement.\n * Semi-transparent, themed with the provided primary color.\n */\n\nexport type DpadDirection = 'up' | 'down' | 'left' | 'right'\n\nexport interface DpadOptions {\n /** Parent element to attach the overlay to. Must have position: relative/absolute/fixed. */\n parent: HTMLElement\n /** Primary theme color for button backgrounds. */\n primaryColor: string\n /** Text/icon color. */\n textColor: string\n /** Called when a direction button is pressed. */\n onDirection: (dir: DpadDirection) => void\n /** If true, render a center \"fire\" button. */\n showFire?: boolean\n /** Called when the fire button is pressed. */\n onFire?: () => void\n}\n\nconst BTN_SIZE = 44\nconst GAP = 2\n\nconst ARROWS: Record<DpadDirection, string> = {\n up: '\\u25B2',\n down: '\\u25BC',\n left: '\\u25C0',\n right: '\\u25B6',\n}\n\nexport class Dpad {\n private overlay: HTMLDivElement | null = null\n private boundClick: (e: MouseEvent) => void\n private boundTouch: (e: TouchEvent) => void\n\n constructor(private options: DpadOptions) {\n this.boundClick = this.handleClick.bind(this)\n this.boundTouch = this.handleTouch.bind(this)\n }\n\n /** Create and mount the D-pad. No-op if touch is unavailable. */\n mount(): void {\n if (!('ontouchstart' in window)) return\n if (this.overlay) return\n\n const { parent, primaryColor, textColor, showFire } = this.options\n\n // Ensure parent is positioned\n const pStyle = getComputedStyle(parent)\n if (pStyle.position === 'static') parent.style.position = 'relative'\n\n const overlay = document.createElement('div')\n overlay.setAttribute('data-lg-dpad', '')\n overlay.style.cssText = [\n 'position:absolute',\n 'bottom:12px',\n 'left:50%',\n 'transform:translateX(-50%)',\n `display:grid`,\n `grid-template-columns:${BTN_SIZE}px ${BTN_SIZE}px ${BTN_SIZE}px`,\n `grid-template-rows:${BTN_SIZE}px ${BTN_SIZE}px ${BTN_SIZE}px`,\n `gap:${GAP}px`,\n 'pointer-events:none',\n 'z-index:10',\n ].join(';')\n\n // Grid layout: [_, up, _], [left, center, right], [_, down, _]\n const cells: (DpadDirection | 'fire' | null)[] = [\n null, 'up', null,\n 'left', showFire ? 'fire' : null, 'right',\n null, 'down', null,\n ]\n\n for (const cell of cells) {\n const btn = document.createElement('button')\n if (cell && cell !== 'fire') {\n btn.textContent = ARROWS[cell]\n btn.setAttribute('aria-label', cell)\n btn.dataset.dir = cell\n btn.style.cssText = this.buttonStyle(primaryColor, textColor)\n } else if (cell === 'fire') {\n btn.textContent = '\\u25CF'\n btn.setAttribute('aria-label', 'fire')\n btn.dataset.action = 'fire'\n btn.style.cssText = this.buttonStyle(primaryColor, textColor)\n } else {\n btn.style.cssText = 'visibility:hidden;'\n }\n overlay.appendChild(btn)\n }\n\n overlay.addEventListener('click', this.boundClick)\n overlay.addEventListener('touchstart', this.boundTouch, { passive: true })\n\n parent.appendChild(overlay)\n this.overlay = overlay\n }\n\n /** Remove the D-pad from the DOM and clean up listeners. */\n destroy(): void {\n if (!this.overlay) return\n this.overlay.removeEventListener('click', this.boundClick)\n this.overlay.removeEventListener('touchstart', this.boundTouch)\n this.overlay.remove()\n this.overlay = null\n }\n\n private buttonStyle(bg: string, text: string): string {\n return [\n 'pointer-events:auto',\n `width:${BTN_SIZE}px`,\n `height:${BTN_SIZE}px`,\n 'border:none',\n 'border-radius:8px',\n `background:${bg}55`,\n `color:${text}`,\n 'font-size:16px',\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'touch-action:manipulation',\n 'cursor:pointer',\n '-webkit-tap-highlight-color:transparent',\n ].join(';')\n }\n\n private handleClick(e: MouseEvent): void {\n const target = (e.target as HTMLElement).closest('[data-dir],[data-action]') as HTMLElement | null\n if (!target) return\n if (target.dataset.dir) {\n this.options.onDirection(target.dataset.dir as DpadDirection)\n } else if (target.dataset.action === 'fire') {\n this.options.onFire?.()\n }\n }\n\n private handleTouch(e: TouchEvent): void {\n const target = (e.target as HTMLElement).closest('[data-dir],[data-action]') as HTMLElement | null\n if (!target) return\n if (target.dataset.dir) {\n this.options.onDirection(target.dataset.dir as DpadDirection)\n } else if (target.dataset.action === 'fire') {\n this.options.onFire?.()\n }\n }\n}\n","/**\r\n * Snake — Classic snake game with wrapping walls.\r\n * \r\n * Controls:\r\n * - Keyboard: Arrow keys\r\n * - Touch: Swipe gestures\r\n * - Mobile: Virtual D-pad (rendered by the host component)\r\n * \r\n * Bundle target: ~4 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\nimport { Dpad } from '../../dpad.js'\r\n\r\ntype Direction = 'up' | 'down' | 'left' | 'right'\r\ntype Point = { x: number; y: number }\r\n\r\nconst GRID_SIZE = 20 // cells per row/column\r\nconst BASE_TICK_MS = 150 // starting tick speed\r\nconst SPEED_INCREASE = 5 // ms faster per 5 points\r\nconst SWIPE_THRESHOLD = 30 // minimum swipe distance (px)\r\n\r\nexport class SnakeGame implements GamePlugin {\r\n readonly name = 'snake'\r\n readonly bundleSize = 4_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n\r\n private snake: Point[] = []\r\n private food: Point = { x: 0, y: 0 }\r\n private direction: Direction = 'right'\r\n private nextDirection: Direction = 'right'\r\n private score = 0\r\n private tickMs = BASE_TICK_MS\r\n private lastTick = 0\r\n private animFrameId: number | null = null\r\n private running = false\r\n private cellSize = 0\r\n\r\n private boundKeyDown: (e: KeyboardEvent) => void\r\n private boundTouchStart: (e: TouchEvent) => void\r\n private boundTouchEnd: (e: TouchEvent) => void\r\n private touchStartX = 0\r\n private touchStartY = 0\r\n private isTouchDevice = false\r\n private dpad: Dpad | null = null\r\n\r\n private onScoreCallback?: (score: number) => void\r\n private onGameOverCallback?: () => void\r\n\r\n constructor(onScore?: (score: number) => void, onGameOver?: () => void) {\r\n this.onScoreCallback = onScore\r\n this.onGameOverCallback = onGameOver\r\n this.boundKeyDown = this.handleKeyDown.bind(this)\r\n this.boundTouchStart = this.handleTouchStart.bind(this)\r\n this.boundTouchEnd = this.handleTouchEnd.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n\r\n canvas.setAttribute('aria-label', 'Snake game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n\r\n // Scale for device pixel ratio\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n\r\n this.cellSize = Math.floor(rect.width / GRID_SIZE)\r\n this.isTouchDevice = 'ontouchstart' in window\r\n this.reset()\r\n }\r\n\r\n private reset(): void {\r\n // Start in the middle going right\r\n const mid = Math.floor(GRID_SIZE / 2)\r\n this.snake = [\r\n { x: mid, y: mid },\r\n { x: mid - 1, y: mid },\r\n { x: mid - 2, y: mid },\r\n ]\r\n this.direction = 'right'\r\n this.nextDirection = 'right'\r\n this.score = 0\r\n this.tickMs = BASE_TICK_MS\r\n this.placeFood()\r\n }\r\n\r\n private placeFood(): void {\r\n const occupied = new Set(this.snake.map(p => `${p.x},${p.y}`))\r\n let pos: Point\r\n do {\r\n pos = {\r\n x: Math.floor(Math.random() * GRID_SIZE),\r\n y: Math.floor(Math.random() * GRID_SIZE),\r\n }\r\n } while (occupied.has(`${pos.x},${pos.y}`))\r\n this.food = pos\r\n }\r\n\r\n start(): void {\r\n this.running = true\r\n this.lastTick = performance.now()\r\n this.loop(performance.now())\r\n this.attachEventListeners()\r\n if (this.isTouchDevice) this.mountDpad()\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) {\r\n cancelAnimationFrame(this.animFrameId)\r\n this.animFrameId = null\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true\r\n this.lastTick = performance.now()\r\n this.loop(performance.now())\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.removeEventListeners()\r\n this.dpad?.destroy()\r\n this.dpad = null\r\n }\r\n\r\n getScore(): number {\r\n return this.score\r\n }\r\n\r\n // ─── Game Loop ──────────────────────────────────────────────────────────────\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n\r\n if (now - this.lastTick >= this.tickMs) {\r\n this.lastTick = now\r\n this.tick()\r\n }\r\n\r\n this.render()\r\n }\r\n\r\n private tick(): void {\r\n this.direction = this.nextDirection\r\n\r\n const head = this.snake[0]!\r\n const next: Point = {\r\n x: (head.x + (this.direction === 'right' ? 1 : this.direction === 'left' ? -1 : 0) + GRID_SIZE) % GRID_SIZE,\r\n y: (head.y + (this.direction === 'down' ? 1 : this.direction === 'up' ? -1 : 0) + GRID_SIZE) % GRID_SIZE,\r\n }\r\n\r\n // Collision with self\r\n if (this.snake.some(p => p.x === next.x && p.y === next.y)) {\r\n this.onGameOverCallback?.()\r\n this.reset()\r\n return\r\n }\r\n\r\n this.snake.unshift(next)\r\n\r\n if (next.x === this.food.x && next.y === this.food.y) {\r\n this.score += 10\r\n this.onScoreCallback?.(this.score)\r\n\r\n // Speed up every 5 points\r\n if (this.score % 50 === 0) {\r\n this.tickMs = Math.max(60, this.tickMs - SPEED_INCREASE)\r\n }\r\n\r\n this.placeFood()\r\n } else {\r\n this.snake.pop()\r\n }\r\n }\r\n\r\n // ─── Rendering ──────────────────────────────────────────────────────────────\r\n\r\n private render(): void {\r\n const { ctx, cellSize, theme } = this\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width\r\n const H = rect.height\r\n\r\n // Background\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n\r\n // Grid (subtle)\r\n ctx.strokeStyle = theme.surface\r\n ctx.lineWidth = 0.5\r\n ctx.globalAlpha = 0.3\r\n for (let x = 0; x <= W; x += cellSize) {\r\n ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, H); ctx.stroke()\r\n }\r\n for (let y = 0; y <= H; y += cellSize) {\r\n ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(W, y); ctx.stroke()\r\n }\r\n ctx.globalAlpha = 1\r\n\r\n // Food\r\n const fx = this.food.x * cellSize + cellSize / 2\r\n const fy = this.food.y * cellSize + cellSize / 2\r\n ctx.fillStyle = theme.accent\r\n ctx.beginPath()\r\n ctx.arc(fx, fy, cellSize * 0.4, 0, Math.PI * 2)\r\n ctx.fill()\r\n\r\n // Snake\r\n this.snake.forEach((p, i) => {\r\n const x = p.x * cellSize\r\n const y = p.y * cellSize\r\n const padding = 1\r\n\r\n if (i === 0) {\r\n // Head\r\n ctx.fillStyle = theme.primary\r\n } else {\r\n // Body — fade toward tail\r\n const alpha = 1 - (i / this.snake.length) * 0.4\r\n ctx.globalAlpha = alpha\r\n ctx.fillStyle = theme.primary\r\n }\r\n\r\n const r = 3\r\n const px = x + padding\r\n const py = y + padding\r\n const pw = cellSize - padding * 2\r\n const ph = cellSize - padding * 2\r\n\r\n ctx.beginPath()\r\n ctx.roundRect(px, py, pw, ph, r)\r\n ctx.fill()\r\n ctx.globalAlpha = 1\r\n })\r\n\r\n // Score\r\n ctx.fillStyle = theme.text\r\n ctx.font = `bold ${Math.round(cellSize * 0.7)}px monospace`\r\n ctx.textAlign = 'right'\r\n ctx.fillText(`${this.score}`, W - 8, cellSize)\r\n }\r\n\r\n // ─── Controls ───────────────────────────────────────────────────────────────\r\n\r\n private attachEventListeners(): void {\r\n document.addEventListener('keydown', this.boundKeyDown)\r\n this.canvas.addEventListener('touchstart', this.boundTouchStart, { passive: true })\r\n this.canvas.addEventListener('touchend', this.boundTouchEnd, { passive: true })\r\n }\r\n\r\n private removeEventListeners(): void {\r\n document.removeEventListener('keydown', this.boundKeyDown)\r\n this.canvas.removeEventListener('touchstart', this.boundTouchStart)\r\n this.canvas.removeEventListener('touchend', this.boundTouchEnd)\r\n }\r\n\r\n private handleKeyDown(e: KeyboardEvent): void {\r\n const map: Record<string, Direction> = {\r\n ArrowUp: 'up',\r\n ArrowDown: 'down',\r\n ArrowLeft: 'left',\r\n ArrowRight: 'right',\r\n }\r\n const dir = map[e.key]\r\n if (!dir) return\r\n\r\n // Prevent reverse direction\r\n const opposites: Record<Direction, Direction> = {\r\n up: 'down', down: 'up', left: 'right', right: 'left',\r\n }\r\n if (opposites[dir] !== this.direction) {\r\n this.nextDirection = dir\r\n e.preventDefault()\r\n }\r\n }\r\n\r\n private handleTouchStart(e: TouchEvent): void {\r\n const touch = e.touches[0]\r\n if (!touch) return\r\n this.touchStartX = touch.clientX\r\n this.touchStartY = touch.clientY\r\n }\r\n\r\n private handleTouchEnd(e: TouchEvent): void {\r\n const touch = e.changedTouches[0]\r\n if (!touch) return\r\n\r\n const dx = touch.clientX - this.touchStartX\r\n const dy = touch.clientY - this.touchStartY\r\n const absDx = Math.abs(dx)\r\n const absDy = Math.abs(dy)\r\n\r\n if (Math.max(absDx, absDy) < SWIPE_THRESHOLD) return // min 44px touch target\r\n\r\n let dir: Direction\r\n if (absDx > absDy) {\r\n dir = dx > 0 ? 'right' : 'left'\r\n } else {\r\n dir = dy > 0 ? 'down' : 'up'\r\n }\r\n\r\n const opposites: Record<Direction, Direction> = {\r\n up: 'down', down: 'up', left: 'right', right: 'left',\r\n }\r\n if (opposites[dir] !== this.direction) {\r\n this.nextDirection = dir\r\n }\r\n }\r\n\r\n // ─── Virtual D-pad ─────────────────────────────────────────────────────────\r\n\r\n private mountDpad(): void {\r\n const parent = this.canvas.parentElement\r\n if (!parent) return\r\n\r\n this.dpad = new Dpad({\r\n parent,\r\n primaryColor: this.theme.primary,\r\n textColor: this.theme.text,\r\n onDirection: (dir) => {\r\n const opposites: Record<Direction, Direction> = {\r\n up: 'down', down: 'up', left: 'right', right: 'left',\r\n }\r\n if (opposites[dir] !== this.direction) {\r\n this.nextDirection = dir\r\n }\r\n },\r\n })\r\n this.dpad.mount()\r\n }\r\n}\r\n","/**\r\n * Brick Breaker — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~6 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class BrickBreakerGame implements GamePlugin {\r\n readonly name = 'brick-breaker'\r\n readonly bundleSize = 6_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void {\r\n this.running = true\r\n this.render()\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) {\r\n cancelAnimationFrame(this.animFrameId)\r\n this.animFrameId = null\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true\r\n this.render()\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width\r\n const H = rect.height\r\n const { ctx, theme } = this\r\n\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text\r\n ctx.font = 'bold 18px system-ui'\r\n ctx.textAlign = 'center'\r\n ctx.textBaseline = 'middle'\r\n ctx.fillText('Brick Breaker', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'\r\n ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16)\r\n ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Flappy Bird — Infinite runner, physics-based.\r\n *\r\n * Mechanics:\r\n * - Gravity: 0.4 px/frame², jump impulse: -7 px/frame\r\n * - Gap: 150px, randomized vertical position\r\n * - Score: +1 per pipe cleared\r\n * - Pipe color: theme.primary\r\n *\r\n * Controls:\r\n * - Desktop: Spacebar or click\r\n * - Mobile: Tap\r\n *\r\n * Bundle target: ~5 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nconst GRAVITY = 0.4\r\nconst JUMP_VELOCITY = -7\r\nconst PIPE_WIDTH = 52\r\nconst PIPE_GAP = 150\r\nconst PIPE_SPEED = 2.2\r\nconst BIRD_X = 80\r\nconst BIRD_RADIUS = 14\r\n\r\ninterface Pipe {\r\n x: number\r\n topHeight: number\r\n passed: boolean\r\n}\r\n\r\nexport class FlappyGame implements GamePlugin {\r\n readonly name = 'flappy'\r\n readonly bundleSize = 5_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private W = 0\r\n private H = 0\r\n\r\n private birdY = 0\r\n private birdVY = 0\r\n private pipes: Pipe[] = []\r\n private score = 0\r\n private personalBest = 0\r\n private animFrameId: number | null = null\r\n private running = false\r\n private dead = false\r\n private frameCount = 0\r\n private lastTime = 0\r\n\r\n private boundJump: () => void\r\n private boundKey: (e: KeyboardEvent) => void\r\n private boundTouch: () => void\r\n\r\n private onScore?: (score: number) => void\r\n private onGameOver?: () => void\r\n\r\n constructor(onScore?: (score: number) => void, onGameOver?: () => void) {\r\n this.onScore = onScore\r\n this.onGameOver = onGameOver\r\n this.boundJump = this.jump.bind(this)\r\n this.boundKey = (e: KeyboardEvent) => { if (e.code === 'Space') { e.preventDefault(); this.jump() } }\r\n this.boundTouch = this.jump.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n this.W = rect.width\r\n this.H = rect.height\r\n\r\n canvas.setAttribute('aria-label', 'Flappy Bird game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n\r\n this.reset()\r\n }\r\n\r\n private reset(): void {\r\n this.birdY = this.H / 2\r\n this.birdVY = 0\r\n this.pipes = []\r\n this.score = 0\r\n this.dead = false\r\n this.frameCount = 0\r\n this.spawnPipe(this.W + 100)\r\n }\r\n\r\n private spawnPipe(x?: number): void {\r\n const minTop = 60\r\n const maxTop = this.H - PIPE_GAP - 60\r\n const topHeight = minTop + Math.random() * (maxTop - minTop)\r\n this.pipes.push({ x: x ?? this.W + 50, topHeight, passed: false })\r\n }\r\n\r\n start(): void {\r\n this.running = true\r\n this.lastTime = performance.now()\r\n this.loop(performance.now())\r\n this.canvas.addEventListener('click', this.boundJump)\r\n document.addEventListener('keydown', this.boundKey)\r\n this.canvas.addEventListener('touchstart', this.boundTouch, { passive: true })\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) {\r\n cancelAnimationFrame(this.animFrameId)\r\n this.animFrameId = null\r\n }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true\r\n this.lastTime = performance.now()\r\n this.loop(performance.now())\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.canvas.removeEventListener('click', this.boundJump)\r\n document.removeEventListener('keydown', this.boundKey)\r\n this.canvas.removeEventListener('touchstart', this.boundTouch)\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n private jump(): void {\r\n if (this.dead) { this.reset(); return }\r\n this.birdVY = JUMP_VELOCITY\r\n }\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n const dt = Math.min((now - this.lastTime) / 16.67, 3)\r\n this.lastTime = now\r\n if (!this.dead) this.update(dt)\r\n this.render()\r\n }\r\n\r\n private update(dt: number): void {\r\n this.frameCount++\r\n this.birdVY += GRAVITY * dt\r\n this.birdY += this.birdVY * dt\r\n\r\n if (this.birdY + BIRD_RADIUS >= this.H || this.birdY - BIRD_RADIUS <= 0) {\r\n this.die(); return\r\n }\r\n\r\n if (this.frameCount % 90 === 0) this.spawnPipe()\r\n\r\n for (const pipe of this.pipes) {\r\n pipe.x -= PIPE_SPEED * dt\r\n if (!pipe.passed && pipe.x + PIPE_WIDTH < BIRD_X) {\r\n pipe.passed = true\r\n this.score++\r\n if (this.score > this.personalBest) this.personalBest = this.score\r\n this.onScore?.(this.score)\r\n }\r\n\r\n const inX = BIRD_X + BIRD_RADIUS > pipe.x && BIRD_X - BIRD_RADIUS < pipe.x + PIPE_WIDTH\r\n const inY = this.birdY - BIRD_RADIUS < pipe.topHeight || this.birdY + BIRD_RADIUS > pipe.topHeight + PIPE_GAP\r\n if (inX && inY) { this.die(); return }\r\n }\r\n this.pipes = this.pipes.filter(p => p.x + PIPE_WIDTH > -10)\r\n }\r\n\r\n private die(): void {\r\n this.dead = true\r\n this.birdVY = JUMP_VELOCITY * 0.5\r\n this.onGameOver?.()\r\n }\r\n\r\n private render(): void {\r\n const { ctx, W, H, theme } = this\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n\r\n for (const pipe of this.pipes) {\r\n ctx.fillStyle = theme.primary\r\n ctx.fillRect(pipe.x - 4, pipe.topHeight - 24, PIPE_WIDTH + 8, 24)\r\n ctx.beginPath(); ctx.roundRect(pipe.x, 0, PIPE_WIDTH, pipe.topHeight - 6, [0,0,6,6]); ctx.fill()\r\n const bY = pipe.topHeight + PIPE_GAP\r\n ctx.fillRect(pipe.x - 4, bY, PIPE_WIDTH + 8, 24)\r\n ctx.beginPath(); ctx.roundRect(pipe.x, bY + 6, PIPE_WIDTH, H - bY, [6,6,0,0]); ctx.fill()\r\n }\r\n\r\n ctx.save()\r\n ctx.translate(BIRD_X, this.birdY)\r\n ctx.rotate(Math.min(Math.max(this.birdVY * 0.05, -0.5), 1.0))\r\n if (this.dead) ctx.globalAlpha = 0.6\r\n ctx.fillStyle = '#FFD93D'\r\n ctx.beginPath(); ctx.arc(0, 0, BIRD_RADIUS, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#fff'; ctx.beginPath(); ctx.arc(5, -4, 5, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#333'; ctx.beginPath(); ctx.arc(6, -4, 2.5, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#FF6B35'\r\n ctx.beginPath(); ctx.moveTo(BIRD_RADIUS - 2, 0); ctx.lineTo(BIRD_RADIUS + 8, -3); ctx.lineTo(BIRD_RADIUS + 8, 3); ctx.closePath(); ctx.fill()\r\n ctx.restore()\r\n\r\n ctx.fillStyle = theme.text\r\n ctx.font = 'bold 28px monospace'\r\n ctx.textAlign = 'center'\r\n ctx.fillText(String(this.score), W / 2, 44)\r\n\r\n if (this.dead) {\r\n ctx.fillStyle = 'rgba(0,0,0,0.45)'\r\n ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text\r\n ctx.font = 'bold 20px system-ui'\r\n ctx.textAlign = 'center'\r\n ctx.fillText('Tap to retry', W / 2, H / 2)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.7\r\n ctx.fillText(`Score: ${this.score} Best: ${this.personalBest}`, W / 2, H / 2 + 28)\r\n ctx.globalAlpha = 1\r\n }\r\n }\r\n}\r\n","/**\r\n * 2048 — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~5 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class Game2048 implements GamePlugin {\r\n readonly name = '2048'\r\n readonly bundleSize = 5_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private _onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void { this.running = true; this.render() }\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.render() } }\r\n destroy(): void { this.pause() }\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width, H = rect.height\r\n const { ctx, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px system-ui'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText('2048', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Wordle-lite — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~7 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class WordleLiteGame implements GamePlugin {\r\n readonly name = 'wordle-lite'\r\n readonly bundleSize = 7_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private _onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void { this.running = true; this.render() }\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.render() } }\r\n destroy(): void { this.pause() }\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width, H = rect.height\r\n const { ctx, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px system-ui'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText('Wordle-lite', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Asteroids — Stub implementation.\r\n * Full implementation planned for Phase 3.\r\n * Bundle target: ~8 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nexport class AsteroidsGame implements GamePlugin {\r\n readonly name = 'asteroids'\r\n readonly bundleSize = 8_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private animFrameId: number | null = null\r\n private running = false\r\n private score = 0\r\n\r\n constructor(private _onScore?: (s: number) => void, private _onGameOver?: () => void) {}\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas\r\n this.ctx = canvas.getContext('2d')!\r\n this.theme = resolveTheme(theme)\r\n const dpr = window.devicePixelRatio || 1\r\n const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr\r\n canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr)\r\n canvas.style.width = `${rect.width}px`\r\n canvas.style.height = `${rect.height}px`\r\n }\r\n\r\n start(): void { this.running = true; this.render() }\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.render() } }\r\n destroy(): void { this.pause() }\r\n getScore(): number { return this.score }\r\n\r\n private render(): void {\r\n const rect = this.canvas.getBoundingClientRect()\r\n const W = rect.width, H = rect.height\r\n const { ctx, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px system-ui'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText('Asteroids', W / 2, H / 2 - 16)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.6\r\n ctx.fillText('Coming soon!', W / 2, H / 2 + 16); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Memory Cards — Emoji pair matching game.\r\n * Bundle target: ~4 kB gzipped\r\n * See SPEC.md §7.7 for full spec.\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nconst EMOJIS = ['🎮','🚀','🎯','🎲','🌟','🎸','🦄','🍕']\r\nconst GRID = 4\r\nconst FLIP_MS = 300\r\n\r\ninterface Card {\r\n id: number; emoji: string; flipped: boolean; matched: boolean; flipProgress: number; pulsePhase: number\r\n}\r\n\r\nexport class MemoryCardsGame implements GamePlugin {\r\n readonly name = 'memory-cards'\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private W = 0; private H = 0\r\n private cards: Card[] = []\r\n private flippedIdxs: number[] = []\r\n private locked = false\r\n private score = 0; private matchCount = 0; private startTime = 0\r\n private selectedIdx = 0 // keyboard navigation index\r\n private animFrameId: number | null = null\r\n private running = false; private lastTime = 0\r\n private boundClick: (e: MouseEvent) => void\r\n private boundTouch: (e: TouchEvent) => void\r\n private boundKeyDown: (e: KeyboardEvent) => void\r\n\r\n private onScore?: (s: number) => void\r\n private onGameOver?: () => void\r\n\r\n constructor(onScore?: (s: number) => void, onGameOver?: () => void) {\r\n this.onScore = onScore\r\n this.onGameOver = onGameOver\r\n this.boundClick = this.onClick.bind(this)\r\n this.boundTouch = this.onTouch.bind(this)\r\n this.boundKeyDown = this.onKeyDown.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas; this.ctx = canvas.getContext('2d')!; this.theme = resolveTheme(theme)\r\n\r\n canvas.setAttribute('aria-label', 'Memory Cards game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n canvas.setAttribute('tabindex', '0')\r\n\r\n const dpr = window.devicePixelRatio || 1; const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr; canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr); canvas.style.width = `${rect.width}px`; canvas.style.height = `${rect.height}px`\r\n this.W = rect.width; this.H = rect.height; this.reset()\r\n }\r\n\r\n private reset(): void {\r\n const pairs = [...EMOJIS, ...EMOJIS]\r\n for (let i = pairs.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [pairs[i], pairs[j]] = [pairs[j]!, pairs[i]!] }\r\n this.cards = pairs.map((emoji, id) => ({ id, emoji, flipped: false, matched: false, flipProgress: 0, pulsePhase: 0 }))\r\n this.flippedIdxs = []; this.locked = false; this.score = 0; this.matchCount = 0\r\n this.startTime = Date.now(); this.selectedIdx = 0\r\n }\r\n\r\n start(): void {\r\n this.running = true; this.lastTime = performance.now(); this.loop(performance.now())\r\n this.canvas.addEventListener('click', this.boundClick)\r\n this.canvas.addEventListener('touchend', this.boundTouch, { passive: true })\r\n document.addEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n pause(): void { this.running = false; if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null } }\r\n resume(): void { if (!this.running) { this.running = true; this.lastTime = performance.now(); this.loop(performance.now()) } }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.canvas.removeEventListener('click', this.boundClick)\r\n this.canvas.removeEventListener('touchend', this.boundTouch)\r\n document.removeEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n private bounds(i: number) {\r\n const pad = 8; const cols = GRID; const rows = GRID\r\n const w = (this.W - pad * (cols + 1)) / cols; const h = (this.H - pad * (rows + 1)) / rows\r\n return { x: pad + (i % cols) * (w + pad), y: pad + Math.floor(i / cols) * (h + pad), w, h }\r\n }\r\n\r\n private cardAt(px: number, py: number): number {\r\n for (let i = 0; i < this.cards.length; i++) { const b = this.bounds(i); if (px >= b.x && px <= b.x + b.w && py >= b.y && py <= b.y + b.h) return i }\r\n return -1\r\n }\r\n\r\n private onClick(e: MouseEvent): void { const r = this.canvas.getBoundingClientRect(); this.tryFlip(e.clientX - r.left, e.clientY - r.top) }\r\n private onTouch(e: TouchEvent): void { const t = e.changedTouches[0]; if (!t) return; const r = this.canvas.getBoundingClientRect(); this.tryFlip(t.clientX - r.left, t.clientY - r.top) }\r\n\r\n private onKeyDown(e: KeyboardEvent): void {\r\n const total = this.cards.length\r\n switch (e.key) {\r\n case 'Tab':\r\n e.preventDefault()\r\n this.selectedIdx = (this.selectedIdx + (e.shiftKey ? total - 1 : 1)) % total\r\n break\r\n case 'ArrowRight': e.preventDefault(); this.selectedIdx = (this.selectedIdx + 1) % total; break\r\n case 'ArrowLeft': e.preventDefault(); this.selectedIdx = (this.selectedIdx + total - 1) % total; break\r\n case 'ArrowDown': e.preventDefault(); this.selectedIdx = (this.selectedIdx + GRID) % total; break\r\n case 'ArrowUp': e.preventDefault(); this.selectedIdx = (this.selectedIdx + total - GRID) % total; break\r\n case 'Enter':\r\n case ' ':\r\n e.preventDefault()\r\n this.tryFlipByIdx(this.selectedIdx)\r\n break\r\n }\r\n }\r\n\r\n private tryFlipByIdx(idx: number): void {\r\n if (this.locked) return\r\n const card = this.cards[idx]!; if (card.flipped || card.matched) return\r\n card.flipped = true; this.flippedIdxs.push(idx)\r\n this.checkMatch()\r\n }\r\n\r\n private tryFlip(x: number, y: number): void {\r\n if (this.locked) return\r\n const idx = this.cardAt(x, y); if (idx === -1) return\r\n const card = this.cards[idx]!; if (card.flipped || card.matched) return\r\n card.flipped = true; this.flippedIdxs.push(idx); this.selectedIdx = idx\r\n this.checkMatch()\r\n }\r\n\r\n private checkMatch(): void {\r\n if (this.flippedIdxs.length !== 2) return\r\n this.locked = true\r\n const [a, b] = this.flippedIdxs as [number, number]\r\n if (this.cards[a]!.emoji === this.cards[b]!.emoji) {\r\n setTimeout(() => {\r\n this.cards[a]!.matched = true; this.cards[b]!.matched = true\r\n this.matchCount++; this.score += 10; this.onScore?.(this.score)\r\n this.flippedIdxs = []; this.locked = false\r\n if (this.matchCount === EMOJIS.length) {\r\n // Speed bonus: reward fast completion\r\n const elapsed = (Date.now() - this.startTime) / 1000\r\n const timeBonus = Math.max(0, Math.round((60 - elapsed) * 5))\r\n this.score += timeBonus; this.onScore?.(this.score)\r\n this.onGameOver?.()\r\n setTimeout(() => this.reset(), 2000)\r\n }\r\n }, FLIP_MS + 100)\r\n } else {\r\n setTimeout(() => {\r\n this.cards[a]!.flipped = false; this.cards[b]!.flipped = false\r\n this.flippedIdxs = []; this.locked = false\r\n }, FLIP_MS + 600)\r\n }\r\n }\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n const dt = (now - this.lastTime) / FLIP_MS; this.lastTime = now\r\n for (const c of this.cards) {\r\n if (c.flipped && c.flipProgress < 1) c.flipProgress = Math.min(1, c.flipProgress + dt)\r\n else if (!c.flipped && c.flipProgress > 0) c.flipProgress = Math.max(0, c.flipProgress - dt)\r\n if (c.matched) c.pulsePhase = (c.pulsePhase + dt * 0.15) % (Math.PI * 2)\r\n }\r\n this.render()\r\n }\r\n\r\n private render(): void {\r\n const { ctx, W, H, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n for (let i = 0; i < this.cards.length; i++) {\r\n const card = this.cards[i]!; const b = this.bounds(i)\r\n const scaleX = Math.abs(Math.cos(card.flipProgress * Math.PI))\r\n const cx = b.x + b.w / 2; const cy = b.y + b.h / 2\r\n ctx.save(); ctx.translate(cx, cy); ctx.scale(scaleX, 1); ctx.translate(-b.w / 2, -b.h / 2)\r\n ctx.beginPath(); ctx.roundRect(0, 0, b.w, b.h, 6)\r\n if (card.flipProgress > 0.5) {\r\n if (card.matched) {\r\n // Pulsing glow for matched cards\r\n const pulse = 0.2 + Math.sin(card.pulsePhase) * 0.1\r\n ctx.fillStyle = theme.primary + '33'; ctx.fill()\r\n ctx.strokeStyle = theme.primary; ctx.lineWidth = 3\r\n ctx.globalAlpha = 0.6 + pulse; ctx.stroke(); ctx.globalAlpha = 1\r\n // Outer glow\r\n ctx.shadowColor = theme.primary; ctx.shadowBlur = 8\r\n ctx.stroke(); ctx.shadowBlur = 0\r\n } else {\r\n ctx.fillStyle = theme.surface; ctx.fill()\r\n }\r\n ctx.font = `${Math.min(b.w, b.h) * 0.45}px serif`; ctx.textAlign = 'center'; ctx.textBaseline = 'middle'\r\n ctx.fillText(card.emoji, b.w / 2, b.h / 2)\r\n } else {\r\n ctx.fillStyle = theme.primary + '99'; ctx.fill()\r\n ctx.strokeStyle = theme.primary; ctx.lineWidth = 1; ctx.globalAlpha = 0.25\r\n for (let j = 0; j < 3; j++) { const n = 4 + j * 5; ctx.strokeRect(n, n, b.w - n * 2, b.h - n * 2) }\r\n ctx.globalAlpha = 1\r\n }\r\n // Keyboard selection highlight\r\n if (i === this.selectedIdx) {\r\n ctx.strokeStyle = theme.text; ctx.lineWidth = 2; ctx.setLineDash([4, 3])\r\n ctx.strokeRect(0, 0, b.w, b.h); ctx.setLineDash([])\r\n }\r\n ctx.restore()\r\n }\r\n ctx.fillStyle = theme.text; ctx.globalAlpha = 0.5; ctx.font = '11px system-ui'; ctx.textAlign = 'right'\r\n ctx.fillText(`${this.matchCount}/${EMOJIS.length} \\u00b7 ${this.score}pts`, W - 6, H - 4); ctx.globalAlpha = 1\r\n }\r\n}\r\n","/**\r\n * Whack-a-Mole — Touch-first, 3×3 grid, 20-second rounds.\r\n *\r\n * Mechanics:\r\n * - 3×3 holes, moles appear for 800–1500ms\r\n * - 20-second timed round, spawn rate accelerates from 900ms→500ms\r\n * - +1 per hit, high score is very shareable\r\n *\r\n * Controls: Mouse click / tap / keyboard 1-9\r\n * Bundle target: ~4 kB gzipped\r\n */\r\n\r\nimport type { GamePlugin, ThemeObject, ResolvedTheme } from '../../types.js'\r\nimport { resolveTheme } from '../../theme.js'\r\n\r\nconst GRID = 3\r\nconst ROUND_DURATION = 20_000\r\nconst HOLE_COUNT = GRID * GRID\r\nconst SPAWN_START_MS = 900\r\nconst SPAWN_END_MS = 500\r\nconst MOLE_MIN_STAY = 800\r\nconst MOLE_STAY_RANGE = 700\r\n\r\ninterface Hole {\r\n active: boolean\r\n showProgress: number\r\n hideAt: number // timestamp when mole auto-hides (0 = no mole)\r\n hit: boolean\r\n hitProgress: number\r\n}\r\n\r\nexport class WhackAMoleGame implements GamePlugin {\r\n readonly name = 'whack-a-mole'\r\n readonly bundleSize = 4_000\r\n\r\n private canvas!: HTMLCanvasElement\r\n private ctx!: CanvasRenderingContext2D\r\n private theme!: ResolvedTheme\r\n private W = 0; private H = 0\r\n\r\n private holes: Hole[] = []\r\n private score = 0\r\n private timeLeft = ROUND_DURATION\r\n private roundStart = 0\r\n private animFrameId: number | null = null\r\n private running = false\r\n private lastTime = 0\r\n private roundOver = false\r\n private nextSpawnTime = 0\r\n\r\n private boundClick: (e: MouseEvent) => void\r\n private boundTouch: (e: TouchEvent) => void\r\n private boundKeyDown: (e: KeyboardEvent) => void\r\n\r\n private onScore?: (s: number) => void\r\n private onGameOver?: () => void\r\n\r\n constructor(onScore?: (s: number) => void, onGameOver?: () => void) {\r\n this.onScore = onScore\r\n this.onGameOver = onGameOver\r\n this.boundClick = this.onClick.bind(this)\r\n this.boundTouch = this.onTouch.bind(this)\r\n this.boundKeyDown = this.onKeyDown.bind(this)\r\n }\r\n\r\n init(canvas: HTMLCanvasElement, theme: ThemeObject): void {\r\n this.canvas = canvas; this.ctx = canvas.getContext('2d')!; this.theme = resolveTheme(theme)\r\n\r\n canvas.setAttribute('aria-label', 'Whack-a-Mole game \\u2014 loading in background')\r\n canvas.setAttribute('role', 'img')\r\n\r\n const dpr = window.devicePixelRatio || 1; const rect = canvas.getBoundingClientRect()\r\n canvas.width = rect.width * dpr; canvas.height = rect.height * dpr\r\n this.ctx.scale(dpr, dpr); canvas.style.width = `${rect.width}px`; canvas.style.height = `${rect.height}px`\r\n this.W = rect.width; this.H = rect.height\r\n this.reset()\r\n }\r\n\r\n private reset(): void {\r\n this.holes = Array.from({ length: HOLE_COUNT }, () => ({\r\n active: false, showProgress: 0, hideAt: 0, hit: false, hitProgress: 0,\r\n }))\r\n this.score = 0; this.timeLeft = ROUND_DURATION; this.roundOver = false\r\n this.nextSpawnTime = 0\r\n }\r\n\r\n start(): void {\r\n this.running = true; this.roundStart = performance.now(); this.lastTime = performance.now()\r\n this.nextSpawnTime = performance.now()\r\n this.loop(performance.now())\r\n this.canvas.addEventListener('click', this.boundClick)\r\n this.canvas.addEventListener('touchend', this.boundTouch, { passive: true })\r\n document.addEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n pause(): void {\r\n this.running = false\r\n if (this.animFrameId !== null) { cancelAnimationFrame(this.animFrameId); this.animFrameId = null }\r\n }\r\n\r\n resume(): void {\r\n if (!this.running) {\r\n this.running = true; this.lastTime = performance.now()\r\n this.nextSpawnTime = performance.now()\r\n this.loop(performance.now())\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.pause()\r\n this.canvas.removeEventListener('click', this.boundClick)\r\n this.canvas.removeEventListener('touchend', this.boundTouch)\r\n document.removeEventListener('keydown', this.boundKeyDown)\r\n }\r\n\r\n getScore(): number { return this.score }\r\n\r\n // ─── RAF-based Mole Spawner ───────────────────────────────────────────────\r\n\r\n private trySpawnMole(now: number): void {\r\n if (this.roundOver || now < this.nextSpawnTime) return\r\n\r\n const available = this.holes.map((h, i) => (!h.active && !h.hit ? i : -1)).filter(i => i >= 0)\r\n if (available.length > 0) {\r\n const idx = available[Math.floor(Math.random() * available.length)]!\r\n this.activateMole(idx, now)\r\n }\r\n\r\n // Spawn rate accelerates: 900ms → 500ms over the round\r\n const elapsed = now - this.roundStart\r\n const t = Math.min(1, elapsed / ROUND_DURATION)\r\n const interval = SPAWN_START_MS - t * (SPAWN_START_MS - SPAWN_END_MS)\r\n this.nextSpawnTime = now + interval\r\n }\r\n\r\n private activateMole(idx: number, now: number): void {\r\n const hole = this.holes[idx]!\r\n hole.active = true; hole.hit = false; hole.hitProgress = 0\r\n hole.hideAt = now + MOLE_MIN_STAY + Math.random() * MOLE_STAY_RANGE\r\n }\r\n\r\n private holeBounds(i: number): { cx: number; cy: number; r: number } {\r\n const cols = GRID; const rows = GRID\r\n const padX = 24; const padY = 24\r\n const cellW = (this.W - padX * 2) / cols; const cellH = (this.H - padY * 2 - 30) / rows\r\n const col = i % cols; const row = Math.floor(i / cols)\r\n const cx = padX + col * cellW + cellW / 2\r\n const cy = padY + row * cellH + cellH / 2 + 30\r\n const r = Math.min(cellW, cellH) * 0.38\r\n return { cx, cy, r }\r\n }\r\n\r\n // ─── Input ────────────────────────────────────────────────────────────────\r\n\r\n private onClick(e: MouseEvent): void { const r = this.canvas.getBoundingClientRect(); this.tryHit(e.clientX - r.left, e.clientY - r.top) }\r\n private onTouch(e: TouchEvent): void { const t = e.changedTouches[0]; if (!t) return; const r = this.canvas.getBoundingClientRect(); this.tryHit(t.clientX - r.left, t.clientY - r.top) }\r\n\r\n private onKeyDown(e: KeyboardEvent): void {\r\n // Keys 1-9 map to holes 0-8 (top-left to bottom-right)\r\n const num = parseInt(e.key, 10)\r\n if (num >= 1 && num <= 9) {\r\n e.preventDefault()\r\n if (this.roundOver) { this.reset(); this.nextSpawnTime = performance.now(); return }\r\n const idx = num - 1\r\n const hole = this.holes[idx]\r\n if (hole && hole.active && !hole.hit) {\r\n hole.active = false; hole.hit = true; hole.hitProgress = 0; hole.hideAt = 0\r\n this.score++; this.onScore?.(this.score)\r\n }\r\n }\r\n }\r\n\r\n private tryHit(px: number, py: number): void {\r\n if (this.roundOver) { this.reset(); this.nextSpawnTime = performance.now(); return }\r\n for (let i = 0; i < this.holes.length; i++) {\r\n const hole = this.holes[i]!; if (!hole.active || hole.hit) continue\r\n const b = this.holeBounds(i)\r\n const dist = Math.hypot(px - b.cx, py - b.cy)\r\n if (dist < b.r * 1.2) {\r\n hole.active = false; hole.hit = true; hole.hitProgress = 0; hole.hideAt = 0\r\n this.score++; this.onScore?.(this.score)\r\n return\r\n }\r\n }\r\n }\r\n\r\n // ─── Loop ─────────────────────────────────────────────────────────────────\r\n\r\n private loop(now: number): void {\r\n if (!this.running) return\r\n this.animFrameId = requestAnimationFrame(t => this.loop(t))\r\n const dt = now - this.lastTime; this.lastTime = now\r\n this.update(now, dt); this.render()\r\n }\r\n\r\n private update(now: number, dt: number): void {\r\n if (this.roundOver) return\r\n\r\n this.timeLeft = Math.max(0, ROUND_DURATION - (now - this.roundStart))\r\n if (this.timeLeft === 0) { this.roundOver = true; this.onGameOver?.(); return }\r\n\r\n // RAF-based spawner (replaces setInterval)\r\n this.trySpawnMole(now)\r\n\r\n // Auto-hide moles whose time is up\r\n for (const hole of this.holes) {\r\n if (hole.active && hole.hideAt > 0 && now >= hole.hideAt) {\r\n hole.active = false; hole.hideAt = 0\r\n }\r\n }\r\n\r\n const step = dt / 200\r\n for (const hole of this.holes) {\r\n if (hole.active) hole.showProgress = Math.min(1, hole.showProgress + step)\r\n else if (hole.hit) { hole.hitProgress = Math.min(1, hole.hitProgress + step); if (hole.hitProgress >= 1) hole.hit = false }\r\n else hole.showProgress = Math.max(0, hole.showProgress - step)\r\n }\r\n }\r\n\r\n private render(): void {\r\n const { ctx, W, H, theme } = this\r\n ctx.fillStyle = theme.background; ctx.fillRect(0, 0, W, H)\r\n\r\n // Timer bar\r\n const progress = this.timeLeft / ROUND_DURATION\r\n ctx.fillStyle = theme.surface; ctx.fillRect(16, 10, W - 32, 12)\r\n ctx.fillStyle = progress > 0.3 ? theme.primary : theme.accent\r\n ctx.beginPath(); ctx.roundRect(16, 10, (W - 32) * progress, 12, 4); ctx.fill()\r\n\r\n // Score\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 18px monospace'; ctx.textAlign = 'left'\r\n ctx.fillText(`${this.score}`, 16, H - 8)\r\n ctx.textAlign = 'right'; ctx.globalAlpha = 0.5; ctx.font = '12px system-ui'\r\n ctx.fillText(`${Math.ceil(this.timeLeft / 1000)}s`, W - 16, H - 8); ctx.globalAlpha = 1\r\n\r\n // Holes & moles\r\n for (let i = 0; i < this.holes.length; i++) {\r\n const hole = this.holes[i]!; const b = this.holeBounds(i)\r\n\r\n // Hole (always visible)\r\n ctx.fillStyle = theme.surface; ctx.globalAlpha = 0.6\r\n ctx.beginPath(); ctx.ellipse(b.cx, b.cy + b.r * 0.2, b.r, b.r * 0.4, 0, 0, Math.PI * 2); ctx.fill()\r\n ctx.globalAlpha = 1\r\n\r\n // Hole number label for keyboard hint\r\n ctx.fillStyle = theme.text; ctx.globalAlpha = 0.2; ctx.font = `bold ${b.r * 0.3}px monospace`\r\n ctx.textAlign = 'center'; ctx.fillText(`${i + 1}`, b.cx, b.cy + b.r * 0.55); ctx.globalAlpha = 1\r\n\r\n // Mole (pops up via showProgress or flies away on hit)\r\n const prog = hole.active || hole.hit ? (hole.hit ? 1 - hole.hitProgress : hole.showProgress) : hole.showProgress\r\n if (prog <= 0) continue\r\n\r\n const offsetY = (1 - prog) * b.r * 1.5\r\n const cy = b.cy - offsetY\r\n\r\n ctx.save()\r\n ctx.beginPath()\r\n ctx.ellipse(b.cx, b.cy + b.r * 0.25, b.r, b.r * 0.45, 0, 0, Math.PI * 2)\r\n ctx.clip()\r\n\r\n // Mole body\r\n ctx.fillStyle = hole.hit ? theme.accent : '#8B4513'\r\n ctx.beginPath(); ctx.arc(b.cx, cy, b.r * 0.8, 0, Math.PI * 2); ctx.fill()\r\n // Eyes\r\n ctx.fillStyle = '#fff'\r\n ctx.beginPath(); ctx.arc(b.cx - b.r * 0.28, cy - b.r * 0.15, b.r * 0.15, 0, Math.PI * 2); ctx.fill()\r\n ctx.beginPath(); ctx.arc(b.cx + b.r * 0.28, cy - b.r * 0.15, b.r * 0.15, 0, Math.PI * 2); ctx.fill()\r\n ctx.fillStyle = '#333'\r\n ctx.beginPath(); ctx.arc(b.cx - b.r * 0.25, cy - b.r * 0.15, b.r * 0.08, 0, Math.PI * 2); ctx.fill()\r\n ctx.beginPath(); ctx.arc(b.cx + b.r * 0.25, cy - b.r * 0.15, b.r * 0.08, 0, Math.PI * 2); ctx.fill()\r\n // Nose\r\n ctx.fillStyle = '#FFB6C1'\r\n ctx.beginPath(); ctx.arc(b.cx, cy + b.r * 0.05, b.r * 0.1, 0, Math.PI * 2); ctx.fill()\r\n\r\n if (hole.hit) {\r\n ctx.fillStyle = '#FFD700'; ctx.font = `bold ${b.r * 0.6}px system-ui`\r\n ctx.textAlign = 'center'; ctx.fillText('\\u2713', b.cx, cy - b.r * 0.6)\r\n }\r\n\r\n ctx.restore()\r\n }\r\n\r\n // Round over overlay\r\n if (this.roundOver) {\r\n ctx.fillStyle = 'rgba(0,0,0,0.55)'; ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.text; ctx.font = 'bold 24px system-ui'; ctx.textAlign = 'center'\r\n ctx.fillText(`Score: ${this.score}`, W / 2, H / 2)\r\n ctx.font = '14px system-ui'; ctx.globalAlpha = 0.7\r\n ctx.fillText('Tap to play again', W / 2, H / 2 + 32); ctx.globalAlpha = 1\r\n }\r\n }\r\n}\r\n","/**\r\n * GameController — Orchestrates the entire game lifecycle.\r\n *\r\n * Manages:\r\n * - Delay timer (don't flash for fast loads)\r\n * - Dynamic game chunk loading\r\n * - Canvas setup and teardown\r\n * - Entry/exit animations\r\n * - Score callbacks\r\n * - Visibility API pause/resume\r\n * - prefers-reduced-motion fallback\r\n */\r\n\r\nimport type {\r\n GameName,\r\n GamePlugin,\r\n LoadingGameOptions,\r\n Score,\r\n GameResult,\r\n ExitAnimation,\r\n GameState,\r\n} from './types.js'\r\nimport { resolveTheme, applyThemeToElement } from './theme.js'\r\nimport { DelayController } from './delay.js'\r\nimport { getPersonalBest, saveScore } from './scores.js'\r\n\r\ninterface ControllerCallbacks {\r\n onScore: (score: Score) => void\r\n onGameOver: (result: GameResult) => void\r\n onComplete: () => void\r\n onError: (err: Error) => void\r\n}\r\n\r\nconst SIZE_MAP = {\r\n sm: { width: 280, height: 220 },\r\n md: { width: 400, height: 320 },\r\n lg: { width: 560, height: 440 },\r\n full: { width: 0, height: 0 }, // handled separately\r\n}\r\n\r\nexport class GameController {\r\n hasEverActivated = false\r\n\r\n private host: HTMLElement\r\n private callbacks: ControllerCallbacks\r\n private options: LoadingGameOptions = {}\r\n private state: GameState = 'idle'\r\n\r\n private canvas: HTMLCanvasElement | null = null\r\n private overlay: HTMLElement | null = null\r\n private skipLink: HTMLAnchorElement | null = null\r\n\r\n private currentGame: GamePlugin | null = null\r\n private delayController: DelayController | null = null\r\n private _gameStartTime = 0\r\n private _currentScore = 0\r\n\r\n private boundVisibilityChange: () => void\r\n\r\n constructor(host: HTMLElement, callbacks: ControllerCallbacks) {\r\n this.host = host\r\n this.callbacks = callbacks\r\n this.boundVisibilityChange = this.handleVisibilityChange.bind(this)\r\n document.addEventListener('visibilitychange', this.boundVisibilityChange)\r\n }\r\n\r\n // ─── Public API ─────────────────────────────────────────────────────────────\r\n\r\n activate(options: LoadingGameOptions): void {\r\n this.hasEverActivated = true\r\n this.options = options\r\n if (this.state !== 'idle') return\r\n\r\n this.setState('delaying')\r\n\r\n this.delayController = new DelayController({\r\n delay: options.delay ?? 800,\r\n minDisplay: options.minDisplay ?? 0,\r\n onShow: () => this.showGame(),\r\n onExit: () => this.exitGame(),\r\n })\r\n\r\n this.delayController.start()\r\n }\r\n\r\n deactivate(opts: { animation: ExitAnimation }): void {\r\n this.options.exitAnimation = opts.animation\r\n\r\n if (this.state === 'delaying') {\r\n this.delayController?.end()\r\n this.setState('idle')\r\n return\r\n }\r\n\r\n if (this.state === 'playing') {\r\n this.currentGame?.pause()\r\n this.delayController?.end()\r\n }\r\n }\r\n\r\n /** Immediately tear down on error — no animation, no delay. */\r\n errorDeactivate(): void {\r\n this.delayController?.destroy()\r\n this.delayController = null\r\n this.currentGame?.destroy()\r\n this.currentGame = null\r\n this.teardownDOM()\r\n this.setState('idle')\r\n }\r\n\r\n updateOptions(options: LoadingGameOptions): void {\r\n this.options = { ...this.options, ...options }\r\n }\r\n\r\n destroy(): void {\r\n this.delayController?.destroy()\r\n this.currentGame?.destroy()\r\n this.currentGame = null\r\n this.teardownDOM()\r\n document.removeEventListener('visibilitychange', this.boundVisibilityChange)\r\n }\r\n\r\n // ─── Game Lifecycle ──────────────────────────────────────────────────────────\r\n\r\n private async showGame(): Promise<void> {\r\n this.setState('loading-game')\r\n\r\n const resolvedName = this.resolveGameName(this.options.game ?? 'random')\r\n\r\n try {\r\n const GameClass = await this.loadGameChunk(resolvedName)\r\n this.setupDOM()\r\n\r\n const theme = resolveTheme(this.options.theme)\r\n if (this.overlay) applyThemeToElement(this.overlay, theme)\r\n\r\n // Set game-specific aria-label\r\n if (this.canvas) {\r\n this.canvas.setAttribute('aria-label', `${resolvedName} game — loading in background`)\r\n }\r\n\r\n // prefers-reduced-motion: show static animation, no gameplay\r\n if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n this.showReducedMotionFallback(theme)\r\n return\r\n }\r\n\r\n this.currentGame = new GameClass(\r\n (score: number) => this.handleScoreUpdate(score, resolvedName),\r\n () => this.handleGameOverEvent(resolvedName),\r\n )\r\n await this.currentGame.init(this.canvas!, this.options.theme ?? {})\r\n\r\n this.setState('playing')\r\n this._gameStartTime = Date.now()\r\n this._currentScore = 0\r\n this.currentGame.start()\r\n\r\n this.showToast('Loading in the background — play while you wait!')\r\n } catch (err) {\r\n this.callbacks.onError(err instanceof Error ? err : new Error(String(err)))\r\n this.teardownDOM()\r\n this.setState('idle')\r\n }\r\n }\r\n\r\n private async exitGame(): Promise<void> {\r\n if (this.state === 'playing' || this.state === 'min-display') {\r\n this.currentGame?.pause()\r\n this.showCompletionOverlay()\r\n\r\n // Wait 1.5s then fully exit\r\n await this.sleep(1500)\r\n }\r\n\r\n this.setState('exiting')\r\n await this.animateExit(this.options.exitAnimation ?? 'fade')\r\n\r\n this.currentGame?.destroy()\r\n this.currentGame = null\r\n this.teardownDOM()\r\n this.setState('idle')\r\n this.callbacks.onComplete()\r\n }\r\n\r\n // ─── DOM Setup ───────────────────────────────────────────────────────────────\r\n\r\n private setupDOM(): void {\r\n const size = this.options.size ?? 'md'\r\n const dimensions = SIZE_MAP[size]\r\n\r\n // Container\r\n this.overlay = document.createElement('div')\r\n this.overlay.setAttribute('data-lg-overlay', '')\r\n Object.assign(this.overlay.style, {\r\n position: size === 'full' ? 'fixed' : 'relative',\r\n inset: size === 'full' ? '0' : 'auto',\r\n width: size === 'full' ? '100%' : `${dimensions.width}px`,\r\n height: size === 'full' ? '100%' : `${dimensions.height}px`,\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: size === 'full' ? '9999' : 'auto',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease, transform 300ms ease',\r\n transform: 'scale(0.97)',\r\n overflow: 'hidden',\r\n borderRadius: size === 'full' ? '0' : '12px',\r\n })\r\n\r\n // Skip link (accessibility — must be first focusable element)\r\n this.skipLink = document.createElement('a')\r\n this.skipLink.href = '#'\r\n this.skipLink.textContent = 'Skip game, wait for loading'\r\n this.skipLink.setAttribute('data-lg-skip', '')\r\n Object.assign(this.skipLink.style, {\r\n position: 'absolute',\r\n top: '-9999px',\r\n left: '-9999px',\r\n })\r\n this.skipLink.addEventListener('focus', () => {\r\n Object.assign(this.skipLink!.style, { top: '8px', left: '8px' })\r\n })\r\n this.skipLink.addEventListener('blur', () => {\r\n Object.assign(this.skipLink!.style, { top: '-9999px', left: '-9999px' })\r\n })\r\n this.skipLink.addEventListener('click', (e) => {\r\n e.preventDefault()\r\n this.deactivate({ animation: 'none' })\r\n })\r\n\r\n // Canvas\r\n this.canvas = document.createElement('canvas')\r\n this.canvas.setAttribute('role', 'application')\r\n this.canvas.setAttribute('tabindex', '0')\r\n Object.assign(this.canvas.style, {\r\n width: '100%',\r\n height: '100%',\r\n display: 'block',\r\n })\r\n\r\n this.overlay.appendChild(this.skipLink)\r\n this.overlay.appendChild(this.canvas)\r\n this.host.appendChild(this.overlay)\r\n\r\n // Animate in\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n if (this.overlay) {\r\n this.overlay.style.opacity = '1'\r\n this.overlay.style.transform = 'scale(1)'\r\n }\r\n })\r\n })\r\n }\r\n\r\n private teardownDOM(): void {\r\n this.overlay?.remove()\r\n this.overlay = null\r\n this.canvas = null\r\n this.skipLink = null\r\n }\r\n\r\n private async animateExit(animation: ExitAnimation): Promise<void> {\r\n if (!this.overlay || animation === 'none') return\r\n\r\n if (animation === 'fade') {\r\n this.overlay.style.opacity = '0'\r\n } else if (animation === 'slide') {\r\n this.overlay.style.transform = 'translateY(-20px)'\r\n this.overlay.style.opacity = '0'\r\n }\r\n\r\n await this.sleep(350)\r\n }\r\n\r\n // ─── UI Helpers ──────────────────────────────────────────────────────────────\r\n\r\n private showToast(message: string): void {\r\n const toast = document.createElement('div')\r\n toast.textContent = message\r\n Object.assign(toast.style, {\r\n position: 'absolute',\r\n bottom: '12px',\r\n left: '50%',\r\n transform: 'translateX(-50%)',\r\n background: 'rgba(0,0,0,0.7)',\r\n color: '#fff',\r\n padding: '6px 12px',\r\n borderRadius: '6px',\r\n fontSize: '12px',\r\n whiteSpace: 'nowrap',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease',\r\n pointerEvents: 'none',\r\n })\r\n\r\n this.overlay?.appendChild(toast)\r\n requestAnimationFrame(() => { toast.style.opacity = '1' })\r\n\r\n setTimeout(() => {\r\n toast.style.opacity = '0'\r\n setTimeout(() => toast.remove(), 300)\r\n }, 2000)\r\n }\r\n\r\n private showCompletionOverlay(): void {\r\n const el = document.createElement('div')\r\n el.textContent = '\\u2713 Done! Loading complete.'\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n inset: '0',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n background: 'rgba(0,0,0,0.6)',\r\n color: '#fff',\r\n fontSize: '18px',\r\n fontWeight: 'bold',\r\n fontFamily: 'system-ui, sans-serif',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease',\r\n })\r\n this.overlay?.appendChild(el)\r\n requestAnimationFrame(() => { el.style.opacity = '1' })\r\n }\r\n\r\n private showReducedMotionFallback(theme: ReturnType<typeof resolveTheme>): void {\r\n if (!this.canvas) return\r\n const ctx = this.canvas.getContext('2d')!\r\n const W = this.canvas.width\r\n const H = this.canvas.height\r\n ctx.fillStyle = theme.background\r\n ctx.fillRect(0, 0, W, H)\r\n ctx.fillStyle = theme.primary\r\n ctx.font = '16px system-ui'\r\n ctx.textAlign = 'center'\r\n ctx.fillText('Loading\\u2026', W / 2, H / 2)\r\n this.setState('playing')\r\n }\r\n\r\n // ─── Score Handling ───────────────────────────────────────────────────────────\r\n\r\n private handleGameOverEvent(game: Exclude<GameName, 'random'>): void {\r\n const duration = Date.now() - this._gameStartTime\r\n const personalBest = getPersonalBest(game, this.options.namespace)\r\n this.callbacks.onGameOver({\r\n game,\r\n finalScore: this._currentScore,\r\n duration,\r\n isNewRecord: this._currentScore > personalBest,\r\n })\r\n }\r\n\r\n private handleScoreUpdate(score: number, game: Exclude<GameName, 'random'>): void {\r\n this._currentScore = score\r\n const personalBest = getPersonalBest(game, this.options.namespace)\r\n let isNewRecord = false\r\n\r\n if (this.options.saveScores !== false && score > personalBest) {\r\n isNewRecord = saveScore(game, score, this.options.namespace)\r\n }\r\n\r\n this.callbacks.onScore({ game, current: score, personalBest: Math.max(score, personalBest), isNewRecord })\r\n\r\n if (isNewRecord) this.showNewRecordBadge()\r\n }\r\n\r\n private showNewRecordBadge(): void {\r\n const badge = document.createElement('div')\r\n badge.textContent = '\\uD83C\\uDFC6 New Record!'\r\n Object.assign(badge.style, {\r\n position: 'absolute',\r\n top: '12px',\r\n left: '50%',\r\n transform: 'translateX(-50%) scale(0.8)',\r\n background: 'gold',\r\n color: '#000',\r\n padding: '4px 10px',\r\n borderRadius: '6px',\r\n fontSize: '12px',\r\n fontWeight: 'bold',\r\n fontFamily: 'system-ui, sans-serif',\r\n opacity: '0',\r\n transition: 'opacity 300ms ease, transform 300ms ease',\r\n pointerEvents: 'none',\r\n })\r\n this.overlay?.appendChild(badge)\r\n requestAnimationFrame(() => {\r\n badge.style.opacity = '1'\r\n badge.style.transform = 'translateX(-50%) scale(1)'\r\n })\r\n setTimeout(() => {\r\n badge.style.opacity = '0'\r\n setTimeout(() => badge.remove(), 300)\r\n }, 2500)\r\n }\r\n\r\n // ─── Dynamic Imports ──────────────────────────────────────────────────────────\r\n\r\n private async loadGameChunk(name: Exclude<GameName, 'random'>): Promise<new (onScore?: (s: number) => void, onGameOver?: () => void) => GamePlugin> {\r\n switch (name) {\r\n case 'snake':\r\n return (await import('./games/snake/index.js')).SnakeGame\r\n case 'brick-breaker':\r\n return (await import('./games/brick-breaker/index.js')).BrickBreakerGame\r\n case 'flappy':\r\n return (await import('./games/flappy/index.js')).FlappyGame\r\n case '2048':\r\n return (await import('./games/2048/index.js')).Game2048\r\n case 'wordle-lite':\r\n return (await import('./games/wordle-lite/index.js')).WordleLiteGame\r\n case 'asteroids':\r\n return (await import('./games/asteroids/index.js')).AsteroidsGame\r\n case 'memory-cards':\r\n return (await import('./games/memory-cards/index.js')).MemoryCardsGame\r\n case 'whack-a-mole':\r\n return (await import('./games/whack-a-mole/index.js')).WhackAMoleGame\r\n default:\r\n throw new Error(`Unknown game: ${name}`)\r\n }\r\n }\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\n private resolveGameName(name: GameName): Exclude<GameName, 'random'> {\r\n if (name !== 'random') return name\r\n const games: Exclude<GameName, 'random'>[] = [\r\n 'snake', 'brick-breaker', 'flappy', '2048',\r\n 'wordle-lite', 'asteroids', 'memory-cards', 'whack-a-mole',\r\n ]\r\n return games[Math.floor(Math.random() * games.length)]!\r\n }\r\n\r\n private setState(state: GameState): void {\r\n this.state = state\r\n }\r\n\r\n private handleVisibilityChange(): void {\r\n if (!this.currentGame) return\r\n if (document.visibilityState === 'hidden') {\r\n this.currentGame.pause()\r\n } else if (this.state === 'playing') {\r\n this.currentGame.resume()\r\n }\r\n }\r\n\r\n private sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms))\r\n }\r\n}\r\n","/**\r\n * Intelligent delay system.\r\n * \r\n * Rules:\r\n * - Don't show the game if loading completes before `delay` ms (prevents flash)\r\n * - Once shown, keep the game visible for at least `minDisplay` ms\r\n * - When loading completes, transition to the exit animation\r\n */\r\n\r\nexport interface DelayOptions {\r\n /** Milliseconds to wait before showing the game. @default 800 */\r\n delay: number\r\n /** Minimum milliseconds to show the game once visible. @default 0 */\r\n minDisplay: number\r\n /** Called when the game should become visible */\r\n onShow: () => void\r\n /** Called when the game should start exiting */\r\n onExit: () => void\r\n}\r\n\r\nexport class DelayController {\r\n private delayTimer: ReturnType<typeof setTimeout> | null = null\r\n private minDisplayTimer: ReturnType<typeof setTimeout> | null = null\r\n private showTime: number | null = null\r\n private loadingCompletedWhileDelaying = false\r\n private isVisible = false\r\n private destroyed = false\r\n\r\n constructor(private options: DelayOptions) {}\r\n\r\n /**\r\n * Called when loading starts (active = true).\r\n * Starts the delay timer.\r\n */\r\n start(): void {\r\n if (this.destroyed) return\r\n this.loadingCompletedWhileDelaying = false\r\n\r\n this.delayTimer = setTimeout(() => {\r\n this.delayTimer = null // timer has fired — clear the reference\r\n if (this.destroyed) return\r\n\r\n if (this.loadingCompletedWhileDelaying) {\r\n // Loading completed during delay — don't show game\r\n return\r\n }\r\n\r\n this.isVisible = true\r\n this.showTime = Date.now()\r\n this.options.onShow()\r\n }, this.options.delay)\r\n }\r\n\r\n /**\r\n * Called when loading ends (active = false).\r\n * Either cancels the delay (if still waiting) or triggers exit with minDisplay logic.\r\n */\r\n end(): void {\r\n if (this.destroyed) return\r\n\r\n if (this.delayTimer !== null) {\r\n // Still in delay period — cancel and never show\r\n clearTimeout(this.delayTimer)\r\n this.delayTimer = null\r\n this.loadingCompletedWhileDelaying = true\r\n return\r\n }\r\n\r\n if (!this.isVisible) return\r\n\r\n const elapsed = Date.now() - (this.showTime ?? 0)\r\n const remaining = this.options.minDisplay - elapsed\r\n\r\n if (remaining <= 0) {\r\n // minDisplay already elapsed — exit immediately\r\n this.triggerExit()\r\n } else {\r\n // Wait for minDisplay remainder\r\n this.minDisplayTimer = setTimeout(() => {\r\n if (!this.destroyed) this.triggerExit()\r\n }, remaining)\r\n }\r\n }\r\n\r\n private triggerExit(): void {\r\n this.isVisible = false\r\n this.options.onExit()\r\n }\r\n\r\n /** Clean up all timers. */\r\n destroy(): void {\r\n this.destroyed = true\r\n if (this.delayTimer !== null) {\r\n clearTimeout(this.delayTimer)\r\n this.delayTimer = null\r\n }\r\n if (this.minDisplayTimer !== null) {\r\n clearTimeout(this.minDisplayTimer)\r\n this.minDisplayTimer = null\r\n }\r\n }\r\n}\r\n","/**\r\n * Score persistence layer.\r\n * Stores personal bests per game in localStorage under the 'loading-games' namespace.\r\n */\r\n\r\nimport type { GameName } from './types.js'\r\n\r\nconst STORAGE_KEY = 'loading-games:scores'\r\n\r\ninterface ScoreEntry {\r\n personalBest: number\r\n lastPlayed: string // ISO date string\r\n totalGames: number\r\n}\r\n\r\ntype ScoreStore = Record<string, ScoreEntry>\r\n\r\nfunction readStore(): ScoreStore {\r\n if (typeof window === 'undefined' || !window.localStorage) return {}\r\n try {\r\n const raw = localStorage.getItem(STORAGE_KEY)\r\n return raw ? (JSON.parse(raw) as ScoreStore) : {}\r\n } catch {\r\n return {}\r\n }\r\n}\r\n\r\nfunction writeStore(store: ScoreStore): void {\r\n if (typeof window === 'undefined' || !window.localStorage) return\r\n try {\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(store))\r\n } catch {\r\n // Quota exceeded or private browsing — fail silently\r\n }\r\n}\r\n\r\n/**\r\n * Build the storage key for a game, optionally scoped by namespace.\r\n */\r\nfunction buildKey(game: Exclude<GameName, 'random'>, namespace?: string): string {\r\n return namespace ? `${namespace}:${game}` : game\r\n}\r\n\r\n/**\r\n * Get the personal best for a game.\r\n * Returns 0 if no score has been recorded.\r\n */\r\nexport function getPersonalBest(\r\n game: Exclude<GameName, 'random'>,\r\n namespace?: string\r\n): number {\r\n const store = readStore()\r\n const key = buildKey(game, namespace)\r\n return store[key]?.personalBest ?? 0\r\n}\r\n\r\n/**\r\n * Save a new score. Returns true if this is a new personal best.\r\n */\r\nexport function saveScore(\r\n game: Exclude<GameName, 'random'>,\r\n score: number,\r\n namespace?: string\r\n): boolean {\r\n const store = readStore()\r\n const key = buildKey(game, namespace)\r\n const existing = store[key]\r\n\r\n const isNewRecord = score > (existing?.personalBest ?? 0)\r\n\r\n store[key] = {\r\n personalBest: isNewRecord ? score : (existing?.personalBest ?? 0),\r\n lastPlayed: new Date().toISOString(),\r\n totalGames: (existing?.totalGames ?? 0) + 1,\r\n }\r\n\r\n writeStore(store)\r\n return isNewRecord\r\n}\r\n\r\n/**\r\n * Get all scores, optionally filtered by namespace.\r\n */\r\nexport function getAllScores(namespace?: string): Record<string, ScoreEntry> {\r\n const store = readStore()\r\n if (!namespace) return store\r\n\r\n return Object.fromEntries(\r\n Object.entries(store).filter(([key]) => key.startsWith(`${namespace}:`))\r\n )\r\n}\r\n\r\n/**\r\n * Clear all scores, optionally scoped to a namespace.\r\n */\r\nexport function clearScores(namespace?: string): void {\r\n if (!namespace) {\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n localStorage.removeItem(STORAGE_KEY)\r\n }\r\n return\r\n }\r\n\r\n const store = readStore()\r\n const prefix = `${namespace}:`\r\n const filtered = Object.fromEntries(\r\n Object.entries(store).filter(([key]) => !key.startsWith(prefix))\r\n )\r\n writeStore(filtered)\r\n}\r\n","/**\r\n * <loading-game> Web Component\r\n *\r\n * Registers a custom element that wraps the GameController.\r\n * Works in any framework or plain HTML.\r\n *\r\n * @example HTML\r\n * <loading-game game=\"snake\" active=\"true\" theme-primary=\"#6366F1\"></loading-game>\r\n *\r\n * @example Imperative JS\r\n * const el = document.querySelector('loading-game')\r\n * el.start()\r\n * el.stop()\r\n * el.setTheme({ primary: '#E94560' })\r\n */\r\n\r\nimport type { GameName, GameSize, ExitAnimation, ThemeObject, LoadingGameOptions } from './types.js'\r\nimport { GameController } from './controller.js'\r\n\r\nexport class LoadingGameElement extends HTMLElement {\r\n static observedAttributes = [\r\n 'game',\r\n 'active',\r\n 'size',\r\n 'delay',\r\n 'min-display',\r\n 'exit-animation',\r\n 'save-scores',\r\n 'namespace',\r\n ]\r\n\r\n private controller: GameController | null = null\r\n private _theme: ThemeObject = {}\r\n\r\n // ─── Lifecycle ────────────────────────────────────────────────────────────\r\n\r\n connectedCallback(): void {\r\n this.setAttribute('role', 'region')\r\n this.setAttribute('aria-label', 'Loading game')\r\n\r\n this.controller = new GameController(this, {\r\n onScore: (score) => this.dispatchEvent(new CustomEvent('lg:score', { detail: score, bubbles: true })),\r\n onGameOver: (result) => this.dispatchEvent(new CustomEvent('lg:gameover', { detail: result, bubbles: true })),\r\n onComplete: () => this.dispatchEvent(new CustomEvent('lg:complete', { bubbles: true })),\r\n onError: (err) => {\r\n this.controller?.errorDeactivate()\r\n this.dispatchEvent(new CustomEvent('lg:error', { detail: err, bubbles: true }))\r\n },\r\n })\r\n\r\n if (this.getAttribute('active') === 'true') {\r\n this.controller.activate(this.buildOptions())\r\n }\r\n }\r\n\r\n disconnectedCallback(): void {\r\n this.controller?.destroy()\r\n this.controller = null\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\r\n if (oldValue === newValue || !this.controller) return\r\n\r\n if (name === 'active') {\r\n if (newValue === 'true') {\r\n this.controller.activate(this.buildOptions())\r\n } else {\r\n this.controller.deactivate({ animation: this.getExitAnimation() })\r\n }\r\n } else {\r\n // For other attribute changes, update the controller options\r\n this.controller.updateOptions(this.buildOptions())\r\n }\r\n }\r\n\r\n // ─── Property Setter for theme (object — can't be an attribute) ───────────\r\n\r\n set theme(value: ThemeObject) {\r\n this._theme = value\r\n this.controller?.updateOptions(this.buildOptions())\r\n }\r\n\r\n get theme(): ThemeObject {\r\n return this._theme\r\n }\r\n\r\n // ─── Imperative API ───────────────────────────────────────────────────────\r\n\r\n /** Start the game manually. Equivalent to setting active=\"true\". */\r\n start(): void {\r\n this.setAttribute('active', 'true')\r\n }\r\n\r\n /** Stop the game manually. Equivalent to setting active=\"false\". */\r\n stop(): void {\r\n this.removeAttribute('active')\r\n }\r\n\r\n /** Update the theme dynamically. */\r\n setTheme(theme: ThemeObject): void {\r\n this.theme = theme\r\n }\r\n\r\n // ─── Helpers ──────────────────────────────────────────────────────────────\r\n\r\n private buildOptions(): LoadingGameOptions {\r\n const game = (this.getAttribute('game') ?? 'random') as GameName\r\n const size = (this.getAttribute('size') ?? 'md') as GameSize\r\n const delay = parseInt(this.getAttribute('delay') ?? '800', 10)\r\n const minDisplay = parseInt(this.getAttribute('min-display') ?? '0', 10)\r\n const exitAnimation = (this.getAttribute('exit-animation') ?? 'fade') as ExitAnimation\r\n const saveScores = this.getAttribute('save-scores') !== 'false'\r\n const namespace = this.getAttribute('namespace') ?? undefined\r\n\r\n return {\r\n game,\r\n size,\r\n delay,\r\n minDisplay,\r\n exitAnimation,\r\n saveScores,\r\n namespace,\r\n theme: this._theme,\r\n }\r\n }\r\n\r\n private getExitAnimation(): ExitAnimation {\r\n return (this.getAttribute('exit-animation') ?? 'fade') as ExitAnimation\r\n }\r\n}\r\n","/**\r\n * loading-games — Main entry point\r\n *\r\n * Exports the Web Component, types, and utilities.\r\n * Auto-registers <loading-game> custom element on import.\r\n */\r\n\r\nexport { LoadingGameElement } from './component.js'\r\nexport { GameController } from './controller.js'\r\n\r\n// Types\r\nexport type {\r\n GameName,\r\n GameSize,\r\n ExitAnimation,\r\n ThemeObject,\r\n Score,\r\n GameResult,\r\n LoadingGameOptions,\r\n GamePlugin,\r\n GameState,\r\n ResolvedTheme,\r\n} from './types.js'\r\n\r\n// Utilities\r\nexport { resolveTheme, applyThemeToElement } from './theme.js'\r\nexport { getPersonalBest, saveScore, getAllScores, clearScores } from './scores.js'\r\nexport { DelayController } from './delay.js'\r\nexport { Dpad } from './dpad.js'\r\nexport type { DpadDirection, DpadOptions } from './dpad.js'\r\n\r\n// Auto-register custom element\r\nimport { LoadingGameElement } from './component.js'\r\n\r\nif (typeof customElements !== 'undefined' && !customElements.get('loading-game')) {\r\n customElements.define('loading-game', LoadingGameElement)\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var P=(n,t)=>{for(var a in t)l(n,a,{get:t[a],enumerable:!0})},b=(n,t,a,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of M(t))!O.call(n,r)&&r!==a&&l(n,r,{get:()=>t[r],enumerable:!(o=H(t,r))||o.enumerable});return n};var C=n=>b(l({},"__esModule",{value:!0}),n);var j={};P(j,{LoadingGame:()=>L});module.exports=C(j);var i=require("react"),N=require("../index.js"),G=require("react/jsx-runtime");function L({game:n="random",active:t=!1,theme:a,size:o="md",delay:r=800,minDisplay:y=0,exitAnimation:R="fade",saveScores:S=!0,namespace:x,onScore:d,onGameOver:c,onComplete:g,onError:p,className:T,style:h}){let m=(0,i.useRef)(null);return(0,i.useEffect)(()=>{let e=m.current;e&&a&&(e.theme=a)},[a]),(0,i.useEffect)(()=>{let e=m.current;if(!e)return;let v=s=>d?.(s.detail),f=s=>c?.(s.detail),u=()=>g?.(),E=s=>p?.(s.detail);return e.addEventListener("lg:score",v),e.addEventListener("lg:gameover",f),e.addEventListener("lg:complete",u),e.addEventListener("lg:error",E),()=>{e.removeEventListener("lg:score",v),e.removeEventListener("lg:gameover",f),e.removeEventListener("lg:complete",u),e.removeEventListener("lg:error",E)}},[d,c,g,p]),(0,G.jsx)("loading-game",{ref:m,game:n==="random"?"random":n,active:t?"true":void 0,size:o,delay:String(r),"min-display":String(y),"exit-animation":R,"save-scores":S?"true":"false",namespace:x,className:T,style:h})}0&&(module.exports={LoadingGame});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/index.ts","../../src/react/LoadingGame.tsx"],"sourcesContent":["export { LoadingGame, type LoadingGameProps } from './LoadingGame.js'\r\n\r\n// Re-export types for convenience\r\nexport type {\r\n GameName,\r\n GameSize,\r\n ExitAnimation,\r\n ThemeObject,\r\n LoadingGameOptions,\r\n Score,\r\n GameResult,\r\n} from '../types.js'\r\n","/**\r\n * React wrapper for loading-games\r\n * \r\n * @example\r\n * import { LoadingGame } from 'loading-games/react'\r\n * \r\n * <LoadingGame\r\n * game=\"snake\"\r\n * active={isLoading}\r\n * theme={{ primary: '#6366F1', background: '#0F0F0F' }}\r\n * onScore={(score) => console.log(score)}\r\n * />\r\n */\r\n\r\nimport { useEffect, useRef } from 'react'\r\nimport type { LoadingGameOptions, Score, GameResult } from '../types.js'\r\n\r\n// Ensure the web component is registered\r\nimport '../index.js'\r\n\r\n// Extend JSX for the custom element\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'loading-game': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {\r\n game?: string\r\n active?: string\r\n size?: string\r\n delay?: string\r\n 'min-display'?: string\r\n 'exit-animation'?: string\r\n 'save-scores'?: string\r\n namespace?: string\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport interface LoadingGameProps extends LoadingGameOptions {\r\n className?: string\r\n style?: React.CSSProperties\r\n}\r\n\r\n/**\r\n * React component that renders a playable mini-game during loading states.\r\n * \r\n * @param active - Controls whether the game is shown. Set true when loading begins.\r\n * @param game - Which game to render. Defaults to 'random'.\r\n */\r\nexport function LoadingGame({\r\n game = 'random',\r\n active = false,\r\n theme,\r\n size = 'md',\r\n delay = 800,\r\n minDisplay = 0,\r\n exitAnimation = 'fade',\r\n saveScores = true,\r\n namespace,\r\n onScore,\r\n onGameOver,\r\n onComplete,\r\n onError,\r\n className,\r\n style,\r\n}: LoadingGameProps) {\r\n const ref = useRef<HTMLElement>(null)\r\n\r\n // Sync object props and callbacks via ref (can't pass objects as attributes)\r\n useEffect(() => {\r\n const el = ref.current\r\n if (!el) return\r\n\r\n // Set theme object as property (not attribute)\r\n if (theme) {\r\n (el as unknown as { theme: typeof theme }).theme = theme\r\n }\r\n }, [theme])\r\n\r\n // Attach event listeners for callbacks\r\n useEffect(() => {\r\n const el = ref.current\r\n if (!el) return\r\n\r\n const handleScore = (e: Event) => onScore?.((e as CustomEvent<Score>).detail)\r\n const handleGameOver = (e: Event) => onGameOver?.((e as CustomEvent<GameResult>).detail)\r\n const handleComplete = () => onComplete?.()\r\n const handleError = (e: Event) => onError?.((e as CustomEvent<Error>).detail)\r\n\r\n el.addEventListener('lg:score', handleScore)\r\n el.addEventListener('lg:gameover', handleGameOver)\r\n el.addEventListener('lg:complete', handleComplete)\r\n el.addEventListener('lg:error', handleError)\r\n\r\n return () => {\r\n el.removeEventListener('lg:score', handleScore)\r\n el.removeEventListener('lg:gameover', handleGameOver)\r\n el.removeEventListener('lg:complete', handleComplete)\r\n el.removeEventListener('lg:error', handleError)\r\n }\r\n }, [onScore, onGameOver, onComplete, onError])\r\n\r\n return (\r\n <loading-game\r\n ref={ref as React.RefObject<HTMLElement>}\r\n game={game === 'random' ? 'random' : game}\r\n active={active ? 'true' : undefined}\r\n size={size}\r\n delay={String(delay)}\r\n min-display={String(minDisplay)}\r\n exit-animation={exitAnimation}\r\n save-scores={saveScores ? 'true' : 'false'}\r\n namespace={namespace}\r\n className={className}\r\n style={style}\r\n />\r\n )\r\n}\r\n\r\nexport default LoadingGame\r\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GCcA,IAAAI,EAAkC,iBAIlCC,EAAO,uBAsFHC,EAAA,6BAtDG,SAASC,EAAY,CAC1B,KAAAC,EAAO,SACP,OAAAC,EAAS,GACT,MAAAC,EACA,KAAAC,EAAO,KACP,MAAAC,EAAQ,IACR,WAAAC,EAAa,EACb,cAAAC,EAAgB,OAChB,WAAAC,EAAa,GACb,UAAAC,EACA,QAAAC,EACA,WAAAC,EACA,WAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAAqB,CACnB,IAAMC,KAAM,UAAoB,IAAI,EAGpC,sBAAU,IAAM,CACd,IAAMC,EAAKD,EAAI,QACVC,GAGDd,IACDc,EAA0C,MAAQd,EAEvD,EAAG,CAACA,CAAK,CAAC,KAGV,aAAU,IAAM,CACd,IAAMc,EAAKD,EAAI,QACf,GAAI,CAACC,EAAI,OAET,IAAMC,EAAeC,GAAaT,IAAWS,EAAyB,MAAM,EACtEC,EAAkBD,GAAaR,IAAcQ,EAA8B,MAAM,EACjFE,EAAiB,IAAMT,IAAa,EACpCU,EAAeH,GAAaN,IAAWM,EAAyB,MAAM,EAE5E,OAAAF,EAAG,iBAAiB,WAAYC,CAAW,EAC3CD,EAAG,iBAAiB,cAAeG,CAAc,EACjDH,EAAG,iBAAiB,cAAeI,CAAc,EACjDJ,EAAG,iBAAiB,WAAYK,CAAW,EAEpC,IAAM,CACXL,EAAG,oBAAoB,WAAYC,CAAW,EAC9CD,EAAG,oBAAoB,cAAeG,CAAc,EACpDH,EAAG,oBAAoB,cAAeI,CAAc,EACpDJ,EAAG,oBAAoB,WAAYK,CAAW,CAChD,CACF,EAAG,CAACZ,EAASC,EAAYC,EAAYC,CAAO,CAAC,KAG3C,OAAC,gBACC,IAAKG,EACL,KAAMf,IAAS,SAAW,SAAWA,EACrC,OAAQC,EAAS,OAAS,OAC1B,KAAME,EACN,MAAO,OAAOC,CAAK,EACnB,cAAa,OAAOC,CAAU,EAC9B,iBAAgBC,EAChB,cAAaC,EAAa,OAAS,QACnC,UAAWC,EACX,UAAWK,EACX,MAAOC,EACT,CAEJ","names":["react_exports","__export","LoadingGame","__toCommonJS","import_react","import__","import_jsx_runtime","LoadingGame","game","active","theme","size","delay","minDisplay","exitAnimation","saveScores","namespace","onScore","onGameOver","onComplete","onError","className","style","ref","el","handleScore","e","handleGameOver","handleComplete","handleError"]}
@@ -0,0 +1,33 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { LoadingGameOptions } from '../../types.js';
3
+ export { ExitAnimation, GameName, GameResult, GameSize, LoadingGameOptions, Score, ThemeObject } from '../../types.js';
4
+
5
+ declare global {
6
+ namespace JSX {
7
+ interface IntrinsicElements {
8
+ 'loading-game': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
9
+ game?: string;
10
+ active?: string;
11
+ size?: string;
12
+ delay?: string;
13
+ 'min-display'?: string;
14
+ 'exit-animation'?: string;
15
+ 'save-scores'?: string;
16
+ namespace?: string;
17
+ };
18
+ }
19
+ }
20
+ }
21
+ interface LoadingGameProps extends LoadingGameOptions {
22
+ className?: string;
23
+ style?: React.CSSProperties;
24
+ }
25
+ /**
26
+ * React component that renders a playable mini-game during loading states.
27
+ *
28
+ * @param active - Controls whether the game is shown. Set true when loading begins.
29
+ * @param game - Which game to render. Defaults to 'random'.
30
+ */
31
+ declare function LoadingGame({ game, active, theme, size, delay, minDisplay, exitAnimation, saveScores, namespace, onScore, onGameOver, onComplete, onError, className, style, }: LoadingGameProps): react_jsx_runtime.JSX.Element;
32
+
33
+ export { LoadingGame, type LoadingGameProps };
@@ -0,0 +1,33 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { LoadingGameOptions } from '../../types.js';
3
+ export { ExitAnimation, GameName, GameResult, GameSize, LoadingGameOptions, Score, ThemeObject } from '../../types.js';
4
+
5
+ declare global {
6
+ namespace JSX {
7
+ interface IntrinsicElements {
8
+ 'loading-game': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {
9
+ game?: string;
10
+ active?: string;
11
+ size?: string;
12
+ delay?: string;
13
+ 'min-display'?: string;
14
+ 'exit-animation'?: string;
15
+ 'save-scores'?: string;
16
+ namespace?: string;
17
+ };
18
+ }
19
+ }
20
+ }
21
+ interface LoadingGameProps extends LoadingGameOptions {
22
+ className?: string;
23
+ style?: React.CSSProperties;
24
+ }
25
+ /**
26
+ * React component that renders a playable mini-game during loading states.
27
+ *
28
+ * @param active - Controls whether the game is shown. Set true when loading begins.
29
+ * @param game - Which game to render. Defaults to 'random'.
30
+ */
31
+ declare function LoadingGame({ game, active, theme, size, delay, minDisplay, exitAnimation, saveScores, namespace, onScore, onGameOver, onComplete, onError, className, style, }: LoadingGameProps): react_jsx_runtime.JSX.Element;
32
+
33
+ export { LoadingGame, type LoadingGameProps };
@@ -0,0 +1,2 @@
1
+ import{useEffect as p,useRef as x}from"react";import"../index.js";import{jsx as h}from"react/jsx-runtime";function T({game:r="random",active:v=!1,theme:n,size:f="md",delay:u=800,minDisplay:E=0,exitAnimation:L="fade",saveScores:G=!0,namespace:y,onScore:s,onGameOver:i,onComplete:o,onError:m,className:R,style:S}){let a=x(null);return p(()=>{let e=a.current;e&&n&&(e.theme=n)},[n]),p(()=>{let e=a.current;if(!e)return;let l=t=>s?.(t.detail),d=t=>i?.(t.detail),c=()=>o?.(),g=t=>m?.(t.detail);return e.addEventListener("lg:score",l),e.addEventListener("lg:gameover",d),e.addEventListener("lg:complete",c),e.addEventListener("lg:error",g),()=>{e.removeEventListener("lg:score",l),e.removeEventListener("lg:gameover",d),e.removeEventListener("lg:complete",c),e.removeEventListener("lg:error",g)}},[s,i,o,m]),h("loading-game",{ref:a,game:r==="random"?"random":r,active:v?"true":void 0,size:f,delay:String(u),"min-display":String(E),"exit-animation":L,"save-scores":G?"true":"false",namespace:y,className:R,style:S})}export{T as LoadingGame};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/LoadingGame.tsx"],"sourcesContent":["/**\r\n * React wrapper for loading-games\r\n * \r\n * @example\r\n * import { LoadingGame } from 'loading-games/react'\r\n * \r\n * <LoadingGame\r\n * game=\"snake\"\r\n * active={isLoading}\r\n * theme={{ primary: '#6366F1', background: '#0F0F0F' }}\r\n * onScore={(score) => console.log(score)}\r\n * />\r\n */\r\n\r\nimport { useEffect, useRef } from 'react'\r\nimport type { LoadingGameOptions, Score, GameResult } from '../types.js'\r\n\r\n// Ensure the web component is registered\r\nimport '../index.js'\r\n\r\n// Extend JSX for the custom element\r\ndeclare global {\r\n // eslint-disable-next-line @typescript-eslint/no-namespace\r\n namespace JSX {\r\n interface IntrinsicElements {\r\n 'loading-game': React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> & {\r\n game?: string\r\n active?: string\r\n size?: string\r\n delay?: string\r\n 'min-display'?: string\r\n 'exit-animation'?: string\r\n 'save-scores'?: string\r\n namespace?: string\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport interface LoadingGameProps extends LoadingGameOptions {\r\n className?: string\r\n style?: React.CSSProperties\r\n}\r\n\r\n/**\r\n * React component that renders a playable mini-game during loading states.\r\n * \r\n * @param active - Controls whether the game is shown. Set true when loading begins.\r\n * @param game - Which game to render. Defaults to 'random'.\r\n */\r\nexport function LoadingGame({\r\n game = 'random',\r\n active = false,\r\n theme,\r\n size = 'md',\r\n delay = 800,\r\n minDisplay = 0,\r\n exitAnimation = 'fade',\r\n saveScores = true,\r\n namespace,\r\n onScore,\r\n onGameOver,\r\n onComplete,\r\n onError,\r\n className,\r\n style,\r\n}: LoadingGameProps) {\r\n const ref = useRef<HTMLElement>(null)\r\n\r\n // Sync object props and callbacks via ref (can't pass objects as attributes)\r\n useEffect(() => {\r\n const el = ref.current\r\n if (!el) return\r\n\r\n // Set theme object as property (not attribute)\r\n if (theme) {\r\n (el as unknown as { theme: typeof theme }).theme = theme\r\n }\r\n }, [theme])\r\n\r\n // Attach event listeners for callbacks\r\n useEffect(() => {\r\n const el = ref.current\r\n if (!el) return\r\n\r\n const handleScore = (e: Event) => onScore?.((e as CustomEvent<Score>).detail)\r\n const handleGameOver = (e: Event) => onGameOver?.((e as CustomEvent<GameResult>).detail)\r\n const handleComplete = () => onComplete?.()\r\n const handleError = (e: Event) => onError?.((e as CustomEvent<Error>).detail)\r\n\r\n el.addEventListener('lg:score', handleScore)\r\n el.addEventListener('lg:gameover', handleGameOver)\r\n el.addEventListener('lg:complete', handleComplete)\r\n el.addEventListener('lg:error', handleError)\r\n\r\n return () => {\r\n el.removeEventListener('lg:score', handleScore)\r\n el.removeEventListener('lg:gameover', handleGameOver)\r\n el.removeEventListener('lg:complete', handleComplete)\r\n el.removeEventListener('lg:error', handleError)\r\n }\r\n }, [onScore, onGameOver, onComplete, onError])\r\n\r\n return (\r\n <loading-game\r\n ref={ref as React.RefObject<HTMLElement>}\r\n game={game === 'random' ? 'random' : game}\r\n active={active ? 'true' : undefined}\r\n size={size}\r\n delay={String(delay)}\r\n min-display={String(minDisplay)}\r\n exit-animation={exitAnimation}\r\n save-scores={saveScores ? 'true' : 'false'}\r\n namespace={namespace}\r\n className={className}\r\n style={style}\r\n />\r\n )\r\n}\r\n\r\nexport default LoadingGame\r\n"],"mappings":"AAcA,OAAS,aAAAA,EAAW,UAAAC,MAAc,QAIlC,MAAO,cAsFH,cAAAC,MAAA,oBAtDG,SAASC,EAAY,CAC1B,KAAAC,EAAO,SACP,OAAAC,EAAS,GACT,MAAAC,EACA,KAAAC,EAAO,KACP,MAAAC,EAAQ,IACR,WAAAC,EAAa,EACb,cAAAC,EAAgB,OAChB,WAAAC,EAAa,GACb,UAAAC,EACA,QAAAC,EACA,WAAAC,EACA,WAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,CACF,EAAqB,CACnB,IAAMC,EAAMlB,EAAoB,IAAI,EAGpC,OAAAD,EAAU,IAAM,CACd,IAAMoB,EAAKD,EAAI,QACVC,GAGDd,IACDc,EAA0C,MAAQd,EAEvD,EAAG,CAACA,CAAK,CAAC,EAGVN,EAAU,IAAM,CACd,IAAMoB,EAAKD,EAAI,QACf,GAAI,CAACC,EAAI,OAET,IAAMC,EAAeC,GAAaT,IAAWS,EAAyB,MAAM,EACtEC,EAAkBD,GAAaR,IAAcQ,EAA8B,MAAM,EACjFE,EAAiB,IAAMT,IAAa,EACpCU,EAAeH,GAAaN,IAAWM,EAAyB,MAAM,EAE5E,OAAAF,EAAG,iBAAiB,WAAYC,CAAW,EAC3CD,EAAG,iBAAiB,cAAeG,CAAc,EACjDH,EAAG,iBAAiB,cAAeI,CAAc,EACjDJ,EAAG,iBAAiB,WAAYK,CAAW,EAEpC,IAAM,CACXL,EAAG,oBAAoB,WAAYC,CAAW,EAC9CD,EAAG,oBAAoB,cAAeG,CAAc,EACpDH,EAAG,oBAAoB,cAAeI,CAAc,EACpDJ,EAAG,oBAAoB,WAAYK,CAAW,CAChD,CACF,EAAG,CAACZ,EAASC,EAAYC,EAAYC,CAAO,CAAC,EAG3Cd,EAAC,gBACC,IAAKiB,EACL,KAAMf,IAAS,SAAW,SAAWA,EACrC,OAAQC,EAAS,OAAS,OAC1B,KAAME,EACN,MAAO,OAAOC,CAAK,EACnB,cAAa,OAAOC,CAAU,EAC9B,iBAAgBC,EAChB,cAAaC,EAAa,OAAS,QACnC,UAAWC,EACX,UAAWK,EACX,MAAOC,EACT,CAEJ","names":["useEffect","useRef","jsx","LoadingGame","game","active","theme","size","delay","minDisplay","exitAnimation","saveScores","namespace","onScore","onGameOver","onComplete","onError","className","style","ref","el","handleScore","e","handleGameOver","handleComplete","handleError"]}
@@ -0,0 +1,88 @@
1
+ import { GameName, GameSize, ExitAnimation, ThemeObject, Score, GameResult } from '../../types.js';
2
+ export { ExitAnimation, GameName, GameResult, GameSize, LoadingGameOptions, Score, ThemeObject } from '../../types.js';
3
+
4
+ /**
5
+ * Svelte wrapper for loading-games
6
+ *
7
+ * Provides a Svelte action and a factory function for programmatic control.
8
+ * Svelte handles custom elements natively, so the <loading-game> element
9
+ * can also be used directly in templates after importing this module.
10
+ *
11
+ * @example Using the Svelte action
12
+ * <script>
13
+ * import { loadingGame } from 'loading-games/svelte'
14
+ * let active = false
15
+ * </script>
16
+ * <div use:loadingGame={{ game: 'snake', active }}>
17
+ *
18
+ * @example Direct web component usage
19
+ * <script>
20
+ * import 'loading-games/svelte'
21
+ * let active = false
22
+ * </script>
23
+ * <loading-game game="snake" active={active ? 'true' : undefined} />
24
+ */
25
+
26
+ interface LoadingGameActionOptions {
27
+ /** Which game to render. @default 'random' */
28
+ game?: GameName;
29
+ /** Controls whether the game is shown. @default false */
30
+ active?: boolean;
31
+ /** Container size preset. @default 'md' */
32
+ size?: GameSize;
33
+ /** Milliseconds before showing the game. @default 800 */
34
+ delay?: number;
35
+ /** Minimum display time once game appears. @default 0 */
36
+ minDisplay?: number;
37
+ /** Exit animation style. @default 'fade' */
38
+ exitAnimation?: ExitAnimation;
39
+ /** Persist scores to localStorage. @default true */
40
+ saveScores?: boolean;
41
+ /** Score storage namespace. */
42
+ namespace?: string;
43
+ /** Theme overrides. */
44
+ theme?: ThemeObject;
45
+ /** Fires on every score change. */
46
+ onScore?: (score: Score) => void;
47
+ /** Fires when a game round ends. */
48
+ onGameOver?: (result: GameResult) => void;
49
+ /** Fires when loading completes and game exits. */
50
+ onComplete?: () => void;
51
+ /** Fires on error. */
52
+ onError?: (err: Error) => void;
53
+ }
54
+ /**
55
+ * Svelte action that creates and manages a <loading-game> element.
56
+ *
57
+ * @example
58
+ * <div use:loadingGame={{ game: 'snake', active: isLoading }} />
59
+ */
60
+ declare function loadingGame(node: HTMLElement, options?: LoadingGameActionOptions): {
61
+ update(newOptions: LoadingGameActionOptions): void;
62
+ destroy(): void;
63
+ };
64
+ interface LoadingGameInstance {
65
+ /** Start the game (set active=true). */
66
+ start: () => void;
67
+ /** Stop the game (set active=false). */
68
+ stop: () => void;
69
+ /** Update the theme at runtime. */
70
+ setTheme: (theme: ThemeObject) => void;
71
+ /** Remove the element and clean up. */
72
+ destroy: () => void;
73
+ /** The underlying <loading-game> element. */
74
+ element: HTMLElement;
75
+ }
76
+ /**
77
+ * Programmatically create a loading-game instance inside a container.
78
+ *
79
+ * @example
80
+ * const game = createLoadingGame(containerEl, { game: 'flappy' })
81
+ * game.start()
82
+ * // later...
83
+ * game.stop()
84
+ * game.destroy()
85
+ */
86
+ declare function createLoadingGame(container: HTMLElement, options?: LoadingGameActionOptions): LoadingGameInstance;
87
+
88
+ export { type LoadingGameActionOptions, type LoadingGameInstance, createLoadingGame, loadingGame };
@@ -0,0 +1,2 @@
1
+ import"../index.js";function v(r,e={}){let t=document.createElement("loading-game");m(t,e),e.theme&&(t.theme=e.theme);let a=i(t,e);return r.appendChild(t),{update(n){m(t,n),n.theme&&(t.theme=n.theme),o(t,a);let s=i(t,n);Object.assign(a,s),e=n},destroy(){o(t,a),t.remove()}}}function d(r,e={}){let t=document.createElement("loading-game");m(t,e),e.theme&&(t.theme=e.theme);let a=i(t,e);return r.appendChild(t),{start(){t.setAttribute("active","true")},stop(){t.removeAttribute("active")},setTheme(n){t.theme=n},destroy(){o(t,a),t.remove()},element:t}}function m(r,e){r.setAttribute("game",e.game??"random"),r.setAttribute("size",e.size??"md"),r.setAttribute("delay",String(e.delay??800)),r.setAttribute("min-display",String(e.minDisplay??0)),r.setAttribute("exit-animation",e.exitAnimation??"fade"),r.setAttribute("save-scores",e.saveScores??!0?"true":"false"),e.namespace?r.setAttribute("namespace",e.namespace):r.removeAttribute("namespace"),e.active?r.setAttribute("active","true"):r.removeAttribute("active")}function i(r,e){let t={score:a=>e.onScore?.(a.detail),gameover:a=>e.onGameOver?.(a.detail),complete:()=>e.onComplete?.(),error:a=>e.onError?.(a.detail)};return r.addEventListener("lg:score",t.score),r.addEventListener("lg:gameover",t.gameover),r.addEventListener("lg:complete",t.complete),r.addEventListener("lg:error",t.error),t}function o(r,e){r.removeEventListener("lg:score",e.score),r.removeEventListener("lg:gameover",e.gameover),r.removeEventListener("lg:complete",e.complete),r.removeEventListener("lg:error",e.error)}export{d as createLoadingGame,v as loadingGame};
2
+ //# sourceMappingURL=index.js.map