@tma.js/sdk 1.4.9 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ type CaptureSameReqFn = (payload: {
2
+ req_id: string;
3
+ }) => boolean;
4
+ /**
5
+ * Returns a function which can be used in `request` function `capture` property to capture
6
+ * the event with the same request identifier.
7
+ * @param reqId - request identifier.
8
+ */
9
+ export declare function captureSameReq(reqId: string): CaptureSameReqFn;
10
+ export {};
@@ -1,8 +1,5 @@
1
1
  import type { MiniAppsEventListener, MiniAppsEventName } from './events.js';
2
- /**
3
- * Removes event listener.
4
- */
5
- export type RemoveListenerFn = () => void;
2
+ import type { RemoveListenerFn } from './types.js';
6
3
  /**
7
4
  * Adds new listener to the specified event. Returns handler
8
5
  * which allows to stop listening to event.
@@ -1,9 +1,8 @@
1
1
  import type { MiniAppsEventListener, MiniAppsEventName } from './events.js';
2
- type StopListening = () => void;
2
+ import type { RemoveListenerFn } from './types.js';
3
3
  /**
4
4
  * Works the same as "on" method, but after catching the event, will remove event listener.
5
5
  * @param event - event name.
6
6
  * @param listener - event listener.
7
7
  */
8
- export declare function once<E extends MiniAppsEventName>(event: E, listener: MiniAppsEventListener<E>): StopListening;
9
- export {};
8
+ export declare function once<E extends MiniAppsEventName>(event: E, listener: MiniAppsEventListener<E>): RemoveListenerFn;
@@ -1,9 +1,8 @@
1
1
  import type { MiniAppsGlobalEventListener } from './events.js';
2
- type StopListening = () => void;
2
+ import type { RemoveListenerFn } from './types.js';
3
3
  /**
4
4
  * Subscribes to all events sent from the native Telegram application.
5
5
  * Returns function used to remove added event listener.
6
6
  * @param listener - event listener.
7
7
  */
8
- export declare function subscribe(listener: MiniAppsGlobalEventListener): StopListening;
9
- export {};
8
+ export declare function subscribe(listener: MiniAppsGlobalEventListener): RemoveListenerFn;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Removes event listener.
3
+ */
4
+ export type RemoveListenerFn = () => void;
@@ -2,7 +2,7 @@ import type { AnyInvokeCustomMethodParams } from './custom-methods.js';
2
2
  import type { AnyHapticFeedbackParams } from './haptic.js';
3
3
  import type { PopupParams } from './popup.js';
4
4
  import type { RGB } from '../../colors/types.js';
5
- import type { Not } from '../../types/logical.js';
5
+ import type { If, Not } from '../../types/logical.js';
6
6
  import type { RequestId } from '../../types/request-id.js';
7
7
  import type { UnionKeys } from '../../types/unions.js';
8
8
  import type { IsNever } from '../../types/utils.js';
@@ -14,7 +14,7 @@ export type HeaderColorKey = 'bg_color' | 'secondary_bg_color';
14
14
  * Chat type which could be used when calling `web_app_switch_inline_query` method.
15
15
  */
16
16
  export type SwitchInlineQueryChatType = 'users' | 'bots' | 'groups' | 'channels';
