UNPKG

biketag-vue

Version:

<h1 align=center>BikeTag-Vue</h1> <div align="center"> <img alt="biketag-vue logo" src="https://raw.githubusercontent.com/keneucker/biketag-website/production/public/img/Tag-Logo-Stacked-V2-medium.png" height="auto" width="200" style="border-radius:25%;">

1,317 lines 1.21 MB
var ac = Object.defineProperty; var qc = (M, z, b) => z in M ? ac(M, z, { enumerable: !0, configurable: !0, writable: !0, value: b }) : M[z] = b; var T1 = (M, z, b) => qc(M, typeof z != "symbol" ? z + "" : z, b); import { reactive as ic, computed as z1, createElementBlock as L1, openBlock as q1, mergeProps as sc, createElementVNode as t1, toDisplayString as N2, renderSlot as Hz, normalizeClass as dc, normalizeStyle as t3, unref as Wc, createCommentVNode as Tz, createBlock as uc, getCurrentInstance as Gz, inject as fc, shallowRef as r3, ref as Q1, onBeforeMount as lc, watch as Xb, onMounted as Nc, onUnmounted as Rc, defineComponent as Vz, h as a3, createVNode as $2, Text as Lc, Fragment as q3, createTextVNode as xc } from "vue"; import a2 from "biketag"; import { defineStore as Bc } from "pinia"; import { useRouter as i3 } from "vue-router"; const t0 = { appId: "com.app.biketag", admingEmail: "biketag@biketag.org", gameName: "", host: "biketag.org", hostKey: "ItsABikeTagGame", logo: "/images/BikeTag.svg", jingle: "media/biketag-jingle-1.mp3", imageSource: "aws", gameSource: "sanity", store: "biketag", cacheResetInterval: "5000", manifest: { name: "BikeTag", shortName: "BikeTag", description: "BikeTag is a photo mystery tag game played on bicycles. No login required.", themeColor: "#000000" }, /// TODO: THIS IS BAD sanityImagesCDNUrl: "https://cdn.sanity.io/images/", sanityBaseCDNUrl: "https://cdn.sanity.io/images/x37ikhvs/production/", sanityPlayerRoleID: "rol_pcbQ68Q9L0yn1o3O", sanityAmbassadorRoleID: "rol_iET51vzIn8z6Utz0" }, E0 = { APP_ID: process.env.APP_ID ?? t0.appId ?? null, DEBUG_FE: process.env.DEBUG_FE ?? process.env.DEBUG_A ?? "false", CACHE_RESET_INTERVAL: process.env.CACHE_RESET_INTERVAL ?? t0.cacheResetInterval, CONTEXT: process.env.CONTEXT ?? null, ADMIN_EMAIL: process.env.ADMIN_EMAIL ?? t0.admingEmail, AMBASSADOR_ROLE: process.env.AMBASSADOR_ROLE ?? t0.sanityAmbassadorRoleID, PLAYER_ROLE: process.env.PLAYER_ROLE ?? t0.sanityPlayerRoleID, /* Auth0 Configuration */ A_AUDIENCE: process.env.A_AUDIENCE ?? null, A_CID: process.env.A_CID ?? null, A_DOMAIN: process.env.A_DOMAIN ?? null, A_M_CS: process.env.A_M_CS ?? null, A_M_CID: process.env.A_M_CID ?? null, /* Bugs Configuration */ B_KEY: process.env.B_KEY ?? process.env.CLIENT_KEY ?? null, /* BikeTag Configuration */ GAME_NAME: process.env.GAME_NAME ?? null, GAME_SOURCE: process.env.GAME_SOURCE ?? t0.gameSource, IMAGE_SOURCE: process.env.IMAGE_SOURCE ?? t0.imageSource, HOST: process.env.HOST ?? t0.host ?? null, BIKETAG_AUTHED: process.env.BIKETAG_AUTHED ?? null, /* Google Configuration */ G_AKEY: process.env.G_AKEY ?? process.env.GOOGLE_ACCESS_TOKEN ?? process.env.GOOGLE_API_KEY ?? null, // G_CID: process.env.G_CID ?? process.env.GOOGLE_CLIENT_ID ?? null, // G_CSECRET: process.env.G_CSECRET ?? process.env.GOOGLE_CLIENT_SECRET ?? null, // G_EMAIL: process.env.G_EMAIL ?? process.env.GOOGLE_EMAIL_ADDRESS ?? null, // G_PASS: process.env.G_PASS ?? process.env.GOOGLE_PASSWORD ?? null, // G_RTOKEN: process.env.G_RTOKEN ?? process.env.GOOGLE_REFRESH_TOKEN ?? null, /* Imgur Admin Configuration */ // IA_CID: process.env.IA_CID ?? process.env.IMGUR_ADMIN_CLIENT_ID ?? null, // IA_CSECRET: process.env.IA_CSECRET ?? process.env.IMGUR_ADMIN_CLIENT_SECRET ?? null, // IA_RTOKEN: process.env.IA_RTOKEN ?? process.env.IMGUR_ADMIN_REFRESH_TOKEN ?? null, // IA_TOKEN: process.env.IA_TOKEN ?? process.env.IMGUR_ADMIN_ACCESS_TOKEN ?? null, RA_FE_KEY: process.env.RA_FE_KEY ?? process.env.RA_FE_KEY ?? null, /* Imgur Configuration */ I_CID: process.env.I_CID ?? process.env.IMGUR_CLIENT_ID ?? null, // I_CSECRET: process.env.I_CSECRET ?? process.env.IMGUR_CLIENT_SECRET ?? null, I_RTOKEN: process.env.I_RTOKEN ?? process.env.IMGUR_REFRESH_TOKEN ?? null, I_TOKEN: process.env.I_TOKEN ?? process.env.IMGUR_ACCESS_TOKEN ?? null, /* Sanity Admin Configuration */ SA_CDN_URL: process.env.SA_CDN_URL ?? t0.sanityImagesCDNUrl, SA_DSET: process.env.SA_DSET ?? process.env.SANITY_ADMIN_DATASET ?? null, SA_PID: process.env.SA_PID ?? process.env.SANITY_ADMIN_PROJECT_ID ?? null, // SA_TOKEN: process.env.SA_TOKEN ?? process.env.SANITY_ADMIN_ACCESS_TOKEN ?? null, /* Sanity Configuration */ S_CURL: process.env.S_CURL ?? t0.sanityImagesCDNUrl ?? "", S_DSET: process.env.S_DSET ?? process.env.SANITY_DATASET ?? "", S_PID: process.env.S_PID ?? process.env.SANITY_PROJECT_ID ?? "", // S_TOKEN: process.env.S_TOKEN ?? process.env.SANITY_ACCESS_TOKEN ?? null, /* AWS S3 Configuration */ RELOAD_SW: process.env.RELOAD_SW ?? "false", S3_FE_AID: process.env.S3_FE_AID ?? process.env.S3_FE_ACCESS_ID ?? null, S3_FE_AKEY: process.env.S3_FE_AKEY ?? process.env.S3_FE_ACCESS_KEY ?? null, IMGUR_DELAY_NOTICE: process.env.IMGUR_DELAY_NOTICE ?? null, IMGUR_DELAY: process.env.IMGUR_DELAY ?? null }, gc = [ "\\+https:\\/\\/developers.google.com\\/\\+\\/web\\/snippet\\/", "googlebot", "baiduspider", "gurujibot", "yandexbot", "slurp", "msnbot", "bingbot", "facebookexternalhit", "linkedinbot", "twitterbot", "slackbot", "telegrambot", "applebot", "pingdom", "tumblr ", "Embedly", "spbot" ], hc = new RegExp("^.*(" + gc.join("|") + ").*$"); class jM { constructor(z = {}) { T1(this, "options"); T1(this, "version"); T1(this, "_Versions"); T1(this, "_Browsers"); T1(this, "_OS"); T1(this, "_Platform"); T1(this, "DefaultAgent"); T1(this, "Agent"); const b = { version: !1, language: !1, platform: !0, os: !0, pixelDepth: !0, colorDepth: !0, resolution: !1, isAuthoritative: !0, silkAccelerated: !0, isKindleFire: !0, isDesktop: !0, isMobile: !0, isTablet: !0, isWindows: !0, isLinux: !0, isLinux64: !0, isChromeOS: !0, isMac: !0, isiPad: !0, isiPhone: !0, isiPod: !0, isAndroid: !0, isSamsung: !0, isSmartTV: !0, isRaspberry: !0, isBlackberry: !0, isTouchScreen: !0, isOpera: !1, isIE: !1, isEdge: !1, isIECompatibilityMode: !1, isSafari: !1, isFirefox: !1, isWebkit: !1, isChrome: !1, isKonqueror: !1, isOmniWeb: !1, isSeaMonkey: !1, isFlock: !1, isAmaya: !1, isPhantomJS: !1, isEpiphany: !1, source: !1, cpuCores: !1 }; for (const p in z) z.hasOwnProperty(p) && typeof b[p] < "u" && (b[p] = z[p]); this.options = b, this.version = "1.0.0", this._Versions = { Edge: /Edge\/([\d\w\.\-]+)/i, Firefox: /firefox\/([\d\w\.\-]+)/i, IE: /msie\s([\d\.]+[\d])|trident\/\d+\.\d+;.*[rv:]+(\d+\.\d)/i, Chrome: /chrome\/([\d\w\.\-]+)/i, Chromium: /(?:chromium|crios)\/([\d\w\.\-]+)/i, Safari: /version\/([\d\w\.\-]+)/i, Opera: /version\/([\d\w\.\-]+)|OPR\/([\d\w\.\-]+)/i, Ps3: /([\d\w\.\-]+)\)\s*$/i, Psp: /([\d\w\.\-]+)\)?\s*$/i, Amaya: /amaya\/([\d\w\.\-]+)/i, SeaMonkey: /seamonkey\/([\d\w\.\-]+)/i, OmniWeb: /omniweb\/v([\d\w\.\-]+)/i, Flock: /flock\/([\d\w\.\-]+)/i, Epiphany: /epiphany\/([\d\w\.\-]+)/i, WinJs: /msapphost\/([\d\w\.\-]+)/i, PhantomJS: /phantomjs\/([\d\w\.\-]+)/i, UC: /UCBrowser\/([\d\w\.]+)/i }, this._Browsers = { Edge: /edge/i, Amaya: /amaya/i, Konqueror: /konqueror/i, Epiphany: /epiphany/i, SeaMonkey: /seamonkey/i, Flock: /flock/i, OmniWeb: /omniweb/i, Chromium: /chromium|crios/i, Chrome: /chrome/i, Safari: /safari/i, IE: /msie|trident/i, Opera: /opera|OPR/i, PS3: /playstation 3/i, PSP: /playstation portable/i, Firefox: /firefox/i, WinJs: /msapphost/i, PhantomJS: /phantomjs/i, UC: /UCBrowser/i }, this._OS = { Windows10: /windows nt 10\.0/i, Windows81: /windows nt 6\.3/i, Windows8: /windows nt 6\.2/i, Windows7: /windows nt 6\.1/i, UnknownWindows: /windows nt 6\.\d+/i, WindowsVista: /windows nt 6\.0/i, Windows2003: /windows nt 5\.2/i, WindowsXP: /windows nt 5\.1/i, Windows2000: /windows nt 5\.0/i, WindowsPhone8: /windows phone 8\./, OSXCheetah: /os x 10[._]0/i, OSXPuma: /os x 10[._]1(\D|$)/i, OSXJaguar: /os x 10[._]2/i, OSXPanther: /os x 10[._]3/i, OSXTiger: /os x 10[._]4/i, OSXLeopard: /os x 10[._]5/i, OSXSnowLeopard: /os x 10[._]6/i, OSXLion: /os x 10[._]7/i, OSXMountainLion: /os x 10[._]8/i, OSXMavericks: /os x 10[._]9/i, OSXYosemite: /os x 10[._]10/i, OSXElCapitan: /os x 10[._]11/i, OSXSierra: /os x 10[._]12/i, Mac: /os x/i, Linux: /linux/i, Linux64: /linux x86_64/i, ChromeOS: /cros/i, Wii: /wii/i, PS3: /playstation 3/i, PSP: /playstation portable/i, iPad: /\(iPad.*os (\d+)[._](\d+)/i, iPhone: /\(iPhone.*os (\d+)[._](\d+)/i, Bada: /Bada\/(\d+)\.(\d+)/i, Curl: /curl\/(\d+)\.(\d+)\.(\d+)/i }, this._Platform = { Windows: /windows nt/i, WindowsPhone: /windows phone/i, Mac: /macintosh/i, Linux: /linux/i, Wii: /wii/i, Playstation: /playstation/i, iPad: /ipad/i, iPod: /ipod/i, iPhone: /iphone/i, Android: /android/i, Blackberry: /blackberry/i, Samsung: /samsung/i, Curl: /curl/i }, this.Agent = this.DefaultAgent = { isAuthoritative: !0, isMobile: !1, isTablet: !1, isiPad: !1, isiPod: !1, isiPhone: !1, isAndroid: !1, isBlackberry: !1, isOpera: !1, isIE: !1, isEdge: !1, isIECompatibilityMode: !1, isSafari: !1, isFirefox: !1, isWebkit: !1, isChrome: !1, isKonqueror: !1, isOmniWeb: !1, isSeaMonkey: !1, isFlock: !1, isAmaya: !1, isPhantomJS: !1, isEpiphany: !1, isDesktop: !1, isWindows: !1, isLinux: !1, isLinux64: !1, isMac: !1, isChromeOS: !1, isBada: !1, isSamsung: !1, isRaspberry: !1, isBot: !1, isCurl: !1, isAndroidTablet: !1, isWinJs: !1, isKindleFire: !1, isSilk: !1, isCaptive: !1, isSmartTV: !1, isUC: !1, isTouchScreen: !1, silkAccelerated: !1, colorDepth: -1, pixelDepth: -1, resolution: [], cpuCores: -1, language: "unknown", browser: "unknown", version: "unknown", os: "unknown", platform: "unknown", geoIp: {}, source: "", hashInt: function(p) { let O = 0, c, o, e; if (p.length === 0) return O; for (c = 0, e = p.length; c < e; c++) o = p.charCodeAt(c), O = (O << 5) - O + o, O |= 0; return O; }, hashMD5: function(p) { function O(I, K) { return I << K | I >>> 32 - K; } function c(I, K) { let b0, a0, q0, T, D; return q0 = I & 2147483648, T = K & 2147483648, b0 = I & 1073741824, a0 = K & 1073741824, D = (I & 1073741823) + (K & 1073741823), b0 & a0 ? D ^ 2147483648 ^ q0 ^ T : b0 | a0 ? D & 1073741824 ? D ^ 3221225472 ^ q0 ^ T : D ^ 1073741824 ^ q0 ^ T : D ^ q0 ^ T; } function o(I, K, b0) { return I & K | ~I & b0; } function e(I, K, b0) { return I & b0 | K & ~b0; } function n(I, K, b0) { return I ^ K ^ b0; } function A(I, K, b0) { return K ^ (I | ~b0); } function t(I, K, b0, a0, q0, T, D) { return I = c(I, c(c(o(K, b0, a0), q0), D)), c(O(I, T), K); } function L(I, K, b0, a0, q0, T, D) { return I = c(I, c(c(e(K, b0, a0), q0), D)), c(O(I, T), K); } function r(I, K, b0, a0, q0, T, D) { return I = c(I, c(c(n(K, b0, a0), q0), D)), c(O(I, T), K); } function l(I, K, b0, a0, q0, T, D) { return I = c(I, c(c(A(K, b0, a0), q0), D)), c(O(I, T), K); } function x(I) { let K; const b0 = I.length, a0 = b0 + 8, T = ((a0 - a0 % 64) / 64 + 1) * 16, D = new Array(T - 1); let X = 0, F = 0; for (; F < b0; ) K = (F - F % 4) / 4, X = F % 4 * 8, D[K] = D[K] | I.charCodeAt(F) << X, F++; return K = (F - F % 4) / 4, X = F % 4 * 8, D[K] = D[K] | 128 << X, D[T - 2] = b0 << 3, D[T - 1] = b0 >>> 29, D; } function N(I) { let K = "", b0 = "", a0, q0; for (q0 = 0; q0 <= 3; q0++) a0 = I >>> q0 * 8 & 255, b0 = "0" + a0.toString(16), K = K + b0.substr(b0.length - 2, 2); return K; } function R(I) { I = I.replace(/\r\n/g, ` `); let K = ""; for (let b0 = 0; b0 < I.length; b0++) { const a0 = I.charCodeAt(b0); a0 < 128 ? K += String.fromCharCode(a0) : a0 > 127 && a0 < 2048 ? (K += String.fromCharCode(a0 >> 6 | 192), K += String.fromCharCode(a0 & 63 | 128)) : (K += String.fromCharCode(a0 >> 12 | 224), K += String.fromCharCode(a0 >> 6 & 63 | 128), K += String.fromCharCode(a0 & 63 | 128)); } return K; } let u = [], q, a, d, g, B, i, s, f, W; const E = 7, _ = 12, y = 17, P = 22, G = 5, V = 9, p0 = 14, A0 = 20, e0 = 4, O0 = 11, C = 16, k = 23, w = 6, S = 10, U = 15, H = 21; for (p = R(p), u = x(p), i = 1732584193, s = 4023233417, f = 2562383102, W = 271733878, q = 0; q < u.length; q += 16) a = i, d = s, g = f, B = W, i = t(i, s, f, W, u[q + 0], E, 3614090360), W = t(W, i, s, f, u[q + 1], _, 3905402710), f = t(f, W, i, s, u[q + 2], y, 606105819), s = t(s, f, W, i, u[q + 3], P, 3250441966), i = t(i, s, f, W, u[q + 4], E, 4118548399), W = t(W, i, s, f, u[q + 5], _, 1200080426), f = t(f, W, i, s, u[q + 6], y, 2821735955), s = t(s, f, W, i, u[q + 7], P, 4249261313), i = t(i, s, f, W, u[q + 8], E, 1770035416), W = t(W, i, s, f, u[q + 9], _, 2336552879), f = t(f, W, i, s, u[q + 10], y, 4294925233), s = t(s, f, W, i, u[q + 11], P, 2304563134), i = t(i, s, f, W, u[q + 12], E, 1804603682), W = t(W, i, s, f, u[q + 13], _, 4254626195), f = t(f, W, i, s, u[q + 14], y, 2792965006), s = t(s, f, W, i, u[q + 15], P, 1236535329), i = L(i, s, f, W, u[q + 1], G, 4129170786), W = L(W, i, s, f, u[q + 6], V, 3225465664), f = L(f, W, i, s, u[q + 11], p0, 643717713), s = L(s, f, W, i, u[q + 0], A0, 3921069994), i = L(i, s, f, W, u[q + 5], G, 3593408605), W = L(W, i, s, f, u[q + 10], V, 38016083), f = L(f, W, i, s, u[q + 15], p0, 3634488961), s = L(s, f, W, i, u[q + 4], A0, 3889429448), i = L(i, s, f, W, u[q + 9], G, 568446438), W = L(W, i, s, f, u[q + 14], V, 3275163606), f = L(f, W, i, s, u[q + 3], p0, 4107603335), s = L(s, f, W, i, u[q + 8], A0, 1163531501), i = L(i, s, f, W, u[q + 13], G, 2850285829), W = L(W, i, s, f, u[q + 2], V, 4243563512), f = L(f, W, i, s, u[q + 7], p0, 1735328473), s = L(s, f, W, i, u[q + 12], A0, 2368359562), i = r(i, s, f, W, u[q + 5], e0, 4294588738), W = r(W, i, s, f, u[q + 8], O0, 2272392833), f = r(f, W, i, s, u[q + 11], C, 1839030562), s = r(s, f, W, i, u[q + 14], k, 4259657740), i = r(i, s, f, W, u[q + 1], e0, 2763975236), W = r(W, i, s, f, u[q + 4], O0, 1272893353), f = r(f, W, i, s, u[q + 7], C, 4139469664), s = r(s, f, W, i, u[q + 10], k, 3200236656), i = r(i, s, f, W, u[q + 13], e0, 681279174), W = r(W, i, s, f, u[q + 0], O0, 3936430074), f = r(f, W, i, s, u[q + 3], C, 3572445317), s = r(s, f, W, i, u[q + 6], k, 76029189), i = r(i, s, f, W, u[q + 9], e0, 3654602809), W = r(W, i, s, f, u[q + 12], O0, 3873151461), f = r(f, W, i, s, u[q + 15], C, 530742520), s = r(s, f, W, i, u[q + 2], k, 3299628645), i = l(i, s, f, W, u[q + 0], w, 4096336452), W = l(W, i, s, f, u[q + 7], S, 1126891415), f = l(f, W, i, s, u[q + 14], U, 2878612391), s = l(s, f, W, i, u[q + 5], H, 4237533241), i = l(i, s, f, W, u[q + 12], w, 1700485571), W = l(W, i, s, f, u[q + 3], S, 2399980690), f = l(f, W, i, s, u[q + 10], U, 4293915773), s = l(s, f, W, i, u[q + 1], H, 2240044497), i = l(i, s, f, W, u[q + 8], w, 1873313359), W = l(W, i, s, f, u[q + 15], S, 4264355552), f = l(f, W, i, s, u[q + 6], U, 2734768916), s = l(s, f, W, i, u[q + 13], H, 1309151649), i = l(i, s, f, W, u[q + 4], w, 4149444226), W = l(W, i, s, f, u[q + 11], S, 3174756917), f = l(f, W, i, s, u[q + 2], U, 718787259), s = l(s, f, W, i, u[q + 9], H, 3951481745), i = c(i, a), s = c(s, d), f = c(f, g), W = c(W, B); return (N(i) + N(s) + N(f) + N(W)).toLowerCase(); } }; } getBrowser(z) { switch (!0) { case this._Browsers.Edge.test(z): return this.Agent.isEdge = !0, "Edge"; case this._Browsers.PhantomJS.test(z): return this.Agent.isPhantomJS = !0, "PhantomJS"; case this._Browsers.Konqueror.test(z): return this.Agent.isKonqueror = !0, "Konqueror"; case this._Browsers.Amaya.test(z): return this.Agent.isAmaya = !0, "Amaya"; case this._Browsers.Epiphany.test(z): return this.Agent.isEpiphany = !0, "Epiphany"; case this._Browsers.SeaMonkey.test(z): return this.Agent.isSeaMonkey = !0, "SeaMonkey"; case this._Browsers.Flock.test(z): return this.Agent.isFlock = !0, "Flock"; case this._Browsers.OmniWeb.test(z): return this.Agent.isOmniWeb = !0, "OmniWeb"; case this._Browsers.Opera.test(z): return this.Agent.isOpera = !0, "Opera"; case this._Browsers.Chromium.test(z): return this.Agent.isChrome = !0, "Chromium"; case this._Browsers.Chrome.test(z): return this.Agent.isChrome = !0, "Chrome"; case this._Browsers.Safari.test(z): return this.Agent.isSafari = !0, "Safari"; case this._Browsers.WinJs.test(z): return this.Agent.isWinJs = !0, "WinJs"; case this._Browsers.IE.test(z): return this.Agent.isIE = !0, "IE"; case this._Browsers.PS3.test(z): return "ps3"; case this._Browsers.PSP.test(z): return "psp"; case this._Browsers.Firefox.test(z): return this.Agent.isFirefox = !0, "Firefox"; case this._Browsers.UC.test(z): return this.Agent.isUC = !0, "UCBrowser"; default: return z.indexOf("Mozilla") !== 0 && /^([\d\w\-\.]+)\/[\d\w\.\-]+/i.test(z) ? (this.Agent.isAuthoritative = !1, RegExp.$1) : "unknown"; } } getBrowserVersion(z) { let b; switch (this.Agent.browser) { case "Edge": if (this._Versions.Edge.test(z)) return RegExp.$1; break; case "PhantomJS": if (this._Versions.PhantomJS.test(z)) return RegExp.$1; break; case "Chrome": if (this._Versions.Chrome.test(z)) return RegExp.$1; break; case "Chromium": if (this._Versions.Chromium.test(z)) return RegExp.$1; break; case "Safari": if (this._Versions.Safari.test(z)) return RegExp.$1; break; case "Opera": if (this._Versions.Opera.test(z)) return RegExp.$1 ? RegExp.$1 : RegExp.$2; break; case "Firefox": if (this._Versions.Firefox.test(z)) return RegExp.$1; break; case "WinJs": if (this._Versions.WinJs.test(z)) return RegExp.$1; break; case "IE": if (this._Versions.IE.test(z)) return RegExp.$2 ? RegExp.$2 : RegExp.$1; break; case "ps3": if (this._Versions.Ps3.test(z)) return RegExp.$1; break; case "psp": if (this._Versions.Psp.test(z)) return RegExp.$1; break; case "Amaya": if (this._Versions.Amaya.test(z)) return RegExp.$1; break; case "Epiphany": if (this._Versions.Epiphany.test(z)) return RegExp.$1; break; case "SeaMonkey": if (this._Versions.SeaMonkey.test(z)) return RegExp.$1; break; case "Flock": if (this._Versions.Flock.test(z)) return RegExp.$1; break; case "OmniWeb": if (this._Versions.OmniWeb.test(z)) return RegExp.$1; break; case "UCBrowser": if (this._Versions.UC.test(z)) return RegExp.$1; break; default: if (this.Agent.browser !== "unknown" && (b = new RegExp(this.Agent.browser + "[\\/ ]([\\d\\w\\.\\-]+)", "i"), b.test(z))) return RegExp.$1; } } getOS(z) { switch (!0) { case this._OS.WindowsVista.test(z): return this.Agent.isWindows = !0, "Windows Vista"; case this._OS.Windows7.test(z): return this.Agent.isWindows = !0, "Windows 7"; case this._OS.Windows8.test(z): return this.Agent.isWindows = !0, "Windows 8"; case this._OS.Windows81.test(z): return this.Agent.isWindows = !0, "Windows 8.1"; case this._OS.Windows10.test(z): return this.Agent.isWindows = !0, "Windows 10.0"; case this._OS.Windows2003.test(z): return this.Agent.isWindows = !0, "Windows 2003"; case this._OS.WindowsXP.test(z): return this.Agent.isWindows = !0, "Windows XP"; case this._OS.Windows2000.test(z): return this.Agent.isWindows = !0, "Windows 2000"; case this._OS.WindowsPhone8.test(z): return "Windows Phone 8"; case this._OS.Linux64.test(z): return this.Agent.isLinux = !0, this.Agent.isLinux64 = !0, "Linux 64"; case this._OS.Linux.test(z): return this.Agent.isLinux = !0, "Linux"; case this._OS.ChromeOS.test(z): return this.Agent.isChromeOS = !0, "Chrome OS"; case this._OS.Wii.test(z): return "Wii"; case this._OS.PS3.test(z): return "Playstation"; case this._OS.PSP.test(z): return "Playstation"; case this._OS.OSXCheetah.test(z): return this.Agent.isMac = !0, "OS X Cheetah"; case this._OS.OSXPuma.test(z): return this.Agent.isMac = !0, "OS X Puma"; case this._OS.OSXJaguar.test(z): return this.Agent.isMac = !0, "OS X Jaguar"; case this._OS.OSXPanther.test(z): return this.Agent.isMac = !0, "OS X Panther"; case this._OS.OSXTiger.test(z): return this.Agent.isMac = !0, "OS X Tiger"; case this._OS.OSXLeopard.test(z): return this.Agent.isMac = !0, "OS X Leopard"; case this._OS.OSXSnowLeopard.test(z): return this.Agent.isMac = !0, "OS X Snow Leopard"; case this._OS.OSXLion.test(z): return this.Agent.isMac = !0, "OS X Lion"; case this._OS.OSXMountainLion.test(z): return this.Agent.isMac = !0, "OS X Mountain Lion"; case this._OS.OSXMavericks.test(z): return this.Agent.isMac = !0, "OS X Mavericks"; case this._OS.OSXYosemite.test(z): return this.Agent.isMac = !0, "OS X Yosemite"; case this._OS.OSXElCapitan.test(z): return this.Agent.isMac = !0, "OS X El Capitan"; case this._OS.OSXSierra.test(z): return this.Agent.isMac = !0, "macOS Sierra"; case this._OS.Mac.test(z): return this.Agent.isMac = !0, "OS X"; case this._OS.iPad.test(z): this.Agent.isiPad = !0; const b = z.match(this._OS.iPad) ?? ""; return b.length ? b[0].replace("_", ".") : ""; case this._OS.iPhone.test(z): this.Agent.isiPhone = !0; const p = z.match(this._OS.iPhone) ?? ""; return p.length ? p[0].replace("_", ".") : ""; case this._OS.Bada.test(z): return this.Agent.isBada = !0, "Bada"; case this._OS.Curl.test(z): return this.Agent.isCurl = !0, "Curl"; default: return "unknown"; } } getPlatform(z) { switch (!0) { case this._Platform.Windows.test(z): return "Microsoft Windows"; case this._Platform.WindowsPhone.test(z): return this.Agent.isWindowsPhone = !0, "Microsoft Windows Phone"; case this._Platform.Mac.test(z): return "Apple Mac"; case this._Platform.Curl.test(z): return "Curl"; case this._Platform.Android.test(z): return this.Agent.isAndroid = !0, "Android"; case this._Platform.Blackberry.test(z): return this.Agent.isBlackberry = !0, "Blackberry"; case this._Platform.Linux.test(z): return "Linux"; case this._Platform.Wii.test(z): return "Wii"; case this._Platform.Playstation.test(z): return "Playstation"; case this._Platform.iPad.test(z): return this.Agent.isiPad = !0, "iPad"; case this._Platform.iPod.test(z): return this.Agent.isiPod = !0, "iPod"; case this._Platform.iPhone.test(z): return this.Agent.isiPhone = !0, "iPhone"; case this._Platform.Samsung.test(z): return this.Agent.isiSamsung = !0, "Samsung"; default: return "unknown"; } } testCompatibilityMode() { if (this.Agent.isIE && /Trident\/(\d)\.0/i.test(this.Agent.source)) { const z = parseInt(RegExp.$1, 10), b = parseInt(this.Agent.version, 10); b === 7 && z === 7 && (this.Agent.isIECompatibilityMode = !0, this.Agent.version = 11), b === 7 && z === 6 && (this.Agent.isIECompatibilityMode = !0, this.Agent.version = 10), b === 7 && z === 5 && (this.Agent.isIECompatibilityMode = !0, this.Agent.version = 9), b === 7 && z === 4 && (this.Agent.isIECompatibilityMode = !0, this.Agent.version = 8); } } testSilk() { switch (!0) { case new RegExp("silk", "gi").test(this.Agent.source): this.Agent.isSilk = !0; break; } return /Silk-Accelerated=true/gi.test(this.Agent.source) && (this.Agent.SilkAccelerated = !0), this.Agent.isSilk ? "Silk" : !1; } testKindleFire() { switch (!0) { case /KFOT/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire"; case /KFTT/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HD"; case /KFJWI/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HD 8.9"; case /KFJWA/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HD 8.9 4G"; case /KFSOWI/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HD 7"; case /KFTHWI/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HDX 7"; case /KFTHWA/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HDX 7 4G"; case /KFAPWI/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HDX 8.9"; case /KFAPWA/gi.test(this.Agent.source): return this.Agent.isKindleFire = !0, "Kindle Fire HDX 8.9 4G"; default: return !1; } } testCaptiveNetwork() { switch (!0) { case /CaptiveNetwork/gi.test(this.Agent.source): return this.Agent.isCaptive = !0, this.Agent.isMac = !0, this.Agent.platform = "Apple Mac", "CaptiveNetwork"; default: return !1; } } testMobile() { switch (!0) { case this.Agent.isWindows: case this.Agent.isLinux: case this.Agent.isMac: case this.Agent.isChromeOS: this.Agent.isDesktop = !0; break; case this.Agent.isAndroid: case this.Agent.isSamsung: this.Agent.isMobile = !0, this.Agent.isDesktop = !1; break; } switch (!0) { case this.Agent.isiPad: case this.Agent.isiPod: case this.Agent.isiPhone: case this.Agent.isBada: case this.Agent.isBlackberry: case this.Agent.isAndroid: case this.Agent.isWindowsPhone: this.Agent.isMobile = !0, this.Agent.isDesktop = !1; break; } /mobile/i.test(this.Agent.source) && (this.Agent.isMobile = !0, this.Agent.isDesktop = !1); } testTablet() { switch (!0) { case this.Agent.isiPad: case this.Agent.isAndroidTablet: case this.Agent.isKindleFire: this.Agent.isTablet = !0; break; } /tablet/i.test(this.Agent.source) && (this.Agent.isTablet = !0); } testNginxGeoIP(z) { Object.keys(z).forEach((b) => { /^GEOIP/i.test(b) && (this.Agent.geoIp[b] = z[b]); }); } testBot() { const z = hc.exec(this.Agent.source.toLowerCase()); z ? this.Agent.isBot = z[1] : this.Agent.isAuthoritative || (this.Agent.isBot = /bot/i.test(this.Agent.source)); } testSmartTV() { const z = new RegExp( "smart-tv|smarttv|googletv|appletv|hbbtv|pov_tv|netcast.tv", "gi" ).exec(this.Agent.source.toLowerCase()); z && (this.Agent.isSmartTV = z[1]); } testAndroidTablet() { this.Agent.isAndroid && !/mobile/i.test(this.Agent.source) && (this.Agent.isAndroidTablet = !0); } testTouchSupport() { this.Agent.isTouchScreen = // @ts-ignore "ontouchstart" in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; } getLaguage() { this.Agent.language = (navigator.language || // @ts-ignore navigator.userLanguage || // @ts-ignore navigator.browserLanguage || // @ts-ignore navigator.systemLanguage || "").toLowerCase(); } getColorDepth() { this.Agent.colorDepth = screen.colorDepth || -1; } getScreenResolution() { this.Agent.resolution = [screen.availWidth, screen.availHeight]; } getPixelDepth() { this.Agent.pixelDepth = screen.pixelDepth || -1; } getCPU() { this.Agent.cpuCores = navigator.hardwareConcurrency || -1; } reset() { for (const z in this.DefaultAgent) this.DefaultAgent.hasOwnProperty(z) && (this.Agent[z] = this.DefaultAgent[z]); return new jM(); } parse(z) { z = z ?? navigator.userAgent; const b = new jM(); return b.Agent.source = z.replace(/^\s*/, "").replace(/\s*$/, ""), b.Agent.os = this.getOS(b.Agent.source), b.Agent.platform = this.getPlatform(b.Agent.source), b.Agent.browser = this.getBrowser(b.Agent.source), b.Agent.version = this.getBrowserVersion(b.Agent.source), b.testBot(), b.testSmartTV(), b.testMobile(), b.testAndroidTablet(), b.testTablet(), b.testCompatibilityMode(), b.testSilk(), b.testKindleFire(), b.testCaptiveNetwork(), b.testTouchSupport(), b.getLaguage(), b.getColorDepth(), b.getPixelDepth(), b.getScreenResolution(), b.getCPU(), b.Agent; } get(z) { let b = "a"; const p = this.parse(), O = []; for (const e in this.options) O.push(p[e]); z && O.push(z), !this.options.resolution && p.isMobile && O.push(p.resolution), b = "b"; const c = p.hashMD5(O.join(":")); return [ c.slice(0, 8), c.slice(8, 12), "4" + c.slice(12, 15), b + c.slice(15, 18), c.slice(20) ].join("-"); } } var dz = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; function s3(M) { return M && M.__esModule && Object.prototype.hasOwnProperty.call(M, "default") ? M.default : M; } function d3(M) { if (Object.prototype.hasOwnProperty.call(M, "__esModule")) return M; var z = M.default; if (typeof z == "function") { var b = function p() { return this instanceof p ? Reflect.construct(z, arguments, this.constructor) : z.apply(this, arguments); }; b.prototype = z.prototype; } else b = {}; return Object.defineProperty(b, "__esModule", { value: !0 }), Object.keys(M).forEach(function(p) { var O = Object.getOwnPropertyDescriptor(M, p); Object.defineProperty(b, p, O.get ? O : { enumerable: !0, get: function() { return M[p]; } }); }), b; } var Z2 = { exports: {} }; function Tc(M) { throw new Error('Could not dynamically require "' + M + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); } var MM = { exports: {} }; const Dc = {}, mc = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: Dc }, Symbol.toStringTag, { value: "Module" })), Ec = /* @__PURE__ */ d3(mc); var _c = MM.exports, Cb; function u0() { return Cb || (Cb = 1, function(M, z) { (function(b, p) { M.exports = p(); })(_c, function() { var b = b || function(p, O) { var c; if (typeof window < "u" && window.crypto && (c = window.crypto), typeof self < "u" && self.crypto && (c = self.crypto), typeof globalThis < "u" && globalThis.crypto && (c = globalThis.crypto), !c && typeof window < "u" && window.msCrypto && (c = window.msCrypto), !c && typeof dz < "u" && dz.crypto && (c = dz.crypto), !c && typeof Tc == "function") try { c = Ec; } catch { } var o = function() { if (c) { if (typeof c.getRandomValues == "function") try { return c.getRandomValues(new Uint32Array(1))[0]; } catch { } if (typeof c.randomBytes == "function") try { return c.randomBytes(4).readInt32LE(); } catch { } } throw new Error("Native crypto module could not be used to get secure random number."); }, e = Object.create || /* @__PURE__ */ function() { function q() { } return function(a) { var d; return q.prototype = a, d = new q(), q.prototype = null, d; }; }(), n = {}, A = n.lib = {}, t = A.Base = /* @__PURE__ */ function() { return { /** * Creates a new object that inherits from this object. * * @param {Object} overrides Properties to copy into the new object. * * @return {Object} The new object. * * @static * * @example * * var MyType = CryptoJS.lib.Base.extend({ * field: 'value', * * method: function () { * } * }); */ extend: function(q) { var a = e(this); return q && a.mixIn(q), (!a.hasOwnProperty("init") || this.init === a.init) && (a.init = function() { a.$super.init.apply(this, arguments); }), a.init.prototype = a, a.$super = this, a; }, /** * Extends this object and runs the init method. * Arguments to create() will be passed to init(). * * @return {Object} The new object. * * @static * * @example * * var instance = MyType.create(); */ create: function() { var q = this.extend(); return q.init.apply(q, arguments), q; }, /** * Initializes a newly created object. * Override this method to add some logic when your objects are created. * * @example * * var MyType = CryptoJS.lib.Base.extend({ * init: function () { * // ... * } * }); */ init: function() { }, /** * Copies properties into this object. * * @param {Object} properties The properties to mix in. * * @example * * MyType.mixIn({ * field: 'value' * }); */ mixIn: function(q) { for (var a in q) q.hasOwnProperty(a) && (this[a] = q[a]); q.hasOwnProperty("toString") && (this.toString = q.toString); }, /** * Creates a copy of this object. * * @return {Object} The clone. * * @example * * var clone = instance.clone(); */ clone: function() { return this.init.prototype.extend(this); } }; }(), L = A.WordArray = t.extend({ /** * Initializes a newly created word array. * * @param {Array} words (Optional) An array of 32-bit words. * @param {number} sigBytes (Optional) The number of significant bytes in the words. * * @example * * var wordArray = CryptoJS.lib.WordArray.create(); * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); */ init: function(q, a) { q = this.words = q || [], a != O ? this.sigBytes = a : this.sigBytes = q.length * 4; }, /** * Converts this word array to a string. * * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex * * @return {string} The stringified word array. * * @example * * var string = wordArray + ''; * var string = wordArray.toString(); * var string = wordArray.toString(CryptoJS.enc.Utf8); */ toString: function(q) { return (q || l).stringify(this); }, /** * Concatenates a word array to this word array. * * @param {WordArray} wordArray The word array to append. * * @return {WordArray} This word array. * * @example * * wordArray1.concat(wordArray2); */ concat: function(q) { var a = this.words, d = q.words, g = this.sigBytes, B = q.sigBytes; if (this.clamp(), g % 4) for (var i = 0; i < B; i++) { var s = d[i >>> 2] >>> 24 - i % 4 * 8 & 255; a[g + i >>> 2] |= s << 24 - (g + i) % 4 * 8; } else for (var f = 0; f < B; f += 4) a[g + f >>> 2] = d[f >>> 2]; return this.sigBytes += B, this; }, /** * Removes insignificant bits. * * @example * * wordArray.clamp(); */ clamp: function() { var q = this.words, a = this.sigBytes; q[a >>> 2] &= 4294967295 << 32 - a % 4 * 8, q.length = p.ceil(a / 4); }, /** * Creates a copy of this word array. * * @return {WordArray} The clone. * * @example * * var clone = wordArray.clone(); */ clone: function() { var q = t.clone.call(this); return q.words = this.words.slice(0), q; }, /** * Creates a word array filled with random bytes. * * @param {number} nBytes The number of random bytes to generate. * * @return {WordArray} The random word array. * * @static * * @example * * var wordArray = CryptoJS.lib.WordArray.random(16); */ random: function(q) { for (var a = [], d = 0; d < q; d += 4) a.push(o()); return new L.init(a, q); } }), r = n.enc = {}, l = r.Hex = { /** * Converts a word array to a hex string. * * @param {WordArray} wordArray The word array. * * @return {string} The hex string. * * @static * * @example * * var hexString = CryptoJS.enc.Hex.stringify(wordArray); */ stringify: function(q) { for (var a = q.words, d = q.sigBytes, g = [], B = 0; B < d; B++) { var i = a[B >>> 2] >>> 24 - B % 4 * 8 & 255; g.push((i >>> 4).toString(16)), g.push((i & 15).toString(16)); } return g.join(""); }, /** * Converts a hex string to a word array. * * @param {string} hexStr The hex string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Hex.parse(hexString); */ parse: function(q) { for (var a = q.length, d = [], g = 0; g < a; g += 2) d[g >>> 3] |= parseInt(q.substr(g, 2), 16) << 24 - g % 8 * 4; return new L.init(d, a / 2); } }, x = r.Latin1 = { /** * Converts a word array to a Latin1 string. * * @param {WordArray} wordArray The word array. * * @return {string} The Latin1 string. * * @static * * @example * * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); */ stringify: function(q) { for (var a = q.words, d = q.sigBytes, g = [], B = 0; B < d; B++) { var i = a[B >>> 2] >>> 24 - B % 4 * 8 & 255; g.push(String.fromCharCode(i)); } return g.join(""); }, /** * Converts a Latin1 string to a word array. * * @param {string} latin1Str The Latin1 string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); */ parse: function(q) { for (var a = q.length, d = [], g = 0; g < a; g++) d[g >>> 2] |= (q.charCodeAt(g) & 255) << 24 - g % 4 * 8; return new L.init(d, a); } }, N = r.Utf8 = { /** * Converts a word array to a UTF-8 string. * * @param {WordArray} wordArray The word array. * * @return {string} The UTF-8 string. * * @static * * @example * * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); */ stringify: function(q) { try { return decodeURIComponent(escape(x.stringify(q))); } catch { throw new Error("Malformed UTF-8 data"); } }, /** * Converts a UTF-8 string to a word array. * * @param {string} utf8Str The UTF-8 string. * * @return {WordArray} The word array. * * @static * * @example * * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); */ parse: function(q) { return x.parse(unescape(encodeURIComponent(q))); } }, R = A.BufferedBlockAlgorithm = t.extend({ /** * Resets this block algorithm's data buffer to its initial state. * * @example * * bufferedBlockAlgorithm.reset(); */ reset: function() { this._data = new L.init(), this._nDataBytes = 0; }, /** * Adds new data to this block algorithm's buffer. * * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. * * @example * * bufferedBlockAlgorithm._append('data'); * bufferedBlockAlgorithm._append(wordArray); */ _append: function(q) { typeof q == "string" && (q = N.parse(q)), this._data.concat(q), this._nDataBytes += q.sigBytes; }, /** * Processes available data blocks. * * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. * * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. * * @return {WordArray} The processed data. * * @example * * var processedData = bufferedBlockAlgorithm._process(); * var processedData = bufferedBlockAlgorithm._process(!!'flush'); */ _process: function(q) { var a, d = this._data, g = d.words, B = d.sigBytes, i = this.blockSize, s = i * 4, f = B / s; q ? f = p.ceil(f) : f = p.max((f | 0) - this._minBufferSize, 0); var W = f * i, E = p.min(W * 4, B); if (W) { for (var _ = 0; _ < W; _ += i) this._doProcessBlock(g, _); a = g.splice(0, W), d.sigBytes -= E; } return new L.init(a, E); }, /** * Creates a copy of this object. * * @return {Object} The clone. * * @example * * var clone = bufferedBlockAlgorithm.clone(); */ clone: function() { var q = t.clone.call(this); return q._data = this._data.clone(), q; }, _minBufferSize: 0 }); A.Hasher = R.extend({ /** * Configuration options. */ cfg: t.extend(), /** * Initializes a newly created hasher. * * @param {Object} cfg (Optional) The configuration options to use for this hash computation. * * @example * * var hasher = CryptoJS.algo.SHA256.create(); */ init: function(q) { this.cfg = this.cfg.extend(q), this.reset(); }, /** * Resets this hasher to its initial state. * * @example * * hasher.reset(); */ reset: function() { R.reset.call(this), this._doReset(); }, /** * Updates this hasher with a message. * * @param {WordArray|string} messageUpdate The message to append. * * @return {Hasher} This hasher. * * @example * * hasher.update('message'); * hasher.update(wordArray); */ update: function(q) { return this._append(q), this._process(), this; }, /** * Finalizes the hash computation. * Note that the finalize operation is effectively a destructive, read-once operation. * * @param {WordArray|string} messageUpdate (Optional) A final message update. * * @return {WordArray} The hash. * * @example * * var hash = hasher.finalize(); * var hash = hasher.finalize('message'); * var hash = hasher.finalize(wordArray); */ finalize: function(q) { q && this._append(q); var a = this._doFinalize(); return a; }, blockSize: 16, /** * Creates a shortcut function to a hasher's object interface. * * @param {Hasher} hasher The hasher to create a helper for. * * @return {Function} The shortcut function. * * @static * * @example * * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); */ _createHelper: function(q) { return function(a, d) { return new q.init(d).finalize(a); }; }, /** * Creates a shortcut function to the HMAC's object interface. * * @param {Hasher} hasher The hasher to use in this HMAC helper. * * @return {Function} The shortcut function. * * @static * * @example * * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); */ _createHmacHelper: function(q) { return function(a, d) { return new u.HMAC.init(q, d).finalize(a); }; } }); var u = n.algo = {}; return n; }(Math); return b; }); }(MM)), MM.exports; } var zM = { exports: {} }, yc = zM.exports, vb; function JM() { return vb || (vb = 1, function(M, z) { (function(b, p) { M.exports = p(u0()); })(yc, function(b) { return function(p) { var O = b, c = O.lib, o = c.Base, e = c.WordArray, n = O.x64 = {}; n.Word = o.extend({ /** * Initializes a newly created 64-bit word. * * @param {number} high The high 32 bits. * @param {number} low The low 32 bits. * * @example * * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); */ init: function(A, t) { this.high = A, this.low = t; } /** * Bitwise NOTs this word. * * @return {X64Word} A new x64-Word object after negating. * * @example * * var negated = x64Word.not(); */ // not: function (