playsout-web-sdk 1.0.2 → 1.0.3

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.
package/index.iife.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var Playsout=(()=>{var q=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var ze=Object.prototype.hasOwnProperty;var Ge=(o,t)=>{for(var e in t)q(o,e,{get:t[e],enumerable:!0})},De=(o,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of _e(t))!ze.call(o,i)&&i!==e&&q(o,i,{get:()=>t[i],enumerable:!(a=Me(t,i))||a.enumerable});return o};var Ne=o=>De(q({},"__esModule",{value:!0}),o);var Et={};Ge(Et,{Login:()=>ut,PlaysoutSDKClass:()=>At,destroy:()=>gt,getCategories:()=>wt,getGames:()=>vt,getLocale:()=>yt,getToken:()=>ht,getUser:()=>ft,getUserInfo:()=>pt,init:()=>lt,instance:()=>It,isInitialized:()=>St,isLoggedIn:()=>Tt,logout:()=>mt,mount:()=>ct,off:()=>xt,on:()=>kt,setLocale:()=>bt,unmount:()=>dt});var x=class extends Error{constructor(e,a,i){super(a);this.code=e;this.details=i;this.name="SDKError"}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}},Oe={NOT_INITIALIZED:"SDK not initialized. Please call PlaysoutSDK.init() first.",ALREADY_INITIALIZED:"SDK already initialized. Please do not call init() more than once.",NOT_LOGGED_IN:"User not logged in. Please log in first.",TOKEN_EXPIRED:"Login token has expired. Please log in again.",INVALID_TOKEN:"Invalid login token. Please log in again.",NETWORK_ERROR:"Network connection failed. Please check your network.",TIMEOUT:"Request timed out. Please try again later.",SERVER_ERROR:"Server is busy. Please try again later.",API_ERROR:"API request failed.",INVALID_PARAMS:"Invalid parameter(s).",MISSING_PARAMS:"Missing required parameter(s).",FEATURE_NOT_SUPPORTED:"This feature is not supported in the current environment.",UNKNOWN:"An unknown error occurred.",PAYMENT_FAILED:"Payment failed.",SHARE_FAILED:"Share failed."};function g(o,t){return new x(o,Oe[o],t)}var z="playsout_",G=class{constructor(t){this.storage=t}get(t){try{return this.storage.getItem(z+t)}catch{return null}}set(t,e){try{this.storage.setItem(z+t,e)}catch(a){console.warn("[PlaysoutSDK] Storage set failed:",a)}}remove(t){try{this.storage.removeItem(z+t)}catch{}}clear(){try{let t=[];for(let e=0;e<this.storage.length;e++){let a=this.storage.key(e);a&&a.startsWith(z)&&t.push(a)}t.forEach(e=>this.storage.removeItem(e))}catch{}}},W=class{constructor(){this.store=new Map}get(t){return this.store.get(t)??null}set(t,e){this.store.set(t,e)}remove(t){this.store.delete(t)}clear(){this.store.clear()}};function ie(o="localStorage"){return typeof window>"u"||o==="memory"?new W:o==="sessionStorage"?new G(sessionStorage):new G(localStorage)}var S=ie(),h={get:o=>S.get(o),set:(o,t)=>{S.set(o,t)},remove:o=>{S.remove(o)},clear:()=>{S.clear()},getJSON:o=>{let t=S.get(o);if(!t)return null;try{return JSON.parse(t)}catch{return null}},setJSON:(o,t)=>{S.set(o,JSON.stringify(t))},configure(o){S=ie(o)}},p={TOKEN_DATA:"token_data",USER:"user",LOCALE:"locale",CONFIG:"config"};var V=class{constructor(){this.events=new Map}on(t,e){return this.events.has(t)||this.events.set(t,new Set),this.events.get(t).add(e),()=>{this.off(t,e)}}once(t,e){let a=i=>{e(i),this.off(t,a)};return this.on(t,a)}off(t,e){this.events.get(t)?.delete(e),this.events.get(t)?.size===0&&this.events.delete(t)}emit(t,e){this.events.get(t)?.forEach(a=>{try{a(e)}catch(i){console.error(`[PlaysoutSDK] Event handler error for "${t}":`,i)}})}listenerCount(t){return this.events.get(t)?.size??0}clear(){this.events.clear()}},I=new V,y={on:(o,t)=>I.on(o,t),once:(o,t)=>I.once(o,t),off:(o,t)=>{I.off(o,t)},clear:()=>{I.clear()},emit:(o,t)=>{I.emit(o,t)}};var Ue="https://games.playsout.com/resources/icon/image";function s(o){if(!o||/^(data:|https?:|blob:)/i.test(o))return o;let t=o.replace(/^\.\//,"");return`${Ue}/${t}`}var Be=o=>{if(!o)return o;try{let t=new URL(o);if(t.hostname==="games.playsout.com"){let e=t.pathname,a=e.endsWith("/"),i=/\.[a-z0-9]+$/i.test(e);!a&&!i&&(t.pathname=`${e}/`)}return t.toString()}catch{return o}},je=o=>o.map(t=>{if(!t.externalUrl)return t;let e=Be(t.externalUrl);return e===t.externalUrl?t:{...t,externalUrl:e}}),He=[{id:"BlockCrushFun",title:"Block Crush Fun",category:"Puzzle",image:s("./games/BlockCrushFun.png"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BlockCrushFun"},{id:"DogeSurvivors",title:"Doge Survivors",category:"Doge OS",image:s("./games/DogeSurvivors.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeSurvivors/"},{id:"DogeMaze",title:"Doge Maze",category:"Doge OS",image:s("./games/DogeMaze.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMaze/"},{id:"DogeMart",title:"Doge Mart",category:"Doge OS",image:s("./games/DogeMart.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMart/"},{id:"KittyEscape",title:"Kitty Escape",category:"Puzzle",image:s("./games/KittyEscape.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/KittyEscape/"},{id:"ProjectGarden",title:"Project: Garden",category:"Adventure",image:s("./games/SimulatedAdventures.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/simulated/"},{id:"ProjectIDLE",title:"Project: IDLE",category:"Simulation",image:s("./games/ProjectIDLE.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/idle/"},{id:"CulinaryStarWeb",title:"Culinary Star",category:"Casual",image:s("./games/CulinaryStar.webp"),description:"Cooking game",isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CulinaryStar/"},{id:"PickaxeQuest",title:"Pickaxe Quest",category:"Adventure",image:s("./games/PickaxeQuest.jpg"),description:"Mining and adventure game",isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/PickaxeQuest/",apiGameId:73},{id:"MonsterSurvivors",title:"Monster Survivors",category:"Adventure",image:s("./games/MonsterSurvivors.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MonsterSurvivors/"},{id:"IdleTowerDefense",title:"Idle Tower Defense",category:"RPG",image:s("./games/IdleTowerDefense.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/IdleTowerDefense/"},{id:"MushroomWarriors",title:"Mushroom Warriors",category:"RPG",image:s("./games/MushroomWarriors.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MushroomWarriors/"},{id:"FollowThePath",title:"Follow The Path",category:"Arcade",image:s("./games/FollowThePath.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FollowThePath/"},{id:"ColorRun",title:"Color Run",category:"Arcade",image:s("./games/ColorRun.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorRun/"},{id:"StupidArrow",title:"Stupid Arrow",category:"Arcade",image:s("./games/StupidArrow.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/StupidArrow/"},{id:"ZigZag",title:"Zig Zag",category:"Arcade",image:s("./games/ZigZag.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ZigZag/"},{id:"SpikesEverywhere",title:"Spikes Everywhere",category:"Arcade",image:s("./games/SpikesEverywhere.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpikesEverywhere/"},{id:"ArrowRacer",title:"Arrow Racer",category:"Arcade",image:s("./games/ArrowRacer.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ArrowRacer/"},{id:"CircleLeap",title:"Circle Leap",category:"Arcade",image:s("./games/CircleLeap.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircleLeap/"},{id:"ColorMatcher",title:"Color Matcher",category:"Arcade",image:s("./games/ColorMatcher.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorMatcher/"},{id:"EndlessMaze",title:"Endless Maze",category:"Arcade",image:s("./games/EndlessMaze.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/EndlessMaze/"},{id:"SpinningAround",title:"Spinning Around",category:"Arcade",image:s("./games/SpinningAround.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpinningAround/"},{id:"BoomBallz",title:"Boom Ballz",category:"Arcade",image:s("./games/BoomBallz.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BoomBallz/"},{id:"CubeHead",title:"Cube Head",category:"Arcade",image:s("./games/CubeHead.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CubeHead/"},{id:"CapybaraLink",title:"Capybara Link",category:"Puzzle",image:s("./games/CapybaraLink.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CapybaraLink/"},{id:"Snake2048",title:"Snake 2048",category:"Puzzle",image:s("./games/Snake2048.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Snake2048/"},{id:"FishTankFury",title:"Fish Tank Fury",category:"Puzzle",image:s("./games/FishTankFury.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FishTankFury/"},{id:"ConnectBalls",title:"Connect Balls",category:"Arcade",image:s("./games/ConnectBalls.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ConnectBalls/"},{id:"CircularBreaker",title:"Circular Breaker",category:"Arcade",image:s("./games/CircularBreaker.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircularBreaker/"},{id:"OneDoor",title:"One Door",category:"Arcade",image:s("./games/OneDoor.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/OneDoor/"},{id:"CatchtheFruits",title:"Catch the Fruits",category:"Casual",image:s("./games/CatchtheFruits.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CatchtheFruits/"},{id:"Falling2048",title:"Falling 2048",category:"Casual",image:s("./games/Falling2048.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Falling2048/"}],re=je(He),w=()=>re.filter(o=>o.enable),zt={Adventure:w().filter(o=>o.category==="Adventure"),Moba:w().filter(o=>o.category==="Moba")};var ne=o=>re.find(t=>t.id===o);var se=()=>Array.from(new Set(w().map(o=>o.category)));var Q="https://api.playsout.com",X=3e4,$e=new Set([10010,10011,10012,10013]);function Fe(o){let t=String(o?.platform||"").toLowerCase();if(t==="tiktok"){let e=o.authorizationCode;if(typeof e!="string"||!e.trim())throw g("MISSING_PARAMS","authorizationCode is required for TikTok login");return{platform:t,authorizationCode:e}}if(t==="grab"||t==="eros"){let e=o;if(typeof e.platformUserId!="string"||!e.platformUserId.trim())throw g("MISSING_PARAMS","platformUserId is required for Grab/Eros login");if(typeof e.platformToken!="string"||!e.platformToken.trim())throw g("MISSING_PARAMS","platformToken is required for Grab/Eros login");return{platform:t,platformUserId:e.platformUserId,platformToken:e.platformToken,username:typeof e.username=="string"?e.username:void 0,inviteCode:typeof e.inviteCode=="string"?e.inviteCode:void 0}}throw g("INVALID_PARAMS","Unsupported platform. Expected grab, eros, or tiktok")}var A=null,J=null,E=null;function de(o){J=o}function ge(o){E=o}async function le(o,t={},e,a=!1){let i=e?.apiBaseUrl||Q,r=o.startsWith("http")?o:`${i}${o}`,n=new AbortController,d=setTimeout(()=>n.abort(),X);try{let m=h.getJSON(p.TOKEN_DATA),b={"Content-Type":"application/json",...t.headers};m?.accessToken&&!b.token&&(b.token=m.accessToken);let f=await fetch(r,{...t,signal:n.signal,headers:b});if(clearTimeout(d),!f.ok){if(f.status===401&&!a)return await ce(o,t,e);throw g(f.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${f.status}: ${f.statusText}`)}let u=await f.json();if(u.code!==void 0&&$e.has(u.code)&&!a){if(o.includes("/platform/refreshToken"))throw g("TOKEN_EXPIRED",u.msg||"Token expired");return await ce(o,t,e)}if(u.code!==0&&u.code!==1e4)throw g("API_ERROR",u.msg||"API request failed");return u.data}catch(m){throw clearTimeout(d),m instanceof x?m:m instanceof Error?m.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",m.message):g("UNKNOWN")}}async function ce(o,t,e){await ue(e);let a=e?.apiBaseUrl||Q,i=o.startsWith("http")?o:`${a}${o}`,r=new AbortController,n=setTimeout(()=>r.abort(),X);try{let d=h.getJSON(p.TOKEN_DATA),m={"Content-Type":"application/json",...t.headers};d?.accessToken&&(m.token=d.accessToken);let b=await fetch(i,{...t,signal:r.signal,headers:m});if(clearTimeout(n),!b.ok)throw g(b.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${b.status}: ${b.statusText}`);let f=await b.json();if(f.code!==0&&f.code!==1e4)throw g("API_ERROR",f.msg||"API request failed");return f.data}catch(d){throw clearTimeout(n),d instanceof x?d:d instanceof Error&&d.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",d?.message||"Request failed")}}async function ue(o){return A||(A=(async()=>{let t=h.getJSON(p.TOKEN_DATA);if(!t?.refreshToken)throw g("NOT_LOGGED_IN","No refresh token available");let e=o?.apiBaseUrl||Q,a=new AbortController,i=setTimeout(()=>a.abort(),X);try{let r=await fetch(`${e}/platform/refreshToken`,{method:"POST",signal:a.signal,headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:t.refreshToken})});if(clearTimeout(i),!r.ok)throw g("TOKEN_EXPIRED","Failed to refresh token");let n=await r.json();if(n.code!==0&&n.code!==1e4||!n.data)throw g("TOKEN_EXPIRED",n.msg||"Failed to refresh token");let d=n.data;if(h.setJSON(p.TOKEN_DATA,d),J)try{J(d)}catch{}return d}catch(r){if(clearTimeout(i),r instanceof x){if(E)try{E()}catch{}throw r}if(r instanceof Error&&r.name==="AbortError")throw g("TIMEOUT");if(E)try{E()}catch{}throw g("TOKEN_EXPIRED","Refresh token failed")}finally{A=null}})(),A)}var Z=class{constructor(){this.config=null}configure(t){this.config=t}async refreshToken(){return await ue(this.config||void 0)}async getGames(t){let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(i=>i.title.toLowerCase().includes(a)||i.category.toLowerCase().includes(a)||i.description&&i.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){let t=w(),e=new Map;return t.forEach(a=>{let i=e.get(a.category)||0;e.set(a.category,i+1)}),Array.from(e.entries()).map(([a,i],r)=>({id:`category_${r}`,name:a,count:i}))}async getGameById(t){return ne(t)}async getCategoryNames(){return se()}async loginOnly(t){let e=Fe(t);return await le("/platform/login",{method:"POST",body:JSON.stringify(e)},this.config??void 0)}async Login(t){let e=await this.loginOnly(t),a;try{a=await this.getUserInfo()}catch{}return{tokenData:e,user:a}}async getUserInfo(){return await le("/platform/user",{method:"GET"},this.config??void 0)}async getUser(){return h.getJSON(p.USER)}async validateToken(t){return!!t}},Y=null;function D(){return Y||(Y=new Z),Y}var We="https://api.playsout.com",me="zh",C=class o{constructor(){this.config=null;this._isInitialized=!1;this._user=null;this._token=null;this._locale=me;this._widget=null}static getInstance(){return o.instance||(o.instance=new o),o.instance}async init(t={}){if(this._isInitialized)throw g("ALREADY_INITIALIZED");this.config={apiBaseUrl:t.apiBaseUrl||We,debug:t.debug||!1,storage:t.storage||"localStorage",locale:t.locale||me,appId:t.appId||""},h.configure(this.config.storage),de(i=>{this._token=i.accessToken}),ge(()=>{this._user=null,this._token=null,h.remove(p.TOKEN_DATA),h.remove(p.USER),y.emit("authExpired"),this.config?.debug&&console.warn("[PlaysoutSDK] Auth expired, logged out")});let e=h.getJSON(p.TOKEN_DATA);this._user=h.getJSON(p.USER),this._locale=h.get(p.LOCALE)||this.config.locale;let a=Math.floor(Date.now()/1e3);if(e&&e.refreshExpiresAt>a&&(this._token=e.accessToken),this._isInitialized=!0,this.config.debug&&(console.log("[PlaysoutSDK] Initialized with config:",this.config),console.log("[PlaysoutSDK] Restored token:",this._token?this._token.substring(0,20)+"...":"(none)")),y.emit("initialized"),e){let i=Math.floor(Date.now()/1e3);if(e.expiresAt-i<=300)try{let r=D();r.configure(this.config),await r.refreshToken();let n=h.getJSON(p.TOKEN_DATA);n&&(this._token=n.accessToken),this.config.debug&&console.log("[PlaysoutSDK] Token proactively refreshed at init")}catch(r){this.config.debug&&console.warn("[PlaysoutSDK] Proactive refresh failed, will retry on next request:",r)}}}destroy(){this.config=null,this._isInitialized=!1,this._user=null,this._token=null,h.clear(),y.clear()}get isInitialized(){return this._isInitialized}get isLoggedIn(){return!!this._token}get user(){return this._user}get token(){return this._token}get locale(){return this._locale}get sdkConfig(){return this.config}async Login(t){this.ensureInitialized(),this.config?.debug&&console.log("[PlaysoutSDK] Login with params:",t);let e=D();e.configure(this.config);let a=await e.loginOnly(t);h.setJSON(p.TOKEN_DATA,a),this.config?.debug&&console.log("[PlaysoutSDK] Token saved, expires at:",new Date(a.expiresAt*1e3).toISOString());let i;try{i=await e.getUserInfo()}catch(r){this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo failed, login still success:",r)}return this._token=a.accessToken,i&&(this._user={userId:String(i.id),username:i.username},h.setJSON(p.USER,this._user)),this.config?.debug&&console.log("[PlaysoutSDK] Login success, user:",i),y.emit("login",{user:this._user,token:this._token}),{tokenData:a,user:i}}async getUserInfo(){if(this.ensureInitialized(),!this._token)throw g("NOT_LOGGED_IN","Please login first");let t=D();t.configure(this.config);let e=await t.getUserInfo();return this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo result:",e),e&&(this._user={userId:String(e.id),username:e.username},h.setJSON(p.USER,this._user)),e}logout(){this._user=null,this._token=null,h.remove(p.TOKEN_DATA),h.remove(p.USER),y.emit("logout")}getToken(){return this.ensureInitialized(),this._token}getUser(){return this.ensureInitialized(),this._user}setLocale(t){if(this.ensureInitialized(),!["zh","en","ja","ko","vi","th","id","ms"].includes(t))throw g("INVALID_PARAMS",`Unsupported locale: ${t}`);this._locale=t,h.set(p.LOCALE,t),this.config?.debug&&console.log("[PlaysoutSDK] Locale changed to:",t);let e=this._widget||document.querySelector("playsout-widget");e&&e.getAttribute("locale")!==t&&e.setAttribute("locale",t),y.emit("localeChange",t)}getLocale(){return this.ensureInitialized(),this._locale}async getGames(t){this.ensureInitialized();let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(i=>i.title.toLowerCase().includes(a)||i.category.toLowerCase().includes(a)||i.description&&i.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){this.ensureInitialized();let t=w(),e=new Map;return t.forEach(a=>{let i=e.get(a.category)||0;e.set(a.category,i+1)}),Array.from(e.entries()).map(([a,i],r)=>({id:`category_${r}`,name:a,count:i}))}async getGameById(t){return this.ensureInitialized(),w().find(e=>e.id===t)}mount(t,e){if(this.ensureInitialized(),typeof document>"u")throw g("FEATURE_NOT_SUPPORTED","mount requires DOM environment");let a=document.querySelector(t);if(!a)throw g("INVALID_PARAMS",`Container not found: ${t}`);let i=document.createElement("playsout-widget");this.config?.appId&&i.setAttribute("app-id",this.config.appId),i.setAttribute("locale",e?.locale||this._locale),i.setAttribute("theme",e?.theme||"dark"),e?.detailMode&&i.setAttribute("detail-mode",e.detailMode),this._widget=i,e?.onGameClick&&i.addEventListener("game-click",r=>{let n=r;e.onGameClick(n.detail)}),e?.onLoginRequired&&i.addEventListener("login-required",e.onLoginRequired),e?.onLocaleChange&&i.addEventListener("locale-change",r=>{let n=r;e.onLocaleChange(n.detail)}),a.appendChild(i),this.config?.debug&&console.log("[PlaysoutSDK] Widget mounted to:",t)}unmount(){let t=document.querySelector("playsout-widget");t&&t.remove(),this._widget=null}on(t,e){return this.ensureInitialized(),y.on(t,e)}off(t,e){this.ensureInitialized(),y.off(t,e)}ensureInitialized(){if(!this._isInitialized)throw g("NOT_INITIALIZED")}},l=C.getInstance();typeof window<"u"&&(window.__playsout_sdk_instance=l);var N=Object.freeze({init:l.init.bind(l),mount:l.mount.bind(l),unmount:l.unmount.bind(l),destroy:l.destroy.bind(l),Login:l.Login.bind(l),logout:l.logout.bind(l),getToken:l.getToken.bind(l),getUserInfo:l.getUserInfo.bind(l),getUser:l.getUser.bind(l),setLocale:l.setLocale.bind(l),getLocale:l.getLocale.bind(l),getGames:l.getGames.bind(l),getCategories:l.getCategories.bind(l),on:l.on.bind(l),off:l.off.bind(l),get isInitialized(){return l.isInitialized},get isLoggedIn(){return l.isLoggedIn},instance:l,PlaysoutSDKClass:C});var Ve="games.playsout.com";var ee="__playsout_img_cache_v1",H=`${ee}_blob_`,K=!1,U=4*1024*1024-1024*1024;function c(...o){}var T=new Map,O=new Map,Ye=50,L=new Map,B=new Map,v=0;function te(){try{let o=localStorage.getItem(ee);if(!o)return c("loadCacheIndex: \u65E0\u7F13\u5B58\u7D22\u5F15"),v=0,new Map;let t=JSON.parse(o);c("loadCacheIndex: \u52A0\u8F7D\u4E86",t.length,"\u6761\u8BB0\u5F55"),v=0;for(let e of t){let a=`${H}${btoa(e.url).replace(/[\/+=]/g,"_")}`;localStorage.getItem(a)&&(v+=e.size)}return c("loadCacheIndex: \u5F53\u524D blob \u603B\u91CF",v,"bytes"),new Map(t.map(e=>[e.url,e]))}catch{return c("loadCacheIndex: \u89E3\u6790\u5931\u8D25"),v=0,new Map}}function j(o){try{let t=Array.from(o.values());t.length>200&&(t.sort((e,a)=>a.timestamp-e.timestamp),t.length=200),localStorage.setItem(ee,JSON.stringify(t)),c("saveCacheIndex: \u4FDD\u5B58\u4E86",t.length,"\u6761\u8BB0\u5F55")}catch(t){c("saveCacheIndex: \u4FDD\u5B58\u5931\u8D25",t)}}function Je(o,t){if(!(v+t<=U))try{let e=te(),a=Array.from(e.values()).map(i=>({record:i,score:pe(i.url)??1/0})).filter(i=>i.score>o).sort((i,r)=>r.score-i.score);for(let{record:i}of a){if(v+t<=U)break;let r=`${H}${btoa(i.url).replace(/[\/+=]/g,"_")}`;localStorage.removeItem(r),e.delete(i.url),v-=i.size,c("evictLowerPriorityEntries: \u91CA\u653E\u4F4E\u4F18\u5148\u7EA7\u7F13\u5B58",i.url,"\u8282\u7701",i.size,"bytes")}j(e)}catch(e){c("evictLowerPriorityEntries: \u5931\u8D25",e)}}function he(o,t){if(T.size>=Ye){let e=null,a=1/0;for(let[i,r]of T)r.lastAccess<a&&(a=r.lastAccess,e=i);if(e){let i=T.get(e);URL.revokeObjectURL(URL.createObjectURL(i.blob)),T.delete(e),c("addToMemoryCache: LRU\u6DD8\u6C70",e)}}T.set(o,{blob:t,lastAccess:Date.now()}),c("addToMemoryCache: \u6DFB\u52A0\u5230\u5185\u5B58\u7F13\u5B58",o,"\u5927\u5C0F:",t.size,"bytes")}async function Ze(o){if(!K)return;if(O.has(o)){c("cacheImage:",o,"\u8BE5\u8BF7\u6C42\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u7B49\u5F85\u5B8C\u6210"),await O.get(o);return}c("cacheImage: \u5F00\u59CB\u4E0B\u8F7D",o);let t=(async()=>{try{let e=await fetch(o);if(!e.ok){c("cacheImage:",o,"\u54CD\u5E94\u5931\u8D25",e.status);return}let a=await e.blob(),i=e.headers.get("ETag")||"";c("cacheImage:",o,"\u4E0B\u8F7D\u6210\u529F\uFF0C\u5927\u5C0F:",a.size,"ETag:",i),he(o,a);let r=pe(o);if(r!==void 0)if(Je(r,a.size),v+a.size<=U)try{let n=te();n.set(o,{url:o,timestamp:Date.now(),etag:i,size:a.size}),j(n);let d=JSON.stringify({type:a.type,data:Array.from(new Uint8Array(await a.arrayBuffer()))}),m=`${H}${btoa(o).replace(/[\/+=]/g,"_")}`;localStorage.setItem(m,d),v+=a.size,c("cacheImage:",o,"\u5DF2\u4FDD\u5B58\u5230localStorage\uFF08\u5360\u7528",a.size,"bytes\uFF0C\u9884\u7B97\u5269\u4F59",U-v,"\uFF09")}catch(n){n.name==="QuotaExceededError"?c("cacheImage: localStorage \u914D\u989D\u5DF2\u6EE1\uFF0C\u505C\u6B62\u5199\u5165"):c("cacheImage:",o,"localStorage\u4FDD\u5B58\u5931\u8D25",n)}else c("cacheImage:",o,"\u817E\u51FA\u7A7A\u95F4\u540E\u4ECD\u8D85\u8FC7\u9884\u7B97\uFF0C\u8DF3\u8FC7");else c("cacheImage:",o,"\u975E\u4F18\u5148\u7EA7URL\uFF0C\u4E0D\u5199\u5165localStorage")}catch(e){c("cacheImage:",o,"\u4E0B\u8F7D\u5931\u8D25",e)}finally{O.delete(o)}})();O.set(o,t)}function ae(o){try{if(new URL(o).hostname===Ve)return c("isCacheableImage:",o,"\u662FCDN\u56FE\u7247"),!0}catch{}return o.startsWith("/games/")||o.startsWith("./games/")||o.startsWith("/home-")||o.startsWith("./home-")||o.startsWith("/logo")||o.startsWith("./logo")?(c("isCacheableImage:",o,"\u662F\u672C\u5730\u56FE\u7247"),!0):(c("isCacheableImage:",o,"\u4E0D\u662F\u53EF\u7F13\u5B58\u7684\u56FE\u7247"),!1)}function pe(o){return B.has(o)?B.get(o):L.get(o)}function fe(o){if(!K)return;let t=-1e3;for(let e of o)ae(e)&&B.set(e,t++);c("setCriticalAssets: \u5171",B.size,"\u4E2A\u5173\u952E\u8D44\u6E90")}function be(o,t=!1){if(!K)return;t||L.clear();let e=0;if(t){for(let i of L.values())i>e&&(e=i);e+=1}let a=e;for(let i of o)ae(i)&&L.set(i,a++);c("setPriorityCache: \u5F53\u524D\u5171",L.size,"\u4E2A\u4F18\u5148\u7F13\u5B58URL")}function ye(o){if(!K)return o;if(c("resolveWithCache:",o),!ae(o))return c("resolveWithCache:",o,"\u4E0D\u662FCDN\u56FE\u7247\uFF0C\u539F\u6837\u8FD4\u56DE"),o;if(T.has(o)){let e=T.get(o);e.lastAccess=Date.now();try{let a=URL.createObjectURL(e.blob);return c("resolveWithCache:",o,"\u547D\u4E2D\u5185\u5B58\u7F13\u5B58\uFF0C\u8FD4\u56DEblob URL"),a}catch{c("resolveWithCache:",o,"\u521B\u5EFAblob URL\u5931\u8D25")}}let t=te();if(t.has(o)){let e=`${H}${btoa(o).replace(/[\/+=]/g,"_")}`,a=localStorage.getItem(e);if(a)try{let{type:i,data:r}=JSON.parse(a),n=new Blob([new Uint8Array(r)],{type:i});he(o,n);let d=URL.createObjectURL(n);return c("resolveWithCache:",o,"\u547D\u4E2DlocalStorage\u7F13\u5B58\uFF0C\u540C\u6B65\u8FD4\u56DEblob URL"),d}catch(i){c("resolveWithCache:",o,"localStorage blob\u89E3\u6790\u5931\u8D25\uFF0C\u6E05\u9664\u7F13\u5B58",i),t.delete(o),j(t),localStorage.removeItem(e)}else c("resolveWithCache:",o,"localStorage blob\u4E0D\u5B58\u5728\uFF0C\u6E05\u9664\u7D22\u5F15"),t.delete(o),j(t)}return c("resolveWithCache:",o,"\u5B8C\u5168\u6CA1\u6709\u7F13\u5B58\uFF0C\u540E\u53F0\u4E0B\u8F7D"),Ze(o),o}var ve={app:{title:"Playsout Mini Games",description:"Play quick games without login."},home:{loggedIn:"Logged in",logIn:"Log in",games:"Games",bannerAlt:"Playsout Games",searchPlaceholder:"Search by title or category",noGames:"No games found"},profile:{title:"Profile",settings:"Settings",language:"Language",recentGames:"Recently Played Games",noGames:"No games played yet",guest:"Guest",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Adventure",Simulation:"Simulation",Casual:"Casual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Puzzle"},auth:{loginSuccess:"Login successful!",loginTitle:"Playsout Login",welcome:"Welcome to the Playsout game platform",prompt:"Log in to start playing",mustLogin:"You must log in to play",authorizeHint:"Click the button below to authorize your login",authorizing:"Authorizing...",authorize:"Authorize login",terms:"By authorizing, you agree to our Terms of Service",signingIn:"Signing In",signMessage:"Please sign the message in your wallet"},game:{loading:"Loading",notFound:"Game not found",backHome:"Back to home",pageTitleSuffix:"Game Platform",header:{back:"Back",shareAria:"Share game",toggleMenuAria:"Toggle menu",fallbackTitle:"Game"}},menu:{favorite:"Favorite",favorited:"Favorited",profile:"Profile",login:"Login",refresh:"Refresh",loggedIn:"Logged in"},share:{title:"Share Game",closeLabel:"Close",retry:"Retry",loading:"Loading...",imageAlt:"Game share image",shareUrlLabel:"Share URL:",copied:"Copied",copy:"Copy",saveShare:"Save & Share",hint:"Image includes a QR code that links to this game",loadError:"Failed to load share image",downloadError:"Failed to download image"},checkin:{successTitle:"You got rewards!",successMessage:"Your rewards have been claimed.",failedTitle:"Check-in failed",canceledTitle:"Check-in canceled",errors:{userRejected:"You canceled the check-in operation",insufficientFunds:"Insufficient funds to pay gas",alreadyCheckedIn:"You already checked in today. Come back tomorrow!",network:"Network error. Please try again later"}},store:{title:"Gem Store",hot:"HOT",buy:"BUY",cancel:"Cancel",unit:"Gems",successTitle:"Payment Successful",successMessage:"You received {amount} gems!"},payment:{title:"Confirm Purchase",insufficientTitle:"Insufficient Balance",insufficientDesc:"Available: {gems} Gems",cancel:"Cancel",confirm:"Confirm",recharge:"Recharge",successTitle:"Payment Successful",successMessage:"{cost} <gem></gem> have been deducted."}};var we={app:{title:"Playsout \u5C0F\u6E38\u620F",description:"\u65E0\u9700\u767B\u5F55\u5373\u53EF\u7545\u73A9\u5C0F\u6E38\u620F\u3002"},home:{loggedIn:"\u5DF2\u767B\u5F55",logIn:"\u767B\u5F55",games:"\u6E38\u620F",bannerAlt:"Playsout \u6E38\u620F",searchPlaceholder:"\u6309\u6807\u9898\u6216\u7C7B\u522B\u641C\u7D22",noGames:"\u672A\u627E\u5230\u6E38\u620F"},profile:{title:"\u4E2A\u4EBA\u4E2D\u5FC3",settings:"\u8BBE\u7F6E",language:"\u8BED\u8A00",recentGames:"\u6700\u8FD1\u73A9\u8FC7\u7684\u6E38\u620F",noGames:"\u8FD8\u6CA1\u6709\u73A9\u8FC7\u6E38\u620F",guest:"\u6E38\u5BA2",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u5192\u9669",Simulation:"\u6A21\u62DF",Casual:"\u4F11\u95F2",Arcade:"\u8857\u673A",Moba:"MOBA",Puzzle:"\u76CA\u667A"},auth:{loginSuccess:"\u767B\u5F55\u6210\u529F!",loginTitle:"Playsout \u767B\u5F55",welcome:"\u6B22\u8FCE\u6765\u5230 Playsout \u6E38\u620F\u5E73\u53F0",prompt:"\u767B\u5F55\u5F00\u59CB\u6E38\u620F",mustLogin:"\u60A8\u5FC5\u987B\u767B\u5F55\u624D\u80FD\u73A9\u6E38\u620F",authorizeHint:"\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\u6388\u6743\u767B\u5F55",authorizing:"\u6388\u6743\u4E2D...",authorize:"\u6388\u6743\u767B\u5F55",terms:"\u6388\u6743\u5373\u8868\u793A\u60A8\u540C\u610F\u6211\u4EEC\u7684\u670D\u52A1\u6761\u6B3E",signingIn:"\u767B\u5F55\u4E2D",signMessage:"\u8BF7\u5728\u94B1\u5305\u4E2D\u7B7E\u540D"},game:{loading:"\u52A0\u8F7D\u4E2D",notFound:"\u627E\u4E0D\u5230\u6E38\u620F",backHome:"\u8FD4\u56DE\u9996\u9875",pageTitleSuffix:"\u6E38\u620F\u5E73\u53F0",header:{back:"\u8FD4\u56DE",shareAria:"\u5206\u4EAB\u6E38\u620F",toggleMenuAria:"\u5207\u6362\u83DC\u5355",fallbackTitle:"\u6E38\u620F"}},menu:{favorite:"\u6536\u85CF",favorited:"\u5DF2\u6536\u85CF",profile:"\u4E2A\u4EBA\u4E2D\u5FC3",login:"\u767B\u5F55",refresh:"\u5237\u65B0",loggedIn:"\u5DF2\u767B\u5F55"},share:{title:"\u5206\u4EAB\u6E38\u620F",closeLabel:"\u5173\u95ED",retry:"\u91CD\u8BD5",loading:"\u52A0\u8F7D\u4E2D...",imageAlt:"\u6E38\u620F\u5206\u4EAB\u56FE\u7247",shareUrlLabel:"\u5206\u4EAB\u94FE\u63A5:",copied:"\u5DF2\u590D\u5236",copy:"\u590D\u5236",saveShare:"\u4FDD\u5B58\u5E76\u5206\u4EAB",hint:"\u56FE\u7247\u5305\u542B\u6B64\u6E38\u620F\u7684\u4E8C\u7EF4\u7801",loadError:"\u52A0\u8F7D\u5206\u4EAB\u56FE\u7247\u5931\u8D25",downloadError:"\u4E0B\u8F7D\u56FE\u7247\u5931\u8D25"},checkin:{successTitle:"\u9886\u53D6\u6210\u529F!",successMessage:"\u60A8\u7684\u5956\u52B1\u5DF2\u9886\u53D6\u3002",failedTitle:"\u7B7E\u5230\u5931\u8D25",canceledTitle:"\u7B7E\u5230\u53D6\u6D88",errors:{userRejected:"\u60A8\u53D6\u6D88\u4E86\u7B7E\u5230\u64CD\u4F5C",insufficientFunds:"\u4F59\u989D\u4E0D\u8DB3\u4EE5\u652F\u4ED8 Gas \u8D39",alreadyCheckedIn:"\u4ECA\u5929\u5DF2\u7ECF\u7B7E\u5230\u8FC7\u4E86\u3002\u660E\u5929\u518D\u6765\u5427!",network:"\u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5"}},store:{title:"\u5B9D\u77F3\u5546\u5E97",hot:"\u70ED\u95E8",buy:"\u8D2D\u4E70",cancel:"\u53D6\u6D88",unit:"\u5B9D\u77F3",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u60A8\u83B7\u5F97\u4E86 {amount} \u5B9D\u77F3\uFF01"},payment:{title:"\u786E\u8BA4\u8D2D\u4E70",insufficientTitle:"\u4F59\u989D\u4E0D\u8DB3",insufficientDesc:"\u53EF\u7528\u4F59\u989D: {gems} \u5B9D\u77F3",cancel:"\u53D6\u6D88",confirm:"\u786E\u8BA4",recharge:"\u5145\u503C",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u5DF2\u6263\u9664 {cost}<gem></gem>\u3002"}};var ke={app:{title:"Playsout \u30DF\u30CB\u30B2\u30FC\u30E0",description:"\u30ED\u30B0\u30A4\u30F3\u306A\u3057\u3067\u30B2\u30FC\u30E0\u3092\u30D7\u30EC\u30A4\u3002"},home:{loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F",logIn:"\u30ED\u30B0\u30A4\u30F3",games:"\u30B2\u30FC\u30E0",bannerAlt:"Playsout \u30B2\u30FC\u30E0",searchPlaceholder:"\u30BF\u30A4\u30C8\u30EB\u307E\u305F\u306F\u30AB\u30C6\u30B4\u30EA\u3067\u691C\u7D22",noGames:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093"},profile:{title:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",settings:"\u8A2D\u5B9A",language:"\u8A00\u8A9E",recentGames:"\u6700\u8FD1\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0",noGames:"\u307E\u3060\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093",guest:"\u30B2\u30B9\u30C8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u30A2\u30C9\u30D9\u30F3\u30C1\u30E3\u30FC",Simulation:"\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3",Casual:"\u30AB\u30B8\u30E5\u30A2\u30EB",Arcade:"\u30A2\u30FC\u30B1\u30FC\u30C9",Moba:"MOBA",Puzzle:"\u30D1\u30BA\u30EB"},auth:{loginSuccess:"\u30ED\u30B0\u30A4\u30F3\u6210\u529F!",loginTitle:"Playsout \u30ED\u30B0\u30A4\u30F3",welcome:"Playsout \u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3078\u3088\u3046\u3053\u305D",prompt:"\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u30D7\u30EC\u30A4\u3092\u958B\u59CB",mustLogin:"\u30D7\u30EC\u30A4\u3059\u308B\u306B\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059",authorizeHint:"\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044",authorizing:"\u627F\u8A8D\u4E2D...",authorize:"\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D",terms:"\u627F\u8A8D\u3059\u308B\u3053\u3068\u3067\u3001\u5229\u7528\u898F\u7D04\u306B\u540C\u610F\u3057\u305F\u3053\u3068\u306B\u306A\u308A\u307E\u3059",signingIn:"\u30B5\u30A4\u30F3\u30A4\u30F3\u4E2D",signMessage:"\u30A6\u30A9\u30EC\u30C3\u30C8\u3067\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u7F72\u540D\u3057\u3066\u304F\u3060\u3055\u3044"},game:{loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D",notFound:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",backHome:"\u30DB\u30FC\u30E0\u306B\u623B\u308B",pageTitleSuffix:"\u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0",header:{back:"\u623B\u308B",shareAria:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",toggleMenuAria:"\u30E1\u30CB\u30E5\u30FC\u5207\u308A\u66FF\u3048",fallbackTitle:"\u30B2\u30FC\u30E0"}},menu:{favorite:"\u304A\u6C17\u306B\u5165\u308A",favorited:"\u304A\u6C17\u306B\u5165\u308A\u6E08\u307F",profile:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",login:"\u30ED\u30B0\u30A4\u30F3",refresh:"\u66F4\u65B0",loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F"},share:{title:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",closeLabel:"\u9589\u3058\u308B",retry:"\u518D\u8A66\u884C",loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D...",imageAlt:"\u30B2\u30FC\u30E0\u5171\u6709\u753B\u50CF",shareUrlLabel:"\u5171\u6709URL:",copied:"\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",copy:"\u30B3\u30D4\u30FC",saveShare:"\u4FDD\u5B58\u3057\u3066\u5171\u6709",hint:"\u753B\u50CF\u306B\u306F\u30B2\u30FC\u30E0\u3078\u306EQR\u30B3\u30FC\u30C9\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059",loadError:"\u5171\u6709\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",downloadError:"\u753B\u50CF\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F"},checkin:{successTitle:"\u5831\u916C\u3092\u7372\u5F97\u3057\u307E\u3057\u305F!",successMessage:"\u5831\u916C\u304C\u8ACB\u6C42\u3055\u308C\u307E\u3057\u305F\u3002",failedTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u5931\u6557",canceledTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u30AD\u30E3\u30F3\u30BB\u30EB",errors:{userRejected:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u64CD\u4F5C\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F",insufficientFunds:"\u30AC\u30B9\u4EE3\u3092\u652F\u6255\u3046\u6B8B\u9AD8\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059",alreadyCheckedIn:"\u672C\u65E5\u306F\u65E2\u306B\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u6E08\u307F\u3067\u3059\u3002\u660E\u65E5\u307E\u305F\u6765\u3066\u304F\u3060\u3055\u3044!",network:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u3002\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044"}},store:{title:"\u30B8\u30A7\u30E0\u30B9\u30C8\u30A2",hot:"HOT",buy:"\u8CFC\u5165",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",unit:"\u30B8\u30A7\u30E0",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{amount}\u30B8\u30A7\u30E0\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF01"},payment:{title:"\u8CFC\u5165\u78BA\u8A8D",insufficientTitle:"\u6B8B\u9AD8\u4E0D\u8DB3",insufficientDesc:"\u4FDD\u6709: {gems} \u30B8\u30A7\u30E0",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",confirm:"\u78BA\u8A8D",recharge:"\u30C1\u30E3\u30FC\u30B8",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{cost}<gem></gem>\u304C\u5DEE\u3057\u5F15\u304B\u308C\u307E\u3057\u305F\u3002"}};var xe={app:{title:"Playsout \uBBF8\uB2C8 \uAC8C\uC784",description:"\uB85C\uADF8\uC778 \uC5C6\uC774 \uAC8C\uC784\uC744 \uC990\uAE30\uC138\uC694."},home:{loggedIn:"\uB85C\uADF8\uC778\uB428",logIn:"\uB85C\uADF8\uC778",games:"\uAC8C\uC784",bannerAlt:"Playsout \uAC8C\uC784",searchPlaceholder:"\uC81C\uBAA9 \uB610\uB294 \uCE74\uD14C\uACE0\uB9AC\uB85C \uAC80\uC0C9",noGames:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4"},profile:{title:"\uD504\uB85C\uD544",settings:"\uC124\uC815",language:"\uC5B8\uC5B4",recentGames:"\uCD5C\uADFC \uD50C\uB808\uC774\uD55C \uAC8C\uC784",noGames:"\uC544\uC9C1 \uD50C\uB808\uC774\uD55C \uAC8C\uC784\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",guest:"\uC190\uB2D8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\uC5B4\uB4DC\uBCA4\uCC98",Simulation:"\uC2DC\uBBAC\uB808\uC774\uC158",Casual:"\uCE90\uC8FC\uC5BC",Arcade:"\uC544\uCF00\uC774\uB4DC",Moba:"MOBA",Puzzle:"\uD37C\uC990"},auth:{loginSuccess:"\uB85C\uADF8\uC778 \uC131\uACF5!",loginTitle:"Playsout \uB85C\uADF8\uC778",welcome:"Playsout \uAC8C\uC784 \uD50C\uB7AB\uD3FC\uC5D0 \uC624\uC2E0 \uAC83\uC744 \uD658\uC601\uD569\uB2C8\uB2E4",prompt:"\uAC8C\uC784\uC744 \uC2DC\uC791\uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD558\uC138\uC694",mustLogin:"\uAC8C\uC784\uC744 \uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD574\uC57C \uD569\uB2C8\uB2E4",authorizeHint:"\uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uB824\uBA74 \uC544\uB798 \uBC84\uD2BC\uC744 \uD074\uB9AD\uD558\uC138\uC694",authorizing:"\uC2B9\uC778 \uC911...",authorize:"\uB85C\uADF8\uC778 \uC2B9\uC778",terms:"\uC2B9\uC778\uD558\uBA74 \uC11C\uBE44\uC2A4 \uC57D\uAD00\uC5D0 \uB3D9\uC758\uD558\uAC8C \uB429\uB2C8\uB2E4",signingIn:"\uB85C\uADF8\uC778 \uC911",signMessage:"\uC9C0\uAC11\uC5D0\uC11C \uBA54\uC2DC\uC9C0\uC5D0 \uC11C\uBA85\uD574\uC8FC\uC138\uC694"},game:{loading:"\uB85C\uB529 \uC911",notFound:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",backHome:"\uD648\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30",pageTitleSuffix:"\uAC8C\uC784 \uD50C\uB7AB\uD3FC",header:{back:"\uB4A4\uB85C",shareAria:"\uAC8C\uC784 \uACF5\uC720",toggleMenuAria:"\uBA54\uB274 \uC804\uD658",fallbackTitle:"\uAC8C\uC784"}},menu:{favorite:"\uC990\uACA8\uCC3E\uAE30",favorited:"\uC990\uACA8\uCC3E\uAE30\uB428",profile:"\uD504\uB85C\uD544",login:"\uB85C\uADF8\uC778",refresh:"\uC0C8\uB85C\uACE0\uCE68",loggedIn:"\uB85C\uADF8\uC778\uB428"},share:{title:"\uAC8C\uC784 \uACF5\uC720",closeLabel:"\uB2EB\uAE30",retry:"\uC7AC\uC2DC\uB3C4",loading:"\uB85C\uB529 \uC911...",imageAlt:"\uAC8C\uC784 \uACF5\uC720 \uC774\uBBF8\uC9C0",shareUrlLabel:"\uACF5\uC720 URL:",copied:"\uBCF5\uC0AC\uB428",copy:"\uBCF5\uC0AC",saveShare:"\uC800\uC7A5 \uBC0F \uACF5\uC720",hint:"\uC774\uBBF8\uC9C0\uC5D0 \uAC8C\uC784\uC73C\uB85C \uC5F0\uACB0\uB418\uB294 QR \uCF54\uB4DC\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4",loadError:"\uACF5\uC720 \uC774\uBBF8\uC9C0\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4",downloadError:"\uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4"},checkin:{successTitle:"\uBCF4\uC0C1\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!",successMessage:"\uBCF4\uC0C1\uC774 \uC9C0\uAE09\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",failedTitle:"\uCD9C\uC11D \uC2E4\uD328",canceledTitle:"\uCD9C\uC11D \uCDE8\uC18C\uB428",errors:{userRejected:"\uCD9C\uC11D \uC791\uC5C5\uC744 \uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4",insufficientFunds:"\uAC00\uC2A4\uBE44\uB97C \uC9C0\uBD88\uD560 \uC790\uAE08\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4",alreadyCheckedIn:"\uC624\uB298 \uC774\uBBF8 \uCD9C\uC11D\uD588\uC2B5\uB2C8\uB2E4. \uB0B4\uC77C \uB2E4\uC2DC \uC624\uC138\uC694!",network:"\uB124\uD2B8\uC6CC\uD06C \uC624\uB958. \uB098\uC911\uC5D0 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694"}},store:{title:"\uBCF4\uC11D \uC0C1\uC810",hot:"\uC778\uAE30",buy:"\uAD6C\uB9E4",cancel:"\uCDE8\uC18C",unit:"\uBCF4\uC11D",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"{amount}\uAC1C\uC758 \uBCF4\uC11D\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!"},payment:{title:"\uAD6C\uB9E4 \uD655\uC778",insufficientTitle:"\uC794\uC561 \uBD80\uC871",insufficientDesc:"\uBCF4\uC720: {gems} \uBCF4\uC11D",cancel:"\uCDE8\uC18C",confirm:"\uD655\uC778",recharge:"\uCDA9\uC804",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"{cost}<gem></gem>\uC774 \uCC28\uAC10\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}};var Se={app:{title:"Playsout \u0E21\u0E34\u0E19\u0E34\u0E40\u0E01\u0E21",description:"\u0E40\u0E25\u0E48\u0E19\u0E40\u0E01\u0E21\u0E14\u0E48\u0E27\u0E19\u0E42\u0E14\u0E22\u0E44\u0E21\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A"},home:{loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27",logIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",games:"\u0E40\u0E01\u0E21",bannerAlt:"\u0E40\u0E01\u0E21 Playsout",searchPlaceholder:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E15\u0E32\u0E21\u0E0A\u0E37\u0E48\u0E2D\u0E2B\u0E23\u0E37\u0E2D\u0E2B\u0E21\u0E27\u0E14\u0E2B\u0E21\u0E39\u0E48",noGames:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21"},profile:{title:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",settings:"\u0E01\u0E32\u0E23\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32",language:"\u0E20\u0E32\u0E29\u0E32",recentGames:"\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19\u0E25\u0E48\u0E32\u0E2A\u0E38\u0E14",noGames:"\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19",guest:"\u0E1C\u0E39\u0E49\u0E40\u0E22\u0E35\u0E48\u0E22\u0E21\u0E0A\u0E21",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u0E1C\u0E08\u0E0D\u0E20\u0E31\u0E22",Simulation:"\u0E08\u0E33\u0E25\u0E2D\u0E07\u0E2A\u0E16\u0E32\u0E19\u0E01\u0E32\u0E23\u0E13\u0E4C",Casual:"\u0E41\u0E04\u0E0A\u0E0A\u0E27\u0E25",Arcade:"\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E04\u0E14",Moba:"\u0E42\u0E21\u0E1A\u0E32",Puzzle:"\u0E1B\u0E23\u0E34\u0E28\u0E19\u0E32"},auth:{loginSuccess:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08!",loginTitle:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A Playsout",welcome:"\u0E22\u0E34\u0E19\u0E14\u0E35\u0E15\u0E49\u0E2D\u0E19\u0E23\u0E31\u0E1A\u0E2A\u0E39\u0E48\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21 Playsout",prompt:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E23\u0E34\u0E48\u0E21\u0E40\u0E25\u0E48\u0E19",mustLogin:"\u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E25\u0E48\u0E19",authorizeHint:"\u0E04\u0E25\u0E34\u0E01\u0E1B\u0E38\u0E48\u0E21\u0E14\u0E49\u0E32\u0E19\u0E25\u0E48\u0E32\u0E07\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",authorizing:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15...",authorize:"\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",terms:"\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E41\u0E2A\u0E14\u0E07\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E22\u0E2D\u0E21\u0E23\u0E31\u0E1A\u0E02\u0E49\u0E2D\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E43\u0E19\u0E01\u0E32\u0E23\u0E43\u0E2B\u0E49\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23\u0E02\u0E2D\u0E07\u0E40\u0E23\u0E32",signingIn:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E25\u0E07\u0E0A\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E43\u0E0A\u0E49",signMessage:"\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E0B\u0E47\u0E19\u0E0A\u0E37\u0E48\u0E2D\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E43\u0E19\u0E01\u0E23\u0E30\u0E40\u0E1B\u0E4B\u0E32\u0E40\u0E07\u0E34\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13"},game:{loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14",notFound:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21",backHome:"\u0E01\u0E25\u0E31\u0E1A\u0E2B\u0E19\u0E49\u0E32\u0E2B\u0E25\u0E31\u0E01",pageTitleSuffix:"\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21",header:{back:"\u0E01\u0E25\u0E31\u0E1A",shareAria:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",toggleMenuAria:"\u0E2A\u0E25\u0E31\u0E1A\u0E40\u0E21\u0E19\u0E39",fallbackTitle:"\u0E40\u0E01\u0E21"}},menu:{favorite:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14",favorited:"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E43\u0E19\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14\u0E41\u0E25\u0E49\u0E27",profile:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",login:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",refresh:"\u0E23\u0E35\u0E40\u0E1F\u0E23\u0E0A",loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27"},share:{title:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",closeLabel:"\u0E1B\u0E34\u0E14",retry:"\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48",loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14...",imageAlt:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",shareUrlLabel:"\u0E41\u0E0A\u0E23\u0E4C URL:",copied:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01\u0E41\u0E25\u0E49\u0E27",copy:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01",saveShare:"\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E41\u0E25\u0E30\u0E41\u0E0A\u0E23\u0E4C",hint:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E23\u0E27\u0E21\u0E23\u0E2B\u0E31\u0E2A QR \u0E17\u0E35\u0E48\u0E25\u0E34\u0E07\u0E01\u0E4C\u0E44\u0E1B\u0E22\u0E31\u0E07\u0E40\u0E01\u0E21\u0E19\u0E35\u0E49",loadError:"\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",downloadError:"\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08"},checkin:{successTitle:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25!",successMessage:"\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E41\u0E25\u0E49\u0E27",failedTitle:"\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27",canceledTitle:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",errors:{userRejected:"\u0E04\u0E38\u0E13\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E01\u0E32\u0E23\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",insufficientFunds:"\u0E40\u0E07\u0E34\u0E19\u0E44\u0E21\u0E48\u0E1E\u0E2D\u0E08\u0E48\u0E32\u0E22\u0E04\u0E48\u0E32\u0E41\u0E01\u0E4A\u0E2A",alreadyCheckedIn:"\u0E04\u0E38\u0E13\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E27\u0E31\u0E19\u0E19\u0E35\u0E49\u0E44\u0E1B\u0E41\u0E25\u0E49\u0E27 \u0E01\u0E25\u0E31\u0E1A\u0E21\u0E32\u0E43\u0E2B\u0E21\u0E48\u0E1E\u0E23\u0E38\u0E48\u0E07\u0E19\u0E35\u0E49!",network:"\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E40\u0E04\u0E23\u0E37\u0E2D\u0E02\u0E48\u0E32\u0E22 \u0E42\u0E1B\u0E23\u0E14\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48\u0E20\u0E32\u0E22\u0E2B\u0E25\u0E31\u0E07"}},store:{title:"\u0E23\u0E49\u0E32\u0E19\u0E04\u0E49\u0E32\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",hot:"\u0E21\u0E32\u0E41\u0E23\u0E07",buy:"\u0E0B\u0E37\u0E49\u0E2D",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",unit:"\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35!"},payment:{title:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D",insufficientTitle:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E44\u0E21\u0E48\u0E1E\u0E2D",insufficientDesc:"\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48: {gems} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",confirm:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19",recharge:"\u0E40\u0E15\u0E34\u0E21\u0E40\u0E07\u0E34\u0E19",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E2B\u0E31\u0E01 {cost} <gem></gem> \u0E41\u0E25\u0E49\u0E27"}};var Te={app:{title:"Playsout Mini Games",description:"Ch\u01A1i game nhanh kh\xF4ng c\u1EA7n \u0111\u0103ng nh\u1EADp."},home:{loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp",logIn:"\u0110\u0103ng nh\u1EADp",games:"Tr\xF2 ch\u01A1i",bannerAlt:"Tr\xF2 ch\u01A1i Playsout",searchPlaceholder:"T\xECm ki\u1EBFm theo ti\xEAu \u0111\u1EC1 ho\u1EB7c danh m\u1EE5c",noGames:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i"},profile:{title:"H\u1ED3 s\u01A1",settings:"C\xE0i \u0111\u1EB7t",language:"Ng\xF4n ng\u1EEF",recentGames:"Tr\xF2 ch\u01A1i \u0111\xE3 ch\u01A1i g\u1EA7n \u0111\xE2y",noGames:"Ch\u01B0a ch\u01A1i game n\xE0o",guest:"Kh\xE1ch",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Phi\xEAu l\u01B0u",Simulation:"M\xF4 ph\u1ECFng",Casual:"Ph\u1ED5 th\xF4ng",Arcade:"Arcade",Moba:"Moba",Puzzle:"Gi\u1EA3i \u0111\u1ED1"},auth:{loginSuccess:"\u0110\u0103ng nh\u1EADp th\xE0nh c\xF4ng!",loginTitle:"\u0110\u0103ng nh\u1EADp Playsout",welcome:"Ch\xE0o m\u1EEBng \u0111\u1EBFn v\u1EDBi n\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i Playsout",prompt:"\u0110\u0103ng nh\u1EADp \u0111\u1EC3 b\u1EAFt \u0111\u1EA7u ch\u01A1i",mustLogin:"B\u1EA1n ph\u1EA3i \u0111\u0103ng nh\u1EADp \u0111\u1EC3 ch\u01A1i",authorizeHint:"Nh\u1EA5p v\xE0o n\xFAt b\xEAn d\u01B0\u1EDBi \u0111\u1EC3 \u1EE7y quy\u1EC1n \u0111\u0103ng nh\u1EADp",authorizing:"\u0110ang \u1EE7y quy\u1EC1n...",authorize:"\u1EE6y quy\u1EC1n \u0111\u0103ng nh\u1EADp",terms:"B\u1EB1ng c\xE1ch \u1EE7y quy\u1EC1n, b\u1EA1n \u0111\u1ED3ng \xFD v\u1EDBi \u0110i\u1EC1u kho\u1EA3n d\u1ECBch v\u1EE5 c\u1EE7a ch\xFAng t\xF4i",signingIn:"\u0110ang \u0111\u0103ng nh\u1EADp",signMessage:"Vui l\xF2ng k\xFD tin nh\u1EAFn trong v\xED c\u1EE7a b\u1EA1n"},game:{loading:"\u0110ang t\u1EA3i",notFound:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i",backHome:"V\u1EC1 trang ch\u1EE7",pageTitleSuffix:"N\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i",header:{back:"Quay l\u1EA1i",shareAria:"Chia s\u1EBB tr\xF2 ch\u01A1i",toggleMenuAria:"Chuy\u1EC3n \u0111\u1ED5i menu",fallbackTitle:"Tr\xF2 ch\u01A1i"}},menu:{favorite:"Y\xEAu th\xEDch",favorited:"\u0110\xE3 y\xEAu th\xEDch",profile:"H\u1ED3 s\u01A1",login:"\u0110\u0103ng nh\u1EADp",refresh:"L\xE0m m\u1EDBi",loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp"},share:{title:"Chia s\u1EBB tr\xF2 ch\u01A1i",closeLabel:"\u0110\xF3ng",retry:"Th\u1EED l\u1EA1i",loading:"\u0110ang t\u1EA3i...",imageAlt:"H\xECnh \u1EA3nh chia s\u1EBB tr\xF2 ch\u01A1i",shareUrlLabel:"URL chia s\u1EBB:",copied:"\u0110\xE3 sao ch\xE9p",copy:"Sao ch\xE9p",saveShare:"L\u01B0u & Chia s\u1EBB",hint:"H\xECnh \u1EA3nh bao g\u1ED3m m\xE3 QR li\xEAn k\u1EBFt \u0111\u1EBFn tr\xF2 ch\u01A1i n\xE0y",loadError:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh chia s\u1EBB",downloadError:"Kh\xF4ng t\u1EA3i xu\u1ED1ng \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh"},checkin:{successTitle:"B\u1EA1n \u0111\xE3 nh\u1EADn ph\u1EA7n th\u01B0\u1EDFng!",successMessage:"Ph\u1EA7n th\u01B0\u1EDFng c\u1EE7a b\u1EA1n \u0111\xE3 \u0111\u01B0\u1EE3c nh\u1EADn.",failedTitle:"\u0110i\u1EC3m danh th\u1EA5t b\u1EA1i",canceledTitle:"\u0110i\u1EC3m danh \u0111\xE3 h\u1EE7y",errors:{userRejected:"B\u1EA1n \u0111\xE3 h\u1EE7y thao t\xE1c \u0111i\u1EC3m danh",insufficientFunds:"Kh\xF4ng \u0111\u1EE7 ti\u1EC1n \u0111\u1EC3 tr\u1EA3 ph\xED Gas",alreadyCheckedIn:"H\xF4m nay b\u1EA1n \u0111\xE3 \u0111i\u1EC3m danh r\u1ED3i. H\xE3y quay l\u1EA1i v\xE0o ng\xE0y mai!",network:"L\u1ED7i m\u1EA1ng. Vui l\xF2ng th\u1EED l\u1EA1i sau"}},store:{title:"C\u1EEDa h\xE0ng \u0110\xE1 qu\xFD",hot:"HOT",buy:"MUA",cancel:"H\u1EE7y",unit:"\u0110\xE1 qu\xFD",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"B\u1EA1n \u0111\xE3 nh\u1EADn \u0111\u01B0\u1EE3c {amount} \u0111\xE1 qu\xFD!"},payment:{title:"X\xE1c nh\u1EADn mua",insufficientTitle:"S\u1ED1 d\u01B0 kh\xF4ng \u0111\u1EE7",insufficientDesc:"Hi\u1EC7n c\xF3: {gems} \u0110\xE1 qu\xFD",cancel:"H\u1EE7y",confirm:"X\xE1c nh\u1EADn",recharge:"N\u1EA1p ti\u1EC1n",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"\u0110\xE3 tr\u1EEB {cost} <gem></gem>."}};var Ie={app:{title:"Playsout Mini Games",description:"Mainkan game cepat tanpa login."},home:{loggedIn:"Sudah login",logIn:"Login",games:"Game",bannerAlt:"Game Playsout",searchPlaceholder:"Cari berdasarkan judul atau kategori",noGames:"Game tidak ditemukan"},profile:{title:"Profil",settings:"Pengaturan",language:"Bahasa",recentGames:"Game yang Baru Dimainkan",noGames:"Belum ada game yang dimainkan",guest:"Tamu",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Petualangan",Simulation:"Simulasi",Casual:"Kasual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Login berhasil!",loginTitle:"Login Playsout",welcome:"Selamat datang di platform game Playsout",prompt:"Login untuk mulai bermain",mustLogin:"Anda harus login untuk bermain",authorizeHint:"Klik tombol di bawah untuk mengotorisasi login",authorizing:"Mengotorisasi...",authorize:"Otorisasi login",terms:"Dengan mengotorisasi, Anda menyetujui Ketentuan Layanan kami",signingIn:"Masuk...",signMessage:"Silakan tanda tangani pesan di dompet Anda"},game:{loading:"Memuat",notFound:"Game tidak ditemukan",backHome:"Kembali ke beranda",pageTitleSuffix:"Platform Game",header:{back:"Kembali",shareAria:"Bagikan game",toggleMenuAria:"Alihkan menu",fallbackTitle:"Game"}},menu:{favorite:"Favorit",favorited:"Difavoritkan",profile:"Profil",login:"Login",refresh:"Segarkan",loggedIn:"Sudah login"},share:{title:"Bagikan Game",closeLabel:"Tutup",retry:"Coba lagi",loading:"Memuat...",imageAlt:"Gambar berbagi game",shareUrlLabel:"URL Berbagi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Bagikan",hint:"Gambar termasuk kode QR yang menautkan ke game ini",loadError:"Gagal memuat gambar berbagi",downloadError:"Gagal mengunduh gambar"},checkin:{successTitle:"Anda mendapat hadiah!",successMessage:"Hadiah Anda telah diklaim.",failedTitle:"Check-in gagal",canceledTitle:"Check-in dibatalkan",errors:{userRejected:"Anda membatalkan operasi check-in",insufficientFunds:"Dana tidak cukup untuk membayar biaya Gas",alreadyCheckedIn:"Anda sudah check-in hari ini. Kembali lagi besok!",network:"Kesalahan jaringan. Silakan coba lagi nanti"}},store:{title:"Toko Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berhasil",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Konfirmasi Pembelian",insufficientTitle:"Saldo Tidak Cukup",insufficientDesc:"Tersedia: {gems} Permata",cancel:"Batal",confirm:"Konfirmasi",recharge:"Isi Ulang",successTitle:"Pembayaran Berhasil",successMessage:"{cost} <gem></gem> telah dikurangi."}};var Ae={app:{title:"Permainan Mini Playsout",description:"Main permainan pantas tanpa log masuk."},home:{loggedIn:"Log masuk",logIn:"Log masuk",games:"Permainan",bannerAlt:"Permainan Playsout",searchPlaceholder:"Cari mengikut tajuk atau kategori",noGames:"Tiada permainan dijumpai"},profile:{title:"Profil",settings:"Tetapan",language:"Bahasa",recentGames:"Permainan Baru Dimainkan",noGames:"Belum ada permainan dimainkan",guest:"Pelawat",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Pengembaraan",Simulation:"Simulasi",Casual:"Santai",Arcade:"Arked",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Log masuk berjaya!",loginTitle:"Log masuk Playsout",welcome:"Selamat datang ke platform permainan Playsout",prompt:"Log masuk untuk mula bermain",mustLogin:"Anda mesti log masuk untuk bermain",authorizeHint:"Klik butang di bawah untuk membenarkan log masuk",authorizing:"Membenarkan...",authorize:"Benarkan log masuk",terms:"Dengan membenarkan, anda bersetuju dengan Syarat Perkhidmatan kami",signingIn:"Sedang log masuk",signMessage:"Sila tandatangan mesej dalam dompet anda"},game:{loading:"Memuatkan",notFound:"Permainan tidak dijumpai",backHome:"Kembali ke laman utama",pageTitleSuffix:"Platform Permainan",header:{back:"Kembali",shareAria:"Kongsi permainan",toggleMenuAria:"Togol menu",fallbackTitle:"Permainan"}},menu:{favorite:"Kegemaran",favorited:"Dikegemarankan",profile:"Profil",login:"Log masuk",refresh:"Muat semula",loggedIn:"Log masuk"},share:{title:"Kongsi Permainan",closeLabel:"Tutup",retry:"Cuba lagi",loading:"Memuatkan...",imageAlt:"Imej kongsi permainan",shareUrlLabel:"URL Kongsi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Kongsi",hint:"Imej termasuk kod QR yang memaut ke permainan ini",loadError:"Gagal memuatkan imej kongsi",downloadError:"Gagal memuat turun imej"},checkin:{successTitle:"Anda mendapat ganjaran!",successMessage:"Ganjaran anda telah dituntut.",failedTitle:"Daftar masuk gagal",canceledTitle:"Daftar masuk dibatalkan",errors:{userRejected:"Anda membatalkan operasi daftar masuk",insufficientFunds:"Dana tidak mencukupi untuk membayar yuran Gas",alreadyCheckedIn:"Anda sudah daftar masuk hari ini. Kembali lagi esok!",network:"Ralat rangkaian. Sila cuba lagi kemudian"}},store:{title:"Kedai Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berjaya",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Sahkan Pembelian",insufficientTitle:"Baki Tidak Mencukupi",insufficientDesc:"Tersedia: {gems} Permata",cancel:"Batal",confirm:"Sahkan",recharge:"Tambah Nilai",successTitle:"Pembayaran Berjaya",successMessage:"{cost} <gem></gem> telah ditolak."}};var P=o=>{if(typeof window>"u")return o;let t=s(o);return ye(t)},nt="https://games.playsout.com/resources/icon/fonts",$=o=>{if(typeof window>"u")return o;let t=o.replace(/^\.\//,"");return`${nt}/${t}`},R={en:ve,zh:we,ja:ke,ko:xe,th:Se,vi:Te,id:Ie,ms:Ae};function oe(o,t){let e=t.split("."),a=o;for(let i of e)if(a&&typeof a=="object"&&i in a)a=a[i];else return t;return typeof a=="string"?a:t}function Ee(o,t={}){return o.replace(/\{(\w+)\}/g,(e,a)=>String(t[a]??`{${a}}`))}var Ce=`
1
+ "use strict";var __PlaysoutBundle=(()=>{var Y=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var ze=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var Ue=(i,t)=>{for(var e in t)Y(i,e,{get:t[e],enumerable:!0})},Be=(i,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ze(t))!Ne.call(i,r)&&r!==e&&Y(i,r,{get:()=>t[r],enumerable:!(a=Oe(t,r))||a.enumerable});return i};var je=i=>Be(Y({},"__esModule",{value:!0}),i);var Dt={};Ue(Dt,{Login:()=>vt,PlaysoutSDKClass:()=>_t,destroy:()=>bt,getCategories:()=>Pt,getGames:()=>Tt,getLocale:()=>Et,getToken:()=>kt,getUser:()=>It,getUserInfo:()=>xt,init:()=>pt,instance:()=>Mt,isInitialized:()=>Ct,isLoggedIn:()=>Rt,logout:()=>wt,mount:()=>ft,off:()=>Lt,on:()=>At,setLocale:()=>St,unmount:()=>yt});var x=class extends Error{constructor(e,a,r){super(a);this.code=e;this.details=r;this.name="SDKError"}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}},He={NOT_INITIALIZED:"SDK not initialized. Please call PlaysoutSDK.init() first.",ALREADY_INITIALIZED:"SDK already initialized. Please do not call init() more than once.",NOT_LOGGED_IN:"User not logged in. Please log in first.",TOKEN_EXPIRED:"Login token has expired. Please log in again.",INVALID_TOKEN:"Invalid login token. Please log in again.",NETWORK_ERROR:"Network connection failed. Please check your network.",TIMEOUT:"Request timed out. Please try again later.",SERVER_ERROR:"Server is busy. Please try again later.",API_ERROR:"API request failed.",INVALID_PARAMS:"Invalid parameter(s).",MISSING_PARAMS:"Missing required parameter(s).",FEATURE_NOT_SUPPORTED:"This feature is not supported in the current environment.",UNKNOWN:"An unknown error occurred.",PAYMENT_FAILED:"Payment failed.",SHARE_FAILED:"Share failed."};function g(i,t){return new x(i,He[i],t)}var G="playsout_",O=class{constructor(t){this.storage=t}get(t){try{return this.storage.getItem(G+t)}catch{return null}}set(t,e){try{this.storage.setItem(G+t,e)}catch(a){console.warn("[PlaysoutSDK] Storage set failed:",a)}}remove(t){try{this.storage.removeItem(G+t)}catch{}}clear(){try{let t=[];for(let e=0;e<this.storage.length;e++){let a=this.storage.key(e);a&&a.startsWith(G)&&t.push(a)}t.forEach(e=>this.storage.removeItem(e))}catch{}}},Q=class{constructor(){this.store=new Map}get(t){return this.store.get(t)??null}set(t,e){this.store.set(t,e)}remove(t){this.store.delete(t)}clear(){this.store.clear()}};function le(i="localStorage"){return typeof window>"u"||i==="memory"?new Q:i==="sessionStorage"?new O(sessionStorage):new O(localStorage)}var I=le(),h={get:i=>I.get(i),set:(i,t)=>{I.set(i,t)},remove:i=>{I.remove(i)},clear:()=>{I.clear()},getJSON:i=>{let t=I.get(i);if(!t)return null;try{return JSON.parse(t)}catch{return null}},setJSON:(i,t)=>{I.set(i,JSON.stringify(t))},configure(i){I=le(i)}},p={TOKEN_DATA:"token_data",USER:"user",LOCALE:"locale",CONFIG:"config"};var J=class{constructor(){this.events=new Map}on(t,e){return this.events.has(t)||this.events.set(t,new Set),this.events.get(t).add(e),()=>{this.off(t,e)}}once(t,e){let a=r=>{e(r),this.off(t,a)};return this.on(t,a)}off(t,e){this.events.get(t)?.delete(e),this.events.get(t)?.size===0&&this.events.delete(t)}emit(t,e){this.events.get(t)?.forEach(a=>{try{a(e)}catch(r){console.error(`[PlaysoutSDK] Event handler error for "${t}":`,r)}})}listenerCount(t){return this.events.get(t)?.size??0}clear(){this.events.clear()}},T=new J,b={on:(i,t)=>T.on(i,t),once:(i,t)=>T.once(i,t),off:(i,t)=>{T.off(i,t)},clear:()=>{T.clear()},emit:(i,t)=>{T.emit(i,t)}};var $e="https://games.playsout.com/resources/icon/image";function s(i){if(!i||/^(data:|https?:|blob:)/i.test(i))return i;let t=i.replace(/^\.\//,"");return`${$e}/${t}`}var Ke=i=>{if(!i)return i;try{let t=new URL(i);if(t.hostname==="games.playsout.com"){let e=t.pathname,a=e.endsWith("/"),r=/\.[a-z0-9]+$/i.test(e);!a&&!r&&(t.pathname=`${e}/`)}return t.toString()}catch{return i}},Fe=i=>i.map(t=>{if(!t.externalUrl)return t;let e=Ke(t.externalUrl);return e===t.externalUrl?t:{...t,externalUrl:e}}),qe=[{id:"BlockCrushFun",title:"Block Crush Fun",category:"Puzzle",image:s("./games/BlockCrushFun.png"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BlockCrushFun"},{id:"DogeSurvivors",title:"Doge Survivors",category:"Doge OS",image:s("./games/DogeSurvivors.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeSurvivors/"},{id:"DogeMaze",title:"Doge Maze",category:"Doge OS",image:s("./games/DogeMaze.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMaze/"},{id:"DogeMart",title:"Doge Mart",category:"Doge OS",image:s("./games/DogeMart.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMart/"},{id:"KittyEscape",title:"Kitty Escape",category:"Puzzle",image:s("./games/KittyEscape.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/KittyEscape/"},{id:"ProjectGarden",title:"Project: Garden",category:"Adventure",image:s("./games/SimulatedAdventures.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/simulated/"},{id:"ProjectIDLE",title:"Project: IDLE",category:"Simulation",image:s("./games/ProjectIDLE.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/idle/"},{id:"CulinaryStarWeb",title:"Culinary Star",category:"Casual",image:s("./games/CulinaryStar.webp"),description:"Cooking game",isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CulinaryStar/"},{id:"PickaxeQuest",title:"Pickaxe Quest",category:"Adventure",image:s("./games/PickaxeQuest.jpg"),description:"Mining and adventure game",isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/PickaxeQuest/",apiGameId:73},{id:"MonsterSurvivors",title:"Monster Survivors",category:"Adventure",image:s("./games/MonsterSurvivors.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MonsterSurvivors/"},{id:"IdleTowerDefense",title:"Idle Tower Defense",category:"RPG",image:s("./games/IdleTowerDefense.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/IdleTowerDefense/"},{id:"MushroomWarriors",title:"Mushroom Warriors",category:"RPG",image:s("./games/MushroomWarriors.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/MushroomWarriors/"},{id:"FollowThePath",title:"Follow The Path",category:"Arcade",image:s("./games/FollowThePath.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FollowThePath/"},{id:"ColorRun",title:"Color Run",category:"Arcade",image:s("./games/ColorRun.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorRun/"},{id:"StupidArrow",title:"Stupid Arrow",category:"Arcade",image:s("./games/StupidArrow.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/StupidArrow/"},{id:"ZigZag",title:"Zig Zag",category:"Arcade",image:s("./games/ZigZag.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ZigZag/"},{id:"SpikesEverywhere",title:"Spikes Everywhere",category:"Arcade",image:s("./games/SpikesEverywhere.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpikesEverywhere/"},{id:"ArrowRacer",title:"Arrow Racer",category:"Arcade",image:s("./games/ArrowRacer.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ArrowRacer/"},{id:"CircleLeap",title:"Circle Leap",category:"Arcade",image:s("./games/CircleLeap.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircleLeap/"},{id:"ColorMatcher",title:"Color Matcher",category:"Arcade",image:s("./games/ColorMatcher.jpg"),isNew:!1,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ColorMatcher/"},{id:"EndlessMaze",title:"Endless Maze",category:"Arcade",image:s("./games/EndlessMaze.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/EndlessMaze/"},{id:"SpinningAround",title:"Spinning Around",category:"Arcade",image:s("./games/SpinningAround.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/SpinningAround/"},{id:"BoomBallz",title:"Boom Ballz",category:"Arcade",image:s("./games/BoomBallz.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/BoomBallz/"},{id:"CubeHead",title:"Cube Head",category:"Arcade",image:s("./games/CubeHead.jpg"),isNew:!1,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CubeHead/"},{id:"CapybaraLink",title:"Capybara Link",category:"Puzzle",image:s("./games/CapybaraLink.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CapybaraLink/"},{id:"Snake2048",title:"Snake 2048",category:"Puzzle",image:s("./games/Snake2048.jpg"),isNew:!0,isHot:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Snake2048/"},{id:"FishTankFury",title:"Fish Tank Fury",category:"Puzzle",image:s("./games/FishTankFury.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/FishTankFury/"},{id:"ConnectBalls",title:"Connect Balls",category:"Arcade",image:s("./games/ConnectBalls.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/ConnectBalls/"},{id:"CircularBreaker",title:"Circular Breaker",category:"Arcade",image:s("./games/CircularBreaker.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CircularBreaker/"},{id:"OneDoor",title:"One Door",category:"Arcade",image:s("./games/OneDoor.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/OneDoor/"},{id:"CatchtheFruits",title:"Catch the Fruits",category:"Casual",image:s("./games/CatchtheFruits.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/CatchtheFruits/"},{id:"Falling2048",title:"Falling 2048",category:"Casual",image:s("./games/Falling2048.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Falling2048/"}],ce=Fe(qe),w=()=>ce.filter(i=>i.enable),jt={Adventure:w().filter(i=>i.category==="Adventure"),Moba:w().filter(i=>i.category==="Moba")};var de=i=>ce.find(t=>t.id===i);var ge=()=>Array.from(new Set(w().map(i=>i.category)));var te="https://api.playsout.com",ae=3e4,Ve=new Set([10010,10011,10012,10013]);function Ye(i){let t=String(i?.platform||"").toLowerCase();if(t==="tiktok"){let e=i.authorizationCode;if(typeof e!="string"||!e.trim())throw g("MISSING_PARAMS","authorizationCode is required for TikTok login");return{platform:t,authorizationCode:e}}if(t==="grab"||t==="eros"){let e=i;if(typeof e.platformUserId!="string"||!e.platformUserId.trim())throw g("MISSING_PARAMS","platformUserId is required for Grab/Eros login");if(typeof e.platformToken!="string"||!e.platformToken.trim())throw g("MISSING_PARAMS","platformToken is required for Grab/Eros login");return{platform:t,platformUserId:e.platformUserId,platformToken:e.platformToken,username:typeof e.username=="string"?e.username:void 0,inviteCode:typeof e.inviteCode=="string"?e.inviteCode:void 0}}throw g("INVALID_PARAMS","Unsupported platform. Expected grab, eros, or tiktok")}var P=null,X=null,A=null;function he(i){X=i}function pe(i){A=i}async function ue(i,t={},e,a=!1){let r=e?.apiBaseUrl||te,o=i.startsWith("http")?i:`${r}${i}`,n=new AbortController,d=setTimeout(()=>n.abort(),ae);try{let m=h.getJSON(p.TOKEN_DATA),y={"Content-Type":"application/json",...t.headers};m?.accessToken&&!y.token&&(y.token=m.accessToken);let f=await fetch(o,{...t,signal:n.signal,headers:y});if(clearTimeout(d),!f.ok){if(f.status===401&&!a)return await me(i,t,e);throw g(f.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${f.status}: ${f.statusText}`)}let u=await f.json();if(u.code!==void 0&&Ve.has(u.code)&&!a){if(i.includes("/platform/refreshToken"))throw g("TOKEN_EXPIRED",u.msg||"Token expired");return await me(i,t,e)}if(u.code!==0&&u.code!==1e4)throw g("API_ERROR",u.msg||"API request failed");return u.data}catch(m){throw clearTimeout(d),m instanceof x?m:m instanceof Error?m.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",m.message):g("UNKNOWN")}}async function me(i,t,e){await fe(e);let a=e?.apiBaseUrl||te,r=i.startsWith("http")?i:`${a}${i}`,o=new AbortController,n=setTimeout(()=>o.abort(),ae);try{let d=h.getJSON(p.TOKEN_DATA),m={"Content-Type":"application/json",...t.headers};d?.accessToken&&(m.token=d.accessToken);let y=await fetch(r,{...t,signal:o.signal,headers:m});if(clearTimeout(n),!y.ok)throw g(y.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${y.status}: ${y.statusText}`);let f=await y.json();if(f.code!==0&&f.code!==1e4)throw g("API_ERROR",f.msg||"API request failed");return f.data}catch(d){throw clearTimeout(n),d instanceof x?d:d instanceof Error&&d.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",d?.message||"Request failed")}}async function fe(i){return P||(P=(async()=>{let t=h.getJSON(p.TOKEN_DATA);if(!t?.refreshToken)throw g("NOT_LOGGED_IN","No refresh token available");let e=i?.apiBaseUrl||te,a=new AbortController,r=setTimeout(()=>a.abort(),ae);try{let o=await fetch(`${e}/platform/refreshToken`,{method:"POST",signal:a.signal,headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:t.refreshToken})});if(clearTimeout(r),!o.ok)throw g("TOKEN_EXPIRED","Failed to refresh token");let n=await o.json();if(n.code!==0&&n.code!==1e4||!n.data)throw g("TOKEN_EXPIRED",n.msg||"Failed to refresh token");let d=n.data;if(h.setJSON(p.TOKEN_DATA,d),X)try{X(d)}catch{}return d}catch(o){if(clearTimeout(r),o instanceof x){if(A)try{A()}catch{}throw o}if(o instanceof Error&&o.name==="AbortError")throw g("TIMEOUT");if(A)try{A()}catch{}throw g("TOKEN_EXPIRED","Refresh token failed")}finally{P=null}})(),P)}var ee=class{constructor(){this.config=null}configure(t){this.config=t}async refreshToken(){return await fe(this.config||void 0)}async getGames(t){let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(r=>r.title.toLowerCase().includes(a)||r.category.toLowerCase().includes(a)||r.description&&r.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){let t=w(),e=new Map;return t.forEach(a=>{let r=e.get(a.category)||0;e.set(a.category,r+1)}),Array.from(e.entries()).map(([a,r],o)=>({id:`category_${o}`,name:a,count:r}))}async getGameById(t){return de(t)}async getCategoryNames(){return ge()}async loginOnly(t){let e=Ye(t);return await ue("/platform/login",{method:"POST",body:JSON.stringify(e)},this.config??void 0)}async Login(t){let e=await this.loginOnly(t),a;try{a=await this.getUserInfo()}catch{}return{tokenData:e,user:a}}async getUserInfo(){return await ue("/platform/user",{method:"GET"},this.config??void 0)}async getUser(){return h.getJSON(p.USER)}async validateToken(t){return!!t}},Z=null;function z(){return Z||(Z=new ee),Z}var Je="https://api.playsout.com",ye="zh",L=class i{constructor(){this.config=null;this._isInitialized=!1;this._user=null;this._token=null;this._locale=ye;this._widget=null}static getInstance(){return i.instance||(i.instance=new i),i.instance}async init(t={}){if(this._isInitialized)throw g("ALREADY_INITIALIZED");this.config={apiBaseUrl:t.apiBaseUrl||Je,debug:t.debug||!1,storage:t.storage||"localStorage",locale:t.locale||ye,appId:t.appId||""},h.configure(this.config.storage),he(r=>{this._token=r.accessToken}),pe(()=>{this._user=null,this._token=null,h.remove(p.TOKEN_DATA),h.remove(p.USER),b.emit("authExpired"),this.config?.debug&&console.warn("[PlaysoutSDK] Auth expired, logged out")});let e=h.getJSON(p.TOKEN_DATA);this._user=h.getJSON(p.USER),this._locale=h.get(p.LOCALE)||this.config.locale;let a=Math.floor(Date.now()/1e3);if(e&&e.refreshExpiresAt>a&&(this._token=e.accessToken),this._isInitialized=!0,this.config.debug&&(console.log("[PlaysoutSDK] Initialized with config:",this.config),console.log("[PlaysoutSDK] Restored token:",this._token?this._token.substring(0,20)+"...":"(none)")),b.emit("initialized"),e){let r=Math.floor(Date.now()/1e3);if(e.expiresAt-r<=300)try{let o=z();o.configure(this.config),await o.refreshToken();let n=h.getJSON(p.TOKEN_DATA);n&&(this._token=n.accessToken),this.config.debug&&console.log("[PlaysoutSDK] Token proactively refreshed at init")}catch(o){this.config.debug&&console.warn("[PlaysoutSDK] Proactive refresh failed, will retry on next request:",o)}}}destroy(){this.config=null,this._isInitialized=!1,this._user=null,this._token=null,h.clear(),b.clear()}get isInitialized(){return this._isInitialized}get isLoggedIn(){return!!this._token}get user(){return this._user}get token(){return this._token}get locale(){return this._locale}get sdkConfig(){return this.config}async Login(t){this.ensureInitialized(),this.config?.debug&&console.log("[PlaysoutSDK] Login with params:",t);let e=z();e.configure(this.config);let a=await e.loginOnly(t);h.setJSON(p.TOKEN_DATA,a),this.config?.debug&&console.log("[PlaysoutSDK] Token saved, expires at:",new Date(a.expiresAt*1e3).toISOString());let r;try{r=await e.getUserInfo()}catch(o){this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo failed, login still success:",o)}return this._token=a.accessToken,r&&(this._user={userId:String(r.id),username:r.username},h.setJSON(p.USER,this._user)),this.config?.debug&&console.log("[PlaysoutSDK] Login success, user:",r),b.emit("login",{user:this._user,token:this._token}),{tokenData:a,user:r}}async getUserInfo(){if(this.ensureInitialized(),!this._token)throw g("NOT_LOGGED_IN","Please login first");let t=z();t.configure(this.config);let e=await t.getUserInfo();return this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo result:",e),e&&(this._user={userId:String(e.id),username:e.username},h.setJSON(p.USER,this._user)),e}logout(){this._user=null,this._token=null,h.remove(p.TOKEN_DATA),h.remove(p.USER),b.emit("logout")}getToken(){return this.ensureInitialized(),this._token}getUser(){return this.ensureInitialized(),this._user}setLocale(t){if(this.ensureInitialized(),!["zh","en","ja","ko","vi","th","id","ms"].includes(t))throw g("INVALID_PARAMS",`Unsupported locale: ${t}`);this._locale=t,h.set(p.LOCALE,t),this.config?.debug&&console.log("[PlaysoutSDK] Locale changed to:",t);let e=this._widget||document.querySelector("playsout-widget");e&&e.getAttribute("locale")!==t&&e.setAttribute("locale",t),b.emit("localeChange",t)}getLocale(){return this.ensureInitialized(),this._locale}async getGames(t){this.ensureInitialized();let e=w();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(r=>r.title.toLowerCase().includes(a)||r.category.toLowerCase().includes(a)||r.description&&r.description.toLowerCase().includes(a))}if(t?.sortBy)switch(t.sortBy){case"newest":e=e.filter(a=>a.isNew).concat(e.filter(a=>!a.isNew));break;case"rating":e=e.filter(a=>a.isHot).concat(e.filter(a=>!a.isHot));break}if(t?.page&&t?.pageSize){let a=(t.page-1)*t.pageSize;e=e.slice(a,a+t.pageSize)}return e}async getCategories(){this.ensureInitialized();let t=w(),e=new Map;return t.forEach(a=>{let r=e.get(a.category)||0;e.set(a.category,r+1)}),Array.from(e.entries()).map(([a,r],o)=>({id:`category_${o}`,name:a,count:r}))}async getGameById(t){return this.ensureInitialized(),w().find(e=>e.id===t)}mount(t,e){if(this.ensureInitialized(),typeof document>"u")throw g("FEATURE_NOT_SUPPORTED","mount requires DOM environment");let a=document.querySelector(t);if(!a)throw g("INVALID_PARAMS",`Container not found: ${t}`);let r=document.createElement("playsout-widget");this.config?.appId&&r.setAttribute("app-id",this.config.appId),r.setAttribute("locale",e?.locale||this._locale),e?.detailMode&&r.setAttribute("detail-mode",e.detailMode),this._widget=r,e?.onGameClick&&r.addEventListener("game-click",o=>{let n=o;e.onGameClick(n.detail)}),e?.onLoginRequired&&r.addEventListener("login-required",e.onLoginRequired),e?.onLocaleChange&&r.addEventListener("locale-change",o=>{let n=o;e.onLocaleChange(n.detail)}),a.appendChild(r),this.config?.debug&&console.log("[PlaysoutSDK] Widget mounted to:",t)}unmount(){let t=document.querySelector("playsout-widget");t&&t.remove(),this._widget=null}on(t,e){return this.ensureInitialized(),b.on(t,e)}off(t,e){this.ensureInitialized(),b.off(t,e)}ensureInitialized(){if(!this._isInitialized)throw g("NOT_INITIALIZED")}},l=L.getInstance();typeof window<"u"&&(window.__playsout_sdk_instance=l);var N=Object.freeze({init:l.init.bind(l),mount:l.mount.bind(l),unmount:l.unmount.bind(l),destroy:l.destroy.bind(l),Login:l.Login.bind(l),logout:l.logout.bind(l),getToken:l.getToken.bind(l),getUserInfo:l.getUserInfo.bind(l),getUser:l.getUser.bind(l),setLocale:l.setLocale.bind(l),getLocale:l.getLocale.bind(l),getGames:l.getGames.bind(l),getCategories:l.getCategories.bind(l),on:l.on.bind(l),off:l.off.bind(l),get isInitialized(){return l.isInitialized},get isLoggedIn(){return l.isLoggedIn},instance:l,PlaysoutSDKClass:L});var Ze="games.playsout.com";var ie="__playsout_img_cache_v1",$=`${ie}_blob_`,K=!1,B=4*1024*1024-1024*1024;function c(...i){}var S=new Map,U=new Map,Xe=50,C=new Map,j=new Map,v=0;function re(){try{let i=localStorage.getItem(ie);if(!i)return c("loadCacheIndex: \u65E0\u7F13\u5B58\u7D22\u5F15"),v=0,new Map;let t=JSON.parse(i);c("loadCacheIndex: \u52A0\u8F7D\u4E86",t.length,"\u6761\u8BB0\u5F55"),v=0;for(let e of t){let a=`${$}${btoa(e.url).replace(/[\/+=]/g,"_")}`;localStorage.getItem(a)&&(v+=e.size)}return c("loadCacheIndex: \u5F53\u524D blob \u603B\u91CF",v,"bytes"),new Map(t.map(e=>[e.url,e]))}catch{return c("loadCacheIndex: \u89E3\u6790\u5931\u8D25"),v=0,new Map}}function H(i){try{let t=Array.from(i.values());t.length>200&&(t.sort((e,a)=>a.timestamp-e.timestamp),t.length=200),localStorage.setItem(ie,JSON.stringify(t)),c("saveCacheIndex: \u4FDD\u5B58\u4E86",t.length,"\u6761\u8BB0\u5F55")}catch(t){c("saveCacheIndex: \u4FDD\u5B58\u5931\u8D25",t)}}function et(i,t){if(!(v+t<=B))try{let e=re(),a=Array.from(e.values()).map(r=>({record:r,score:ve(r.url)??1/0})).filter(r=>r.score>i).sort((r,o)=>o.score-r.score);for(let{record:r}of a){if(v+t<=B)break;let o=`${$}${btoa(r.url).replace(/[\/+=]/g,"_")}`;localStorage.removeItem(o),e.delete(r.url),v-=r.size,c("evictLowerPriorityEntries: \u91CA\u653E\u4F4E\u4F18\u5148\u7EA7\u7F13\u5B58",r.url,"\u8282\u7701",r.size,"bytes")}H(e)}catch(e){c("evictLowerPriorityEntries: \u5931\u8D25",e)}}function be(i,t){if(S.size>=Xe){let e=null,a=1/0;for(let[r,o]of S)o.lastAccess<a&&(a=o.lastAccess,e=r);if(e){let r=S.get(e);URL.revokeObjectURL(URL.createObjectURL(r.blob)),S.delete(e),c("addToMemoryCache: LRU\u6DD8\u6C70",e)}}S.set(i,{blob:t,lastAccess:Date.now()}),c("addToMemoryCache: \u6DFB\u52A0\u5230\u5185\u5B58\u7F13\u5B58",i,"\u5927\u5C0F:",t.size,"bytes")}async function tt(i){if(!K)return;if(U.has(i)){c("cacheImage:",i,"\u8BE5\u8BF7\u6C42\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u7B49\u5F85\u5B8C\u6210"),await U.get(i);return}c("cacheImage: \u5F00\u59CB\u4E0B\u8F7D",i);let t=(async()=>{try{let e=await fetch(i);if(!e.ok){c("cacheImage:",i,"\u54CD\u5E94\u5931\u8D25",e.status);return}let a=await e.blob(),r=e.headers.get("ETag")||"";c("cacheImage:",i,"\u4E0B\u8F7D\u6210\u529F\uFF0C\u5927\u5C0F:",a.size,"ETag:",r),be(i,a);let o=ve(i);if(o!==void 0)if(et(o,a.size),v+a.size<=B)try{let n=re();n.set(i,{url:i,timestamp:Date.now(),etag:r,size:a.size}),H(n);let d=JSON.stringify({type:a.type,data:Array.from(new Uint8Array(await a.arrayBuffer()))}),m=`${$}${btoa(i).replace(/[\/+=]/g,"_")}`;localStorage.setItem(m,d),v+=a.size,c("cacheImage:",i,"\u5DF2\u4FDD\u5B58\u5230localStorage\uFF08\u5360\u7528",a.size,"bytes\uFF0C\u9884\u7B97\u5269\u4F59",B-v,"\uFF09")}catch(n){n.name==="QuotaExceededError"?c("cacheImage: localStorage \u914D\u989D\u5DF2\u6EE1\uFF0C\u505C\u6B62\u5199\u5165"):c("cacheImage:",i,"localStorage\u4FDD\u5B58\u5931\u8D25",n)}else c("cacheImage:",i,"\u817E\u51FA\u7A7A\u95F4\u540E\u4ECD\u8D85\u8FC7\u9884\u7B97\uFF0C\u8DF3\u8FC7");else c("cacheImage:",i,"\u975E\u4F18\u5148\u7EA7URL\uFF0C\u4E0D\u5199\u5165localStorage")}catch(e){c("cacheImage:",i,"\u4E0B\u8F7D\u5931\u8D25",e)}finally{U.delete(i)}})();U.set(i,t)}function oe(i){try{if(new URL(i).hostname===Ze)return c("isCacheableImage:",i,"\u662FCDN\u56FE\u7247"),!0}catch{}return i.startsWith("/games/")||i.startsWith("./games/")||i.startsWith("/home-")||i.startsWith("./home-")||i.startsWith("/logo")||i.startsWith("./logo")?(c("isCacheableImage:",i,"\u662F\u672C\u5730\u56FE\u7247"),!0):(c("isCacheableImage:",i,"\u4E0D\u662F\u53EF\u7F13\u5B58\u7684\u56FE\u7247"),!1)}function ve(i){return j.has(i)?j.get(i):C.get(i)}function we(i){if(!K)return;let t=-1e3;for(let e of i)oe(e)&&j.set(e,t++);c("setCriticalAssets: \u5171",j.size,"\u4E2A\u5173\u952E\u8D44\u6E90")}function ke(i,t=!1){if(!K)return;t||C.clear();let e=0;if(t){for(let r of C.values())r>e&&(e=r);e+=1}let a=e;for(let r of i)oe(r)&&C.set(r,a++);c("setPriorityCache: \u5F53\u524D\u5171",C.size,"\u4E2A\u4F18\u5148\u7F13\u5B58URL")}function xe(i){if(!K)return i;if(c("resolveWithCache:",i),!oe(i))return c("resolveWithCache:",i,"\u4E0D\u662FCDN\u56FE\u7247\uFF0C\u539F\u6837\u8FD4\u56DE"),i;if(S.has(i)){let e=S.get(i);e.lastAccess=Date.now();try{let a=URL.createObjectURL(e.blob);return c("resolveWithCache:",i,"\u547D\u4E2D\u5185\u5B58\u7F13\u5B58\uFF0C\u8FD4\u56DEblob URL"),a}catch{c("resolveWithCache:",i,"\u521B\u5EFAblob URL\u5931\u8D25")}}let t=re();if(t.has(i)){let e=`${$}${btoa(i).replace(/[\/+=]/g,"_")}`,a=localStorage.getItem(e);if(a)try{let{type:r,data:o}=JSON.parse(a),n=new Blob([new Uint8Array(o)],{type:r});be(i,n);let d=URL.createObjectURL(n);return c("resolveWithCache:",i,"\u547D\u4E2DlocalStorage\u7F13\u5B58\uFF0C\u540C\u6B65\u8FD4\u56DEblob URL"),d}catch(r){c("resolveWithCache:",i,"localStorage blob\u89E3\u6790\u5931\u8D25\uFF0C\u6E05\u9664\u7F13\u5B58",r),t.delete(i),H(t),localStorage.removeItem(e)}else c("resolveWithCache:",i,"localStorage blob\u4E0D\u5B58\u5728\uFF0C\u6E05\u9664\u7D22\u5F15"),t.delete(i),H(t)}return c("resolveWithCache:",i,"\u5B8C\u5168\u6CA1\u6709\u7F13\u5B58\uFF0C\u540E\u53F0\u4E0B\u8F7D"),tt(i),i}var ne="privy-bridge";var F="DIAMOND",at="2025.01";var it=()=>`host-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,E=i=>typeof i!="string"||i.length>128?"":i,rt=i=>{let t=Number(i);return!Number.isSafeInteger(t)||t<=0?0:t},q=class{constructor(t){this.orders=new Map;this.pendingPayment=null;this.attached=!1;this.options=t,this.handleMessage=this.handleMessage.bind(this)}attach(){this.attached||typeof window>"u"||(window.addEventListener("message",this.handleMessage),this.attached=!0)}detach(){!this.attached||typeof window>"u"||(window.removeEventListener("message",this.handleMessage),this.attached=!1,this.cancelPendingPayment({code:"USER_CANCELLED",message:"Host view closed"}))}cancelPendingPayment(t={code:"USER_CANCELLED",message:"Payment cancelled"}){if(!this.pendingPayment)return;let e=this.pendingPayment;this.pendingPayment=null,this.updateOrderStatus(e.order.hostOrderId,"cancelled"),this.sendError(e.request,t)}handleMessage(t){let e=this.options.getIframe();if(!e?.contentWindow||t.source!==e.contentWindow)return;let a=this.getGameOrigin();if(!a||t.origin!==a)return;let r=t.data;if(this.isValidRequest(r))switch(r.method){case"bridge.handshake":this.handleHandshake(r);return;case"auth.getUser":this.handleGetUser(r);return;case"pay.createOrder":this.handleCreateOrder(r);return;case"pay.request":this.handlePaymentRequest(r);return;case"pay.query":this.handlePaymentQuery(r);return;default:this.sendError(r,{code:"INVALID_METHOD",message:"Unsupported method"})}}isValidRequest(t){return!!(t&&t.channel===ne&&t.type==="request"&&typeof t.id=="string"&&t.id.length>0&&t.id.length<=128&&typeof t.method=="string"&&t.method.length>0&&t.method.length<=128)}getGameOrigin(){let t=this.options.getGameUrl();if(!t||typeof window>"u")return"";try{return new URL(t,window.location.href).origin}catch{return""}}postToGame(t){let e=this.options.getIframe(),a=this.getGameOrigin();!e?.contentWindow||!a||e.contentWindow.postMessage(t,a)}sendResponse(t,e){this.postToGame({channel:ne,version:"1.0",type:"response",id:t.id,method:t.method,payload:e})}sendError(t,e){this.postToGame({channel:ne,version:"1.0",type:"response",id:t.id,method:t.method,error:e})}handleHandshake(t){this.sendResponse(t,{hostVersion:at,capabilities:["auth.getUser","pay.createOrder","pay.request","pay.query"],capabilitiesDetail:{auth:{methods:["account"],scopes:["basic"]},pay:{methods:["balance"],currency:F,flow:["createOrder","request"]}},config:{currency:F}})}handleGetUser(t){let e=this.options.getUser();if(!e){this.sendError(t,{code:"AUTH_REQUIRED",message:"User not logged in"});return}this.sendResponse(t,{uid:e.uid,nickname:e.nickname,avatarUrl:e.avatarUrl||"",locale:this.options.getLocale(),roles:["player"]})}handleCreateOrder(t){let e=t.payload||{},a=E(e.orderId),r=E(e.productId),o=rt(e.amount);if(!a||!o){this.sendError(t,{code:"INVALID_REQUEST",message:"Invalid order payload"});return}let n=it(),d=Math.floor((Date.now()+6e5)/1e3),m={orderId:a,hostOrderId:n,amount:o,currency:F,productId:r,status:"created",expiresAt:d};this.orders.set(n,m),this.sendResponse(t,{orderId:a,hostOrderId:n,amount:o,currency:F,productId:r,expiresAt:d})}async handlePaymentRequest(t){let e=t.payload||{},a=E(e.orderId),r=E(e.hostOrderId);if(!a||!r){this.sendError(t,{code:"INVALID_REQUEST",message:"Missing orderId or hostOrderId"});return}if(this.pendingPayment){this.sendError(t,{code:"PAYMENT_PENDING",message:"Payment already in progress"});return}let o=this.orders.get(r);if(!o||o.orderId!==a){this.sendError(t,{code:"INVALID_REQUEST",message:"Order not found"});return}if(o.status==="success"){this.sendError(t,{code:"ORDER_ALREADY_PAID",message:"Order already paid"});return}if(o.expiresAt<=Math.floor(Date.now()/1e3)){this.updateOrderStatus(r,"expired"),this.sendError(t,{code:"ORDER_EXPIRED",message:"Order expired"});return}this.updateOrderStatus(r,"pending"),this.pendingPayment={request:t,order:o};let n=await this.options.requestPayment({orderId:o.orderId,hostOrderId:o.hostOrderId,amount:o.amount,currency:o.currency,productId:o.productId});if(this.pendingPayment?.request.id===t.id){if(this.pendingPayment=null,n.status==="success"){this.updateOrderStatus(r,"success"),this.sendResponse(t,{success:!0,orderId:a,hostOrderId:r,balance:n.balance});return}this.updateOrderStatus(r,n.status==="insufficient"?"created":"cancelled"),this.sendError(t,{code:n.status==="insufficient"?"INSUFFICIENT_BALANCE":"USER_CANCELLED",message:n.status==="insufficient"?"Insufficient balance":"User cancelled payment"})}}handlePaymentQuery(t){let e=t.payload||{},a=E(e.hostOrderId),r=E(e.orderId),o;if(a?o=this.orders.get(a):r&&(o=Array.from(this.orders.values()).find(n=>n.orderId===r)),!o){this.sendError(t,{code:"INVALID_REQUEST",message:"Order not found"});return}this.sendResponse(t,{orderId:o.orderId,hostOrderId:o.hostOrderId,amount:o.amount,currency:o.currency,status:o.status,expiresAt:o.expiresAt})}updateOrderStatus(t,e){let a=this.orders.get(t);a&&this.orders.set(t,{...a,status:e})}};var Ie={app:{title:"Playsout Mini Games",description:"Play quick games without login."},home:{loggedIn:"Logged in",logIn:"Log in",games:"Games",bannerAlt:"Playsout Games",searchPlaceholder:"Search by title or category",noGames:"No games found"},profile:{title:"Profile",settings:"Settings",language:"Language",recentGames:"Recently Played Games",noGames:"No games played yet",guest:"Guest",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Adventure",Simulation:"Simulation",Casual:"Casual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Puzzle"},auth:{loginSuccess:"Login successful!",loginTitle:"Playsout Login",welcome:"Welcome to the Playsout game platform",prompt:"Log in to start playing",mustLogin:"You must log in to play",authorizeHint:"Click the button below to authorize your login",authorizing:"Authorizing...",authorize:"Authorize login",terms:"By authorizing, you agree to our Terms of Service",signingIn:"Signing In",signMessage:"Please sign the message in your wallet"},game:{loading:"Loading",notFound:"Game not found",backHome:"Back to home",pageTitleSuffix:"Game Platform",header:{back:"Back",shareAria:"Share game",toggleMenuAria:"Toggle menu",fallbackTitle:"Game"}},menu:{favorite:"Favorite",favorited:"Favorited",profile:"Profile",login:"Login",refresh:"Refresh",loggedIn:"Logged in"},share:{title:"Share Game",closeLabel:"Close",retry:"Retry",loading:"Loading...",imageAlt:"Game share image",shareUrlLabel:"Share URL:",copied:"Copied",copy:"Copy",saveShare:"Save & Share",hint:"Image includes a QR code that links to this game",loadError:"Failed to load share image",downloadError:"Failed to download image"},checkin:{successTitle:"You got rewards!",successMessage:"Your rewards have been claimed.",failedTitle:"Check-in failed",canceledTitle:"Check-in canceled",errors:{userRejected:"You canceled the check-in operation",insufficientFunds:"Insufficient funds to pay gas",alreadyCheckedIn:"You already checked in today. Come back tomorrow!",network:"Network error. Please try again later"}},store:{title:"Gem Store",hot:"HOT",buy:"BUY",cancel:"Cancel",unit:"Gems",successTitle:"Payment Successful",successMessage:"You received {amount} gems!"},payment:{title:"Confirm Purchase",description:"Spend {amount} gems for this in-game item?",amountLabel:"{amount} gems",balance:"Current balance: {balance} gems",insufficientTitle:"Insufficient Balance",insufficientDesc:"Available: {gems} Gems",insufficientMessage:"Current balance is {balance} gems. This purchase needs {amount} gems.",cancel:"Cancel",confirm:"Confirm",recharge:"Recharge",successTitle:"Payment Successful",successMessage:"{amount} gems have been deducted.",invalidRequest:"Invalid payment request."}};var Se={app:{title:"Playsout \u5C0F\u6E38\u620F",description:"\u65E0\u9700\u767B\u5F55\u5373\u53EF\u7545\u73A9\u5C0F\u6E38\u620F\u3002"},home:{loggedIn:"\u5DF2\u767B\u5F55",logIn:"\u767B\u5F55",games:"\u6E38\u620F",bannerAlt:"Playsout \u6E38\u620F",searchPlaceholder:"\u6309\u6807\u9898\u6216\u7C7B\u522B\u641C\u7D22",noGames:"\u672A\u627E\u5230\u6E38\u620F"},profile:{title:"\u4E2A\u4EBA\u4E2D\u5FC3",settings:"\u8BBE\u7F6E",language:"\u8BED\u8A00",recentGames:"\u6700\u8FD1\u73A9\u8FC7\u7684\u6E38\u620F",noGames:"\u8FD8\u6CA1\u6709\u73A9\u8FC7\u6E38\u620F",guest:"\u6E38\u5BA2",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u5192\u9669",Simulation:"\u6A21\u62DF",Casual:"\u4F11\u95F2",Arcade:"\u8857\u673A",Moba:"MOBA",Puzzle:"\u76CA\u667A"},auth:{loginSuccess:"\u767B\u5F55\u6210\u529F!",loginTitle:"Playsout \u767B\u5F55",welcome:"\u6B22\u8FCE\u6765\u5230 Playsout \u6E38\u620F\u5E73\u53F0",prompt:"\u767B\u5F55\u5F00\u59CB\u6E38\u620F",mustLogin:"\u60A8\u5FC5\u987B\u767B\u5F55\u624D\u80FD\u73A9\u6E38\u620F",authorizeHint:"\u70B9\u51FB\u4E0B\u65B9\u6309\u94AE\u6388\u6743\u767B\u5F55",authorizing:"\u6388\u6743\u4E2D...",authorize:"\u6388\u6743\u767B\u5F55",terms:"\u6388\u6743\u5373\u8868\u793A\u60A8\u540C\u610F\u6211\u4EEC\u7684\u670D\u52A1\u6761\u6B3E",signingIn:"\u767B\u5F55\u4E2D",signMessage:"\u8BF7\u5728\u94B1\u5305\u4E2D\u7B7E\u540D"},game:{loading:"\u52A0\u8F7D\u4E2D",notFound:"\u627E\u4E0D\u5230\u6E38\u620F",backHome:"\u8FD4\u56DE\u9996\u9875",pageTitleSuffix:"\u6E38\u620F\u5E73\u53F0",header:{back:"\u8FD4\u56DE",shareAria:"\u5206\u4EAB\u6E38\u620F",toggleMenuAria:"\u5207\u6362\u83DC\u5355",fallbackTitle:"\u6E38\u620F"}},menu:{favorite:"\u6536\u85CF",favorited:"\u5DF2\u6536\u85CF",profile:"\u4E2A\u4EBA\u4E2D\u5FC3",login:"\u767B\u5F55",refresh:"\u5237\u65B0",loggedIn:"\u5DF2\u767B\u5F55"},share:{title:"\u5206\u4EAB\u6E38\u620F",closeLabel:"\u5173\u95ED",retry:"\u91CD\u8BD5",loading:"\u52A0\u8F7D\u4E2D...",imageAlt:"\u6E38\u620F\u5206\u4EAB\u56FE\u7247",shareUrlLabel:"\u5206\u4EAB\u94FE\u63A5:",copied:"\u5DF2\u590D\u5236",copy:"\u590D\u5236",saveShare:"\u4FDD\u5B58\u5E76\u5206\u4EAB",hint:"\u56FE\u7247\u5305\u542B\u6B64\u6E38\u620F\u7684\u4E8C\u7EF4\u7801",loadError:"\u52A0\u8F7D\u5206\u4EAB\u56FE\u7247\u5931\u8D25",downloadError:"\u4E0B\u8F7D\u56FE\u7247\u5931\u8D25"},checkin:{successTitle:"\u9886\u53D6\u6210\u529F!",successMessage:"\u60A8\u7684\u5956\u52B1\u5DF2\u9886\u53D6\u3002",failedTitle:"\u7B7E\u5230\u5931\u8D25",canceledTitle:"\u7B7E\u5230\u53D6\u6D88",errors:{userRejected:"\u60A8\u53D6\u6D88\u4E86\u7B7E\u5230\u64CD\u4F5C",insufficientFunds:"\u4F59\u989D\u4E0D\u8DB3\u4EE5\u652F\u4ED8 Gas \u8D39",alreadyCheckedIn:"\u4ECA\u5929\u5DF2\u7ECF\u7B7E\u5230\u8FC7\u4E86\u3002\u660E\u5929\u518D\u6765\u5427!",network:"\u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5"}},store:{title:"\u5B9D\u77F3\u5546\u5E97",hot:"\u70ED\u95E8",buy:"\u8D2D\u4E70",cancel:"\u53D6\u6D88",unit:"\u5B9D\u77F3",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u60A8\u83B7\u5F97\u4E86 {amount} \u5B9D\u77F3\uFF01"},payment:{title:"\u786E\u8BA4\u8D2D\u4E70",description:"\u662F\u5426\u6D88\u8017 {amount} \u5B9D\u77F3\u8D2D\u4E70\u8BE5\u6E38\u620F\u9053\u5177\uFF1F",amountLabel:"{amount} \u5B9D\u77F3",balance:"\u5F53\u524D\u4F59\u989D\uFF1A{balance} \u5B9D\u77F3",insufficientTitle:"\u4F59\u989D\u4E0D\u8DB3",insufficientDesc:"\u53EF\u7528\u4F59\u989D: {gems} \u5B9D\u77F3",insufficientMessage:"\u5F53\u524D\u4F59\u989D\u4E3A {balance} \u5B9D\u77F3\uFF0C\u672C\u6B21\u8D2D\u4E70\u9700\u8981 {amount} \u5B9D\u77F3\u3002",cancel:"\u53D6\u6D88",confirm:"\u786E\u8BA4",recharge:"\u5145\u503C",successTitle:"\u652F\u4ED8\u6210\u529F",successMessage:"\u5DF2\u6263\u9664 {amount} \u5B9D\u77F3\u3002",invalidRequest:"\u652F\u4ED8\u8BF7\u6C42\u65E0\u6548\u3002"}};var Ee={app:{title:"Playsout \u30DF\u30CB\u30B2\u30FC\u30E0",description:"\u30ED\u30B0\u30A4\u30F3\u306A\u3057\u3067\u30B2\u30FC\u30E0\u3092\u30D7\u30EC\u30A4\u3002"},home:{loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F",logIn:"\u30ED\u30B0\u30A4\u30F3",games:"\u30B2\u30FC\u30E0",bannerAlt:"Playsout \u30B2\u30FC\u30E0",searchPlaceholder:"\u30BF\u30A4\u30C8\u30EB\u307E\u305F\u306F\u30AB\u30C6\u30B4\u30EA\u3067\u691C\u7D22",noGames:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093"},profile:{title:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",settings:"\u8A2D\u5B9A",language:"\u8A00\u8A9E",recentGames:"\u6700\u8FD1\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0",noGames:"\u307E\u3060\u30D7\u30EC\u30A4\u3057\u305F\u30B2\u30FC\u30E0\u304C\u3042\u308A\u307E\u305B\u3093",guest:"\u30B2\u30B9\u30C8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u30A2\u30C9\u30D9\u30F3\u30C1\u30E3\u30FC",Simulation:"\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3",Casual:"\u30AB\u30B8\u30E5\u30A2\u30EB",Arcade:"\u30A2\u30FC\u30B1\u30FC\u30C9",Moba:"MOBA",Puzzle:"\u30D1\u30BA\u30EB"},auth:{loginSuccess:"\u30ED\u30B0\u30A4\u30F3\u6210\u529F!",loginTitle:"Playsout \u30ED\u30B0\u30A4\u30F3",welcome:"Playsout \u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3078\u3088\u3046\u3053\u305D",prompt:"\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u30D7\u30EC\u30A4\u3092\u958B\u59CB",mustLogin:"\u30D7\u30EC\u30A4\u3059\u308B\u306B\u306F\u30ED\u30B0\u30A4\u30F3\u304C\u5FC5\u8981\u3067\u3059",authorizeHint:"\u4E0B\u306E\u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044",authorizing:"\u627F\u8A8D\u4E2D...",authorize:"\u30ED\u30B0\u30A4\u30F3\u3092\u627F\u8A8D",terms:"\u627F\u8A8D\u3059\u308B\u3053\u3068\u3067\u3001\u5229\u7528\u898F\u7D04\u306B\u540C\u610F\u3057\u305F\u3053\u3068\u306B\u306A\u308A\u307E\u3059",signingIn:"\u30B5\u30A4\u30F3\u30A4\u30F3\u4E2D",signMessage:"\u30A6\u30A9\u30EC\u30C3\u30C8\u3067\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u7F72\u540D\u3057\u3066\u304F\u3060\u3055\u3044"},game:{loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D",notFound:"\u30B2\u30FC\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093",backHome:"\u30DB\u30FC\u30E0\u306B\u623B\u308B",pageTitleSuffix:"\u30B2\u30FC\u30E0\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0",header:{back:"\u623B\u308B",shareAria:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",toggleMenuAria:"\u30E1\u30CB\u30E5\u30FC\u5207\u308A\u66FF\u3048",fallbackTitle:"\u30B2\u30FC\u30E0"}},menu:{favorite:"\u304A\u6C17\u306B\u5165\u308A",favorited:"\u304A\u6C17\u306B\u5165\u308A\u6E08\u307F",profile:"\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB",login:"\u30ED\u30B0\u30A4\u30F3",refresh:"\u66F4\u65B0",loggedIn:"\u30ED\u30B0\u30A4\u30F3\u6E08\u307F"},share:{title:"\u30B2\u30FC\u30E0\u3092\u5171\u6709",closeLabel:"\u9589\u3058\u308B",retry:"\u518D\u8A66\u884C",loading:"\u8AAD\u307F\u8FBC\u307F\u4E2D...",imageAlt:"\u30B2\u30FC\u30E0\u5171\u6709\u753B\u50CF",shareUrlLabel:"\u5171\u6709URL:",copied:"\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F",copy:"\u30B3\u30D4\u30FC",saveShare:"\u4FDD\u5B58\u3057\u3066\u5171\u6709",hint:"\u753B\u50CF\u306B\u306F\u30B2\u30FC\u30E0\u3078\u306EQR\u30B3\u30FC\u30C9\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059",loadError:"\u5171\u6709\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F",downloadError:"\u753B\u50CF\u306E\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F"},checkin:{successTitle:"\u5831\u916C\u3092\u7372\u5F97\u3057\u307E\u3057\u305F!",successMessage:"\u5831\u916C\u304C\u8ACB\u6C42\u3055\u308C\u307E\u3057\u305F\u3002",failedTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u5931\u6557",canceledTitle:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u30AD\u30E3\u30F3\u30BB\u30EB",errors:{userRejected:"\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u64CD\u4F5C\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F",insufficientFunds:"\u30AC\u30B9\u4EE3\u3092\u652F\u6255\u3046\u6B8B\u9AD8\u304C\u4E0D\u8DB3\u3057\u3066\u3044\u307E\u3059",alreadyCheckedIn:"\u672C\u65E5\u306F\u65E2\u306B\u30C1\u30A7\u30C3\u30AF\u30A4\u30F3\u6E08\u307F\u3067\u3059\u3002\u660E\u65E5\u307E\u305F\u6765\u3066\u304F\u3060\u3055\u3044!",network:"\u30CD\u30C3\u30C8\u30EF\u30FC\u30AF\u30A8\u30E9\u30FC\u3002\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044"}},store:{title:"\u30B8\u30A7\u30E0\u30B9\u30C8\u30A2",hot:"HOT",buy:"\u8CFC\u5165",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",unit:"\u30B8\u30A7\u30E0",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{amount}\u30B8\u30A7\u30E0\u3092\u53D7\u3051\u53D6\u308A\u307E\u3057\u305F\uFF01"},payment:{title:"\u8CFC\u5165\u78BA\u8A8D",description:"\u3053\u306E\u30B2\u30FC\u30E0\u5185\u30A2\u30A4\u30C6\u30E0\u306B {amount} \u30B8\u30A7\u30E0\u3092\u4F7F\u7528\u3057\u307E\u3059\u304B\uFF1F",amountLabel:"{amount} \u30B8\u30A7\u30E0",balance:"\u73FE\u5728\u306E\u6B8B\u9AD8: {balance} \u30B8\u30A7\u30E0",insufficientTitle:"\u6B8B\u9AD8\u4E0D\u8DB3",insufficientDesc:"\u4FDD\u6709: {gems} \u30B8\u30A7\u30E0",insufficientMessage:"\u73FE\u5728\u306E\u6B8B\u9AD8\u306F {balance} \u30B8\u30A7\u30E0\u3067\u3059\u3002\u3053\u306E\u8CFC\u5165\u306B\u306F {amount} \u30B8\u30A7\u30E0\u304C\u5FC5\u8981\u3067\u3059\u3002",cancel:"\u30AD\u30E3\u30F3\u30BB\u30EB",confirm:"\u78BA\u8A8D",recharge:"\u30C1\u30E3\u30FC\u30B8",successTitle:"\u652F\u6255\u3044\u5B8C\u4E86",successMessage:"{amount} \u30B8\u30A7\u30E0\u304C\u5DEE\u3057\u5F15\u304B\u308C\u307E\u3057\u305F\u3002",invalidRequest:"\u652F\u6255\u3044\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u7121\u52B9\u3067\u3059\u3002"}};var Te={app:{title:"Playsout \uBBF8\uB2C8 \uAC8C\uC784",description:"\uB85C\uADF8\uC778 \uC5C6\uC774 \uAC8C\uC784\uC744 \uC990\uAE30\uC138\uC694."},home:{loggedIn:"\uB85C\uADF8\uC778\uB428",logIn:"\uB85C\uADF8\uC778",games:"\uAC8C\uC784",bannerAlt:"Playsout \uAC8C\uC784",searchPlaceholder:"\uC81C\uBAA9 \uB610\uB294 \uCE74\uD14C\uACE0\uB9AC\uB85C \uAC80\uC0C9",noGames:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4"},profile:{title:"\uD504\uB85C\uD544",settings:"\uC124\uC815",language:"\uC5B8\uC5B4",recentGames:"\uCD5C\uADFC \uD50C\uB808\uC774\uD55C \uAC8C\uC784",noGames:"\uC544\uC9C1 \uD50C\uB808\uC774\uD55C \uAC8C\uC784\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",guest:"\uC190\uB2D8",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\uC5B4\uB4DC\uBCA4\uCC98",Simulation:"\uC2DC\uBBAC\uB808\uC774\uC158",Casual:"\uCE90\uC8FC\uC5BC",Arcade:"\uC544\uCF00\uC774\uB4DC",Moba:"MOBA",Puzzle:"\uD37C\uC990"},auth:{loginSuccess:"\uB85C\uADF8\uC778 \uC131\uACF5!",loginTitle:"Playsout \uB85C\uADF8\uC778",welcome:"Playsout \uAC8C\uC784 \uD50C\uB7AB\uD3FC\uC5D0 \uC624\uC2E0 \uAC83\uC744 \uD658\uC601\uD569\uB2C8\uB2E4",prompt:"\uAC8C\uC784\uC744 \uC2DC\uC791\uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD558\uC138\uC694",mustLogin:"\uAC8C\uC784\uC744 \uD558\uB824\uBA74 \uB85C\uADF8\uC778\uD574\uC57C \uD569\uB2C8\uB2E4",authorizeHint:"\uB85C\uADF8\uC778\uC744 \uC2B9\uC778\uD558\uB824\uBA74 \uC544\uB798 \uBC84\uD2BC\uC744 \uD074\uB9AD\uD558\uC138\uC694",authorizing:"\uC2B9\uC778 \uC911...",authorize:"\uB85C\uADF8\uC778 \uC2B9\uC778",terms:"\uC2B9\uC778\uD558\uBA74 \uC11C\uBE44\uC2A4 \uC57D\uAD00\uC5D0 \uB3D9\uC758\uD558\uAC8C \uB429\uB2C8\uB2E4",signingIn:"\uB85C\uADF8\uC778 \uC911",signMessage:"\uC9C0\uAC11\uC5D0\uC11C \uBA54\uC2DC\uC9C0\uC5D0 \uC11C\uBA85\uD574\uC8FC\uC138\uC694"},game:{loading:"\uB85C\uB529 \uC911",notFound:"\uAC8C\uC784\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",backHome:"\uD648\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30",pageTitleSuffix:"\uAC8C\uC784 \uD50C\uB7AB\uD3FC",header:{back:"\uB4A4\uB85C",shareAria:"\uAC8C\uC784 \uACF5\uC720",toggleMenuAria:"\uBA54\uB274 \uC804\uD658",fallbackTitle:"\uAC8C\uC784"}},menu:{favorite:"\uC990\uACA8\uCC3E\uAE30",favorited:"\uC990\uACA8\uCC3E\uAE30\uB428",profile:"\uD504\uB85C\uD544",login:"\uB85C\uADF8\uC778",refresh:"\uC0C8\uB85C\uACE0\uCE68",loggedIn:"\uB85C\uADF8\uC778\uB428"},share:{title:"\uAC8C\uC784 \uACF5\uC720",closeLabel:"\uB2EB\uAE30",retry:"\uC7AC\uC2DC\uB3C4",loading:"\uB85C\uB529 \uC911...",imageAlt:"\uAC8C\uC784 \uACF5\uC720 \uC774\uBBF8\uC9C0",shareUrlLabel:"\uACF5\uC720 URL:",copied:"\uBCF5\uC0AC\uB428",copy:"\uBCF5\uC0AC",saveShare:"\uC800\uC7A5 \uBC0F \uACF5\uC720",hint:"\uC774\uBBF8\uC9C0\uC5D0 \uAC8C\uC784\uC73C\uB85C \uC5F0\uACB0\uB418\uB294 QR \uCF54\uB4DC\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4",loadError:"\uACF5\uC720 \uC774\uBBF8\uC9C0\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4",downloadError:"\uC774\uBBF8\uC9C0\uB97C \uB2E4\uC6B4\uB85C\uB4DC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4"},checkin:{successTitle:"\uBCF4\uC0C1\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!",successMessage:"\uBCF4\uC0C1\uC774 \uC9C0\uAE09\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",failedTitle:"\uCD9C\uC11D \uC2E4\uD328",canceledTitle:"\uCD9C\uC11D \uCDE8\uC18C\uB428",errors:{userRejected:"\uCD9C\uC11D \uC791\uC5C5\uC744 \uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4",insufficientFunds:"\uAC00\uC2A4\uBE44\uB97C \uC9C0\uBD88\uD560 \uC790\uAE08\uC774 \uBD80\uC871\uD569\uB2C8\uB2E4",alreadyCheckedIn:"\uC624\uB298 \uC774\uBBF8 \uCD9C\uC11D\uD588\uC2B5\uB2C8\uB2E4. \uB0B4\uC77C \uB2E4\uC2DC \uC624\uC138\uC694!",network:"\uB124\uD2B8\uC6CC\uD06C \uC624\uB958. \uB098\uC911\uC5D0 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694"}},store:{title:"\uBCF4\uC11D \uC0C1\uC810",hot:"\uC778\uAE30",buy:"\uAD6C\uB9E4",cancel:"\uCDE8\uC18C",unit:"\uBCF4\uC11D",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"{amount}\uAC1C\uC758 \uBCF4\uC11D\uC744 \uBC1B\uC558\uC2B5\uB2C8\uB2E4!"},payment:{title:"\uAD6C\uB9E4 \uD655\uC778",description:"\uC774 \uAC8C\uC784 \uC544\uC774\uD15C\uC5D0 \uBCF4\uC11D {amount}\uAC1C\uB97C \uC0AC\uC6A9\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?",amountLabel:"\uBCF4\uC11D {amount}\uAC1C",balance:"\uD604\uC7AC \uC794\uC561: \uBCF4\uC11D {balance}\uAC1C",insufficientTitle:"\uC794\uC561 \uBD80\uC871",insufficientDesc:"\uBCF4\uC720: {gems} \uBCF4\uC11D",insufficientMessage:"\uD604\uC7AC \uC794\uC561\uC740 \uBCF4\uC11D {balance}\uAC1C\uC785\uB2C8\uB2E4. \uC774 \uAD6C\uB9E4\uC5D0\uB294 \uBCF4\uC11D {amount}\uAC1C\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",cancel:"\uCDE8\uC18C",confirm:"\uD655\uC778",recharge:"\uCDA9\uC804",successTitle:"\uACB0\uC81C \uC131\uACF5",successMessage:"\uBCF4\uC11D {amount}\uAC1C\uAC00 \uCC28\uAC10\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",invalidRequest:"\uACB0\uC81C \uC694\uCCAD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}};var Pe={app:{title:"Playsout \u0E21\u0E34\u0E19\u0E34\u0E40\u0E01\u0E21",description:"\u0E40\u0E25\u0E48\u0E19\u0E40\u0E01\u0E21\u0E14\u0E48\u0E27\u0E19\u0E42\u0E14\u0E22\u0E44\u0E21\u0E48\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A"},home:{loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27",logIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",games:"\u0E40\u0E01\u0E21",bannerAlt:"\u0E40\u0E01\u0E21 Playsout",searchPlaceholder:"\u0E04\u0E49\u0E19\u0E2B\u0E32\u0E15\u0E32\u0E21\u0E0A\u0E37\u0E48\u0E2D\u0E2B\u0E23\u0E37\u0E2D\u0E2B\u0E21\u0E27\u0E14\u0E2B\u0E21\u0E39\u0E48",noGames:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21"},profile:{title:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",settings:"\u0E01\u0E32\u0E23\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32",language:"\u0E20\u0E32\u0E29\u0E32",recentGames:"\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19\u0E25\u0E48\u0E32\u0E2A\u0E38\u0E14",noGames:"\u0E22\u0E31\u0E07\u0E44\u0E21\u0E48\u0E21\u0E35\u0E40\u0E01\u0E21\u0E17\u0E35\u0E48\u0E40\u0E25\u0E48\u0E19",guest:"\u0E1C\u0E39\u0E49\u0E40\u0E22\u0E35\u0E48\u0E22\u0E21\u0E0A\u0E21",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"\u0E1C\u0E08\u0E0D\u0E20\u0E31\u0E22",Simulation:"\u0E08\u0E33\u0E25\u0E2D\u0E07\u0E2A\u0E16\u0E32\u0E19\u0E01\u0E32\u0E23\u0E13\u0E4C",Casual:"\u0E41\u0E04\u0E0A\u0E0A\u0E27\u0E25",Arcade:"\u0E2D\u0E32\u0E23\u0E4C\u0E40\u0E04\u0E14",Moba:"\u0E42\u0E21\u0E1A\u0E32",Puzzle:"\u0E1B\u0E23\u0E34\u0E28\u0E19\u0E32"},auth:{loginSuccess:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08!",loginTitle:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A Playsout",welcome:"\u0E22\u0E34\u0E19\u0E14\u0E35\u0E15\u0E49\u0E2D\u0E19\u0E23\u0E31\u0E1A\u0E2A\u0E39\u0E48\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21 Playsout",prompt:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E23\u0E34\u0E48\u0E21\u0E40\u0E25\u0E48\u0E19",mustLogin:"\u0E04\u0E38\u0E13\u0E15\u0E49\u0E2D\u0E07\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E40\u0E25\u0E48\u0E19",authorizeHint:"\u0E04\u0E25\u0E34\u0E01\u0E1B\u0E38\u0E48\u0E21\u0E14\u0E49\u0E32\u0E19\u0E25\u0E48\u0E32\u0E07\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",authorizing:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15...",authorize:"\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E01\u0E32\u0E23\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",terms:"\u0E01\u0E32\u0E23\u0E2D\u0E19\u0E38\u0E0D\u0E32\u0E15\u0E41\u0E2A\u0E14\u0E07\u0E27\u0E48\u0E32\u0E04\u0E38\u0E13\u0E22\u0E2D\u0E21\u0E23\u0E31\u0E1A\u0E02\u0E49\u0E2D\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E43\u0E19\u0E01\u0E32\u0E23\u0E43\u0E2B\u0E49\u0E1A\u0E23\u0E34\u0E01\u0E32\u0E23\u0E02\u0E2D\u0E07\u0E40\u0E23\u0E32",signingIn:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E25\u0E07\u0E0A\u0E37\u0E48\u0E2D\u0E40\u0E02\u0E49\u0E32\u0E43\u0E0A\u0E49",signMessage:"\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E0B\u0E47\u0E19\u0E0A\u0E37\u0E48\u0E2D\u0E02\u0E49\u0E2D\u0E04\u0E27\u0E32\u0E21\u0E43\u0E19\u0E01\u0E23\u0E30\u0E40\u0E1B\u0E4B\u0E32\u0E40\u0E07\u0E34\u0E19\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13"},game:{loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14",notFound:"\u0E44\u0E21\u0E48\u0E1E\u0E1A\u0E40\u0E01\u0E21",backHome:"\u0E01\u0E25\u0E31\u0E1A\u0E2B\u0E19\u0E49\u0E32\u0E2B\u0E25\u0E31\u0E01",pageTitleSuffix:"\u0E41\u0E1E\u0E25\u0E15\u0E1F\u0E2D\u0E23\u0E4C\u0E21\u0E40\u0E01\u0E21",header:{back:"\u0E01\u0E25\u0E31\u0E1A",shareAria:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",toggleMenuAria:"\u0E2A\u0E25\u0E31\u0E1A\u0E40\u0E21\u0E19\u0E39",fallbackTitle:"\u0E40\u0E01\u0E21"}},menu:{favorite:"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14",favorited:"\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E43\u0E19\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E42\u0E1B\u0E23\u0E14\u0E41\u0E25\u0E49\u0E27",profile:"\u0E42\u0E1B\u0E23\u0E44\u0E1F\u0E25\u0E4C",login:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A",refresh:"\u0E23\u0E35\u0E40\u0E1F\u0E23\u0E0A",loggedIn:"\u0E40\u0E02\u0E49\u0E32\u0E2A\u0E39\u0E48\u0E23\u0E30\u0E1A\u0E1A\u0E41\u0E25\u0E49\u0E27"},share:{title:"\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",closeLabel:"\u0E1B\u0E34\u0E14",retry:"\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48",loading:"\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14...",imageAlt:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E40\u0E01\u0E21",shareUrlLabel:"\u0E41\u0E0A\u0E23\u0E4C URL:",copied:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01\u0E41\u0E25\u0E49\u0E27",copy:"\u0E04\u0E31\u0E14\u0E25\u0E2D\u0E01",saveShare:"\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\u0E41\u0E25\u0E30\u0E41\u0E0A\u0E23\u0E4C",hint:"\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E23\u0E27\u0E21\u0E23\u0E2B\u0E31\u0E2A QR \u0E17\u0E35\u0E48\u0E25\u0E34\u0E07\u0E01\u0E4C\u0E44\u0E1B\u0E22\u0E31\u0E07\u0E40\u0E01\u0E21\u0E19\u0E35\u0E49",loadError:"\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E41\u0E0A\u0E23\u0E4C\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",downloadError:"\u0E14\u0E32\u0E27\u0E19\u0E4C\u0E42\u0E2B\u0E25\u0E14\u0E23\u0E39\u0E1B\u0E20\u0E32\u0E1E\u0E44\u0E21\u0E48\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08"},checkin:{successTitle:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25!",successMessage:"\u0E23\u0E31\u0E1A\u0E23\u0E32\u0E07\u0E27\u0E31\u0E25\u0E02\u0E2D\u0E07\u0E04\u0E38\u0E13\u0E41\u0E25\u0E49\u0E27",failedTitle:"\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E25\u0E49\u0E21\u0E40\u0E2B\u0E25\u0E27",canceledTitle:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",errors:{userRejected:"\u0E04\u0E38\u0E13\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\u0E01\u0E32\u0E23\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19",insufficientFunds:"\u0E40\u0E07\u0E34\u0E19\u0E44\u0E21\u0E48\u0E1E\u0E2D\u0E08\u0E48\u0E32\u0E22\u0E04\u0E48\u0E32\u0E41\u0E01\u0E4A\u0E2A",alreadyCheckedIn:"\u0E04\u0E38\u0E13\u0E40\u0E0A\u0E47\u0E04\u0E2D\u0E34\u0E19\u0E27\u0E31\u0E19\u0E19\u0E35\u0E49\u0E44\u0E1B\u0E41\u0E25\u0E49\u0E27 \u0E01\u0E25\u0E31\u0E1A\u0E21\u0E32\u0E43\u0E2B\u0E21\u0E48\u0E1E\u0E23\u0E38\u0E48\u0E07\u0E19\u0E35\u0E49!",network:"\u0E02\u0E49\u0E2D\u0E1C\u0E34\u0E14\u0E1E\u0E25\u0E32\u0E14\u0E40\u0E04\u0E23\u0E37\u0E2D\u0E02\u0E48\u0E32\u0E22 \u0E42\u0E1B\u0E23\u0E14\u0E25\u0E2D\u0E07\u0E43\u0E2B\u0E21\u0E48\u0E20\u0E32\u0E22\u0E2B\u0E25\u0E31\u0E07"}},store:{title:"\u0E23\u0E49\u0E32\u0E19\u0E04\u0E49\u0E32\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",hot:"\u0E21\u0E32\u0E41\u0E23\u0E07",buy:"\u0E0B\u0E37\u0E49\u0E2D",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",unit:"\u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E04\u0E38\u0E13\u0E44\u0E14\u0E49\u0E23\u0E31\u0E1A {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35!"},payment:{title:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D",description:"\u0E43\u0E0A\u0E49 {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35\u0E40\u0E1E\u0E37\u0E48\u0E2D\u0E0B\u0E37\u0E49\u0E2D\u0E44\u0E2D\u0E40\u0E17\u0E21\u0E43\u0E19\u0E40\u0E01\u0E21\u0E19\u0E35\u0E49\u0E2B\u0E23\u0E37\u0E2D\u0E44\u0E21\u0E48?",amountLabel:"{amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",balance:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19: {balance} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",insufficientTitle:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E44\u0E21\u0E48\u0E1E\u0E2D",insufficientDesc:"\u0E21\u0E35\u0E2D\u0E22\u0E39\u0E48: {gems} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",insufficientMessage:"\u0E22\u0E2D\u0E14\u0E04\u0E07\u0E40\u0E2B\u0E25\u0E37\u0E2D\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19\u0E04\u0E37\u0E2D {balance} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35 \u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E19\u0E35\u0E49\u0E15\u0E49\u0E2D\u0E07\u0E43\u0E0A\u0E49 {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35",cancel:"\u0E22\u0E01\u0E40\u0E25\u0E34\u0E01",confirm:"\u0E22\u0E37\u0E19\u0E22\u0E31\u0E19",recharge:"\u0E40\u0E15\u0E34\u0E21\u0E40\u0E07\u0E34\u0E19",successTitle:"\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E2A\u0E33\u0E40\u0E23\u0E47\u0E08",successMessage:"\u0E2B\u0E31\u0E01 {amount} \u0E2D\u0E31\u0E0D\u0E21\u0E13\u0E35\u0E41\u0E25\u0E49\u0E27",invalidRequest:"\u0E04\u0E33\u0E02\u0E2D\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19\u0E44\u0E21\u0E48\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07"}};var Ae={app:{title:"Playsout Mini Games",description:"Ch\u01A1i game nhanh kh\xF4ng c\u1EA7n \u0111\u0103ng nh\u1EADp."},home:{loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp",logIn:"\u0110\u0103ng nh\u1EADp",games:"Tr\xF2 ch\u01A1i",bannerAlt:"Tr\xF2 ch\u01A1i Playsout",searchPlaceholder:"T\xECm ki\u1EBFm theo ti\xEAu \u0111\u1EC1 ho\u1EB7c danh m\u1EE5c",noGames:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i"},profile:{title:"H\u1ED3 s\u01A1",settings:"C\xE0i \u0111\u1EB7t",language:"Ng\xF4n ng\u1EEF",recentGames:"Tr\xF2 ch\u01A1i \u0111\xE3 ch\u01A1i g\u1EA7n \u0111\xE2y",noGames:"Ch\u01B0a ch\u01A1i game n\xE0o",guest:"Kh\xE1ch",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Phi\xEAu l\u01B0u",Simulation:"M\xF4 ph\u1ECFng",Casual:"Ph\u1ED5 th\xF4ng",Arcade:"Arcade",Moba:"Moba",Puzzle:"Gi\u1EA3i \u0111\u1ED1"},auth:{loginSuccess:"\u0110\u0103ng nh\u1EADp th\xE0nh c\xF4ng!",loginTitle:"\u0110\u0103ng nh\u1EADp Playsout",welcome:"Ch\xE0o m\u1EEBng \u0111\u1EBFn v\u1EDBi n\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i Playsout",prompt:"\u0110\u0103ng nh\u1EADp \u0111\u1EC3 b\u1EAFt \u0111\u1EA7u ch\u01A1i",mustLogin:"B\u1EA1n ph\u1EA3i \u0111\u0103ng nh\u1EADp \u0111\u1EC3 ch\u01A1i",authorizeHint:"Nh\u1EA5p v\xE0o n\xFAt b\xEAn d\u01B0\u1EDBi \u0111\u1EC3 \u1EE7y quy\u1EC1n \u0111\u0103ng nh\u1EADp",authorizing:"\u0110ang \u1EE7y quy\u1EC1n...",authorize:"\u1EE6y quy\u1EC1n \u0111\u0103ng nh\u1EADp",terms:"B\u1EB1ng c\xE1ch \u1EE7y quy\u1EC1n, b\u1EA1n \u0111\u1ED3ng \xFD v\u1EDBi \u0110i\u1EC1u kho\u1EA3n d\u1ECBch v\u1EE5 c\u1EE7a ch\xFAng t\xF4i",signingIn:"\u0110ang \u0111\u0103ng nh\u1EADp",signMessage:"Vui l\xF2ng k\xFD tin nh\u1EAFn trong v\xED c\u1EE7a b\u1EA1n"},game:{loading:"\u0110ang t\u1EA3i",notFound:"Kh\xF4ng t\xECm th\u1EA5y tr\xF2 ch\u01A1i",backHome:"V\u1EC1 trang ch\u1EE7",pageTitleSuffix:"N\u1EC1n t\u1EA3ng tr\xF2 ch\u01A1i",header:{back:"Quay l\u1EA1i",shareAria:"Chia s\u1EBB tr\xF2 ch\u01A1i",toggleMenuAria:"Chuy\u1EC3n \u0111\u1ED5i menu",fallbackTitle:"Tr\xF2 ch\u01A1i"}},menu:{favorite:"Y\xEAu th\xEDch",favorited:"\u0110\xE3 y\xEAu th\xEDch",profile:"H\u1ED3 s\u01A1",login:"\u0110\u0103ng nh\u1EADp",refresh:"L\xE0m m\u1EDBi",loggedIn:"\u0110\xE3 \u0111\u0103ng nh\u1EADp"},share:{title:"Chia s\u1EBB tr\xF2 ch\u01A1i",closeLabel:"\u0110\xF3ng",retry:"Th\u1EED l\u1EA1i",loading:"\u0110ang t\u1EA3i...",imageAlt:"H\xECnh \u1EA3nh chia s\u1EBB tr\xF2 ch\u01A1i",shareUrlLabel:"URL chia s\u1EBB:",copied:"\u0110\xE3 sao ch\xE9p",copy:"Sao ch\xE9p",saveShare:"L\u01B0u & Chia s\u1EBB",hint:"H\xECnh \u1EA3nh bao g\u1ED3m m\xE3 QR li\xEAn k\u1EBFt \u0111\u1EBFn tr\xF2 ch\u01A1i n\xE0y",loadError:"Kh\xF4ng t\u1EA3i \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh chia s\u1EBB",downloadError:"Kh\xF4ng t\u1EA3i xu\u1ED1ng \u0111\u01B0\u1EE3c h\xECnh \u1EA3nh"},checkin:{successTitle:"B\u1EA1n \u0111\xE3 nh\u1EADn ph\u1EA7n th\u01B0\u1EDFng!",successMessage:"Ph\u1EA7n th\u01B0\u1EDFng c\u1EE7a b\u1EA1n \u0111\xE3 \u0111\u01B0\u1EE3c nh\u1EADn.",failedTitle:"\u0110i\u1EC3m danh th\u1EA5t b\u1EA1i",canceledTitle:"\u0110i\u1EC3m danh \u0111\xE3 h\u1EE7y",errors:{userRejected:"B\u1EA1n \u0111\xE3 h\u1EE7y thao t\xE1c \u0111i\u1EC3m danh",insufficientFunds:"Kh\xF4ng \u0111\u1EE7 ti\u1EC1n \u0111\u1EC3 tr\u1EA3 ph\xED Gas",alreadyCheckedIn:"H\xF4m nay b\u1EA1n \u0111\xE3 \u0111i\u1EC3m danh r\u1ED3i. H\xE3y quay l\u1EA1i v\xE0o ng\xE0y mai!",network:"L\u1ED7i m\u1EA1ng. Vui l\xF2ng th\u1EED l\u1EA1i sau"}},store:{title:"C\u1EEDa h\xE0ng \u0110\xE1 qu\xFD",hot:"HOT",buy:"MUA",cancel:"H\u1EE7y",unit:"\u0110\xE1 qu\xFD",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"B\u1EA1n \u0111\xE3 nh\u1EADn \u0111\u01B0\u1EE3c {amount} \u0111\xE1 qu\xFD!"},payment:{title:"X\xE1c nh\u1EADn mua",description:"D\xF9ng {amount} \u0111\xE1 qu\xFD \u0111\u1EC3 mua v\u1EADt ph\u1EA9m trong game n\xE0y?",amountLabel:"{amount} \u0111\xE1 qu\xFD",balance:"S\u1ED1 d\u01B0 hi\u1EC7n t\u1EA1i: {balance} \u0111\xE1 qu\xFD",insufficientTitle:"S\u1ED1 d\u01B0 kh\xF4ng \u0111\u1EE7",insufficientDesc:"Hi\u1EC7n c\xF3: {gems} \u0110\xE1 qu\xFD",insufficientMessage:"S\u1ED1 d\u01B0 hi\u1EC7n t\u1EA1i l\xE0 {balance} \u0111\xE1 qu\xFD. Giao d\u1ECBch n\xE0y c\u1EA7n {amount} \u0111\xE1 qu\xFD.",cancel:"H\u1EE7y",confirm:"X\xE1c nh\u1EADn",recharge:"N\u1EA1p ti\u1EC1n",successTitle:"Thanh to\xE1n th\xE0nh c\xF4ng",successMessage:"\u0110\xE3 tr\u1EEB {amount} \u0111\xE1 qu\xFD.",invalidRequest:"Y\xEAu c\u1EA7u thanh to\xE1n kh\xF4ng h\u1EE3p l\u1EC7."}};var Le={app:{title:"Playsout Mini Games",description:"Mainkan game cepat tanpa login."},home:{loggedIn:"Sudah login",logIn:"Login",games:"Game",bannerAlt:"Game Playsout",searchPlaceholder:"Cari berdasarkan judul atau kategori",noGames:"Game tidak ditemukan"},profile:{title:"Profil",settings:"Pengaturan",language:"Bahasa",recentGames:"Game yang Baru Dimainkan",noGames:"Belum ada game yang dimainkan",guest:"Tamu",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Petualangan",Simulation:"Simulasi",Casual:"Kasual",Arcade:"Arcade",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Login berhasil!",loginTitle:"Login Playsout",welcome:"Selamat datang di platform game Playsout",prompt:"Login untuk mulai bermain",mustLogin:"Anda harus login untuk bermain",authorizeHint:"Klik tombol di bawah untuk mengotorisasi login",authorizing:"Mengotorisasi...",authorize:"Otorisasi login",terms:"Dengan mengotorisasi, Anda menyetujui Ketentuan Layanan kami",signingIn:"Masuk...",signMessage:"Silakan tanda tangani pesan di dompet Anda"},game:{loading:"Memuat",notFound:"Game tidak ditemukan",backHome:"Kembali ke beranda",pageTitleSuffix:"Platform Game",header:{back:"Kembali",shareAria:"Bagikan game",toggleMenuAria:"Alihkan menu",fallbackTitle:"Game"}},menu:{favorite:"Favorit",favorited:"Difavoritkan",profile:"Profil",login:"Login",refresh:"Segarkan",loggedIn:"Sudah login"},share:{title:"Bagikan Game",closeLabel:"Tutup",retry:"Coba lagi",loading:"Memuat...",imageAlt:"Gambar berbagi game",shareUrlLabel:"URL Berbagi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Bagikan",hint:"Gambar termasuk kode QR yang menautkan ke game ini",loadError:"Gagal memuat gambar berbagi",downloadError:"Gagal mengunduh gambar"},checkin:{successTitle:"Anda mendapat hadiah!",successMessage:"Hadiah Anda telah diklaim.",failedTitle:"Check-in gagal",canceledTitle:"Check-in dibatalkan",errors:{userRejected:"Anda membatalkan operasi check-in",insufficientFunds:"Dana tidak cukup untuk membayar biaya Gas",alreadyCheckedIn:"Anda sudah check-in hari ini. Kembali lagi besok!",network:"Kesalahan jaringan. Silakan coba lagi nanti"}},store:{title:"Toko Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berhasil",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Konfirmasi Pembelian",description:"Gunakan {amount} permata untuk membeli item game ini?",amountLabel:"{amount} permata",balance:"Saldo saat ini: {balance} permata",insufficientTitle:"Saldo Tidak Cukup",insufficientDesc:"Tersedia: {gems} Permata",insufficientMessage:"Saldo saat ini {balance} permata. Pembelian ini membutuhkan {amount} permata.",cancel:"Batal",confirm:"Konfirmasi",recharge:"Isi Ulang",successTitle:"Pembayaran Berhasil",successMessage:"{amount} permata telah dikurangi.",invalidRequest:"Permintaan pembayaran tidak valid."}};var Ce={app:{title:"Permainan Mini Playsout",description:"Main permainan pantas tanpa log masuk."},home:{loggedIn:"Log masuk",logIn:"Log masuk",games:"Permainan",bannerAlt:"Permainan Playsout",searchPlaceholder:"Cari mengikut tajuk atau kategori",noGames:"Tiada permainan dijumpai"},profile:{title:"Profil",settings:"Tetapan",language:"Bahasa",recentGames:"Permainan Baru Dimainkan",noGames:"Belum ada permainan dimainkan",guest:"Pelawat",languages:{en:"English",zh:"\u4E2D\u6587",ja:"\u65E5\u672C\u8A9E",ko:"\uD55C\uAD6D\uC5B4",th:"\u0E44\u0E17\u0E22",vi:"Ti\u1EBFng Vi\u1EC7t",id:"Bahasa Indonesia",ms:"Bahasa Melayu",es:"Espa\xF1ol"}},categories:{Adventure:"Pengembaraan",Simulation:"Simulasi",Casual:"Santai",Arcade:"Arked",Moba:"Moba",Puzzle:"Teka-teki"},auth:{loginSuccess:"Log masuk berjaya!",loginTitle:"Log masuk Playsout",welcome:"Selamat datang ke platform permainan Playsout",prompt:"Log masuk untuk mula bermain",mustLogin:"Anda mesti log masuk untuk bermain",authorizeHint:"Klik butang di bawah untuk membenarkan log masuk",authorizing:"Membenarkan...",authorize:"Benarkan log masuk",terms:"Dengan membenarkan, anda bersetuju dengan Syarat Perkhidmatan kami",signingIn:"Sedang log masuk",signMessage:"Sila tandatangan mesej dalam dompet anda"},game:{loading:"Memuatkan",notFound:"Permainan tidak dijumpai",backHome:"Kembali ke laman utama",pageTitleSuffix:"Platform Permainan",header:{back:"Kembali",shareAria:"Kongsi permainan",toggleMenuAria:"Togol menu",fallbackTitle:"Permainan"}},menu:{favorite:"Kegemaran",favorited:"Dikegemarankan",profile:"Profil",login:"Log masuk",refresh:"Muat semula",loggedIn:"Log masuk"},share:{title:"Kongsi Permainan",closeLabel:"Tutup",retry:"Cuba lagi",loading:"Memuatkan...",imageAlt:"Imej kongsi permainan",shareUrlLabel:"URL Kongsi:",copied:"Disalin",copy:"Salin",saveShare:"Simpan & Kongsi",hint:"Imej termasuk kod QR yang memaut ke permainan ini",loadError:"Gagal memuatkan imej kongsi",downloadError:"Gagal memuat turun imej"},checkin:{successTitle:"Anda mendapat ganjaran!",successMessage:"Ganjaran anda telah dituntut.",failedTitle:"Daftar masuk gagal",canceledTitle:"Daftar masuk dibatalkan",errors:{userRejected:"Anda membatalkan operasi daftar masuk",insufficientFunds:"Dana tidak mencukupi untuk membayar yuran Gas",alreadyCheckedIn:"Anda sudah daftar masuk hari ini. Kembali lagi esok!",network:"Ralat rangkaian. Sila cuba lagi kemudian"}},store:{title:"Kedai Permata",hot:"HOT",buy:"BELI",cancel:"Batal",unit:"Permata",successTitle:"Pembayaran Berjaya",successMessage:"Anda menerima {amount} permata!"},payment:{title:"Sahkan Pembelian",description:"Gunakan {amount} permata untuk membeli item permainan ini?",amountLabel:"{amount} permata",balance:"Baki semasa: {balance} permata",insufficientTitle:"Baki Tidak Mencukupi",insufficientDesc:"Tersedia: {gems} Permata",insufficientMessage:"Baki semasa ialah {balance} permata. Pembelian ini memerlukan {amount} permata.",cancel:"Batal",confirm:"Sahkan",recharge:"Tambah Nilai",successTitle:"Pembayaran Berjaya",successMessage:"{amount} permata telah ditolak.",invalidRequest:"Permintaan pembayaran tidak sah."}};var R=i=>{if(typeof window>"u")return i;let t=s(i);return xe(t)},mt="https://games.playsout.com/resources/icon/fonts",W=i=>{if(typeof window>"u")return i;let t=i.replace(/^\.\//,"");return`${mt}/${t}`},M={en:Ie,zh:Se,ja:Ee,ko:Te,th:Pe,vi:Ae,id:Le,ms:Ce};function se(i,t){let e=t.split("."),a=i;for(let r of e)if(a&&typeof a=="object"&&r in a)a=a[r];else return t;return typeof a=="string"?a:t}function Re(i,t={}){return i.replace(/\{(\w+)\}/g,(e,a)=>String(t[a]??`{${a}}`))}var Me=`
2
2
  :root {
3
3
  --playsout-primary: #6366f1;
4
4
  --playsout-bg: #0f1419;
@@ -13,16 +13,16 @@
13
13
  /* Adelle Sans \u5B57\u4F53 */
14
14
  @font-face {
15
15
  font-family: "Adelle Sans";
16
- src: url('${$("./AdelleSans-Regular.woff2")}') format('woff2'),
17
- url('${$("./AdelleSans-Regular.woff")}') format('woff');
16
+ src: url('${W("./AdelleSans-Regular.woff2")}') format('woff2'),
17
+ url('${W("./AdelleSans-Regular.woff")}') format('woff');
18
18
  font-style: normal;
19
19
  font-display: swap;
20
20
  font-weight: 300;
21
21
  }
22
22
  @font-face {
23
23
  font-family: "Adelle Sans";
24
- src: url('${$("./AdelleSans-Semibold.woff2")}') format('woff2'),
25
- url('${$("./AdelleSans-Semibold.woff")}') format('woff');
24
+ src: url('${W("./AdelleSans-Semibold.woff2")}') format('woff2'),
25
+ url('${W("./AdelleSans-Semibold.woff")}') format('woff');
26
26
  font-style: normal;
27
27
  font-display: swap;
28
28
  font-weight: 600;
@@ -138,7 +138,8 @@
138
138
  color: #a855f7; /* \u7D2B\u8272 */
139
139
  width: 1rem;
140
140
  height: 1rem;
141
- fill: #a855f7;
141
+ fill: currentColor;
142
+ stroke: currentColor;
142
143
  }
143
144
 
144
145
  /* Profile Button: demo \u98CE\u683C */
@@ -909,9 +910,11 @@
909
910
  }
910
911
 
911
912
  .store-pack-icon svg {
912
- color: #a855f7; /* purple-500 */
913
+ color: #9333ea; /* purple-600 */
913
914
  width: 1.25rem;
914
915
  height: 1.25rem;
916
+ fill: rgba(147, 51, 234, 0.1);
917
+ stroke: currentColor;
915
918
  }
916
919
 
917
920
  .store-pack-info {
@@ -984,6 +987,150 @@
984
987
  color: #e5e7eb;
985
988
  }
986
989
 
990
+ /* ========== Payment Modal ========== */
991
+ .payment-modal-overlay {
992
+ position: fixed;
993
+ inset: 0;
994
+ z-index: 1500;
995
+ background: rgba(0, 0, 0, 0.6);
996
+ backdrop-filter: blur(4px);
997
+ -webkit-backdrop-filter: blur(4px);
998
+ display: flex;
999
+ align-items: flex-end;
1000
+ justify-content: center;
1001
+ animation: modalFadeIn 0.2s ease-out;
1002
+ }
1003
+
1004
+ .payment-modal {
1005
+ width: 100%;
1006
+ max-width: 28rem;
1007
+ background: #ffffff;
1008
+ border-top: 1px solid #f3f4f6;
1009
+ border-radius: 1.5rem 1.5rem 0 0;
1010
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
1011
+ overflow: hidden;
1012
+ animation: modalSlideUp 0.3s ease-out;
1013
+ }
1014
+
1015
+ @media (min-width: 640px) {
1016
+ .payment-modal {
1017
+ max-width: 20rem;
1018
+ border-radius: 1.5rem;
1019
+ margin: 1rem;
1020
+ }
1021
+ }
1022
+
1023
+ .payment-modal-content {
1024
+ padding: 1.5rem 1rem;
1025
+ display: flex;
1026
+ flex-direction: column;
1027
+ align-items: center;
1028
+ text-align: center;
1029
+ }
1030
+
1031
+ .payment-modal-title {
1032
+ font-size: 1.125rem;
1033
+ font-weight: 700;
1034
+ color: #111827;
1035
+ margin-bottom: 0.5rem;
1036
+ }
1037
+
1038
+ .payment-modal-desc {
1039
+ font-size: 0.8125rem;
1040
+ color: #6b7280;
1041
+ line-height: 1.375;
1042
+ margin-bottom: 1rem;
1043
+ }
1044
+
1045
+ .payment-cost-card {
1046
+ width: 100%;
1047
+ display: flex;
1048
+ align-items: center;
1049
+ justify-content: center;
1050
+ gap: 0.75rem;
1051
+ background: #f9fafb;
1052
+ border: 1px solid #f3f4f6;
1053
+ border-radius: 1rem;
1054
+ padding: 0.75rem 1rem;
1055
+ margin-bottom: 0.75rem;
1056
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.04);
1057
+ }
1058
+
1059
+ .payment-cost-amount {
1060
+ font-size: 1.875rem;
1061
+ font-weight: 900;
1062
+ color: #9333ea;
1063
+ line-height: 1;
1064
+ }
1065
+
1066
+ .payment-cost-icon {
1067
+ width: 1.5rem;
1068
+ height: 1.5rem;
1069
+ color: #9333ea;
1070
+ fill: rgba(147, 51, 234, 0.12);
1071
+ stroke: currentColor;
1072
+ }
1073
+
1074
+ .payment-balance {
1075
+ width: 100%;
1076
+ font-size: 0.75rem;
1077
+ color: #6b7280;
1078
+ margin-bottom: 1rem;
1079
+ }
1080
+
1081
+ .payment-insufficient {
1082
+ width: 100%;
1083
+ background: #fef2f2;
1084
+ border: 1px solid #fee2e2;
1085
+ border-radius: 0.75rem;
1086
+ color: #dc2626;
1087
+ font-size: 0.75rem;
1088
+ font-weight: 600;
1089
+ padding: 0.625rem;
1090
+ margin-bottom: 1rem;
1091
+ }
1092
+
1093
+ .payment-actions {
1094
+ display: flex;
1095
+ gap: 0.75rem;
1096
+ width: 100%;
1097
+ }
1098
+
1099
+ .payment-action-btn {
1100
+ flex: 1;
1101
+ min-width: 0;
1102
+ border: none;
1103
+ border-radius: 0.75rem;
1104
+ padding: 0.75rem 0.5rem;
1105
+ font-size: 0.875rem;
1106
+ font-weight: 700;
1107
+ cursor: pointer;
1108
+ transition: transform 0.15s, background 0.15s;
1109
+ }
1110
+
1111
+ .payment-action-btn:active {
1112
+ transform: scale(0.97);
1113
+ }
1114
+
1115
+ .payment-cancel-btn {
1116
+ background: #f3f4f6;
1117
+ color: #4b5563;
1118
+ }
1119
+
1120
+ .payment-cancel-btn:hover {
1121
+ background: #e5e7eb;
1122
+ }
1123
+
1124
+ .payment-confirm-btn {
1125
+ background: linear-gradient(135deg, #22c55e, #059669);
1126
+ color: #ffffff;
1127
+ box-shadow: 0 10px 15px -3px rgba(5, 150, 105, 0.22);
1128
+ }
1129
+
1130
+ .payment-confirm-btn:hover {
1131
+ background: linear-gradient(135deg, #4ade80, #10b981);
1132
+ }
1133
+
987
1134
  /* ========== Toast ========== */
988
1135
  .toast-container {
989
1136
  position: fixed;
@@ -1035,6 +1182,15 @@
1035
1182
  color: #16a34a;
1036
1183
  }
1037
1184
 
1185
+ .toast-warning .toast-icon {
1186
+ background: #fef3c7;
1187
+ border-color: #fde68a;
1188
+ }
1189
+
1190
+ .toast-warning .toast-icon svg {
1191
+ color: #d97706;
1192
+ }
1193
+
1038
1194
  .toast-content {
1039
1195
  flex: 1;
1040
1196
  min-width: 0;
@@ -1153,7 +1309,7 @@
1153
1309
  border: none;
1154
1310
  display: block;
1155
1311
  }
1156
- `,Le=`
1312
+ `,_e=`
1157
1313
  <svg xmlns="http://www.w3.org/2000/svg" style="display:none">
1158
1314
  <symbol id="icon-adventure" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
1159
1315
  <polyline points="14.5 17.5 3 6 3 3 6 3 17.5 14.5"/>
@@ -1200,8 +1356,13 @@
1200
1356
  <symbol id="icon-warning" viewBox="0 0 24 24" fill="currentColor">
1201
1357
  <path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>
1202
1358
  </symbol>
1359
+ <symbol id="icon-gem" viewBox="0 0 24 24">
1360
+ <path d="M10.5 3 8 9l4 13 4-13-2.5-6"/>
1361
+ <path d="M17 3a2 2 0 0 1 1.6.8l3 4a2 2 0 0 1 .013 2.382l-7.99 10.986a2 2 0 0 1-3.247 0l-7.99-10.986A2 2 0 0 1 2.4 7.8l2.998-3.997A2 2 0 0 1 7 3z"/>
1362
+ <path d="M2 9h20"/>
1363
+ </symbol>
1203
1364
  </svg>
1204
- `,st=o=>{switch(o){case"Adventure":return"#FF7D54";case"Simulation":return"#4ADE80";case"Casual":return"#60A5FA";case"Arcade":return"#A78BFA";case"Moba":return"#FACC15";case"Puzzle":return"#FB923C";case"Doge OS":return"#FBBF24";default:return"#22d3ee"}},Pe=[{id:"Doge OS",name:"Doge OS",iconType:"image",iconSrc:"https://games.playsout.com/resources/icon/image/doge32.png"},{id:"Adventure",name:"Adventure",iconType:"icon",iconKey:"adventure",color:"#FF7D54"},{id:"Simulation",name:"Simulation",iconType:"icon",iconKey:"simulation",color:"#4ADE80"},{id:"Casual",name:"Casual",iconType:"icon",iconKey:"casual",color:"#60A5FA"},{id:"Arcade",name:"Arcade",iconType:"icon",iconKey:"arcade",color:"#A78BFA"},{id:"Moba",name:"Moba",iconType:"icon",iconKey:"moba",color:"#FACC15"},{id:"Puzzle",name:"Puzzle",iconType:"icon",iconKey:"puzzle",color:"#FB923C"}],M=class extends HTMLElement{constructor(){super();this._appId="";this._locale="zh";this.games=[];this.filteredGames=[];this.selectedCategory=null;this.searchQuery="";this.bannerUrl="";this.userPoints=1e3;this.avatarUrl="";this.recentGames=[];this._detailMode="iframe";this.currentView="list";this.currentGame=null;this.gemPacks=[{amount:12,price:.99,hot:!1},{amount:60,price:4.99,hot:!0},{amount:180,price:14.99,hot:!1},{amount:360,price:29.99,hot:!1}];this.toastTimeout=null;this.shadow=this.attachShadow({mode:"open"})}static get observedAttributes(){return["app-id","locale","banner-url","user-points","avatar-url","recent-games","detail-mode"]}t(e,a){let i=R[this._locale]??R.en,r=oe(i,e);if(r!==e)return Ee(r,a??{});let n=oe(R.en,e);return Ee(n,a??{})}hasTranslation(e){let a=R[this._locale]??R.en;return oe(a,e)!==e}connectedCallback(){this.render(),this.loadGames()}attributeChangedCallback(e,a,i){if(a!==i){switch(e){case"app-id":this._appId=i||"";break;case"locale":this._locale=i||"zh";break;case"banner-url":this.bannerUrl=i||"";break;case"user-points":this.userPoints=parseInt(i||"1000",10);break;case"avatar-url":this.avatarUrl=i||"";break;case"recent-games":try{this.recentGames=i?JSON.parse(i):[]}catch{this.recentGames=[]}break;case"detail-mode":this._detailMode=i||"link";break}this.shadow.innerHTML&&(e==="locale"?(this.render(),this.loadGames()):this.updateUI())}}async loadGames(){this.showLoading();let e=window.__playsout_sdk_instance;if(!e||!e.isInitialized){let a=()=>{e&&e.isInitialized&&(y.off("initialized",a),this.loadGames())};e?y.on("initialized",a):this.pollForSDK();return}this.doLoadGames(e)}pollForSDK(){let e=setInterval(()=>{let a=window.__playsout_sdk_instance;a&&a.isInitialized&&(clearInterval(e),this.loadGames())},100);setTimeout(()=>{clearInterval(e),this.games.length||(this.showError(),console.warn("[PlaysoutWidget] SDK initialization timeout"))},1e4)}async doLoadGames(e){try{this.games=await e.getGames();let a=this.games.map(i=>{if(!i.image)return null;let r=window.__playsout_resolveAsset,n=typeof r=="function"?r(i.image):i.image;return typeof n!="string"?null:n.startsWith("http")?n:null}).filter(Boolean);a.length>0&&be(a,!0),this.filterGames()}catch(a){console.error("[PlaysoutWidget] Failed to load games:",a),this.showError()}}filterGames(){let e=[...this.games];if(this.selectedCategory&&(e=e.filter(a=>a.category===this.selectedCategory)),this.searchQuery){let a=this.searchQuery.toLowerCase();e=e.filter(i=>i.title.toLowerCase().includes(a)||i.category.toLowerCase().includes(a))}this.filteredGames=e,this.renderGames()}showLoading(){let e=this.shadow.querySelector(".widget-content");e&&(e.innerHTML=`
1365
+ `,ht=i=>{switch(i){case"Adventure":return"#FF7D54";case"Simulation":return"#4ADE80";case"Casual":return"#60A5FA";case"Arcade":return"#A78BFA";case"Moba":return"#FACC15";case"Puzzle":return"#FB923C";case"Doge OS":return"#FBBF24";default:return"#22d3ee"}},De=[{id:"Doge OS",name:"Doge OS",iconType:"image",iconSrc:"https://games.playsout.com/resources/icon/image/doge32.png"},{id:"Adventure",name:"Adventure",iconType:"icon",iconKey:"adventure",color:"#FF7D54"},{id:"Simulation",name:"Simulation",iconType:"icon",iconKey:"simulation",color:"#4ADE80"},{id:"Casual",name:"Casual",iconType:"icon",iconKey:"casual",color:"#60A5FA"},{id:"Arcade",name:"Arcade",iconType:"icon",iconKey:"arcade",color:"#A78BFA"},{id:"Moba",name:"Moba",iconType:"icon",iconKey:"moba",color:"#FACC15"},{id:"Puzzle",name:"Puzzle",iconType:"icon",iconKey:"puzzle",color:"#FB923C"}],_=class extends HTMLElement{constructor(){super();this._appId="";this._locale="zh";this.games=[];this.filteredGames=[];this.selectedCategory=null;this.searchQuery="";this.bannerUrl="";this.userPoints=1e3;this.avatarUrl="";this.recentGames=[];this._detailMode="iframe";this.currentView="list";this.currentGame=null;this.currentIframeSrc="";this.pendingPaymentResolver=null;this.gemPacks=[{amount:12,price:.99,hot:!1},{amount:60,price:4.99,hot:!0},{amount:180,price:14.99,hot:!1},{amount:360,price:29.99,hot:!1}];this.toastTimeout=null;this.shadow=this.attachShadow({mode:"open"}),this.bridge=new q({getIframe:()=>this.shadow.querySelector(".detail-iframe"),getGameUrl:()=>this.currentIframeSrc,getBalance:()=>this.userPoints,getUser:()=>this.getBridgeUser(),getLocale:()=>this._locale,requestPayment:e=>this.showPaymentModal(e)})}static get observedAttributes(){return["app-id","locale","banner-url","user-points","avatar-url","recent-games","detail-mode"]}t(e,a){let r=M[this._locale]??M.en,o=se(r,e);if(o!==e)return Re(o,a??{});let n=se(M.en,e);return Re(n,a??{})}hasTranslation(e){let a=M[this._locale]??M.en;return se(a,e)!==e}getBridgeUser(){let e=window.__playsout_sdk_instance,a=typeof e?.isInitialized=="function"?e.isInitialized():e?.isInitialized,r=typeof e?.isLoggedIn=="function"?e.isLoggedIn():e?.isLoggedIn,o=a&&r&&typeof e?.getUser=="function"?e.getUser():null;return o?{uid:String(o.userId||o.id||o.username||"user"),nickname:String(o.username||o.name||"User"),avatarUrl:o.avatar||o.avatarUrl||""}:null}setUserPoints(e,a,r){let o=this.userPoints;this.userPoints=Math.max(0,Math.floor(e)),this.updateUI(),this.dispatchEvent(new CustomEvent("gem-balance-change",{bubbles:!0,composed:!0,detail:{balance:this.userPoints,previousBalance:o,delta:this.userPoints-o,reason:a,orderId:r}}))}connectedCallback(){this.bridge.attach(),this.render(),this.loadGames()}disconnectedCallback(){this.resolvePendingPayment({status:"cancelled",balance:this.userPoints}),this.bridge.detach(),this.toastTimeout&&(clearTimeout(this.toastTimeout),this.toastTimeout=null)}attributeChangedCallback(e,a,r){if(a!==r){switch(e){case"app-id":this._appId=r||"";break;case"locale":this._locale=r||"zh";break;case"banner-url":this.bannerUrl=r||"";break;case"user-points":{let o=parseInt(r||"1000",10);this.userPoints=Number.isFinite(o)?o:1e3}break;case"avatar-url":this.avatarUrl=r||"";break;case"recent-games":try{this.recentGames=r?JSON.parse(r):[]}catch{this.recentGames=[]}break;case"detail-mode":this._detailMode=r||"link";break}this.shadow.innerHTML&&(e==="locale"?(this.resolvePendingPayment({status:"cancelled",balance:this.userPoints}),this.bridge.cancelPendingPayment(),this.render(),this.loadGames()):this.updateUI())}}async loadGames(){this.showLoading();let e=window.__playsout_sdk_instance;if(!e||!e.isInitialized){let a=()=>{e&&e.isInitialized&&(b.off("initialized",a),this.loadGames())};e?b.on("initialized",a):this.pollForSDK();return}this.doLoadGames(e)}pollForSDK(){let e=setInterval(()=>{let a=window.__playsout_sdk_instance;a&&a.isInitialized&&(clearInterval(e),this.loadGames())},100);setTimeout(()=>{clearInterval(e),this.games.length||(this.showError(),console.warn("[PlaysoutWidget] SDK initialization timeout"))},1e4)}async doLoadGames(e){try{this.games=await e.getGames();let a=this.games.map(r=>{if(!r.image)return null;let o=window.__playsout_resolveAsset,n=typeof o=="function"?o(r.image):r.image;return typeof n!="string"?null:n.startsWith("http")?n:null}).filter(Boolean);a.length>0&&ke(a,!0),this.filterGames()}catch(a){console.error("[PlaysoutWidget] Failed to load games:",a),this.showError()}}filterGames(){let e=[...this.games];if(this.selectedCategory&&(e=e.filter(a=>a.category===this.selectedCategory)),this.searchQuery){let a=this.searchQuery.toLowerCase();e=e.filter(r=>r.title.toLowerCase().includes(a)||r.category.toLowerCase().includes(a))}this.filteredGames=e,this.renderGames()}showLoading(){let e=this.shadow.querySelector(".widget-content");e&&(e.innerHTML=`
1205
1366
  <div class="loading">
1206
1367
  <div class="loading-spinner"></div>
1207
1368
  </div>
@@ -1214,25 +1375,23 @@
1214
1375
  </div>
1215
1376
  <p>Failed to load games</p>
1216
1377
  </div>
1217
- `)}render(){console.log("[PlaysoutWidget] render called");let e=this.bannerUrl||s("./home-banner.webp");if(this.__criticalAssetsMarked!==!0){let a=s("./logowhite.png"),i=Pe.filter(r=>r.iconType==="image"&&r.iconSrc).map(r=>r.iconSrc);fe([a,e,...i]),this.__criticalAssetsMarked=!0}if(this.currentView==="detail"&&this.currentGame){this.renderGameDetail();return}this.shadow.innerHTML=`
1218
- <style>${Ce}</style>
1219
- ${Le}
1378
+ `)}render(){let e=this.bannerUrl||s("./home-banner.webp");if(this.__criticalAssetsMarked!==!0){let a=s("./logowhite.png"),r=De.filter(o=>o.iconType==="image"&&o.iconSrc).map(o=>o.iconSrc);we([a,e,...r]),this.__criticalAssetsMarked=!0}if(this.currentView==="detail"&&this.currentGame){this.renderGameDetail();return}this.shadow.innerHTML=`
1379
+ <style>${Me}</style>
1380
+ ${_e}
1220
1381
  <div class="playsout-scroll-container">
1221
1382
  <div class="mobile-container">
1222
1383
  <div class="playsout-widget">
1223
1384
  <!-- Header -->
1224
1385
  <header class="widget-header">
1225
1386
  <div class="widget-logo">
1226
- <img src="${P("./logowhite.png")}" alt="Playsout" />
1387
+ <img src="${R("./logowhite.png")}" alt="Playsout" />
1227
1388
  </div>
1228
1389
  <div class="widget-user">
1229
1390
  <!-- Gems Button -->
1230
1391
  <button class="widget-gems-btn" id="gems-btn" aria-label="Gem Store">
1231
1392
  <span class="widget-gems-amount" id="gems-amount">${this.userPoints}</span>
1232
- <svg class="widget-gems-icon" viewBox="0 0 24 24" fill="currentColor" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
1233
- <path d="M6 3h12l4 6-10 13L2 9Z"/>
1234
- <path d="M11 3 8 9l4 13 4-13-3-6"/>
1235
- <path d="M2 9h20"/>
1393
+ <svg class="widget-gems-icon" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
1394
+ <use href="#icon-gem"/>
1236
1395
  </svg>
1237
1396
  </button>
1238
1397
  <!-- Profile Button -->
@@ -1249,7 +1408,7 @@
1249
1408
  <div class="widget-banner">
1250
1409
  <img
1251
1410
  class="banner-image"
1252
- src="${e?P(e):""}"
1411
+ src="${e?R(e):""}"
1253
1412
  alt="Playsout Games"
1254
1413
  />
1255
1414
  </div>
@@ -1279,8 +1438,8 @@
1279
1438
  <!-- Categories -->
1280
1439
  <div class="widget-categories">
1281
1440
  <div class="categories-wrapper" id="categories">
1282
- ${Pe.map(a=>{let i=this.selectedCategory===a.id,r=a.color||st(a.id),n=a.iconType==="image"&&a.iconSrc?`<img src="${P(a.iconSrc)}" alt="" style="width:1rem;height:1rem;object-fit:contain;" />`:`<svg width="1rem" height="1rem" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" color="${r}" style="color:${r}"><use href="#icon-${a.iconKey}"/></svg>`,d=this.hasTranslation(`categories.${a.id}`)?this.t(`categories.${a.id}`):a.name;return`
1283
- <button class="category-btn${i?" active":""}" data-category="${a.id}">
1441
+ ${De.map(a=>{let r=this.selectedCategory===a.id,o=a.color||ht(a.id),n=a.iconType==="image"&&a.iconSrc?`<img src="${R(a.iconSrc)}" alt="" style="width:1rem;height:1rem;object-fit:contain;" />`:`<svg width="1rem" height="1rem" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" color="${o}" style="color:${o}"><use href="#icon-${a.iconKey}"/></svg>`,d=this.hasTranslation(`categories.${a.id}`)?this.t(`categories.${a.id}`):a.name;return`
1442
+ <button class="category-btn${r?" active":""}" data-category="${a.id}">
1284
1443
  <span class="category-icon">${n}</span>
1285
1444
  <span class="category-label">${d}</span>
1286
1445
  </button>`}).join("")}
@@ -1304,15 +1463,15 @@
1304
1463
  <div class="store-modal-content">
1305
1464
  ${this.gemPacks.map(a=>`
1306
1465
  <div class="store-pack">
1307
- ${a.hot?'<div class="store-pack-hot">HOT</div>':""}
1466
+ ${a.hot?`<div class="store-pack-hot">${this.t("store.hot")}</div>`:""}
1308
1467
  <div class="store-pack-left">
1309
1468
  <div class="store-pack-icon">
1310
- <svg viewBox="0 0 24 24" fill="currentColor">
1311
- <path d="M19 3H5L2 9l10 12L22 9l-3-6zm-7 14.8L5.1 9h13.8L12 17.8z"/>
1469
+ <svg viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
1470
+ <use href="#icon-gem"/>
1312
1471
  </svg>
1313
1472
  </div>
1314
1473
  <div class="store-pack-info">
1315
- <span class="store-pack-amount">${a.amount} <span>gems</span></span>
1474
+ <span class="store-pack-amount">${a.amount} <span>${this.t("store.unit")}</span></span>
1316
1475
  <span class="store-pack-price">US$${a.price}</span>
1317
1476
  </div>
1318
1477
  </div>
@@ -1324,9 +1483,28 @@
1324
1483
  <button class="store-cancel-btn" id="store-cancel">${this.t("store.cancel")}</button>
1325
1484
  </div>
1326
1485
  </div>
1327
- `,this.shadow.appendChild(e),e.querySelectorAll(".store-buy-btn").forEach(a=>{a.addEventListener("click",()=>{let i=parseInt(a.dataset.amount||"0",10);this.handleGemPurchase(i)})}),e.querySelector("#store-cancel")?.addEventListener("click",()=>{this.hideStoreModal()}),e.addEventListener("click",a=>{a.target===e&&this.hideStoreModal()})}hideStoreModal(){this.shadow.querySelector("#store-modal-overlay")?.remove()}showProfileModal(){this.hideProfileModal();let e=document.createElement("div");e.className="profile-modal-overlay",e.id="profile-modal-overlay";let a=window.__playsout_sdk_instance,n=((typeof a?.isInitialized=="function"?a.isInitialized():a?.isInitialized)?a.getUser():null)?.username||this.t("profile.guest"),d=this.recentGames.length>0?this.recentGames.slice(0,5).map(u=>`
1486
+ `,this.shadow.appendChild(e),e.querySelectorAll(".store-buy-btn").forEach(a=>{a.addEventListener("click",()=>{let r=parseInt(a.dataset.amount||"0",10);this.handleGemPurchase(r)})}),e.querySelector("#store-cancel")?.addEventListener("click",()=>{this.hideStoreModal()}),e.addEventListener("click",a=>{a.target===e&&this.hideStoreModal()})}hideStoreModal(){this.shadow.querySelector("#store-modal-overlay")?.remove()}showPaymentModal(e){return this.hidePaymentModal(),new Promise(a=>{this.pendingPaymentResolver=a;let r=document.createElement("div");r.className="payment-modal-overlay",r.id="payment-modal-overlay";let o=this.userPoints<e.amount;r.innerHTML=`
1487
+ <div class="payment-modal" role="dialog" aria-modal="true" aria-labelledby="payment-modal-title">
1488
+ <div class="payment-modal-content">
1489
+ <h2 class="payment-modal-title" id="payment-modal-title">${this.t("payment.title")}</h2>
1490
+ <p class="payment-modal-desc">${this.t("payment.description",{amount:e.amount})}</p>
1491
+ <div class="payment-cost-card" aria-label="${this.t("payment.amountLabel",{amount:e.amount})}">
1492
+ <span class="payment-cost-amount">${e.amount}</span>
1493
+ <svg class="payment-cost-icon" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
1494
+ <use href="#icon-gem"/>
1495
+ </svg>
1496
+ </div>
1497
+ <div class="payment-balance">${this.t("payment.balance",{balance:this.userPoints})}</div>
1498
+ ${o?`<div class="payment-insufficient">${this.t("payment.insufficientMessage",{balance:this.userPoints,amount:e.amount})}</div>`:""}
1499
+ <div class="payment-actions">
1500
+ <button class="payment-action-btn payment-cancel-btn" id="payment-cancel-btn">${this.t("payment.cancel")}</button>
1501
+ <button class="payment-action-btn payment-confirm-btn" id="payment-confirm-btn">${this.t("payment.confirm")}</button>
1502
+ </div>
1503
+ </div>
1504
+ </div>
1505
+ `,this.shadow.appendChild(r),r.querySelector("#payment-cancel-btn")?.addEventListener("click",()=>{this.resolvePendingPayment({status:"cancelled",balance:this.userPoints})}),r.querySelector("#payment-confirm-btn")?.addEventListener("click",()=>{if(this.userPoints<e.amount){this.showToast(this.t("payment.insufficientTitle"),this.t("payment.insufficientMessage",{balance:this.userPoints,amount:e.amount}),"warning"),this.resolvePendingPayment({status:"insufficient",balance:this.userPoints});return}this.setUserPoints(this.userPoints-e.amount,"payment",e.orderId),this.showToast(this.t("payment.successTitle"),this.t("payment.successMessage",{amount:e.amount})),this.resolvePendingPayment({status:"success",balance:this.userPoints})}),r.addEventListener("click",n=>{n.target===r&&this.resolvePendingPayment({status:"cancelled",balance:this.userPoints})})})}hidePaymentModal(){this.shadow.querySelector("#payment-modal-overlay")?.remove()}resolvePendingPayment(e){let a=this.pendingPaymentResolver;this.pendingPaymentResolver=null,this.hidePaymentModal(),a&&a(e)}showProfileModal(){this.hideProfileModal();let e=document.createElement("div");e.className="profile-modal-overlay",e.id="profile-modal-overlay";let a=window.__playsout_sdk_instance,n=((typeof a?.isInitialized=="function"?a.isInitialized():a?.isInitialized)?a.getUser():null)?.username||this.t("profile.guest"),d=this.recentGames.length>0?this.recentGames.slice(0,5).map(u=>`
1328
1506
  <div class="profile-recent-game" data-game-id="${u.id}">
1329
- <img class="profile-recent-game-image" src="${P(u.image)}" alt="${u.title}" loading="lazy" />
1507
+ <img class="profile-recent-game-image" src="${R(u.image)}" alt="${u.title}" loading="lazy" />
1330
1508
  <div class="profile-recent-info">
1331
1509
  <h4 class="profile-recent-title">${u.title}</h4>
1332
1510
  <p class="profile-recent-category">${this.hasTranslation(`categories.${u.category}`)?this.t(`categories.${u.category}`):u.category}</p>
@@ -1366,34 +1544,34 @@
1366
1544
  </section>
1367
1545
  </div>
1368
1546
  </div>
1369
- `,this.shadow.appendChild(e),e.querySelector("#profile-close-btn")?.addEventListener("click",()=>{this.hideProfileModal()}),e.addEventListener("click",u=>{u.target===e&&this.hideProfileModal()});let m=()=>{let u=window.__playsout_sdk_instance,F=(u?.getUser?u.getUser():null)?.username||this.t("profile.guest"),_=this.shadow.querySelector(".profile-username-text");_&&(_.textContent=F)},b=()=>{let u=this.shadow.querySelector(".profile-username-text");u&&(u.textContent=this.t("profile.guest")),this.hideProfileModal()},f=window.__playsout_sdk_instance;f?.on&&(f.on("login",m),f.on("logout",m),f.on("authExpired",b)),e.querySelectorAll(".profile-recent-game").forEach(u=>{u.addEventListener("click",()=>{let k=window.__playsout_sdk_instance,F=typeof k?.isInitialized=="function"?k.isInitialized():k?.isInitialized,_=typeof k?.isLoggedIn=="function"?k.isLoggedIn():k?.isLoggedIn;if(!F||!_){this.hideProfileModal(),this.showLoginPrompt();return}let Re=u.dataset.gameId;this.dispatchEvent(new CustomEvent("game-click",{bubbles:!0,composed:!0,detail:Re})),this.hideProfileModal()})}),e.querySelector("#profile-language-btn")?.addEventListener("click",()=>{this.showLanguageSelectModal()})}hideProfileModal(){this.shadow.querySelector("#profile-modal-overlay")?.remove(),this.shadow.querySelector("#language-modal-overlay")?.remove()}showLanguageSelectModal(){this.shadow.querySelector("#language-modal-overlay")?.remove();let e=document.createElement("div");e.className="language-modal-overlay",e.id="language-modal-overlay";let a=[{code:"en",label:"English"},{code:"zh",label:"\u4E2D\u6587"},{code:"ja",label:"\u65E5\u672C\u8A9E"},{code:"ko",label:"\uD55C\uAD6D\uC5B4"},{code:"th",label:"\u0E44\u0E17\u0E22"},{code:"vi",label:"Ti\u1EBFng Vi\u1EC7t"},{code:"id",label:"Bahasa Indonesia"},{code:"ms",label:"Bahasa Melayu"},{code:"es",label:"Espa\xF1ol"}];e.innerHTML=`
1547
+ `,this.shadow.appendChild(e),e.querySelector("#profile-close-btn")?.addEventListener("click",()=>{this.hideProfileModal()}),e.addEventListener("click",u=>{u.target===e&&this.hideProfileModal()});let m=()=>{let u=window.__playsout_sdk_instance,V=(u?.getUser?u.getUser():null)?.username||this.t("profile.guest"),D=this.shadow.querySelector(".profile-username-text");D&&(D.textContent=V)},y=()=>{let u=this.shadow.querySelector(".profile-username-text");u&&(u.textContent=this.t("profile.guest")),this.hideProfileModal()},f=window.__playsout_sdk_instance;f?.on&&(f.on("login",m),f.on("logout",m),f.on("authExpired",y)),e.querySelectorAll(".profile-recent-game").forEach(u=>{u.addEventListener("click",()=>{let k=window.__playsout_sdk_instance,V=typeof k?.isInitialized=="function"?k.isInitialized():k?.isInitialized,D=typeof k?.isLoggedIn=="function"?k.isLoggedIn():k?.isLoggedIn;if(!V||!D){this.hideProfileModal(),this.showLoginPrompt();return}let Ge=u.dataset.gameId;this.dispatchEvent(new CustomEvent("game-click",{bubbles:!0,composed:!0,detail:Ge})),this.hideProfileModal()})}),e.querySelector("#profile-language-btn")?.addEventListener("click",()=>{this.showLanguageSelectModal()})}hideProfileModal(){this.shadow.querySelector("#profile-modal-overlay")?.remove(),this.shadow.querySelector("#language-modal-overlay")?.remove()}showLanguageSelectModal(){this.shadow.querySelector("#language-modal-overlay")?.remove();let e=document.createElement("div");e.className="language-modal-overlay",e.id="language-modal-overlay";let a=[{code:"en",label:"English"},{code:"zh",label:"\u4E2D\u6587"},{code:"ja",label:"\u65E5\u672C\u8A9E"},{code:"ko",label:"\uD55C\uAD6D\uC5B4"},{code:"th",label:"\u0E44\u0E17\u0E22"},{code:"vi",label:"Ti\u1EBFng Vi\u1EC7t"},{code:"id",label:"Bahasa Indonesia"},{code:"ms",label:"Bahasa Melayu"},{code:"es",label:"Espa\xF1ol"}];e.innerHTML=`
1370
1548
  <div class="language-modal">
1371
1549
  <div class="language-modal-header">
1372
1550
  <h3 class="language-modal-title">${this.t("profile.language")}</h3>
1373
1551
  <button class="language-modal-close" id="language-close-btn">\u2715</button>
1374
1552
  </div>
1375
1553
  <div class="language-modal-list">
1376
- ${a.map(i=>`
1377
- <button class="language-option${i.code===this._locale?" active":""}" data-lang="${i.code}">
1378
- <span class="language-option-label">${i.label}</span>
1379
- ${i.code===this._locale?'<span class="language-option-check">\u2713</span>':""}
1554
+ ${a.map(r=>`
1555
+ <button class="language-option${r.code===this._locale?" active":""}" data-lang="${r.code}">
1556
+ <span class="language-option-label">${r.label}</span>
1557
+ ${r.code===this._locale?'<span class="language-option-check">\u2713</span>':""}
1380
1558
  </button>
1381
1559
  `).join("")}
1382
1560
  </div>
1383
1561
  </div>
1384
- `,this.shadow.appendChild(e),e.querySelector("#language-close-btn")?.addEventListener("click",()=>{this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.addEventListener("click",i=>{i.target===e&&this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.querySelectorAll(".language-option").forEach(i=>{i.addEventListener("click",()=>{let r=i.dataset.lang;if(r&&r!==this._locale){this._locale=r,this.setAttribute("locale",this._locale),this.dispatchEvent(new CustomEvent("locale-change",{bubbles:!0,composed:!0,detail:this._locale}));let n=this.shadow.querySelector("#profile-current-lang");n&&(n.textContent=this.t(`profile.languages.${this._locale}`)),this.shadow.querySelector("#language-modal-overlay")?.remove()}})})}handleGemPurchase(e){this.userPoints+=e,this.updateUI(),this.hideStoreModal(),this.showToast(`${e}`)}showToast(e){this.toastTimeout&&clearTimeout(this.toastTimeout),this.shadow.querySelector("#toast-container")?.remove();let a=document.createElement("div");a.className="toast-container",a.id="toast-container",a.innerHTML=`
1385
- <div class="toast">
1562
+ `,this.shadow.appendChild(e),e.querySelector("#language-close-btn")?.addEventListener("click",()=>{this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.addEventListener("click",r=>{r.target===e&&this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.querySelectorAll(".language-option").forEach(r=>{r.addEventListener("click",()=>{let o=r.dataset.lang;if(o&&o!==this._locale){this._locale=o,this.setAttribute("locale",this._locale),this.dispatchEvent(new CustomEvent("locale-change",{bubbles:!0,composed:!0,detail:this._locale}));let n=this.shadow.querySelector("#profile-current-lang");n&&(n.textContent=this.t(`profile.languages.${this._locale}`)),this.shadow.querySelector("#language-modal-overlay")?.remove()}})})}handleGemPurchase(e){this.setUserPoints(this.userPoints+e,"store"),this.hideStoreModal(),this.showToast(this.t("store.successTitle"),this.t("store.successMessage",{amount:e}))}showToast(e,a="",r="success"){this.toastTimeout&&clearTimeout(this.toastTimeout),this.shadow.querySelector("#toast-container")?.remove();let o=document.createElement("div");o.className="toast-container",o.id="toast-container",o.innerHTML=`
1563
+ <div class="toast${r==="warning"?" toast-warning":""}">
1386
1564
  <div class="toast-icon">
1387
1565
  <svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
1388
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
1566
+ ${r==="warning"?'<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M12 9v4m0 4h.01M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/>':'<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>'}
1389
1567
  </svg>
1390
1568
  </div>
1391
1569
  <div class="toast-content">
1392
1570
  <div class="toast-title">${e}</div>
1393
- <div class="toast-message">${this.t("store.successMessage",{amount:e})}</div>
1571
+ ${a?`<div class="toast-message">${a}</div>`:""}
1394
1572
  </div>
1395
1573
  </div>
1396
- `,this.shadow.appendChild(a),this.toastTimeout=window.setTimeout(()=>{a.style.opacity="0",a.style.transition="opacity 0.2s",setTimeout(()=>a.remove(),200)},3e3)}renderGames(){let e=this.shadow.querySelector(".widget-content");if(e){if(this.filteredGames.length===0){e.innerHTML=`
1574
+ `,this.shadow.appendChild(o),this.toastTimeout=window.setTimeout(()=>{o.style.opacity="0",o.style.transition="opacity 0.2s",setTimeout(()=>o.remove(),200)},3e3)}renderGames(){let e=this.shadow.querySelector(".widget-content");if(e){if(this.filteredGames.length===0){e.innerHTML=`
1397
1575
  <div class="widget-games">
1398
1576
  <div class="no-results">
1399
1577
  <p>${this.t("home.noGames")}</p>
@@ -1402,10 +1580,10 @@
1402
1580
  `;return}e.innerHTML=`
1403
1581
  <div class="widget-games">
1404
1582
  <div class="games-grid">
1405
- ${this.filteredGames.map((a,i)=>this.renderGameCard(a,i)).join("")}
1583
+ ${this.filteredGames.map((a,r)=>this.renderGameCard(a,r)).join("")}
1406
1584
  </div>
1407
1585
  </div>
1408
- `,e.querySelectorAll(".game-card").forEach(a=>{a.addEventListener("click",()=>{let i=a.getAttribute("data-game-id"),r=this.games.find(n=>n.id===i);if(r){let n=window.__playsout_sdk_instance,d=typeof n?.isInitialized=="function"?n.isInitialized():n?.isInitialized,m=typeof n?.isLoggedIn=="function"?n.isLoggedIn():n?.isLoggedIn;if(!d||!m){this.showLoginPrompt();return}if(this.dispatchEvent(new CustomEvent("game-click",{detail:r,bubbles:!0,composed:!0})),this._detailMode==="iframe"&&r.externalUrl)this.currentGame=r,this.currentView="detail",this.render();else{let b=r.externalUrl||`/games/${r.id}`;window.location.href=b}}})})}}showLoginPrompt(){this.toastTimeout&&clearTimeout(this.toastTimeout),this.shadow.querySelector("#toast-container")?.remove();let e=document.createElement("div");e.className="toast-container";let a=this.t.bind(this);e.innerHTML=`
1586
+ `,e.querySelectorAll(".game-card").forEach(a=>{a.addEventListener("click",()=>{let r=a.getAttribute("data-game-id"),o=this.games.find(n=>n.id===r);if(o){let n=window.__playsout_sdk_instance,d=typeof n?.isInitialized=="function"?n.isInitialized():n?.isInitialized,m=typeof n?.isLoggedIn=="function"?n.isLoggedIn():n?.isLoggedIn;if(!d||!m){this.showLoginPrompt();return}if(this.dispatchEvent(new CustomEvent("game-click",{detail:o,bubbles:!0,composed:!0})),this._detailMode==="iframe"&&o.externalUrl)this.currentGame=o,this.currentView="detail",this.render();else{let y=o.externalUrl||`/games/${o.id}`;window.location.href=y}}})})}}showLoginPrompt(){this.toastTimeout&&clearTimeout(this.toastTimeout),this.shadow.querySelector("#toast-container")?.remove();let e=document.createElement("div");e.className="toast-container";let a=this.t.bind(this);e.innerHTML=`
1409
1587
  <div class="toast login-prompt-toast">
1410
1588
  <div class="toast-icon">
1411
1589
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
@@ -1418,29 +1596,29 @@
1418
1596
  <div class="toast-title">${a("auth.mustLogin")}</div>
1419
1597
  </div>
1420
1598
  </div>
1421
- `,this.shadow.appendChild(e),this.toastTimeout=window.setTimeout(()=>{e.style.opacity="0",e.style.transform="translateY(10px)",e.style.transition="all 0.2s ease-out",setTimeout(()=>e.remove(),200)},1e3)}renderGameCard(e,a){let i=[];e.isNew&&i.push('<span class="game-tag new">NEW</span>'),e.isHot&&i.push('<span class="game-tag hot">HOT</span>');let r=a<8?"eager":"lazy";return`
1599
+ `,this.shadow.appendChild(e),this.toastTimeout=window.setTimeout(()=>{e.style.opacity="0",e.style.transform="translateY(10px)",e.style.transition="all 0.2s ease-out",setTimeout(()=>e.remove(),200)},1e3)}renderGameCard(e,a){let r=[];e.isNew&&r.push('<span class="game-tag new">NEW</span>'),e.isHot&&r.push('<span class="game-tag hot">HOT</span>');let o=a<8?"eager":"lazy";return`
1422
1600
  <div class="game-card" data-game-id="${e.id}">
1423
1601
  <div class="game-image-wrapper">
1424
1602
  <img
1425
1603
  class="game-image"
1426
- src="${P(e.image)}"
1604
+ src="${R(e.image)}"
1427
1605
  alt="${e.title}"
1428
- loading="${r}"
1606
+ loading="${o}"
1429
1607
  draggable="false"
1430
1608
  />
1431
1609
  </div>
1432
1610
  <div class="game-info">
1433
1611
  <div class="title-row">
1434
1612
  <h3 class="game-title">${e.title}</h3>
1435
- ${i.length>0?i.join(""):""}
1613
+ ${r.length>0?r.join(""):""}
1436
1614
  </div>
1437
1615
  <div class="divider"></div>
1438
1616
  <p class="game-category">${this.hasTranslation(`categories.${e.category}`)?this.t(`categories.${e.category}`):e.category}</p>
1439
1617
  </div>
1440
1618
  </div>
1441
- `}renderGameDetail(){if(!this.currentGame)return;let e=this.currentGame,a=e.externalUrl||`/games/${e.id}`;this.shadow.innerHTML=`
1442
- <style>${Ce}</style>
1443
- ${Le}
1619
+ `}renderGameDetail(){if(!this.currentGame)return;let e=this.currentGame,a=e.externalUrl||`/games/${e.id}`;this.currentIframeSrc=a,this.shadow.innerHTML=`
1620
+ <style>${Me}</style>
1621
+ ${_e}
1444
1622
  <div class="playsout-scroll-container">
1445
1623
  <div class="mobile-container">
1446
1624
  <div class="playsout-widget">
@@ -1468,4 +1646,4 @@
1468
1646
  </div>
1469
1647
  </div>
1470
1648
  </div>
1471
- `,this.shadow.getElementById("detail-back-btn")?.addEventListener("click",()=>{this.currentView="list",this.currentGame=null,this.render(),this.loadGames()})}attachEventListeners(){this.shadow.getElementById("gems-btn")?.addEventListener("click",()=>{this.showStoreModal()}),this.shadow.getElementById("profile-btn")?.addEventListener("click",()=>{this.showProfileModal()});let e=this.shadow.getElementById("search-input");e?.addEventListener("input",i=>{let r=i.target;this.searchQuery=r.value,this.filterGames()}),this.shadow.getElementById("search-btn")?.addEventListener("click",()=>{e?.focus()});let a=this.shadow.getElementById("categories");a?.addEventListener("click",i=>{let n=i.target.closest(".category-btn");if(n){let d=n.getAttribute("data-category")||"";this.selectedCategory===d?(this.selectedCategory=null,a.querySelectorAll(".category-btn").forEach(m=>{m.classList.remove("active")})):(this.selectedCategory=d,a.querySelectorAll(".category-btn").forEach(m=>{m.classList.remove("active")}),n.classList.add("active")),this.filterGames()}})}};customElements.get("playsout-widget")||customElements.define("playsout-widget",M);typeof customElements<"u"&&(customElements.get("playsout-widget")||customElements.define("playsout-widget",M));var{init:lt,mount:ct,unmount:dt,destroy:gt,Login:ut,logout:mt,getToken:ht,getUserInfo:pt,getUser:ft,setLocale:bt,getLocale:yt,getGames:vt,getCategories:wt,on:kt,off:xt,isInitialized:St,isLoggedIn:Tt,instance:It,PlaysoutSDKClass:At}=N;typeof window<"u"&&(window.Playsout=N,window.__playsout_sdk_instance=N.instance);return Ne(Et);})();
1649
+ `,this.shadow.getElementById("detail-back-btn")?.addEventListener("click",()=>{this.resolvePendingPayment({status:"cancelled",balance:this.userPoints}),this.bridge.cancelPendingPayment(),this.currentView="list",this.currentGame=null,this.currentIframeSrc="",this.render(),this.loadGames()})}attachEventListeners(){this.shadow.getElementById("gems-btn")?.addEventListener("click",()=>{this.showStoreModal()}),this.shadow.getElementById("profile-btn")?.addEventListener("click",()=>{this.showProfileModal()});let e=this.shadow.getElementById("search-input");e?.addEventListener("input",r=>{let o=r.target;this.searchQuery=o.value,this.filterGames()}),this.shadow.getElementById("search-btn")?.addEventListener("click",()=>{e?.focus()});let a=this.shadow.getElementById("categories");a?.addEventListener("click",r=>{let n=r.target.closest(".category-btn");if(n){let d=n.getAttribute("data-category")||"";this.selectedCategory===d?(this.selectedCategory=null,a.querySelectorAll(".category-btn").forEach(m=>{m.classList.remove("active")})):(this.selectedCategory=d,a.querySelectorAll(".category-btn").forEach(m=>{m.classList.remove("active")}),n.classList.add("active")),this.filterGames()}})}};customElements.get("playsout-widget")||customElements.define("playsout-widget",_);typeof customElements<"u"&&(customElements.get("playsout-widget")||customElements.define("playsout-widget",_));var{init:pt,mount:ft,unmount:yt,destroy:bt,Login:vt,logout:wt,getToken:kt,getUserInfo:xt,getUser:It,setLocale:St,getLocale:Et,getGames:Tt,getCategories:Pt,on:At,off:Lt,isInitialized:Ct,isLoggedIn:Rt,instance:Mt,PlaysoutSDKClass:_t}=N;typeof window<"u"&&(window.Playsout=N,window.__playsout_sdk_instance=N.instance);return je(Dt);})();