17
- interface CreateParams<Params = undefined, VersionedParam extends UnionKeys<Params> = never> {
17
+ interface CreateParams<Params = never, VersionedParam extends UnionKeys<Params> = never> {
18
18
  params: Params;
19
19
  versionedParams: VersionedParam;
20
20
  }
@@ -306,19 +306,17 @@ export type MiniAppsMethodParams<M extends MiniAppsMethodName> = MiniAppsMethods
306
306
  /**
307
307
  * True if specified method accepts parameters.
308
308
  */
309
- export type MiniAppsMethodAcceptParams<M extends MiniAppsMethodName> = Not<IsNever<Exclude<MiniAppsMethodParams<M>, undefined>>>;
309
+ export type MiniAppsMethodAcceptParams<M extends MiniAppsMethodName> = Not<IsNever<MiniAppsMethodParams<M>>>;
310
310
  /**
311
311
  * Any post-available event name which does not require arguments.
312
312
  */
313
313
  export type MiniAppsEmptyMethodName = {
314
- [M in MiniAppsMethodName]: undefined extends MiniAppsMethodParams<M> ? M : never;
314
+ [Method in MiniAppsMethodName]: If<MiniAppsMethodAcceptParams<Method>, never, Method>;
315
315
  }[MiniAppsMethodName];
316
316
  /**
317
317
  * Any post-available event name which require arguments.
318
318
  */
319
- export type MiniAppsNonEmptyMethodName = {
320
- [M in MiniAppsMethodName]: MiniAppsMethodAcceptParams<M> extends true ? M : never;
321
- }[MiniAppsMethodName];
319
+ export type MiniAppsNonEmptyMethodName = Exclude<MiniAppsMethodName, MiniAppsEmptyMethodName>;
322
320
  /**
323
321
  * Method names which have versioned params.
324
322
  */
@@ -1,58 +1,54 @@
1
- import type { MiniAppsEventHasParams, MiniAppsEventName, MiniAppsEventParams } from './events/events.js';
2
- import type { MiniAppsEmptyMethodName, MiniAppsMethodAcceptParams, MiniAppsMethodName, MiniAppsMethodParams, MiniAppsNonEmptyMethodName } from './methods/methods.js';
3
- import type { And, If } from '../types/logical.js';
1
+ import type { MiniAppsEventName, MiniAppsEventParams } from './events/events.js';
2
+ import type { MiniAppsEmptyMethodName, MiniAppsMethodName, MiniAppsMethodParams, MiniAppsNonEmptyMethodName } from './methods/methods.js';
3
+ import type { If } from '../types/logical.js';
4
4
  import type { ExecuteWithOptions } from '../types/methods.js';
5
5
  import type { IsNever } from '../types/utils.js';
6
6
  /**
7
- * Names of methods, which require passing "req_id" parameter.
7
+ * Simple `request` method options.
8
8
  */
9
- type MethodWithRequestId = {
10
- [M in MiniAppsMethodName]: If<And<MiniAppsMethodAcceptParams<M>, MiniAppsMethodParams<M> extends {
11
- req_id: string;
12
- } ? true : false>, M, never>;
13
- }[MiniAppsMethodName];
9
+ export type RequestSimpleOptions<Method extends MiniAppsMethodName> = Omit<RequestCompleteOptions<Method, any>, 'method' | 'event'>;
14
10
  /**
15
- * Names of events, which contain "req_id" parameter.
11
+ * Complete `request` method options.
16
12
  */
17
- type EventWithRequestId = {
18
- [E in MiniAppsEventName]: If<And<MiniAppsEventHasParams<E>, MiniAppsEventParams<E> extends {
19
- req_id: string;
20
- } ? true : false>, E, never>;
21
- }[MiniAppsEventName];
22
- export interface RequestOptions extends ExecuteWithOptions {
23
- }
24
- export interface RequestOptionsAdvanced<EventPayload> extends RequestOptions {
13
+ export type RequestCompleteOptions<Method extends MiniAppsMethodName, Event extends MiniAppsEventName> = {
14
+ /**
15
+ * Mini Apps method name.
16
+ */
17
+ method: Method;
18
+ /**
19
+ * One or many tracked Mini Apps events.
20
+ */
21
+ event: Event | Event[];
25
22
  /**
26
23
  * Should return true in case, this event should be captured. If not specified,
27
24
  * request is not skipping captured events.
28
25
  */
29
- capture?: If<IsNever<EventPayload>, () => boolean, (payload: EventPayload) => boolean>;
30
- }
26
+ capture?: If<IsNever<MiniAppsEventParams<Event>>, () => boolean, (payload: MiniAppsEventParams<Event>) => boolean>;
27
+ } & ExecuteWithOptions & If<IsNever<MiniAppsMethodParams<Method>>, {}, {
28
+ /**
29
+ * List of method parameters.
30
+ */
31
+ params: MiniAppsMethodParams<Method>;
32
+ }>;
31
33
  /**
32
- * Calls specified TWA method and captures one of the specified events. Returns promise
33
- * which will be resolved in case, event with specified in method request identifier
34
- * was captured.
35
- * @param method - method to execute.
36
- * @param params - method parameters.
37
- * @param event - event or events to listen.
38
- * @param options - additional execution options.
34
+ * Calls specified Mini Apps method and captures one of the specified events. Returns promise
35
+ * which will be resolved in case, specified event was captured.
36
+ * @param options - method options.
39
37
  */
40
- export declare function request<M extends MethodWithRequestId, E extends EventWithRequestId>(method: M, params: MiniAppsMethodParams<M>, event: E | E[], options?: RequestOptions): Promise<MiniAppsEventParams<E>>;
38
+ export declare function request<Method extends MiniAppsEmptyMethodName, Event extends MiniAppsEventName>(options: RequestCompleteOptions<Method, Event>): Promise<MiniAppsEventParams<Event>>;
41
39
  /**
42
- * Calls specified TWA method and captures one of the specified events. Returns promise
40
+ * Calls specified Mini Apps method and captures one of the specified events. Returns promise
43
41
  * which will be resolved in case, specified event was captured.
44
- * @param method - method to execute.
45
- * @param event - event or events to listen.
46
- * @param options - additional execution options.
42
+ * @param method - method name.
43
+ * @param eventOrEvents - tracked event or events.
44
+ * @param options - method options.
47
45
  */
48
- export declare function request<M extends MiniAppsEmptyMethodName, E extends MiniAppsEventName>(method: M, event: E | E[], options?: RequestOptionsAdvanced<MiniAppsEventParams<E>>): Promise<MiniAppsEventParams<E>>;
46
+ export declare function request<Method extends MiniAppsNonEmptyMethodName, Event extends MiniAppsEventName>(method: Method, eventOrEvents: Event | Event[], options: RequestSimpleOptions<Method>): Promise<MiniAppsEventParams<Event>>;
49
47
  /**
50
- * Calls specified TWA method and captures one of the specified events. Returns promise
48
+ * Calls specified Mini Apps method and captures one of the specified events. Returns promise
51
49
  * which will be resolved in case, specified event was captured.
52
- * @param method - method to execute
53
- * @param params - method parameters.
54
- * @param event - event or events to listen
55
- * @param options - additional execution options.
50
+ * @param method - method name.
51
+ * @param eventOrEvents - tracked event or events.
52
+ * @param options - method options.
56
53
  */
57
- export declare function request<M extends MiniAppsNonEmptyMethodName, E extends MiniAppsEventName>(method: M, params: MiniAppsMethodParams<M>, event: E | E[], options?: RequestOptionsAdvanced<MiniAppsEventParams<E>>): Promise<MiniAppsEventParams<E>>;
58
- export {};
54
+ export declare function request<Method extends MiniAppsEmptyMethodName, Event extends MiniAppsEventName>(method: Method, eventOrEvents: Event | Event[], options?: RequestSimpleOptions<Method>): Promise<MiniAppsEventParams<Event>>;
@@ -1,5 +1,5 @@
1
1
  import type { ThemeParamsEvents, ThemeParamsParsed } from './types.js';
2
- import type { RemoveListenerFn } from '../../bridge/events/on.js';
2
+ import type { RemoveListenerFn } from '../../bridge/events/types.js';
3
3
  import type { RGB } from '../../colors/types.js';
4
4
  import { EventEmitter } from '../../event-emitter/EventEmitter.js';
5
5
  type Emitter = EventEmitter<ThemeParamsEvents>;
@@ -1,7 +1,7 @@
1
1
  import type { ThemeParamsParsed } from './types.js';
2
- import type { RequestOptions } from '../../bridge/request.js';
2
+ import type { RequestSimpleOptions } from '../../bridge/request.js';
3
3
  /**
4
4
  * Requests current theme parameters from the Telegram application.
5
5
  * @param options - request options.
6
6
  */
7
- export declare function requestThemeParams(options?: RequestOptions): Promise<ThemeParamsParsed>;
7
+ export declare function requestThemeParams(options?: RequestSimpleOptions<'web_app_request_theme'>): Promise<ThemeParamsParsed>;
@@ -1,6 +1,6 @@
1
1
  import type { ViewportEvents, ViewportProps } from './types.js';
2
- import type { RemoveListenerFn } from '../../bridge/events/on.js';
3
- import type { RequestOptions } from '../../bridge/request.js';
2
+ import type { RemoveListenerFn } from '../../bridge/events/types.js';
3
+ import type { RequestSimpleOptions } from '../../bridge/request.js';
4
4
  import { EventEmitter } from '../../event-emitter/EventEmitter.js';
5
5
  type Emitter = EventEmitter<ViewportEvents>;
6
6
  /**
@@ -17,7 +17,7 @@ export declare class Viewport {
17
17
  * instance.
18
18
  * @param options - options to request fresh data.
19
19
  */
20
- sync(options?: RequestOptions): Promise<void>;
20
+ sync(options?: RequestSimpleOptions<'web_app_request_viewport'>): Promise<void>;
21
21
  /**
22
22
  * The current height of the visible area of the Mini App.
23
23
  *
@@ -1,4 +1,4 @@
1
- import type { RequestOptions } from '../../bridge/request.js';
1
+ import type { RequestSimpleOptions } from '../../bridge/request.js';
2
2
  export interface RequestViewportResult {
3
3
  height: number;
4
4
  isStateStable: boolean;
@@ -9,4 +9,4 @@ export interface RequestViewportResult {
9
9
  * Requests viewport actual information from the Telegram application.
10
10
  * @param options - request options.
11
11
  */
12
- export declare function requestViewport(options?: RequestOptions): Promise<RequestViewportResult>;
12
+ export declare function requestViewport(options?: RequestSimpleOptions<'web_app_request_viewport'>): Promise<RequestViewportResult>;
@@ -8,7 +8,7 @@ export { off } from './bridge/events/off.js';
8
8
  export { once } from './bridge/events/once.js';
9
9
  export { parseMessage } from './bridge/parseMessage.js';
10
10
  export { postEvent, type PostEvent } from './bridge/methods/postEvent.js';
11
- export { request, type RequestOptions, type RequestOptionsAdvanced } from './bridge/request.js';
11
+ export { request, type RequestSimpleOptions, type RequestCompleteOptions, } from './bridge/request.js';
12
12
  export { subscribe } from './bridge/events/subscribe.js';
13
13
  export { unsubscribe } from './bridge/events/unsubscribe.js';
14
14
  export { MethodUnsupportedError } from './bridge/errors/MethodUnsupportedError.js';
@@ -35,6 +35,8 @@ export type { RGB, RGBShort } from './colors/types.js';
35
35
  /**
36
36
  * Components.
37
37
  */
38
+ export { BackButton } from './components/back-button/BackButton.js';
39
+ export type { BackButtonEventListener, BackButtonEventName, BackButtonEvents, } from './components/back-button/types.js';
38
40
  export { ClosingBehavior } from './components/closing-behavior/ClosingBehavior.js';
39
41
  export type { ClosingBehaviorEventListener, ClosingBehaviorEventName, ClosingBehaviorEvents, } from './components/closing-behavior/types.js';
40
42
  export { CloudStorage } from './components/cloud-storage/CloudStorage.js';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Accepts specified function and instantly executes. It waits for timeout milliseconds for
3
3
  * it to complete and throws an error in case, deadline was reached.
4
- * @param func - function to execute.
4
+ * @param funcOrPromise - function to execute or pending promise.
5
5
  * @param timeout - completion timeout.
6
6
  */
7
- export declare function withTimeout<T>(func: () => Promise<T>, timeout: number): Promise<T>;
7
+ export declare function withTimeout<T>(funcOrPromise: Promise<T> | (() => Promise<T>), timeout: number): Promise<T>;
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var it=Object.defineProperty;var ot=(r,e,t)=>e in r?it(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var o=(r,e,t)=>(ot(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class ve{constructor(e,t){this.prefix=e,this.enabled=t}print(e,...t){if(!this.enabled)return;const s=new Date,n=Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,timeZone:"UTC"}).format(s);console[e](`[${n}]`,this.prefix,...t)}disable(){this.enabled=!1}error(...e){this.print("error",...e)}enable(){this.enabled=!0}log(...e){this.print("log",...e)}warn(...e){this.print("warn",...e)}}let Pe="https://web.telegram.org";const A=new ve("[SDK]",!1);function at(r){if(r){A.enable();return}A.disable()}function ct(r){Pe=r}function ht(){return Pe}function ie(){try{return window.self!==window.top}catch{return!0}}function V(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function ut(r){return"external"in r&&V(r.external)&&"notify"in r.external&&typeof r.external.notify=="function"}function pt(r){return"TelegramWebviewProxy"in r&&V(r.TelegramWebviewProxy)&&"postEvent"in r.TelegramWebviewProxy&&typeof r.TelegramWebviewProxy.postEvent=="function"}function d(r,e,t){let s={},n;e===void 0&&t===void 0?s={}:e!==void 0&&t!==void 0?(s=t,n=e):e!==void 0&&("targetOrigin"in e?s=e:n=e);const{targetOrigin:i=ht()}=s;if(A.log(`Calling method "${r}"`,n),ie()){window.parent.postMessage(JSON.stringify({eventType:r,eventData:n}),i);return}if(ut(window)){window.external.notify(JSON.stringify({eventType:r,eventData:n}));return}if(pt(window)){window.TelegramWebviewProxy.postEvent(r,JSON.stringify(n));return}throw new Error("Unable to determine current environment and possible way to send event.")}function Se(r,e){const t=r.split("."),s=e.split("."),n=Math.max(t.length,s.length);for(let i=0;i<n;i+=1){const a=parseInt(t[i]||"0",10),c=parseInt(s[i]||"0",10);if(a!==c)return a>c?1:-1}return 0}function k(r,e){return Se(r,e)<=0}function R(r,e,t){if(typeof t=="string"){if(r==="web_app_open_link"&&e==="try_instant_view")return k("6.4",t);if(r==="web_app_set_header_color"&&e==="color")return k("6.9",t)}switch(r){case"web_app_open_tg_link":case"web_app_open_invoice":case"web_app_setup_back_button":case"web_app_set_background_color":case"web_app_set_header_color":case"web_app_trigger_haptic_feedback":return k("6.1",e);case"web_app_open_popup":return k("6.2",e);case"web_app_close_scan_qr_popup":case"web_app_open_scan_qr_popup":case"web_app_read_text_from_clipboard":return k("6.4",e);case"web_app_switch_inline_query":return k("6.7",e);case"web_app_invoke_custom_method":case"web_app_request_write_access":case"web_app_request_phone":return k("6.9",e);case"web_app_setup_settings_button":return k("6.10",e);default:return!0}}class J extends Error{constructor(e,t){super(`Method "${e}" is unsupported in the Mini Apps version ${t}.`),Object.setPrototypeOf(this,J.prototype)}}class Q extends Error{constructor(e,t,s){super(`Parameter "${t}" in method "${e}" is unsupported in the Mini Apps version ${s}.`),Object.setPrototypeOf(this,Q.prototype)}}function ke(r){return(e,t)=>{if(!R(e,r))throw new J(e,r);if(V(t)){let s;if(e==="web_app_open_link"&&"try_instant_view"in t?s="try_instant_view":e==="web_app_set_header_color"&&"color"in t&&(s="color"),s&&!R(e,s,r))throw new Q(e,s,r)}return d(e,t)}}class U extends Error{constructor(t,{cause:s,type:n}={}){super(`Unable to parse value${n?` as ${n}`:""}`,{cause:s});o(this,"type");this.value=t,Object.setPrototypeOf(this,U.prototype),this.type=n}}class M extends Error{constructor(e,{cause:t,type:s}={}){super(`Unable to parse field "${e}"${s?` as ${s}`:""}`,{cause:t}),Object.setPrototypeOf(this,M.prototype)}}function xe(r,e){const t={};for(const s in r){const n=r[s];if(!n)continue;let i,a;if(typeof n=="function"||"parse"in n)i=s,a=typeof n=="function"?n:n.parse.bind(n);else{const{type:p}=n;i=n.from||s,a=typeof p=="function"?p:p.parse.bind(p)}let c;const u=e(i);try{c=a(u)}catch(p){throw p instanceof U?new M(i,{type:p.type,cause:p}):new M(i,{cause:p})}c!==void 0&&(t[s]=c)}return t}function B(){return new TypeError("Value has unexpected type")}function oe(r){let e=r;if(typeof e=="string"&&(e=JSON.parse(e)),typeof e!="object"||e===null||Array.isArray(e))throw B();return e}class Z{constructor(e,t,s){this.parser=e,this.isOptional=t,this.type=s}parse(e){if(!(this.isOptional&&e===void 0))try{return this.parser(e)}catch(t){throw new U(e,{type:this.type,cause:t})}}optional(){return this.isOptional=!0,this}}function f(r,e){return new Z(t=>{const s=oe(t);return xe(r,n=>s[n])},!1,e)}function $(r,e){return()=>new Z(r,!1,e)}const h=$(r=>{if(typeof r=="string"||typeof r=="number")return r.toString();throw B()},"string"),lt=f({eventType:h(),eventData:r=>r});function qe(r){return lt.parse(r)}function dt(r,e){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:r,eventData:e}),source:window.parent}))}function ft(){const r=window;"TelegramGameProxy_receiveEvent"in r||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach(e=>{let t=r;e.forEach((s,n,i)=>{if(n===i.length-1){t[s]=dt;return}s in t||(t[s]={}),t=t[s]})})}function gt(r){ft(),window.addEventListener("message",e=>{if(e.source===window.parent)try{const{eventType:t,eventData:s}=qe(e.data);r(t,s)}catch{}})}function wt(){return f({req_id:h(),data:r=>r===null?r:h().optional().parse(r)})}function _t(){return f({req_id:h(),result:r=>r,error:h().optional()})}function bt(){return f({slug:h(),status:h()})}function mt(){return f({status:h()})}function yt(){return f({button_id:r=>r==null?void 0:h().parse(r)})}function Et(){return f({data:h().optional()})}function K(r){return/^#[\da-f]{6}$/i.test(r)}function Ae(r){return/^#[\da-f]{3}$/i.test(r)}function ae(r){const e=r.replace(/\s/g,"").toLowerCase();if(K(e))return e;if(Ae(e)){let s="#";for(let n=0;n<3;n+=1)s+=e[1+n].repeat(2);return s}const t=e.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||e.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),\d{1,3}\)$/);if(t===null)throw new Error(`Value "${r}" does not satisfy any of known RGB formats.`);return t.slice(1).reduce((s,n)=>{const i=parseInt(n,10).toString(16);return s+(i.length===1?"0":"")+i},"#")}const ce=$(r=>ae(h().parse(r)),"rgb");function Ct(){return f({theme_params:r=>{const e=ce().optional();return Object.entries(oe(r)).reduce((t,[s,n])=>(t[s]=e.parse(n),t),{})}})}const E=$(r=>{if(typeof r=="boolean")return r;const e=String(r);if(e==="1"||e==="true")return!0;if(e==="0"||e==="false")return!1;throw B()},"boolean"),x=$(r=>{if(typeof r=="number")return r;if(typeof r=="string"){const e=Number(r);if(!Number.isNaN(e))return e}throw B()},"number");function vt(){return f({height:x(),width:r=>r==null?window.innerWidth:x().parse(r),is_state_stable:E(),is_expanded:E()})}function Pt(){return f({status:h()})}class w{constructor(){o(this,"listeners",new Map);o(this,"subscribeListeners",[])}addListener(e,t,s){let n=this.listeners.get(e);return n||(n=[],this.listeners.set(e,n)),n.push([t,s]),()=>this.off(e,t)}emit(e,...t){this.subscribeListeners.forEach(n=>n(e,...t));const s=this.listeners.get(e);s&&s.forEach(([n,i],a)=>{n(...t),i&&s.splice(a,1)})}on(e,t){return this.addListener(e,t,!1)}once(e,t){return this.addListener(e,t,!0)}off(e,t){const s=this.listeners.get(e);if(s){for(let n=0;n<s.length;n+=1)if(t===s[n][0]){s.splice(n,1);return}}}subscribe(e){return this.subscribeListeners.push(e),()=>this.unsubscribe(e)}unsubscribe(e){for(let t=0;t<this.subscribeListeners.length;t+=1)if(this.subscribeListeners[t]===e){this.subscribeListeners.splice(t,1);return}}}function St(){const r=new w,e=(t,...s)=>{A.log("Emitting processed event:",t,...s),r.emit(t,...s)};return window.addEventListener("resize",()=>{e("viewport_changed",{width:window.innerWidth,height:window.innerHeight,is_state_stable:!0,is_expanded:!0})}),gt((t,s)=>{A.log("Received raw event:",t,s);try{switch(t){case"viewport_changed":return e(t,vt().parse(s));case"theme_changed":return e(t,Ct().parse(s));case"popup_closed":return s==null?e(t,{}):e(t,yt().parse(s));case"set_custom_style":return e(t,h().parse(s));case"qr_text_received":return e(t,Et().parse(s));case"clipboard_text_received":return e(t,wt().parse(s));case"invoice_closed":return e(t,bt().parse(s));case"phone_requested":return e("phone_requested",mt().parse(s));case"custom_method_invoked":return e("custom_method_invoked",_t().parse(s));case"write_access_requested":return e("write_access_requested",Pt().parse(s));case"main_button_pressed":case"back_button_pressed":case"settings_button_pressed":case"scan_qr_popup_closed":case"reload_iframe":return e(t);default:return e(t,s)}}catch(n){A.error("Error processing event:",n)}}),r}const ee="telegram-mini-apps-cached-emitter";function G(){const r=window;return r[ee]===void 0&&(r[ee]=St()),r[ee]}function T(r,e){G().off(r,e)}function m(r,e){return G().on(r,e),()=>T(r,e)}class j extends Error{constructor(e){super(`Async call timeout exceeded. Timeout: ${e}`),Object.setPrototypeOf(this,j.prototype)}}function kt(r){return new Promise((e,t)=>{setTimeout(t,r,new j(r))})}function he(r,e){return Promise.race([r(),kt(e)])}function b(r,e,t,s){let n,i,a,c;typeof e=="string"||Array.isArray(e)?(a=Array.isArray(e)?e:[e],n=t):(i=e,a=Array.isArray(t)?t:[t],n=s),V(i)&&typeof i.req_id=="string"&&(c=i.req_id);const{postEvent:u=d,timeout:p}=n||{},g=n&&"capture"in n?n.capture:null,_=()=>new Promise((I,l)=>{const P=a.map(S=>m(S,F=>{c&&(!V(F)||F.req_id!==c)||typeof g=="function"&&!g(F)||(q(),I(F))})),q=()=>P.forEach(S=>S());try{u(r,i)}catch(S){q(),l(S)}});return typeof p=="number"?he(_,p):_()}async function L(r,e,t,s={}){const{result:n,error:i}=await b("web_app_invoke_custom_method",{method:r,params:e,req_id:t},"custom_method_invoked",s);if(i)throw new Error(i);return n}function xt(r,e){return G().once(r,e),()=>T(r,e)}function Ve(r){G().unsubscribe(r)}function qt(r){return G().subscribe(r),()=>Ve(r)}function me(r,e){return r+(r.length>0&&e.length>0?` ${e}`:e)}function Re(...r){return r.reduce((e,t)=>{let s="";return typeof t=="string"?s=t:typeof t=="object"&&t!==null&&(s=Object.entries(t).reduce((n,[i,a])=>a?me(n,i):n,"")),me(e,s)},"")}function At(...r){return r.reduce((e,t)=>(V(t)&&Object.entries(t).forEach(([s,n])=>{const i=Re(e[s],n);i.length>0&&(e[s]=i)}),e),{})}function ue(r){const e=ae(r);return Math.sqrt([.299,.587,.114].reduce((s,n,i)=>{const a=parseInt(e.slice(1+i*2,1+(i+1)*2),16);return s+a*a*n},0))<120}class y{constructor(e,t){this.state=e,this.ee=t}internalSet(e,t){return this.state[e]===t||t===void 0?!1:(this.state[e]=t,this.ee.emit(`change:${e}`,t),!0)}clone(){return{...this.state}}set(e,t){let s=!1;if(typeof e=="string")s=this.internalSet(e,t);else for(const n in e)this.internalSet(n,e[n])&&(s=!0);s&&this.ee.emit("change")}get(e){return this.state[e]}}class Te{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));this.postEvent=t,this.state=new y({isConfirmationNeeded:e},this.ee)}set isConfirmationNeeded(e){this.state.set("isConfirmationNeeded",e),this.postEvent("web_app_setup_closing_behavior",{need_confirmation:e})}get isConfirmationNeeded(){return this.state.get("isConfirmationNeeded")}disableConfirmation(){this.isConfirmationNeeded=!1}enableConfirmation(){this.isConfirmationNeeded=!0}}function Vt(r){if(Array.isArray(r))return r;if(typeof r=="string")try{const e=JSON.parse(r);if(Array.isArray(e))return e}catch{}throw B()}class Rt extends Z{constructor(t,s,n){super(Vt,s,n);o(this,"itemParser");this.itemParser=typeof t=="function"?t:t.parse.bind(t)}parse(t){const s=super.parse(t);return s===void 0?s:s.map(this.itemParser)}of(t){return this.itemParser=typeof t=="function"?t:t.parse.bind(t),this}}function Ie(r){return new Rt(e=>e,!1,r)}function v(r,e){return t=>R(e[t],r)}function ye(r,e){return r.reduce((t,s)=>(t[s]=e,t),{})}class Le{constructor(e,t,s=d){o(this,"supports");this.createRequestId=t,this.postEvent=s,this.supports=v(e,{delete:"web_app_invoke_custom_method",get:"web_app_invoke_custom_method",getKeys:"web_app_invoke_custom_method",set:"web_app_invoke_custom_method"})}async delete(e,t={}){const s=Array.isArray(e)?e:[e];s.length!==0&&await L("deleteStorageValues",{keys:s},this.createRequestId(),{...t,postEvent:this.postEvent})}async getKeys(e={}){const t=await L("getStorageKeys",{},this.createRequestId(),{...e,postEvent:this.postEvent});return Ie().of(h()).parse(t)}async get(e,t={}){const s=Array.isArray(e)?e:[e];if(s.length===0)return ye(s,"");const n=f(ye(s,h())),i=await L("getStorageValues",{keys:s},this.createRequestId(),{...t,postEvent:this.postEvent}).then(a=>n.parse(a));return Array.isArray(e)?i:i[e]}async set(e,t,s={}){await L("saveStorageValue",{key:e,value:t},this.createRequestId(),{...s,postEvent:this.postEvent})}}class Be{constructor(e,t=d){o(this,"supports");this.postEvent=t,this.supports=v(e,{impactOccurred:"web_app_trigger_haptic_feedback",notificationOccurred:"web_app_trigger_haptic_feedback",selectionChanged:"web_app_trigger_haptic_feedback"})}impactOccurred(e){this.postEvent("web_app_trigger_haptic_feedback",{type:"impact",impact_style:e})}notificationOccurred(e){this.postEvent("web_app_trigger_haptic_feedback",{type:"notification",notification_type:e})}selectionChanged(){this.postEvent("web_app_trigger_haptic_feedback",{type:"selection_change"})}}function $e(){return f({id:x(),type:h(),title:h(),photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"Chat")}class De{constructor(e){this.initData=e}get authDate(){return this.initData.authDate}get canSendAfter(){return this.initData.canSendAfter}get canSendAfterDate(){const{canSendAfter:e}=this;return e===void 0?void 0:new Date(this.authDate.getTime()+e*1e3)}get chat(){return this.initData.chat}get chatType(){return this.initData.chatType}get chatInstance(){return this.initData.chatInstance}get hash(){return this.initData.hash}get queryId(){return this.initData.queryId}get receiver(){return this.initData.receiver}get startParam(){return this.initData.startParam}get user(){return this.initData.user}}function se(){return f({addedToAttachmentMenu:{type:E().optional(),from:"added_to_attachment_menu"},allowsWriteToPm:{type:E().optional(),from:"allows_write_to_pm"},firstName:{type:h(),from:"first_name"},id:x(),isBot:{type:E().optional(),from:"is_bot"},isPremium:{type:E().optional(),from:"is_premium"},languageCode:{type:h().optional(),from:"language_code"},lastName:{type:h().optional(),from:"last_name"},photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"User")}const pe=$(r=>r instanceof Date?r:new Date(x().parse(r)*1e3),"Date");function Y(r,e){return new Z(t=>{if(typeof t!="string"&&!(t instanceof URLSearchParams))throw B();const s=typeof t=="string"?new URLSearchParams(t):t;return xe(r,n=>{const i=s.get(n);return i===null?void 0:i})},!1,e)}function le(){return Y({authDate:{type:pe(),from:"auth_date"},canSendAfter:{type:x().optional(),from:"can_send_after"},chat:$e().optional(),chatInstance:{type:h().optional(),from:"chat_instance"},chatType:{type:h().optional(),from:"chat_type"},hash:h(),queryId:{type:h().optional(),from:"query_id"},receiver:se().optional(),startParam:{type:h().optional(),from:"start_param"},user:se().optional()},"InitData")}function Tt(r){return le().parse(r)}function It(r){const{hostname:e,pathname:t}=new URL(r,window.location.href);if(e!=="t.me")throw new Error(`Incorrect hostname: ${e}`);const s=t.match(/^\/(\$|invoice\/)([A-Za-z0-9\-_=]+)$/);if(s===null)throw new Error('Link pathname has incorrect format. Expected to receive "/invoice/{slug}" or "/${slug}"');return s[2]}class Ne{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");this.postEvent=t,this.state=new y({isOpened:!1},this.ee),this.supports=v(e,{open:"web_app_open_invoice"})}set isOpened(e){this.state.set("isOpened",e)}get isOpened(){return this.state.get("isOpened")}async open(e,t){if(this.isOpened)throw new Error("Invoice is already opened");const s=t?It(e):e;this.isOpened=!0;try{return(await b("web_app_open_invoice",{slug:s},"invoice_closed",{postEvent:this.postEvent,capture(i){return s===i.slug}})).status}finally{this.isOpened=!1}}}class He{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"postEvent");o(this,"on",(e,t)=>e==="click"?m("main_button_pressed",t):this.ee.on(e,t));o(this,"off",(e,t)=>e==="click"?T("main_button_pressed",t):this.ee.off(e,t));const{postEvent:t=d,text:s,textColor:n,backgroundColor:i,isEnabled:a,isVisible:c,isLoaderVisible:u}=e;this.postEvent=t,this.state=new y({backgroundColor:i,isEnabled:a,isVisible:c,isLoaderVisible:u,text:s,textColor:n},this.ee)}commit(){this.text!==""&&this.postEvent("web_app_setup_main_button",{is_visible:this.isVisible,is_active:this.isEnabled,is_progress_visible:this.isLoaderVisible,text:this.text,color:this.backgroundColor,text_color:this.textColor})}set isEnabled(e){this.setParams({isEnabled:e})}get isEnabled(){return this.state.get("isEnabled")}set isLoaderVisible(e){this.setParams({isLoaderVisible:e})}get isLoaderVisible(){return this.state.get("isLoaderVisible")}set isVisible(e){this.setParams({isVisible:e})}get isVisible(){return this.state.get("isVisible")}get backgroundColor(){return this.state.get("backgroundColor")}get text(){return this.state.get("text")}get textColor(){return this.state.get("textColor")}disable(){return this.isEnabled=!1,this}enable(){return this.isEnabled=!0,this}hide(){return this.isVisible=!1,this}hideLoader(){return this.isLoaderVisible=!1,this}show(){return this.isVisible=!0,this}showLoader(){return this.isLoaderVisible=!0,this}setText(e){return this.setParams({text:e})}setTextColor(e){return this.setParams({textColor:e})}setBackgroundColor(e){return this.setParams({backgroundColor:e})}setParams(e){return this.state.set(e),this.commit(),this}}const Lt=Y({contact:f({userId:{type:x(),from:"user_id"},phoneNumber:{type:h(),from:"phone_number"},firstName:{type:h(),from:"first_name"},lastName:{type:h().optional(),from:"last_name"}}),authDate:{type:pe(),from:"auth_date"},hash:h()});function Oe(r,e){return t=>{const[s,n]=e[t];return R(s,n,r)}}function Bt(r){return new Promise(e=>{setTimeout(e,r)})}class We{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"botInline");o(this,"postEvent");o(this,"createRequestId");o(this,"requestingPhoneAccess",!1);o(this,"requestingWriteAccess",!1);o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");o(this,"supportsParam");const{postEvent:t=d,headerColor:s,backgroundColor:n,version:i,botInline:a,createRequestId:c}=e,u=v(i,{requestPhoneAccess:"web_app_request_phone",requestWriteAccess:"web_app_request_write_access",switchInlineQuery:"web_app_switch_inline_query",setHeaderColor:"web_app_set_header_color",setBackgroundColor:"web_app_set_background_color"});this.postEvent=t,this.botInline=a,this.createRequestId=c,this.supports=p=>!(!u(p)||p==="switchInlineQuery"&&!a),this.state=new y({backgroundColor:n,headerColor:s},this.ee),this.supportsParam=Oe(i,{"setHeaderColor.color":["web_app_set_header_color","color"]})}async getRequestedContact(){return L("getRequestedContact",{},this.createRequestId(),{postEvent:this.postEvent,timeout:1e4}).then(e=>Lt.parse(e))}get backgroundColor(){return this.state.get("backgroundColor")}close(){this.postEvent("web_app_close")}get headerColor(){return this.state.get("headerColor")}get isBotInline(){return this.botInline}get isDark(){return ue(this.backgroundColor)}get isRequestingPhoneAccess(){return this.requestingPhoneAccess}get isRequestingWriteAccess(){return this.requestingWriteAccess}ready(){this.postEvent("web_app_ready")}async requestContact({timeout:e=5e3}={}){try{return await this.getRequestedContact()}catch{}if(await this.requestPhoneAccess()!=="sent")throw new Error("Access denied.");const s=Date.now()+e;let n=50;return he(async()=>{for(;Date.now()<s;){try{return await this.getRequestedContact()}catch{}await Bt(n),n+=50}throw new Error("Unable to retrieve requested contact.")},e)}requestPhoneAccess(e={}){if(this.requestingPhoneAccess)throw new Error("Phone access is already being requested.");return this.requestingPhoneAccess=!0,b("web_app_request_phone","phone_requested",{...e,postEvent:this.postEvent}).then(t=>t.status).finally(()=>{this.requestingPhoneAccess=!1})}requestWriteAccess(e={}){if(this.requestingWriteAccess)throw new Error("Write access is already being requested.");return this.requestingWriteAccess=!0,b("web_app_request_write_access","write_access_requested",{...e,postEvent:this.postEvent}).then(t=>t.status).finally(()=>{this.requestingWriteAccess=!1})}sendData(e){const{size:t}=new Blob([e]);if(t===0||t>4096)throw new Error(`Passed data has incorrect size: ${t}`);this.postEvent("web_app_data_send",{data:e})}setHeaderColor(e){this.postEvent("web_app_set_header_color",K(e)?{color:e}:{color_key:e}),this.state.set("headerColor",e)}setBackgroundColor(e){this.postEvent("web_app_set_background_color",{color:e}),this.state.set("backgroundColor",e)}switchInlineQuery(e,t=[]){if(!this.supports("switchInlineQuery")&&!this.isBotInline)throw new Error("Method is unsupported because Mini App should be launched in inline mode.");this.postEvent("web_app_switch_inline_query",{query:e,chat_types:t})}}function $t(r){const e=r.message.trim(),t=(r.title||"").trim(),s=r.buttons||[];let n;if(t.length>64)throw new Error(`Title has incorrect size: ${t.length}`);if(e.length===0||e.length>256)throw new Error(`Message has incorrect size: ${e.length}`);if(s.length>3)throw new Error(`Buttons have incorrect size: ${s.length}`);return s.length===0?n=[{type:"close",id:""}]:n=s.map(i=>{const{id:a=""}=i;if(a.length>64)throw new Error(`Button ID has incorrect size: ${a}`);if(i.type===void 0||i.type==="default"||i.type==="destructive"){const c=i.text.trim();if(c.length===0||c.length>64){const u=i.type||"default";throw new Error(`Button text with type "${u}" has incorrect size: ${i.text.length}`)}return{...i,text:c,id:a}}return{...i,id:a}}),{title:t,message:e,buttons:n}}class Me{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");this.postEvent=t,this.state=new y({isOpened:!1},this.ee),this.supports=v(e,{open:"web_app_open_popup"})}set isOpened(e){this.state.set("isOpened",e)}get isOpened(){return this.state.get("isOpened")}open(e){if(this.isOpened)throw new Error("Popup is already opened.");return this.isOpened=!0,b("web_app_open_popup",$t(e),"popup_closed",{postEvent:this.postEvent}).then(({button_id:t=null})=>t).finally(()=>{this.isOpened=!1})}}class Ue{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");this.postEvent=t,this.state=new y({isOpened:!1},this.ee),this.supports=v(e,{close:"web_app_close_scan_qr_popup",open:"web_app_open_scan_qr_popup"})}close(){this.postEvent("web_app_close_scan_qr_popup"),this.isOpened=!1}set isOpened(e){this.state.set("isOpened",e)}get isOpened(){return this.state.get("isOpened")}async open(e){if(this.isOpened)throw new Error("QR scanner is already opened.");this.isOpened=!0;try{const t=await b("web_app_open_scan_qr_popup",{text:e},["qr_text_received","scan_qr_popup_closed"],{postEvent:this.postEvent});return typeof t=="object"&&typeof t.data=="string"?t.data:null}finally{this.isOpened=!1}}}class Ge{constructor(e,t,s=d){o(this,"ee",new w);o(this,"state");o(this,"on",(e,t)=>e==="click"?m("settings_button_pressed",t):this.ee.on(e,t));o(this,"off",(e,t)=>e==="click"?T("settings_button_pressed",t):this.ee.off(e,t));o(this,"supports");this.postEvent=s,this.state=new y({isVisible:e},this.ee),this.supports=v(t,{show:"web_app_setup_settings_button",hide:"web_app_setup_settings_button"})}set isVisible(e){this.state.set("isVisible",e),this.postEvent("web_app_setup_settings_button",{is_visible:e})}get isVisible(){return this.state.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}function Dt(r){return r.replace(/(^|_)bg/,(e,t)=>`${t}background`).replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}function Nt(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`).replace(/(^|_)background/,(e,t)=>`${t}bg`)}const de=$(r=>{const e=ce().optional();return Object.entries(oe(r)).reduce((t,[s,n])=>(t[Dt(s)]=e.parse(n),t),{})},"ThemeParams");function fe(r){return de().parse(r)}function Ht(r={}){return b("web_app_request_theme","theme_changed",r).then(fe)}function je(r){return JSON.stringify(Object.entries(r).reduce((e,[t,s])=>(s&&(e[Nt(t)]=s),e),{}))}class Fe{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));this.state=new y(e,this.ee)}get accentTextColor(){return this.get("accentTextColor")}get backgroundColor(){return this.get("backgroundColor")}get buttonColor(){return this.get("buttonColor")}get buttonTextColor(){return this.get("buttonTextColor")}get destructiveTextColor(){return this.get("destructiveTextColor")}get(e){return this.state.get(e)}getState(){return this.state.clone()}get headerBackgroundColor(){return this.get("headerBackgroundColor")}get hintColor(){return this.get("hintColor")}get isDark(){return!this.backgroundColor||ue(this.backgroundColor)}get linkColor(){return this.get("linkColor")}get secondaryBackgroundColor(){return this.get("secondaryBackgroundColor")}get sectionBackgroundColor(){return this.get("sectionBackgroundColor")}get sectionHeaderTextColor(){return this.get("sectionHeaderTextColor")}listen(){return m("theme_changed",e=>{this.state.set(fe(e.theme_params))})}get subtitleTextColor(){return this.get("subtitleTextColor")}get textColor(){return this.get("textColor")}}class ze{constructor(e,t,s=d){o(this,"supports");o(this,"supportsParam");this.version=e,this.createRequestId=t,this.postEvent=s,this.supports=v(e,{readTextFromClipboard:"web_app_read_text_from_clipboard"}),this.supportsParam=Oe(e,{"openLink.tryInstantView":["web_app_open_link","try_instant_view"]})}openLink(e,t){const s=new URL(e,window.location.href).toString();if(!R("web_app_open_link",this.version)){window.open(s,"_blank");return}this.postEvent("web_app_open_link",{url:s,...typeof t=="boolean"?{try_instant_view:t}:{}})}openTelegramLink(e){const{hostname:t,pathname:s,search:n}=new URL(e,window.location.href);if(t!=="t.me")throw new Error(`URL has not allowed hostname: ${t}. Only "t.me" is allowed`);if(!R("web_app_open_tg_link",this.version)){window.location.href=e;return}this.postEvent("web_app_open_tg_link",{path_full:s+n})}readTextFromClipboard(){return b("web_app_read_text_from_clipboard",{req_id:this.createRequestId()},"clipboard_text_received",{postEvent:this.postEvent}).then(({data:e=null})=>e)}}function Je(r){return["macos","tdesktop","unigram","web","weba"].includes(r)}async function ge(r){const e=await b("web_app_request_viewport","viewport_changed",r);return{height:e.height,width:e.width,isExpanded:e.is_expanded,isStateStable:e.is_state_stable}}function H(r){return r<0?0:r}class Qe{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"postEvent");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));const{height:t,isExpanded:s,width:n,stableHeight:i,postEvent:a=d}=e;this.postEvent=a,this.state=new y({height:H(t),isExpanded:s,stableHeight:H(i),width:H(n)},this.ee)}sync(e){return ge(e).then(({height:t,isExpanded:s,width:n,isStateStable:i})=>{this.state.set({height:t,width:n,isExpanded:s,stableHeight:i?t:this.state.get("stableHeight")})})}get height(){return this.state.get("height")}get stableHeight(){return this.state.get("stableHeight")}listen(){return m("viewport_changed",e=>{const{height:t,width:s,is_expanded:n,is_state_stable:i}=e,a={height:H(t),isExpanded:n,width:H(s)};i&&(a.stableHeight=a.height),this.state.set(a)})}get isExpanded(){return this.state.get("isExpanded")}get width(){return this.state.get("width")}expand(){this.postEvent("web_app_expand"),this.state.set("isExpanded",!0)}get isStable(){return this.stableHeight===this.height}}function C(r,e){document.documentElement.style.setProperty(r,e)}function Ze(r,e){const t=()=>{C("--tg-background-color",r.backgroundColor)},s=()=>{const{backgroundColor:n,secondaryBackgroundColor:i}=e;if(K(r.headerColor)){C("--tg-header-color",r.headerColor);return}if(r.headerColor==="bg_color"&&n){C("--tg-header-color",n);return}r.headerColor==="secondary_bg_color"&&i&&C("--tg-header-color",i)};e.on("change",s),r.on("change:backgroundColor",t),r.on("change:headerColor",s),t(),s()}function Ke(r){const e=()=>{const t=r.getState();Object.entries(t).forEach(([s,n])=>{if(n){const i=s.replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`);C(`--tg-theme-${i}`,n)}})};r.on("change",e),e()}function ne(r){const e=()=>C("--tg-viewport-height",`${r.height}px`),t=()=>C("--tg-viewport-width",`${r.width}px`),s=()=>C("--tg-viewport-stable-height",`${r.stableHeight}px`);r.on("change:height",e),r.on("change:width",t),r.on("change:stableHeight",s),e(),t(),s()}function Ot(){const r=document.createElement("style");r.id="telegram-custom-styles",document.head.appendChild(r),m("set_custom_style",e=>{r.innerHTML=e})}class Wt{constructor(e,t,s=d){o(this,"ee",new w);o(this,"state");o(this,"on",(e,t)=>e==="click"?m("back_button_pressed",t):this.ee.on(e,t));o(this,"off",(e,t)=>e==="click"?T("back_button_pressed",t):this.ee.off(e,t));o(this,"supports");this.postEvent=s,this.state=new y({isVisible:e},this.ee),this.supports=v(t,{show:"web_app_setup_back_button",hide:"web_app_setup_back_button"})}set isVisible(e){this.state.set("isVisible",e),this.postEvent("web_app_setup_back_button",{is_visible:e})}get isVisible(){return this.state.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}function Ye(r){return`telegram-mini-apps-${r}`}function D(r,e){sessionStorage.setItem(Ye(r),JSON.stringify(e))}function N(r){const e=sessionStorage.getItem(Ye(r));return e?JSON.parse(e):null}function Mt(r,e,t){const{isVisible:s=!1}=r?N("back-button")||{}:{},n=new Wt(s,e,t);return n.on("change",()=>{D("back-button",{isVisible:n.isVisible})}),n}function Ut(r,e){const{isConfirmationNeeded:t=!1}=r?N("closing-behavior")||{}:{},s=new Te(t,e);return s.on("change",()=>D("closing-behavior",{isConfirmationNeeded:s.isConfirmationNeeded})),s}function Gt(r,e,t,s){const{backgroundColor:n=e,isEnabled:i=!1,isVisible:a=!1,isLoaderVisible:c=!1,textColor:u=t,text:p=""}=r?N("main-button")||{}:{},g=new He({backgroundColor:n,isEnabled:i,isLoaderVisible:c,isVisible:a,postEvent:s,text:p,textColor:u}),_=()=>D("main-button",{backgroundColor:g.backgroundColor,isEnabled:g.isEnabled,isLoaderVisible:g.isLoaderVisible,isVisible:g.isVisible,text:g.text,textColor:g.textColor});return g.on("change",_),g}function jt(r,e,t,s,n,i){const{backgroundColor:a=e,headerColor:c="bg_color"}=r?N("mini-app")||{}:{},u=new We({headerColor:c,backgroundColor:a,version:t,botInline:s,createRequestId:n,postEvent:i}),p=()=>D("mini-app",{backgroundColor:u.backgroundColor,headerColor:u.headerColor});return u.on("change",p),u}function Ft(){let r=0;return()=>(r+=1,r.toString())}function zt(r,e,t){const{isVisible:s=!1}=r?N("settings-button")||{}:{},n=new Ge(s,e,t);return n.on("change",()=>{D("settings-button",{isVisible:n.isVisible})}),n}function Jt(r){const e=new Fe(r);return e.listen(),e}function z(r){const e=new Qe(r);return e.on("change",()=>D("viewport",{height:e.height,isExpanded:e.isExpanded,stableHeight:e.stableHeight,width:e.width})),e.listen(),e}function Qt(r,e,t,s){const n=r?N("viewport"):null;if(n)return z({...n,postEvent:t});if(Je(e))return z({height:window.innerHeight,isExpanded:!0,postEvent:t,stableHeight:window.innerHeight,width:window.innerWidth});if(s)return ge({postEvent:t,timeout:5e3}).then(({height:a,isStateStable:c,...u})=>z({...u,height:a,stableHeight:c?a:0}));const i=z({width:0,height:0,isExpanded:!1,postEvent:t,stableHeight:0});return i.sync({postEvent:t,timeout:5e3}).catch(a=>{console.error("Unable to actualize viewport state",a)}),i}function Zt(r){return typeof r=="object"?r:r?{themeParams:!0,viewport:!0,miniApp:!0}:{}}function Ee(r,e,t,s){const n=Zt(r);n.miniApp&&Ze(e,t),n.themeParams&&Ke(t),n.viewport&&(s instanceof Promise?s.then(ne):ne(s))}function Xe(){return Y({botInline:{type:E().optional(),from:"tgWebAppBotInline"},initData:{type:le().optional(),from:"tgWebAppData"},initDataRaw:{type:h().optional(),from:"tgWebAppData"},platform:{type:h(),from:"tgWebAppPlatform"},showSettings:{type:E().optional(),from:"tgWebAppShowSettings"},startParam:{type:h().optional(),from:"tgWebAppStartParam"},themeParams:{type:de(),from:"tgWebAppThemeParams"},version:{type:h(),from:"tgWebAppVersion"}},"LaunchParams")}function we(r){return Xe().parse(r)}function et(r){const e=r.includes("?")?r.replace("#","&").slice(r.indexOf("?")+1):r.slice(r.indexOf("#")+1);return we(e)}function Kt(){return et(window.location.href)}function tt(){return performance.getEntriesByType("navigation")[0]}function Yt(){const r=tt();if(!r)throw new Error("Unable to get first navigation entry.");return et(r.name)}function rt(r){const{initDataRaw:e,themeParams:t,platform:s,version:n,showSettings:i,startParam:a,botInline:c}=r,u=new URLSearchParams;return e&&u.set("tgWebAppData",e),u.set("tgWebAppPlatform",s),u.set("tgWebAppThemeParams",je(t)),u.set("tgWebAppVersion",n),a&&u.set("tgWebAppStartParam",n),typeof i=="boolean"&&u.set("tgWebAppShowSettings",i?"1":"0"),typeof c=="boolean"&&u.set("tgWebAppBotInline",c?"1":"0"),u.toString()}const st="telegram-mini-apps-launch-params";function Xt(){return we(sessionStorage.getItem(st)||"")}function er(r){sessionStorage.setItem(st,rt(r))}function X(){const r=[];for(const e of[Kt,Yt,Xt])try{const t=e();return er(t),t}catch(t){r.push(t)}throw A.error("Unable to extract launch parameters. Received errors:",r),new Error("Unable to retrieve launch parameters from any known source.")}function _e(){var r;return((r=tt())==null?void 0:r.type)==="reload"}function tr(r={}){const{async:e=!1,complete:t=e,cssVars:s=!1,acceptCustomStyles:n=!1}=r;try{const{initData:i,initDataRaw:a,version:c,platform:u,themeParams:p,botInline:g=!1}=X(),_=_e(),I=Ft(),l=ke(c);ie()&&(n&&Ot(),l("iframe_ready",{reload_supported:!0}),m("reload_iframe",()=>{l("iframe_will_reload"),window.location.reload()}));const P={backButton:Mt(_,c,l),closingBehavior:Ut(_,l),cloudStorage:new Le(c,I,l),createRequestId:I,hapticFeedback:new Be(c,l),invoice:new Ne(c,l),mainButton:Gt(_,p.buttonColor||"#000000",p.buttonTextColor||"#ffffff",l),miniApp:jt(_,p.backgroundColor||"#ffffff",c,g,I,l),popup:new Me(c,l),postEvent:l,qrScanner:new Ue(c,l),settingsButton:zt(_,c,l),themeParams:Jt(p),utils:new ze(c,I,l),...i?{initData:new De(i),initDataRaw:a}:{}},q=Qt(_,u,l,t);return q instanceof Promise||t?Promise.resolve(q).then(S=>(Ee(s,P.miniApp,P.themeParams,S),{...P,viewport:S})):(Ee(s,P.miniApp,P.themeParams,q),{...P,viewport:q})}catch(i){if(t)return Promise.reject(i);throw i}}function rr(){return{launchParams:X(),isPageReload:_e()}}function sr(){try{return X(),!0}catch{return!1}}function nr(r){const e=r.match(/#(.+)/);return e?e[1]:null}async function W(r){return r===0?!0:Promise.race([new Promise(e=>{window.addEventListener("popstate",function t(){window.removeEventListener("popstate",t),e(!0)}),window.history.go(r)}),new Promise(e=>{setTimeout(e,50,!1)})])}async function ir(){if(window.history.length<=1||(window.history.pushState(null,""),await W(1-window.history.length)))return;let e=await W(-1);for(;e;)e=await W(-1)}function O(r,e){return r.startsWith(e)?r:`${e}${r}`}class nt{constructor(e,t,{debug:s=!1,loggerPrefix:n="Navigator"}){o(this,"logger");o(this,"entries");if(this.entriesCursor=t,e.length===0)throw new Error("Entries list should not be empty.");if(t>=e.length)throw new Error("Cursor should be less than entries count.");this.entries=e.map(({pathname:i="",search:a,hash:c})=>{if(!i.startsWith("/")&&i.length>0)throw new Error('Pathname should start with "/"');return{pathname:O(i,"/"),search:a?O(a,"?"):"",hash:c?O(c,"#"):""}}),this.logger=new ve(`[${n}]`,s)}formatEntry(e){let t;if(typeof e=="string")t=e;else{const{pathname:a="",search:c,hash:u}=e;t=a+(c?O(c,"?"):"")+(u?O(u,"#"):"")}const{pathname:s,search:n,hash:i}=new URL(t,`https://localhost${this.path}`);return{pathname:s,search:n,hash:i}}get entry(){return this.entries[this.entriesCursor]}back(){return this.go(-1)}get cursor(){return this.entriesCursor}get canGoBack(){return this.entriesCursor>0}get canGoForward(){return this.entriesCursor!==this.entries.length-1}forward(){return this.go(1)}go(e){this.logger.log(`called go(${e})`);const t=Math.min(this.entries.length-1,Math.max(this.entriesCursor+e,0));if(this.entriesCursor===t)return this.performGo({updated:!1,delta:e});const s=this.entry;this.entriesCursor=t;const n=this.entry;return this.logger.log("State changed",{before:s,after:n}),this.performGo({updated:!0,delta:e,before:s,after:n})}getEntries(){return this.entries.map(e=>({...e}))}get hash(){return this.entry.hash}push(e){this.entriesCursor!==this.entries.length-1&&this.entries.splice(this.entriesCursor+1);const t=this.formatEntry(e),s=this.entry;this.entriesCursor+=1,this.entries[this.entriesCursor]=t;const n=this.entry;return this.logger.log("State changed",{before:s,after:n}),this.performPush({before:s,after:n})}get path(){return`${this.pathname}${this.search}${this.hash}`}get pathname(){return this.entry.pathname}replace(e){const t=this.formatEntry(e);if(this.search===t.search&&this.pathname===t.pathname&&this.hash===t.hash)return this.performReplace({updated:!1,entry:t});const s=this.entry;this.entries[this.entriesCursor]=t;const n=this.entry;return this.logger.log("State changed",{before:s,after:n}),this.performReplace({updated:!0,before:s,after:n})}get search(){return this.entry.search}}const Ce=0,te=1,re=2;class be extends nt{constructor(t,s,n={}){super(t,s,{...n,loggerPrefix:"HashNavigator"});o(this,"ee",new w);o(this,"attached",!1);o(this,"onPopState",async({state:t})=>{if(this.logger.log('"popstate" event received. State:',t),t===null)return this.push(window.location.hash.slice(1));if(t===Ce){this.logger.log("Void reached. Moving history forward"),window.history.forward();return}if(t===te)return this.back();if(t===re)return this.forward()});o(this,"back",()=>super.back());o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee))}static fromLocation(t){const{search:s,pathname:n,hash:i}=new URL(window.location.hash.slice(1),window.location.href);return new be([{search:s,pathname:n,hash:i}],0,t)}async performGo(t){t.updated&&(this.attached&&await this.syncHistory(),this.emitChanged(t.before,t.after))}async performPush({before:t,after:s}){this.attached&&await this.syncHistory(),this.emitChanged(t,s)}async performReplace(t){t.updated&&(this.attached&&window.history.replaceState(null,"",`#${this.path}`),this.emitChanged(t.before,t.after))}async syncHistory(){window.removeEventListener("popstate",this.onPopState);const t=`#${this.path}`;await ir(),d("web_app_setup_back_button",{is_visible:this.canGoBack}),this.canGoBack&&this.canGoForward?(this.logger.log("Setting up history: [<-, *, ->]"),window.history.replaceState(te,""),window.history.pushState(null,"",t),window.history.pushState(re,""),await W(-1)):this.canGoBack?(this.logger.log("Setting up history: [<-, *]"),window.history.replaceState(te,""),window.history.pushState(null,"",t)):this.canGoForward?(this.logger.log("Setting up history: [*, ->]"),window.history.replaceState(null,t),window.history.pushState(re,""),await W(-1)):(this.logger.log("Setting up history: [~, *]"),window.history.replaceState(Ce,""),window.history.pushState(null,"",t)),window.addEventListener("popstate",this.onPopState)}emitChanged(t,s){this.ee.emit("change",{navigator:this,from:t,to:s})}async attach(){if(!this.attached)return this.logger.log("Attaching",this),this.attached=!0,m("back_button_pressed",this.back),this.syncHistory()}detach(){this.attached&&(this.logger.log("Detaching",this),this.attached=!1,window.removeEventListener("popstate",this.onPopState),T("back_button_pressed",this.back))}}function or(r){return r instanceof j}exports.ClosingBehavior=Te;exports.CloudStorage=Le;exports.HapticFeedback=Be;exports.HashNavigator=be;exports.InitData=De;exports.Invoice=Ne;exports.MainButton=He;exports.MethodUnsupportedError=J;exports.MiniApp=We;exports.Navigator=nt;exports.ParameterUnsupportedError=Q;exports.ParseError=U;exports.ParseSchemaFieldError=M;exports.Popup=Me;exports.QRScanner=Ue;exports.SettingsButton=Ge;exports.ThemeParams=Fe;exports.TimeoutError=j;exports.Utils=ze;exports.Viewport=Qe;exports.array=Ie;exports.bindMiniAppCSSVars=Ze;exports.bindThemeCSSVars=Ke;exports.bindViewportCSSVars=ne;exports.boolean=E;exports.chatParser=$e;exports.classNames=Re;exports.compareVersions=Se;exports.createPostEvent=ke;exports.date=pe;exports.getHash=nr;exports.init=tr;exports.initDataParser=le;exports.invokeCustomMethod=L;exports.isColorDark=ue;exports.isIframe=ie;exports.isPageReload=_e;exports.isRGB=K;exports.isRGBShort=Ae;exports.isRecord=V;exports.isStableViewportPlatform=Je;exports.isTMA=sr;exports.isTimeoutError=or;exports.json=f;exports.launchParamsParser=Xe;exports.mergeClassNames=At;exports.number=x;exports.off=T;exports.on=m;exports.once=xt;exports.parseInitData=Tt;exports.parseLaunchParams=we;exports.parseMessage=qe;exports.parseThemeParams=fe;exports.postEvent=d;exports.request=b;exports.requestThemeParams=Ht;exports.requestViewport=ge;exports.retrieveLaunchData=rr;exports.retrieveLaunchParams=X;exports.rgb=ce;exports.searchParams=Y;exports.serializeLaunchParams=rt;exports.serializeThemeParams=je;exports.setCSSVar=C;exports.setDebug=at;exports.setTargetOrigin=ct;exports.string=h;exports.subscribe=qt;exports.supports=R;exports.themeParamsParser=de;exports.toRGB=ae;exports.unsubscribe=Ve;exports.userParser=se;exports.withTimeout=he;
1
+ "use strict";var ot=Object.defineProperty;var at=(r,e,t)=>e in r?ot(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var o=(r,e,t)=>(at(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class Ce{constructor(e,t){this.prefix=e,this.enabled=t}print(e,...t){if(!this.enabled)return;const s=new Date,n=Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit",fractionalSecondDigits:3,timeZone:"UTC"}).format(s);console[e](`[${n}]`,this.prefix,...t)}disable(){this.enabled=!1}error(...e){this.print("error",...e)}enable(){this.enabled=!0}log(...e){this.print("log",...e)}warn(...e){this.print("warn",...e)}}let ve="https://web.telegram.org";const x=new Ce("[SDK]",!1);function ct(r){if(r){x.enable();return}x.disable()}function ht(r){ve=r}function ut(){return ve}function se(){try{return window.self!==window.top}catch{return!0}}function H(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function pt(r){return"external"in r&&H(r.external)&&"notify"in r.external&&typeof r.external.notify=="function"}function lt(r){return"TelegramWebviewProxy"in r&&H(r.TelegramWebviewProxy)&&"postEvent"in r.TelegramWebviewProxy&&typeof r.TelegramWebviewProxy.postEvent=="function"}function d(r,e,t){let s={},n;e===void 0&&t===void 0?s={}:e!==void 0&&t!==void 0?(s=t,n=e):e!==void 0&&("targetOrigin"in e?s=e:n=e);const{targetOrigin:i=ut()}=s;if(x.log(`Calling method "${r}"`,n),se()){window.parent.postMessage(JSON.stringify({eventType:r,eventData:n}),i);return}if(pt(window)){window.external.notify(JSON.stringify({eventType:r,eventData:n}));return}if(lt(window)){window.TelegramWebviewProxy.postEvent(r,JSON.stringify(n));return}throw new Error("Unable to determine current environment and possible way to send event.")}function Pe(r,e){const t=r.split("."),s=e.split("."),n=Math.max(t.length,s.length);for(let i=0;i<n;i+=1){const a=parseInt(t[i]||"0",10),c=parseInt(s[i]||"0",10);if(a!==c)return a>c?1:-1}return 0}function S(r,e){return Pe(r,e)<=0}function q(r,e,t){if(typeof t=="string"){if(r==="web_app_open_link"&&e==="try_instant_view")return S("6.4",t);if(r==="web_app_set_header_color"&&e==="color")return S("6.9",t)}switch(r){case"web_app_open_tg_link":case"web_app_open_invoice":case"web_app_setup_back_button":case"web_app_set_background_color":case"web_app_set_header_color":case"web_app_trigger_haptic_feedback":return S("6.1",e);case"web_app_open_popup":return S("6.2",e);case"web_app_close_scan_qr_popup":case"web_app_open_scan_qr_popup":case"web_app_read_text_from_clipboard":return S("6.4",e);case"web_app_switch_inline_query":return S("6.7",e);case"web_app_invoke_custom_method":case"web_app_request_write_access":case"web_app_request_phone":return S("6.9",e);case"web_app_setup_settings_button":return S("6.10",e);default:return!0}}class F extends Error{constructor(e,t){super(`Method "${e}" is unsupported in the Mini Apps version ${t}.`),Object.setPrototypeOf(this,F.prototype)}}class z extends Error{constructor(e,t,s){super(`Parameter "${t}" in method "${e}" is unsupported in the Mini Apps version ${s}.`),Object.setPrototypeOf(this,z.prototype)}}function Se(r){return(e,t)=>{if(!q(e,r))throw new F(e,r);if(H(t)){let s;if(e==="web_app_open_link"&&"try_instant_view"in t?s="try_instant_view":e==="web_app_set_header_color"&&"color"in t&&(s="color"),s&&!q(e,s,r))throw new z(e,s,r)}return d(e,t)}}function ke(r){return({req_id:e})=>e===r}class W extends Error{constructor(t,{cause:s,type:n}={}){super(`Unable to parse value${n?` as ${n}`:""}`,{cause:s});o(this,"type");this.value=t,Object.setPrototypeOf(this,W.prototype),this.type=n}}class N extends Error{constructor(e,{cause:t,type:s}={}){super(`Unable to parse field "${e}"${s?` as ${s}`:""}`,{cause:t}),Object.setPrototypeOf(this,N.prototype)}}function xe(r,e){const t={};for(const s in r){const n=r[s];if(!n)continue;let i,a;if(typeof n=="function"||"parse"in n)i=s,a=typeof n=="function"?n:n.parse.bind(n);else{const{type:p}=n;i=n.from||s,a=typeof p=="function"?p:p.parse.bind(p)}let c;const u=e(i);try{c=a(u)}catch(p){throw p instanceof W?new N(i,{type:p.type,cause:p}):new N(i,{cause:p})}c!==void 0&&(t[s]=c)}return t}function T(){return new TypeError("Value has unexpected type")}function ne(r){let e=r;if(typeof e=="string"&&(e=JSON.parse(e)),typeof e!="object"||e===null||Array.isArray(e))throw T();return e}class J{constructor(e,t,s){this.parser=e,this.isOptional=t,this.type=s}parse(e){if(!(this.isOptional&&e===void 0))try{return this.parser(e)}catch(t){throw new W(e,{type:this.type,cause:t})}}optional(){return this.isOptional=!0,this}}function f(r,e){return new J(t=>{const s=ne(t);return xe(r,n=>s[n])},!1,e)}function I(r,e){return()=>new J(r,!1,e)}const h=I(r=>{if(typeof r=="string"||typeof r=="number")return r.toString();throw T()},"string");function qe(r){return f({eventType:h(),eventData:e=>e}).parse(r)}function dt(r,e){window.dispatchEvent(new MessageEvent("message",{data:JSON.stringify({eventType:r,eventData:e}),source:window.parent}))}function ft(){const r=window;"TelegramGameProxy_receiveEvent"in r||[["TelegramGameProxy_receiveEvent"],["TelegramGameProxy","receiveEvent"],["Telegram","WebView","receiveEvent"]].forEach(e=>{let t=r;e.forEach((s,n,i)=>{if(n===i.length-1){t[s]=dt;return}s in t||(t[s]={}),t=t[s]})})}function gt(r){ft(),window.addEventListener("message",e=>{if(e.source===window.parent)try{const{eventType:t,eventData:s}=qe(e.data);r(t,s)}catch{}})}function wt(){return f({req_id:h(),data:r=>r===null?r:h().optional().parse(r)})}function _t(){return f({req_id:h(),result:r=>r,error:h().optional()})}function bt(){return f({slug:h(),status:h()})}function mt(){return f({status:h()})}function yt(){return f({button_id:r=>r==null?void 0:h().parse(r)})}function Et(){return f({data:h().optional()})}function Q(r){return/^#[\da-f]{6}$/i.test(r)}function Ae(r){return/^#[\da-f]{3}$/i.test(r)}function ie(r){const e=r.replace(/\s/g,"").toLowerCase();if(Q(e))return e;if(Ae(e)){let s="#";for(let n=0;n<3;n+=1)s+=e[1+n].repeat(2);return s}const t=e.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||e.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),\d{1,3}\)$/);if(t===null)throw new Error(`Value "${r}" does not satisfy any of known RGB formats.`);return t.slice(1).reduce((s,n)=>{const i=parseInt(n,10).toString(16);return s+(i.length===1?"0":"")+i},"#")}const oe=I(r=>ie(h().parse(r)),"rgb");function Ct(){return f({theme_params:r=>{const e=oe().optional();return Object.entries(ne(r)).reduce((t,[s,n])=>(t[s]=e.parse(n),t),{})}})}const C=I(r=>{if(typeof r=="boolean")return r;const e=String(r);if(e==="1"||e==="true")return!0;if(e==="0"||e==="false")return!1;throw T()},"boolean"),k=I(r=>{if(typeof r=="number")return r;if(typeof r=="string"){const e=Number(r);if(!Number.isNaN(e))return e}throw T()},"number");function vt(){return f({height:k(),width:r=>r==null?window.innerWidth:k().parse(r),is_state_stable:C(),is_expanded:C()})}function Pt(){return f({status:h()})}class w{constructor(){o(this,"listeners",new Map);o(this,"subscribeListeners",[])}addListener(e,t,s){let n=this.listeners.get(e);return n||(n=[],this.listeners.set(e,n)),n.push([t,s]),()=>this.off(e,t)}emit(e,...t){this.subscribeListeners.forEach(n=>n(e,...t));const s=this.listeners.get(e);s&&s.forEach(([n,i],a)=>{n(...t),i&&s.splice(a,1)})}on(e,t){return this.addListener(e,t,!1)}once(e,t){return this.addListener(e,t,!0)}off(e,t){const s=this.listeners.get(e);if(s){for(let n=0;n<s.length;n+=1)if(t===s[n][0]){s.splice(n,1);return}}}subscribe(e){return this.subscribeListeners.push(e),()=>this.unsubscribe(e)}unsubscribe(e){for(let t=0;t<this.subscribeListeners.length;t+=1)if(this.subscribeListeners[t]===e){this.subscribeListeners.splice(t,1);return}}}function St(){const r=new w,e=(t,...s)=>{x.log("Emitting processed event:",t,...s),r.emit(t,...s)};return window.addEventListener("resize",()=>{e("viewport_changed",{width:window.innerWidth,height:window.innerHeight,is_state_stable:!0,is_expanded:!0})}),gt((t,s)=>{x.log("Received raw event:",t,s);try{switch(t){case"viewport_changed":return e(t,vt().parse(s));case"theme_changed":return e(t,Ct().parse(s));case"popup_closed":return s==null?e(t,{}):e(t,yt().parse(s));case"set_custom_style":return e(t,h().parse(s));case"qr_text_received":return e(t,Et().parse(s));case"clipboard_text_received":return e(t,wt().parse(s));case"invoice_closed":return e(t,bt().parse(s));case"phone_requested":return e("phone_requested",mt().parse(s));case"custom_method_invoked":return e("custom_method_invoked",_t().parse(s));case"write_access_requested":return e("write_access_requested",Pt().parse(s));case"main_button_pressed":case"back_button_pressed":case"settings_button_pressed":case"scan_qr_popup_closed":case"reload_iframe":return e(t);default:return e(t,s)}}catch(n){x.error("Error processing event:",n)}}),r}const Y="telegram-mini-apps-cached-emitter";function M(){const r=window;return r[Y]===void 0&&(r[Y]=St()),r[Y]}function A(r,e){M().off(r,e)}function y(r,e){return M().on(r,e),()=>A(r,e)}class U extends Error{constructor(e){super(`Async call timeout exceeded. Timeout: ${e}`),Object.setPrototypeOf(this,U.prototype)}}function kt(r){return new Promise((e,t)=>{setTimeout(t,r,new U(r))})}function ae(r,e){return Promise.race([typeof r=="function"?r():r,kt(e)])}async function m(r,e,t){let s;const n=new Promise(b=>{s=b}),i=e?{...t,event:e,method:r}:r,{method:a,event:c,capture:u,postEvent:p=d,timeout:g}=i,_=(Array.isArray(c)?c:[c]).map(b=>y(b,l=>(!u||u(l))&&s(l)));try{return p(a,i.params),await(g?ae(n,g):n)}finally{_.forEach(b=>b())}}async function R(r,e,t,s={}){const{result:n,error:i}=await m("web_app_invoke_custom_method","custom_method_invoked",{...s,params:{method:r,params:e,req_id:t},capture:ke(t)});if(i)throw new Error(i);return n}function xt(r,e){return M().once(r,e),()=>A(r,e)}function Ve(r){M().unsubscribe(r)}function qt(r){return M().subscribe(r),()=>Ve(r)}function be(r,e){return r+(r.length>0&&e.length>0?` ${e}`:e)}function Re(...r){return r.reduce((e,t)=>{let s="";return typeof t=="string"?s=t:typeof t=="object"&&t!==null&&(s=Object.entries(t).reduce((n,[i,a])=>a?be(n,i):n,"")),be(e,s)},"")}function At(...r){return r.reduce((e,t)=>(H(t)&&Object.entries(t).forEach(([s,n])=>{const i=Re(e[s],n);i.length>0&&(e[s]=i)}),e),{})}function ce(r){const e=ie(r);return Math.sqrt([.299,.587,.114].reduce((s,n,i)=>{const a=parseInt(e.slice(1+i*2,1+(i+1)*2),16);return s+a*a*n},0))<120}class E{constructor(e,t){this.state=e,this.ee=t}internalSet(e,t){return this.state[e]===t||t===void 0?!1:(this.state[e]=t,this.ee.emit(`change:${e}`,t),!0)}clone(){return{...this.state}}set(e,t){let s=!1;if(typeof e=="string")s=this.internalSet(e,t);else for(const n in e)this.internalSet(n,e[n])&&(s=!0);s&&this.ee.emit("change")}get(e){return this.state[e]}}function P(r,e){return t=>q(e[t],r)}class Te{constructor(e,t,s=d){o(this,"ee",new w);o(this,"state");o(this,"on",(e,t)=>e==="click"?y("back_button_pressed",t):this.ee.on(e,t));o(this,"off",(e,t)=>e==="click"?A("back_button_pressed",t):this.ee.off(e,t));o(this,"supports");this.postEvent=s,this.state=new E({isVisible:e},this.ee),this.supports=P(t,{show:"web_app_setup_back_button",hide:"web_app_setup_back_button"})}set isVisible(e){this.state.set("isVisible",e),this.postEvent("web_app_setup_back_button",{is_visible:e})}get isVisible(){return this.state.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}class Ie{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));this.postEvent=t,this.state=new E({isConfirmationNeeded:e},this.ee)}set isConfirmationNeeded(e){this.state.set("isConfirmationNeeded",e),this.postEvent("web_app_setup_closing_behavior",{need_confirmation:e})}get isConfirmationNeeded(){return this.state.get("isConfirmationNeeded")}disableConfirmation(){this.isConfirmationNeeded=!1}enableConfirmation(){this.isConfirmationNeeded=!0}}function Vt(r){if(Array.isArray(r))return r;if(typeof r=="string")try{const e=JSON.parse(r);if(Array.isArray(e))return e}catch{}throw T()}class Rt extends J{constructor(t,s,n){super(Vt,s,n);o(this,"itemParser");this.itemParser=typeof t=="function"?t:t.parse.bind(t)}parse(t){const s=super.parse(t);return s===void 0?s:s.map(this.itemParser)}of(t){return this.itemParser=typeof t=="function"?t:t.parse.bind(t),this}}function Le(r){return new Rt(e=>e,!1,r)}function me(r,e){return r.reduce((t,s)=>(t[s]=e,t),{})}class Be{constructor(e,t,s=d){o(this,"supports");this.createRequestId=t,this.postEvent=s,this.supports=P(e,{delete:"web_app_invoke_custom_method",get:"web_app_invoke_custom_method",getKeys:"web_app_invoke_custom_method",set:"web_app_invoke_custom_method"})}async delete(e,t={}){const s=Array.isArray(e)?e:[e];s.length!==0&&await R("deleteStorageValues",{keys:s},this.createRequestId(),{...t,postEvent:this.postEvent})}async getKeys(e={}){const t=await R("getStorageKeys",{},this.createRequestId(),{...e,postEvent:this.postEvent});return Le().of(h()).parse(t)}async get(e,t={}){const s=Array.isArray(e)?e:[e];if(s.length===0)return me(s,"");const n=f(me(s,h())),i=await R("getStorageValues",{keys:s},this.createRequestId(),{...t,postEvent:this.postEvent}).then(a=>n.parse(a));return Array.isArray(e)?i:i[e]}async set(e,t,s={}){await R("saveStorageValue",{key:e,value:t},this.createRequestId(),{...s,postEvent:this.postEvent})}}class $e{constructor(e,t=d){o(this,"supports");this.postEvent=t,this.supports=P(e,{impactOccurred:"web_app_trigger_haptic_feedback",notificationOccurred:"web_app_trigger_haptic_feedback",selectionChanged:"web_app_trigger_haptic_feedback"})}impactOccurred(e){this.postEvent("web_app_trigger_haptic_feedback",{type:"impact",impact_style:e})}notificationOccurred(e){this.postEvent("web_app_trigger_haptic_feedback",{type:"notification",notification_type:e})}selectionChanged(){this.postEvent("web_app_trigger_haptic_feedback",{type:"selection_change"})}}function De(){return f({id:k(),type:h(),title:h(),photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"Chat")}class Oe{constructor(e){this.initData=e}get authDate(){return this.initData.authDate}get canSendAfter(){return this.initData.canSendAfter}get canSendAfterDate(){const{canSendAfter:e}=this;return e===void 0?void 0:new Date(this.authDate.getTime()+e*1e3)}get chat(){return this.initData.chat}get chatType(){return this.initData.chatType}get chatInstance(){return this.initData.chatInstance}get hash(){return this.initData.hash}get queryId(){return this.initData.queryId}get receiver(){return this.initData.receiver}get startParam(){return this.initData.startParam}get user(){return this.initData.user}}function te(){return f({addedToAttachmentMenu:{type:C().optional(),from:"added_to_attachment_menu"},allowsWriteToPm:{type:C().optional(),from:"allows_write_to_pm"},firstName:{type:h(),from:"first_name"},id:k(),isBot:{type:C().optional(),from:"is_bot"},isPremium:{type:C().optional(),from:"is_premium"},languageCode:{type:h().optional(),from:"language_code"},lastName:{type:h().optional(),from:"last_name"},photoUrl:{type:h().optional(),from:"photo_url"},username:h().optional()},"User")}const he=I(r=>r instanceof Date?r:new Date(k().parse(r)*1e3),"Date");function Z(r,e){return new J(t=>{if(typeof t!="string"&&!(t instanceof URLSearchParams))throw T();const s=typeof t=="string"?new URLSearchParams(t):t;return xe(r,n=>{const i=s.get(n);return i===null?void 0:i})},!1,e)}function ue(){return Z({authDate:{type:he(),from:"auth_date"},canSendAfter:{type:k().optional(),from:"can_send_after"},chat:De().optional(),chatInstance:{type:h().optional(),from:"chat_instance"},chatType:{type:h().optional(),from:"chat_type"},hash:h(),queryId:{type:h().optional(),from:"query_id"},receiver:te().optional(),startParam:{type:h().optional(),from:"start_param"},user:te().optional()},"InitData")}function Tt(r){return ue().parse(r)}function It(r){const{hostname:e,pathname:t}=new URL(r,window.location.href);if(e!=="t.me")throw new Error(`Incorrect hostname: ${e}`);const s=t.match(/^\/(\$|invoice\/)([A-Za-z0-9\-_=]+)$/);if(s===null)throw new Error('Link pathname has incorrect format. Expected to receive "/invoice/{slug}" or "/${slug}"');return s[2]}class Ne{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");this.postEvent=t,this.state=new E({isOpened:!1},this.ee),this.supports=P(e,{open:"web_app_open_invoice"})}set isOpened(e){this.state.set("isOpened",e)}get isOpened(){return this.state.get("isOpened")}async open(e,t){if(this.isOpened)throw new Error("Invoice is already opened");const s=t?It(e):e;this.isOpened=!0;try{return(await m("web_app_open_invoice","invoice_closed",{params:{slug:s},postEvent:this.postEvent,capture(i){return s===i.slug}})).status}finally{this.isOpened=!1}}}class He{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"postEvent");o(this,"on",(e,t)=>e==="click"?y("main_button_pressed",t):this.ee.on(e,t));o(this,"off",(e,t)=>e==="click"?A("main_button_pressed",t):this.ee.off(e,t));const{postEvent:t=d,text:s,textColor:n,backgroundColor:i,isEnabled:a,isVisible:c,isLoaderVisible:u}=e;this.postEvent=t,this.state=new E({backgroundColor:i,isEnabled:a,isVisible:c,isLoaderVisible:u,text:s,textColor:n},this.ee)}commit(){this.text!==""&&this.postEvent("web_app_setup_main_button",{is_visible:this.isVisible,is_active:this.isEnabled,is_progress_visible:this.isLoaderVisible,text:this.text,color:this.backgroundColor,text_color:this.textColor})}set isEnabled(e){this.setParams({isEnabled:e})}get isEnabled(){return this.state.get("isEnabled")}set isLoaderVisible(e){this.setParams({isLoaderVisible:e})}get isLoaderVisible(){return this.state.get("isLoaderVisible")}set isVisible(e){this.setParams({isVisible:e})}get isVisible(){return this.state.get("isVisible")}get backgroundColor(){return this.state.get("backgroundColor")}get text(){return this.state.get("text")}get textColor(){return this.state.get("textColor")}disable(){return this.isEnabled=!1,this}enable(){return this.isEnabled=!0,this}hide(){return this.isVisible=!1,this}hideLoader(){return this.isLoaderVisible=!1,this}show(){return this.isVisible=!0,this}showLoader(){return this.isLoaderVisible=!0,this}setText(e){return this.setParams({text:e})}setTextColor(e){return this.setParams({textColor:e})}setBackgroundColor(e){return this.setParams({backgroundColor:e})}setParams(e){return this.state.set(e),this.commit(),this}}const Lt=Z({contact:f({userId:{type:k(),from:"user_id"},phoneNumber:{type:h(),from:"phone_number"},firstName:{type:h(),from:"first_name"},lastName:{type:h().optional(),from:"last_name"}}),authDate:{type:he(),from:"auth_date"},hash:h()});function We(r,e){return t=>{const[s,n]=e[t];return q(s,n,r)}}function Bt(r){return new Promise(e=>{setTimeout(e,r)})}class Me{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"botInline");o(this,"postEvent");o(this,"createRequestId");o(this,"requestingPhoneAccess",!1);o(this,"requestingWriteAccess",!1);o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");o(this,"supportsParam");const{postEvent:t=d,headerColor:s,backgroundColor:n,version:i,botInline:a,createRequestId:c}=e,u=P(i,{requestPhoneAccess:"web_app_request_phone",requestWriteAccess:"web_app_request_write_access",switchInlineQuery:"web_app_switch_inline_query",setHeaderColor:"web_app_set_header_color",setBackgroundColor:"web_app_set_background_color"});this.postEvent=t,this.botInline=a,this.createRequestId=c,this.supports=p=>!(!u(p)||p==="switchInlineQuery"&&!a),this.state=new E({backgroundColor:n,headerColor:s},this.ee),this.supportsParam=We(i,{"setHeaderColor.color":["web_app_set_header_color","color"]})}async getRequestedContact(){return R("getRequestedContact",{},this.createRequestId(),{postEvent:this.postEvent,timeout:1e4}).then(e=>Lt.parse(e))}get backgroundColor(){return this.state.get("backgroundColor")}close(){this.postEvent("web_app_close")}get headerColor(){return this.state.get("headerColor")}get isBotInline(){return this.botInline}get isDark(){return ce(this.backgroundColor)}get isRequestingPhoneAccess(){return this.requestingPhoneAccess}get isRequestingWriteAccess(){return this.requestingWriteAccess}ready(){this.postEvent("web_app_ready")}async requestContact({timeout:e=5e3}={}){try{return await this.getRequestedContact()}catch{}if(await this.requestPhoneAccess()!=="sent")throw new Error("Access denied.");const s=Date.now()+e;let n=50;return ae(async()=>{for(;Date.now()<s;){try{return await this.getRequestedContact()}catch{}await Bt(n),n+=50}throw new Error("Unable to retrieve requested contact.")},e)}requestPhoneAccess(e={}){if(this.requestingPhoneAccess)throw new Error("Phone access is already being requested.");return this.requestingPhoneAccess=!0,m("web_app_request_phone","phone_requested",{...e,postEvent:this.postEvent}).then(t=>t.status).finally(()=>{this.requestingPhoneAccess=!1})}requestWriteAccess(e={}){if(this.requestingWriteAccess)throw new Error("Write access is already being requested.");return this.requestingWriteAccess=!0,m("web_app_request_write_access","write_access_requested",{...e,postEvent:this.postEvent}).then(t=>t.status).finally(()=>{this.requestingWriteAccess=!1})}sendData(e){const{size:t}=new Blob([e]);if(t===0||t>4096)throw new Error(`Passed data has incorrect size: ${t}`);this.postEvent("web_app_data_send",{data:e})}setHeaderColor(e){this.postEvent("web_app_set_header_color",Q(e)?{color:e}:{color_key:e}),this.state.set("headerColor",e)}setBackgroundColor(e){this.postEvent("web_app_set_background_color",{color:e}),this.state.set("backgroundColor",e)}switchInlineQuery(e,t=[]){if(!this.supports("switchInlineQuery")&&!this.isBotInline)throw new Error("Method is unsupported because Mini App should be launched in inline mode.");this.postEvent("web_app_switch_inline_query",{query:e,chat_types:t})}}function $t(r){const e=r.message.trim(),t=(r.title||"").trim(),s=r.buttons||[];let n;if(t.length>64)throw new Error(`Title has incorrect size: ${t.length}`);if(e.length===0||e.length>256)throw new Error(`Message has incorrect size: ${e.length}`);if(s.length>3)throw new Error(`Buttons have incorrect size: ${s.length}`);return s.length===0?n=[{type:"close",id:""}]:n=s.map(i=>{const{id:a=""}=i;if(a.length>64)throw new Error(`Button ID has incorrect size: ${a}`);if(i.type===void 0||i.type==="default"||i.type==="destructive"){const c=i.text.trim();if(c.length===0||c.length>64){const u=i.type||"default";throw new Error(`Button text with type "${u}" has incorrect size: ${i.text.length}`)}return{...i,text:c,id:a}}return{...i,id:a}}),{title:t,message:e,buttons:n}}class Ue{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");this.postEvent=t,this.state=new E({isOpened:!1},this.ee),this.supports=P(e,{open:"web_app_open_popup"})}set isOpened(e){this.state.set("isOpened",e)}get isOpened(){return this.state.get("isOpened")}open(e){if(this.isOpened)throw new Error("Popup is already opened.");return this.isOpened=!0,m("web_app_open_popup","popup_closed",{postEvent:this.postEvent,params:$t(e)}).then(({button_id:t=null})=>t).finally(()=>{this.isOpened=!1})}}class Ge{constructor(e,t=d){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));o(this,"supports");this.postEvent=t,this.state=new E({isOpened:!1},this.ee),this.supports=P(e,{close:"web_app_close_scan_qr_popup",open:"web_app_open_scan_qr_popup"})}close(){this.postEvent("web_app_close_scan_qr_popup"),this.isOpened=!1}set isOpened(e){this.state.set("isOpened",e)}get isOpened(){return this.state.get("isOpened")}async open(e){if(this.isOpened)throw new Error("QR scanner is already opened.");this.isOpened=!0;try{const t=await m("web_app_open_scan_qr_popup",["qr_text_received","scan_qr_popup_closed"],{postEvent:this.postEvent,params:{text:e}});return typeof t=="object"&&typeof t.data=="string"?t.data:null}finally{this.isOpened=!1}}}class je{constructor(e,t,s=d){o(this,"ee",new w);o(this,"state");o(this,"on",(e,t)=>e==="click"?y("settings_button_pressed",t):this.ee.on(e,t));o(this,"off",(e,t)=>e==="click"?A("settings_button_pressed",t):this.ee.off(e,t));o(this,"supports");this.postEvent=s,this.state=new E({isVisible:e},this.ee),this.supports=P(t,{show:"web_app_setup_settings_button",hide:"web_app_setup_settings_button"})}set isVisible(e){this.state.set("isVisible",e),this.postEvent("web_app_setup_settings_button",{is_visible:e})}get isVisible(){return this.state.get("isVisible")}hide(){this.isVisible=!1}show(){this.isVisible=!0}}function Dt(r){return r.replace(/(^|_)bg/,(e,t)=>`${t}background`).replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}function Ot(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`).replace(/(^|_)background/,(e,t)=>`${t}bg`)}const pe=I(r=>{const e=oe().optional();return Object.entries(ne(r)).reduce((t,[s,n])=>(t[Dt(s)]=e.parse(n),t),{})},"ThemeParams");function le(r){return pe().parse(r)}function Nt(r){return m("web_app_request_theme","theme_changed",r).then(le)}function Fe(r){return JSON.stringify(Object.entries(r).reduce((e,[t,s])=>(s&&(e[Ot(t)]=s),e),{}))}class ze{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));this.state=new E(e,this.ee)}get accentTextColor(){return this.get("accentTextColor")}get backgroundColor(){return this.get("backgroundColor")}get buttonColor(){return this.get("buttonColor")}get buttonTextColor(){return this.get("buttonTextColor")}get destructiveTextColor(){return this.get("destructiveTextColor")}get(e){return this.state.get(e)}getState(){return this.state.clone()}get headerBackgroundColor(){return this.get("headerBackgroundColor")}get hintColor(){return this.get("hintColor")}get isDark(){return!this.backgroundColor||ce(this.backgroundColor)}get linkColor(){return this.get("linkColor")}get secondaryBackgroundColor(){return this.get("secondaryBackgroundColor")}get sectionBackgroundColor(){return this.get("sectionBackgroundColor")}get sectionHeaderTextColor(){return this.get("sectionHeaderTextColor")}listen(){return y("theme_changed",e=>{this.state.set(le(e.theme_params))})}get subtitleTextColor(){return this.get("subtitleTextColor")}get textColor(){return this.get("textColor")}}class Je{constructor(e,t,s=d){o(this,"supports");o(this,"supportsParam");this.version=e,this.createRequestId=t,this.postEvent=s,this.supports=P(e,{readTextFromClipboard:"web_app_read_text_from_clipboard"}),this.supportsParam=We(e,{"openLink.tryInstantView":["web_app_open_link","try_instant_view"]})}openLink(e,t){const s=new URL(e,window.location.href).toString();if(!q("web_app_open_link",this.version)){window.open(s,"_blank");return}this.postEvent("web_app_open_link",{url:s,...typeof t=="boolean"?{try_instant_view:t}:{}})}openTelegramLink(e){const{hostname:t,pathname:s,search:n}=new URL(e,window.location.href);if(t!=="t.me")throw new Error(`URL has not allowed hostname: ${t}. Only "t.me" is allowed`);if(!q("web_app_open_tg_link",this.version)){window.location.href=e;return}this.postEvent("web_app_open_tg_link",{path_full:s+n})}async readTextFromClipboard(){const e=this.createRequestId(),{data:t=null}=await m("web_app_read_text_from_clipboard","clipboard_text_received",{postEvent:this.postEvent,params:{req_id:e},capture:ke(e)});return t}}function Qe(r){return["macos","tdesktop","unigram","web","weba"].includes(r)}async function de(r){const e=await m("web_app_request_viewport","viewport_changed",r);return{height:e.height,width:e.width,isExpanded:e.is_expanded,isStateStable:e.is_state_stable}}function $(r){return r<0?0:r}class Ze{constructor(e){o(this,"ee",new w);o(this,"state");o(this,"postEvent");o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee));const{height:t,isExpanded:s,width:n,stableHeight:i,postEvent:a=d}=e;this.postEvent=a,this.state=new E({height:$(t),isExpanded:s,stableHeight:$(i),width:$(n)},this.ee)}sync(e){return de(e).then(({height:t,isExpanded:s,width:n,isStateStable:i})=>{this.state.set({height:t,width:n,isExpanded:s,stableHeight:i?t:this.state.get("stableHeight")})})}get height(){return this.state.get("height")}get stableHeight(){return this.state.get("stableHeight")}listen(){return y("viewport_changed",e=>{const{height:t,width:s,is_expanded:n,is_state_stable:i}=e,a={height:$(t),isExpanded:n,width:$(s)};i&&(a.stableHeight=a.height),this.state.set(a)})}get isExpanded(){return this.state.get("isExpanded")}get width(){return this.state.get("width")}expand(){this.postEvent("web_app_expand"),this.state.set("isExpanded",!0)}get isStable(){return this.stableHeight===this.height}}function v(r,e){document.documentElement.style.setProperty(r,e)}function Ke(r,e){const t=()=>{v("--tg-background-color",r.backgroundColor)},s=()=>{const{backgroundColor:n,secondaryBackgroundColor:i}=e;if(Q(r.headerColor)){v("--tg-header-color",r.headerColor);return}if(r.headerColor==="bg_color"&&n){v("--tg-header-color",n);return}r.headerColor==="secondary_bg_color"&&i&&v("--tg-header-color",i)};e.on("change",s),r.on("change:backgroundColor",t),r.on("change:headerColor",s),t(),s()}function Ye(r){const e=()=>{const t=r.getState();Object.entries(t).forEach(([s,n])=>{if(n){const i=s.replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`);v(`--tg-theme-${i}`,n)}})};r.on("change",e),e()}function re(r){const e=()=>v("--tg-viewport-height",`${r.height}px`),t=()=>v("--tg-viewport-width",`${r.width}px`),s=()=>v("--tg-viewport-stable-height",`${r.stableHeight}px`);r.on("change:height",e),r.on("change:width",t),r.on("change:stableHeight",s),e(),t(),s()}function Ht(){const r=document.createElement("style");r.id="telegram-custom-styles",document.head.appendChild(r),y("set_custom_style",e=>{r.innerHTML=e})}function Xe(r){return`telegram-mini-apps-${r}`}function L(r,e){sessionStorage.setItem(Xe(r),JSON.stringify(e))}function B(r){const e=sessionStorage.getItem(Xe(r));return e?JSON.parse(e):null}function Wt(r,e,t){const{isVisible:s=!1}=r?B("back-button")||{}:{},n=new Te(s,e,t);return n.on("change",()=>{L("back-button",{isVisible:n.isVisible})}),n}function Mt(r,e){const{isConfirmationNeeded:t=!1}=r?B("closing-behavior")||{}:{},s=new Ie(t,e);return s.on("change",()=>L("closing-behavior",{isConfirmationNeeded:s.isConfirmationNeeded})),s}function Ut(r,e,t,s){const{backgroundColor:n=e,isEnabled:i=!1,isVisible:a=!1,isLoaderVisible:c=!1,textColor:u=t,text:p=""}=r?B("main-button")||{}:{},g=new He({backgroundColor:n,isEnabled:i,isLoaderVisible:c,isVisible:a,postEvent:s,text:p,textColor:u}),_=()=>L("main-button",{backgroundColor:g.backgroundColor,isEnabled:g.isEnabled,isLoaderVisible:g.isLoaderVisible,isVisible:g.isVisible,text:g.text,textColor:g.textColor});return g.on("change",_),g}function Gt(r,e,t,s,n,i){const{backgroundColor:a=e,headerColor:c="bg_color"}=r?B("mini-app")||{}:{},u=new Me({headerColor:c,backgroundColor:a,version:t,botInline:s,createRequestId:n,postEvent:i}),p=()=>L("mini-app",{backgroundColor:u.backgroundColor,headerColor:u.headerColor});return u.on("change",p),u}function jt(){let r=0;return()=>(r+=1,r.toString())}function Ft(r,e,t){const{isVisible:s=!1}=r?B("settings-button")||{}:{},n=new je(s,e,t);return n.on("change",()=>{L("settings-button",{isVisible:n.isVisible})}),n}function zt(r){const e=new ze(r);return e.listen(),e}function j(r){const e=new Ze(r);return e.on("change",()=>L("viewport",{height:e.height,isExpanded:e.isExpanded,stableHeight:e.stableHeight,width:e.width})),e.listen(),e}function Jt(r,e,t,s){const n=r?B("viewport"):null;if(n)return j({...n,postEvent:t});if(Qe(e))return j({height:window.innerHeight,isExpanded:!0,postEvent:t,stableHeight:window.innerHeight,width:window.innerWidth});if(s)return de({postEvent:t,timeout:5e3}).then(({height:a,isStateStable:c,...u})=>j({...u,height:a,stableHeight:c?a:0}));const i=j({width:0,height:0,isExpanded:!1,postEvent:t,stableHeight:0});return i.sync({postEvent:t,timeout:5e3}).catch(a=>{console.error("Unable to actualize viewport state",a)}),i}function Qt(r){return typeof r=="object"?r:r?{themeParams:!0,viewport:!0,miniApp:!0}:{}}function ye(r,e,t,s){const n=Qt(r);n.miniApp&&Ke(e,t),n.themeParams&&Ye(t),n.viewport&&(s instanceof Promise?s.then(re):re(s))}function et(){return Z({botInline:{type:C().optional(),from:"tgWebAppBotInline"},initData:{type:ue().optional(),from:"tgWebAppData"},initDataRaw:{type:h().optional(),from:"tgWebAppData"},platform:{type:h(),from:"tgWebAppPlatform"},showSettings:{type:C().optional(),from:"tgWebAppShowSettings"},startParam:{type:h().optional(),from:"tgWebAppStartParam"},themeParams:{type:pe(),from:"tgWebAppThemeParams"},version:{type:h(),from:"tgWebAppVersion"}},"LaunchParams")}function fe(r){return et().parse(r)}function tt(r){const e=r.includes("?")?r.replace("#","&").slice(r.indexOf("?")+1):r.slice(r.indexOf("#")+1);return fe(e)}function Zt(){return tt(window.location.href)}function rt(){return performance.getEntriesByType("navigation")[0]}function Kt(){const r=rt();if(!r)throw new Error("Unable to get first navigation entry.");return tt(r.name)}function st(r){const{initDataRaw:e,themeParams:t,platform:s,version:n,showSettings:i,startParam:a,botInline:c}=r,u=new URLSearchParams;return e&&u.set("tgWebAppData",e),u.set("tgWebAppPlatform",s),u.set("tgWebAppThemeParams",Fe(t)),u.set("tgWebAppVersion",n),a&&u.set("tgWebAppStartParam",n),typeof i=="boolean"&&u.set("tgWebAppShowSettings",i?"1":"0"),typeof c=="boolean"&&u.set("tgWebAppBotInline",c?"1":"0"),u.toString()}const nt="telegram-mini-apps-launch-params";function Yt(){return fe(sessionStorage.getItem(nt)||"")}function Xt(r){sessionStorage.setItem(nt,st(r))}function K(){const r=[];for(const e of[Zt,Kt,Yt])try{const t=e();return Xt(t),t}catch(t){r.push(t)}throw x.error("Unable to extract launch parameters. Received errors:",r),new Error("Unable to retrieve launch parameters from any known source.")}function ge(){var r;return((r=rt())==null?void 0:r.type)==="reload"}function er(r={}){const{async:e=!1,complete:t=e,cssVars:s=!1,acceptCustomStyles:n=!1}=r;try{const{initData:i,initDataRaw:a,version:c,platform:u,themeParams:p,botInline:g=!1}=K(),_=ge(),b=jt(),l=Se(c);se()&&(n&&Ht(),l("iframe_ready",{reload_supported:!0}),y("reload_iframe",()=>{l("iframe_will_reload"),window.location.reload()}));const V={backButton:Wt(_,c,l),closingBehavior:Mt(_,l),cloudStorage:new Be(c,b,l),createRequestId:b,hapticFeedback:new $e(c,l),invoice:new Ne(c,l),mainButton:Ut(_,p.buttonColor||"#000000",p.buttonTextColor||"#ffffff",l),miniApp:Gt(_,p.backgroundColor||"#ffffff",c,g,b,l),popup:new Ue(c,l),postEvent:l,qrScanner:new Ge(c,l),settingsButton:Ft(_,c,l),themeParams:zt(p),utils:new Je(c,b,l),...i?{initData:new Oe(i),initDataRaw:a}:{}},G=Jt(_,u,l,t);return G instanceof Promise||t?Promise.resolve(G).then(_e=>(ye(s,V.miniApp,V.themeParams,_e),{...V,viewport:_e})):(ye(s,V.miniApp,V.themeParams,G),{...V,viewport:G})}catch(i){if(t)return Promise.reject(i);throw i}}function tr(){return{launchParams:K(),isPageReload:ge()}}function rr(){try{return K(),!0}catch{return!1}}function sr(r){const e=r.match(/#(.+)/);return e?e[1]:null}async function O(r){return r===0?!0:Promise.race([new Promise(e=>{window.addEventListener("popstate",function t(){window.removeEventListener("popstate",t),e(!0)}),window.history.go(r)}),new Promise(e=>{setTimeout(e,50,!1)})])}async function nr(){if(window.history.length<=1||(window.history.pushState(null,""),await O(1-window.history.length)))return;let e=await O(-1);for(;e;)e=await O(-1)}function D(r,e){return r.startsWith(e)?r:`${e}${r}`}class it{constructor(e,t,{debug:s=!1,loggerPrefix:n="Navigator"}){o(this,"logger");o(this,"entries");if(this.entriesCursor=t,e.length===0)throw new Error("Entries list should not be empty.");if(t>=e.length)throw new Error("Cursor should be less than entries count.");this.entries=e.map(({pathname:i="",search:a,hash:c})=>{if(!i.startsWith("/")&&i.length>0)throw new Error('Pathname should start with "/"');return{pathname:D(i,"/"),search:a?D(a,"?"):"",hash:c?D(c,"#"):""}}),this.logger=new Ce(`[${n}]`,s)}formatEntry(e){let t;if(typeof e=="string")t=e;else{const{pathname:a="",search:c,hash:u}=e;t=a+(c?D(c,"?"):"")+(u?D(u,"#"):"")}const{pathname:s,search:n,hash:i}=new URL(t,`https://localhost${this.path}`);return{pathname:s,search:n,hash:i}}get entry(){return this.entries[this.entriesCursor]}back(){return this.go(-1)}get cursor(){return this.entriesCursor}get canGoBack(){return this.entriesCursor>0}get canGoForward(){return this.entriesCursor!==this.entries.length-1}forward(){return this.go(1)}go(e){this.logger.log(`called go(${e})`);const t=Math.min(this.entries.length-1,Math.max(this.entriesCursor+e,0));if(this.entriesCursor===t)return this.performGo({updated:!1,delta:e});const s=this.entry;this.entriesCursor=t;const n=this.entry;return this.logger.log("State changed",{before:s,after:n}),this.performGo({updated:!0,delta:e,before:s,after:n})}getEntries(){return this.entries.map(e=>({...e}))}get hash(){return this.entry.hash}push(e){this.entriesCursor!==this.entries.length-1&&this.entries.splice(this.entriesCursor+1);const t=this.formatEntry(e),s=this.entry;this.entriesCursor+=1,this.entries[this.entriesCursor]=t;const n=this.entry;return this.logger.log("State changed",{before:s,after:n}),this.performPush({before:s,after:n})}get path(){return`${this.pathname}${this.search}${this.hash}`}get pathname(){return this.entry.pathname}replace(e){const t=this.formatEntry(e);if(this.search===t.search&&this.pathname===t.pathname&&this.hash===t.hash)return this.performReplace({updated:!1,entry:t});const s=this.entry;this.entries[this.entriesCursor]=t;const n=this.entry;return this.logger.log("State changed",{before:s,after:n}),this.performReplace({updated:!0,before:s,after:n})}get search(){return this.entry.search}}const Ee=0,X=1,ee=2;class we extends it{constructor(t,s,n={}){super(t,s,{...n,loggerPrefix:"HashNavigator"});o(this,"ee",new w);o(this,"attached",!1);o(this,"onPopState",async({state:t})=>{if(this.logger.log('"popstate" event received. State:',t),t===null)return this.push(window.location.hash.slice(1));if(t===Ee){this.logger.log("Void reached. Moving history forward"),window.history.forward();return}if(t===X)return this.back();if(t===ee)return this.forward()});o(this,"back",()=>super.back());o(this,"on",this.ee.on.bind(this.ee));o(this,"off",this.ee.off.bind(this.ee))}static fromLocation(t){const{search:s,pathname:n,hash:i}=new URL(window.location.hash.slice(1),window.location.href);return new we([{search:s,pathname:n,hash:i}],0,t)}async performGo(t){t.updated&&(this.attached&&await this.syncHistory(),this.emitChanged(t.before,t.after))}async performPush({before:t,after:s}){this.attached&&await this.syncHistory(),this.emitChanged(t,s)}async performReplace(t){t.updated&&(this.attached&&window.history.replaceState(null,"",`#${this.path}`),this.emitChanged(t.before,t.after))}async syncHistory(){window.removeEventListener("popstate",this.onPopState);const t=`#${this.path}`;await nr(),d("web_app_setup_back_button",{is_visible:this.canGoBack}),this.canGoBack&&this.canGoForward?(this.logger.log("Setting up history: [<-, *, ->]"),window.history.replaceState(X,""),window.history.pushState(null,"",t),window.history.pushState(ee,""),await O(-1)):this.canGoBack?(this.logger.log("Setting up history: [<-, *]"),window.history.replaceState(X,""),window.history.pushState(null,"",t)):this.canGoForward?(this.logger.log("Setting up history: [*, ->]"),window.history.replaceState(null,t),window.history.pushState(ee,""),await O(-1)):(this.logger.log("Setting up history: [~, *]"),window.history.replaceState(Ee,""),window.history.pushState(null,"",t)),window.addEventListener("popstate",this.onPopState)}emitChanged(t,s){this.ee.emit("change",{navigator:this,from:t,to:s})}async attach(){if(!this.attached)return this.logger.log("Attaching",this),this.attached=!0,y("back_button_pressed",this.back),this.syncHistory()}detach(){this.attached&&(this.logger.log("Detaching",this),this.attached=!1,window.removeEventListener("popstate",this.onPopState),A("back_button_pressed",this.back))}}function ir(r){return r instanceof U}exports.BackButton=Te;exports.ClosingBehavior=Ie;exports.CloudStorage=Be;exports.HapticFeedback=$e;exports.HashNavigator=we;exports.InitData=Oe;exports.Invoice=Ne;exports.MainButton=He;exports.MethodUnsupportedError=F;exports.MiniApp=Me;exports.Navigator=it;exports.ParameterUnsupportedError=z;exports.ParseError=W;exports.ParseSchemaFieldError=N;exports.Popup=Ue;exports.QRScanner=Ge;exports.SettingsButton=je;exports.ThemeParams=ze;exports.TimeoutError=U;exports.Utils=Je;exports.Viewport=Ze;exports.array=Le;exports.bindMiniAppCSSVars=Ke;exports.bindThemeCSSVars=Ye;exports.bindViewportCSSVars=re;exports.boolean=C;exports.chatParser=De;exports.classNames=Re;exports.compareVersions=Pe;exports.createPostEvent=Se;exports.date=he;exports.getHash=sr;exports.init=er;exports.initDataParser=ue;exports.invokeCustomMethod=R;exports.isColorDark=ce;exports.isIframe=se;exports.isPageReload=ge;exports.isRGB=Q;exports.isRGBShort=Ae;exports.isRecord=H;exports.isStableViewportPlatform=Qe;exports.isTMA=rr;exports.isTimeoutError=ir;exports.json=f;exports.launchParamsParser=et;exports.mergeClassNames=At;exports.number=k;exports.off=A;exports.on=y;exports.once=xt;exports.parseInitData=Tt;exports.parseLaunchParams=fe;exports.parseMessage=qe;exports.parseThemeParams=le;exports.postEvent=d;exports.request=m;exports.requestThemeParams=Nt;exports.requestViewport=de;exports.retrieveLaunchData=tr;exports.retrieveLaunchParams=K;exports.rgb=oe;exports.searchParams=Z;exports.serializeLaunchParams=st;exports.serializeThemeParams=Fe;exports.setCSSVar=v;exports.setDebug=ct;exports.setTargetOrigin=ht;exports.string=h;exports.subscribe=qt;exports.supports=q;exports.themeParamsParser=pe;exports.toRGB=ie;exports.unsubscribe=Ve;exports.userParser=te;exports.withTimeout=ae;