playsout-web-sdk 1.0.4 → 1.0.6
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/README.md +36 -55
- package/chunk-NHFWJCNJ.cjs +2 -0
- package/chunk-XDBADNFW.js +2 -0
- package/core/api.d.ts +2 -1
- package/core/api.d.ts.map +1 -1
- package/core/index.d.ts +4 -0
- package/core/index.d.ts.map +1 -1
- package/core/storage.d.ts +1 -0
- package/core/storage.d.ts.map +1 -1
- package/core/types.d.ts +2 -2
- package/core/types.d.ts.map +1 -1
- package/index.cjs +1 -1
- package/index.global.js +35 -35
- package/index.iife.js +35 -35
- package/index.js +1 -1
- package/package.json +1 -1
- package/react/index.cjs +1 -1
- package/react/index.js +1 -1
- package/vue/index.cjs +1 -1
- package/vue/index.js +1 -1
- package/chunk-I2HADAGI.js +0 -2
- package/chunk-R6BPBCQR.cjs +0 -2
package/index.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var __PlaysoutBundle=(()=>{var F=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Ge=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var ze=(n,t)=>{for(var e in t)F(n,e,{get:t[e],enumerable:!0})},Ue=(n,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Ge(t))!Ne.call(n,r)&&r!==e&&F(n,r,{get:()=>t[r],enumerable:!(a=Oe(t,r))||a.enumerable});return n};var Be=n=>Ue(F({},"__esModule",{value:!0}),n);var Mt={};ze(Mt,{Login:()=>yt,PlaysoutSDKClass:()=>Rt,destroy:()=>ft,getCategories:()=>St,getGames:()=>Et,getLocale:()=>It,getToken:()=>vt,getUser:()=>kt,getUserInfo:()=>wt,init:()=>mt,instance:()=>Ct,isInitialized:()=>At,isLoggedIn:()=>Lt,logout:()=>bt,mount:()=>ht,off:()=>Pt,on:()=>Tt,setLocale:()=>xt,unmount:()=>pt});var v=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}}},je={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 u(n,t){return new v(n,je[n],t)}var R="playsout_",M=class{constructor(t){this.storage=t}get(t){try{return this.storage.getItem(R+t)}catch{return null}}set(t,e){try{this.storage.setItem(R+t,e)}catch(a){console.warn("[PlaysoutSDK] Storage set failed:",a)}}remove(t){try{this.storage.removeItem(R+t)}catch{}}clear(){try{let t=[];for(let e=0;e<this.storage.length;e++){let a=this.storage.key(e);a&&a.startsWith(R)&&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 ie(n="localStorage"){return typeof window>"u"||n==="memory"?new q:n==="sessionStorage"?new M(sessionStorage):new M(localStorage)}var k=ie(),m={get:n=>k.get(n),set:(n,t)=>{k.set(n,t)},remove:n=>{k.remove(n)},clear:()=>{k.clear()},getJSON:n=>{let t=k.get(n);if(!t)return null;try{return JSON.parse(t)}catch{return null}},setJSON:(n,t)=>{k.set(n,JSON.stringify(t))},configure(n){k=ie(n)}},f={TOKEN_DATA:"token_data",USER:"user",LOCALE:"locale",CONFIG:"config"};var W=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()}},E=new W,y={on:(n,t)=>E.on(n,t),once:(n,t)=>E.once(n,t),off:(n,t)=>{E.off(n,t)},clear:()=>{E.clear()},emit:(n,t)=>{E.emit(n,t)}};var He="https://games.playsout.com/resources/icon/image";function l(n){if(!n||/^(data:|https?:|blob:)/i.test(n))return n;let t=n.replace(/^\.\//,"");return`${He}/${t}`}var $e=n=>{if(!n)return n;try{let t=new URL(n);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 n}},Ke=n=>n.map(t=>{if(!t.externalUrl)return t;let e=$e(t.externalUrl);return e===t.externalUrl?t:{...t,externalUrl:e}}),Fe=[{id:"BlockCrushFun",title:"Block Crush Fun",category:"Puzzle",image:l("./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:l("./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:l("./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:l("./games/DogeMart.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMart/"},{id:"KittyEscape",title:"Kitty Escape",category:"Puzzle",image:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./games/Falling2048.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Falling2048/"}],se=Ke(Fe),w=()=>se.filter(n=>n.enable),Ut={Adventure:w().filter(n=>n.category==="Adventure"),Moba:w().filter(n=>n.category==="Moba")};var le=n=>se.find(t=>t.id===n);var ce=()=>Array.from(new Set(w().map(n=>n.category)));var X="https://api.playsout.com",Z=3e4;function We(n){let t=String(n?.platform||"").toLowerCase();if(t==="tiktok"){let e=n.authorizationCode;if(typeof e!="string"||!e.trim())throw u("MISSING_PARAMS","authorizationCode is required for TikTok login");return{platform:t,authorizationCode:e}}if(t==="grab"||t==="eros"){let e=n;if(typeof e.platformUserId!="string"||!e.platformUserId.trim())throw u("MISSING_PARAMS","platformUserId is required for Grab/Eros login");if(typeof e.platformToken!="string"||!e.platformToken.trim())throw u("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 u("INVALID_PARAMS","Unsupported platform. Expected grab, eros, or tiktok")}var S=null,Y=null,Q=null;function me(n){Y=n}function he(n){Q=n}function de(){if(Q)try{Q()}catch{}}async function ge(n,t={},e,a=!1){let r=e?.apiBaseUrl||X,o=n.startsWith("http")?n:`${r}${n}`,i=new AbortController,s=setTimeout(()=>i.abort(),Z);try{let g=m.getJSON(f.TOKEN_DATA),h={"Content-Type":"application/json",...t.headers};g?.accessToken&&!h.token&&(h.token=g.accessToken);let p=await fetch(o,{...t,signal:i.signal,headers:h});if(clearTimeout(s),!p.ok){if(p.status===401&&a)return await ue(n,t,e);throw u(p.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${p.status}: ${p.statusText}`)}let C=await p.json();if(C.code!==1e4){if(a)return await ue(n,t,e);throw u("API_ERROR",C.msg||"API request failed")}return C.data}catch(g){throw clearTimeout(s),g instanceof v?g:g instanceof Error?g.name==="AbortError"?u("TIMEOUT"):u("NETWORK_ERROR",g.message):u("UNKNOWN")}}async function ue(n,t,e){await pe(e);let a=e?.apiBaseUrl||X,r=n.startsWith("http")?n:`${a}${n}`,o=new AbortController,i=setTimeout(()=>o.abort(),Z);try{let s=m.getJSON(f.TOKEN_DATA),g={"Content-Type":"application/json",...t.headers};s?.accessToken&&(g.token=s.accessToken);let h=await fetch(r,{...t,signal:o.signal,headers:g});if(clearTimeout(i),!h.ok)throw u(h.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${h.status}: ${h.statusText}`);let p=await h.json();if(p.code!==1e4)throw u("API_ERROR",p.msg||"API request failed");return p.data}catch(s){throw clearTimeout(i),s instanceof v?s:s instanceof Error&&s.name==="AbortError"?u("TIMEOUT"):u("NETWORK_ERROR",s?.message||"Request failed")}}async function pe(n){if(S)return S;let t=(async()=>{let e=m.getJSON(f.TOKEN_DATA),a=Math.floor(Date.now()/1e3);if(!e?.refreshToken||e.refreshExpiresAt<=a)throw de(),u("TOKEN_EXPIRED","Refresh token has expired");let r=n?.apiBaseUrl||X,o=new AbortController,i=setTimeout(()=>o.abort(),Z);try{let s=await fetch(`${r}/platform/refreshToken`,{method:"POST",signal:o.signal,headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e.refreshToken})});if(clearTimeout(i),!s.ok)throw s.status>=500?u("SERVER_ERROR",`HTTP ${s.status}: ${s.statusText}`):u("TOKEN_EXPIRED",`HTTP ${s.status}: ${s.statusText}`);let g=await s.json();if(g.code!==1e4||!g.data)throw u("TOKEN_EXPIRED",g.msg||"Failed to refresh token");let h=g.data;if(m.setJSON(f.TOKEN_DATA,h),Y)try{Y(h)}catch{}return h}catch(s){throw clearTimeout(i),s instanceof v?((s.code==="TOKEN_EXPIRED"||s.code==="NOT_LOGGED_IN")&&de(),s):s instanceof Error&&s.name==="AbortError"?u("TIMEOUT"):u("NETWORK_ERROR",s?.message||"Refresh token failed")}})();S=t;try{return await t}finally{S===t&&(S=null)}}var J=class{constructor(){this.config=null}configure(t){this.config=t}async refreshToken(){return await pe(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 le(t)}async getCategoryNames(){return ce()}async loginOnly(t){let e=We(t);return await ge("/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 ge("/platform/user",{method:"GET"},this.config??void 0,!0)}async getUser(){return m.getJSON(f.USER)}async validateToken(t){return!!t}},V=null;function _(){return V||(V=new J),V}var Ye="https://api.playsout.com",fe="zh",T=class n{constructor(){this.config=null;this._isInitialized=!1;this._user=null;this._token=null;this._locale=fe;this._widget=null}clearAuthState(){let t=!!(this._token||m.get(f.TOKEN_DATA)||m.get(f.USER));return this._user=null,this._token=null,m.remove(f.TOKEN_DATA),m.remove(f.USER),t}handleAuthExpired(){this.clearAuthState()&&y.emit("authExpired"),this.config?.debug&&console.warn("[PlaysoutSDK] Auth expired, logged out")}static getInstance(){return n.instance||(n.instance=new n),n.instance}async init(t={}){if(this._isInitialized)throw u("ALREADY_INITIALIZED");this.config={apiBaseUrl:t.apiBaseUrl||Ye,debug:t.debug||!1,storage:t.storage||"localStorage",locale:t.locale||fe,appId:t.appId||""},m.configure(this.config.storage),me(r=>{this._token=r.accessToken}),he(()=>{this.handleAuthExpired()});let e=m.getJSON(f.TOKEN_DATA);this._user=m.getJSON(f.USER),this._locale=m.get(f.LOCALE)||this.config.locale;let a=Math.floor(Date.now()/1e3);if(e)if(!e.refreshToken||e.refreshExpiresAt<=a)this.handleAuthExpired();else if(e.accessToken&&e.expiresAt>a)this._token=e.accessToken;else try{let r=_();r.configure(this.config),await r.refreshToken()}catch(r){if(!(r instanceof v&&(r.code==="TOKEN_EXPIRED"||r.code==="NOT_LOGGED_IN")))throw r}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")}destroy(){this.config=null,this._isInitialized=!1,this._user=null,this._token=null,m.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=_();e.configure(this.config);let a=await e.loginOnly(t);m.setJSON(f.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(i){if(i instanceof v&&(i.code==="TOKEN_EXPIRED"||i.code==="NOT_LOGGED_IN"||i.code==="INVALID_TOKEN"))throw i;this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo failed, login still success:",i)}let o=m.getJSON(f.TOKEN_DATA);return this._token=o?.accessToken||a.accessToken,r&&(this._user={userId:String(r.id),username:r.username},m.setJSON(f.USER,this._user)),this.config?.debug&&console.log("[PlaysoutSDK] Login success, user:",r),y.emit("login",{user:this._user,token:this._token}),{tokenData:a,user:r}}async getUserInfo(){if(this.ensureInitialized(),!this._token)throw u("NOT_LOGGED_IN","Please login first");let t=_();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},m.setJSON(f.USER,this._user)),e}logout(){this.clearAuthState(),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 u("INVALID_PARAMS",`Unsupported locale: ${t}`);this._locale=t,m.set(f.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(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 u("FEATURE_NOT_SUPPORTED","mount requires DOM environment");let a=document.querySelector(t);if(!a)throw u("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 i=o;e.onGameClick(i.detail)}),e?.onLoginRequired&&r.addEventListener("login-required",e.onLoginRequired),e?.onLocaleChange&&r.addEventListener("locale-change",o=>{let i=o;e.onLocaleChange(i.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(),y.on(t,e)}off(t,e){this.ensureInitialized(),y.off(t,e)}ensureInitialized(){if(!this._isInitialized)throw u("NOT_INITIALIZED")}},c=T.getInstance();typeof window<"u"&&(window.__playsout_sdk_instance=c);var D=Object.freeze({init:c.init.bind(c),mount:c.mount.bind(c),unmount:c.unmount.bind(c),destroy:c.destroy.bind(c),Login:c.Login.bind(c),logout:c.logout.bind(c),getToken:c.getToken.bind(c),getUserInfo:c.getUserInfo.bind(c),getUser:c.getUser.bind(c),setLocale:c.setLocale.bind(c),getLocale:c.getLocale.bind(c),getGames:c.getGames.bind(c),getCategories:c.getCategories.bind(c),on:c.on.bind(c),off:c.off.bind(c),get isInitialized(){return c.isInitialized},get isLoggedIn(){return c.isLoggedIn},instance:c,PlaysoutSDKClass:T});var Qe="games.playsout.com";var ee="__playsout_img_cache_v1",U=`${ee}_blob_`,B=!1,G=4*1024*1024-1024*1024;function d(...n){}var x=new Map,O=new Map,Je=50,P=new Map,N=new Map,b=0;function te(){try{let n=localStorage.getItem(ee);if(!n)return d("loadCacheIndex: \u65E0\u7F13\u5B58\u7D22\u5F15"),b=0,new Map;let t=JSON.parse(n);d("loadCacheIndex: \u52A0\u8F7D\u4E86",t.length,"\u6761\u8BB0\u5F55"),b=0;for(let e of t){let a=`${U}${btoa(e.url).replace(/[\/+=]/g,"_")}`;localStorage.getItem(a)&&(b+=e.size)}return d("loadCacheIndex: \u5F53\u524D blob \u603B\u91CF",b,"bytes"),new Map(t.map(e=>[e.url,e]))}catch{return d("loadCacheIndex: \u89E3\u6790\u5931\u8D25"),b=0,new Map}}function z(n){try{let t=Array.from(n.values());t.length>200&&(t.sort((e,a)=>a.timestamp-e.timestamp),t.length=200),localStorage.setItem(ee,JSON.stringify(t)),d("saveCacheIndex: \u4FDD\u5B58\u4E86",t.length,"\u6761\u8BB0\u5F55")}catch(t){d("saveCacheIndex: \u4FDD\u5B58\u5931\u8D25",t)}}function Xe(n,t){if(!(b+t<=G))try{let e=te(),a=Array.from(e.values()).map(r=>({record:r,score:be(r.url)??1/0})).filter(r=>r.score>n).sort((r,o)=>o.score-r.score);for(let{record:r}of a){if(b+t<=G)break;let o=`${U}${btoa(r.url).replace(/[\/+=]/g,"_")}`;localStorage.removeItem(o),e.delete(r.url),b-=r.size,d("evictLowerPriorityEntries: \u91CA\u653E\u4F4E\u4F18\u5148\u7EA7\u7F13\u5B58",r.url,"\u8282\u7701",r.size,"bytes")}z(e)}catch(e){d("evictLowerPriorityEntries: \u5931\u8D25",e)}}function ye(n,t){if(x.size>=Je){let e=null,a=1/0;for(let[r,o]of x)o.lastAccess<a&&(a=o.lastAccess,e=r);if(e){let r=x.get(e);URL.revokeObjectURL(URL.createObjectURL(r.blob)),x.delete(e),d("addToMemoryCache: LRU\u6DD8\u6C70",e)}}x.set(n,{blob:t,lastAccess:Date.now()}),d("addToMemoryCache: \u6DFB\u52A0\u5230\u5185\u5B58\u7F13\u5B58",n,"\u5927\u5C0F:",t.size,"bytes")}async function Ze(n){if(!B)return;if(O.has(n)){d("cacheImage:",n,"\u8BE5\u8BF7\u6C42\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u7B49\u5F85\u5B8C\u6210"),await O.get(n);return}d("cacheImage: \u5F00\u59CB\u4E0B\u8F7D",n);let t=(async()=>{try{let e=await fetch(n);if(!e.ok){d("cacheImage:",n,"\u54CD\u5E94\u5931\u8D25",e.status);return}let a=await e.blob(),r=e.headers.get("ETag")||"";d("cacheImage:",n,"\u4E0B\u8F7D\u6210\u529F\uFF0C\u5927\u5C0F:",a.size,"ETag:",r),ye(n,a);let o=be(n);if(o!==void 0)if(Xe(o,a.size),b+a.size<=G)try{let i=te();i.set(n,{url:n,timestamp:Date.now(),etag:r,size:a.size}),z(i);let s=JSON.stringify({type:a.type,data:Array.from(new Uint8Array(await a.arrayBuffer()))}),g=`${U}${btoa(n).replace(/[\/+=]/g,"_")}`;localStorage.setItem(g,s),b+=a.size,d("cacheImage:",n,"\u5DF2\u4FDD\u5B58\u5230localStorage\uFF08\u5360\u7528",a.size,"bytes\uFF0C\u9884\u7B97\u5269\u4F59",G-b,"\uFF09")}catch(i){i.name==="QuotaExceededError"?d("cacheImage: localStorage \u914D\u989D\u5DF2\u6EE1\uFF0C\u505C\u6B62\u5199\u5165"):d("cacheImage:",n,"localStorage\u4FDD\u5B58\u5931\u8D25",i)}else d("cacheImage:",n,"\u817E\u51FA\u7A7A\u95F4\u540E\u4ECD\u8D85\u8FC7\u9884\u7B97\uFF0C\u8DF3\u8FC7");else d("cacheImage:",n,"\u975E\u4F18\u5148\u7EA7URL\uFF0C\u4E0D\u5199\u5165localStorage")}catch(e){d("cacheImage:",n,"\u4E0B\u8F7D\u5931\u8D25",e)}finally{O.delete(n)}})();O.set(n,t)}function ae(n){try{if(new URL(n).hostname===Qe)return d("isCacheableImage:",n,"\u662FCDN\u56FE\u7247"),!0}catch{}return n.startsWith("/games/")||n.startsWith("./games/")||n.startsWith("/home-")||n.startsWith("./home-")||n.startsWith("/logo")||n.startsWith("./logo")?(d("isCacheableImage:",n,"\u662F\u672C\u5730\u56FE\u7247"),!0):(d("isCacheableImage:",n,"\u4E0D\u662F\u53EF\u7F13\u5B58\u7684\u56FE\u7247"),!1)}function be(n){return N.has(n)?N.get(n):P.get(n)}function ve(n){if(!B)return;let t=-1e3;for(let e of n)ae(e)&&N.set(e,t++);d("setCriticalAssets: \u5171",N.size,"\u4E2A\u5173\u952E\u8D44\u6E90")}function we(n,t=!1){if(!B)return;t||P.clear();let e=0;if(t){for(let r of P.values())r>e&&(e=r);e+=1}let a=e;for(let r of n)ae(r)&&P.set(r,a++);d("setPriorityCache: \u5F53\u524D\u5171",P.size,"\u4E2A\u4F18\u5148\u7F13\u5B58URL")}function ke(n){if(!B)return n;if(d("resolveWithCache:",n),!ae(n))return d("resolveWithCache:",n,"\u4E0D\u662FCDN\u56FE\u7247\uFF0C\u539F\u6837\u8FD4\u56DE"),n;if(x.has(n)){let e=x.get(n);e.lastAccess=Date.now();try{let a=URL.createObjectURL(e.blob);return d("resolveWithCache:",n,"\u547D\u4E2D\u5185\u5B58\u7F13\u5B58\uFF0C\u8FD4\u56DEblob URL"),a}catch{d("resolveWithCache:",n,"\u521B\u5EFAblob URL\u5931\u8D25")}}let t=te();if(t.has(n)){let e=`${U}${btoa(n).replace(/[\/+=]/g,"_")}`,a=localStorage.getItem(e);if(a)try{let{type:r,data:o}=JSON.parse(a),i=new Blob([new Uint8Array(o)],{type:r});ye(n,i);let s=URL.createObjectURL(i);return d("resolveWithCache:",n,"\u547D\u4E2DlocalStorage\u7F13\u5B58\uFF0C\u540C\u6B65\u8FD4\u56DEblob URL"),s}catch(r){d("resolveWithCache:",n,"localStorage blob\u89E3\u6790\u5931\u8D25\uFF0C\u6E05\u9664\u7F13\u5B58",r),t.delete(n),z(t),localStorage.removeItem(e)}else d("resolveWithCache:",n,"localStorage blob\u4E0D\u5B58\u5728\uFF0C\u6E05\u9664\u7D22\u5F15"),t.delete(n),z(t)}return d("resolveWithCache:",n,"\u5B8C\u5168\u6CA1\u6709\u7F13\u5B58\uFF0C\u540E\u53F0\u4E0B\u8F7D"),Ze(n),n}var re="privy-bridge";var j="DIAMOND",et="2025.01";var tt=()=>`host-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,I=n=>typeof n!="string"||n.length>128?"":n,at=n=>{let t=Number(n);return!Number.isSafeInteger(t)||t<=0?0:t},H=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===re&&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:re,version:"1.0",type:"response",id:t.id,method:t.method,payload:e})}sendError(t,e){this.postToGame({channel:re,version:"1.0",type:"response",id:t.id,method:t.method,error:e})}handleHandshake(t){this.sendResponse(t,{hostVersion:et,capabilities:["auth.getUser","pay.createOrder","pay.request","pay.query"],capabilitiesDetail:{auth:{methods:["account"],scopes:["basic"]},pay:{methods:["balance"],currency:j,flow:["createOrder","request"]}},config:{currency:j}})}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=I(e.orderId),r=I(e.productId),o=at(e.amount);if(!a||!o){this.sendError(t,{code:"INVALID_REQUEST",message:"Invalid order payload"});return}let i=tt(),s=Math.floor((Date.now()+6e5)/1e3),g={orderId:a,hostOrderId:i,amount:o,currency:j,productId:r,status:"created",expiresAt:s};this.orders.set(i,g),this.sendResponse(t,{orderId:a,hostOrderId:i,amount:o,currency:j,productId:r,expiresAt:s})}async handlePaymentRequest(t){let e=t.payload||{},a=I(e.orderId),r=I(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 i=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,i.status==="success"){this.updateOrderStatus(r,"success"),this.sendResponse(t,{success:!0,orderId:a,hostOrderId:r,balance:i.balance});return}this.updateOrderStatus(r,i.status==="insufficient"?"created":"cancelled"),this.sendError(t,{code:i.status==="insufficient"?"INSUFFICIENT_BALANCE":"USER_CANCELLED",message:i.status==="insufficient"?"Insufficient balance":"User cancelled payment"})}}handlePaymentQuery(t){let e=t.payload||{},a=I(e.hostOrderId),r=I(e.orderId),o;if(a?o=this.orders.get(a):r&&(o=Array.from(this.orders.values()).find(i=>i.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 xe={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 Ie={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 Se={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 Te={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 Pe={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 Ae={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 Le={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 $=n=>{if(typeof window>"u")return n;let t=l(n);return ke(t)},gt="https://games.playsout.com/resources/icon/fonts",K=n=>{if(typeof window>"u")return n;let t=n.replace(/^\.\//,"");return`${gt}/${t}`},A={en:xe,zh:Ie,ja:Ee,ko:Se,th:Te,vi:Pe,id:Ae,ms:Le};function ne(n,t){let e=t.split("."),a=n;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 Ce(n,t={}){return n.replace(/\{(\w+)\}/g,(e,a)=>String(t[a]??`{${a}}`))}var Re=`
|
|
1
|
+
"use strict";var __PlaysoutBundle=(()=>{var q=Object.defineProperty;var Ne=Object.getOwnPropertyDescriptor;var ze=Object.getOwnPropertyNames;var Ue=Object.prototype.hasOwnProperty;var Be=(r,t)=>{for(var e in t)q(r,e,{get:t[e],enumerable:!0})},je=(r,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ze(t))!Ue.call(r,o)&&o!==e&&q(r,o,{get:()=>t[o],enumerable:!(a=Ne(t,o))||a.enumerable});return r};var He=r=>je(q({},"__esModule",{value:!0}),r);var Dt={};Be(Dt,{Login:()=>wt,PlaysoutSDKClass:()=>Ot,destroy:()=>vt,getCategories:()=>At,getGames:()=>Pt,getLocale:()=>Tt,getToken:()=>xt,getUser:()=>St,getUserInfo:()=>It,init:()=>ft,instance:()=>_t,isInitialized:()=>Rt,isLoggedIn:()=>Mt,logout:()=>kt,mount:()=>yt,off:()=>Ct,on:()=>Lt,setLocale:()=>Et,unmount:()=>bt});var w=class extends Error{constructor(e,a,o){super(a);this.code=e;this.details=o;this.name="SDKError"}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}},$e={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(r,t){return new w(r,$e[r],t)}var M="playsout_",_=class{constructor(t){this.storage=t}get(t){try{return this.storage.getItem(M+t)}catch{return null}}set(t,e){try{this.storage.setItem(M+t,e)}catch(a){console.warn("[PlaysoutSDK] Storage set failed:",a)}}remove(t){try{this.storage.removeItem(M+t)}catch{}}clear(){try{let t=[];for(let e=0;e<this.storage.length;e++){let a=this.storage.key(e);a&&a.startsWith(M)&&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 le(r="localStorage"){return typeof window>"u"||r==="memory"?new W:r==="sessionStorage"?new _(sessionStorage):new _(localStorage)}var x=le(),u={get:r=>x.get(r),set:(r,t)=>{x.set(r,t)},remove:r=>{x.remove(r)},clear:()=>{x.clear()},getJSON:r=>{let t=x.get(r);if(!t)return null;try{return JSON.parse(t)}catch{return null}},setJSON:(r,t)=>{x.set(r,JSON.stringify(t))},configure(r){x=le(r)}},h={TOKEN_DATA:"token_data",USER:"user",LOGIN_PARAMS:"login_params",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=o=>{e(o),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(o){console.error(`[PlaysoutSDK] Event handler error for "${t}":`,o)}})}listenerCount(t){return this.events.get(t)?.size??0}clear(){this.events.clear()}},T=new V,y={on:(r,t)=>T.on(r,t),once:(r,t)=>T.once(r,t),off:(r,t)=>{T.off(r,t)},clear:()=>{T.clear()},emit:(r,t)=>{T.emit(r,t)}};var Ke="https://games.playsout.com/resources/icon/image";function l(r){if(!r||/^(data:|https?:|blob:)/i.test(r))return r;let t=r.replace(/^\.\//,"");return`${Ke}/${t}`}var Fe=r=>{if(!r)return r;try{let t=new URL(r);if(t.hostname==="games.playsout.com"){let e=t.pathname,a=e.endsWith("/"),o=/\.[a-z0-9]+$/i.test(e);!a&&!o&&(t.pathname=`${e}/`)}return t.toString()}catch{return r}},qe=r=>r.map(t=>{if(!t.externalUrl)return t;let e=Fe(t.externalUrl);return e===t.externalUrl?t:{...t,externalUrl:e}}),We=[{id:"BlockCrushFun",title:"Block Crush Fun",category:"Puzzle",image:l("./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:l("./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:l("./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:l("./games/DogeMart.jpg"),isNew:!0,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Doge/DogeMart/"},{id:"KittyEscape",title:"Kitty Escape",category:"Puzzle",image:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./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:l("./games/Falling2048.jpg"),isNew:!0,isHot:!1,enable:!0,orientation:"portrait",externalUrl:"https://games.playsout.com/Falling2048/"}],ce=qe(We),v=()=>ce.filter(r=>r.enable),Ht={Adventure:v().filter(r=>r.category==="Adventure"),Moba:v().filter(r=>r.category==="Moba")};var de=r=>ce.find(t=>t.id===r);var ge=()=>Array.from(new Set(v().map(r=>r.category)));var ee="https://api.playsout.com",te=3e4;function Ye(r){let t=String(r?.platform||"").toLowerCase();if(t==="tiktok"){let e=r.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=r;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");if(typeof e.username!="string"||!e.username.trim())throw g("MISSING_PARAMS","username is required for Grab/Eros login");return{platform:t,platformUserId:e.platformUserId,platformToken:e.platformToken,username:e.username,inviteCode:typeof e.inviteCode=="string"?e.inviteCode:void 0}}throw g("INVALID_PARAMS","Unsupported platform. Expected grab, eros, or tiktok")}var P=null,J=null,Q=null,X=null;function pe(r){J=r}function fe(r){Q=r}function ye(r){X=r}function ue(){if(X)try{X()}catch{}}async function Je(r){if(!Q)throw ue(),r instanceof w?r:g("TOKEN_EXPIRED",r);try{return await Q()}catch(t){throw ue(),t instanceof w?t:g("TOKEN_EXPIRED",t)}}async function me(r,t={},e,a=!1,o=a){let n=e?.apiBaseUrl||ee,i=r.startsWith("http")?r:`${n}${r}`,s=new AbortController,p=setTimeout(()=>s.abort(),te);try{let m=u.getJSON(h.TOKEN_DATA),f={"Content-Type":"application/json",...t.headers};a&&m?.accessToken&&!f.token&&(f.token=m.accessToken);let k=await fetch(i,{...t,signal:s.signal,headers:f});if(clearTimeout(p),!k.ok){if(k.status===401&&a&&o)return await he(r,t,e);throw g(k.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${k.status}: ${k.statusText}`)}let E=await k.json();if(E.code!==1e4){if(a&&o)return await he(r,t,e);throw g("API_ERROR",E.msg||"API request failed")}return E.data}catch(m){throw clearTimeout(p),m instanceof w?m:m instanceof Error?m.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",m.message):g("UNKNOWN")}}async function he(r,t,e){await be(e);let a=e?.apiBaseUrl||ee,o=r.startsWith("http")?r:`${a}${r}`,n=new AbortController,i=setTimeout(()=>n.abort(),te);try{let s=u.getJSON(h.TOKEN_DATA),p={"Content-Type":"application/json",...t.headers};s?.accessToken&&(p.token=s.accessToken);let m=await fetch(o,{...t,signal:n.signal,headers:p});if(clearTimeout(i),!m.ok)throw g(m.status>=500?"SERVER_ERROR":"API_ERROR",`HTTP ${m.status}: ${m.statusText}`);let f=await m.json();if(f.code!==1e4)throw g("API_ERROR",f.msg||"API request failed");return f.data}catch(s){throw clearTimeout(i),s instanceof w?s:s instanceof Error&&s.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",s?.message||"Request failed")}}async function be(r){if(P)return P;let t=(async()=>{try{let e=u.getJSON(h.TOKEN_DATA),a=Math.floor(Date.now()/1e3);if(!e?.refreshToken||e.refreshExpiresAt<=a)throw g("TOKEN_EXPIRED","Refresh token has expired");let o=r?.apiBaseUrl||ee,n=new AbortController,i=setTimeout(()=>n.abort(),te);try{let s=await fetch(`${o}/platform/refreshToken`,{method:"POST",signal:n.signal,headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:e.refreshToken})});if(clearTimeout(i),!s.ok)throw s.status>=500?g("SERVER_ERROR",`HTTP ${s.status}: ${s.statusText}`):g("TOKEN_EXPIRED",`HTTP ${s.status}: ${s.statusText}`);let p=await s.json();if(p.code!==1e4||!p.data)throw g("TOKEN_EXPIRED",p.msg||"Failed to refresh token");let m=p.data;if(u.setJSON(h.TOKEN_DATA,m),J)try{J(m)}catch{}return m}catch(s){throw clearTimeout(i),s instanceof w?s:s instanceof Error&&s.name==="AbortError"?g("TIMEOUT"):g("NETWORK_ERROR",s?.message||"Refresh token failed")}}catch(e){return await Je(e)}})();P=t;try{return await t}finally{P===t&&(P=null)}}var Z=class{constructor(){this.config=null}configure(t){this.config=t}async refreshToken(){return await be(this.config||void 0)}async getGames(t){let e=v();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(o=>o.title.toLowerCase().includes(a)||o.category.toLowerCase().includes(a)||o.description&&o.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=v(),e=new Map;return t.forEach(a=>{let o=e.get(a.category)||0;e.set(a.category,o+1)}),Array.from(e.entries()).map(([a,o],n)=>({id:`category_${n}`,name:a,count:o}))}async getGameById(t){return de(t)}async getCategoryNames(){return ge()}async loginOnly(t){let e=Ye(t);return await me("/platform/login",{method:"POST",body:JSON.stringify(e)},this.config??void 0)}async Login(t){let e=await this.loginOnly(t);u.setJSON(h.TOKEN_DATA,e);try{let a=await this.getUserInfo(!1);return{tokenData:e,user:a}}catch(a){throw u.remove(h.TOKEN_DATA),u.remove(h.USER),a}}async getUserInfo(t=!0){return await me("/platform/user",{method:"GET"},this.config??void 0,!0,t)}async getUser(){return u.getJSON(h.USER)}async validateToken(t){return!!t}},Y=null;function O(){return Y||(Y=new Z),Y}var Xe="https://api.playsout.com",ve="zh",A=class r{constructor(){this.config=null;this._isInitialized=!1;this._user=null;this._token=null;this._locale=ve;this._widget=null}clearAuthState(){let t=!!(this._token||u.get(h.TOKEN_DATA)||u.get(h.USER));return this._user=null,this._token=null,u.remove(h.TOKEN_DATA),u.remove(h.USER),u.remove(h.LOGIN_PARAMS),t}updateUser(t){this._user={userId:String(t.id),username:t.username},u.setJSON(h.USER,this._user)}saveLoginParams(t){if(t.platform==="grab"||t.platform==="eros"){u.setJSON(h.LOGIN_PARAMS,{...t});return}u.remove(h.LOGIN_PARAMS)}async performLogin(t,e){let a=O();a.configure(this.config);let o=await a.loginOnly(t);u.setJSON(h.TOKEN_DATA,o);let n=await a.getUserInfo(!1);return this._token=o.accessToken,this.updateUser(n),e&&this.saveLoginParams(t),y.emit("login",{user:this._user,token:this._token}),{tokenData:o,user:n}}async recoverAuthentication(){let t=u.getJSON(h.LOGIN_PARAMS);if(!t||t.platform!=="grab"&&t.platform!=="eros")throw g("TOKEN_EXPIRED","No reusable login parameters available");return(await this.performLogin(t,!1)).tokenData}handleAuthExpired(){this.clearAuthState()&&y.emit("authExpired"),this.config?.debug&&console.warn("[PlaysoutSDK] Auth expired, logged out")}static getInstance(){return r.instance||(r.instance=new r),r.instance}async init(t={}){if(this._isInitialized)throw g("ALREADY_INITIALIZED");this.config={apiBaseUrl:t.apiBaseUrl||Xe,debug:t.debug||!1,storage:t.storage||"localStorage",locale:t.locale||ve,appId:t.appId||""},u.configure(this.config.storage),pe(o=>{this._token=o.accessToken}),fe(()=>this.recoverAuthentication()),ye(()=>{this.handleAuthExpired()});let e=u.getJSON(h.TOKEN_DATA);this._user=u.getJSON(h.USER),this._locale=u.get(h.LOCALE)||this.config.locale;let a=Math.floor(Date.now()/1e3);if(e){let o=O();if(o.configure(this.config),e.accessToken&&e.expiresAt>a?this._token=e.accessToken:await o.refreshToken(),this._token&&!this._user){let n=await o.getUserInfo();this.updateUser(n)}}else this._user&&(this._user=null,u.remove(h.USER));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")}destroy(){this.config=null,this._isInitialized=!1,this._user=null,this._token=null,u.clear(),y.clear()}get isInitialized(){return this._isInitialized}get isLoggedIn(){return!!(this._token&&this._user)}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);try{let e=await this.performLogin(t,!0);return this.config?.debug&&console.log("[PlaysoutSDK] Login success, user:",e.user),e}catch(e){throw this.clearAuthState(),e}}async getUserInfo(){if(this.ensureInitialized(),!this.isLoggedIn)throw g("NOT_LOGGED_IN","Please login first");let t=O();t.configure(this.config);let e=await t.getUserInfo();return this.config?.debug&&console.log("[PlaysoutSDK] getUserInfo result:",e),e&&this.updateUser(e),e}logout(){this.clearAuthState(),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,u.set(h.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=v();if(t?.category&&(e=e.filter(a=>a.category===t.category)),t?.search){let a=t.search.toLowerCase();e=e.filter(o=>o.title.toLowerCase().includes(a)||o.category.toLowerCase().includes(a)||o.description&&o.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=v(),e=new Map;return t.forEach(a=>{let o=e.get(a.category)||0;e.set(a.category,o+1)}),Array.from(e.entries()).map(([a,o],n)=>({id:`category_${n}`,name:a,count:o}))}async getGameById(t){return this.ensureInitialized(),v().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 o=document.createElement("playsout-widget");this.config?.appId&&o.setAttribute("app-id",this.config.appId),o.setAttribute("locale",e?.locale||this._locale),e?.detailMode&&o.setAttribute("detail-mode",e.detailMode),this._widget=o,e?.onGameClick&&o.addEventListener("game-click",n=>{let i=n;e.onGameClick(i.detail)}),e?.onLoginRequired&&o.addEventListener("login-required",e.onLoginRequired),e?.onLocaleChange&&o.addEventListener("locale-change",n=>{let i=n;e.onLocaleChange(i.detail)}),a.appendChild(o),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")}},c=A.getInstance();typeof window<"u"&&(window.__playsout_sdk_instance=c);var D=Object.freeze({init:c.init.bind(c),mount:c.mount.bind(c),unmount:c.unmount.bind(c),destroy:c.destroy.bind(c),Login:c.Login.bind(c),logout:c.logout.bind(c),getToken:c.getToken.bind(c),getUserInfo:c.getUserInfo.bind(c),getUser:c.getUser.bind(c),setLocale:c.setLocale.bind(c),getLocale:c.getLocale.bind(c),getGames:c.getGames.bind(c),getCategories:c.getCategories.bind(c),on:c.on.bind(c),off:c.off.bind(c),get isInitialized(){return c.isInitialized},get isLoggedIn(){return c.isLoggedIn},instance:c,PlaysoutSDKClass:A});var Ze="games.playsout.com";var ae="__playsout_img_cache_v1",B=`${ae}_blob_`,j=!1,N=4*1024*1024-1024*1024;function d(...r){}var I=new Map,G=new Map,et=50,L=new Map,z=new Map,b=0;function re(){try{let r=localStorage.getItem(ae);if(!r)return d("loadCacheIndex: \u65E0\u7F13\u5B58\u7D22\u5F15"),b=0,new Map;let t=JSON.parse(r);d("loadCacheIndex: \u52A0\u8F7D\u4E86",t.length,"\u6761\u8BB0\u5F55"),b=0;for(let e of t){let a=`${B}${btoa(e.url).replace(/[\/+=]/g,"_")}`;localStorage.getItem(a)&&(b+=e.size)}return d("loadCacheIndex: \u5F53\u524D blob \u603B\u91CF",b,"bytes"),new Map(t.map(e=>[e.url,e]))}catch{return d("loadCacheIndex: \u89E3\u6790\u5931\u8D25"),b=0,new Map}}function U(r){try{let t=Array.from(r.values());t.length>200&&(t.sort((e,a)=>a.timestamp-e.timestamp),t.length=200),localStorage.setItem(ae,JSON.stringify(t)),d("saveCacheIndex: \u4FDD\u5B58\u4E86",t.length,"\u6761\u8BB0\u5F55")}catch(t){d("saveCacheIndex: \u4FDD\u5B58\u5931\u8D25",t)}}function tt(r,t){if(!(b+t<=N))try{let e=re(),a=Array.from(e.values()).map(o=>({record:o,score:ke(o.url)??1/0})).filter(o=>o.score>r).sort((o,n)=>n.score-o.score);for(let{record:o}of a){if(b+t<=N)break;let n=`${B}${btoa(o.url).replace(/[\/+=]/g,"_")}`;localStorage.removeItem(n),e.delete(o.url),b-=o.size,d("evictLowerPriorityEntries: \u91CA\u653E\u4F4E\u4F18\u5148\u7EA7\u7F13\u5B58",o.url,"\u8282\u7701",o.size,"bytes")}U(e)}catch(e){d("evictLowerPriorityEntries: \u5931\u8D25",e)}}function we(r,t){if(I.size>=et){let e=null,a=1/0;for(let[o,n]of I)n.lastAccess<a&&(a=n.lastAccess,e=o);if(e){let o=I.get(e);URL.revokeObjectURL(URL.createObjectURL(o.blob)),I.delete(e),d("addToMemoryCache: LRU\u6DD8\u6C70",e)}}I.set(r,{blob:t,lastAccess:Date.now()}),d("addToMemoryCache: \u6DFB\u52A0\u5230\u5185\u5B58\u7F13\u5B58",r,"\u5927\u5C0F:",t.size,"bytes")}async function at(r){if(!j)return;if(G.has(r)){d("cacheImage:",r,"\u8BE5\u8BF7\u6C42\u5DF2\u5728\u8FDB\u884C\u4E2D\uFF0C\u7B49\u5F85\u5B8C\u6210"),await G.get(r);return}d("cacheImage: \u5F00\u59CB\u4E0B\u8F7D",r);let t=(async()=>{try{let e=await fetch(r);if(!e.ok){d("cacheImage:",r,"\u54CD\u5E94\u5931\u8D25",e.status);return}let a=await e.blob(),o=e.headers.get("ETag")||"";d("cacheImage:",r,"\u4E0B\u8F7D\u6210\u529F\uFF0C\u5927\u5C0F:",a.size,"ETag:",o),we(r,a);let n=ke(r);if(n!==void 0)if(tt(n,a.size),b+a.size<=N)try{let i=re();i.set(r,{url:r,timestamp:Date.now(),etag:o,size:a.size}),U(i);let s=JSON.stringify({type:a.type,data:Array.from(new Uint8Array(await a.arrayBuffer()))}),p=`${B}${btoa(r).replace(/[\/+=]/g,"_")}`;localStorage.setItem(p,s),b+=a.size,d("cacheImage:",r,"\u5DF2\u4FDD\u5B58\u5230localStorage\uFF08\u5360\u7528",a.size,"bytes\uFF0C\u9884\u7B97\u5269\u4F59",N-b,"\uFF09")}catch(i){i.name==="QuotaExceededError"?d("cacheImage: localStorage \u914D\u989D\u5DF2\u6EE1\uFF0C\u505C\u6B62\u5199\u5165"):d("cacheImage:",r,"localStorage\u4FDD\u5B58\u5931\u8D25",i)}else d("cacheImage:",r,"\u817E\u51FA\u7A7A\u95F4\u540E\u4ECD\u8D85\u8FC7\u9884\u7B97\uFF0C\u8DF3\u8FC7");else d("cacheImage:",r,"\u975E\u4F18\u5148\u7EA7URL\uFF0C\u4E0D\u5199\u5165localStorage")}catch(e){d("cacheImage:",r,"\u4E0B\u8F7D\u5931\u8D25",e)}finally{G.delete(r)}})();G.set(r,t)}function oe(r){try{if(new URL(r).hostname===Ze)return d("isCacheableImage:",r,"\u662FCDN\u56FE\u7247"),!0}catch{}return r.startsWith("/games/")||r.startsWith("./games/")||r.startsWith("/home-")||r.startsWith("./home-")||r.startsWith("/logo")||r.startsWith("./logo")?(d("isCacheableImage:",r,"\u662F\u672C\u5730\u56FE\u7247"),!0):(d("isCacheableImage:",r,"\u4E0D\u662F\u53EF\u7F13\u5B58\u7684\u56FE\u7247"),!1)}function ke(r){return z.has(r)?z.get(r):L.get(r)}function xe(r){if(!j)return;let t=-1e3;for(let e of r)oe(e)&&z.set(e,t++);d("setCriticalAssets: \u5171",z.size,"\u4E2A\u5173\u952E\u8D44\u6E90")}function Ie(r,t=!1){if(!j)return;t||L.clear();let e=0;if(t){for(let o of L.values())o>e&&(e=o);e+=1}let a=e;for(let o of r)oe(o)&&L.set(o,a++);d("setPriorityCache: \u5F53\u524D\u5171",L.size,"\u4E2A\u4F18\u5148\u7F13\u5B58URL")}function Se(r){if(!j)return r;if(d("resolveWithCache:",r),!oe(r))return d("resolveWithCache:",r,"\u4E0D\u662FCDN\u56FE\u7247\uFF0C\u539F\u6837\u8FD4\u56DE"),r;if(I.has(r)){let e=I.get(r);e.lastAccess=Date.now();try{let a=URL.createObjectURL(e.blob);return d("resolveWithCache:",r,"\u547D\u4E2D\u5185\u5B58\u7F13\u5B58\uFF0C\u8FD4\u56DEblob URL"),a}catch{d("resolveWithCache:",r,"\u521B\u5EFAblob URL\u5931\u8D25")}}let t=re();if(t.has(r)){let e=`${B}${btoa(r).replace(/[\/+=]/g,"_")}`,a=localStorage.getItem(e);if(a)try{let{type:o,data:n}=JSON.parse(a),i=new Blob([new Uint8Array(n)],{type:o});we(r,i);let s=URL.createObjectURL(i);return d("resolveWithCache:",r,"\u547D\u4E2DlocalStorage\u7F13\u5B58\uFF0C\u540C\u6B65\u8FD4\u56DEblob URL"),s}catch(o){d("resolveWithCache:",r,"localStorage blob\u89E3\u6790\u5931\u8D25\uFF0C\u6E05\u9664\u7F13\u5B58",o),t.delete(r),U(t),localStorage.removeItem(e)}else d("resolveWithCache:",r,"localStorage blob\u4E0D\u5B58\u5728\uFF0C\u6E05\u9664\u7D22\u5F15"),t.delete(r),U(t)}return d("resolveWithCache:",r,"\u5B8C\u5168\u6CA1\u6709\u7F13\u5B58\uFF0C\u540E\u53F0\u4E0B\u8F7D"),at(r),r}var ne="privy-bridge";var H="DIAMOND",rt="2025.01";var ot=()=>`host-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,S=r=>typeof r!="string"||r.length>128?"":r,nt=r=>{let t=Number(r);return!Number.isSafeInteger(t)||t<=0?0:t},$=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 o=t.data;if(this.isValidRequest(o))switch(o.method){case"bridge.handshake":this.handleHandshake(o);return;case"auth.getUser":this.handleGetUser(o);return;case"pay.createOrder":this.handleCreateOrder(o);return;case"pay.request":this.handlePaymentRequest(o);return;case"pay.query":this.handlePaymentQuery(o);return;default:this.sendError(o,{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:rt,capabilities:["auth.getUser","pay.createOrder","pay.request","pay.query"],capabilitiesDetail:{auth:{methods:["account"],scopes:["basic"]},pay:{methods:["balance"],currency:H,flow:["createOrder","request"]}},config:{currency:H}})}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=S(e.orderId),o=S(e.productId),n=nt(e.amount);if(!a||!n){this.sendError(t,{code:"INVALID_REQUEST",message:"Invalid order payload"});return}let i=ot(),s=Math.floor((Date.now()+6e5)/1e3),p={orderId:a,hostOrderId:i,amount:n,currency:H,productId:o,status:"created",expiresAt:s};this.orders.set(i,p),this.sendResponse(t,{orderId:a,hostOrderId:i,amount:n,currency:H,productId:o,expiresAt:s})}async handlePaymentRequest(t){let e=t.payload||{},a=S(e.orderId),o=S(e.hostOrderId);if(!a||!o){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 n=this.orders.get(o);if(!n||n.orderId!==a){this.sendError(t,{code:"INVALID_REQUEST",message:"Order not found"});return}if(n.status==="success"){this.sendError(t,{code:"ORDER_ALREADY_PAID",message:"Order already paid"});return}if(n.expiresAt<=Math.floor(Date.now()/1e3)){this.updateOrderStatus(o,"expired"),this.sendError(t,{code:"ORDER_EXPIRED",message:"Order expired"});return}this.updateOrderStatus(o,"pending"),this.pendingPayment={request:t,order:n};let i=await this.options.requestPayment({orderId:n.orderId,hostOrderId:n.hostOrderId,amount:n.amount,currency:n.currency,productId:n.productId});if(this.pendingPayment?.request.id===t.id){if(this.pendingPayment=null,i.status==="success"){this.updateOrderStatus(o,"success"),this.sendResponse(t,{success:!0,orderId:a,hostOrderId:o,balance:i.balance});return}this.updateOrderStatus(o,i.status==="insufficient"?"created":"cancelled"),this.sendError(t,{code:i.status==="insufficient"?"INSUFFICIENT_BALANCE":"USER_CANCELLED",message:i.status==="insufficient"?"Insufficient balance":"User cancelled payment"})}}handlePaymentQuery(t){let e=t.payload||{},a=S(e.hostOrderId),o=S(e.orderId),n;if(a?n=this.orders.get(a):o&&(n=Array.from(this.orders.values()).find(i=>i.orderId===o)),!n){this.sendError(t,{code:"INVALID_REQUEST",message:"Order not found"});return}this.sendResponse(t,{orderId:n.orderId,hostOrderId:n.hostOrderId,amount:n.amount,currency:n.currency,status:n.status,expiresAt:n.expiresAt})}updateOrderStatus(t,e){let a=this.orders.get(t);a&&this.orders.set(t,{...a,status:e})}};var Ee={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 Te={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 Pe={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 Ae={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 Le={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 Ce={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 Re={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 Me={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 K=r=>{if(typeof window>"u")return r;let t=l(r);return Se(t)},ht="https://games.playsout.com/resources/icon/fonts",F=r=>{if(typeof window>"u")return r;let t=r.replace(/^\.\//,"");return`${ht}/${t}`},C={en:Ee,zh:Te,ja:Pe,ko:Ae,th:Le,vi:Ce,id:Re,ms:Me};function ie(r,t){let e=t.split("."),a=r;for(let o of e)if(a&&typeof a=="object"&&o in a)a=a[o];else return t;return typeof a=="string"?a:t}function _e(r,t={}){return r.replace(/\{(\w+)\}/g,(e,a)=>String(t[a]??`{${a}}`))}var Oe=`
|
|
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('${
|
|
17
|
-
url('${
|
|
16
|
+
src: url('${F("./AdelleSans-Regular.woff2")}') format('woff2'),
|
|
17
|
+
url('${F("./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('${
|
|
25
|
-
url('${
|
|
24
|
+
src: url('${F("./AdelleSans-Semibold.woff2")}') format('woff2'),
|
|
25
|
+
url('${F("./AdelleSans-Semibold.woff")}') format('woff');
|
|
26
26
|
font-style: normal;
|
|
27
27
|
font-display: swap;
|
|
28
28
|
font-weight: 600;
|
|
@@ -1225,7 +1225,7 @@
|
|
|
1225
1225
|
border: none;
|
|
1226
1226
|
display: block;
|
|
1227
1227
|
}
|
|
1228
|
-
`,
|
|
1228
|
+
`,De=`
|
|
1229
1229
|
<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
|
|
1230
1230
|
<symbol id="icon-adventure" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
|
1231
1231
|
<polyline points="14.5 17.5 3 6 3 3 6 3 17.5 14.5"/>
|
|
@@ -1278,7 +1278,7 @@
|
|
|
1278
1278
|
<path d="M2 9h20"/>
|
|
1279
1279
|
</symbol>
|
|
1280
1280
|
</svg>
|
|
1281
|
-
`,
|
|
1281
|
+
`,pt=r=>{switch(r){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"}},Ge=[{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"}],R=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 $({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 o=C[this._locale]??C.en,n=ie(o,e);if(n!==e)return _e(n,a??{});let i=ie(C.en,e);return _e(i,a??{})}hasTranslation(e){let a=C[this._locale]??C.en;return ie(a,e)!==e}getBridgeUser(){let e=window.__playsout_sdk_instance,a=typeof e?.isInitialized=="function"?e.isInitialized():e?.isInitialized,o=typeof e?.isLoggedIn=="function"?e.isLoggedIn():e?.isLoggedIn,n=a&&o&&typeof e?.getUser=="function"?e.getUser():null;return n?{uid:String(n.userId||n.id||n.username||"user"),nickname:String(n.username||n.name||"User"),avatarUrl:n.avatar||n.avatarUrl||""}:null}setUserPoints(e,a,o){let n=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:n,delta:this.userPoints-n,reason:a,orderId:o}}))}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,o){if(a!==o){switch(e){case"app-id":this._appId=o||"";break;case"locale":this._locale=o||"zh";break;case"banner-url":this.bannerUrl=o||"";break;case"user-points":{let n=parseInt(o||"1000",10);this.userPoints=Number.isFinite(n)?n:1e3}break;case"avatar-url":this.avatarUrl=o||"";break;case"recent-games":try{this.recentGames=o?JSON.parse(o):[]}catch{this.recentGames=[]}break;case"detail-mode":this._detailMode=o||"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&&(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(o=>{if(!o.image)return null;let n=window.__playsout_resolveAsset,i=typeof n=="function"?n(o.image):o.image;return typeof i!="string"?null:i.startsWith("http")?i:null}).filter(Boolean);a.length>0&&Ie(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(o=>o.title.toLowerCase().includes(a)||o.category.toLowerCase().includes(a))}this.filteredGames=e,this.renderGames()}showLoading(){let e=this.shadow.querySelector(".widget-content");e&&(e.innerHTML=`
|
|
1282
1282
|
<div class="loading">
|
|
1283
1283
|
<div class="loading-spinner"></div>
|
|
1284
1284
|
</div>
|
|
@@ -1291,16 +1291,16 @@
|
|
|
1291
1291
|
</div>
|
|
1292
1292
|
<p>Failed to load games</p>
|
|
1293
1293
|
</div>
|
|
1294
|
-
`)}render(){let e=this.bannerUrl||l("./home-banner.webp");if(this.__criticalAssetsMarked!==!0){let a=l("./logowhite.png"),
|
|
1295
|
-
<style>${
|
|
1296
|
-
${
|
|
1294
|
+
`)}render(){let e=this.bannerUrl||l("./home-banner.webp");if(this.__criticalAssetsMarked!==!0){let a=l("./logowhite.png"),o=Ge.filter(n=>n.iconType==="image"&&n.iconSrc).map(n=>n.iconSrc);xe([a,e,...o]),this.__criticalAssetsMarked=!0}if(this.currentView==="detail"&&this.currentGame){this.renderGameDetail();return}this.shadow.innerHTML=`
|
|
1295
|
+
<style>${Oe}</style>
|
|
1296
|
+
${De}
|
|
1297
1297
|
<div class="playsout-scroll-container">
|
|
1298
1298
|
<div class="mobile-container">
|
|
1299
1299
|
<div class="playsout-widget">
|
|
1300
1300
|
<!-- Header -->
|
|
1301
1301
|
<header class="widget-header">
|
|
1302
1302
|
<div class="widget-logo">
|
|
1303
|
-
<img src="${
|
|
1303
|
+
<img src="${K("./logowhite.png")}" alt="Playsout" />
|
|
1304
1304
|
</div>
|
|
1305
1305
|
<div class="widget-user">
|
|
1306
1306
|
<!-- Gems Button -->
|
|
@@ -1324,7 +1324,7 @@
|
|
|
1324
1324
|
<div class="widget-banner">
|
|
1325
1325
|
<img
|
|
1326
1326
|
class="banner-image"
|
|
1327
|
-
src="${e
|
|
1327
|
+
src="${e?K(e):""}"
|
|
1328
1328
|
alt="Playsout Games"
|
|
1329
1329
|
/>
|
|
1330
1330
|
</div>
|
|
@@ -1354,8 +1354,8 @@
|
|
|
1354
1354
|
<!-- Categories -->
|
|
1355
1355
|
<div class="widget-categories">
|
|
1356
1356
|
<div class="categories-wrapper" id="categories">
|
|
1357
|
-
${
|
|
1358
|
-
<button class="category-btn${
|
|
1357
|
+
${Ge.map(a=>{let o=this.selectedCategory===a.id,n=a.color||pt(a.id),i=a.iconType==="image"&&a.iconSrc?`<img src="${K(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="${n}" style="color:${n}"><use href="#icon-${a.iconKey}"/></svg>`,s=this.hasTranslation(`categories.${a.id}`)?this.t(`categories.${a.id}`):a.name;return`
|
|
1358
|
+
<button class="category-btn${o?" active":""}" data-category="${a.id}">
|
|
1359
1359
|
<span class="category-icon">${i}</span>
|
|
1360
1360
|
<span class="category-label">${s}</span>
|
|
1361
1361
|
</button>`}).join("")}
|
|
@@ -1399,7 +1399,7 @@
|
|
|
1399
1399
|
<button class="store-cancel-btn" id="store-cancel">${this.t("store.cancel")}</button>
|
|
1400
1400
|
</div>
|
|
1401
1401
|
</div>
|
|
1402
|
-
`,this.shadow.appendChild(e),e.querySelectorAll(".store-buy-btn").forEach(a=>{a.addEventListener("click",()=>{let
|
|
1402
|
+
`,this.shadow.appendChild(e),e.querySelectorAll(".store-buy-btn").forEach(a=>{a.addEventListener("click",()=>{let o=parseInt(a.dataset.amount||"0",10);this.handleGemPurchase(o)})}),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 o=document.createElement("div");o.className="payment-modal-overlay",o.id="payment-modal-overlay";let n=this.userPoints<e.amount;o.innerHTML=`
|
|
1403
1403
|
<div class="payment-modal" role="dialog" aria-modal="true" aria-labelledby="payment-modal-title">
|
|
1404
1404
|
<div class="payment-modal-content">
|
|
1405
1405
|
<h2 class="payment-modal-title" id="payment-modal-title">${this.t("payment.title")}</h2>
|
|
@@ -1411,14 +1411,14 @@
|
|
|
1411
1411
|
</svg>
|
|
1412
1412
|
</div>
|
|
1413
1413
|
<div class="payment-balance">${this.t("payment.balance",{balance:this.userPoints})}</div>
|
|
1414
|
-
${
|
|
1414
|
+
${n?`<div class="payment-insufficient">${this.t("payment.insufficientMessage",{balance:this.userPoints,amount:e.amount})}</div>`:""}
|
|
1415
1415
|
<div class="payment-actions">
|
|
1416
1416
|
<button class="payment-action-btn payment-cancel-btn" id="payment-cancel-btn">${this.t("payment.cancel")}</button>
|
|
1417
1417
|
<button class="payment-action-btn payment-confirm-btn" id="payment-confirm-btn">${this.t("payment.confirm")}</button>
|
|
1418
1418
|
</div>
|
|
1419
1419
|
</div>
|
|
1420
1420
|
</div>
|
|
1421
|
-
`,this.shadow.appendChild(
|
|
1421
|
+
`,this.shadow.appendChild(o),o.querySelector("#payment-cancel-btn")?.addEventListener("click",()=>{this.resolvePendingPayment({status:"cancelled",balance:this.userPoints})}),o.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})}),o.addEventListener("click",i=>{i.target===o&&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,i=((typeof a?.isInitialized=="function"?a.isInitialized():a?.isInitialized)?a.getUser():null)?.username||this.t("profile.guest");e.innerHTML=`
|
|
1422
1422
|
<div class="profile-modal" id="profile-modal">
|
|
1423
1423
|
<div class="profile-modal-header">
|
|
1424
1424
|
<h2 class="profile-modal-title">${this.t("profile.title")}</h2>
|
|
@@ -1448,26 +1448,26 @@
|
|
|
1448
1448
|
</section>
|
|
1449
1449
|
</div>
|
|
1450
1450
|
</div>
|
|
1451
|
-
`,this.shadow.appendChild(e),e.querySelector("#profile-close-btn")?.addEventListener("click",()=>{this.hideProfileModal()}),e.addEventListener("click",
|
|
1451
|
+
`,this.shadow.appendChild(e),e.querySelector("#profile-close-btn")?.addEventListener("click",()=>{this.hideProfileModal()}),e.addEventListener("click",f=>{f.target===e&&this.hideProfileModal()});let s=()=>{let f=window.__playsout_sdk_instance,E=(f?.getUser?f.getUser():null)?.username||this.t("profile.guest"),se=this.shadow.querySelector(".profile-username-text");se&&(se.textContent=E)},p=()=>{let f=this.shadow.querySelector(".profile-username-text");f&&(f.textContent=this.t("profile.guest")),this.hideProfileModal()},m=window.__playsout_sdk_instance;m?.on&&(m.on("login",s),m.on("logout",s),m.on("authExpired",p)),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=`
|
|
1452
1452
|
<div class="language-modal">
|
|
1453
1453
|
<div class="language-modal-header">
|
|
1454
1454
|
<h3 class="language-modal-title">${this.t("profile.language")}</h3>
|
|
1455
1455
|
<button class="language-modal-close" id="language-close-btn">\u2715</button>
|
|
1456
1456
|
</div>
|
|
1457
1457
|
<div class="language-modal-list">
|
|
1458
|
-
${a.map(
|
|
1459
|
-
<button class="language-option${
|
|
1460
|
-
<span class="language-option-label">${
|
|
1461
|
-
${
|
|
1458
|
+
${a.map(o=>`
|
|
1459
|
+
<button class="language-option${o.code===this._locale?" active":""}" data-lang="${o.code}">
|
|
1460
|
+
<span class="language-option-label">${o.label}</span>
|
|
1461
|
+
${o.code===this._locale?'<span class="language-option-check">\u2713</span>':""}
|
|
1462
1462
|
</button>
|
|
1463
1463
|
`).join("")}
|
|
1464
1464
|
</div>
|
|
1465
1465
|
</div>
|
|
1466
|
-
`,this.shadow.appendChild(e),e.querySelector("#language-close-btn")?.addEventListener("click",()=>{this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.addEventListener("click",
|
|
1467
|
-
<div class="toast${
|
|
1466
|
+
`,this.shadow.appendChild(e),e.querySelector("#language-close-btn")?.addEventListener("click",()=>{this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.addEventListener("click",o=>{o.target===e&&this.shadow.querySelector("#language-modal-overlay")?.remove()}),e.querySelectorAll(".language-option").forEach(o=>{o.addEventListener("click",()=>{let n=o.dataset.lang;if(n&&n!==this._locale){this._locale=n,this.setAttribute("locale",this._locale),this.dispatchEvent(new CustomEvent("locale-change",{bubbles:!0,composed:!0,detail:this._locale}));let i=this.shadow.querySelector("#profile-current-lang");i&&(i.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="",o="success"){this.toastTimeout&&clearTimeout(this.toastTimeout),this.shadow.querySelector("#toast-container")?.remove();let n=document.createElement("div");n.className="toast-container",n.id="toast-container",n.innerHTML=`
|
|
1467
|
+
<div class="toast${o==="warning"?" toast-warning":""}">
|
|
1468
1468
|
<div class="toast-icon">
|
|
1469
1469
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
1470
|
-
${
|
|
1470
|
+
${o==="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"/>'}
|
|
1471
1471
|
</svg>
|
|
1472
1472
|
</div>
|
|
1473
1473
|
<div class="toast-content">
|
|
@@ -1475,7 +1475,7 @@
|
|
|
1475
1475
|
${a?`<div class="toast-message">${a}</div>`:""}
|
|
1476
1476
|
</div>
|
|
1477
1477
|
</div>
|
|
1478
|
-
`,this.shadow.appendChild(
|
|
1478
|
+
`,this.shadow.appendChild(n),this.toastTimeout=window.setTimeout(()=>{n.style.opacity="0",n.style.transition="opacity 0.2s",setTimeout(()=>n.remove(),200)},3e3)}renderGames(){let e=this.shadow.querySelector(".widget-content");if(e){if(this.filteredGames.length===0){e.innerHTML=`
|
|
1479
1479
|
<div class="widget-games">
|
|
1480
1480
|
<div class="no-results">
|
|
1481
1481
|
<p>${this.t("home.noGames")}</p>
|
|
@@ -1484,10 +1484,10 @@
|
|
|
1484
1484
|
`;return}e.innerHTML=`
|
|
1485
1485
|
<div class="widget-games">
|
|
1486
1486
|
<div class="games-grid">
|
|
1487
|
-
${this.filteredGames.map((a,
|
|
1487
|
+
${this.filteredGames.map((a,o)=>this.renderGameCard(a,o)).join("")}
|
|
1488
1488
|
</div>
|
|
1489
1489
|
</div>
|
|
1490
|
-
`,e.querySelectorAll(".game-card").forEach(a=>{a.addEventListener("click",()=>{let
|
|
1490
|
+
`,e.querySelectorAll(".game-card").forEach(a=>{a.addEventListener("click",()=>{let o=a.getAttribute("data-game-id"),n=this.games.find(i=>i.id===o);if(n){let i=window.__playsout_sdk_instance,s=typeof i?.isInitialized=="function"?i.isInitialized():i?.isInitialized,p=typeof i?.isLoggedIn=="function"?i.isLoggedIn():i?.isLoggedIn;if(!s||!p){this.showLoginPrompt();return}if(this.dispatchEvent(new CustomEvent("game-click",{detail:n,bubbles:!0,composed:!0})),this._detailMode==="iframe"&&n.externalUrl)this.currentGame=n,this.currentView="detail",this.render();else{let m=n.externalUrl||`/games/${n.id}`;window.location.href=m}}})})}}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=`
|
|
1491
1491
|
<div class="toast login-prompt-toast">
|
|
1492
1492
|
<div class="toast-icon">
|
|
1493
1493
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -1500,29 +1500,29 @@
|
|
|
1500
1500
|
<div class="toast-title">${a("auth.mustLogin")}</div>
|
|
1501
1501
|
</div>
|
|
1502
1502
|
</div>
|
|
1503
|
-
`,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
|
|
1503
|
+
`,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 o=[];e.isNew&&o.push('<span class="game-tag new">NEW</span>'),e.isHot&&o.push('<span class="game-tag hot">HOT</span>');let n=a<8?"eager":"lazy";return`
|
|
1504
1504
|
<div class="game-card" data-game-id="${e.id}">
|
|
1505
1505
|
<div class="game-image-wrapper">
|
|
1506
1506
|
<img
|
|
1507
1507
|
class="game-image"
|
|
1508
|
-
src="${
|
|
1508
|
+
src="${K(e.image)}"
|
|
1509
1509
|
alt="${e.title}"
|
|
1510
|
-
loading="${
|
|
1510
|
+
loading="${n}"
|
|
1511
1511
|
draggable="false"
|
|
1512
1512
|
/>
|
|
1513
1513
|
</div>
|
|
1514
1514
|
<div class="game-info">
|
|
1515
1515
|
<div class="title-row">
|
|
1516
1516
|
<h3 class="game-title">${e.title}</h3>
|
|
1517
|
-
${
|
|
1517
|
+
${o.length>0?o.join(""):""}
|
|
1518
1518
|
</div>
|
|
1519
1519
|
<div class="divider"></div>
|
|
1520
1520
|
<p class="game-category">${this.hasTranslation(`categories.${e.category}`)?this.t(`categories.${e.category}`):e.category}</p>
|
|
1521
1521
|
</div>
|
|
1522
1522
|
</div>
|
|
1523
1523
|
`}renderGameDetail(){if(!this.currentGame)return;let e=this.currentGame,a=e.externalUrl||`/games/${e.id}`;this.currentIframeSrc=a,this.shadow.innerHTML=`
|
|
1524
|
-
<style>${
|
|
1525
|
-
${
|
|
1524
|
+
<style>${Oe}</style>
|
|
1525
|
+
${De}
|
|
1526
1526
|
<div class="playsout-scroll-container">
|
|
1527
1527
|
<div class="mobile-container">
|
|
1528
1528
|
<div class="playsout-widget">
|
|
@@ -1550,4 +1550,4 @@
|
|
|
1550
1550
|
</div>
|
|
1551
1551
|
</div>
|
|
1552
1552
|
</div>
|
|
1553
|
-
`,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",
|
|
1553
|
+
`,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",o=>{let n=o.target;this.searchQuery=n.value,this.filterGames()}),this.shadow.getElementById("search-btn")?.addEventListener("click",()=>{e?.focus()});let a=this.shadow.getElementById("categories");a?.addEventListener("click",o=>{let i=o.target.closest(".category-btn");if(i){let s=i.getAttribute("data-category")||"";this.selectedCategory===s?(this.selectedCategory=null,a.querySelectorAll(".category-btn").forEach(p=>{p.classList.remove("active")})):(this.selectedCategory=s,a.querySelectorAll(".category-btn").forEach(p=>{p.classList.remove("active")}),i.classList.add("active")),this.filterGames()}})}};customElements.get("playsout-widget")||customElements.define("playsout-widget",R);typeof customElements<"u"&&(customElements.get("playsout-widget")||customElements.define("playsout-widget",R));var{init:ft,mount:yt,unmount:bt,destroy:vt,Login:wt,logout:kt,getToken:xt,getUserInfo:It,getUser:St,setLocale:Et,getLocale:Tt,getGames:Pt,getCategories:At,on:Lt,off:Ct,isInitialized:Rt,isLoggedIn:Mt,instance:_t,PlaysoutSDKClass:Ot}=D;typeof window<"u"&&(window.Playsout=D,window.__playsout_sdk_instance=D.instance);return He(Dt);})();
|