{"manifest":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _invoke(body, then) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(then);\n  }\n  return then(result);\n}\nconst _iteratorSymbol = /*#__PURE__*/typeof Symbol !== \"undefined\" ? Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\")) : \"@@iterator\";\nfunction _settle(pact, state, value) {\n  if (!pact.s) {\n    if (value instanceof _Pact) {\n      if (value.s) {\n        if (state & 1) {\n          state = value.s;\n        }\n        value = value.v;\n      } else {\n        value.o = _settle.bind(null, pact, state);\n        return;\n      }\n    }\n    if (value && value.then) {\n      value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n      return;\n    }\n    pact.s = state;\n    pact.v = value;\n    const observer = pact.o;\n    if (observer) {\n      observer(pact);\n    }\n  }\n}\nconst _Pact = /*#__PURE__*/function () {\n  function _Pact() {}\n  _Pact.prototype.then = function (onFulfilled, onRejected) {\n    const result = new _Pact();\n    const state = this.s;\n    if (state) {\n      const callback = state & 1 ? onFulfilled : onRejected;\n      if (callback) {\n        try {\n          _settle(result, 1, callback(this.v));\n        } catch (e) {\n          _settle(result, 2, e);\n        }\n        return result;\n      } else {\n        return this;\n      }\n    }\n    this.o = function (_this) {\n      try {\n        const value = _this.v;\n        if (_this.s & 1) {\n          _settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n        } else if (onRejected) {\n          _settle(result, 1, onRejected(value));\n        } else {\n          _settle(result, 2, value);\n        }\n      } catch (e) {\n        _settle(result, 2, e);\n      }\n    };\n    return result;\n  };\n  return _Pact;\n}();\nfunction _isSettledPact(thenable) {\n  return thenable instanceof _Pact && thenable.s & 1;\n}\nfunction _forTo(array, body, check) {\n  var i = -1,\n    pact,\n    reject;\n  function _cycle(result) {\n    try {\n      while (++i < array.length && (!check || !check())) {\n        result = body(i);\n        if (result && result.then) {\n          if (_isSettledPact(result)) {\n            result = result.v;\n          } else {\n            result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n            return;\n          }\n        }\n      }\n      if (pact) {\n        _settle(pact, 1, result);\n      } else {\n        pact = result;\n      }\n    } catch (e) {\n      _settle(pact || (pact = new _Pact()), 2, e);\n    }\n  }\n  _cycle();\n  return pact;\n}\nfunction _forOf(target, body, check) {\n  if (typeof target[_iteratorSymbol] === \"function\") {\n    var iterator = target[_iteratorSymbol](),\n      step,\n      pact,\n      reject;\n    function _cycle(result) {\n      try {\n        while (!(step = iterator.next()).done && (!check || !check())) {\n          result = body(step.value);\n          if (result && result.then) {\n            if (_isSettledPact(result)) {\n              result = result.v;\n            } else {\n              result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n              return;\n            }\n          }\n        }\n        if (pact) {\n          _settle(pact, 1, result);\n        } else {\n          pact = result;\n        }\n      } catch (e) {\n        _settle(pact || (pact = new _Pact()), 2, e);\n      }\n    }\n    _cycle();\n    if (iterator.return) {\n      var _fixup = function (value) {\n        try {\n          if (!step.done) {\n            iterator.return();\n          }\n        } catch (e) {}\n        return value;\n      };\n      if (pact && pact.then) {\n        return pact.then(_fixup, function (e) {\n          throw _fixup(e);\n        });\n      }\n      _fixup();\n    }\n    return pact;\n  }\n  // No support for Symbol.iterator\n  if (!(\"length\" in target)) {\n    throw new TypeError(\"Object is not iterable\");\n  }\n  // Handle live collections properly\n  var values = [];\n  for (var i = 0; i < target.length; i++) {\n    values.push(target[i]);\n  }\n  return _forTo(values, function (i) {\n    return body(values[i]);\n  }, check);\n}\nfunction _continue(value, then) {\n  return value && value.then ? value.then(then) : then(value);\n}\nfunction _for(test, update, body) {\n  var stage;\n  for (;;) {\n    var shouldContinue = test();\n    if (_isSettledPact(shouldContinue)) {\n      shouldContinue = shouldContinue.v;\n    }\n    if (!shouldContinue) {\n      return result;\n    }\n    if (shouldContinue.then) {\n      stage = 0;\n      break;\n    }\n    var result = body();\n    if (result && result.then) {\n      if (_isSettledPact(result)) {\n        result = result.s;\n      } else {\n        stage = 1;\n        break;\n      }\n    }\n    if (update) {\n      var updateValue = update();\n      if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n        stage = 2;\n        break;\n      }\n    }\n  }\n  var pact = new _Pact();\n  var reject = _settle.bind(null, pact, 2);\n  (stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n  return pact;\n  function _resumeAfterBody(value) {\n    result = value;\n    do {\n      if (update) {\n        updateValue = update();\n        if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n          updateValue.then(_resumeAfterUpdate).then(void 0, reject);\n          return;\n        }\n      }\n      shouldContinue = test();\n      if (!shouldContinue || _isSettledPact(shouldContinue) && !shouldContinue.v) {\n        _settle(pact, 1, result);\n        return;\n      }\n      if (shouldContinue.then) {\n        shouldContinue.then(_resumeAfterTest).then(void 0, reject);\n        return;\n      }\n      result = body();\n      if (_isSettledPact(result)) {\n        result = result.v;\n      }\n    } while (!result || !result.then);\n    result.then(_resumeAfterBody).then(void 0, reject);\n  }\n  function _resumeAfterTest(shouldContinue) {\n    if (shouldContinue) {\n      result = body();\n      if (result && result.then) {\n        result.then(_resumeAfterBody).then(void 0, reject);\n      } else {\n        _resumeAfterBody(result);\n      }\n    } else {\n      _settle(pact, 1, result);\n    }\n  }\n  function _resumeAfterUpdate() {\n    if (shouldContinue = test()) {\n      if (shouldContinue.then) {\n        shouldContinue.then(_resumeAfterTest).then(void 0, reject);\n      } else {\n        _resumeAfterTest(shouldContinue);\n      }\n    } else {\n      _settle(pact, 1, result);\n    }\n  }\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction _callIgnored(body, direct) {\n  return _call(body, _empty, direct);\n}\nfunction _do(body, test) {\n  var awaitBody;\n  do {\n    var result = body();\n    if (result && result.then) {\n      if (_isSettledPact(result)) {\n        result = result.v;\n      } else {\n        awaitBody = true;\n        break;\n      }\n    }\n    var shouldContinue = test();\n    if (_isSettledPact(shouldContinue)) {\n      shouldContinue = shouldContinue.v;\n    }\n    if (!shouldContinue) {\n      return result;\n    }\n  } while (!shouldContinue.then);\n  const pact = new _Pact();\n  const reject = _settle.bind(null, pact, 2);\n  (awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n  return pact;\n  function _resumeAfterBody(value) {\n    result = value;\n    for (;;) {\n      shouldContinue = test();\n      if (_isSettledPact(shouldContinue)) {\n        shouldContinue = shouldContinue.v;\n      }\n      if (!shouldContinue) {\n        break;\n      }\n      if (shouldContinue.then) {\n        shouldContinue.then(_resumeAfterTest).then(void 0, reject);\n        return;\n      }\n      result = body();\n      if (result && result.then) {\n        if (_isSettledPact(result)) {\n          result = result.v;\n        } else {\n          result.then(_resumeAfterBody).then(void 0, reject);\n          return;\n        }\n      }\n    }\n    _settle(pact, 1, result);\n  }\n  function _resumeAfterTest(shouldContinue) {\n    if (shouldContinue) {\n      do {\n        result = body();\n        if (result && result.then) {\n          if (_isSettledPact(result)) {\n            result = result.v;\n          } else {\n            result.then(_resumeAfterBody).then(void 0, reject);\n            return;\n          }\n        }\n        shouldContinue = test();\n        if (_isSettledPact(shouldContinue)) {\n          shouldContinue = shouldContinue.v;\n        }\n        if (!shouldContinue) {\n          _settle(pact, 1, result);\n          return;\n        }\n      } while (!shouldContinue.then);\n      shouldContinue.then(_resumeAfterTest).then(void 0, reject);\n    } else {\n      _settle(pact, 1, result);\n    }\n  }\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nconst apiUsers = _async(function (userIds) {\n  const url = `/api/feed/users`;\n  return _await(State.post(url, {\n    ids: userIds\n  }, 'json'), function (res) {\n    return Array.isArray(res) ? res.map(sanitizeMeta) : res;\n  });\n});\n// function normalizeMessageTimestamp(value) {\n//   if (value == null) return new Date().toISOString();\n//   if (typeof value === 'number') {\n//     const ms = value < 1e12 ? value * 1000 : value;\n//     return new Date(ms).toISOString();\n//   }\n//   if (typeof value !== 'string') return new Date().toISOString();\n//   const s = String(value).trim();\n//   if (!s) return new Date().toISOString();\n//   const hasNoTz = !/Z|[+-]\\d{2}:?\\d{2}$/.test(s);\n//   const isoLike = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(s);\n//   const spaceLike = /^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}/.test(s);\n//   if (hasNoTz && (isoLike || spaceLike)) {\n//     const forParse = spaceLike ? s.replace(/^(\\d{4}-\\d{2}-\\d{2})\\s+/, '$1T') : s;\n//     return new Date(forParse + 'Z').toISOString();\n//   }\n//   const d = new Date(s);\n//   return Number.isNaN(d.getTime()) ? new Date().toISOString() : d.toISOString();\n// }\n// function mapApiMessageToEvent(m, currentUserId) {\n//   const isOwner = String(m.fromUserId) === String(currentUserId);\n//   const time = normalizeMessageTimestamp(m.time);\n//   const fromMedia = Array.isArray(m.media)\n//     ? m.media.map((med) => ({\n//       type: 'image',\n//       url: getFileUrl(med.path || med.url) || '',\n//       width: med.width || 0,\n//       height: med.height || 0,\n//     }))\n//     : [];\n//   const filesList = Array.isArray(m.files) ? m.files : (Array.isArray(m.Files) ? m.Files : []);\n//   const fromFiles = filesList.map((f) => {\n//     const path = f.url || f.path;\n//     const url = getFileUrl(path) || '';\n//     const type = f.type === 'video' || (path && /\\.(mp4|mov|webm|m4v)(\\?|$)/i.test(String(path))) ? 'video' : 'image';\n//     const thumbnailUrl = f.thumbnailUrl ? getFileUrl(f.thumbnailUrl) : (type === 'video' ? getVideoThumbnailUrl(url) : undefined);\n//     return { type, url, width: 0, height: 0, ...(thumbnailUrl ? { thumbnailUrl } : {}) };\n//   });\n//   const attachments = fromMedia.length || fromFiles.length ? [...fromMedia, ...fromFiles] : undefined;\n//   const replyTo =\n//     (m.replyTo && m.replyTo.messageId)\n//       ? {\n//         messageId: String(m.replyTo.messageId),\n//         text: m.replyTo.text ?? '',\n//         authorName: m.replyTo.authorName ?? '',\n//       }\n//       : (m.replyId\n//         ? {\n//           messageId: String(m.replyId),\n//           text: m.replyText ?? '',\n//           authorName: m.replyAuthorName ?? '',\n//         }\n//         : undefined);\n//   return {\n//     ...m,\n//     type: 'message',\n//     isOwner,\n//     timestamp: time,\n//     text: m.text,\n//     attachments: attachments && attachments.length > 0 ? attachments : undefined,\n//     ...(replyTo ? { replyTo } : {}),\n//   };\n// }\nconst loadMessages = _async(function (chatId, type = 'full') {\n  const more = type === 'more';\n  const update = type === 'update';\n  if (chatId == null) return;\n  const store = getChatStore(chatId);\n  const state = getChatState(chatId);\n  if (state.value?.isLoadingMessages) return;\n  if (more && state.value?.isLoadingMessagesMore) return;\n  !more && state.next({\n    ...(state.value ?? {}),\n    isLoadingMessages: true\n  });\n  more && !update && state.next({\n    ...(state.value ?? {}),\n    isLoadingMessagesMore: true\n  });\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      const offset = more ? store.value?.messages?.length ?? 0 : 0;\n      const url = `${CHAT_API}/${encodeURIComponent(chatId)}/messages?limit=${CHAT_MESSAGES_PAGE_LIMIT}&offset=${offset}`;\n      return _await(State.post(url, {}, 'json'), function (res) {\n        const messages = (res.messages ?? []).map(message => ({\n          ...message,\n          gift: message.gift ?? null\n        }));\n        if (more || update) {\n          const registered = new Set();\n          const prevMessages = store.value?.messages ?? [];\n          const updated = prevMessages.map(m => {\n            const n = messages.find(mm => mm.id === m.id);\n            if (!!n) {\n              registered.add(n.id);\n            }\n            return n ?? m;\n          });\n          for (const message of messages) {\n            if (!registered.has(message.id)) updated.push(message);\n          }\n          store.next({\n            ...(store.value ?? {}),\n            ended: messages.length < CHAT_MESSAGES_PAGE_LIMIT,\n            messages: updated\n          });\n        } else {\n          store.next({\n            ...(store.value ?? {}),\n            ended: messages.length < CHAT_MESSAGES_PAGE_LIMIT,\n            messages\n          });\n        }\n      });\n    }, function (error) {\n      console.error(error);\n    });\n  }, function (_wasThrown32, _result74) {\n    !more && state.next({\n      ...(state.value ?? {}),\n      isLoadingMessages: false\n    });\n    more && !update && state.next({\n      ...(state.value ?? {}),\n      isLoadingMessagesMore: false\n    });\n    return _rethrow(_wasThrown32, _result74);\n  }));\n});\nconst resetChatCounter = _async(function (chatId) {\n  const state = getUnreadCountState();\n  const store = getUnreadCountStore();\n  state.next({\n    ...(state.value ?? {}),\n    [chatId]: 0\n  });\n  store.next({\n    ...(store.value ?? {}),\n    [chatId]: 0\n  });\n  return _await();\n});\nconst apiMarkMessagesRead = _async(function (messageIds, chatId) {\n  const url = `/api/chat/camee-chat/message/mark-read`;\n  return State.post(url, {\n    messageIds,\n    chatId\n  }, 'string');\n});\nconst loadIAPProducts = _async(function () {\n  const cachedProductIds = new Set((State.state.storage.iapProducts?.value || []).map(product => product?.id || product?.productId).filter(Boolean));\n  if (skus.every(sku => cachedProductIds.has(sku))) {\n    return;\n  }\n  if (!IAP?.fetchProducts) {\n    console.error('[IAP] fetchProducts not available');\n    State.state.storage.iapError.next(true);\n    return;\n  }\n  return _continueIgnored(_catch(function () {\n    console.log('[IAP] Fetching products...', skus);\n    return _await(IAP.fetchProducts({\n      skus: oldSkus\n    }), function (productsOld) {\n      return _await(IAP.fetchProducts({\n        skus\n      }), function (products) {\n        console.log('[IAP] Products loaded:', products?.length);\n        State.state.storage.iapProducts.next(!!products?.length ? products : productsOld);\n      });\n    });\n  }, function (error) {\n    console.warn('[IAP] Fetch failed, retrying...', error?.message);\n    return _continueIgnored(_catch(function () {\n      return _await(new Promise(r => setTimeout(r, 1000)), function () {\n        return _await(IAP.fetchProducts({\n          skus: oldSkus\n        }), function (productsOld) {\n          return _await(IAP.fetchProducts({\n            skus\n          }), function (products) {\n            console.log('[IAP] Products loaded (retry):', products?.length);\n            State.state.storage.iapProducts.next(!!products?.length ? products : productsOld);\n          });\n        });\n      });\n    }, function (retryError) {\n      console.error('[IAP] Failed to load products:', retryError?.message || retryError);\n      State.state.storage.iapError.next(true);\n    }));\n  }));\n});\n/* === Inlined module: services/ff.jsx === */\nconst loadFF = _async(function () {\n  return _continueIgnored(_catch(function () {\n    return _await(State.post('/api/feature', {}, 'json'), function (flags) {\n      State.store.ffStore.next(flags ?? {});\n    });\n  }, function (error) {\n    console.error(error);\n  }));\n});\nconst ffService = {\n  api: {\n    name: 'ff',\n    loadFF() {\n      return loadFF();\n    },\n    useFF(name) {\n      return Hooks.useBehaviorSubjectMap(State.store.ffStore, React.useCallback(flags => !!flags?.[name], [name]));\n    },\n    useFFValue(name) {\n      return Hooks.useBehaviorSubjectMap(State.store.ffStore, React.useCallback(flags => flags?.[name], [name]));\n    },\n    getFF(name) {\n      return State.store.ffStore.value?.[name];\n    }\n  },\n  init() {\n    return loadFF();\n  },\n  subs() {\n    return Rx.merge(State.state.isConnected.pipe(Rx.distinctUntilChanged(), Rx.filter(Boolean)), State.state.session.pipe(Rx.map(session => [session?.user?.id ?? null, session?.ip?.country ?? null, session?.card?.country ?? null].join(':')), Rx.distinctUntilChanged()), State.state.device.pipe(Rx.map(device => [device?.platform ?? null, device?.buildNumber ?? null].join(':')), Rx.distinctUntilChanged()), State.bus.updateFF).pipe(Rx.debounceTime(300), Rx.tap(() => {\n      loadFF();\n    }));\n  }\n};\n\n/* === Inlined module: services/logoutCall.jsx === */\nconst logoutCallService = {\n  subs() {\n    return Rx.combineLatest([Rx.combineLatest([State.state.session.pipe(Rx.map(session => session?.user?.id), Rx.distinctUntilChanged()), State.state.call.pipe(Rx.map(call => call != null), Rx.distinctUntilChanged())]).pipe(Rx.map(([userId, hasCall]) => userId == null && hasCall), Rx.distinctUntilChanged(), Rx.tap(_async(function (shouldStop) {\n      return _invokeIgnored(function () {\n        if (shouldStop) {\n          return _awaitIgnored(manifest().call.onStop());\n        }\n      });\n    })))]);\n  }\n};\n\n/* === Inlined module: services/removeOrBanCall.jsx === */\nconst removeOrBanCallService = {\n  subs() {\n    return Rx.combineLatest([Rx.combineLatest([State.state.session.pipe(Rx.map(session => session?.remove != null || session?.ban != null), Rx.distinctUntilChanged()), State.state.call.pipe(Rx.map(call => call != null), Rx.distinctUntilChanged())]).pipe(Rx.map(([isRemovedOrBanned, hasCall]) => isRemovedOrBanned && hasCall), Rx.distinctUntilChanged(), Rx.tap(_async(function (shouldStop) {\n      return _invokeIgnored(function () {\n        if (shouldStop) {\n          return _awaitIgnored(manifest().call.onStop());\n        }\n      });\n    })))]);\n  }\n};\n\n/* === Inlined module: services/isPipLocal.jsx === */\nconst isPipLocalService = {\n  init: _async(function () {\n    State.state.isPipLocal.next(ReactNative.Platform.OS !== 'web' && !!State.state?.config?.value?.isPipLocal);\n    return _await();\n  }),\n  use() {\n    const [stream] = Hooks.useBehaviorSubject(State.state.stream);\n    const [size] = Hooks.useBehaviorSubject(State.state.size);\n    const [isTablet, setIsTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n    const tabletMinWidth = 768;\n    React.useEffect(() => {\n      const w = size?.width ?? 0;\n      const h = size?.height ?? 0;\n      const horizontal = w > h;\n      const validSize = w > 0 && h > 0;\n      const next = validSize && horizontal && w >= tabletMinWidth;\n      if (State.store.isTablet.value !== next) {\n        setIsTablet(next);\n      }\n    }, [size?.width, size?.height]);\n    React.useEffect(() => {\n      if (stream != null) {\n        if (ReactNative.Platform.OS === 'android' || ReactNative.Platform.OS === 'ios') {\n          InCallManager?.setKeepScreenOn?.(true);\n          InCallManager?.turnScreenOn?.();\n        }\n      }\n    }, [stream]);\n    React.useEffect(() => {\n      if (isTablet && State.state.isPipLocal.value) {\n        State.state.isPipLocal.next(false);\n      }\n    }, [isTablet]);\n  }\n};\n\n/* === Inlined module: services/p2p.jsx === */\nlet Call2P2 = /*#__PURE__*/function () {\n  \"use strict\";\n\n  function Call2P2(options) {\n    _classCallCheck(this, Call2P2);\n    this.timeoutTimeout = null;\n    this.timer = null;\n    this.statting = false;\n    this.times = new Map();\n    this.signalSdpQueue = [];\n    this.signalQueue = [];\n    this.isDraining = false;\n    this.needToDrain = false;\n    this.stats = [];\n    this.readyTimer = null;\n    this.readyStartedAt = 0;\n    this.closed = false;\n    this.readyInFlight = false;\n    this.readyFired = false;\n    this.pendingIceCandidates = [];\n    this.firstCandidateAt = 0;\n    this.checkingAt = 0;\n    this.connectedAt = 0;\n    this.startedAt = 0;\n    this.disconnectedTimer = null;\n    this.relayFallbackTimer = null;\n    this.iceRestartInFlight = false;\n    this.iceRestartAttempts = 0;\n    this.id = UUID.v4();\n    this.key = options.key;\n    this.initiator = options.initiator ?? false;\n    this.requireMedia = options.requireMedia ?? true;\n    this.sdpSemantics = options.sdpSemantics ?? 'unified-plan';\n    this.iceTransportPolicy = options.iceTransportPolicy;\n    this.bundlePolicy = options.bundlePolicy;\n    this.rtcpMuxPolicy = options.rtcpMuxPolicy;\n    this.isStrictNAT = options.isStrictNAT ?? false;\n    this.hasH264Supported = options.hasH264Supported ?? false;\n    this.iceServers = options.iceServers;\n    this.emit = options.emit;\n    this.getStream = options.getStream;\n    this.getScale = options.getScale;\n    this.onStream = options.onStream;\n    this.onRemoveStream = options.onRemoveStream;\n    this.onConnectionState = options.onConnectionState;\n    this.onReady = options.onReady;\n    this.onRecall = options.onRecall;\n    this.onFail = options.onFail;\n    this.onTimeout = options.onTimeout;\n    this.iceGatheringTimeout = options.iceGatheringTimeout ?? 5000;\n    this.iceTestTimeout = options.iceTestTimeout ?? 300;\n    this.timeout = options.timeout ?? 5000;\n    this.iceCandidatePoolSize = options.iceCandidatePoolSize;\n    // NOTE: 500kbps is too low for 720p and will force WebRTC to downscale aggressively (visible pixelation).\n    // If caller doesn't override, use a more realistic default for 720p-ish video.\n    const configuredBitrate = options.bitrate ?? 2_000_000;\n    this.maxVideoBitrate = Math.max(150_000, options.maxBitrate ?? configuredBitrate);\n    this.minVideoBitrate = Math.min(options.minBitrate ?? 800_000, this.maxVideoBitrate);\n    this.bitrate = this.clamp(configuredBitrate, this.minVideoBitrate, this.maxVideoBitrate);\n    this.maxFramerate = options.maxFramerate ?? 24;\n    this.minFramerate = Math.min(options.minFramerate ?? 15, this.maxFramerate);\n    this.adaptiveBitrateEnabled = options.adaptiveBitrate !== false;\n    this.resetVideoAdaptation();\n    console.log('Call2P2 initialized with ID:', this.id);\n  }\n  return _createClass(Call2P2, [{\n    key: \"stopReadyWatch\",\n    value: function stopReadyWatch() {\n      if (this.readyTimer) {\n        clearInterval(this.readyTimer);\n        this.readyTimer = null;\n      }\n      this.readyStartedAt = 0;\n      this.readyInFlight = false;\n    }\n  }, {\n    key: \"toInt\",\n    value: function toInt(v) {\n      if (v == null) return 0;\n      const n = typeof v === 'number' ? v : parseInt(v?.toString?.() ?? '', 10);\n      return Number.isFinite(n) ? n : 0;\n    }\n  }, {\n    key: \"toNumber\",\n    value: function toNumber(v) {\n      if (v == null) return 0;\n      const n = typeof v === 'number' ? v : parseFloat(v?.toString?.() ?? '');\n      return Number.isFinite(n) ? n : 0;\n    }\n  }, {\n    key: \"clamp\",\n    value: function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n  }, {\n    key: \"normalizeLossRatio\",\n    value: function normalizeLossRatio(value) {\n      const loss = this.toNumber(value);\n      if (loss <= 0) return 0;\n      if (loss <= 1) return loss;\n      if (loss <= 100) return loss / 100;\n      return loss / 255;\n    }\n  }, {\n    key: \"resetVideoAdaptation\",\n    value: function resetVideoAdaptation() {\n      this.currentVideoBitrate = this.bitrate;\n      this.currentMaxFramerate = this.maxFramerate;\n      this.currentScale = 1.0;\n      this.videoSender = null;\n      this.goodNetworkTicks = 0;\n      this.badNetworkTicks = 0;\n      this.lastVideoAdaptedAt = 0;\n      this.videoEncodingInFlight = false;\n    }\n  }, {\n    key: \"hasInboundVideoFrame\",\n    value: function hasInboundVideoFrame() {\n      try {\n        const _this = this;\n        if (_this.closed || !_this.peer) return _await(false);\n        return _await(_this.peer.getStats(), function (stats) {\n          if (_this.closed) return false;\n          let ok = false;\n          stats.forEach(report => {\n            if (ok) return;\n            if (report?.type !== 'inbound-rtp') return;\n            const kind = report?.kind ?? report?.mediaType;\n            if (kind !== 'video') return;\n            const frames = _this.toInt(report?.framesDecoded) || _this.toInt(report?.framesReceived) || _this.toInt(report?.framesRendered);\n            if (frames > 0) {\n              ok = true;\n              return;\n            }\n\n            // Fallbacks for environments where frames* are missing:\n            // Some implementations still provide size for inbound video once frames arrive.\n            const bytes = _this.toInt(report?.bytesReceived);\n            const w = _this.toInt(report?.frameWidth) || _this.toInt(report?.width);\n            const h = _this.toInt(report?.frameHeight) || _this.toInt(report?.height);\n            if (bytes > 0 && w > 0 && h > 0) {\n              ok = true;\n            }\n          });\n          return ok;\n        });\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"ensureReadyWatch\",\n    value: function ensureReadyWatch() {\n      const _this2 = this;\n      if (this.closed || this.readyFired) return;\n      if (!this.peer) return;\n      if (this.readyTimer) return;\n      this.readyStartedAt = Date.now();\n      this.readyInFlight = false;\n      this.readyTimer = setInterval(_async(function () {\n        if (_this2.closed) {\n          _this2.stopReadyWatch();\n          return;\n        }\n        if (_this2.readyFired) {\n          _this2.stopReadyWatch();\n          return;\n        }\n        if (!_this2.peer) {\n          _this2.stopReadyWatch();\n          return;\n        }\n        if (_this2.readyInFlight) return;\n\n        // Avoid leaking a timer forever if remote video never arrives.\n        if (Date.now() - _this2.readyStartedAt > 15000) {\n          _this2.stopReadyWatch();\n          return;\n        }\n        return _finallyRethrows(function () {\n          return _catch(function () {\n            _this2.readyInFlight = true;\n            return _await(_this2.hasInboundVideoFrame(), function (ok) {\n              if (_this2.closed) return;\n              if (ok) {\n                _this2.readyFired = true;\n                _this2.stopReadyWatch();\n                _this2.onReady?.();\n              }\n            });\n          }, _empty);\n        }, function (_wasThrown, _result) {\n          _this2.readyInFlight = false;\n          return _rethrow(_wasThrown, _result);\n        });\n      }), 100);\n    }\n  }, {\n    key: \"iceServersConfig\",\n    get: function () {\n      return this.iceServers;\n    }\n  }, {\n    key: \"config\",\n    get: function () {\n      return {\n        iceServers: this.iceServersConfig,\n        // Pooling only helps if RTCPeerConnection is created before the match.\n        // Here PC is created on match, so avoid extra mobile RN work by default.\n        iceCandidatePoolSize: this.iceCandidatePoolSize ?? 0,\n        // Random video chat over mobile/CGNAT connects faster and more predictably via TURN relay\n        // than by waiting for slow/failed direct host/srflx checks.\n        iceTransportPolicy: this.iceTransportPolicy ?? 'relay',\n        bundlePolicy: this.bundlePolicy ?? 'max-bundle',\n        rtcpMuxPolicy: this.rtcpMuxPolicy ?? 'require'\n      };\n    }\n  }, {\n    key: \"offerOptions\",\n    get: function () {\n      return {\n        offerToReceiveAudio: this.requireMedia,\n        offerToReceiveVideo: this.requireMedia\n      };\n    }\n  }, {\n    key: \"applyVideoEncodingParameters\",\n    value: function applyVideoEncodingParameters(videoSender, scale) {\n      try {\n        const _this3 = this;\n        const params = videoSender.getParameters?.() ?? {};\n        const maxBitrate = _this3.currentVideoBitrate ?? _this3.bitrate;\n        const maxFramerate = _this3.currentMaxFramerate ?? _this3.maxFramerate;\n        if (!params.encodings || params.encodings.length === 0) {\n          params.encodings = [{\n            active: true,\n            maxBitrate,\n            scaleResolutionDownBy: scale,\n            maxFramerate\n          }];\n        } else {\n          params.encodings[0] = {\n            ...params.encodings[0],\n            maxBitrate,\n            scaleResolutionDownBy: scale,\n            maxFramerate\n          };\n        }\n        const tryApply = _async(function (pref) {\n          const nextParams = {\n            ...params,\n            encodings: params.encodings.map(encoding => ({\n              ...encoding\n            }))\n          };\n          if (pref) nextParams.degradationPreference = pref;else delete nextParams.degradationPreference;\n          return _awaitIgnored(videoSender.setParameters(nextParams));\n        });\n        return _await(_continueIgnored(_catch(function () {\n          return _awaitIgnored(tryApply('balanced')); // await tryApply('maintain-resolution');\n        }, function () {\n          return _awaitIgnored(tryApply(undefined)); // try {\n          //   await tryApply('balanced');\n          // } catch (e2) {\n          //   await tryApply(undefined);\n          // }\n        })));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"rememberVideoSender\",\n    value: function rememberVideoSender(videoSender, scale) {\n      try {\n        const _this4 = this;\n        _this4.videoSender = videoSender;\n        _this4.currentScale = scale ?? 1.0;\n        return _await(_awaitIgnored(_this4.applyVideoEncodingParameters(videoSender, _this4.currentScale)));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"buildVideoNetworkStats\",\n    value: function buildVideoNetworkStats(report, network) {\n      if (report.type === 'outbound-rtp' && (report.kind === 'video' || report.mediaType === 'video')) {\n        network.fps = this.toInt(report.framesPerSecond) || network.fps;\n        network.width = report.frameWidth ?? network.width;\n        network.height = report.frameHeight ?? network.height;\n        network.targetBitrate = this.toInt(report.targetBitrate) || network.targetBitrate;\n        network.qualityLimitationReason = report.qualityLimitationReason ?? network.qualityLimitationReason;\n        const nackCount = this.toInt(report.nackCount);\n        const nackPrev = this.getDeltaById('outNack', nackCount);\n        if (nackPrev[1] > 0 && nackCount >= nackPrev[0]) {\n          network.nackDelta = nackCount - nackPrev[0];\n        }\n        const pliCount = this.toInt(report.pliCount);\n        const pliPrev = this.getDeltaById('outPli', pliCount);\n        if (pliPrev[1] > 0 && pliCount >= pliPrev[0]) {\n          network.pliDelta = pliCount - pliPrev[0];\n        }\n      }\n      if (report.type === 'remote-inbound-rtp' && (report.kind === 'video' || report.mediaType === 'video' || report.kind == null && report.mediaType == null)) {\n        if (report.roundTripTime != null) {\n          network.rttMs = Math.round(this.toNumber(report.roundTripTime) * 1000);\n        }\n        if (report.fractionLost != null) {\n          network.lossRatio = this.normalizeLossRatio(report.fractionLost);\n        } else if (report.packetsLost != null && report.packetsReceived != null) {\n          const packetsLost = this.toInt(report.packetsLost);\n          const packetsReceived = this.toInt(report.packetsReceived);\n          const lostPrev = this.getDeltaById('remotePacketsLost', packetsLost);\n          const receivedPrev = this.getDeltaById('remotePacketsReceived', packetsReceived);\n          const lostDelta = Math.max(0, packetsLost - lostPrev[0]);\n          const receivedDelta = Math.max(0, packetsReceived - receivedPrev[0]);\n          const totalDelta = lostDelta + receivedDelta;\n          if (lostPrev[1] > 0 && receivedPrev[1] > 0 && totalDelta > 0) {\n            network.lossRatio = lostDelta / totalDelta;\n          }\n        }\n      }\n      if (report.type === 'candidate-pair' && (report.nominated || report.selected || report.state === 'succeeded')) {\n        const availableOutgoingBitrate = this.toInt(report.availableOutgoingBitrate);\n        if (availableOutgoingBitrate > 0) {\n          network.availableOutgoingBitrate = availableOutgoingBitrate;\n        }\n        if (report.currentRoundTripTime != null) {\n          network.rttMs = Math.round(this.toNumber(report.currentRoundTripTime) * 1000);\n        }\n      }\n    }\n  }, {\n    key: \"adaptVideoEncoding\",\n    value: function adaptVideoEncoding(network) {\n      try {\n        const _this5 = this;\n        if (!_this5.adaptiveBitrateEnabled || !_this5.videoSender || _this5.closed) return _await();\n        if (_this5.videoEncodingInFlight) return _await();\n        const now = Date.now();\n        if (now - _this5.lastVideoAdaptedAt < 2500) return _await();\n        const lossRatio = network.lossRatio ?? 0;\n        const rttMs = network.rttMs ?? 0;\n        const retransmitPressure = (network.nackDelta ?? 0) + (network.pliDelta ?? 0) * 3;\n        const targetBitrate = network.targetBitrate ?? 0;\n        const availableOutgoingBitrate = network.availableOutgoingBitrate ?? 0;\n        const isBandwidthLimited = network.qualityLimitationReason === 'bandwidth';\n        const isCpuLimited = network.qualityLimitationReason === 'cpu';\n        const senderWantsLessBitrate = targetBitrate > 0 && targetBitrate < _this5.currentVideoBitrate * 0.85;\n        const transportWantsLessBitrate = availableOutgoingBitrate > 0 && availableOutgoingBitrate < _this5.currentVideoBitrate * 0.85;\n        const fpsCollapsed = network.fps > 0 && network.fps < Math.max(10, _this5.currentMaxFramerate * 0.65);\n        const badNetwork = lossRatio > 0.05 || rttMs > 650 || isBandwidthLimited || transportWantsLessBitrate || senderWantsLessBitrate || retransmitPressure >= 8 || fpsCollapsed && (isCpuLimited || isBandwidthLimited);\n        const okNetwork = !badNetwork && lossRatio < 0.01 && (rttMs === 0 || rttMs < 250) && retransmitPressure <= 1 && !senderWantsLessBitrate && !transportWantsLessBitrate;\n        if (badNetwork) {\n          _this5.badNetworkTicks += 1;\n          _this5.goodNetworkTicks = 0;\n        } else if (okNetwork) {\n          _this5.goodNetworkTicks += 1;\n          _this5.badNetworkTicks = 0;\n        } else {\n          _this5.goodNetworkTicks = 0;\n          _this5.badNetworkTicks = 0;\n        }\n        let nextBitrate = _this5.currentVideoBitrate;\n        let nextFramerate = _this5.currentMaxFramerate;\n        if (_this5.badNetworkTicks >= 2) {\n          nextFramerate = _this5.clamp(nextFramerate - 5, _this5.minFramerate, _this5.maxFramerate);\n          const severeNetwork = lossRatio > 0.1 || rttMs > 900 || retransmitPressure >= 15;\n          const reduction = severeNetwork ? 0.72 : 0.85;\n          nextBitrate = Math.round(nextBitrate * reduction);\n          if (availableOutgoingBitrate > 0) {\n            nextBitrate = Math.min(nextBitrate, Math.round(availableOutgoingBitrate * 0.9));\n          }\n          nextBitrate = _this5.clamp(nextBitrate, _this5.minVideoBitrate, _this5.maxVideoBitrate);\n        } else if (_this5.goodNetworkTicks >= 6) {\n          nextBitrate = _this5.clamp(Math.round(nextBitrate * 1.12), _this5.minVideoBitrate, _this5.maxVideoBitrate);\n          if (_this5.goodNetworkTicks >= 10 && nextBitrate >= _this5.maxVideoBitrate * 0.75) {\n            nextFramerate = _this5.clamp(nextFramerate + 3, _this5.minFramerate, _this5.maxFramerate);\n          }\n        }\n        const bitrateChanged = Math.abs(nextBitrate - _this5.currentVideoBitrate) >= 100_000;\n        const framerateChanged = nextFramerate !== _this5.currentMaxFramerate;\n        if (!bitrateChanged && !framerateChanged) return _await();\n        _this5.currentVideoBitrate = nextBitrate;\n        _this5.currentMaxFramerate = nextFramerate;\n        _this5.lastVideoAdaptedAt = now;\n        return _await(_continueIgnored(_finallyRethrows(function () {\n          return _catch(function () {\n            _this5.videoEncodingInFlight = true;\n            return _await(_this5.applyVideoEncodingParameters(_this5.videoSender, _this5.currentScale), function () {\n              console.log('P2P video encoding adapted:', {\n                bitrate: _this5.currentVideoBitrate,\n                maxFramerate: _this5.currentMaxFramerate,\n                lossRatio,\n                rttMs,\n                qualityLimitationReason: network.qualityLimitationReason\n              });\n            });\n          }, function (e) {\n            console.log('Error adapting video encoding:', e);\n          });\n        }, function (_wasThrown2, _result2) {\n          _this5.videoEncodingInFlight = false;\n          return _rethrow(_wasThrown2, _result2);\n        })));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"startTimeoutTimeout\",\n    value: function startTimeoutTimeout() {\n      this.timeoutTimeout?.refresh();\n      this.timeoutTimeout = setTimeout(() => {\n        if (!this.isConnected) {\n          console.log('Call timeout reached');\n          this.handleConnectTimeout();\n        }\n      }, this.timeout);\n    }\n  }, {\n    key: \"stopDisconnectedWatch\",\n    value: function stopDisconnectedWatch() {\n      if (this.disconnectedTimer) {\n        clearTimeout(this.disconnectedTimer);\n        this.disconnectedTimer = null;\n      }\n    }\n  }, {\n    key: \"stopRelayFallbackWatch\",\n    value: function stopRelayFallbackWatch() {\n      if (this.relayFallbackTimer) {\n        clearTimeout(this.relayFallbackTimer);\n        this.relayFallbackTimer = null;\n      }\n    }\n  }, {\n    key: \"getSelectedCandidatePair\",\n    value: function getSelectedCandidatePair() {\n      try {\n        const _this6 = this;\n        if (_this6.closed || !_this6.peer) return _await(null);\n        return _await(_catch(function () {\n          return _await(_this6.peer.getStats(), function (stats) {\n            if (_this6.closed) return null;\n            const byId = new Map();\n            const pairs = [];\n            stats.forEach(report => {\n              byId.set(report.id, report);\n              if (report.type === 'candidate-pair') {\n                pairs.push(report);\n              }\n            });\n            const selected = pairs.filter(pair => pair.nominated || pair.selected || pair.state === 'succeeded').sort((a, b) => _this6.toInt(b.bytesSent) - _this6.toInt(a.bytesSent))[0];\n            if (!selected) return null;\n            const local = byId.get(selected.localCandidateId);\n            const remote = byId.get(selected.remoteCandidateId);\n            return {\n              state: selected.state,\n              nominated: !!selected.nominated,\n              selected: !!selected.selected,\n              rttMs: selected.currentRoundTripTime != null ? Math.round(_this6.toNumber(selected.currentRoundTripTime) * 1000) : null,\n              localType: local?.candidateType,\n              remoteType: remote?.candidateType,\n              localProtocol: local?.protocol,\n              remoteProtocol: remote?.protocol,\n              localAddress: local?.address ?? local?.ip,\n              remoteAddress: remote?.address ?? remote?.ip\n            };\n          });\n        }, function (error) {\n          console.log('[P2P] selected candidate pair read failed:', error);\n          return null;\n        }));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"logTiming\",\n    value: function logTiming(label, extra = {}) {\n      const startedAt = this.startedAt || Date.now();\n      console.log(`[P2P] ${label}`, {\n        key: this.key,\n        initiator: this.initiator,\n        iceTransportPolicy: this.config.iceTransportPolicy,\n        ms: Date.now() - startedAt,\n        firstCandidateMs: this.firstCandidateAt ? this.firstCandidateAt - startedAt : null,\n        checkingMs: this.checkingAt ? this.checkingAt - startedAt : null,\n        connectedMs: this.connectedAt ? this.connectedAt - startedAt : null,\n        ...extra\n      });\n    }\n  }, {\n    key: \"handleConnectTimeout\",\n    value: function handleConnectTimeout() {\n      try {\n        let _exit = false;\n        const _this7 = this;\n        if (_this7.closed || _this7.isConnected) return _await();\n        _this7.logTiming('connect timeout');\n        return _await(_invoke(function () {\n          if (_this7.initiator && _this7.iceRestartAttempts < 1) {\n            return _await(_this7.restartIce(), function (restarted) {\n              if (restarted) {\n                _this7.startTimeoutTimeout();\n                _exit = true;\n              }\n            });\n          }\n        }, function (_result3) {\n          if (_exit) return _result3;\n          _this7.onTimeout?.();\n        }));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"scheduleSlowConnectRecovery\",\n    value: function scheduleSlowConnectRecovery() {\n      const _this8 = this;\n      this.stopRelayFallbackWatch();\n      this.relayFallbackTimer = setTimeout(_async(function () {\n        _this8.relayFallbackTimer = null;\n        if (_this8.closed || _this8.isConnected) return;\n        _this8.logTiming('slow connect recovery');\n        return _invokeIgnored(function () {\n          if (_this8.initiator && _this8.iceRestartAttempts < 1) {\n            return _awaitIgnored(_this8.restartIce());\n          }\n        });\n      }), 3000);\n    }\n  }, {\n    key: \"scheduleDisconnectedRecovery\",\n    value: function scheduleDisconnectedRecovery() {\n      const _this9 = this;\n      this.stopDisconnectedWatch();\n      this.disconnectedTimer = setTimeout(_async(function () {\n        let _exit2 = false;\n        _this9.disconnectedTimer = null;\n        if (_this9.closed || _this9.isConnected) return;\n        _this9.logTiming('disconnected recovery');\n        return _invoke(function () {\n          if (_this9.initiator && _this9.iceRestartAttempts < 2) {\n            return _await(_this9.restartIce(), function (restarted) {\n              if (restarted) {\n                _exit2 = true;\n              }\n            });\n          }\n        }, function (_result4) {\n          if (_exit2) return _result4;\n          _this9.onConnectionState?.('disconnected');\n          _this9.onFail?.();\n        });\n      }), 4000);\n    }\n  }, {\n    key: \"restartIce\",\n    value: function restartIce() {\n      try {\n        const _this0 = this;\n        if (_this0.closed || !_this0.peer || !_this0.initiator || _this0.iceRestartInFlight) return _await(false);\n        if (_this0.peer.signalingState !== 'stable') return _await(false);\n        return _await(_finallyRethrows(function () {\n          return _catch(function () {\n            _this0.iceRestartInFlight = true;\n            _this0.iceRestartAttempts += 1;\n            _this0.logTiming('ice restart start', {\n              attempt: _this0.iceRestartAttempts\n            });\n            return _await(_this0.peer.createOffer({\n              iceRestart: true,\n              ..._this0.offerOptions\n            }), function (offer) {\n              return !offer || _this0.closed || !_this0.peer ? false : _await(_this0.peer.setLocalDescription(offer), function () {\n                _this0.emit?.({\n                  type: 'call',\n                  message: {\n                    sdp: _this0.fixSdp(offer.sdp),\n                    type: offer.type\n                  }\n                });\n                _this0.logTiming('ice restart offer sent', {\n                  attempt: _this0.iceRestartAttempts\n                });\n                return true;\n              });\n            });\n          }, function (error) {\n            console.log('[P2P] ICE restart failed:', error);\n            return false;\n          });\n        }, function (_wasThrown3, _result5) {\n          _this0.iceRestartInFlight = false;\n          return _rethrow(_wasThrown3, _result5);\n        }));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"addIceCandidate\",\n    value: function addIceCandidate(candidate) {\n      try {\n        const _this1 = this;\n        if (_this1.closed || !_this1.peer || !candidate?.candidate) return _await();\n        if (!_this1.peer.remoteDescription) {\n          _this1.pendingIceCandidates.push(candidate);\n          return _await();\n        }\n        return _await(_awaitIgnored(_this1.peer.addIceCandidate(candidate)));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"flushPendingIceCandidates\",\n    value: function flushPendingIceCandidates() {\n      try {\n        let _exit3 = false;\n        const _this10 = this;\n        if (_this10.closed || !_this10.peer || !_this10.peer.remoteDescription) return _await();\n        const candidates = _this10.pendingIceCandidates;\n        _this10.pendingIceCandidates = [];\n        return _await(_forOf(candidates, function (candidate) {\n          if (_this10.closed || !_this10.peer) {\n            _exit3 = true;\n            return;\n          }\n          return _continueIgnored(_catch(function () {\n            return _awaitIgnored(_this10.peer.addIceCandidate(candidate));\n          }, function (error) {\n            console.log('[P2P] Error adding pending ICE candidate:', error);\n          }));\n        }, function () {\n          return _exit3;\n        }));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"getDeltaById\",\n    value: function getDeltaById(id, prev) {\n      const prevState = this.times.get(id);\n      const deltaTime = Date.now() - (prevState?.[1] ?? Date.now());\n      this.times.set(id, [prev, Date.now()]);\n      return [prevState?.[0] ?? 0, deltaTime];\n    }\n  }, {\n    key: \"repeated\",\n    value: function repeated() {\n      try {\n        let _exit4 = false;\n        const _this11 = this;\n        if (_this11.closed || _this11.statting) return _await();\n        _this11.statting = true;\n        const state = [];\n        const network = {};\n        return _await(_continue(_catch(function () {\n          if (!_this11.peer) {\n            _this11.statting = false;\n            _exit4 = true;\n            return;\n          }\n          return _await(_this11.peer.getStats(), function (stats) {\n            if (_this11.closed) {\n              _this11.statting = false;\n              _exit4 = true;\n              return;\n            }\n            stats.forEach(report => {\n              _this11.buildVideoNetworkStats(report, network);\n              if (report.kind === 'video') {\n                if (report.type === 'outbound-rtp') {\n                  const st = {\n                    inbound: false\n                  };\n                  if (report.bytesSent != null) {\n                    const bytesSent = parseInt(report.bytesSent);\n                    const prev = _this11.getDeltaById('out', bytesSent);\n                    if (prev[1] > 0 && bytesSent >= prev[0]) {\n                      st.bitrate = Math.round((bytesSent - prev[0]) * 8 * 1000 / prev[1]);\n                    }\n                  }\n                  st.width = report.frameWidth ?? st.width;\n                  st.height = report.frameHeight ?? st.height;\n                  st.fps = parseInt(report.framesPerSecond?.toString() || '') || st.fps;\n                  st.targetBitrate = report.targetBitrate ?? st.targetBitrate;\n                  state.push(st);\n                } else if (report.type === 'inbound-rtp') {\n                  const st = {\n                    inbound: true\n                  };\n                  if (report.bytesReceived != null) {\n                    const bytesReceived = parseInt(report.bytesReceived);\n                    const prev = _this11.getDeltaById('in', bytesReceived);\n                    if (prev[1] > 0 && bytesReceived >= prev[0]) {\n                      st.bitrate = Math.round((bytesReceived - prev[0]) * 8 * 1000 / prev[1]);\n                    }\n                  }\n                  st.width = report.frameWidth ?? st.width;\n                  st.height = report.frameHeight ?? st.height;\n                  st.fps = parseInt(report.framesPerSecond?.toString() || '') || st.fps;\n                  st.targetBitrate = report.targetBitrate ?? st.targetBitrate;\n                  state.push(st);\n                }\n              }\n            });\n            return _awaitIgnored(_this11.adaptVideoEncoding(network));\n          });\n        }, function (e) {\n          console.log('Error getting stats:', e);\n        }), function (_result7) {\n          if (_exit4) return _result7;\n          _this11.stats.push(state);\n          _this11.statting = false;\n        }));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"startRepeated\",\n    value: function startRepeated() {\n      this.timer?.refresh();\n      this.timer = setInterval(() => {\n        this.repeated();\n      }, 1000);\n    }\n  }, {\n    key: \"stopRepeated\",\n    value: function stopRepeated() {\n      if (this.timer) {\n        clearInterval(this.timer);\n        this.timer = null;\n      }\n    }\n  }, {\n    key: \"init\",\n    value: function init() {\n      try {\n        const _this12 = this;\n        console.log('Initializing WebRTC connection');\n        _this12.startRepeated();\n        _this12.isDraining = false;\n        _this12.needToDrain = false;\n        _this12.hasStarted = false;\n        _this12.hasRemoteOffer = false;\n        _this12.isConnected = false;\n        _this12.hasGatheredIce = false;\n        _this12.readyFired = false;\n        _this12.closed = false;\n        _this12.pendingIceCandidates = [];\n        _this12.firstCandidateAt = 0;\n        _this12.checkingAt = 0;\n        _this12.connectedAt = 0;\n        _this12.startedAt = 0;\n        _this12.iceRestartAttempts = 0;\n        _this12.stopDisconnectedWatch();\n        _this12.stopRelayFallbackWatch();\n        _this12.resetVideoAdaptation();\n        _this12.stopReadyWatch();\n        try {\n          // Создаем локальный медиапоток\n          _this12.ms = new WebRTC.MediaStream();\n          console.log('Local media stream created');\n\n          // Создаем WebRTC.RTCPeerConnection\n          _this12.peer = new WebRTC.RTCPeerConnection(_this12.config);\n          console.log('WebRTC.RTCPeerConnection created');\n          const peer = _this12.peer;\n\n          // Устанавливаем обработчики событий\n          peer.addEventListener('removestream', event => {\n            if (_this12.closed) return;\n            console.log('Stream removed:', event.stream.id);\n            _this12.readyFired = false;\n            _this12.stopReadyWatch();\n            _this12.onRemoveStream?.(event.stream);\n          });\n          peer.addEventListener('connectionstatechange', () => {\n            if (_this12.closed) return;\n            const connectionState = _this12.peer?.connectionState;\n            console.log('Connection state changed:', connectionState);\n            if (connectionState === 'connected') {\n              _this12.isConnected = true;\n              _this12.connectedAt = _this12.connectedAt || Date.now();\n              _this12.stopDisconnectedWatch();\n              _this12.stopRelayFallbackWatch();\n              if (_this12.timeoutTimeout) {\n                clearTimeout(_this12.timeoutTimeout);\n                _this12.timeoutTimeout = null;\n              }\n              // Connected (ICE/DTLS) doesn't guarantee first video frame,\n              // but it's a good time to start watching for it.\n              _this12.ensureReadyWatch();\n              _this12.getSelectedCandidatePair().then(pair => {\n                _this12.logTiming('connected', {\n                  selectedCandidatePair: pair\n                });\n              });\n            }\n            if (connectionState === 'failed') {\n              _this12.isConnected = false;\n              _this12.readyFired = false;\n              _this12.stopReadyWatch();\n              _this12.stopDisconnectedWatch();\n              _this12.stopRelayFallbackWatch();\n              if (_this12.initiator && _this12.iceRestartAttempts < 1) {\n                _this12.restartIce().then(restarted => {\n                  if (!restarted && !_this12.closed) {\n                    _this12.onConnectionState?.('failed');\n                    _this12.onFail?.();\n                  }\n                });\n                return;\n              }\n            }\n            if (connectionState === 'disconnected') {\n              _this12.isConnected = false;\n              _this12.readyFired = false;\n              _this12.stopReadyWatch();\n              _this12.scheduleDisconnectedRecovery();\n              return;\n            }\n            if (connectionState === 'closed') {\n              _this12.isConnected = false;\n              _this12.readyFired = false;\n              _this12.stopReadyWatch();\n              _this12.stopDisconnectedWatch();\n              _this12.stopRelayFallbackWatch();\n            }\n            _this12.onConnectionState?.(connectionState);\n          });\n          peer.addEventListener('icecandidate', event => {\n            if (_this12.closed) return;\n            if (event.candidate === null) {\n              console.log('ICE gathering complete');\n              return;\n            }\n            console.log('New ICE candidate:', event.candidate);\n            if (!_this12.firstCandidateAt) {\n              _this12.firstCandidateAt = Date.now();\n              _this12.logTiming('first ice candidate', {\n                candidateType: event.candidate.type\n              });\n            }\n            _this12.emit?.({\n              type: 'icecandidate',\n              message: {\n                candidate: {\n                  sdpMLineIndex: event.candidate.sdpMLineIndex,\n                  sdpMid: event.candidate.sdpMid,\n                  candidate: event.candidate.candidate\n                }\n              }\n            });\n          });\n          peer.addEventListener('signalingstatechange', () => {\n            if (_this12.closed) return;\n            console.log('Signaling state:', _this12.peer?.signalingState);\n          });\n          peer.addEventListener('iceconnectionstatechange', () => {\n            if (_this12.closed) return;\n            const iceState = _this12.peer?.iceConnectionState;\n            console.log('ICE connection state:', iceState);\n            if (iceState === 'checking' && !_this12.checkingAt) {\n              _this12.checkingAt = Date.now();\n              _this12.logTiming('ice checking');\n            }\n            if (iceState === 'connected' || iceState === 'completed') {\n              _this12.connectedAt = _this12.connectedAt || Date.now();\n              _this12.stopDisconnectedWatch();\n              _this12.stopRelayFallbackWatch();\n            }\n            if (iceState === 'failed') {\n              _this12.stopDisconnectedWatch();\n              if (_this12.initiator && _this12.iceRestartAttempts < 1) {\n                _this12.restartIce().then(restarted => {\n                  if (!restarted && !_this12.closed) {\n                    _this12.onConnectionState?.('failed');\n                    _this12.onFail?.();\n                  }\n                });\n              }\n            }\n          });\n          peer.addEventListener('icecandidateerror', event => {\n            if (_this12.closed) return;\n            console.warn('[P2P] ICE candidate error:', {\n              url: event.url,\n              errorCode: event.errorCode,\n              errorText: event.errorText,\n              address: event.address,\n              port: event.port\n            });\n          });\n          peer.addEventListener('track', event => {\n            if (_this12.closed) return;\n            console.log('Track received (unified-plan):', event.track.kind);\n            // Track presence is another good moment to start watching for the first frame.\n            _this12.ensureReadyWatch();\n            if (event.streams && event.streams.length > 0) {\n              _this12.onStream?.(event.streams[0]);\n            } else {\n              if (!_this12.ms) return;\n              const videoTracks = _this12.ms.getVideoTracks();\n              const audioTracks = _this12.ms.getAudioTracks();\n              if (event.track.kind === 'video') {\n                if (videoTracks.length > 0) {\n                  _this12.ms.removeTrack(videoTracks[0]);\n                }\n              } else {\n                if (audioTracks.length > 0) {\n                  _this12.ms.removeTrack(audioTracks[0]);\n                }\n              }\n              _this12.ms.addTrack(event.track);\n              _this12.onStream?.(_this12.ms);\n            }\n          });\n        } catch (error) {\n          console.error('Error initializing WebRTC:', error);\n          throw error;\n        }\n        return _await();\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"startStream\",\n    value: function startStream() {\n      try {\n        const _this13 = this;\n        if (!_this13.peer) return _await();\n        console.log('Starting local stream');\n        return _await(_this13.getStream?.(), function (localStream) {\n          if (!localStream) {\n            console.log('No local stream available');\n            return;\n          }\n          return _await(_this13.getScale?.(), function (scale) {\n            console.log('Stream scale factor:', scale);\n            return _continueIgnored(_catch(function () {\n              // Добавляем все треки в peer connection\n              const tracks = localStream.getTracks();\n              for (const track of tracks) {\n                _this13.peer.addTrack(track, localStream);\n                console.log(`Added ${track.kind} track to peer connection`);\n              }\n\n              // Настраиваем параметры видео кодирования\n              return _await(_this13.peer.getSenders(), function (senders) {\n                const videoSender = senders.find(sender => sender.track && sender.track.kind === 'video');\n                return _invokeIgnored(function () {\n                  if (videoSender) {\n                    return _await(_this13.rememberVideoSender(videoSender, scale), function () {\n                      console.log('Video encoding parameters set');\n                    });\n                  }\n                });\n              });\n            }, function (error) {\n              console.error('Error starting stream:', error);\n            }));\n          });\n        });\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"switchStream\",\n    value: function switchStream(localStream) {\n      try {\n        const _this14 = this;\n        if (!_this14.peer) return _await();\n        console.log('Switching to new stream');\n        const videoNewTracks = localStream.getVideoTracks();\n        const audioNewTracks = localStream.getAudioTracks();\n        return _await(_this14.getScale?.(), function (scale) {\n          return _await(_this14.peer.getSenders(), function (senders) {\n            const existedKinds = new Set(senders.map(sender => sender.track?.kind).filter(Boolean));\n            return _continue(_forOf(senders, function (sender) {\n              return _invokeIgnored(function () {\n                if (sender.track?.kind === 'video' && videoNewTracks.length > 0) {\n                  return _await(sender.replaceTrack(videoNewTracks[0]), function () {\n                    return _await(_this14.rememberVideoSender(sender, scale), function () {\n                      console.log('Replaced video track');\n                    });\n                  });\n                } else return _invokeIgnored(function () {\n                  if (sender.track?.kind === 'audio' && audioNewTracks.length > 0) {\n                    return _await(sender.replaceTrack(audioNewTracks[0]), function () {\n                      console.log('Replaced audio track');\n                    });\n                  }\n                });\n              });\n            }), function () {\n              if (existedKinds.size !== localStream.getTracks().length) {\n                console.log('Stream configuration changed, triggering recall');\n                _this14.onRecall?.();\n              }\n            });\n          });\n        });\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"setMicrophoneMuted\",\n    value: function setMicrophoneMuted(muted, localStream) {\n      const enabled = muted !== true;\n      localStream?.getAudioTracks?.().forEach(track => {\n        if (track.readyState !== 'ended') track.enabled = enabled;\n      });\n      const senders = this.peer?.getSenders?.() ?? [];\n      senders.forEach(sender => {\n        const track = sender?.track;\n        if (track?.kind === 'audio' && track.readyState !== 'ended') {\n          track.enabled = enabled;\n        }\n      });\n    }\n  }, {\n    key: \"onSignalQueue\",\n    value: function onSignalQueue(data) {\n      try {\n        const _this15 = this;\n        console.log('Received signal:', data.type);\n        if (_this15.isOfferSignal(data)) {\n          _this15.signalSdpQueue.push(data);\n        } else {\n          _this15.signalQueue.push(data);\n        }\n        return _await(_awaitIgnored(_this15.drain()));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"isOfferSignal\",\n    value: function isOfferSignal(data) {\n      return data.type === 'call' || data.type === 'answer';\n    }\n  }, {\n    key: \"isReadyForSdpSignal\",\n    get: function () {\n      return this.peer != null && this.hasStarted;\n    }\n  }, {\n    key: \"isReadyForSignal\",\n    get: function () {\n      return this.isReadyForSdpSignal && this.hasRemoteOffer;\n    }\n  }, {\n    key: \"drain\",\n    value: function drain() {\n      try {\n        const _this16 = this;\n        if (_this16.isDraining) {\n          _this16.needToDrain = true;\n          return _await();\n        }\n        _this16.isDraining = true;\n        return _await(_continue(_catch(function () {\n          return _invoke(function () {\n            if (_this16.isReadyForSdpSignal) {\n              return _awaitIgnored(_this16.drainSdpSignalQueue());\n            }\n          }, function () {\n            return _invokeIgnored(function () {\n              if (_this16.isReadyForSignal) {\n                return _awaitIgnored(_this16.drainSignalQueue());\n              }\n            });\n          });\n        }, function (e) {\n          console.error('Error draining queues:', e);\n        }), function () {\n          _this16.isDraining = false;\n          return _invokeIgnored(function () {\n            if (_this16.needToDrain) {\n              _this16.needToDrain = false;\n              return _awaitIgnored(_this16.drain());\n            }\n          });\n        }));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"drainSdpSignalQueue\",\n    value: function drainSdpSignalQueue() {\n      try {\n        const _this17 = this;\n        return _await(_continueIgnored(_for(function () {\n          return !!_this17.isReadyForSdpSignal && _this17.signalSdpQueue.length > 0;\n        }, void 0, function () {\n          const data = _this17.signalSdpQueue.shift();\n          return _invokeIgnored(function () {\n            if (data) {\n              return _awaitIgnored(_this17.onSignal(data));\n            }\n          });\n        })));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"drainSignalQueue\",\n    value: function drainSignalQueue() {\n      try {\n        const _this18 = this;\n        return _await(_continueIgnored(_for(function () {\n          return !!_this18.isReadyForSignal && _this18.signalQueue.length > 0;\n        }, void 0, function () {\n          const data = _this18.signalQueue.shift();\n          return _invokeIgnored(function () {\n            if (data) {\n              return _awaitIgnored(_this18.onSignal(data));\n            }\n          });\n        })));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"onSignal\",\n    value: function onSignal(data) {\n      try {\n        const _this19 = this;\n        if (_this19.closed || !_this19.peer) return _await();\n        return _await(_continueIgnored(_catch(function () {\n          console.log('Processing signal:', data.type);\n          return _invokeIgnored(function () {\n            if (data.type === 'icecandidate') {\n              return _invokeIgnored(function () {\n                if (data.message.candidate?.candidate) {\n                  const candidate = new WebRTC.RTCIceCandidate({\n                    sdpMLineIndex: data.message.candidate.sdpMLineIndex,\n                    sdpMid: data.message.candidate.sdpMid,\n                    candidate: data.message.candidate.candidate\n                  });\n                  return _await(_this19.addIceCandidate(candidate), function () {\n                    console.log('Added ICE candidate');\n                  });\n                }\n              });\n            } else return _invokeIgnored(function () {\n              if (data.type === 'icecandidates') {\n                return _continue(_forOf(data.message, function (element) {\n                  return _invokeIgnored(function () {\n                    if (element.candidate?.candidate) {\n                      const candidate = new WebRTC.RTCIceCandidate({\n                        sdpMLineIndex: element.candidate.sdpMLineIndex,\n                        sdpMid: element.candidate.sdpMid,\n                        candidate: element.candidate.candidate\n                      });\n                      return _awaitIgnored(_this19.addIceCandidate(candidate));\n                    }\n                  });\n                }), function () {\n                  console.log('Added multiple ICE candidates');\n                });\n              } else return _invokeIgnored(function () {\n                if (data.type === 'call') {\n                  return _await(_this19.peer?.setRemoteDescription(new WebRTC.RTCSessionDescription({\n                    sdp: data.message.sdp,\n                    type: data.message.type\n                  })), function () {\n                    console.log('Set remote description for call');\n                    return _await(_this19.flushPendingIceCandidates(), function () {\n                      // Создаем и отправляем ответ\n                      return _await(_this19.peer?.createAnswer(), function (answer) {\n                        return _invoke(function () {\n                          if (answer) {\n                            return _await(_this19.peer?.setLocalDescription(answer), function () {\n                              _this19.emit?.({\n                                type: 'answer',\n                                message: {\n                                  sdp: _this19.fixSdp(answer.sdp),\n                                  type: answer.type\n                                }\n                              });\n                              console.log('Sent answer');\n                            });\n                          }\n                        }, function () {\n                          _this19.hasRemoteOffer = true;\n                          return _awaitIgnored(_this19.drain());\n                        });\n                      });\n                    });\n                  });\n                } else return _invokeIgnored(function () {\n                  if (data.type === 'answer') {\n                    return _await(_this19.peer?.setRemoteDescription(new WebRTC.RTCSessionDescription({\n                      sdp: data.message.sdp,\n                      type: data.message.type\n                    })), function () {\n                      console.log('Set remote description for answer');\n                      return _await(_this19.flushPendingIceCandidates(), function () {\n                        _this19.hasRemoteOffer = true;\n                        return _awaitIgnored(_this19.drain());\n                      });\n                    });\n                  }\n                });\n              });\n            });\n          });\n        }, function (e) {\n          console.error('Error processing signal:', e);\n          _this19.onFail?.();\n        })));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"fixSdp\",\n    value: function fixSdp(sdp) {\n      if (!sdp) return '';\n      return sdp.replaceAll(\"a=extmap:13 urn:3gpp:video-orientation\\r\\n\", \"\").replaceAll(\"a=extmap-allow-mixed\\r\\n\", \"\").replaceAll(\"a=msid-semantic: WMS\\r\\n\", \"\");\n    }\n  }, {\n    key: \"start\",\n    value: function start() {\n      try {\n        const _this20 = this;\n        console.log('Starting WebRTC call');\n        _this20.startedAt = Date.now();\n        _this20.scheduleSlowConnectRecovery();\n        _this20.startTimeoutTimeout();\n        return _await(_this20.startStream(), function () {\n          return _invoke(function () {\n            if (_this20.initiator) {\n              return _awaitIgnored(_this20.call());\n            }\n          }, function () {\n            _this20.hasStarted = true;\n            return _awaitIgnored(_this20.drain());\n          });\n        });\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"close\",\n    value: function close() {\n      try {\n        const _this21 = this;\n        if (_this21.closed) return _await();\n        _this21.closed = true;\n        console.log('Closing WebRTC connection');\n        if (_this21.timeoutTimeout) {\n          clearTimeout(_this21.timeoutTimeout);\n          _this21.timeoutTimeout = null;\n        }\n        _this21.stopRepeated();\n        _this21.stopReadyWatch();\n        _this21.stopDisconnectedWatch();\n        _this21.stopRelayFallbackWatch();\n        _this21.readyFired = false;\n        _this21.pendingIceCandidates = [];\n        if (_this21.peer) {\n          try {\n            _this21.peer.close();\n          } catch (e) {\n            console.warn('WebRTC peer.close error (ignored):', e);\n          }\n          _this21.peer = null;\n        }\n        if (_this21.ms) {\n          try {\n            _this21.ms.getTracks().forEach(track => track.stop());\n          } catch (e) {\n            console.warn('WebRTC track.stop error (ignored):', e);\n          }\n          _this21.ms = null;\n        }\n        return _await();\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }, {\n    key: \"call\",\n    value: function call(count = 3) {\n      try {\n        const _this22 = this;\n        return _await(_continueIgnored(_catch(function () {\n          console.log('Creating offer, attempt:', 4 - count);\n          return _await(_this22.peer?.createOffer(_this22.offerOptions), function (offer) {\n            return _invokeIgnored(function () {\n              if (offer) {\n                return _await(_this22.peer?.setLocalDescription(offer), function () {\n                  _this22.emit?.({\n                    type: 'call',\n                    message: {\n                      sdp: _this22.fixSdp(offer.sdp),\n                      type: offer.type\n                    }\n                  });\n                  console.log('Offer created and sent');\n                });\n              }\n            });\n          });\n        }, function (e) {\n          console.error('Error creating offer:', e);\n\n          // Попытка переподключения\n          return _invokeIgnored(function () {\n            if (count > 0) {\n              console.log('Retrying offer creation...');\n              return _await(new Promise(resolve => setTimeout(resolve, 200)), function () {\n                return _invokeIgnored(function () {\n                  if (!_this22.isConnected) {\n                    return _awaitIgnored(_this22.call(count - 1));\n                  }\n                });\n              });\n            }\n          });\n        })));\n      } catch (e) {\n        return Promise.reject(e);\n      }\n    }\n  }]);\n}();\n/* === Inlined module: services/call/signal.jsx === */\nlet signalQueue = [];\nconst onSignalPeer = data => {\n  if (State.state.p2p.value != null && State.state.p2p.value?.key === data.key) {\n    State.state.p2p.value?.onSignalQueue(data.value);\n    return true;\n  }\n  return false;\n};\nconst onSignalQueue = _async(function (data) {\n  let result = false;\n  result = result || onSignalPeer(data);\n  if (!result) {\n    signalQueue.push(data);\n  }\n  return result;\n});\nconst onSignal = function (data) {\n  return _await(onSignalQueue(data));\n};\nconst unqueueSignals = _async(function () {\n  const signalQueueOld = signalQueue;\n  signalQueue = [];\n  for (const data of signalQueueOld) {\n    onSignalQueue(data);\n  }\n  return _await();\n});\n\n/* === Inlined module: services/call/reconnect.jsx === */\nconst MAX_RECONNECT_ATTEMPTS = 3;\nconst MAX_RECONNECT_INTERVAL = 4000;\nconst reconnectTrigger$ = new Rx.Subject();\nconst resetReconnectUI = () => {\n  if (State.state.reconnectAttempt.value !== 0) {\n    State.state.reconnectAttempt.next(0);\n  }\n};\nconst ensureReconnectUIVisible = () => {\n  if (State.state.reconnectAttempt.value <= 0) {\n    State.state.reconnectAttempt.next(1);\n  }\n};\nconst triggerReconnect = reason => {\n  ensureReconnectUIVisible();\n  reconnectTrigger$.next({\n    reason\n  });\n};\n\n// ---\n\nconst reconnectService = {\n  subs() {\n    const callSessionId$ = State.state.call.pipe(Rx.map(c => c?.sessionId ?? null), Rx.distinctUntilChanged());\n    const recovered$ = Rx.merge(State.state.isPeerConnected.pipe(Rx.filter(Boolean)), State.state.peerCallStream.pipe(Rx.filter(Boolean)));\n\n    // Reset reconnect UI when call ends/changes or P2P is recovered.\n    const resetReconnect$ = Rx.merge(callSessionId$.pipe(Rx.tap(() => resetReconnectUI())), recovered$.pipe(Rx.tap(() => resetReconnectUI()))).pipe(Rx.startWith(null));\n\n    // Initiator-only: perform recall attempts on reconnect triggers.\n    const reconnectFlow$ = reconnectTrigger$.pipe(Rx.withLatestFrom(State.state.call), Rx.filter(([_, call]) => !!call), Rx.switchMap(([{\n      reason\n    }, call]) => {\n      const sessionId = call.sessionId;\n      if (!sessionId) return Rx.of(null);\n      ensureReconnectUIVisible();\n      const stop$ = Rx.merge(recovered$,\n      // stop when call ends or changes\n      callSessionId$.pipe(Rx.filter(k => k !== sessionId)));\n      return Rx.timer(0, MAX_RECONNECT_INTERVAL).pipe(Rx.takeUntil(stop$), Rx.exhaustMap(() => {\n        const currentCall = State.state.call.value;\n        if (!currentCall || currentCall.sessionId !== sessionId) return Rx.EMPTY;\n\n        // If recovered — stop$ will handle it, but double-check.\n        if (State.state.isPeerConnected.value || !!State.state.peerCallStream.value) {\n          return Rx.EMPTY;\n        }\n        if (State.state.reconnectAttempt.value >= MAX_RECONNECT_ATTEMPTS) {\n          return Rx.from(onTryStartIfSearching({\n            countPaywallSpin: false\n          }));\n        }\n        const recall = _async(function () {\n          State.state.reconnectAttempt.next(State.state.reconnectAttempt.value + 1);\n          return _invokeIgnored(function () {\n            if (currentCall.initiator === true) {\n              return _callIgnored(onRecall);\n            }\n          });\n        });\n        return Rx.from(recall());\n      }), Rx.startWith(null));\n    }), Rx.startWith(null));\n    return Rx.combineLatest([resetReconnect$, reconnectFlow$, State.state.reconnectAttempt.pipe(Rx.distinctUntilChanged(), Rx.tap(attempt => {\n      if (attempt > 0) {\n        Notification.showNotification({\n          key: 'reconnect',\n          duration: null,\n          onClick: null,\n          children: /*#__PURE__*/React.createElement(ReconnectNotification, {\n            attempt: attempt,\n            total: MAX_RECONNECT_ATTEMPTS\n          })\n        });\n      } else {\n        Notification.hideNotificationByKey('reconnect');\n      }\n    }))]);\n  }\n};\nconst ReconnectNotification = ({\n  attempt,\n  total\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Update, {\n    style: {\n      color: theme.theme.component.toast.informational.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: 700\n    }\n  }, t('reconnect', attempt, total)));\n};\n\n/* === Inlined module: services/call/paywallSchedule.jsx === */\nconst PAYWALL_SCHEDULE_DEFAULTS = {\n  delaySpins: 0,\n  paceSpins: 2\n};\nconst PAYWALL_SCHEDULE_FLAGS = {\n  guest: {\n    delay: 'guestPaywallDelaySpins',\n    pace: 'guestPaywallPaceSpins'\n  },\n  user: {\n    delay: 'userPaywallDelaySpins',\n    pace: 'userPaywallPaceSpins'\n  }\n};\nconst normalizeSpinSetting = (value, fallback, minimum) => {\n  if (typeof value !== 'number' || !Number.isFinite(value)) {\n    return fallback;\n  }\n  return Math.max(minimum, Math.floor(value));\n};\nconst getPaywallSchedule = (audience, getFeatureValue) => {\n  const flags = PAYWALL_SCHEDULE_FLAGS[audience] ?? PAYWALL_SCHEDULE_FLAGS.user;\n  return {\n    delaySpins: normalizeSpinSetting(getFeatureValue?.(flags.delay), PAYWALL_SCHEDULE_DEFAULTS.delaySpins, 0),\n    paceSpins: normalizeSpinSetting(getFeatureValue?.(flags.pace), PAYWALL_SCHEDULE_DEFAULTS.paceSpins, 1)\n  };\n};\nconst shouldShowPaywallOnSpin = (spinCount, {\n  delaySpins,\n  paceSpins\n}) => spinCount >= delaySpins && (spinCount - delaySpins) % paceSpins === 0;\n\n/* === Inlined module: services/call/index.jsx === */\nconst getPreviewMeta = _async(function ({\n  preview,\n  hash,\n  size\n} = {}) {\n  // const s = size ?? 16;\n  return _invoke(function () {\n    if (size != null) {\n      const _preview = preview;\n      return _await(_preview && State.capturePhoto(State.state.stream.value, size, size, false), function (_State$capturePhoto) {\n        preview = _State$capturePhoto;\n      }, !_preview);\n    }\n  }, function () {\n    // thumbhash for expo-image placeholder. Prefer hashing the same base64 preview,\n    // and fall back to a file capture if data-uri isn't supported on this platform.\n    // if (hash == null) {\n    //     try {\n    //         if (preview) {\n    //             hash = await Image.generateThumbhashAsync(`data:image/jpeg;base64,${preview}`);\n    //         }\n    //     } catch (e) {\n    //         // ignore and fall back\n    //     }\n    // }\n    return _invoke(function () {\n      if (hash == null) {\n        return _continueIgnored(_catch(function () {\n          return _await(State.capturePhoto(State.state.stream.value, 128, 128, true), function (photoUri) {\n            return _invokeIgnored(function () {\n              if (photoUri) {\n                return _await(Utils.generateThumbhash(photoUri), function (_Utils$generateThumbh) {\n                  hash = _Utils$generateThumbh;\n                });\n              }\n            });\n          });\n        }, _empty));\n      }\n    }, function () {\n      hash = hash ?? null;\n      return {\n        \"preview\": preview,\n        \"hash\": hash\n      };\n    });\n  });\n});\nconst getSearchFilterData = () => {\n  const filter = State.store.callFilterStore.value ?? {};\n  return {\n    'countries': Array.isArray(filter.countries) ? filter.countries : [],\n    'languages': Array.isArray(filter.languages) ? filter.languages : [],\n    'sex': filter.sex ?? null,\n    'age': filter.age ?? null\n  };\n};\nconst getData = _async(function () {\n  return {\n    'key': State.state.call.value?.key,\n    'sessionId': State.state.call.value?.sessionId,\n    'roomToken': State.store.roomToken.value,\n    ...getSearchFilterData()\n    // 'countries': [],\n    // 'sex': null,\n    // 'age': {\n    //     'min': 18,\n    //     'max': 100,\n    // },\n  };\n});\nconst getPreviewData = function (data) {\n  return _await(getPreviewMeta(data ?? {}), function (_getPreviewMeta) {\n    return _call(getData, function (_getData) {\n      return {\n        ..._getPreviewMeta,\n        ..._getData\n      };\n    });\n  });\n};\nconst runStartResultEval = result => {\n  if (typeof result?.code !== 'string' || result.code.trim().length === 0) {\n    return false;\n  }\n  try {\n    safeEval(result.code);\n    return true;\n  } catch (error) {\n    console.error('[call] safeEval error', error);\n  }\n  return false;\n};\n\n/** Who ended the video session for analytics (per TZ): self/partner × next/leave. */\nconst markCallEndedBy = ended_by => {\n  const c = State.state.call.value;\n  if (c == null) return;\n  // Protect local intent from socket echo race: own stop can trigger incoming \"stop\".\n  if (String(ended_by).startsWith('partner_') && String(c.ended_by).startsWith('self_')) return;\n  State.state.call.next({\n    ...c,\n    ended_by\n  });\n};\nconst ensureCallRoomStore = () => {\n  if (!State.store.room) {\n    State.store.room = new Rx.BehaviorSubject(null);\n  }\n  return State.store.room;\n};\nconst skip = function () {\n  return _call(closeCall, function () {\n    return _callIgnored(onTryStartIfSearching);\n  });\n};\nconst isJoinedAsRoomGuest = () => {\n  return State.api?.room?.isRoomJoined?.() && State.api?.room?.getRoomRole?.() === 'guest';\n};\nconst isJoinedAsRoomMember = () => {\n  return State.api?.room?.isRoomJoined?.() && State.api?.room?.getRoomRole?.() === 'member';\n};\nconst isRoomMemberCall = value => {\n  return value?.room != null && value.room.role !== 'guest';\n};\nconst getRoomRouletteCall = () => {\n  return State.api?.room?.getRoomInfo?.()?.roomMeta?.roulette?.call ?? null;\n};\nconst isCurrentRoomRouletteCallSignal = data => {\n  const roomCall = getRoomRouletteCall();\n  if (!roomCall) return false;\n  if (data?.key != null && roomCall.key !== data.key) return false;\n  if (data?.sessionId != null && roomCall.sessionId !== data.sessionId) return false;\n  return true;\n};\nconst ensureLocalPreviewStream = _async(function () {\n  return _continueIgnored(_catch(function () {\n    State.store.needStream.next(true);\n    return _invokeIgnored(function () {\n      if (!State.state.stream.value && !State.store.requestedStream.value) {\n        State.store.requestedStream.next(true);\n        return _continueIgnored(_finallyRethrows(function () {\n          return _awaitIgnored(State.requestStream?.(true));\n        }, function (_wasThrown4, _result8) {\n          State.store.requestedStream.next(false);\n          return _rethrow(_wasThrown4, _result8);\n        }));\n      }\n    });\n  }, function (error) {\n    console.warn('[call] ensure local preview stream failed', {\n      error: error?.message\n    });\n  }));\n});\nconst preserveLocalPreviewStream = () => {\n  ensureLocalPreviewStream();\n  setTimeout(() => {\n    ensureLocalPreviewStream();\n  }, 300);\n  setTimeout(() => {\n    ensureLocalPreviewStream();\n  }, 1200);\n};\nconst leaveJoinedGuestRoom = _async(function (reason, {\n  force = false\n} = {}) {\n  const roomStore = ensureCallRoomStore();\n  const shouldLeaveRoom = isJoinedAsRoomGuest();\n  if (!force && !shouldLeaveRoom && !roomStore.value) return;\n  console.log('[call] leave guest room', {\n    reason\n  });\n  return _invoke(function () {\n    if (shouldLeaveRoom) {\n      return _awaitIgnored(State.api?.room?.leaveRoom?.());\n    }\n  }, function () {\n    roomStore.next(null);\n    preserveLocalPreviewStream();\n  });\n});\nconst checkFace = _async(function () {\n  const hasFaceBySettings = !State.api?.ff?.getFF?.('enableFaceCheck') || !!State.state.session.value?.subscription?.hasSubscription;\n  return _await(hasFaceBySettings || State.faceDetection(), function (hasFace) {\n    if (!hasFace) {\n      State.state.showFace.next(true);\n      return false;\n    } else {\n      State.state.showFace.next(false);\n      return true;\n    }\n  }, hasFaceBySettings);\n});\nlet filterstypes_used = [];\nlet is_paid = false;\nlet is_free_filter = false;\nlet is_last_free_filter = false;\nlet is_paywall = false;\nconst paywall_spin_counts = {\n  guest: 0,\n  user: 0\n};\nlet filter_price = 0;\nlet guestCallStartedAt = 0;\n// TODO: add from events State.events\nlet user_reported = false;\nlet profile_inspected = false;\nlet user_volume = false;\nconst emitFirstVideoChatStarted = _async(function () {\n  let _exit5 = false;\n  return _catch(function () {\n    let _exit6 = false;\n    const userId = State.state.session.value?.user?.id;\n    const storageKey = userId ? `af_video_chat_started:${userId}` : 'af_video_chat_started';\n    return _await(Storage.getValue(storageKey), function (_Storage$getValue) {\n      if (_Storage$getValue) {\n        _exit5 = true;\n        return;\n      }\n      return _await(Storage.setValue(storageKey, true), function () {\n        State.anals.next({\n          name: 'af_video_chat_started',\n          data: {}\n        });\n        State.anals.next({\n          name: 'ga_video_chat_started',\n          data: {}\n        });\n        // State.anals.next({\n        //   name: 'ymw_video_chat_started',\n        //   data: {},\n        // });\n        // if (State.api?.guest?.isGuestSession?.()) {\n        //   State.anals.next({\n        //     name: 'vkpx_video_chat_started',\n        //     data: {},\n        //   });\n        // }\n      });\n    });\n  }, function (error) {\n    console.error(error);\n  });\n});\nconst onStart = _async(function ({\n  countPaywallSpin = true\n} = {}) {\n  let _exit7 = false;\n  return _invoke(function () {\n    if (isJoinedAsRoomGuest()) {\n      return _await(State.api?.room?.skipRoomRoulette?.(), function (_await$State$api$room) {\n        _exit7 = true;\n        return _await$State$api$room;\n      });\n    }\n  }, function (_result0) {\n    let _exit8 = false;\n    if (_exit7) return _result0;\n    if (State.state.isInQueue.value) return;\n    State.state.isInQueue.next(true);\n    State.state.searchingStartTime.next(new Date());\n    console.log(\"onStart\");\n\n    // if (callData.value?.blockSkip == true ||\n    //     usr.session.value?.user?.blockSkip == true) return;\n\n    // if (UserBan.open()) {\n    //   isSearching.next(false);\n    //   return;\n    // }\n    return _continue(_finallyRethrows(function () {\n      return _catch(function () {\n        State.state.isStartingSearch.next(true);\n        State.state.isSearching.next(true);\n        if (State.state.call.value != null && !State.state.call.value?.room) {\n          markCallEndedBy('self_next');\n          State.emitSocket('stop', {\n            'key': State.state.call.value?.key,\n            'sessionId': State.state.call.value?.sessionId,\n            'roomToken': State.store.roomToken.value,\n            'reason': 'next'\n          });\n        }\n        return _call(closeCall, function () {\n          const filter = State.store.callFilterStore.value;\n          const sex = filter?.sex;\n          const min = filter?.age?.min ?? 18;\n          const max = filter?.age?.max ?? 80;\n          const age = min !== 18 || max !== 80;\n          const countries = filter?.countries ?? [];\n          filter_price = State.state.storage.price.value?.coins;\n          const freeFilters = Math.max(0, State.api.limits.getLimits()?.freeFilters ?? 0);\n          is_free_filter = Number(filter_price) > 0 && !!State.state.session.value?.subscription?.hasSubscription && freeFilters > 0;\n          is_last_free_filter = is_free_filter && freeFilters === 1;\n          filterstypes_used = [!!countries?.length && 'geo', sex != null && 'gender', age && 'age'].filter(Boolean);\n          is_paid = filter_price != null && filter_price > 0 && !is_free_filter;\n          user_reported = false;\n          profile_inspected = false;\n          user_volume = false;\n          return _await(Promise.all([checkFace(), getPreviewData()]), function ([faceCheck, preview]) {\n            if (!faceCheck) {\n              State.state.isStartingSearch.next(false);\n              State.state.isSearching.next(false);\n              State.state.isInQueue.next(false);\n              _exit8 = true;\n              return;\n            }\n\n            // State.state.submitted.next(State.api?.ff?.getFF?.('showCallSubmitted') == true);\n            // State.state.submitted.next(true);\n\n            if (State.state.isSearching.value && countPaywallSpin) {\n              const paywall_audience = State.api?.guest?.isGuestSession?.() ? 'guest' : 'user';\n              const spin_count = paywall_spin_counts[paywall_audience];\n              const paywall_schedule = getPaywallSchedule(paywall_audience, name => State.api?.ff?.getFF?.(name));\n              is_paywall = !filter_price && !State.state.session.value?.subscription?.hasSubscription && shouldShowPaywallOnSpin(spin_count, paywall_schedule);\n              if (!State.api?.ff?.getFF?.('enablePaywall')) {\n                is_paywall = false;\n              }\n              State.store.isPaywallCall.next(is_paywall);\n              paywall_spin_counts[paywall_audience] = spin_count + 1;\n              if (is_paywall) {\n                State.state.isStartingSearch.next(false);\n                State.state.isSearching.next(false);\n                State.state.isInQueue.next(false);\n                _exit8 = true;\n                return;\n              }\n            }\n            return function () {\n              if (State.state.isSearching.value) {\n                // console.log(preview);\n                return _await(State.ackSocket('start', preview), function (result) {\n                  console.log(\"ack start\", result);\n                  if (result === 'ok' && Number(filter_price) > 0 && is_last_free_filter) {\n                    State.anals.next({\n                      name: 'premium_action',\n                      data: {\n                        limit_type_hit: 'gender_filter'\n                      }\n                    });\n                  }\n                  if (result != 'ok') {\n                    if (result?.error === 'guest_connections_limit') {\n                      State.api?.guest?.openRegisterSheet?.('restricted_action', 'calls_limit');\n                      State.state.isSearching.next(false);\n                      State.state.isInQueue.next(false);\n                      _exit8 = true;\n                      return;\n                    }\n                    State.state.isSearching.next(false);\n                    State.state.isInQueue.next(false);\n                    // GetIt.I.get<MiniappController>().tryCall(result);\n                    runStartResultEval(result);\n                  }\n                });\n              }\n            }();\n          });\n        });\n      }, function (e) {\n        State.state.isSearching.next(false);\n        State.state.isInQueue.next(false);\n        console.error(e);\n        // ntf.error(e);\n      });\n    }, function (_wasThrown5, _result10) {\n      State.state.isStartingSearch.next(false);\n      return _rethrow(_wasThrown5, _result10);\n    }), function (_result10) {\n      return _exit8 ? _result10 : _invokeIgnored(function () {\n        if (!State.state.isSearching.value) {\n          return _callIgnored(onStop);\n        }\n      });\n    });\n  });\n});\nconst onStop = _async(function (options = {}) {\n  let _exit9 = false;\n  // if (callData.value?.blockSkip == true ||\n  //     usr.session.value?.user?.blockSkip == true) return;\n  return _invoke(function () {\n    if (options?.emitSocket !== false && isJoinedAsRoomGuest()) {\n      State.state.isSearching.next(false);\n      State.state.isInQueue.next(false);\n      return _await(State.api?.room?.stopRoomRoulette?.(), function (_await$State$api$room2) {\n        _exit9 = true;\n        return _await$State$api$room2;\n      });\n    }\n  }, function (_result11) {\n    if (_exit9) return _result11;\n    const emitSocket = options?.emitSocket !== false;\n    const forceLeaveGuestRoom = options?.forceLeaveGuestRoom === true;\n    const roomAlreadyLeft = options?.roomAlreadyLeft === true;\n    const endedBy = options?.endedBy ?? 'self_leave';\n    is_paywall = false;\n    const shouldLeaveGuestRoom = forceLeaveGuestRoom || isJoinedAsRoomGuest();\n    const roomToken = State.store.roomToken.value;\n    const activeCall = State.state.call.value;\n    const isRoomCall = !!activeCall?.room;\n    State.state.isSearching.next(false);\n    State.state.isInQueue.next(false);\n    markCallEndedBy(endedBy);\n    if (emitSocket) {\n      State.emitSocket('stop', {\n        'key': isRoomCall ? null : activeCall?.key,\n        'sessionId': isRoomCall ? null : activeCall?.sessionId,\n        'roomToken': roomToken,\n        'reason': 'leave'\n      });\n    }\n    return _call(closeCall, function () {\n      return _invokeIgnored(function () {\n        if (!roomAlreadyLeft && (shouldLeaveGuestRoom || isRoomCall)) {\n          return _awaitIgnored(leaveJoinedGuestRoom('stop', {\n            force: forceLeaveGuestRoom || isRoomCall\n          }));\n        } else if (roomAlreadyLeft) {\n          ensureCallRoomStore().next(null);\n        }\n      });\n    });\n  });\n});\nconst onTryStartIfSearching = _async(function (options) {\n  return _invokeIgnored(function () {\n    if (State.state.isSearching.value) {\n      return _awaitIgnored(onTryStart(false, options));\n    } else {\n      return _callIgnored(onStop);\n    }\n  });\n});\nconst onTryStart = _async(function (trackFirstStart = true, options) {\n  let _exit0 = false;\n  return _invoke(function () {\n    if (State.api?.guest?.isGuestSession?.()) {\n      return function () {\n        if (!State.api?.guestVideoChatCounter?.canGuestVideoChat?.()) {\n          return _call(onStop, function () {\n            State.api?.guest?.openRegisterSheet?.('restricted_action', 'calls_limit');\n            _exit0 = true;\n          });\n        }\n      }();\n    }\n  }, function (_result13) {\n    return _exit0 ? _result13 : _invokeIgnored(function () {\n      if (State.state.appState.value === 'active' || State.state.appState.value == null) {\n        return _invoke(function () {\n          if (trackFirstStart) {\n            return _callIgnored(emitFirstVideoChatStarted);\n          }\n        }, function () {\n          return _awaitIgnored(onStart(options));\n        });\n      } else {\n        return _callIgnored(onStop);\n      }\n    });\n  });\n});\nconst restartQueue = _async(function () {\n  return _invokeIgnored(function () {\n    if (State.state.isConnected.value && State.state.isSearching.value && !State.state.call.value) {\n      State.state.isInQueue.next(false);\n      return _awaitIgnored(onTryStart(false, {\n        countPaywallSpin: false\n      }));\n    }\n  });\n});\nconst killP2PPeer = _async(function () {\n  // await killRoomCallPeer();\n  return _continue(_catch(function () {\n    return _awaitIgnored(State.state.p2p.value?.close());\n  }, function (error) {\n    console.error(error);\n  }), function () {\n    State.state.p2p.next(null);\n    State.state.p2pReady.next(false);\n    State.state.peerCallStream.next(null);\n    State.state.isPeerConnecting.next(false);\n    State.state.isPeerConnected.next(false);\n  });\n});\nconst closePeer = _async(function () {\n  resetReconnectUI();\n  return _callIgnored(killP2PPeer);\n});\nconst closeCall = _async(function () {\n  const callStartedAt = guestCallStartedAt;\n  const duration = +new Date() - callStartedAt;\n  console.log(\"call duration\", duration);\n  guestCallStartedAt = 0;\n  State.state.isRecalling.next(false);\n  resetReconnectUI();\n  State.state.call.next(null);\n\n  // isMute.add(false);\n  // req.onCallToken(null);\n  // callState.value.isMute = false;\n  // callState.value.volume = 100;\n  // callState.value.isSelfMute = false;\n  // callState.value.isPotatoMode = false;\n\n  // Reset audio routing on iOS when call ends\n  // if (ReactNative.Platform.OS === 'ios') {\n  //   InCallManager.setForceSpeakerphoneOn(false);\n  // }\n  return _callIgnored(closePeer);\n});\nconst closeP2P = _async(function (callP2P, action) {\n  if (State.state.p2p.value?.id != callP2P.id) return;\n  return _call(killP2PPeer, function () {\n    if (action === 'reconect') {\n      triggerReconnect('p2p_error');\n    } else if (action === 'quit') {\n      onTryStartIfSearching({\n        countPaywallSpin: false\n      });\n    }\n  });\n});\nconst onRecall = _async(function () {\n  if (State.state.call.value != null) {\n    if (State.state.call.value?.room) return false;\n    State.state.isRecalling.next(true);\n    State.emitSocket('recall', {\n      'key': State.state.call.value?.key,\n      'sessionId': State.state.call.value?.sessionId\n    });\n    return true;\n  }\n  return false;\n});\nconst onReconnect = _async(function () {\n  return _callIgnored(onRecall);\n});\nconst onP2PConnectionState = callP2P => {\n  return connectionState => {\n    if (State.state.p2p.value?.id != callP2P.id) return;\n    if (connectionState === 'connecting') {\n      State.state.isPeerConnecting.next(true);\n      State.state.isPeerConnected.next(false);\n      State.state.p2pReady.next(false);\n    } else if (connectionState === 'connected') {\n      State.state.isPeerConnecting.next(false);\n      State.state.isPeerConnected.next(true);\n      State.state.isRecalling.next(false);\n      resetReconnectUI();\n    } else if (connectionState === 'failed' || connectionState === 'disconnected') {\n      closeP2P(callP2P, State.state.isPeerConnected.value ? 'reconect' : 'quit');\n    } else if (connectionState === 'closed') {\n      // Closed is not a \"connection error\" by itself — no reconnect.\n      closeP2P(callP2P, 'quit');\n    }\n  };\n};\nconst P2P_VIDEO_MAX_BITRATE_BPS = 2_000_000;\nconst join2p2 = _async(function (key, sessionId, initiator) {\n  const servers = State.state.call.value?.servers ?? State.state.session.value?.servers ?? [];\n  // WebRTC default adaptation is very aggressive on Android when the sender bitrate is low,\n  // which makes resolution drops (pixelation) visible in RTCView. Use a sane cap for 720p.\n\n  const Call2P2 = manifest().call.Call2P2;\n  const callP2P = new Call2P2({\n    key: key,\n    initiator: initiator,\n    iceServers: servers,\n    bitrate: State.state.call.value?.bitrate ?? P2P_VIDEO_MAX_BITRATE_BPS,\n    getStream: _async(function () {\n      // CRITICAL: Use the original stream directly\n      // The native stream has the track in WebRTCModule's localStreams\n      // WebRTC will use the native stream by stream ID when we call addTrack\n      // const videoStream = State.state.streamVideo.value;\n      // const audioStream = State.state.stream.value;\n\n      // const audioTrack = audioStream?.getTracks()?.[0];\n      // const videoTrack = videoStream.getVideoTracks()?.[0];\n\n      // console.log(\"getStream: audioStream ID:\", audioStream.id);\n      // console.log(\"getStream: videoStream ID:\", videoStream.id);\n\n      // return new MediaStream([\n      //     audioTrack,\n      //     videoTrack,\n      // ].Rx.filter(Boolean));\n      // return videoStream;\n      return State.state.stream.value;\n    })\n    // getScale: lcv.getScale,\n  }) // iceGatheringTimeout: usr.session.value?.p2pIceGatheringTimeout ?? 5000,\n  // iceTestTimeout: usr.session.value?.p2pIceTestTimeout ?? 0,\n  // timeout: usr.session.value?.p2pTimeout ?? 6000,\n  // iceCandidatePoolSize: usr.session.value?.p2pIceCandidatePoolSize,\n  // isStrictNAT: (psc.forceRelay.value && usr.isPremium) || _isStrictNAT,\n  // hasH264Supported: hasH264Supported,\n  // bundlePolicy: usr.session.value?.p2pBundlePolicy,\n  // rtcpMuxPolicy: usr.session.value?.p2pRtcpMuxPolicy,\n;\n  callP2P.emit = _async(function (data) {\n    if (State.state.call.value?.key != callP2P.key) return;\n    State.emitSocket('signal', {\n      'value': data,\n      'key': key,\n      'sessionId': sessionId\n    });\n    return _await();\n  });\n  callP2P.onReady = () => {\n    if (State.state.p2p.value?.id != callP2P.id) return;\n    State.state.p2pReady.next(true);\n    resetReconnectUI();\n  };\n  callP2P.onStream = stream => {\n    if (State.state.p2p.value?.id != callP2P.id) return;\n    State.state.peerCallStream.next(stream);\n    resetReconnectUI();\n  };\n  callP2P.onRemoveStream = stream => {\n    if (State.state.p2p.value?.id != callP2P.id) return;\n    State.state.peerCallStream.next(null);\n    State.state.p2pReady.next(false);\n  };\n  callP2P.onConnectionState = onP2PConnectionState(callP2P);\n  callP2P.onRecall = function () {\n    return _call(onRecall, function (_onRecall) {\n      return _invokeIgnored(function () {\n        if (!_onRecall) {\n          return _callIgnored(onStop);\n        }\n      });\n    });\n  };\n  callP2P.onFail = () => {\n    closeP2P(callP2P, 'quit');\n  };\n  callP2P.onTimeout = () => {\n    closeP2P(callP2P, 'quit');\n  };\n  State.state.p2p.next(callP2P);\n  return _await(callP2P.init(), function () {\n    return _await(callP2P.start(), function () {\n      unqueueSignals();\n    });\n  });\n});\nconst connect = _async(function (value) {\n  if (value != null) {\n    State.emitSocket('submitted', {\n      'submitted': State.state.submitted.value,\n      'key': value?.key,\n      'sessionId': value?.sessionId\n    });\n  }\n  console.log('[P2P] Submission confirmed');\n  return _await();\n});\nconst call = _async(function (value) {\n  let _exit1 = false;\n  console.log(\"call\", value);\n  // updateMeta(value.meta);\n  return _invoke(function () {\n    if (isRoomMemberCall(value)) {\n      return _call(closePeer, function () {\n        call_started = +new Date();\n        return _await(connect(value), function () {\n          _exit1 = true;\n        });\n      });\n    }\n  }, function (_result14) {\n    if (_exit1) return _result14;\n    State.state.isInQueue.next(false);\n    if (!State.state.isSearching.value && value.force != true) {\n      return;\n    }\n    if (State.state.call.value != null && value.force != true) {\n      return;\n    }\n    return _call(closePeer, function () {\n      let _exit10 = false;\n      // State.state.isSearching.next(true);\n\n      // req.onCallToken(value.callToken);\n\n      // Force speaker on iOS when call starts\n      // if (ReactNative.Platform.OS === 'ios') {\n      //   InCallManager.setForceSpeakerphoneOn(true);\n      // }\n      State.state.call.next(value);\n      return _invoke(function () {\n        if (value?.room) {\n          call_started = +new Date();\n          ensureCallRoomStore().next(value.room);\n          return _await(connect(value), function () {\n            _exit10 = true;\n          });\n        }\n      }, function (_result15) {\n        return _exit10 ? _result15 : _invokeIgnored(function () {\n          if (State.state.call.value != null) {\n            console.log('[P2P] Starting optimistic P2P connection (early start)');\n            guestCallStartedAt = +new Date();\n\n            // Запускаем join2p2 без await - P2P соединяется в фоне пока пользователь подтверждает\n            join2p2(State.state.call.value.key, State.state.call.value.sessionId, State.state.call.value.initiator).catch(error => {\n              console.error('[P2P] Early connection error:', error);\n            });\n            return _awaitIgnored(connect(State.state.call.value));\n          }\n        });\n      });\n    });\n  });\n});\nconst recall = _async(function (value) {\n  return _invokeIgnored(function () {\n    if (State.state.call.value != null && State.state.call.value?.sessionId === value.sessionId) {\n      State.state.call.next({\n        ...State.state.call.value,\n        ...value\n      });\n\n      // Optimistic P2P: при recall тоже запускаем P2P сразу\n      console.log('[P2P] Starting optimistic P2P reconnection');\n      return _call(killP2PPeer, function () {\n        join2p2(State.state.call.value.key, State.state.call.value.sessionId, State.state.call.value.initiator).catch(error => {\n          console.error('[P2P] Reconnection error:', error);\n        });\n        return _awaitIgnored(connect(State.state.call.value));\n      });\n    }\n  });\n});\nconst callService = {\n  api: {\n    name: \"call\",\n    resetPayWall: () => {\n      State.store.isPaywallCall.next(false);\n    },\n    usePayWall: () => {\n      const [is_paywall] = Hooks.useBehaviorSubject(State.store.isPaywallCall);\n      return is_paywall;\n    }\n  },\n  use() {\n    React.useEffect(() => {\n      State.store.callFilterStore.next({\n        ...getSearchFilterData(),\n        sex: null\n      });\n    }, []);\n    State.useSocket(\"preview\", _async(function (data, callback) {\n      console.log(\"preview\", data);\n      return _await(getPreviewData(data), function (_getPreviewData) {\n        callback?.(_getPreviewData);\n      });\n    }));\n    State.useSocket(\"queue-init\", () => {\n      console.log(\"queue-init\");\n      restartQueue();\n    });\n    State.useSocket(\"stop\", _async(function (data) {\n      console.log(\"stop\", data);\n      if (isJoinedAsRoomMember() || isCurrentRoomRouletteCallSignal(data) || isRoomMemberCall(data)) {\n        return;\n      }\n      const wasSearching = State.state.isSearching.value;\n      try {\n        if (data?.error != null) {\n          emitVideoChatResult(data?.error === 'filter' ? 'error:filter' : 'error:tech');\n        }\n        if (data?.code != null && wasSearching) {\n          runStartResultEval(data);\n        }\n      } catch (e) {\n        console.error(e);\n      }\n      State.state.isSearching.next(false);\n      State.state.isInQueue.next(false);\n      markCallEndedBy('partner_leave');\n      return _invoke(function () {\n        if (State.state.call.value?.room || data?.room || data?.roomId || data?.roomToken) {\n          return _awaitIgnored(leaveJoinedGuestRoom('partner-stop'));\n        }\n      }, function () {\n        return _callIgnored(closeCall);\n      });\n    }));\n    State.useSocket(\"skip\", _async(function (data) {\n      if (isCurrentRoomRouletteCallSignal(data)) {\n        return;\n      }\n      return _invokeIgnored(function () {\n        if (State.state.call.value == null || State.state.call.value?.sessionId === data.sessionId && (State.state.call.value?.key === data.key || data.key == null)) {\n          State.state.isInQueue.next(false);\n          markCallEndedBy('partner_next');\n          if (data?.restart === true) {\n            State.state.isSearching.next(true);\n          }\n          return _invoke(function () {\n            if (State.state.call.value?.room || data?.room || data?.roomId || data?.roomToken) {\n              return _awaitIgnored(leaveJoinedGuestRoom('partner-skip'));\n            }\n          }, function () {\n            return _callIgnored(skip);\n          });\n        }\n      });\n    }));\n    State.useSocket(\"recall\", recall);\n    State.useSocket(\"call\", call);\n    State.useSocket(\"signal\", data => {\n      onSignal(data);\n    });\n  },\n  subs() {\n    return Rx.combineLatest([State.state.stream.pipe(Rx.tap(_async(function (stream) {\n      return _invokeIgnored(function () {\n        if (stream && State.state.p2p.value) {\n          return _continueIgnored(_catch(function () {\n            return _awaitIgnored(State.state.p2p.value.switchStream(stream));\n          }, function (e) {\n            console.error('Failed to switch stream in P2P:', e);\n          }));\n        }\n      });\n    })))]);\n  }\n};\n\n/* === Inlined module: services/peers.jsx === */\nconst setPeerData = (sessionId, data) => {\n  State.state.peerData.next({\n    ...State.state.peerData.value,\n    [sessionId]: {\n      ...(State.state.peerData.value[sessionId] ?? {}),\n      ...data\n    }\n  });\n};\nconst setPeerRemoteData = (sessionId, data) => {\n  State.state.peerRemoteData.next({\n    ...State.state.peerRemoteData.value,\n    [sessionId]: {\n      ...(State.state.peerRemoteData.value[sessionId] ?? {}),\n      ...data\n    }\n  });\n};\nconst unsetPeerData = sessionId => {\n  delete State.state.peerData.value[sessionId];\n  State.state.peerData.next({\n    ...State.state.peerData.value\n  });\n};\nconst unsetPeerRemoteData = sessionId => {\n  delete State.state.peerRemoteData.value[sessionId];\n  State.state.peerRemoteData.next({\n    ...State.state.peerRemoteData.value\n  });\n};\nconst subPeerRemoteData = sessionId => {\n  return State.state.peerRemoteData.pipe(Rx.map(data => data[sessionId]), Rx.distinctUntilChanged());\n};\nconst usePeerRemoteData = sessionId => {\n  const data = Hooks.useStream(() => subPeerRemoteData(sessionId), State.state.peerData.value[sessionId], [sessionId]);\n  const update = React.useCallback(data => setPeerRemoteData(sessionId, data), [sessionId]);\n  return [data, update];\n};\nconst subPeerData = sessionId => {\n  return State.state.peerData.pipe(Rx.map(data => data[sessionId]), Rx.distinctUntilChanged());\n};\nconst usePeerData = sessionId => {\n  const data = Hooks.useStream(() => subPeerData(sessionId), State.state.peerData.value[sessionId], [sessionId]);\n  const update = React.useCallback(data => setPeerData(sessionId, data), [sessionId]);\n  return [data, update];\n};\nconst subPeer = sessionId => {\n  return State.state.peers.pipe(Rx.map(data => data.find(peer => peer.sessionId === sessionId)), Rx.distinctUntilChanged());\n};\nconst subPeerByUserId = userId => {\n  return State.state.peers.pipe(Rx.map(data => data.find(peer => peer.meta?.user?.id === userId)), Rx.distinctUntilChanged());\n};\nconst usePeer = sessionId => {\n  const init = React.useMemo(() => State.state.peers.value.find(peer => peer.sessionId === sessionId), [sessionId]);\n  const data = Hooks.useStream(() => subPeer(sessionId), init, [sessionId]);\n  return data;\n};\nconst usePeerByUserId = userId => {\n  const init = React.useMemo(() => State.state.peers.value.find(peer => peer.meta?.user?.id === userId), [userId]);\n  const data = Hooks.useStream(() => subPeerByUserId(userId), init, [userId]);\n  return data;\n};\nconst getMetaSessionId = (meta, call) => {\n  return meta?.sessionId ?? meta?.user?.sessionId ?? meta?.userConnection?.sessionId ?? (call?.metas?.length === 1 ? call?.sessionId : null);\n};\nconst getPeerSessionId = peer => {\n  return peer?.sessionId ?? peer?.id ?? null;\n};\nconst getPeersLocalSessionId = () => {\n  return State.state.session.value?.sessionId ?? State.state.session.value?.user?.sessionId ?? State.state.session.value?.userConnection?.sessionId ?? null;\n};\nconst getActivePeerCall = () => {\n  const roomInfo = State.api?.room?.getRoomInfo?.() ?? null;\n  if (roomInfo?.roomId) {\n    if (roomInfo?.roomMeta != null) {\n      return roomInfo.roomMeta?.roulette?.call ?? null;\n    }\n    const incomingCall = State.state.call.value;\n    if (incomingCall?.room?.roomId != null && String(incomingCall.room.roomId) === String(roomInfo.roomId)) return incomingCall;\n    return null;\n  }\n  return State.state.call.value ?? null;\n};\nconst getCallMetaBySessionId = call => {\n  const result = new Map();\n  if (!Array.isArray(call?.metas)) return result;\n  call.metas.forEach(meta => {\n    const sessionId = getMetaSessionId(meta, call);\n    if (!sessionId || result.has(sessionId)) return;\n    result.set(sessionId, meta);\n  });\n  return result;\n};\nconst updatePeer = _async(function () {\n  const peers = [];\n  const localSessionId = getPeersLocalSessionId();\n  const roomPeers = State.api?.room?.getRoomPeers?.() ?? [];\n  const roomPeersBySessionId = new Map();\n  roomPeers.forEach(peer => {\n    const sessionId = getPeerSessionId(peer);\n    if (!sessionId) return;\n    roomPeersBySessionId.set(sessionId, peer);\n  });\n  const call = getActivePeerCall();\n  const callMetasBySessionId = getCallMetaBySessionId(call);\n  const roomInfo = State.api?.room?.getRoomInfo?.() ?? {};\n  const hasAuthoritativeRoomParticipants = Array.isArray(roomInfo?.roomMeta?.participants);\n  const authoritativeRoomParticipantIds = new Set(hasAuthoritativeRoomParticipants ? roomInfo.roomMeta.participants.map(getPeerSessionId).filter(Boolean) : []);\n  const hasRoomSource = roomInfo?.joined === true || !!roomInfo?.roomId || !!roomInfo?.roomToken || roomPeers.length > 0;\n  if (hasRoomSource) {\n    roomPeers.forEach(peer => {\n      const sessionId = getPeerSessionId(peer);\n      if (!sessionId) return;\n      if (sessionId === localSessionId) return;\n      const callMeta = callMetasBySessionId.get(sessionId);\n      if (!State.state.peerData.value[sessionId]) {\n        setPeerData(sessionId, {});\n      }\n      peers.push({\n        id: sessionId,\n        sessionId,\n        role: peer.role,\n        meta: {\n          ...(peer.meta ?? {}),\n          ...(callMeta ?? {})\n        },\n        stream: peer.stream,\n        mediaVersion: peer.mediaVersion,\n        ready: peer.ready,\n        hasVideo: peer.hasVideo,\n        hasAudio: peer.hasAudio,\n        isP2P: false\n      });\n    });\n    callMetasBySessionId.forEach((meta, sessionId) => {\n      if (sessionId === localSessionId) return;\n      if (peers.some(item => item.sessionId === sessionId)) return;\n      const isActiveCallCandidate = sessionId === call?.sessionId;\n      if (hasAuthoritativeRoomParticipants && !authoritativeRoomParticipantIds.has(sessionId) && !isActiveCallCandidate) return;\n      if (!State.state.peerData.value[sessionId]) {\n        setPeerData(sessionId, {});\n      }\n      peers.push({\n        id: sessionId,\n        sessionId,\n        role: meta?.role ?? (sessionId === call?.sessionId ? 'guest' : 'member'),\n        meta,\n        stream: null,\n        mediaVersion: null,\n        ready: false,\n        hasVideo: false,\n        hasAudio: false,\n        isP2P: false\n      });\n    });\n    State.state.peers.next(peers);\n    return;\n  }\n  if (call != null) {\n    if (call?.metas?.length) {\n      for (const meta of call.metas) {\n        const sessionId = getMetaSessionId(meta, call);\n        if (!sessionId || sessionId === localSessionId) continue;\n        if (peers.some(item => item.sessionId === sessionId)) continue;\n        const roomPeer = roomPeersBySessionId.get(sessionId);\n        const isP2P = !call?.room && sessionId === call.sessionId;\n        if (!State.state.peerData.value[sessionId]) {\n          setPeerData(sessionId, {});\n        }\n        peers.push({\n          id: sessionId,\n          sessionId,\n          role: meta?.role ?? roomPeer?.role,\n          meta,\n          stream: roomPeer?.stream ?? (isP2P ? State.state.peerCallStream.value : null),\n          mediaVersion: roomPeer?.mediaVersion,\n          ready: roomPeer?.ready ?? (isP2P && State.state.p2pReady.value == true),\n          hasVideo: roomPeer?.hasVideo ?? (isP2P ? () => !!State.state.peerCallStream.value?.getVideoTracks().some(track => track.enabled) : false),\n          hasAudio: roomPeer?.hasAudio ?? (isP2P ? () => !!State.state.peerCallStream.value?.getAudioTracks().some(track => track.enabled) : false),\n          isP2P\n        });\n      }\n    }\n  }\n  roomPeers.forEach(peer => {\n    const sessionId = getPeerSessionId(peer);\n    if (!sessionId) return;\n    if (sessionId === localSessionId) return;\n    if (peers.some(item => item.sessionId === sessionId)) return;\n    peers.push({\n      id: sessionId,\n      sessionId,\n      role: peer.role,\n      meta: peer.meta,\n      stream: peer.stream,\n      mediaVersion: peer.mediaVersion,\n      ready: peer.ready,\n      hasVideo: peer.hasVideo,\n      hasAudio: peer.hasAudio,\n      isP2P: false\n    });\n  });\n\n  // for (final peer in peerRoomPeers.value) {\n  //   final producerStream = peerRoomStreams.value\n  //       .where((producer) =>\n  //           peer.id == producer.id && 'default' == producer.type)\n  //       .firstOrNull;\n  //   peers.add(PeerState(\n  //     sessionId: peer.meta?.sessionId ?? \"\",\n  //     meta: peer.meta,\n  //     stream: producerStream?.stream,\n  //     renderer: producerStream?.videoRenderer,\n  //     ready: producerStream?.ready == true,\n  //     isPartyMember: peer.role != 'guest',\n  //     isP2P: false,\n  //     hasVideo: producerStream?.videoId != null,\n  //     hasAudio: producerStream?.audioId != null,\n  //   ));\n  // }\n\n  // for (final peer in peerRoomCallPeers.value) {\n  //   if (peers.where((a) => PeerState.equalsMeta(a, peer.meta)).isNotEmpty) {\n  //     continue;\n  //   }\n\n  //   final producerStream = peerRoomCallStreams.value\n  //       .where((producer) =>\n  //           peer.id == producer.id && 'default' == producer.type)\n  //       .firstOrNull;\n\n  //   peers.add(PeerState(\n  //     sessionId: peer.meta?.sessionId ?? \"\",\n  //     meta: peer.meta,\n  //     stream: producerStream?.stream,\n  //     renderer: producerStream?.videoRenderer,\n  //     ready: producerStream?.ready == true,\n  //     isPartyMember: false,\n  //     isP2P: false,\n  //     hasVideo: producerStream?.videoId != null,\n  //     hasAudio: producerStream?.audioId != null,\n  //   ));\n  // }\n\n  State.state.peers.next(peers);\n  return _await();\n});\nconst peerService = {\n  init: function () {\n    return _await();\n  } //\n  ,\n  subs() {\n    if (!State.store.room) {\n      State.store.room = new Rx.BehaviorSubject(null);\n    }\n    return Rx.combineLatest([Rx.combineLatest([State.state.call, State.state.p2p, State.state.peerCallStream, State.state.p2pReady, State.store.room]).pipe(Rx.tap(() => {\n      updatePeer();\n    }))]);\n  }\n};\n\n/* === Inlined module: services/showFace.jsx === */\nconst showFaceService = {\n  subs() {\n    return Rx.combineLatest([State.state.showFace.pipe(Rx.tap(_async(function (showFace) {\n      if (showFace) {\n        Notification.showNotification({\n          key: 'noface',\n          duration: 5000,\n          children: /*#__PURE__*/React.createElement(FaceNotification, null)\n        });\n      } else {\n        Notification.hideNotificationByKey('noface');\n      }\n      return _await();\n    })))]);\n  }\n};\nconst FaceNotification = () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Assets.FaceBox, {\n    style: {\n      color: theme.theme.component.toast.informational.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: 700\n    }\n  }, t('showYourFace')));\n};\n\n/* === Inlined module: services/socketConnecting.jsx === */\nconst socketConnectionService = {\n  subs() {\n    return Rx.combineLatest([Rx.combineLatest([State.state.isConnecting.pipe(Rx.debounceTime(500), Rx.distinctUntilChanged()), State.state.isRequireSocket.pipe(Rx.map(set => set.size > 0), Rx.distinctUntilChanged())]).pipe(Rx.map(([isConnecting, isRequired]) => isConnecting && isRequired), Rx.distinctUntilChanged(), Rx.tap(_async(function (shouldShow) {\n      if (shouldShow) {\n        Notification.showNotification({\n          key: 'socketconnecting',\n          duration: null,\n          onClick: null,\n          style: {\n            alignSelf: 'center'\n          },\n          contentStyle: {\n            paddingHorizontal: 0\n          },\n          children: /*#__PURE__*/React.createElement(SocketNotification, null)\n        });\n      } else {\n        Notification.hideNotificationByKey('socketconnecting');\n      }\n      return _await();\n    }))), Rx.combineLatest([State.state.isRequireSocket.pipe(Rx.map(set => set.size > 0), Rx.distinctUntilChanged()), State.state.isConnected.pipe(Rx.distinctUntilChanged())]).pipe(Rx.switchMap(([isRequired, isConnected]) => {\n      if (!isRequired || !isConnected) {\n        return Rx.of(null);\n      }\n      return Rx.timer(0, 2500).pipe(Rx.tap(() => {\n        State.emitSocket('ping', {});\n      }));\n    }))]);\n  }\n};\nconst SocketNotification = () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Update, {\n    style: {\n      color: theme.theme.component.toast.informational.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: 700\n    }\n  }, t('connecting')));\n};\n\n/* === Inlined module: services/report.jsx === */\nconst reportService = {\n  use() {\n    State.useSocket(\"report\", _async(function (data, callback) {\n      const size = data?.size ?? 128;\n      const activeVideoLabel = State.state.stream.value?.getVideoTracks?.()?.[0]?.label ?? null;\n      const activeAudioLabel = State.state.stream.value?.getAudioTracks?.()?.[0]?.label ?? null;\n      const camera = State.state.camera.value?.name ?? activeVideoLabel ?? null;\n      const mic = State.state.audio.value?.name ?? activeAudioLabel ?? null;\n      return _catch(function () {\n        const stream = State.state.stream.value;\n        if (!stream) {\n          return callback?.({\n            photo: null,\n            camera,\n            mic\n          });\n        }\n        const targetSize = size ?? 128;\n        return _await(State.capturePhoto(stream, targetSize, targetSize, false), function (photo) {\n          callback?.({\n            photo,\n            camera,\n            mic\n          });\n        });\n      }, function (error) {\n        console.error('Report capture photo failed', error);\n        callback?.({\n          photo: null,\n          camera,\n          mic\n        });\n      });\n    }));\n  }\n};\n\n/* === Inlined module: services/room/media.jsx === */\nconst roomMediaPeers = new Map();\nconst roomPeerStreams = new Map();\nconst roomProducers = new Map();\nconst roomConsumers = new Map();\nconst roomConsumersPending = new Map();\nconst roomConsumerRetryTimers = new Map();\nconst roomConsumerRetryAttempts = new Map();\nconst roomConsumerKeyFrameTimers = new Map();\nconst roomConsumerRecoveryTimers = new Map();\nconst localProducers = new Map();\nconst localProducerRetryTimers = new Map();\nconst localProducerRetryAttempts = new Map();\nlet roomDevice = null;\nlet roomSendTransport = null;\nlet roomRecvTransport = null;\nlet mediaRole = null;\nlet mediaJoined = false;\nlet localTracksConnectPromise = null;\nlet localTracksConnectQueued = false;\nlet roomMediaGeneration = 0;\nlet roomSendRestartTimer = null;\nlet roomSendRestartPromise = null;\nlet roomReceiveRestartTimer = null;\nlet roomReceiveRestartPromise = null;\nconst MEDIA_RETRY_DELAYS_MS = [0, 100, 250, 500, 1000];\nconst MEDIA_RETRY_MAX_ATTEMPTS = MEDIA_RETRY_DELAYS_MS.length;\nconst ROOM_VIDEO_RECOVERY_DELAYS_MS = [700, 900, 1200];\nconst ROOM_CONSUMER_KEYFRAME_THROTTLE_MS = 750;\nconst ROOM_VIDEO_START_BITRATE_KBPS = 4000;\nconst ROOM_STREAMING_VIDEO_MIN_BITRATE_KBPS = 2000;\nconst ROOM_VIDEO_MAX_FRAMERATE = 60;\nconst ROOM_LIVE_VIDEO_SOURCE = 'live-video';\nconst ROOM_LIVE_VIDEO_START_BITRATE_KBPS = 6000;\nconst ROOM_LIVE_VIDEO_MIN_BITRATE_KBPS = 4000;\nconst ROOM_VIDEO_ENCODINGS = [{\n  maxBitrate: 10_000_000,\n  maxFramerate: ROOM_VIDEO_MAX_FRAMERATE,\n  scaleResolutionDownBy: 1\n}];\nconst ROOM_LIVE_VIDEO_ENCODINGS = [{\n  maxBitrate: 8_000_000,\n  maxFramerate: ROOM_VIDEO_MAX_FRAMERATE,\n  scaleResolutionDownBy: 1\n}];\nconst roomMediaLog = (event, data = {}) => console.log(`[room:media] ${event}`, data);\nconst roomMediaWarn = (event, data = {}) => console.warn(`[room:media] ${event}`, data);\nconst roomMediaError = (event, data = {}) => console.error(`[room:media] ${event}`, data);\nconst getMediaRetryDelay = attempt => MEDIA_RETRY_DELAYS_MS[Math.min(Math.max(Number(attempt) || 0, 0), MEDIA_RETRY_DELAYS_MS.length - 1)];\nconst getLiveLocalRoomTracks = (stream = State.state.stream.value) => (stream?.getTracks?.() ?? []).filter(track => (track.kind === 'audio' || track.kind === 'video') && track.readyState !== 'ended');\nconst getProducerSource = producer => producer?.appData?.source ?? producer?.kind ?? null;\nconst getRoomLiveH264Codec = () => (roomDevice?.rtpCapabilities?.codecs ?? []).find(codec => String(codec?.mimeType ?? '').toLowerCase() === 'video/h264') ?? null;\nconst isStreamingRoom = () => getRoomMediaStateValue()?.roomMeta?.streaming != null;\nconst getRoomStreamPausedStore = () => {\n  if (!State.store.streamPaused) {\n    State.store.streamPaused = new Rx.BehaviorSubject(false);\n  }\n  return State.store.streamPaused;\n};\nconst isRoomStreamPaused = () => getRoomStreamPausedStore().value === true;\nconst getMutedStreamingStore = () => {\n  if (!State.store.mutedStreaming) {\n    State.store.mutedStreaming = new Rx.BehaviorSubject(false);\n  }\n  return State.store.mutedStreaming;\n};\nconst isStreamingMuted = () => getMutedStreamingStore().value === true;\nconst requestLocalRoomStream = _async(function () {\n  if (!State.store.needStream.value) {\n    State.store.needStream.next(true);\n  }\n  if (getLiveLocalRoomTracks().length > 0) return;\n  if (State.store.requestedStream.value) return;\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      State.store.requestedStream.next(true);\n      return _awaitIgnored(State.requestStream?.(true));\n    }, function (error) {\n      roomMediaWarn('stream:request-error', {\n        error: error?.message\n      });\n    });\n  }, function (_wasThrown6, _result17) {\n    State.store.requestedStream.next(false);\n    return _rethrow(_wasThrown6, _result17);\n  }));\n});\nconst clearConsumerRetry = producerId => {\n  const timer = roomConsumerRetryTimers.get(producerId);\n  if (timer) clearTimeout(timer);\n  roomConsumerRetryTimers.delete(producerId);\n  roomConsumerRetryAttempts.delete(producerId);\n};\nconst clearConsumerKeyFrameTimer = producerId => {\n  const timer = roomConsumerKeyFrameTimers.get(producerId);\n  if (timer) clearTimeout(timer);\n  roomConsumerKeyFrameTimers.delete(producerId);\n};\nconst clearConsumerRecoveryTimer = producerId => {\n  const timer = roomConsumerRecoveryTimers.get(producerId);\n  if (timer) clearTimeout(timer);\n  roomConsumerRecoveryTimers.delete(producerId);\n};\nconst clearLocalProducerRetry = kind => {\n  const timer = localProducerRetryTimers.get(kind);\n  if (timer) clearTimeout(timer);\n  localProducerRetryTimers.delete(kind);\n  localProducerRetryAttempts.delete(kind);\n};\nconst clearRoomReceiveRetryState = () => {\n  roomConsumerRetryTimers.forEach(timer => clearTimeout(timer));\n  roomConsumerRetryTimers.clear();\n  roomConsumerRetryAttempts.clear();\n  roomConsumerKeyFrameTimers.forEach(timer => clearTimeout(timer));\n  roomConsumerKeyFrameTimers.clear();\n  roomConsumerRecoveryTimers.forEach(timer => clearTimeout(timer));\n  roomConsumerRecoveryTimers.clear();\n  roomConsumersPending.clear();\n};\nconst isRoomMediaGenerationCurrent = generation => generation === roomMediaGeneration;\nlet roomMediaAckHandler = null;\nconst defaultRoomMediaAckSocket = _async(function (name, data, timeoutMs = 7000) {\n  let timeoutId = null;\n  const timeout = new Promise(resolve => {\n    timeoutId = setTimeout(() => resolve(null), timeoutMs);\n  });\n  return _finallyRethrows(function () {\n    return _catch(function () {\n      return _await(Promise.race([State.ackSocket(name, data), timeout]));\n    }, function (error) {\n      roomMediaError('ack:error', {\n        name,\n        error: error?.message\n      });\n      return null;\n    });\n  }, function (_wasThrown7, _result18) {\n    if (timeoutId) clearTimeout(timeoutId);\n    return _rethrow(_wasThrown7, _result18);\n  });\n});\nconst setRoomMediaAckHandler = handler => {\n  roomMediaAckHandler = typeof handler === 'function' ? handler : null;\n};\nconst roomMediaAckSocket = _async(function (name, data, timeoutMs = 7000) {\n  let _exit11 = false;\n  return _invoke(function () {\n    if (roomMediaAckHandler) {\n      return _await(roomMediaAckHandler(name, data, timeoutMs), function (_await$roomMediaAckHa) {\n        _exit11 = true;\n        return _await$roomMediaAckHa;\n      });\n    }\n  }, function (_result19) {\n    return _exit11 ? _result19 : _await(defaultRoomMediaAckSocket(name, data, timeoutMs));\n  });\n});\nconst ensureRoomMediaStore = () => {\n  if (!State.store.room) {\n    State.store.room = new Rx.BehaviorSubject(null);\n  }\n  return State.store.room;\n};\nconst getRoomMediaStateValue = () => ensureRoomMediaStore().value ?? {};\nconst setRoomMediaState = patch => {\n  ensureRoomMediaStore().next({\n    ...getRoomMediaStateValue(),\n    ...patch\n  });\n};\nconst getRoomMediaLocalSessionId = () => State.state.session.value?.sessionId ?? State.state.session.value?.user?.sessionId ?? State.state.session.value?.userConnection?.sessionId ?? null;\nconst signalProducerClosed = _async(function (producerId, reason) {\n  if (!producerId || !State.store.roomToken.value) return;\n  return _awaitIgnored(roomMediaAckSocket('soup', {\n    action: 'producerClosed',\n    token: State.store.roomToken.value,\n    payload: {\n      producerId,\n      reason\n    }\n  }, 3000));\n});\nconst closeLocalProducer = _async(function (kind, producer, reason, {\n  signal = false\n} = {}) {\n  if (!producer) return;\n  const producerId = producer.id;\n  const ownedTrack = producer.__cameeOwnedTrack;\n  const sourceTrack = producer.__cameeSourceTrack;\n  const sourceEnded = producer.__cameeSourceTrackEndedHandler;\n  if (sourceTrack && sourceEnded) {\n    try {\n      sourceTrack.removeEventListener?.('ended', sourceEnded);\n    } catch (error) {\n      //\n    }\n  }\n  if (localProducers.get(kind) === producer) {\n    localProducers.delete(kind);\n  }\n  clearLocalProducerRetry(kind);\n  return _invoke(function () {\n    if (signal && producerId) {\n      return _awaitIgnored(signalProducerClosed(producerId, reason).catch(error => {\n        roomMediaWarn('producerClosed:error', {\n          kind,\n          producerId,\n          error: error?.message\n        });\n      }));\n    }\n  }, function () {\n    try {\n      if (!producer.closed) producer.close();\n    } catch (error) {\n      roomMediaWarn('producer:close-error', {\n        kind,\n        producerId,\n        error: error?.message\n      });\n    }\n    if (ownedTrack && ownedTrack !== sourceTrack && ownedTrack.readyState !== 'ended') {\n      try {\n        ownedTrack.stop();\n      } catch (error) {\n        //\n      }\n    }\n  });\n});\nconst syncLocalProducerTrackStates = () => {\n  localProducers.forEach(producer => {\n    const sourceTrack = producer.__cameeSourceTrack;\n    const ownedTrack = producer.__cameeOwnedTrack;\n    if (!sourceTrack || !ownedTrack || sourceTrack === ownedTrack) return;\n    if (ownedTrack.readyState === 'ended') return;\n    const enabledByStreaming = producer.kind !== 'audio' || !isStreamingMuted();\n    ownedTrack.enabled = !isRoomStreamPaused() && enabledByStreaming && sourceTrack.enabled;\n  });\n};\nconst applyLocalStreamingMuted = muted => {\n  const nextMuted = muted === true;\n  State.state.stream.value?.getAudioTracks?.().forEach(track => {\n    if (track.readyState !== 'ended') track.enabled = !nextMuted;\n  });\n  syncLocalProducerTrackStates();\n};\nconst setLocalStreamingMuted = muted => {\n  const nextMuted = muted === true;\n  const store = getMutedStreamingStore();\n  if (store.value !== nextMuted) store.next(nextMuted);\n  applyLocalStreamingMuted(nextMuted);\n  return nextMuted;\n};\nconst applyLocalMediaPaused = paused => {\n  localProducers.forEach(producer => {\n    const sourceTrack = producer.__cameeSourceTrack;\n    const ownedTrack = producer.__cameeOwnedTrack;\n    const hasOwnedClone = !!ownedTrack && ownedTrack !== sourceTrack;\n    try {\n      if (paused && !producer.paused) producer.pause();\n      if (!paused && producer.paused) producer.resume();\n      if (hasOwnedClone && ownedTrack.readyState !== 'ended') {\n        const enabledByStreaming = producer.kind !== 'audio' || !isStreamingMuted();\n        ownedTrack.enabled = !paused && enabledByStreaming && sourceTrack?.enabled !== false;\n      }\n    } catch (error) {\n      roomMediaWarn('producer:pause-state-error', {\n        producerId: producer.id,\n        paused,\n        error: error?.message\n      });\n    }\n  });\n};\nconst syncRemoteMediaPaused = _async(function (paused) {\n  const token = State.store.roomToken.value;\n  return token ? roomMediaAckSocket('soup', {\n    action: 'setPeerMediaPaused',\n    token,\n    payload: {\n      paused: paused === true\n    }\n  }, 3000) : null;\n});\nconst setLocalMediaPaused = _async(function (paused) {\n  const nextPaused = paused === true;\n  getRoomStreamPausedStore().next(nextPaused);\n  applyLocalMediaPaused(nextPaused);\n  return _await(syncRemoteMediaPaused(nextPaused), function (result) {\n    if (result !== 'ok') {\n      roomMediaWarn('producer:pause-state-sync-error', {\n        paused: nextPaused,\n        result\n      });\n      return {\n        ok: false,\n        error: result ?? 'bad'\n      };\n    }\n    return {\n      ok: true\n    };\n  });\n});\nconst resetLocalMediaPaused = () => {\n  applyLocalMediaPaused(false);\n  getRoomStreamPausedStore().next(false);\n};\nconst createRoomMediaStream = () => {\n  if (ReactNative.Platform.OS === 'web' && typeof MediaStream !== 'undefined') {\n    return new MediaStream();\n  }\n  return new WebRTC.MediaStream();\n};\nconst getPeerStream = peerId => {\n  if (!roomPeerStreams.has(peerId)) {\n    roomPeerStreams.set(peerId, createRoomMediaStream());\n  }\n  return roomPeerStreams.get(peerId);\n};\nconst getRoomPeerId = peer => peer?.id ?? peer?.sessionId ?? null;\nconst getProducerId = producer => producer?.producerId ?? producer?.id ?? null;\nconst getProducerPeerId = producer => producer?.peerId ?? null;\nconst asRoomParticipantList = items => {\n  if (Array.isArray(items)) return items;\n  if (items) return [items];\n  return [];\n};\nconst cloneRoomPeerForState = peer => ({\n  ...peer,\n  producers: Array.isArray(peer?.producers) ? [...peer.producers] : [],\n  transports: Array.isArray(peer?.transports) ? [...peer.transports] : peer?.transports\n});\nconst getStreamTrackSignature = stream => (stream?.getTracks?.() ?? []).map(track => [track.kind, track.id, track.readyState, track.enabled === false ? 'disabled' : 'enabled', track.muted === true ? 'muted' : 'unmuted'].join(':')).sort().join('|');\nconst isLiveRoomTrack = track => !!track && track.readyState !== 'ended';\nconst isAvailableRoomTrack = track => isLiveRoomTrack(track) && track.enabled !== false && track.muted !== true;\nconst removeTrackFromPeerStream = track => {\n  if (!track) return null;\n  const peer = [...roomMediaPeers.values()].find(item => item?.stream?.getTracks?.().includes(track));\n  if (!peer?.stream) return null;\n  try {\n    peer.stream.removeTrack(track);\n    updatePeerStreamState(peer, peer.stream);\n  } catch (error) {\n    //\n  }\n  return peer;\n};\nconst pruneEndedPeerTracks = peer => {\n  const stream = peer?.stream;\n  if (!stream?.getTracks) return;\n  let changed = false;\n  stream.getTracks().forEach(track => {\n    if (isLiveRoomTrack(track)) return;\n    changed = true;\n    try {\n      stream.removeTrack(track);\n    } catch (error) {\n      //\n    }\n  });\n  if (changed) updatePeerStreamState(peer, stream);\n};\nconst updatePeerStreamState = (peer, stream) => {\n  if (!peer || !stream) return;\n  const signature = getStreamTrackSignature(stream);\n  if (peer.mediaSignature !== signature) {\n    peer.mediaSignature = signature;\n    peer.mediaVersion = Number(peer.mediaVersion ?? 0) + 1;\n  }\n  peer.ready = (stream.getTracks?.() ?? []).some(track => track.readyState !== 'ended');\n  peer.hasVideo = (stream.getVideoTracks?.() ?? []).some(isAvailableRoomTrack);\n  peer.hasAudio = (stream.getAudioTracks?.() ?? []).some(isAvailableRoomTrack);\n};\nconst syncRoomPeers = () => {\n  roomMediaPeers.forEach(pruneEndedPeerTracks);\n  setRoomMediaState({\n    peers: [...roomMediaPeers.values()].map(cloneRoomPeerForState)\n  });\n};\nconst resetPeerStreams = () => {\n  roomMediaPeers.forEach(peer => {\n    const peerId = getRoomPeerId(peer);\n    if (!peerId) return;\n    const previousStream = peer.stream ?? roomPeerStreams.get(peerId);\n    previousStream?.getTracks?.().forEach(track => {\n      try {\n        previousStream.removeTrack(track);\n      } catch (error) {\n        //\n      }\n    });\n    const nextStream = createRoomMediaStream();\n    roomPeerStreams.set(peerId, nextStream);\n    peer.stream = nextStream;\n    updatePeerStreamState(peer, nextStream);\n  });\n};\nconst closeConsumerByProducer = (producerId, {\n  close = true\n} = {}) => {\n  const consumer = roomConsumers.get(producerId);\n  clearConsumerRetry(producerId);\n  clearConsumerKeyFrameTimer(producerId);\n  clearConsumerRecoveryTimer(producerId);\n  roomConsumersPending.delete(producerId);\n  if (!consumer) return;\n  try {\n    if (consumer.track && consumer.__cameeTrackMuteHandler) {\n      consumer.track.removeEventListener?.('mute', consumer.__cameeTrackMuteHandler);\n    }\n    if (consumer.track && consumer.__cameeTrackUnmuteHandler) {\n      consumer.track.removeEventListener?.('unmute', consumer.__cameeTrackUnmuteHandler);\n    }\n  } catch (error) {\n    //\n  }\n  removeTrackFromPeerStream(consumer.track);\n  if (close) {\n    try {\n      consumer.close();\n    } catch (error) {\n      //\n    }\n  }\n  roomConsumers.delete(producerId);\n};\nconst requestConsumerKeyFrame = (producerId, consumerId, reason, generation = roomMediaGeneration) => {\n  if (!producerId || !consumerId) return;\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (roomConsumerKeyFrameTimers.has(producerId)) return;\n  const token = State.store.roomToken.value;\n  if (!token) return;\n  const timer = setTimeout(() => {\n    roomConsumerKeyFrameTimers.delete(producerId);\n  }, ROOM_CONSUMER_KEYFRAME_THROTTLE_MS);\n  roomConsumerKeyFrameTimers.set(producerId, timer);\n  roomMediaWarn('consume:keyframe-request', {\n    producerId,\n    consumerId,\n    reason\n  });\n  roomMediaAckSocket('soup', {\n    action: 'resume',\n    token,\n    payload: {\n      consumerId\n    }\n  }, 3000).then(result => {\n    if (result === 'ok') return;\n    roomMediaWarn('consume:keyframe-request-bad', {\n      producerId,\n      consumerId,\n      reason,\n      result\n    });\n  }).catch(error => {\n    roomMediaWarn('consume:keyframe-request-error', {\n      producerId,\n      consumerId,\n      reason,\n      error: error?.message\n    });\n  });\n};\nconst closePeerMedia = peerId => {\n  [...roomProducers.values()].filter(producer => getProducerPeerId(producer) === peerId).map(producer => producer.producerId).forEach(producerId => {\n    roomProducers.delete(producerId);\n    closeConsumerByProducer(producerId);\n  });\n};\nconst removePeerEntry = peerId => {\n  const stream = roomPeerStreams.get(peerId) ?? roomMediaPeers.get(peerId)?.stream;\n  closePeerMedia(peerId);\n  stream?.getTracks?.().forEach(track => {\n    try {\n      stream.removeTrack(track);\n      track.stop();\n    } catch (error) {\n      //\n    }\n  });\n  roomMediaPeers.delete(peerId);\n  roomPeerStreams.delete(peerId);\n};\nconst removeRoomPeers = (ids = []) => {\n  ids.forEach(removePeerEntry);\n  syncRoomPeers();\n};\nconst removeRoomGuests = () => {\n  [...roomMediaPeers.values()].filter(peer => {\n    const role = peer?.role;\n    return role !== 'member' && role !== 'owner';\n  }).map(getRoomPeerId).filter(Boolean).forEach(removePeerEntry);\n  syncRoomPeers();\n};\nconst closeRoomProducers = (producerIds = []) => {\n  producerIds.forEach(producerId => {\n    roomProducers.delete(producerId);\n    closeConsumerByProducer(producerId);\n  });\n  syncRoomPeers();\n};\nconst resetRoomMedia = () => {\n  roomMediaGeneration += 1;\n  resetLocalMediaPaused();\n  if (roomSendRestartTimer != null) {\n    clearTimeout(roomSendRestartTimer);\n    roomSendRestartTimer = null;\n  }\n  roomSendRestartPromise = null;\n  if (roomReceiveRestartTimer != null) {\n    clearTimeout(roomReceiveRestartTimer);\n    roomReceiveRestartTimer = null;\n  }\n  roomReceiveRestartPromise = null;\n  clearRoomReceiveRetryState();\n  localProducerRetryTimers.forEach(timer => clearTimeout(timer));\n  localProducerRetryTimers.clear();\n  localProducerRetryAttempts.clear();\n  [...localProducers.entries()].forEach(([kind, producer]) => {\n    closeLocalProducer(kind, producer, 'room-reset');\n  });\n  [roomSendTransport, roomRecvTransport].forEach(transport => {\n    try {\n      if (transport) transport.__cameeClosing = true;\n      transport?.close();\n    } catch (error) {\n      //\n    }\n  });\n  roomConsumers.forEach(consumer => {\n    try {\n      consumer.close();\n    } catch (error) {\n      //\n    }\n  });\n  roomMediaPeers.clear();\n  roomPeerStreams.clear();\n  roomProducers.clear();\n  roomConsumers.clear();\n  roomConsumersPending.clear();\n  localProducers.clear();\n  roomDevice = null;\n  roomSendTransport = null;\n  roomRecvTransport = null;\n  mediaRole = null;\n  mediaJoined = false;\n};\nconst normalizeRoomProducer = (producer, peerId) => {\n  const producerId = getProducerId(producer);\n  if (!producerId) return null;\n  return {\n    ...producer,\n    producerId,\n    peerId: producer?.peerId ?? peerId\n  };\n};\nconst isRoomPlaybackProducer = producer => (producer?.source ?? producer?.appData?.source ?? producer?.kind) !== ROOM_LIVE_VIDEO_SOURCE;\nconst getPeerProducerIds = peerId => [...roomProducers.values()].filter(producer => getProducerPeerId(producer) === peerId).map(producer => producer.producerId).filter(Boolean);\nconst hasUsableRecvState = () => !!roomDevice && !!roomRecvTransport && !roomRecvTransport.closed && !!State.store.roomToken.value;\nconst isRoomMediaReceiveReady = () => hasUsableRecvState();\nconst restartRoomReceiveNow = _async(function (reason, generation) {\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (!mediaJoined || !roomDevice || !State.store.roomToken.value) return;\n  const token = State.store.roomToken.value;\n  const restartGeneration = ++roomMediaGeneration;\n  roomMediaWarn('receive:restart', {\n    reason\n  });\n  clearRoomReceiveRetryState();\n  [...roomConsumers.keys()].forEach(closeConsumerByProducer);\n  resetPeerStreams();\n  const previousRecvTransport = roomRecvTransport;\n  roomRecvTransport = null;\n  try {\n    if (previousRecvTransport) previousRecvTransport.__cameeClosing = true;\n    previousRecvTransport?.close();\n  } catch (error) {\n    //\n  }\n  return _await(createTransport('consumer', restartGeneration, token, roomDevice), function (nextRecvTransport) {\n    if (!isRoomMediaGenerationCurrent(restartGeneration) || token !== State.store.roomToken.value || !mediaJoined) {\n      try {\n        if (nextRecvTransport) nextRecvTransport.__cameeClosing = true;\n        nextRecvTransport?.close();\n      } catch (error) {\n        //\n      }\n      return;\n    }\n    if (!nextRecvTransport) {\n      scheduleRoomReceiveRestart('transport-create-failed', restartGeneration, 500);\n      return;\n    }\n    roomRecvTransport = nextRecvTransport;\n    [...roomProducers.values()].forEach(producer => consumeProducer(producer));\n    syncRoomPeers();\n  });\n});\nconst scheduleRoomReceiveRestart = (reason, generation = roomMediaGeneration, delay = 150) => {\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (!mediaJoined || !roomDevice || !State.store.roomToken.value) return;\n  if (roomReceiveRestartTimer != null || roomReceiveRestartPromise) return;\n  roomReceiveRestartTimer = setTimeout(() => {\n    roomReceiveRestartTimer = null;\n    if (!isRoomMediaGenerationCurrent(generation)) return;\n    const restartPromise = restartRoomReceiveNow(reason, generation).catch(error => {\n      if (!mediaJoined || !roomDevice || !State.store.roomToken.value) return;\n      roomMediaWarn('receive:restart-error', {\n        reason,\n        error: error?.message\n      });\n      scheduleRoomReceiveRestart('restart-error', roomMediaGeneration, 500);\n    }).finally(() => {\n      if (roomReceiveRestartPromise === restartPromise) {\n        roomReceiveRestartPromise = null;\n      }\n    });\n    roomReceiveRestartPromise = restartPromise;\n  }, delay);\n};\nconst scheduleConsumeRetry = (producer, reason, generation = roomMediaGeneration) => {\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  const producerId = producer?.producerId;\n  const peerId = producer?.peerId;\n  if (!producerId || !peerId || roomConsumers.has(producerId) || roomConsumerRetryTimers.has(producerId)) return;\n  if (!mediaJoined || !State.store.roomToken.value) return;\n  const attempt = Number(roomConsumerRetryAttempts.get(producerId) ?? 0);\n  if (attempt > MEDIA_RETRY_MAX_ATTEMPTS) return;\n  if (attempt === MEDIA_RETRY_MAX_ATTEMPTS) {\n    roomConsumerRetryAttempts.set(producerId, attempt + 1);\n    roomMediaWarn('consume:give-up', {\n      producerId,\n      peerId,\n      reason,\n      attempts: attempt\n    });\n    scheduleRoomReceiveRestart(`consume-give-up:${reason}`, generation, 250);\n    return;\n  }\n  const delay = getMediaRetryDelay(attempt);\n  roomConsumerRetryAttempts.set(producerId, attempt + 1);\n  const timer = setTimeout(() => {\n    roomConsumerRetryTimers.delete(producerId);\n    if (!isRoomMediaGenerationCurrent(generation)) return;\n    const latestProducer = roomProducers.get(producerId);\n    if (!latestProducer || roomConsumers.has(producerId)) return;\n    consumeProducer(latestProducer, generation);\n  }, delay);\n  roomConsumerRetryTimers.set(producerId, timer);\n  roomMediaWarn('consume:retry', {\n    producerId,\n    peerId,\n    reason,\n    attempt: attempt + 1,\n    delay\n  });\n};\nconst scheduleConsumerVideoRecovery = (producerId, consumer, generation = roomMediaGeneration, attempt = 0) => {\n  if (!producerId || consumer?.kind !== 'video') return;\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (roomConsumers.get(producerId) !== consumer) return;\n  if (isAvailableRoomTrack(consumer.track)) {\n    clearConsumerRecoveryTimer(producerId);\n    return;\n  }\n  if (roomConsumerRecoveryTimers.has(producerId)) return;\n  const producer = roomProducers.get(producerId);\n  const peer = producer?.peerId ? roomMediaPeers.get(producer.peerId) : null;\n  if (!producer || producer.paused === true || peer?.streamPaused === true) {\n    clearConsumerRecoveryTimer(producerId);\n    return;\n  }\n  if (attempt >= ROOM_VIDEO_RECOVERY_DELAYS_MS.length) {\n    roomMediaWarn('consume:video-stalled', {\n      producerId,\n      peerId: producer.peerId,\n      attempts: attempt\n    });\n    scheduleRoomReceiveRestart('video-track-stalled', generation, 0);\n    return;\n  }\n  const timer = setTimeout(() => {\n    roomConsumerRecoveryTimers.delete(producerId);\n    if (!isRoomMediaGenerationCurrent(generation)) return;\n    if (roomConsumers.get(producerId) !== consumer) return;\n    if (isAvailableRoomTrack(consumer.track)) return;\n    requestConsumerKeyFrame(producerId, consumer.id, `video-recovery-${attempt + 1}`, generation);\n    scheduleConsumerVideoRecovery(producerId, consumer, generation, attempt + 1);\n  }, ROOM_VIDEO_RECOVERY_DELAYS_MS[attempt]);\n  roomConsumerRecoveryTimers.set(producerId, timer);\n};\nconst consumeProducerOnce = _async(function (producer, generation) {\n  if (generation === undefined) generation = roomMediaGeneration;\n  const producerId = producer?.producerId;\n  const peerId = producer?.peerId;\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (!producerId || !peerId || roomConsumers.has(producerId)) return;\n  if (!hasUsableRecvState()) return;\n  const recvTransport = roomRecvTransport;\n  const token = State.store.roomToken.value;\n  if (!recvTransport || recvTransport.closed) return;\n  return _catch(function () {\n    return _await(roomMediaAckSocket('soup', {\n      action: 'consume',\n      token,\n      payload: {\n        consumerTransportId: recvTransport.id,\n        producerId,\n        rtpCapabilities: roomDevice.rtpCapabilities,\n        sctpCapabilities: roomDevice.sctpCapabilities\n      }\n    }), function (data) {\n      if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value) {\n        return;\n      }\n      if (!data?.id || !data?.producerId) {\n        scheduleConsumeRetry(producer, data == null ? 'consume-timeout' : 'consume-bad', generation);\n        return;\n      }\n      if (roomRecvTransport !== recvTransport || recvTransport.closed) {\n        return;\n      }\n      return _await(recvTransport.consume({\n        id: data.id,\n        producerId: data.producerId,\n        kind: data.kind,\n        rtpParameters: data.rtpParameters,\n        streamId: `${peerId}-audio-video`\n      }), function (consumer) {\n        if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value) {\n          try {\n            consumer.close();\n          } catch (error) {\n            //\n          }\n          return;\n        }\n        return _await(roomMediaAckSocket('soup', {\n          action: 'resume',\n          token,\n          payload: {\n            consumerId: consumer.id\n          }\n        }), function (resumeResult) {\n          if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value) {\n            try {\n              consumer.close();\n            } catch (error) {\n              //\n            }\n            return;\n          }\n          if (resumeResult !== 'ok' || !consumer.track) {\n            try {\n              consumer.close();\n            } catch (error) {\n              //\n            }\n            scheduleConsumeRetry(producer, resumeResult == null ? 'resume-timeout' : 'resume-bad', generation);\n            return;\n          }\n          roomConsumers.set(data.producerId, consumer);\n          clearConsumerRetry(data.producerId);\n          consumer.resume?.();\n          consumer.track.enabled = true;\n          roomMediaLog('consume:ok', {\n            producerId: data.producerId,\n            peerId,\n            kind: consumer.kind\n          });\n          const syncTrackState = () => {\n            const peer = roomMediaPeers.get(peerId);\n            if (peer?.stream) {\n              updatePeerStreamState(peer, peer.stream);\n            }\n            syncRoomPeers();\n          };\n          const handleTrackMuted = () => {\n            syncTrackState();\n            if (consumer.kind !== 'video') return;\n            requestConsumerKeyFrame(data.producerId, consumer.id, 'track-mute', generation);\n            scheduleConsumerVideoRecovery(data.producerId, consumer, generation);\n          };\n          const handleTrackUnmuted = () => {\n            clearConsumerRecoveryTimer(data.producerId);\n            syncTrackState();\n          };\n          consumer.__cameeTrackMuteHandler = handleTrackMuted;\n          consumer.__cameeTrackUnmuteHandler = handleTrackUnmuted;\n          consumer.track.addEventListener?.('mute', handleTrackMuted);\n          consumer.track.addEventListener?.('unmute', handleTrackUnmuted);\n          consumer.on('transportclose', () => {\n            closeConsumerByProducer(data.producerId, {\n              close: false\n            });\n            syncRoomPeers();\n          });\n          consumer.on('trackended', () => {\n            closeConsumerByProducer(data.producerId);\n            syncRoomPeers();\n          });\n          consumer.track.addEventListener?.('ended', () => {\n            closeConsumerByProducer(data.producerId);\n            syncRoomPeers();\n          }, {\n            once: true\n          });\n          const stream = getPeerStream(peerId);\n          stream.getTracks().forEach(track => {\n            if (track.kind === consumer.track.kind) {\n              stream.removeTrack(track);\n            }\n          });\n          if (consumer.track.readyState === 'ended') {\n            closeConsumerByProducer(data.producerId);\n            scheduleConsumeRetry(producer, 'track-ended-before-render', generation);\n            return;\n          }\n          stream.addTrack(consumer.track);\n          const peer = roomMediaPeers.get(peerId);\n          if (peer) {\n            peer.stream = stream;\n            updatePeerStreamState(peer, stream);\n          }\n          syncRoomPeers();\n          if (consumer.kind === 'video') {\n            requestConsumerKeyFrame(data.producerId, consumer.id, 'initial-video', generation);\n            scheduleConsumerVideoRecovery(data.producerId, consumer, generation);\n          }\n        });\n      });\n    });\n  }, function (error) {\n    if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value) {\n      return;\n    }\n    roomMediaError('consume:error', {\n      producerId,\n      peerId,\n      error: error?.message\n    });\n    scheduleConsumeRetry(producer, 'consume-error', generation);\n  });\n});\nconst consumeProducer = _async(function (producer, generation) {\n  if (generation === undefined) generation = roomMediaGeneration;\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (!isRoomPlaybackProducer(producer)) return;\n  const producerId = producer?.producerId;\n  if (!producerId || roomConsumers.has(producerId)) return;\n  if (roomConsumersPending.has(producerId)) return roomConsumersPending.get(producerId);\n  const promise = consumeProducerOnce(producer, generation).finally(() => {\n    roomConsumersPending.delete(producerId);\n  });\n  roomConsumersPending.set(producerId, promise);\n  return promise;\n});\nconst restartRoomSendNow = _async(function (reason, generation) {\n  if (generation === undefined) generation = roomMediaGeneration;\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (!mediaJoined || mediaRole === 'viewer' || !roomDevice || !State.store.roomToken.value) return;\n  const token = State.store.roomToken.value;\n  roomMediaWarn('send:restart', {\n    reason\n  });\n  localProducerRetryTimers.forEach(timer => clearTimeout(timer));\n  localProducerRetryTimers.clear();\n  localProducerRetryAttempts.clear();\n  return _continue(_forOf([...localProducers.entries()], function ([kind, producer]) {\n    return _awaitIgnored(closeLocalProducer(kind, producer, `send-restart:${reason}`, {\n      signal: true\n    }));\n  }), function () {\n    const previousSendTransport = roomSendTransport;\n    roomSendTransport = null;\n    try {\n      if (previousSendTransport) previousSendTransport.__cameeClosing = true;\n      previousSendTransport?.close();\n    } catch (error) {\n      // A replacement transport is still required when closing the old one fails.\n    }\n    return _await(createTransport('producer', generation, token, roomDevice), function (nextSendTransport) {\n      if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value || !mediaJoined) {\n        try {\n          if (nextSendTransport) nextSendTransport.__cameeClosing = true;\n          nextSendTransport?.close();\n        } catch (error) {\n          // The current room lifecycle owns any further cleanup.\n        }\n        return;\n      }\n      if (!nextSendTransport) throw new Error('transport-create-failed');\n      roomSendTransport = nextSendTransport;\n      return _callIgnored(connectLocalTracks);\n    });\n  });\n});\nconst scheduleRoomSendRestart = (reason, generation = roomMediaGeneration, delay = 150) => {\n  if (!isRoomMediaGenerationCurrent(generation)) return;\n  if (!mediaJoined || mediaRole === 'viewer' || !roomDevice || !State.store.roomToken.value) return;\n  if (roomSendRestartTimer != null || roomSendRestartPromise) return;\n  roomSendRestartTimer = setTimeout(() => {\n    roomSendRestartTimer = null;\n    if (!isRoomMediaGenerationCurrent(generation)) return;\n    let shouldRetry = false;\n    const restartPromise = restartRoomSendNow(reason, generation).catch(error => {\n      if (!mediaJoined || mediaRole === 'viewer' || !roomDevice || !State.store.roomToken.value) return;\n      shouldRetry = true;\n      roomMediaWarn('send:restart-error', {\n        reason,\n        error: error?.message\n      });\n    }).finally(() => {\n      if (roomSendRestartPromise === restartPromise) {\n        roomSendRestartPromise = null;\n      }\n      if (shouldRetry) {\n        scheduleRoomSendRestart('restart-error', roomMediaGeneration, 500);\n      }\n    });\n    roomSendRestartPromise = restartPromise;\n  }, delay);\n};\nconst scheduleLocalProducerRetry = (kind, reason) => {\n  if (!kind || localProducerRetryTimers.has(kind)) return;\n  if (!mediaJoined || mediaRole === 'viewer' || !State.store.roomToken.value) return;\n  const attempt = Number(localProducerRetryAttempts.get(kind) ?? 0);\n  if (attempt > MEDIA_RETRY_MAX_ATTEMPTS) return;\n  if (attempt === MEDIA_RETRY_MAX_ATTEMPTS) {\n    localProducerRetryAttempts.set(kind, attempt + 1);\n    roomMediaWarn('produce:restart-send', {\n      kind,\n      reason,\n      attempts: attempt\n    });\n    scheduleRoomSendRestart(`produce-give-up:${reason}`, roomMediaGeneration, 0);\n    return;\n  }\n  const delay = getMediaRetryDelay(attempt);\n  localProducerRetryAttempts.set(kind, attempt + 1);\n  const timer = setTimeout(() => {\n    localProducerRetryTimers.delete(kind);\n    if (localProducers.has(kind)) return;\n    connectLocalTracks();\n  }, delay);\n  localProducerRetryTimers.set(kind, timer);\n  roomMediaWarn('produce:retry', {\n    kind,\n    reason,\n    attempt: attempt + 1,\n    delay\n  });\n};\nconst reconcileRoomParticipants = _async(function (items, reason, {\n  full = false\n} = {}) {\n  const participants = asRoomParticipantList(items);\n  const localSessionId = getRoomMediaLocalSessionId();\n  if (full) {\n    const incomingPeerIds = new Set(participants.map(getRoomPeerId).filter(Boolean));\n    [...roomMediaPeers.keys()].forEach(peerId => {\n      if (peerId !== localSessionId && !incomingPeerIds.has(peerId)) removePeerEntry(peerId);\n    });\n  }\n  for (const item of participants) {\n    const peerId = getRoomPeerId(item);\n    if (!peerId || peerId === localSessionId) continue;\n    const hasProducerList = Array.isArray(item?.producers);\n    const existingPeer = roomMediaPeers.get(peerId);\n    const normalizedProducers = hasProducerList ? item.producers.map(producer => normalizeRoomProducer(producer, peerId)).filter(Boolean) : existingPeer?.producers ?? [];\n    const playbackProducers = normalizedProducers.filter(isRoomPlaybackProducer);\n    if (hasProducerList) {\n      const desiredProducerIds = new Set(playbackProducers.map(producer => producer.producerId));\n      getPeerProducerIds(peerId).forEach(producerId => {\n        if (desiredProducerIds.has(producerId)) return;\n        roomProducers.delete(producerId);\n        closeConsumerByProducer(producerId);\n      });\n    }\n    const stream = existingPeer?.stream ?? getPeerStream(peerId);\n    const peer = {\n      ...(existingPeer ?? {}),\n      ...item,\n      id: peerId,\n      sessionId: item?.sessionId ?? peerId,\n      meta: item?.meta ?? existingPeer?.meta,\n      role: item?.role ?? existingPeer?.role,\n      producers: playbackProducers,\n      transports: item?.transports ?? existingPeer?.transports,\n      stream,\n      ready: existingPeer?.ready ?? false\n    };\n    updatePeerStreamState(peer, stream);\n    roomMediaPeers.set(peerId, peer);\n    if (hasProducerList) {\n      playbackProducers.forEach(producer => {\n        roomProducers.set(producer.producerId, producer);\n        consumeProducer(producer);\n      });\n    }\n  }\n  syncRoomPeers();\n  roomMediaLog('participants', {\n    reason,\n    full,\n    peers: roomMediaPeers.size,\n    producers: roomProducers.size\n  });\n  return _await();\n});\nconst createTransport = _async(function (type, generation, token, device) {\n  if (generation === undefined) generation = roomMediaGeneration;\n  if (token === undefined) token = State.store.roomToken.value;\n  if (device === undefined) device = roomDevice;\n  return !device || !token || !isRoomMediaGenerationCurrent(generation) ? null : _await(roomMediaAckSocket('soup', {\n    action: 'createTransport',\n    token,\n    payload: {\n      type,\n      rtpCapabilities: device.rtpCapabilities,\n      sctpCapabilities: device.sctpCapabilities\n    }\n  }), function (data) {\n    if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value) return null;\n    if (!data?.transportId) return null;\n    const options = {\n      id: data.transportId,\n      iceParameters: data.iceParameters,\n      iceCandidates: data.iceCandidates,\n      dtlsParameters: {\n        ...data.dtlsParameters,\n        role: 'auto'\n      },\n      sctpParameters: data.sctpParameters,\n      iceServers: data.iceServers ?? [],\n      iceTransportPolicy: data.iceTransportPolicy ?? 'all'\n    };\n    const transport = type === 'producer' ? device.createSendTransport(options) : device.createRecvTransport(options);\n    const isCurrentTransport = () => transport.__cameeClosing !== true && isRoomMediaGenerationCurrent(generation) && token === State.store.roomToken.value;\n    transport.on('connect', _async(function ({\n      dtlsParameters\n    }, callback, errback) {\n      return _catch(function () {\n        if (!isCurrentTransport()) throw new Error('stale-transport');\n        return _await(roomMediaAckSocket('soup', {\n          action: 'connectTransport',\n          token,\n          payload: {\n            transportId: data.transportId,\n            dtlsParameters\n          }\n        }), function (connected) {\n          if (!isCurrentTransport()) throw new Error('stale-transport');\n          if (connected !== 'ok') {\n            throw new Error(connected == null ? 'connect-timeout' : 'connect-bad');\n          }\n          callback();\n        });\n      }, function (error) {\n        errback(error);\n      });\n    }));\n    if (type === 'producer') {\n      transport.on('produce', _async(function ({\n        kind,\n        rtpParameters,\n        appData\n      }, callback, errback) {\n        return _catch(function () {\n          if (!isCurrentTransport()) throw new Error('stale-transport');\n          return _await(roomMediaAckSocket('soup', {\n            action: 'produce',\n            token,\n            payload: {\n              producerTransportId: data.transportId,\n              kind,\n              rtpParameters,\n              appData\n            }\n          }), function (produced) {\n            if (!isCurrentTransport()) throw new Error('stale-transport');\n            const producerId = produced?.producerId ?? produced?.id;\n            if (!producerId) {\n              throw new Error(produced == null ? 'produce-timeout' : 'produce-bad');\n            }\n            callback({\n              id: producerId\n            });\n          });\n        }, function (error) {\n          errback(error);\n        });\n      }));\n    }\n    transport.on('connectionstatechange', state => {\n      if (state === 'connected') {\n        transport.__cameeHadConnected = true;\n      }\n      if (state === 'failed') {\n        const intentionalClose = transport.__cameeClosing === true;\n        const socketConnected = !!(State.state.socket.value?.connected || State.state.isConnected.value);\n        if (!intentionalClose && socketConnected && mediaJoined) {\n          if (type === 'producer') {\n            scheduleRoomSendRestart(`transport-${state}`);\n          } else {\n            scheduleRoomReceiveRestart(`transport-${state}`);\n          }\n        }\n        try {\n          transport.__cameeClosing = true;\n          transport.close();\n        } catch (error) {\n          //\n        }\n      }\n    });\n    return transport;\n  });\n});\nconst setupRoomMedia = _async(function ({\n  routerRtpCapabilities,\n  isViewer\n}) {\n  roomMediaGeneration += 1;\n  const generation = roomMediaGeneration;\n  const token = State.store.roomToken.value;\n  return _await(Mediasoup.Device.factory({}), function (device) {\n    return _await(device.load({\n      routerRtpCapabilities\n    }), function () {\n      if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value) {\n        throw new Error('stale');\n      }\n      let nextSendTransport = null;\n      let nextRecvTransport = null;\n      return _invoke(function () {\n        if (isViewer) {\n          return _await(createTransport('consumer', generation, token, device), function (_createTransport) {\n            nextRecvTransport = _createTransport;\n          });\n        } else {\n          return _await(Promise.all([createTransport('producer', generation, token, device), createTransport('consumer', generation, token, device)]), function (_Promise$all) {\n            [nextSendTransport, nextRecvTransport] = _Promise$all;\n          });\n        }\n      }, function () {\n        if (!isRoomMediaGenerationCurrent(generation) || token !== State.store.roomToken.value) {\n          [nextSendTransport, nextRecvTransport].forEach(transport => {\n            try {\n              if (transport) transport.__cameeClosing = true;\n              transport?.close();\n            } catch (error) {\n              //\n            }\n          });\n          throw new Error('stale');\n        }\n        if (!nextRecvTransport || !isViewer && !nextSendTransport) {\n          [nextSendTransport, nextRecvTransport].forEach(transport => {\n            try {\n              if (transport) transport.__cameeClosing = true;\n              transport?.close();\n            } catch (error) {\n              //\n            }\n          });\n          throw new Error('transport');\n        }\n        roomDevice = device;\n        roomSendTransport = nextSendTransport;\n        roomRecvTransport = nextRecvTransport;\n      });\n    });\n  });\n});\nconst setRoomMediaSession = ({\n  role,\n  joined\n}) => {\n  mediaRole = role ?? null;\n  mediaJoined = joined === true;\n};\nconst connectLocalTracksNow = function () {\n  return !mediaJoined || mediaRole === 'viewer' || !roomDevice || !roomSendTransport ? _await() : _call(requestLocalRoomStream, function () {\n    const tracks = getLiveLocalRoomTracks();\n    if (tracks.length === 0) {\n      scheduleLocalProducerRetry('stream', 'missing-local-stream-tracks');\n      return;\n    }\n    const liveH264Codec = isStreamingRoom() ? getRoomLiveH264Codec() : null;\n    const desiredSources = new Set(tracks.map(track => track.kind));\n    if (tracks.some(track => track.kind === 'video') && liveH264Codec) {\n      desiredSources.add(ROOM_LIVE_VIDEO_SOURCE);\n    }\n    return _continue(_forOf([...localProducers.entries()], function ([source, producer]) {\n      if (desiredSources.has(source)) return;\n      return _awaitIgnored(closeLocalProducer(source, producer, 'source-no-longer-required', {\n        signal: true\n      }));\n    }), function () {\n      if (isStreamingRoom() && tracks.some(track => track.kind === 'video') && !liveH264Codec) {\n        roomMediaWarn('produce:live-h264-unavailable');\n      }\n      return _continue(_forOf(tracks, function (track) {\n        const kind = track.kind;\n        if (!roomDevice.canProduce(kind)) return;\n        const producerSpecs = [{\n          source: kind,\n          codec: null,\n          encodings: kind === 'video' ? ROOM_VIDEO_ENCODINGS : null,\n          codecOptions: kind === 'video' ? {\n            videoGoogleStartBitrate: ROOM_VIDEO_START_BITRATE_KBPS,\n            ...(isStreamingRoom() ? {\n              videoGoogleMinBitrate: ROOM_STREAMING_VIDEO_MIN_BITRATE_KBPS\n            } : {})\n          } : null,\n          degradationPreference: 'maintain-framerate'\n        }];\n        if (kind === 'video' && liveH264Codec) {\n          producerSpecs.push({\n            source: ROOM_LIVE_VIDEO_SOURCE,\n            codec: liveH264Codec,\n            encodings: ROOM_LIVE_VIDEO_ENCODINGS,\n            codecOptions: {\n              videoGoogleStartBitrate: ROOM_LIVE_VIDEO_START_BITRATE_KBPS,\n              videoGoogleMinBitrate: ROOM_LIVE_VIDEO_MIN_BITRATE_KBPS\n            },\n            degradationPreference: 'maintain-resolution'\n          });\n        }\n        return _continueIgnored(_forOf(producerSpecs, function (spec) {\n          const source = spec.source;\n          return _continueIgnored(_catch(function () {\n            const existingProducer = localProducers.get(source);\n            if (existingProducer?.__cameeSourceTrack === track && !existingProducer.closed) return;\n            return _invoke(function () {\n              if (existingProducer) {\n                return _awaitIgnored(closeLocalProducer(source, existingProducer, 'replace-track', {\n                  signal: true\n                }));\n              }\n            }, function () {\n              const producerTrack = track.clone?.() ?? track;\n              const producerTrackDisabled = isRoomStreamPaused() || kind === 'audio' && isStreamingMuted();\n              producerTrack.enabled = producerTrack !== track ? !producerTrackDisabled && track.enabled : track.enabled;\n              if (kind === 'video' && isStreamingRoom() && 'contentHint' in producerTrack) {\n                producerTrack.contentHint = 'motion';\n              }\n              const producerOptions = {\n                track: producerTrack,\n                appData: {\n                  source,\n                  sourceTrackId: track.id\n                },\n                ...(spec.codec ? {\n                  codec: spec.codec\n                } : {}),\n                ...(spec.encodings ? {\n                  encodings: spec.encodings\n                } : {}),\n                ...(spec.codecOptions ? {\n                  codecOptions: spec.codecOptions\n                } : {})\n              };\n              return _await(roomSendTransport.produce(producerOptions), function (producer) {\n                return _invoke(function () {\n                  if (kind === 'video' && producer.rtpSender?.getParameters && producer.rtpSender?.setParameters) {\n                    return _continueIgnored(_catch(function () {\n                      const parameters = producer.rtpSender.getParameters();\n                      parameters.degradationPreference = spec.degradationPreference;\n                      if (source === ROOM_LIVE_VIDEO_SOURCE) {\n                        parameters.encodings = (parameters.encodings ?? []).map(encoding => ({\n                          ...encoding,\n                          ...('priority' in encoding ? {\n                            priority: 'high'\n                          } : {}),\n                          ...('networkPriority' in encoding ? {\n                            networkPriority: 'high'\n                          } : {})\n                        }));\n                      }\n                      return _awaitIgnored(producer.rtpSender.setParameters(parameters));\n                    }, function (error) {\n                      roomMediaWarn('produce:degradation-preference-unsupported', {\n                        source,\n                        error: error?.message\n                      });\n                    }));\n                  }\n                }, function () {\n                  if (isRoomStreamPaused() && !producer.paused) {\n                    producer.pause();\n                  }\n                  producer.__cameeSourceTrack = track;\n                  producer.__cameeOwnedTrack = producerTrack;\n                  producer.__cameeSourceTrackEndedHandler = () => {\n                    closeLocalProducer(source, producer, 'source-track-ended', {\n                      signal: true\n                    });\n                  };\n                  track.addEventListener?.('ended', producer.__cameeSourceTrackEndedHandler, {\n                    once: true\n                  });\n                  producer.on('transportclose', () => {\n                    closeLocalProducer(source, producer, 'transportclose');\n                  });\n                  producer.on('trackended', () => {\n                    closeLocalProducer(source, producer, 'trackended', {\n                      signal: true\n                    });\n                  });\n                  localProducers.set(source, producer);\n                  clearLocalProducerRetry(source);\n                  roomMediaLog('produce:ok', {\n                    source,\n                    kind,\n                    codec: producer.rtpParameters?.codecs?.[0]?.mimeType ?? null\n                  });\n                });\n              });\n            });\n          }, function (error) {\n            roomMediaWarn('produce:error', {\n              source,\n              kind,\n              trackId: track.id,\n              error: error?.message\n            });\n            if (source !== ROOM_LIVE_VIDEO_SOURCE) {\n              scheduleRoomSendRestart(`produce-error:${error?.message ?? 'unknown'}`);\n            }\n            scheduleLocalProducerRetry(source, error?.message ?? 'produce-error');\n          }));\n        }));\n      }), function () {\n        return _invokeIgnored(function () {\n          if (isRoomStreamPaused()) {\n            return _awaitIgnored(syncRemoteMediaPaused(true));\n          }\n        });\n      });\n    });\n  });\n};\nconst connectLocalTracks = _async(function () {\n  if (localTracksConnectPromise) {\n    localTracksConnectQueued = true;\n    return localTracksConnectPromise;\n  }\n  localTracksConnectPromise = _async(function () {\n    return _continueIgnored(_do(function () {\n      localTracksConnectQueued = false;\n      return _callIgnored(connectLocalTracksNow);\n    }, function () {\n      return !!localTracksConnectQueued;\n    }));\n  })().finally(() => {\n    localTracksConnectQueued = false;\n    localTracksConnectPromise = null;\n  });\n  return localTracksConnectPromise;\n});\nconst getRepairRequestKinds = request => {\n  const kind = request?.kind ?? request?.details?.kind;\n  if (kind === 'audio' || kind === 'video') return [kind];\n  return ['audio', 'video'];\n};\nconst handleLocalProducerRestartRequest = (request = {}) => {\n  const reason = request?.reason ?? request?.type ?? 'repair';\n  const kinds = getRepairRequestKinds(request);\n  const refreshVideoStream = kinds.includes('video') && String(reason).startsWith('dead-video');\n  void _async(function () {\n    return _continue(_forOf([...localProducers.entries()], function ([source, producer]) {\n      if (!kinds.includes(producer.kind)) return;\n      return _awaitIgnored(closeLocalProducer(source, producer, `repair:${reason}`, {\n        signal: false\n      }));\n    }), function () {\n      let _exit12 = false;\n      return _invoke(function () {\n        if (refreshVideoStream) {\n          State.store.needStream.next(true);\n          return _await(State.requestStream?.(true), function () {\n            _exit12 = true;\n          });\n        }\n      }, function (_result23) {\n        return _exit12 ? _result23 : _callIgnored(connectLocalTracks);\n      });\n    });\n  })();\n};\nconst getRoomMediaPeers = () => getRoomMediaStateValue().peers ?? [];\n\n/* === Inlined module: services/room/index.jsx === */\nconst joiningRooms = new Set();\nconst ROOM_ACTUALIZE_INTERVAL_MS = 3000;\nconst ROOM_ACTUALIZE_TIMEOUT_MS = 7000;\nconst ROOM_ROUTE_ACTUALIZE_TIMEOUT_MS = 1500;\nconst ROOM_GUEST_RECONNECT_INTERVAL_MS = 3000;\nconst ROOM_GUEST_RECONNECT_TIMEOUT_MS = 3000;\nconst ROOM_GUEST_RECONNECT_MAX_ATTEMPTS = 3;\nconst ROOM_OPTIMISTIC_ROLLBACK_MS = 2000;\nconst ROOM_ROUTE_ACTUALIZE_RETRY_DELAYS_MS = [150, 300, 600, 1000, 1500];\nconst ROOM_TRANSIENT_JOIN_ERRORS = new Set(['socket', 'token', 'router', 'already-joining']);\nconst ROOM_STREAMING_MODES = new Set(['solo', 'roulette']);\nconst getRoomReconnectAttemptStore = () => {\n  if (!State.store.roomReconnectAttempt) {\n    State.store.roomReconnectAttempt = new Rx.BehaviorSubject(0);\n  }\n  return State.store.roomReconnectAttempt;\n};\nconst getRoomNoPairNotificationKeyStore = () => {\n  if (!State.store.roomNoPairNotificationKey) {\n    State.store.roomNoPairNotificationKey = new Rx.BehaviorSubject(null);\n  }\n  return State.store.roomNoPairNotificationKey;\n};\nlet currentRoomId = null;\nlet currentRole = null;\nlet currentRoomGeneration = null;\nlet isJoined = false;\nlet roomStoreRouteSeq = 0;\nlet roomRouletteActionSeq = 0;\nlet roomOptimisticActionSeq = 0;\nconst roomOptimisticRollbackTimers = new Map();\nlet roomActualizeInFlight = false;\nlet roomActualizeInFlightIdentity = null;\nlet roomActualizeRetryTimer = null;\nlet roomActualizeRetrySignature = null;\nlet roomActualizeRetryAttempt = 0;\nlet roomReconnectRejoinPending = false;\nlet lastServerRoomMeta = null;\nlet lastServerRoomMetaSignature = null;\nlet lastLocalRepairRequestKey = null;\nlet lastLocalEmptyProducersKey = null;\nlet guestRoomHadCall = false;\nlet lastRoomSocketId = null;\nconst roomLog = (event, data = {}) => console.log(`[room] ${event}`, data);\nconst roomWarn = (event, data = {}) => console.warn(`[room] ${event}`, data);\nconst roomError = (event, data = {}) => console.error(`[room] ${event}`, data);\nconst RoomConnectingNotification = () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [attempt] = Hooks.useBehaviorSubject(getRoomReconnectAttemptStore());\n  const message = attempt > 0 ? t('reconnect', attempt, ROOM_GUEST_RECONNECT_MAX_ATTEMPTS) : t('roomCallConnecting');\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Update, {\n    style: {\n      color: theme.theme.component.toast.informational.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: 700\n    }\n  }, message));\n};\nconst roomIndexIsSocketConnected = () => !!(State.state.socket.value?.connected || State.state.isConnected.value);\nconst waitRoomMs = ms => new Promise(resolve => setTimeout(resolve, ms));\nconst getLiveRoomStreamTracks = stream => (stream?.getTracks?.() ?? []).filter(track => (track.kind === 'audio' || track.kind === 'video') && track.readyState !== 'ended');\nconst getReadyRoomStream = (stream = State.state.stream.value) => getLiveRoomStreamTracks(stream).length > 0 ? stream : null;\nconst roomIndexWaitForSocketConnected = _async(function (timeoutMs = 7000) {\n  return roomIndexIsSocketConnected() ? true : new Promise(resolve => {\n    let completed = false;\n    let sub = null;\n    let timer = null;\n    const finish = value => {\n      if (completed) return;\n      completed = true;\n      if (timer) clearTimeout(timer);\n      sub?.unsubscribe?.();\n      resolve(value);\n    };\n    timer = setTimeout(() => finish(false), timeoutMs);\n    sub = State.state.isConnected.subscribe(connected => {\n      if (connected || roomIndexIsSocketConnected()) finish(true);\n    });\n  });\n});\nconst roomIndexAckSocket = _async(function (name, data, timeoutMs = 7000) {\n  let timeoutId = null;\n  const timeout = new Promise(resolve => {\n    timeoutId = setTimeout(() => resolve(null), timeoutMs);\n  });\n  return _finallyRethrows(function () {\n    return _catch(function () {\n      return _await(Promise.race([State.ackSocket(name, data), timeout]));\n    }, function (error) {\n      roomError('ack:error', {\n        name,\n        error: error?.message\n      });\n      return null;\n    });\n  }, function (_wasThrown8, _result24) {\n    if (timeoutId) clearTimeout(timeoutId);\n    return _rethrow(_wasThrown8, _result24);\n  });\n});\nconst ensureRoomRouteStore = () => {\n  if (!State.store.room) {\n    State.store.room = new Rx.BehaviorSubject(null);\n  }\n  return State.store.room;\n};\nconst getRoomOptimisticStatesStore = () => {\n  if (!State.store.roomOptimisticStates) {\n    State.store.roomOptimisticStates = new Rx.BehaviorSubject([]);\n  }\n  return State.store.roomOptimisticStates;\n};\nconst getRoomStateValue = () => ensureRoomRouteStore().value ?? {};\nconst setRoomState = patch => {\n  const next = {\n    ...getRoomStateValue(),\n    ...patch\n  };\n  ensureRoomRouteStore().next(next);\n  return next;\n};\nconst getEffectiveRoomValue = () => {\n  const optimisticStates = getRoomOptimisticStatesStore().value ?? [];\n  return optimisticStates[optimisticStates.length - 1]?.room ?? getRoomStateValue();\n};\nconst useRoom = () => {\n  const [serverRoom] = Hooks.useBehaviorSubject(ensureRoomRouteStore());\n  const [optimisticStates] = Hooks.useBehaviorSubject(getRoomOptimisticStatesStore());\n  return optimisticStates?.[optimisticStates.length - 1]?.room ?? serverRoom ?? {};\n};\nconst clearRoomOptimisticState = (actionId = null) => {\n  const store = getRoomOptimisticStatesStore();\n  const current = store.value ?? [];\n  const removed = actionId == null ? current : current.filter(item => item.actionId === actionId);\n  if (removed.length === 0) return false;\n  removed.forEach(item => {\n    const timer = roomOptimisticRollbackTimers.get(item.actionId);\n    if (timer) clearTimeout(timer);\n    roomOptimisticRollbackTimers.delete(item.actionId);\n  });\n  store.next(actionId == null ? [] : current.filter(item => item.actionId !== actionId));\n  return true;\n};\nconst applyRoomOptimisticState = (isSearching, reason) => {\n  const actionId = ++roomOptimisticActionSeq;\n  const baselineUpdatedAt = Number(lastServerRoomMeta?.roulette?.updatedAt ?? getRoomStateValue()?.roomMeta?.roulette?.updatedAt ?? 0);\n  const currentRoom = getEffectiveRoomValue();\n  const currentMeta = currentRoom?.roomMeta ?? lastServerRoomMeta ?? {};\n  const room = {\n    ...currentRoom,\n    optimistic: {\n      actionId,\n      reason\n    },\n    roomMeta: {\n      ...currentMeta,\n      roulette: {\n        ...(currentMeta?.roulette ?? {}),\n        isSearching,\n        call: null,\n        ...(isSearching ? {\n          stopReason: null,\n          serverReason: 'room-search-start'\n        } : {})\n      }\n    }\n  };\n  const store = getRoomOptimisticStatesStore();\n  store.next([...(store.value ?? []), {\n    actionId,\n    baselineUpdatedAt,\n    expectedIsSearching: isSearching,\n    reason,\n    room\n  }]);\n  const timer = setTimeout(() => {\n    roomOptimisticRollbackTimers.delete(actionId);\n    if (clearRoomOptimisticState(actionId)) {\n      roomWarn('roulette:optimistic-rollback', {\n        reason\n      });\n    }\n  }, ROOM_OPTIMISTIC_ROLLBACK_MS);\n  roomOptimisticRollbackTimers.set(actionId, timer);\n  return actionId;\n};\nconst clearConfirmedRoomOptimisticStates = meta => {\n  const incomingRoulette = meta?.roulette;\n  const incomingUpdatedAt = Number(incomingRoulette?.updatedAt ?? 0);\n  if (incomingUpdatedAt <= 0) return;\n  const states = getRoomOptimisticStatesStore().value ?? [];\n  let confirmedIndex = -1;\n  states.forEach((item, index) => {\n    if (incomingUpdatedAt <= Number(item.baselineUpdatedAt ?? 0)) return;\n    const confirmed = item.expectedIsSearching ? incomingRoulette?.isSearching === true || incomingRoulette?.call != null : incomingRoulette?.isSearching !== true && incomingRoulette?.call == null;\n    if (confirmed) confirmedIndex = index;\n  });\n  if (confirmedIndex < 0) return;\n  const confirmedStates = states.slice(0, confirmedIndex + 1);\n  confirmedStates.forEach(item => {\n    const timer = roomOptimisticRollbackTimers.get(item.actionId);\n    if (timer) clearTimeout(timer);\n    roomOptimisticRollbackTimers.delete(item.actionId);\n  });\n  getRoomOptimisticStatesStore().next(states.slice(confirmedIndex + 1));\n};\nconst getLocalSessionId = () => State.state.session.value?.sessionId ?? State.state.session.value?.user?.sessionId ?? State.state.session.value?.userConnection?.sessionId ?? null;\nconst stableRoomStringify = value => {\n  if (value === undefined) return 'undefined';\n  if (value == null || typeof value !== 'object') return JSON.stringify(value);\n  if (Array.isArray(value)) return `[${value.map(stableRoomStringify).join(',')}]`;\n  return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${stableRoomStringify(value[key])}`).join(',')}}`;\n};\nconst hashRoomString = value => {\n  let hash = 5381;\n  for (let i = 0; i < value.length; i += 1) {\n    hash = (hash << 5) + hash ^ value.charCodeAt(i);\n  }\n  return (hash >>> 0).toString(36);\n};\nconst getRoomMetaSignature = meta => meta == null ? null : hashRoomString(stableRoomStringify(meta));\nconst getRoomRouteSignature = room => JSON.stringify({\n  roomId: room?.roomId ?? null,\n  roomToken: room?.roomToken ?? room?.token ?? null,\n  mode: room?.mode ?? null,\n  role: room?.role ?? null\n});\nconst getRoomRouteIdentitySignature = room => JSON.stringify({\n  roomId: room?.roomId ?? null,\n  mode: room?.mode ?? null,\n  role: room?.role ?? null\n});\nconst clearRoomActualizeRetry = () => {\n  if (roomActualizeRetryTimer) clearTimeout(roomActualizeRetryTimer);\n  roomActualizeRetryTimer = null;\n  roomActualizeRetrySignature = null;\n  roomActualizeRetryAttempt = 0;\n  if (getRoomReconnectAttemptStore().value !== 0) {\n    getRoomReconnectAttemptStore().next(0);\n  }\n};\nconst scheduleRoomActualizeRetry = signature => {\n  if (!signature || roomActualizeRetryTimer) return;\n  if (roomActualizeRetrySignature !== signature) {\n    roomActualizeRetrySignature = signature;\n    roomActualizeRetryAttempt = 0;\n  }\n  const route = ensureRoomRouteStore().value;\n  const routeRole = getRouteRole(route, getRouteMode(route), route?.roomToken ?? route?.token ?? null);\n  const isGuestReconnect = routeRole === 'guest';\n  if (isGuestReconnect && roomActualizeRetryAttempt >= ROOM_GUEST_RECONNECT_MAX_ATTEMPTS) {\n    roomWarn('guest-route:reconnect-exhausted', {\n      roomId: route?.roomId,\n      attempts: roomActualizeRetryAttempt\n    });\n    clearRoomActualizeRetry();\n    void handleStaleGuestRoomRoute('reconnect-exhausted');\n    return;\n  }\n  const delay = isGuestReconnect ? ROOM_GUEST_RECONNECT_INTERVAL_MS : ROOM_ROUTE_ACTUALIZE_RETRY_DELAYS_MS[Math.min(roomActualizeRetryAttempt, ROOM_ROUTE_ACTUALIZE_RETRY_DELAYS_MS.length - 1)];\n  roomActualizeRetryAttempt += 1;\n  if (isGuestReconnect) {\n    getRoomReconnectAttemptStore().next(roomActualizeRetryAttempt);\n  }\n  roomActualizeRetryTimer = setTimeout(() => {\n    roomActualizeRetryTimer = null;\n    const route = ensureRoomRouteStore().value;\n    if (!route?.roomId || getRoomRouteSignature(route) !== signature || !roomIndexIsSocketConnected()) {\n      clearRoomActualizeRetry();\n      return;\n    }\n    void actualizeRouteRoom(route, 'route-retry');\n  }, delay);\n};\nconst getRoomSearchFilterData = () => {\n  const filter = State.store.callFilterStore.value ?? {};\n  return {\n    countries: Array.isArray(filter.countries) ? filter.countries : [],\n    languages: Array.isArray(filter.languages) ? filter.languages : [],\n    sex: filter.sex ?? null,\n    age: filter.age ?? null\n  };\n};\nconst getRoomParticipantSearchSessionId = participant => participant?.id ?? participant?.sessionId ?? participant?.meta?.sessionId ?? participant?.meta?.user?.sessionId ?? participant?.meta?.userConnection?.sessionId ?? null;\nconst getRoomParticipantSearchUserId = participant => participant?.userId ?? participant?.meta?.user?.id ?? participant?.meta?.userId ?? null;\nconst getRoomPreviewMeta = _async(function ({\n  preview,\n  hash,\n  size,\n  stream = State.state.stream.value\n} = {}) {\n  return _invoke(function () {\n    if (size != null && stream && preview == null) {\n      return _continueIgnored(_catch(function () {\n        return _await(State.capturePhoto(stream, size, size, false), function (_State$capturePhoto2) {\n          preview = _State$capturePhoto2;\n        });\n      }, _empty));\n    }\n  }, function () {\n    return _invoke(function () {\n      if (hash == null) {\n        return _continueIgnored(_catch(function () {\n          return _await(stream ? State.capturePhoto(stream, 128, 128, true) : null, function (photoUri) {\n            return _invokeIgnored(function () {\n              if (photoUri) return _await(Utils.generateThumbhash(photoUri), function (_Utils$generateThumbh2) {\n                hash = _Utils$generateThumbh2;\n              });\n            });\n          }, !stream);\n        }, _empty));\n      }\n    }, function () {\n      return {\n        preview: preview ?? null,\n        hash: hash ?? null\n      };\n    });\n  });\n});\nconst getRoomSearchPeerStream = sessionId => {\n  if (!sessionId) return null;\n  return (State.api?.room?.getRoomPeers?.() ?? []).find(peer => (peer?.sessionId ?? peer?.id) === sessionId)?.stream ?? null;\n};\nconst getRoomSearchMetas = _async(function (data) {\n  const localSessionId = getLocalSessionId();\n  const participants = Array.isArray(getRoomStateValue()?.roomMeta?.participants) ? getRoomStateValue().roomMeta.participants : [];\n  return Promise.all(participants.filter(participant => participant?.role !== 'guest' && participant?.role !== 'viewer').map(_async(function (participant) {\n    const sessionId = getRoomParticipantSearchSessionId(participant);\n    if (!sessionId || sessionId === localSessionId) return null;\n    const userId = getRoomParticipantSearchUserId(participant);\n    const stream = getRoomSearchPeerStream(sessionId);\n    return _await(getRoomPreviewMeta({\n      preview: participant?.preview ?? participant?.meta?.preview,\n      hash: participant?.hash ?? participant?.meta?.hash,\n      stream\n    }), function (previewMeta) {\n      return {\n        sessionId,\n        ...(userId ? {\n          userId\n        } : {}),\n        preview: previewMeta.preview,\n        hash: previewMeta.hash\n      };\n    });\n  }))).then(metas => metas.filter(Boolean));\n});\nconst getRoomSearchPayload = _async(function (data) {\n  return _await(Promise.all([getRoomPreviewMeta(data ?? {}), getRoomSearchMetas(data ?? {})]), function ([previewMeta, metas]) {\n    const roomId = getRoomStateValue()?.roomId ?? currentRoomId;\n    return {\n      ...previewMeta,\n      roomToken: State.store.roomToken.value,\n      room: {\n        roomId,\n        metas\n      },\n      ...getRoomSearchFilterData()\n    };\n  });\n});\nconst sendRoomSearchStop = _async(function (reason, token, timeoutMs = 2000) {\n  let _exit13 = false;\n  if (token === undefined) token = State.store.roomToken.value;\n  return token ? _await(roomIndexWaitForSocketConnected(2000), function (_roomIndexWaitForSock) {\n    if (!_roomIndexWaitForSock) {\n      const _ok$error = {\n        ok: false,\n        error: 'socket'\n      };\n      _exit13 = true;\n      return _ok$error;\n    }\n    return _await(roomIndexAckSocket('stop', {\n      roomToken: token,\n      reason\n    }, timeoutMs), function (result) {\n      if (result?.roomId) {\n        applyRoomMetaFromServer(result);\n        return {\n          ok: true,\n          meta: result\n        };\n      }\n      if (result !== 'ok') {\n        roomWarn('roulette:stop-failed', {\n          result,\n          reason\n        });\n        return {\n          ok: false,\n          error: result ?? 'bad',\n          result\n        };\n      }\n      return {\n        ok: true\n      };\n    });\n  }) : {\n    ok: false,\n    error: 'token'\n  };\n});\nconst requestRoomSearchStop = function (reason) {\n  return _await(sendRoomSearchStop(reason));\n};\nconst requestRoomSearchStart = _async(function (data) {\n  let _exit14 = false;\n  return State.store.roomToken.value ? _call(roomIndexWaitForSocketConnected, function (_roomIndexWaitForSock2) {\n    if (!_roomIndexWaitForSock2) {\n      const _ok$error2 = {\n        ok: false,\n        error: 'socket'\n      };\n      _exit14 = true;\n      return _ok$error2;\n    }\n    return _await(getRoomSearchPayload(data), function (_getRoomSearchPayload) {\n      return _await(roomIndexAckSocket('start', _getRoomSearchPayload, 2000), function (result) {\n        if (result?.roomId) {\n          applyRoomMetaFromServer(result);\n          return {\n            ok: true,\n            meta: result\n          };\n        }\n        if (result !== 'ok') {\n          roomWarn('roulette:start-failed', {\n            result\n          });\n          return {\n            ok: false,\n            error: result ?? 'bad',\n            result\n          };\n        }\n        return {\n          ok: true\n        };\n      });\n    });\n  }) : {\n    ok: false,\n    error: 'token'\n  };\n});\nconst applyRoomMetaFromServer = meta => {\n  if (!meta) return false;\n  const incomingSignature = getRoomMetaSignature(meta);\n  const socketId = State.state.socket.value?.id ?? null;\n  if (incomingSignature && incomingSignature === lastServerRoomMetaSignature) {\n    if (getRoomStateValue()?.roomMetaSocketId !== socketId) {\n      setRoomState({\n        roomMeta: meta,\n        roomMetaSocketId: socketId\n      });\n      clearConfirmedRoomOptimisticStates(meta);\n      return true;\n    }\n    return false;\n  }\n  lastServerRoomMeta = meta;\n  lastServerRoomMetaSignature = incomingSignature;\n  if (getRoomRole() === 'guest' && meta?.roulette?.call != null) {\n    guestRoomHadCall = true;\n  }\n  setRoomState({\n    roomMeta: meta,\n    roomMetaSocketId: socketId\n  });\n  clearConfirmedRoomOptimisticStates(meta);\n  return true;\n};\nconst setRoomStreamingMode = _async(function (mode, roomId = null) {\n  let _exit15 = false;\n  if (!ROOM_STREAMING_MODES.has(mode)) return {\n    ok: false,\n    error: 'mode'\n  };\n  const targetRoomId = roomId ?? getRoomStateValue()?.roomId ?? null;\n  return targetRoomId ? _call(roomIndexWaitForSocketConnected, function (_roomIndexWaitForSock3) {\n    if (!_roomIndexWaitForSock3) {\n      const _ok$error3 = {\n        ok: false,\n        error: 'socket'\n      };\n      _exit15 = true;\n      return _ok$error3;\n    }\n    return _await(roomIndexAckSocket('room-streaming-mode', {\n      roomId: String(targetRoomId),\n      roomToken: State.store.roomToken.value,\n      mode\n    }, 5000), function (result) {\n      if (!result?.meta) {\n        return {\n          ok: false,\n          error: result ?? 'bad'\n        };\n      }\n      if (String(getRoomStateValue()?.roomId ?? '') === String(targetRoomId)) {\n        applyRoomMetaFromServer(result.meta);\n      }\n      return {\n        ok: true,\n        meta: result.meta\n      };\n    });\n  }) : {\n    ok: false,\n    error: 'room'\n  };\n});\nconst clearActiveRoomToken = () => {\n  State.store.roomToken.next(null);\n};\nconst applyRoomToken = (token, patch = {}) => {\n  State.store.roomToken.next(token ?? null);\n  setRoomState({\n    roomToken: token ?? null,\n    token: token ?? null,\n    ...patch\n  });\n};\nconst pickRoomRouteState = (room = getRoomStateValue()) => {\n  if (!room?.roomId) return null;\n  const token = room.roomToken ?? room.token ?? null;\n  const role = room.role ?? null;\n  return {\n    roomId: room.roomId,\n    ...(role ? {\n      role\n    } : {}),\n    ...(room.mode ? {\n      mode: 'stage'\n    } : {}),\n    ...(room.guestKey ? {\n      guestKey: room.guestKey\n    } : {}),\n    ...(token ? {\n      roomToken: token,\n      token\n    } : {})\n  };\n};\nconst leaveRoomByToken = _async(function (token) {\n  if (!token) return;\n  return _awaitIgnored(roomIndexAckSocket('soup', {\n    action: 'leave',\n    token,\n    payload: {}\n  }));\n});\nconst resetRoomState = ({\n  preserveRoute = true\n} = {}) => {\n  const routeState = preserveRoute ? pickRoomRouteState() : null;\n  resetRoomMedia();\n  clearRoomOptimisticState();\n  setRoomMediaSession({\n    role: null,\n    joined: false\n  });\n  clearActiveRoomToken();\n  currentRoomId = null;\n  currentRole = null;\n  currentRoomGeneration = null;\n  isJoined = false;\n  lastServerRoomMeta = null;\n  lastServerRoomMetaSignature = null;\n  lastLocalRepairRequestKey = null;\n  lastLocalEmptyProducersKey = null;\n  guestRoomHadCall = false;\n  if (!routeState) {\n    ensureRoomRouteStore().next(null);\n    return;\n  }\n  ensureRoomRouteStore().next({\n    ...routeState,\n    token: null,\n    joined: false,\n    peers: [],\n    roomMeta: null,\n    room: null,\n    producers: []\n  });\n};\nconst markRoomReconnectPending = ({\n  roomId = currentRoomId,\n  role = currentRole,\n  reason = 'reconnect-pending',\n  needsRejoin = true\n} = {}) => {\n  const currentState = ensureRoomRouteStore().value ?? {};\n  const route = pickRoomRouteState(currentState) ?? currentState;\n  if (!roomId && !route?.roomId) return;\n  if (needsRejoin) roomReconnectRejoinPending = true;\n  if (roomId) currentRoomId = roomId;\n  if (role) currentRole = role;\n  ensureRoomRouteStore().next({\n    ...currentState,\n    ...(route ?? {}),\n    roomId: roomId ?? route?.roomId,\n    mode: 'stage',\n    role: role ?? route?.role ?? 'member',\n    roomToken: route?.roomToken ?? route?.token ?? State.store.roomToken.value ?? null,\n    token: route?.roomToken ?? route?.token ?? State.store.roomToken.value ?? null,\n    joined: currentState.joined === true || isJoined,\n    reconnecting: true,\n    reconnectReason: reason,\n    reconnectUpdatedAt: +new Date()\n  });\n};\nconst suspendRoomMediaForReconnect = reason => {\n  roomReconnectRejoinPending = true;\n  setRoomMediaSession({\n    role: currentRole,\n    joined: false\n  });\n  markRoomReconnectPending({\n    reason,\n    needsRejoin: true\n  });\n  isJoined = false;\n};\nconst shouldPreserveRoomRouteAfterJoinError = error => {\n  const value = String(error?.message ?? error ?? 'unknown');\n  return ROOM_TRANSIENT_JOIN_ERRORS.has(value) || value.includes('timeout') || value.includes('closed') || value.includes('transport') || value.includes('socket');\n};\nconst actualizeRoomToken = _async(function (roomId, patch = {}) {\n  let _exit16 = false;\n  return _await(!roomId || roomIndexWaitForSocketConnected(), function (_roomIndexWaitForSock4) {\n    if (!roomId || !_roomIndexWaitForSock4) {\n      const _temp = null;\n      _exit16 = true;\n      return _temp;\n    }\n    const role = patch.role ?? 'member';\n    const mode = 'stage';\n    const route = ensureRoomRouteStore().value;\n    const token = patch.token ?? route?.roomToken ?? route?.token ?? State.store.roomToken.value ?? null;\n    return _await(roomIndexAckSocket('room-actualize', {\n      roomId,\n      role,\n      mode,\n      token\n    }), function (result) {\n      if (!result?.token || !result?.meta || result === 'bad') return null;\n      currentRoomId = roomId;\n      currentRole = role;\n      currentRoomGeneration = result.generation ?? currentRoomGeneration;\n      applyRoomToken(result.token, {\n        roomId,\n        role,\n        mode\n      });\n      applyRoomMetaFromServer(result.meta);\n      return result.token;\n    });\n  }, !roomId);\n});\nconst getRoomToken = _async(function (roomId) {\n  return actualizeRoomToken(roomId, {\n    role: 'member',\n    mode: 'stage'\n  });\n});\nconst joinRoomSession = _async(function ({\n  roomId,\n  role = 'member',\n  token: initialToken = null,\n  guestKey = null,\n  force = false\n}) {\n  role = role ?? 'member';\n  const mode = 'stage';\n  const joiningKey = `stage:${roomId}`;\n  if (!roomId) return {\n    ok: false,\n    error: 'missing-room-id'\n  };\n  if (joiningRooms.has(joiningKey)) return {\n    ok: false,\n    error: 'already-joining'\n  };\n  if (!force && isJoined && currentRoomId === roomId && currentRole === role && State.store.roomToken.value) {\n    return {\n      ok: true\n    };\n  }\n  joiningRooms.add(joiningKey);\n  const previousToken = State.store.roomToken.value;\n  const previousRoomId = currentRoomId;\n  const isExistingRoomSession = isJoined && String(previousRoomId ?? '') === String(roomId) || !!initialToken || !!previousToken && String(previousRoomId ?? '') === String(roomId);\n  return _finallyRethrows(function () {\n    return _catch(function () {\n      return _invoke(function () {\n        if (isJoined && previousToken && previousRoomId && String(previousRoomId) !== String(roomId)) {\n          return _awaitIgnored(leaveRoomByToken(previousToken).catch(error => {\n            roomWarn('join:previous-leave-error', {\n              error: error?.message\n            });\n          }));\n        }\n      }, function () {\n        const reconnectParticipants = force && String(previousRoomId ?? '') === String(roomId) && Array.isArray(lastServerRoomMeta?.participants) ? lastServerRoomMeta.participants : null;\n        resetRoomState();\n        return _invoke(function () {\n          if (reconnectParticipants?.length) {\n            return _awaitIgnored(reconcileRoomParticipants(reconnectParticipants, 'reconnect-placeholder', {\n              full: true\n            }));\n          }\n        }, function () {\n          setRoomMediaAckHandler(null);\n          let token = initialToken;\n          return _invoke(function () {\n            if (token) {\n              currentRoomId = roomId;\n              currentRole = role;\n              applyRoomToken(token, {\n                roomId,\n                role,\n                mode\n              });\n            } else {\n              return _await(getRoomToken(roomId), function (_getRoomToken) {\n                token = _getRoomToken;\n              });\n            }\n          }, function () {\n            if (!token) {\n              if (force && isExistingRoomSession) {\n                markRoomReconnectPending({\n                  roomId,\n                  role,\n                  reason: 'token'\n                });\n              }\n              return {\n                ok: false,\n                error: 'token'\n              };\n            }\n            const stream = getReadyRoomStream();\n            return _await(stream ? Promise.race([getRoomPreviewMeta({\n              stream\n            }), waitRoomMs(150).then(() => ({\n              preview: null,\n              hash: null\n            }))]) : {\n              preview: null,\n              hash: null\n            }, function (joinMeta) {\n              return _await(roomIndexAckSocket('soup', {\n                action: 'join',\n                token: State.store.roomToken.value,\n                payload: {\n                  guestKey,\n                  meta: joinMeta\n                }\n              }), function (joinResult) {\n                if (!joinResult?.routerRtpCapabilities) throw new Error('router');\n                if (joinResult.roomToken) applyRoomToken(joinResult.roomToken, {\n                  roomId,\n                  role,\n                  mode\n                });\n                applyRoomMetaFromServer(joinResult.meta);\n                return _await(reconcileRoomParticipants(joinResult.meta?.participants, 'join-placeholder', {\n                  full: true\n                }), function () {\n                  return _await(setupRoomMedia({\n                    routerRtpCapabilities: joinResult.routerRtpCapabilities,\n                    isViewer: false\n                  }), function () {\n                    isJoined = true;\n                    currentRoomId = roomId;\n                    currentRole = role;\n                    currentRoomGeneration = joinResult.roomGeneration ?? currentRoomGeneration;\n                    roomReconnectRejoinPending = false;\n                    setRoomMediaSession({\n                      role,\n                      joined: true\n                    });\n                    setRoomState({\n                      roomId,\n                      role,\n                      mode,\n                      joined: true,\n                      reconnecting: false,\n                      reconnectReason: null\n                    });\n                    return _await(reconcileRoomParticipants(joinResult.meta?.participants, 'join-media', {\n                      full: true\n                    }), function () {\n                      void connectLocalTracks().catch(error => {\n                        roomWarn('join:local-tracks-error', {\n                          roomId,\n                          role,\n                          error: error?.message\n                        });\n                      });\n                      roomLog('join:done', {\n                        roomId,\n                        role,\n                        mode\n                      });\n                      return {\n                        ok: true\n                      };\n                    });\n                  });\n                });\n              });\n            }, !stream);\n          });\n        });\n      });\n    }, function (error) {\n      roomError('join:error', {\n        roomId,\n        role,\n        mode,\n        error: error?.message\n      });\n      if (force && isExistingRoomSession && shouldPreserveRoomRouteAfterJoinError(error)) {\n        markRoomReconnectPending({\n          roomId,\n          role,\n          reason: error?.message ?? 'join-error'\n        });\n      } else {\n        resetRoomState();\n      }\n      return {\n        ok: false,\n        error: error?.message || 'unknown'\n      };\n    });\n  }, function (_wasThrown9, _result25) {\n    joiningRooms.delete(joiningKey);\n    return _rethrow(_wasThrown9, _result25);\n  });\n});\nconst joinRoom = _async(function ({\n  roomId,\n  guestKey,\n  role = 'member',\n  token,\n  force = false\n}) {\n  return joinRoomSession({\n    roomId,\n    guestKey,\n    role,\n    mode: 'stage',\n    token,\n    force\n  });\n});\nconst leaveRoom = _async(function ({\n  preserveRoute = true\n} = {}) {\n  const token = State.store.roomToken.value;\n  if (!preserveRoute) {\n    clearRoomActualizeRetry();\n    roomReconnectRejoinPending = false;\n  }\n  resetRoomState({\n    preserveRoute\n  });\n  return _continue(_catch(function () {\n    return _awaitIgnored(leaveRoomByToken(token));\n  }, function (error) {\n    roomWarn('leave:error', {\n      error: error?.message\n    });\n  }), function () {\n    return {\n      ok: true\n    };\n  });\n});\nconst leaveGuestRoomForRoulette = _async(function (reason) {\n  const token = State.store.roomToken.value;\n  if (!token) return {\n    ok: false,\n    error: 'token'\n  };\n  const startedAt = Date.now();\n  const snapshot = {\n    route: {\n      ...getRoomStateValue()\n    },\n    token,\n    roomId: currentRoomId,\n    role: currentRole,\n    generation: currentRoomGeneration,\n    call: State.state.call.value,\n    callRoom: State.store.room?.value ?? null,\n    isSearching: State.state.isSearching.value,\n    isInQueue: State.state.isInQueue.value,\n    hadCall: guestRoomHadCall\n  };\n  const shouldSearch = reason === 'guest-next';\n  roomStoreRouteSeq += 1;\n  clearRoomActualizeRetry();\n  roomReconnectRejoinPending = false;\n  resetRoomState({\n    preserveRoute: false\n  });\n  State.store.room?.next(null);\n  State.state.call.next(null);\n  State.state.isSearching.next(shouldSearch);\n  State.state.isInQueue.next(false);\n  return _await(sendRoomSearchStop(reason, token, ROOM_OPTIMISTIC_ROLLBACK_MS), function (result) {\n    let _exit17 = false;\n    return _invoke(function () {\n      if (!result?.ok) {\n        const rollbackDelay = ROOM_OPTIMISTIC_ROLLBACK_MS - (Date.now() - startedAt);\n        return _invoke(function () {\n          if (rollbackDelay > 0) return _awaitIgnored(waitRoomMs(rollbackDelay));\n        }, function () {\n          ensureRoomRouteStore().next(snapshot.route);\n          State.store.roomToken.next(snapshot.token);\n          State.store.room?.next(snapshot.callRoom);\n          State.state.call.next(snapshot.call);\n          State.state.isSearching.next(snapshot.isSearching);\n          State.state.isInQueue.next(snapshot.isInQueue);\n          currentRoomId = snapshot.roomId;\n          currentRole = snapshot.role;\n          currentRoomGeneration = snapshot.generation;\n          guestRoomHadCall = snapshot.hadCall;\n          roomReconnectRejoinPending = true;\n          return _await(actualizeRouteRoom(snapshot.route, 'guest-exit-rollback', {\n            forceRejoin: true\n          }), function () {\n            _exit17 = true;\n            return result;\n          });\n        });\n      }\n    }, function (_result26) {\n      return _exit17 ? _result26 : {\n        ok: true\n      };\n    });\n  });\n});\nconst cancelStartedRoomSearch = function () {\n  return requestRoomSearchStop('cancelled');\n};\nconst waitForRoomJoinIdle = _async(function (joiningKey, timeoutMs = 2000) {\n  const deadline = Date.now() + timeoutMs;\n  return _continue(_for(function () {\n    return !!joiningRooms.has(joiningKey) && Date.now() < deadline;\n  }, void 0, function () {\n    return _awaitIgnored(waitRoomMs(50));\n  }), function () {\n    return !joiningRooms.has(joiningKey);\n  });\n});\nconst ensureRoomReadyForAction = _async(function (reason) {\n  let _exit18 = false;\n  if (isJoined && State.store.roomToken.value) return {\n    ok: true\n  };\n  const route = ensureRoomRouteStore().value;\n  const roomId = route?.roomId ?? currentRoomId;\n  if (!roomId) return {\n    ok: false,\n    error: 'room'\n  };\n  const mode = getRouteMode(route);\n  const token = route?.roomToken ?? route?.token ?? State.store.roomToken.value;\n  const role = getRouteRole(route, mode, token);\n  const joiningKey = `stage:${roomId}`;\n  return _invoke(function () {\n    if (joiningRooms.has(joiningKey)) {\n      return _await(waitForRoomJoinIdle(joiningKey), function () {\n        if (isJoined && State.store.roomToken.value) {\n          const _ok = {\n            ok: true\n          };\n          _exit18 = true;\n          return _ok;\n        }\n      });\n    }\n  }, function (_result27) {\n    return _exit18 ? _result27 : _await(actualizeCurrentRoom({\n      forceRejoin: true,\n      reason,\n      timeoutMs: ROOM_ACTUALIZE_TIMEOUT_MS\n    }));\n  });\n});\nconst startRoomRoulette = _async(function () {\n  let _exit19 = false;\n  const actionSeq = ++roomRouletteActionSeq;\n  let role = getRoomRole();\n  return _invoke(function () {\n    if (role === 'guest') {\n      return _await(leaveGuestRoomForRoulette('guest-next'), function (left) {\n        if (!left?.ok) {\n          _exit19 = true;\n          return left;\n        }\n        if (roomRouletteActionSeq !== actionSeq || !State.state.isSearching.value) {\n          const _ok$cancelled = {\n            ok: false,\n            cancelled: true\n          };\n          _exit19 = true;\n          return _ok$cancelled;\n        }\n        State.state.isInQueue.next(false);\n        return _await(manifest().call.onTryStart(false), function () {\n          const _ok2 = {\n            ok: true\n          };\n          _exit19 = true;\n          return _ok2;\n        });\n      });\n    }\n  }, function (_result28) {\n    if (_exit19) return _result28;\n    const optimisticActionId = applyRoomOptimisticState(true, 'start');\n    return _await(ensureRoomReadyForAction('room-search-start'), function (ready) {\n      if (!ready?.ok) {\n        clearRoomOptimisticState(optimisticActionId);\n        return ready;\n      }\n      if (roomRouletteActionSeq !== actionSeq) {\n        clearRoomOptimisticState(optimisticActionId);\n        return {\n          ok: false,\n          cancelled: true\n        };\n      }\n      role = getRoomRole();\n      if (!State.store.roomToken.value) {\n        clearRoomOptimisticState(optimisticActionId);\n        return {\n          ok: false,\n          error: 'token'\n        };\n      }\n      return _call(requestRoomSearchStart, function (queueResult) {\n        let _exit20 = false;\n        if (!queueResult?.ok) {\n          clearRoomOptimisticState(optimisticActionId);\n          return queueResult;\n        }\n        return _invoke(function () {\n          if (roomRouletteActionSeq !== actionSeq) {\n            return _call(cancelStartedRoomSearch, function () {\n              clearRoomOptimisticState(optimisticActionId);\n              const _ok$cancelled2 = {\n                ok: false,\n                cancelled: true\n              };\n              _exit20 = true;\n              return _ok$cancelled2;\n            });\n          }\n        }, function (_result29) {\n          return _exit20 ? _result29 : {\n            ok: true\n          };\n        });\n      });\n    });\n  });\n});\nconst stopRoomRoulette = _async(function () {\n  let _exit21 = false;\n  roomRouletteActionSeq += 1;\n  let role = getRoomRole();\n  return _invoke(function () {\n    if (role === 'guest') {\n      return _await(leaveGuestRoomForRoulette('guest-stop'), function (left) {\n        if (!left?.ok) {\n          _exit21 = true;\n          return left;\n        }\n        return _await(manifest().call.onStop({\n          emitSocket: false,\n          roomAlreadyLeft: true\n        }), function () {\n          const _ok3 = {\n            ok: true\n          };\n          _exit21 = true;\n          return _ok3;\n        });\n      });\n    }\n  }, function (_result30) {\n    if (_exit21) return _result30;\n    const optimisticActionId = applyRoomOptimisticState(false, 'stop');\n    return _await(ensureRoomReadyForAction('room-search-stop'), function (ready) {\n      if (!ready?.ok) {\n        clearRoomOptimisticState(optimisticActionId);\n        return ready;\n      }\n      role = getRoomRole();\n      if (!State.store.roomToken.value) {\n        clearRoomOptimisticState(optimisticActionId);\n        return {\n          ok: false,\n          error: 'token'\n        };\n      }\n      return _await(requestRoomSearchStop('manual'), function (result) {\n        if (!result?.ok) {\n          clearRoomOptimisticState(optimisticActionId);\n          return result;\n        }\n        return {\n          ok: true\n        };\n      });\n    });\n  });\n});\nconst skipRoomRoulette = _async(function () {\n  let _exit22 = false;\n  const actionSeq = ++roomRouletteActionSeq;\n  let role = getRoomRole();\n  return _invoke(function () {\n    if (role === 'guest') {\n      return _await(leaveGuestRoomForRoulette('guest-next'), function (left) {\n        if (!left?.ok) {\n          _exit22 = true;\n          return left;\n        }\n        if (roomRouletteActionSeq !== actionSeq || !State.state.isSearching.value) {\n          const _ok$cancelled3 = {\n            ok: false,\n            cancelled: true\n          };\n          _exit22 = true;\n          return _ok$cancelled3;\n        }\n        State.state.isInQueue.next(false);\n        return _await(manifest().call.onTryStart(false), function () {\n          const _ok4 = {\n            ok: true\n          };\n          _exit22 = true;\n          return _ok4;\n        });\n      });\n    }\n  }, function (_result31) {\n    if (_exit22) return _result31;\n    const optimisticActionId = applyRoomOptimisticState(true, 'skip');\n    return _await(ensureRoomReadyForAction('room-search-skip'), function (ready) {\n      if (!ready?.ok) {\n        clearRoomOptimisticState(optimisticActionId);\n        return ready;\n      }\n      if (roomRouletteActionSeq !== actionSeq) {\n        clearRoomOptimisticState(optimisticActionId);\n        return {\n          ok: false,\n          cancelled: true\n        };\n      }\n      role = getRoomRole();\n      if (!State.store.roomToken.value) {\n        clearRoomOptimisticState(optimisticActionId);\n        return {\n          ok: false,\n          error: 'token'\n        };\n      }\n      return _await(requestRoomSearchStop('room-skip'), function (stopResult) {\n        if (!stopResult?.ok) {\n          clearRoomOptimisticState(optimisticActionId);\n          return stopResult;\n        }\n        return {\n          ok: true\n        };\n      });\n    });\n  });\n});\nconst leaveRoomAfterRemoteEnd = _async(function (type) {\n  const role = getRoomRole();\n  const shouldRestartSearch = type === 'kick' && role === 'guest';\n  return _await(leaveRoom({\n    preserveRoute: false\n  }), function () {\n    return _invokeIgnored(function () {\n      if (role === 'guest') {\n        return _await(manifest().call.onStop({\n          emitSocket: false,\n          forceLeaveGuestRoom: true,\n          endedBy: shouldRestartSearch ? 'partner_next' : 'partner_leave'\n        }), function () {\n          return _invokeIgnored(function () {\n            if (shouldRestartSearch) {\n              State.state.isSearching.next(true);\n              return _awaitIgnored(manifest().call.onTryStartIfSearching());\n            }\n          });\n        });\n      }\n    });\n  });\n});\nconst handleStaleGuestRoomRoute = _async(function (reason) {\n  roomWarn('guest-route:stale', {\n    reason\n  });\n  return _await(leaveRoomAfterRemoteEnd('kick'), function () {\n    return {\n      ok: true,\n      staleGuest: true\n    };\n  });\n});\nconst getRoomStateParticipantSessionId = participant => participant?.id ?? participant?.sessionId ?? participant?.meta?.sessionId ?? participant?.meta?.user?.sessionId ?? participant?.meta?.userConnection?.sessionId ?? null;\nconst getLocalRoomStateParticipant = meta => {\n  const localSessionId = getLocalSessionId();\n  if (!localSessionId || !Array.isArray(meta?.participants)) return null;\n  return meta.participants.find(participant => getRoomStateParticipantSessionId(participant) === localSessionId) ?? null;\n};\nconst showRoomNoPairModal = meta => {\n  const updatedAt = Number(meta?.roulette?.updatedAt ?? 0);\n  const roomId = meta?.roomId ?? ensureRoomRouteStore().value?.roomId ?? currentRoomId ?? 'room';\n  const notificationKey = `${roomId}:${updatedAt}`;\n  const notificationStore = getRoomNoPairNotificationKeyStore();\n  if (notificationStore.value === notificationKey) return;\n  notificationStore.next(notificationKey);\n  let action = null;\n  Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"EmptySearchModal\",\n    onKeepSearching: () => {\n      action = 'continue';\n    },\n    onStop: () => {\n      action = 'stop';\n    }\n  }), {\n    theme: Theme?.isDark?.value ? 'dark' : 'light',\n    props: {\n      holderMode: true,\n      style: {\n        maxWidth: 500\n      }\n    }\n  }).then(() => {\n    if (action === 'continue') {\n      return startRoomRoulette();\n    }\n    if (action === 'stop') {\n      return stopRoomRoulette();\n    }\n    return null;\n  }).catch(error => {\n    roomWarn('roulette:no-pair-modal-error', {\n      error: error?.message ?? String(error)\n    });\n  });\n};\nconst handleRoomStateEffects = _async(function (meta) {\n  let _exit23 = false;\n  const role = getRoomRole();\n  const lifecycle = meta?.lifecycle ?? {};\n  const localSessionId = getLocalSessionId();\n  const affectedPeerIds = Array.isArray(lifecycle.affectedPeerIds) ? lifecycle.affectedPeerIds : [];\n  if (role !== 'guest' && meta?.roulette?.isSearching === false && meta?.roulette?.stopReason === 'no-pair') {\n    showRoomNoPairModal(meta);\n  }\n  return _invoke(function () {\n    if (lifecycle.destroyed === true) {\n      return _await(leaveRoomAfterRemoteEnd('destroy'), function () {\n        _exit23 = true;\n        return true;\n      });\n    }\n  }, function (_result32) {\n    let _exit24 = false;\n    if (_exit23) return _result32;\n    return _invoke(function () {\n      if ((lifecycle.reason === 'kick' || lifecycle.reason === 'leave') && localSessionId && affectedPeerIds.includes(localSessionId)) {\n        return _await(leaveRoomAfterRemoteEnd(lifecycle.reason), function () {\n          _exit24 = true;\n          return true;\n        });\n      }\n    }, function (_result33) {\n      let _exit25 = false;\n      if (_exit24) return _result33;\n      return _invoke(function () {\n        if (role === 'guest' && isJoined && guestRoomHadCall && meta?.roulette?.call == null) {\n          roomWarn('guest-route:call-ended', {\n            roomId: currentRoomId,\n            lifecycleReason: lifecycle.reason ?? null\n          });\n          return _await(leaveRoomAfterRemoteEnd(lifecycle.reason === 'kick' ? 'kick' : 'leave'), function () {\n            _exit25 = true;\n            return true;\n          });\n        }\n      }, function (_result34) {\n        if (_exit25) return _result34;\n        if (isJoined && Array.isArray(meta?.participants) && !getLocalRoomStateParticipant(meta)) {\n          const joiningKey = currentRoomId ? `stage:${currentRoomId}` : null;\n          if (joiningKey && joiningRooms.has(joiningKey)) {\n            return true;\n          }\n          if (!roomReconnectRejoinPending) {\n            roomWarn('local-transport:missing', {\n              roomId: currentRoomId,\n              role\n            });\n            markRoomReconnectPending({\n              roomId: currentRoomId,\n              role,\n              reason: 'local-transport-missing'\n            });\n            scheduleRoomActualizeRetry(getRoomRouteSignature(ensureRoomRouteStore().value));\n          }\n          return true;\n        }\n        const localParticipant = getLocalRoomStateParticipant(meta);\n        const repairRequest = localParticipant?.repairRequest;\n        if (repairRequest) {\n          const repairKey = JSON.stringify({\n            type: repairRequest.type,\n            producerId: repairRequest.producerId,\n            kind: repairRequest.kind,\n            attempt: repairRequest.attempt,\n            updatedAt: repairRequest.updatedAt\n          });\n          if (repairKey !== lastLocalRepairRequestKey) {\n            lastLocalRepairRequestKey = repairKey;\n            handleLocalProducerRestartRequest(repairRequest);\n          }\n        }\n        if (isJoined && localParticipant && Array.isArray(localParticipant.producers) && localParticipant.producers.length === 0) {\n          const emptyProducersKey = JSON.stringify({\n            roomId: currentRoomId,\n            sessionId: getRoomStateParticipantSessionId(localParticipant),\n            repairUpdatedAt: repairRequest?.updatedAt ?? null,\n            transports: Array.isArray(localParticipant.transports) ? localParticipant.transports.length : null\n          });\n          if (emptyProducersKey !== lastLocalEmptyProducersKey) {\n            lastLocalEmptyProducersKey = emptyProducersKey;\n            handleLocalProducerRestartRequest({\n              type: 'emptyLocalProducers',\n              reason: 'server-empty-local-producers',\n              updatedAt: Date.now()\n            });\n          }\n        }\n        return false;\n      });\n    });\n  });\n});\nconst handleMediasoupEvent = _async(function (payload) {\n  let _exit26 = false;\n  const type = payload?.type;\n  const data = payload?.data;\n  if (!type) return;\n  return _invoke(function () {\n    if (type === 'room-recreated') {\n      const incomingGeneration = Number(data?.generation ?? 0);\n      if (incomingGeneration > 0 && currentRoomGeneration === incomingGeneration && (roomActualizeInFlight || roomReconnectRejoinPending)) {\n        _exit26 = true;\n        return;\n      }\n      if (incomingGeneration > 0) {\n        currentRoomGeneration = incomingGeneration;\n      }\n      suspendRoomMediaForReconnect(data?.reason ?? 'room-recreated');\n      const route = ensureRoomRouteStore().value;\n      return _invoke(function () {\n        if (route?.roomId) {\n          return _awaitIgnored(actualizeRouteRoom(route, data?.reason ?? 'room-recreated', {\n            forceRejoin: true\n          }));\n        }\n      }, function () {\n        _exit26 = true;\n      });\n    }\n  }, function (_result35) {\n    let _exit27 = false;\n    if (_exit26) return _result35;\n    if (type !== 'meta') {\n      return;\n    }\n    if (!State.store.roomToken.value && !ensureRoomRouteStore().value?.roomId) {\n      return;\n    }\n    const meta = data ?? null;\n    const incomingGeneration = Number(meta?.generation ?? 0);\n    const generationChanged = currentRoomGeneration != null && incomingGeneration > 0 && incomingGeneration !== currentRoomGeneration;\n    return _invoke(function () {\n      if (generationChanged) {\n        roomWarn('generation:changed', {\n          roomId: meta?.roomId ?? currentRoomId,\n          previousGeneration: currentRoomGeneration,\n          generation: incomingGeneration\n        });\n        currentRoomGeneration = incomingGeneration;\n        suspendRoomMediaForReconnect('generation-changed');\n        applyRoomMetaFromServer(meta);\n        return _await(reconcileRoomParticipants(meta?.participants, 'generation-placeholder', {\n          full: true\n        }), function () {\n          const route = ensureRoomRouteStore().value;\n          return _invoke(function () {\n            if (route?.roomId) {\n              return _awaitIgnored(actualizeRouteRoom(route, 'generation-changed', {\n                forceRejoin: true\n              }));\n            }\n          }, function () {\n            _exit27 = true;\n          });\n        });\n      }\n    }, function (_result36) {\n      let _exit28 = false;\n      if (_exit27) return _result36;\n      const applied = applyRoomMetaFromServer(meta);\n      if (!applied) return;\n      return _await(handleRoomStateEffects(meta), function (_handleRoomStateEffec) {\n        if (_handleRoomStateEffec) {\n          _exit28 = true;\n          return;\n        }\n        return _awaitIgnored(reconcileRoomParticipants(meta?.participants, 'meta', {\n          full: true\n        }));\n      });\n    });\n  });\n});\nconst getRoomPeers = () => getRoomMediaPeers();\nconst getRoomInfo = () => getRoomStateValue();\nconst getRoomRole = () => currentRole ?? getRoomStateValue().role ?? 'member';\nconst isRoomJoined = () => isJoined;\nconst resetRoomMediaState = () => resetRoomMedia();\nconst setRoomMediaAck = handler => setRoomMediaAckHandler(handler);\nconst setRoomMediaStateSession = patch => setRoomMediaSession(patch);\nconst setupRoomMediaState = function (options) {\n  return _await(setupRoomMedia(options));\n};\nconst reconcileRoomMediaParticipants = function (participants, reason, options) {\n  return _await(reconcileRoomParticipants(participants, reason, options));\n};\nconst setRoomRoute = ({\n  roomId,\n  role,\n  roomToken,\n  token,\n  guestKey\n} = {}) => {\n  if (!roomId) return getRoomStateValue();\n  const current = getRoomStateValue();\n  const nextToken = roomToken ?? token ?? (current?.roomId === roomId ? current?.roomToken ?? current?.token ?? null : null);\n  const patch = {\n    roomId,\n    mode: 'stage',\n    ...(role ? {\n      role\n    } : {}),\n    ...(guestKey ? {\n      guestKey\n    } : {}),\n    ...(nextToken ? {\n      roomToken: nextToken,\n      token: nextToken\n    } : {})\n  };\n  const next = {\n    ...current,\n    ...patch\n  };\n  if (getRoomRouteSignature(current) === getRoomRouteSignature(next)) return current;\n  return setRoomState(patch);\n};\nconst getRouteRole = (room, mode, _token) => {\n  if (room?.role) return room.role;\n  if (room?.roomId && currentRoomId === room.roomId && currentRole) return currentRole;\n  if (_token) return 'guest';\n  return 'member';\n};\nconst getRouteMode = _room => 'stage';\nconst updateRoomRouteToken = token => {\n  if (!token) return;\n  const route = ensureRoomRouteStore().value;\n  if (!route?.roomId) return;\n  const currentToken = route.roomToken ?? route.token ?? null;\n  if (currentToken === token) return;\n  ensureRoomRouteStore().next({\n    ...route,\n    roomToken: token,\n    token\n  });\n};\nconst forceRejoinRoomRoute = _async(function (reason, tokenOverride = null) {\n  const route = ensureRoomRouteStore().value;\n  const roomId = route?.roomId ?? currentRoomId;\n  if (!roomId) return {\n    ok: false,\n    error: 'room'\n  };\n  const mode = getRouteMode(route);\n  const token = tokenOverride ?? route?.roomToken ?? route?.token ?? State.store.roomToken.value;\n  const role = getRouteRole(route, mode, token);\n  const joiningKey = `stage:${roomId}`;\n  if (joiningRooms.has(joiningKey)) return {\n    ok: false,\n    skipped: true\n  };\n  roomLog('rejoin', {\n    roomId,\n    role,\n    mode,\n    reason\n  });\n  if (isJoined) {\n    markRoomReconnectPending({\n      roomId,\n      role,\n      reason\n    });\n  }\n  return joinRoom({\n    roomId,\n    token,\n    role,\n    guestKey: route?.guestKey,\n    force: true\n  });\n});\nconst actualizeCurrentRoom = _async(function ({\n  forceRejoin = false,\n  reason = 'periodic',\n  timeoutMs = ROOM_ACTUALIZE_TIMEOUT_MS\n} = {}) {\n  let _exit29 = false;\n  const route = ensureRoomRouteStore().value;\n  const routeIdentity = getRoomRouteIdentitySignature(route);\n  if (roomActualizeInFlight) {\n    return {\n      ok: false,\n      skipped: true,\n      busyIdentity: roomActualizeInFlightIdentity\n    };\n  }\n  const roomId = route?.roomId ?? currentRoomId;\n  return roomId ? _await(roomIndexWaitForSocketConnected(2000), function (_roomIndexWaitForSock5) {\n    if (!_roomIndexWaitForSock5) {\n      const _ok$error4 = {\n        ok: false,\n        error: 'socket'\n      };\n      _exit29 = true;\n      return _ok$error4;\n    }\n    const mode = getRouteMode(route);\n    const token = route?.roomToken ?? route?.token ?? State.store.roomToken.value;\n    const role = getRouteRole(route, mode, token);\n    const joiningKey = `stage:${roomId}`;\n    if (joiningRooms.has(joiningKey)) {\n      return {\n        ok: false,\n        skipped: true,\n        busyIdentity: routeIdentity\n      };\n    }\n    roomActualizeInFlight = true;\n    roomActualizeInFlightIdentity = routeIdentity;\n    return _finallyRethrows(function () {\n      return _await(roomIndexAckSocket('room-actualize', {\n        roomId,\n        role,\n        mode,\n        token\n      }, timeoutMs), function (result) {\n        let _exit30 = false;\n        return _invoke(function () {\n          if (result?.ended) {\n            roomLog('guest-route:ended', {\n              roomId,\n              reason\n            });\n            clearRoomActualizeRetry();\n            roomReconnectRejoinPending = false;\n            return _await(leaveRoomAfterRemoteEnd('leave'), function () {\n              const _ok$ended = {\n                ok: false,\n                ended: true\n              };\n              _exit30 = true;\n              return _ok$ended;\n            });\n          }\n        }, function (_result38) {\n          let _exit31 = false;\n          if (_exit30) return _result38;\n          if (!result?.token || !result?.meta) {\n            if (role === 'guest') {\n              roomWarn('guest-route:reconnect-required', {\n                roomId,\n                reason,\n                result\n              });\n              markRoomReconnectPending({\n                roomId,\n                role,\n                reason: result ?? reason,\n                needsRejoin: false\n              });\n              scheduleRoomActualizeRetry(getRoomRouteSignature(ensureRoomRouteStore().value));\n              return {\n                ok: false,\n                error: result ?? 'bad',\n                reconnecting: true\n              };\n            }\n            if (reason !== 'route' && reason !== 'route-retry') {\n              roomWarn('actualize:failed', {\n                roomId,\n                role,\n                mode,\n                reason,\n                result\n              });\n            }\n            return {\n              ok: false,\n              error: result ?? 'bad'\n            };\n          }\n          const previousToken = State.store.roomToken.value;\n          const nextToken = result.token;\n          const nextGeneration = result.generation ?? null;\n          const tokenChanged = !!nextToken && nextToken !== previousToken;\n          const generationChanged = currentRoomGeneration != null && nextGeneration != null && currentRoomGeneration !== nextGeneration;\n          if (tokenChanged && (generationChanged || !previousToken)) {\n            applyRoomToken(nextToken, {\n              roomId,\n              role,\n              mode\n            });\n            updateRoomRouteToken(nextToken);\n          }\n          if (nextGeneration != null) currentRoomGeneration = nextGeneration;\n          return _invoke(function () {\n            if (forceRejoin || generationChanged || !isJoined) {\n              return _await(forceRejoinRoomRoute(reason, nextToken), function (rejoinResult) {\n                if (!rejoinResult?.ok && !rejoinResult?.skipped) {\n                  roomWarn('rejoin:failed', {\n                    roomId,\n                    role,\n                    mode,\n                    reason,\n                    result: rejoinResult\n                  });\n                  const _ok$error5 = {\n                    ok: false,\n                    error: rejoinResult?.error ?? 'rejoin'\n                  };\n                  _exit31 = true;\n                  return _ok$error5;\n                }\n              });\n            } else {\n              const applied = applyRoomMetaFromServer(result.meta);\n              return _await(applied && handleRoomStateEffects(result.meta), function (_handleRoomStateEffec2) {\n                return _invokeIgnored(function () {\n                  if (applied && !_handleRoomStateEffec2) {\n                    return _awaitIgnored(reconcileRoomParticipants(result.meta?.participants, 'actualize-meta', {\n                      full: true\n                    }));\n                  }\n                });\n              }, !applied);\n            }\n          }, function (_result39) {\n            if (_exit31) return _result39;\n            const activeRoom = ensureRoomRouteStore().value;\n            if (isJoined && String(activeRoom?.roomId ?? '') === String(roomId)) {\n              setRoomState({\n                joined: true,\n                reconnecting: false,\n                reconnectReason: null\n              });\n            }\n            clearRoomActualizeRetry();\n            return {\n              ok: true\n            };\n          });\n        });\n      });\n    }, function (_wasThrown0, _result37) {\n      roomActualizeInFlight = false;\n      roomActualizeInFlightIdentity = null;\n      return _rethrow(_wasThrown0, _result37);\n    });\n  }) : {\n    ok: false,\n    error: 'room'\n  };\n});\nconst actualizeRouteRoom = _async(function (room, reason = 'route', {\n  forceRejoin = false\n} = {}) {\n  const signature = getRoomRouteSignature(room);\n  const identitySignature = getRoomRouteIdentitySignature(room);\n  const shouldForceRejoin = forceRejoin || roomReconnectRejoinPending || !isJoined;\n  return _await(actualizeCurrentRoom({\n    forceRejoin: shouldForceRejoin,\n    reason,\n    timeoutMs: getRouteRole(room, getRouteMode(room), room?.roomToken ?? room?.token ?? null) === 'guest' && reason === 'route-retry' ? ROOM_GUEST_RECONNECT_TIMEOUT_MS : ROOM_ROUTE_ACTUALIZE_TIMEOUT_MS\n  }), function (result) {\n    const route = ensureRoomRouteStore().value;\n    if (getRoomRouteIdentitySignature(route) !== identitySignature) return result;\n    if (result?.ok) {\n      if (shouldForceRejoin) roomReconnectRejoinPending = false;\n      clearRoomActualizeRetry();\n      return result;\n    }\n    if (result?.skipped && result?.busyIdentity === identitySignature) {\n      return result;\n    }\n    if (result?.reconnecting) {\n      return result;\n    }\n    const canRetryAsReconnect = isJoined || room?.reconnecting === true || !!(room?.roomToken ?? room?.token ?? State.store.roomToken.value);\n    if (canRetryAsReconnect) {\n      scheduleRoomActualizeRetry(signature);\n    } else {\n      clearRoomActualizeRetry();\n    }\n    return result;\n  });\n});\nconst applyRoomStoreRoute = _async(function (room) {\n  let _exit32 = false;\n  const routeSeq = ++roomStoreRouteSeq;\n  return _invoke(function () {\n    if (!room) {\n      clearRoomActualizeRetry();\n      return _invoke(function () {\n        if (isJoined) return _awaitIgnored(leaveRoom({\n          preserveRoute: false\n        }));else ensureRoomRouteStore().next(null);\n      }, function () {\n        _exit32 = true;\n      });\n    }\n  }, function (_result40) {\n    if (_exit32) return _result40;\n    const roomId = room.roomId;\n    const token = room.roomToken ?? room.token ?? null;\n    const mode = getRouteMode(room);\n    const role = getRouteRole(room, mode, token);\n    const isExistingRoomSession = room?.reconnecting === true || !!token || isJoined && String(currentRoomId ?? '') === String(roomId) || !!State.store.roomToken.value && String(currentRoomId ?? '') === String(roomId);\n    if (!roomId) return;\n    if (!roomIndexIsSocketConnected()) return;\n    if (isJoined && currentRoomId === roomId && currentRole === role && (!token || State.store.roomToken.value === token)) return;\n    return _invoke(function () {\n      if (isJoined) return _callIgnored(leaveRoom);\n    }, function () {\n      if (routeSeq !== roomStoreRouteSeq) return;\n      return _await(joinRoom({\n        roomId,\n        token,\n        role,\n        guestKey: room.guestKey,\n        force: true\n      }), function (result) {\n        let _exit33 = false;\n        return _invoke(function () {\n          if (routeSeq !== roomStoreRouteSeq || getRoomRouteSignature(ensureRoomRouteStore().value) !== getRoomRouteSignature(room)) {\n            return _invoke(function () {\n              if (result?.ok) return _callIgnored(leaveRoom);\n            }, function () {\n              _exit33 = true;\n            });\n          }\n        }, function (_result41) {\n          if (_exit33) return _result41;\n          if (!result?.ok) {\n            const currentRoute = ensureRoomRouteStore().value;\n            if (getRoomRouteIdentitySignature(currentRoute) === getRoomRouteIdentitySignature(room)) {\n              if (isExistingRoomSession) {\n                markRoomReconnectPending({\n                  roomId,\n                  role,\n                  reason: result?.error ?? 'route-join-error'\n                });\n                scheduleRoomActualizeRetry(getRoomRouteSignature(ensureRoomRouteStore().value));\n              } else {\n                roomReconnectRejoinPending = false;\n                clearRoomActualizeRetry();\n                setRoomState({\n                  joined: false,\n                  reconnecting: false,\n                  reconnectReason: null\n                });\n              }\n            }\n          }\n        });\n      });\n    });\n  });\n});\nconst roomService = {\n  api: {\n    name: 'room',\n    joinRoom,\n    leaveRoom,\n    setRoomRoute,\n    startRoomRoulette,\n    stopRoomRoulette,\n    skipRoomRoulette,\n    setStreamingMode: setRoomStreamingMode,\n    getRoomToken,\n    getRoomPeers,\n    getRoomInfo,\n    getRoomRole,\n    isRoomJoined,\n    isReceiveReady: isRoomMediaReceiveReady,\n    getStreamPausedStore: getRoomStreamPausedStore,\n    setStreamPaused: setLocalMediaPaused,\n    getMutedStreamingStore,\n    setStreamingMuted: setLocalStreamingMuted,\n    resetMedia: resetRoomMediaState,\n    setMediaAckHandler: setRoomMediaAck,\n    setMediaSession: setRoomMediaStateSession,\n    setupMedia: setupRoomMediaState,\n    reconcileParticipants: reconcileRoomMediaParticipants,\n    useRoom\n  },\n  init() {\n    getMutedStreamingStore();\n    getRoomReconnectAttemptStore();\n    getRoomOptimisticStatesStore();\n  },\n  subs() {\n    return Rx.combineLatest([State.state.stream.pipe(Rx.tap(_async(function (stream) {\n      let _exit34 = false;\n      if (!stream) return;\n      setLocalStreamingMuted(getMutedStreamingStore().value);\n      return _invoke(function () {\n        if (!isJoined) {\n          const room = ensureRoomRouteStore().value;\n          if (room?.roomId && joiningRooms.has(`stage:${room.roomId}`)) {\n            _exit34 = true;\n            return;\n          }\n          return function () {\n            if (room?.roomId) {\n              return _await(actualizeRouteRoom(room, 'stream-ready', {\n                forceRejoin: true\n              }), function () {\n                _exit34 = true;\n              });\n            }\n          }();\n        }\n      }, function (_result43) {\n        return _exit34 ? _result43 : _callIgnored(connectLocalTracks);\n      });\n    }))), getMutedStreamingStore().pipe(Rx.distinctUntilChanged(), Rx.tap(setLocalStreamingMuted)), Rx.combineLatest([State.state.isConnected.pipe(Rx.distinctUntilChanged()), ensureRoomRouteStore().pipe(Rx.map(room => room ?? null), Rx.distinctUntilChanged((prev, nextRoom) => getRoomRouteSignature(prev) === getRoomRouteSignature(nextRoom))), Rx.timer(0, ROOM_ACTUALIZE_INTERVAL_MS)]).pipe(Rx.tap(([isConnected, room]) => {\n      const socketId = isConnected ? State.state.socket.value?.id ?? null : null;\n      if (!room) {\n        lastRoomSocketId = socketId;\n        return applyRoomStoreRoute(null);\n      }\n      if (!isConnected) {\n        lastRoomSocketId = null;\n        clearRoomActualizeRetry();\n        suspendRoomMediaForReconnect('socket-disconnected');\n        return;\n      }\n      const socketChanged = socketId != null && socketId !== lastRoomSocketId;\n      if (socketId != null) lastRoomSocketId = socketId;\n      const forceRejoin = socketChanged || roomReconnectRejoinPending || !isJoined || !isRoomMediaReceiveReady();\n      if (socketChanged) {\n        roomLog('socket:changed', {\n          roomId: room.roomId,\n          socketId\n        });\n      }\n      return actualizeRouteRoom(room, socketChanged ? 'socket-reconnect' : 'periodic', {\n        forceRejoin\n      });\n    })), Rx.combineLatest([State.state.isConnected.pipe(Rx.distinctUntilChanged()), ensureRoomRouteStore().pipe(Rx.map(room => room ?? null))]).pipe(Rx.map(([, room]) => !!(room?.roomId && room?.reconnecting === true)), Rx.debounceTime(350), Rx.distinctUntilChanged(), Rx.tap(shouldShow => {\n      if (shouldShow) {\n        Notification.showNotification({\n          key: 'roomconnecting',\n          duration: null,\n          onClick: null,\n          children: /*#__PURE__*/React.createElement(RoomConnectingNotification, null)\n        });\n      } else {\n        Notification.hideNotificationByKey('roomconnecting');\n      }\n    }))]);\n  },\n  use() {\n    State.useSocket('soup', handleMediasoupEvent);\n    const [room] = Hooks.useBehaviorSubject(State.store.roomToken);\n    React.useEffect(() => {\n      State.state.headers.next({\n        ...State.state.headers.value,\n        room\n      });\n    }, [room]);\n  }\n};\n\n/* === Inlined module: services/headers.jsx === */\nconst headersService = {\n  subs() {\n    return Rx.combineLatest([State.state.headers.pipe(Rx.debounceTime(100), Rx.withLatestFrom(State.state.isConnected), Rx.filter(([, isConnected]) => isConnected), Rx.delay(1000), Rx.tap(([headers]) => {\n      State.emitSocket(\"headers\", headers);\n    }))\n    // State.state.stream.pipe(\n    //     Rx.debounceTime(1000),\n    //     Rx.map(stream => {\n    //         return !!stream?.getVideoTracks?.()?.length;\n    //     }),\n    //     Rx.distinctUntilChanged(),\n    //     Rx.tap((hasVideo) => {\n    //         State.state.headers.next({\n    //             ...(State.state.headers.value ?? {}),\n    //             hasVideo: !!hasVideo,\n    //         });\n    //     }),\n    // ),\n    ]);\n  }\n};\n\n/* === Inlined module: services/store.jsx === */\nconst oldSkus = [`${ReactNative.Platform.OS}.camee.gems.min`, `${ReactNative.Platform.OS}.camee.gems.med`, `${ReactNative.Platform.OS}.camee.gems.large`, `${ReactNative.Platform.OS}.camee.gems.big`, `${ReactNative.Platform.OS}.camee.gems.massive`, `${ReactNative.Platform.OS}.camee.gems.giant`];\nconst skus = [`${ReactNative.Platform.OS}.gems.min`, `${ReactNative.Platform.OS}.gems.med`, `${ReactNative.Platform.OS}.gems.large`, `${ReactNative.Platform.OS}.gems.big`, `${ReactNative.Platform.OS}.gems.massive`, `${ReactNative.Platform.OS}.gems.giant`, `${ReactNative.Platform.OS}.gems.mega`, `${ReactNative.Platform.OS}.gems.ultra`];\nconst storeService = {\n  name: 'storeService',\n  init: _async(function () {\n    console.log('[IAP] Service init start', {\n      platform: ReactNative.Platform?.OS,\n      hasIAP: !!IAP,\n      hasInitConnection: !!IAP?.initConnection\n    });\n    if (ReactNative.Platform?.OS === 'web') {\n      console.log('[IAP] Skipping - web platform');\n      return;\n    }\n    if (!IAP) {\n      console.error('[IAP] IAP module not available');\n      return;\n    }\n    if (!IAP.initConnection) {\n      console.error('[IAP] initConnection method not available');\n      return;\n    }\n    IAP.initConnection().then(_async(function () {\n      console.log('[IAP] Connection initialized');\n      return _callIgnored(loadIAPProducts);\n    })).catch(error => {\n      console.error('[IAP] Init connection error:', error?.message || error);\n      State.state.storage.iapError.next(true);\n    });\n    return _await();\n  })\n};\n\n/* === Inlined module: services/video.jsx === */\nconst applyLocalMicrophoneMuted = (stream, muted) => {\n  const nextMuted = muted === true;\n  stream?.getAudioTracks?.().forEach(track => {\n    if (track.readyState !== 'ended') track.enabled = !nextMuted;\n  });\n  State.state.p2p.value?.setMicrophoneMuted?.(nextMuted, stream);\n  syncLocalProducerTrackStates();\n};\nconst videoService = {\n  use() {\n    const [stream, setStream] = Hooks.useBehaviorSubject(State.state.stream);\n    const [mute] = Hooks.useBehaviorSubject(State.state.mute);\n    React.useEffect(() => {\n      State.state.headers.next({\n        ...State.state.headers.value,\n        hasVideo: stream != null\n      });\n    }, [stream]);\n    React.useEffect(() => {\n      applyLocalMicrophoneMuted(stream, mute);\n    }, [stream, mute]);\n\n    // React.useEffect(() => {\n    //   const id = State.requestPip();\n    //   return () => {\n    //     State.releasePip(id);\n    //   };\n    // }, []);\n  }\n};\n\n/* === Inlined module: services/check/index.jsx === */\nconst p2pCalls = new Map();\nlet checkSignalQueue = [];\nconst getCheckData = _async(function () {\n  return {\n    callData: State.state.call.value ?? null\n  };\n});\nconst checkNotify = _async(function (peer) {\n  if (!peer?.data?.key) {\n    return;\n  }\n  const _State = State,\n    _emitSocket = _State.emitSocket,\n    _peer$data$sessionId = peer.data.sessionId,\n    _peer$data$key = peer.data.key;\n  return _call(getCheckData, function (_getCheckData) {\n    _emitSocket.call(_State, 'check', {\n      key: _peer$data$key,\n      sessionId: _peer$data$sessionId,\n      type: 'call',\n      ..._getCheckData\n    });\n  });\n});\nconst checkCloseP2P = _async(function (peer) {\n  const key = peer?.data?.key;\n  if (!key || !p2pCalls.has(key)) {\n    return;\n  }\n  const target = p2pCalls.get(key);\n  p2pCalls.delete(key);\n  return _continueIgnored(_catch(function () {\n    return _awaitIgnored(target?.peer?.close?.());\n  }, function (error) {\n    console.error('[check] checkCloseP2P error', error);\n  }));\n});\nconst checkOnP2PConnectionState = _async(function (peer, connectionState) {\n  let _exit35 = false;\n  return _invoke(function () {\n    if (connectionState === 'connected') {\n      return _await(checkNotify(peer), function () {\n        _exit35 = true;\n      });\n    }\n  }, function (_result44) {\n    return _exit35 ? _result44 : _invokeIgnored(function () {\n      if (connectionState === 'failed' || connectionState === 'disconnected' || connectionState === 'closed') {\n        return _awaitIgnored(checkCloseP2P(peer));\n      }\n    });\n  });\n});\nconst checkOnSignalPeer = data => {\n  const key = data?.key;\n  const peer = key ? p2pCalls.get(key) : null;\n  if (!peer) {\n    return false;\n  }\n  peer.peer?.onSignalQueue?.(data?.value);\n  return true;\n};\nconst checkOnSignalQueue = _async(function (data) {\n  let processed = false;\n  processed = processed || checkOnSignalPeer(data);\n  if (!processed) {\n    checkSignalQueue.push(data);\n  }\n  return processed;\n});\nconst checkUnqueueSignals = _async(function () {\n  const oldQueue = checkSignalQueue;\n  checkSignalQueue = [];\n  for (const data of oldQueue) {\n    checkOnSignalQueue(data);\n  }\n  return _await();\n});\nconst checkConnect = _async(function (data) {\n  const key = data?.key;\n  if (!key) {\n    return;\n  }\n  const Call2P2 = manifest()?.call?.Call2P2;\n  if (!Call2P2) {\n    console.warn('[check] Call2P2 is not available');\n    return;\n  }\n  const existing = p2pCalls.get(key);\n  return _invoke(function () {\n    if (existing) {\n      return _awaitIgnored(checkCloseP2P(existing));\n    }\n  }, function () {\n    const iceServers = State.state.session.value?.servers ?? [];\n    const callP2P = new Call2P2({\n      key,\n      initiator: data?.initiator === true,\n      iceServers,\n      getStream: _async(function () {\n        return State.state.stream.value;\n      }),\n      requireMedia: false\n    });\n    const peer = {\n      id: key,\n      peer: callP2P,\n      data\n    };\n    p2pCalls.set(key, peer);\n    callP2P.emit = _async(function (value) {\n      State.emitSocket('signal-check', {\n        value,\n        key: peer.data?.key,\n        sessionId: peer.data?.sessionId\n      });\n      return _await();\n    });\n    callP2P.onConnectionState = connectionState => checkOnP2PConnectionState(peer, connectionState);\n    callP2P.onRecall = _async(function () {\n      return _awaitIgnored(checkCloseP2P(peer));\n    });\n    return _await(callP2P.init(), function () {\n      return _await(callP2P.start(), function () {\n        return _callIgnored(checkUnqueueSignals);\n      });\n    });\n  });\n});\nconst checkOnCallCheck = _async(function (value) {\n  return _awaitIgnored(checkConnect(value));\n});\nconst checkService = {\n  use() {\n    State.useSocket('call-check', checkOnCallCheck);\n    State.useSocket('signal-check', checkOnSignalQueue);\n    State.useSocket('notification', _async(function (data) {\n      Notification.showNotification(data);\n      return _await();\n    }));\n    State.useSocket('reload', _async(function () {\n      let _exit36 = false;\n      return _invoke(function () {\n        if (Updates?.reloadAsync) {\n          return _await(Updates.reloadAsync(), function () {\n            _exit36 = true;\n          });\n        }\n      }, function (_result45) {\n        if (_exit36) return _result45;\n        if (typeof globalThis?.location?.reload === 'function') {\n          globalThis.location.reload();\n        }\n      });\n    }));\n    State.useSocket('logout', _async(function () {\n      return _awaitIgnored(State.logout?.());\n    }));\n    State.useSocket('force-stop', _async(function () {\n      return _awaitIgnored(manifest()?.call?.onStop?.());\n    }));\n\n    // Открыть у пользователя модалку карточки профиля (бэк шлёт meta по сокету showProfileCard)\n    State.useSocket('showProfileCard', meta => {\n      if (!meta || !meta.user?.id) {\n        console.warn('[check] showProfileCard: invalid meta', meta);\n        return;\n      }\n      Sheet.showSheet(React.createElement(ModuleComponent, {\n        name: 'cardModal',\n        meta,\n        source: 'socket_show_profile_card'\n      }), {\n        props: {\n          swipeUp: true,\n          swipeDismissibleUp: true,\n          swipeDismissibleDown: true,\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden'\n          }\n        }\n      });\n    });\n  },\n  subs() {\n    return Rx.combineLatest([State.state.stream.pipe(Rx.debounceTime(500), Rx.tap(_async(function (stream) {\n      if (!stream) {\n        return;\n      }\n      return _continueIgnored(_forOf(p2pCalls.values(), function (peer) {\n        return _continueIgnored(_catch(function () {\n          return _awaitIgnored(peer.peer?.switchStream?.(stream));\n        }, function (error) {\n          console.error('[check] switchStream error', error);\n        }));\n      }));\n    }))), State.state.call.pipe(Rx.debounceTime(500), Rx.tap(_async(function () {\n      return _continueIgnored(_forOf(p2pCalls.values(), function (peer) {\n        return _awaitIgnored(checkNotify(peer));\n      }));\n    })))]);\n  }\n};\n\n/* === Inlined module: services/push.jsx === */\nconst waitPushNavigation = _async(function () {\n  return _await(State.onUrlInited?.promise, function () {\n    return _await(Navigation.navigationCompleter?.promise, function () {\n      return _awaitIgnored(new Promise(r => setTimeout(r, 750)));\n    });\n  });\n});\nconst onPush = _async(function (data) {\n  return _invokeIgnored(function () {\n    if (data?.page) {\n      // State._initialRoute = { name: \"Profile\" };\n      return _call(waitPushNavigation, function () {\n        const params = (typeof data?.params === 'string' ? JSON.parse(data?.params) : data?.params) ?? {};\n        Navigation.goto?.({\n          name: data?.page,\n          params: {\n            ...params\n          }\n        });\n      });\n    } else return _invokeIgnored(function () {\n      if (data?.pages) {\n        // State._initialRoute = { name: \"Profile\" };\n        return _call(waitPushNavigation, function () {\n          const pages = typeof data?.pages === 'string' ? JSON.parse(data?.pages) : data?.pages;\n          Navigation.gotoState?.(pages);\n          // if (Navigation.navigationRef.isReady()) {\n          //     Navigation.navigationRef.reset({\n          //         index: pages.length - 1,\n          //         routes: pages,\n          //     });\n          // }\n        });\n      }\n    });\n  });\n});\nconst onPushManifest = _async(function (data, isOpenedApp) {\n  if (!isOpenedApp && State.state.appState.value === 'active') {\n    data.title || data.text;\n    {\n      Notification.showNotification({\n        ...data,\n        style: {\n          width: 400,\n          maxWidth: \"100%\"\n        },\n        duration: data.duration ? Number.parseInt(data.duration, 10) : 5000,\n        closeOnClick: true,\n        onClick: () => onPush(data)\n      });\n    }\n  } else {\n    onPush(data);\n  }\n  return _await();\n});\nconst pushService = {\n  subs() {\n    return Rx.combineLatest([\n    // State.state.session.pipe(\n    //     Rx.map(session => session?.user?.id),\n    //     Rx.distinctUntilChanged(),\n    //     Rx.filter((id) => id != null),\n    //     Rx.debounceTime(5000),\n    //     Rx.tap(() => {\n    //         State.ensurePushPermissions?.();\n    //     }),\n    // ),\n    Rx.combineLatest([State.state.session?.pipe(Rx.map(session => session?.user?.id), Rx.distinctUntilChanged()), State.state.device?.pipe(Rx.map(device => device?.deviceId), Rx.distinctUntilChanged()), State.state.tokenPush?.pipe(Rx.map(tokenPush => tokenPush?.fcm), Rx.distinctUntilChanged())].filter(Boolean)).pipe(Rx.filter(arr => !!arr[0] && !!arr[1] && !!arr[2]), Rx.tap(_async(function ([userId, deviceId, fcm]) {\n      return _continueIgnored(_catch(function () {\n        return _awaitIgnored(State.post('/api/user/push', {\n          userId,\n          deviceId,\n          fcm\n        }, 'json'));\n      }, function (error) {\n        console.error(error);\n      }));\n    })))]);\n  }\n};\n\n/* === Inlined module: services/timezone.jsx === */\nconst update = _async(function (timezone) {\n  return _invokeIgnored(function () {\n    if (State.state.session?.value?.card?.userId != null) {\n      return _continueIgnored(_catch(function () {\n        return _awaitIgnored(State.post('/api/login/profile', {\n          timezone\n        }));\n      }, function (error) {\n        console.error('[timezoneService] update error:', error);\n      }));\n    }\n  });\n});\nconst checkAndSync = _async(function (sessionTimezone, currentTimezone) {\n  return _invokeIgnored(function () {\n    if (sessionTimezone == null || String(sessionTimezone) !== String(currentTimezone)) {\n      return _awaitIgnored(update(currentTimezone));\n    }\n  });\n});\nconst timezoneService = {\n  subs() {\n    const currentTimezone = new Date().getTimezoneOffset() * -60; // seconds\n\n    return State.state.session.pipe(Rx.map(session => session?.card?.timezone), Rx.distinctUntilChanged(), Rx.tap(card => {\n      checkAndSync(card?.timezone, currentTimezone);\n    }));\n  }\n};\n\n/* === Inlined module: services/unreadCounter.jsx === */\nconst getUnreadCountStore = () => {\n  return State.store.chatUnreadCountStore;\n};\nconst getUnreadCountState = () => {\n  return State.store.chatUnreadCountState;\n};\nconst setGetUnreadCount = chatId => {\n  const store = getUnreadCountStore();\n  const state = getUnreadCountState();\n  const storeGet = store.value?.[chatId];\n  const stateGet = state.value?.[chatId];\n  const storeSet = value => {\n    store.next({\n      ...(store.value ?? {}),\n      [chatId]: value\n    });\n  };\n  const stateSet = value => {\n    state.next({\n      ...(state.value ?? {}),\n      [chatId]: value\n    });\n  };\n  return {\n    storeGet,\n    stateGet,\n    storeSet,\n    stateSet\n  };\n};\nconst fetchChatUnreadBadge = _async(function () {\n  if (State.api?.guest?.isGuestOrEmptySession?.()) {\n    return;\n  }\n  return _continueIgnored(_catch(function () {\n    return _await(State.post(`/api/chat/camee-chat/messages/unread`, {}, 'json'), function (res) {\n      const store = getUnreadCountStore();\n      const state = getUnreadCountState();\n      state.next({\n        ...res\n      });\n      store.next({\n        ...res\n      });\n    });\n  }, function (error) {\n    console.error(error);\n  }));\n});\nconst clampBadge = n => Math.min(99, Math.max(0, Number(n) || 0));\nlet scheduled = null;\nconst scheduleBadgeRefresh = (delayMs = 350) => {\n  try {\n    if (scheduled) clearTimeout(scheduled);\n    scheduled = setTimeout(() => {\n      scheduled = null;\n      const userId = State.state.session?.value?.user?.id;\n      if (userId != null) fetchChatUnreadBadge();\n    }, Math.max(0, Number(delayMs) || 0));\n  } catch (_) {}\n};\nfunction addChatCounter(chatId, num = 1) {\n  const store = getUnreadCountStore();\n  const state = getUnreadCountState();\n  const count = (state.value?.[chatId] ?? store.value?.[chatId]) || 0;\n  state.next({\n    ...(state.value ?? {}),\n    [chatId]: Math.max(0, count + num)\n  });\n  store.next({\n    ...(store.value ?? {}),\n    [chatId]: Math.max(0, count + num)\n  });\n}\nfunction subChatCounter(chatId, num = 1) {\n  const store = getUnreadCountStore();\n  const state = getUnreadCountState();\n  const count = (state.value?.[chatId] ?? store.value?.[chatId]) || 0;\n  state.next({\n    ...(state.value ?? {}),\n    [chatId]: Math.max(0, count - num)\n  });\n  store.next({\n    ...(store.value ?? {}),\n    [chatId]: Math.max(0, count - num)\n  });\n}\nconst MARK_READ_PAGE_SIZE = 100;\nconst isLoadingMarkReadMap = new Set();\nconst unreadCounterService = {\n  api: {\n    name: 'unread',\n    update: () => {\n      scheduleBadgeRefresh();\n    },\n    reset: resetChatCounter,\n    add: addChatCounter,\n    sub: subChatCounter,\n    mark: (chatId, messageId) => {\n      const id = `${chatId}::${messageId}`;\n      isLoadingMarkReadMap.add(id);\n      State.bus.markReadMessagesToLoad.next(id);\n    },\n    useCounter: chatId => {\n      const counterStore = Hooks.useBehaviorSubjectMap(getUnreadCountStore(), React.useCallback(dict => dict?.[chatId] || 0, [chatId]));\n      const counterState = Hooks.useBehaviorSubjectMap(getUnreadCountState(), React.useCallback(dict => dict?.[chatId] ?? null, [chatId]));\n      return counterState ?? counterStore;\n    }\n  },\n  use() {\n    State.useSocket('chat:message', data => {\n      const chatId = data?.chatId ?? null;\n      const userId = State.state.session?.value?.user?.id;\n      if (data?.chatId != null && userId !== data?.fromUserId) {\n        addChatCounter(data.chatId);\n      }\n    });\n    State.useSocket('chat:reads', data => {\n      for (const event of data) {\n        const chatId = event?.chatId ?? null;\n        const userId = State.state.session?.value?.user?.id;\n        if (event?.chatId != null && userId === event?.userId) {\n          subChatCounter(event.chatId);\n        }\n      }\n    });\n    State.useSocket('chat:deleted', data => {\n      if (data?.chatId != null) {\n        resetChatCounter(data.chatId);\n      }\n    });\n  },\n  subs() {\n    return Rx.combineLatest([State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.pairwise(), Rx.tap(([prevUserId, nextUserId]) => {\n      if (prevUserId !== nextUserId) {\n        State.state.tabBadges?.next({});\n        const store = getUnreadCountStore();\n        const state = getUnreadCountState();\n        store.next({});\n        state.next({});\n        if (nextUserId != null) {\n          scheduleBadgeRefresh();\n        }\n      }\n    })), getUnreadCountStore().pipe(Rx.tap(_async(function (dict) {\n      const count = Object.keys(dict ?? {}).reduce((c, i) => {\n        return (c || 0) + (dict[i] || 0);\n      }, 0);\n      State.state.tabBadges?.next({\n        ...(State.state.tabBadges.value ?? {}),\n        Chat: clampBadge(count)\n      });\n      return _await();\n    }))), State.state.isConnected.pipe(Rx.distinctUntilChanged(), Rx.filter(Boolean), Rx.tap(() => {\n      scheduleBadgeRefresh();\n    })), State.bus.markReadMessagesToLoad.pipe(Rx.bufferTime(1000, null, MARK_READ_PAGE_SIZE), Rx.filter(ids => ids.length > 0), Rx.tap(_async(function (ids) {\n      ids = [...new Set([...ids])];\n      const groups = ids.map(m => {\n        const [chatId, messageId] = m.split('::');\n        return {\n          chatId,\n          messageId\n        };\n      }).reduce((m, i) => {\n        if (m[i.chatId] == null) m[i.chatId] = [];\n        m[i.chatId].push(i.messageId);\n        return m;\n      }, {});\n      return _continueIgnored(_finallyRethrows(function () {\n        return _catch(function () {\n          return _awaitIgnored(Promise.all(Object.keys(groups).map(chatId => apiMarkMessagesRead(groups[chatId], chatId))));\n        }, function (error) {\n          console.error(error);\n        });\n      }, function (_wasThrown1, _result46) {\n        for (const id of ids) {\n          isLoadingMarkReadMap.delete(id);\n        }\n        return _rethrow(_wasThrown1, _result46);\n      }));\n    })))]);\n  }\n};\n\n/* === Inlined module: services/subs.jsx === */\nconst subscribe = (userId, value) => {\n  State.store.followingMap.next({\n    ...(State.store.followingMap.value ?? {}),\n    [userId]: value\n  });\n  State.store.followingMapStore.next({\n    ...(State.store.followingMapStore.value ?? {}),\n    [userId]: value\n  });\n};\nconst SUB_PAGE_SIZE = 20;\nconst fetchFollowers = _async(function (skip, limit) {\n  return State.api?.guest?.isGuestOrEmptySession?.() ? {\n    items: [],\n    totatl: 0\n  } : _await(State.post(`/api/login/subscription/followers?skip=${skip}&limit=${limit}`), function (response) {\n    const items = (response?.data ?? []).map(item => State.api?.users?.sanitizeMeta?.(item) ?? item);\n    return {\n      items,\n      total: response?.total ?? items.length\n    };\n  });\n});\nconst updateFollowers = _async(function (skip, limit) {\n  if (State.store.followersEnded.value && skip > 0) return;\n  if (State.store.followersLoading.value) return;\n  if (State.store.followersLoadingMore.value) return;\n  if (skip > 0) {\n    State.store.followersLoadingMore.next(true);\n  } else {\n    State.store.followersLoading.next(true);\n  }\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      return _await(fetchFollowers(skip, limit), function ({\n        items,\n        total\n      }) {\n        if (skip > 0) {\n          State.store.followersStore.next({\n            total,\n            items: [...(State.store.followersStore.value?.items ?? []), ...(items ?? [])]\n          });\n        } else {\n          State.store.followersStore.next({\n            total,\n            items: items ?? []\n          });\n        }\n        State.store.followersEnded.next((items?.length ?? 0) < SUB_PAGE_SIZE);\n      });\n    }, function (error) {\n      State.store.followersEnded.next(true);\n      console.error(error);\n    });\n  }, function (_wasThrown10, _result47) {\n    State.store.followersLoading.next(false);\n    State.store.followersLoadingMore.next(false);\n    return _rethrow(_wasThrown10, _result47);\n  }));\n});\nconst fetchFollowings = _async(function (skip, limit) {\n  return State.api?.guest?.isGuestOrEmptySession?.() ? {\n    items: [],\n    totatl: 0\n  } : _await(State.post(`/api/login/subscription/following?skip=${skip}&limit=${limit}`), function (response) {\n    const items = (response?.data ?? []).map(item => State.api?.users?.sanitizeMeta?.(item) ?? item);\n    return {\n      items,\n      total: response?.total ?? items.length\n    };\n  });\n});\nconst updateFollowings = _async(function (skip, limit) {\n  if (State.store.followingsEnded.value && skip > 0) return;\n  if (State.store.followingsLoading.value) return;\n  if (State.store.followingsLoadingMore.value) return;\n  if (skip > 0) {\n    State.store.followingsLoadingMore.next(true);\n  } else {\n    State.store.followingsLoading.next(true);\n  }\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      return _await(fetchFollowings(skip, limit), function ({\n        items,\n        total\n      }) {\n        if (skip > 0) {\n          State.store.followingsStore.next({\n            total,\n            items: [...(State.store.followingsStore.value?.items ?? []), ...(items ?? [])]\n          });\n        } else {\n          State.store.followingsStore.next({\n            total,\n            items: items ?? []\n          });\n        }\n        State.store.followingsEnded.next((items?.length ?? 0) < SUB_PAGE_SIZE);\n        for (const item of State.store.followingsStore.value?.items ?? []) {\n          item?.user?.id != null && subscribe(item?.user?.id, true);\n        }\n      });\n    }, function (error) {\n      State.store.followingsEnded.next(true);\n      console.error(error);\n    });\n  }, function (_wasThrown11, _result48) {\n    State.store.followingsLoading.next(false);\n    State.store.followingsLoadingMore.next(false);\n    return _rethrow(_wasThrown11, _result48);\n  }));\n});\nconst fetchNewSubscribersCount = _async(function () {\n  if (State.api?.guest?.isGuestOrEmptySession?.()) {\n    return;\n  }\n  return _continueIgnored(_catch(function () {\n    return _await(State.post('/api/login/subscription/new-subscribers'), function (response) {\n      const count = response?.count ?? 0;\n      State.store.newSubscribersCount.next(count);\n    });\n  }, function (error) {\n    console.error('Failed to fetch new subscribers count', error);\n  }));\n});\nconst markNewSubscribersSeen = _async(function () {\n  if (State.api?.guest?.isGuestOrEmptySession?.()) {\n    return;\n  }\n  return _continueIgnored(_catch(function () {\n    return _await(State.post('/api/login/subscription/new-subscribers/seen', {}, 'string'), function () {\n      State.store.newSubscribersCount.next(0);\n    });\n  }, function (error) {\n    console.error('Failed to mark new subscribers seen', error);\n  }));\n});\nconst isLoadingSubsMap = new Set();\nconst resetSubsState = () => {\n  State.store.followersStore.next({\n    total: 0,\n    items: []\n  });\n  State.store.followingsStore.next({\n    total: 0,\n    items: []\n  });\n  State.store.followersEnded.next(false);\n  State.store.followingsEnded.next(false);\n  State.store.followersLoading.next(false);\n  State.store.followingsLoading.next(false);\n  State.store.followersLoadingMore.next(false);\n  State.store.followingsLoadingMore.next(false);\n  State.store.followersInited.next(false);\n  State.store.followingsInited.next(false);\n  State.store.followingMap.next({});\n  State.store.followingMapStore.next({});\n  State.store.newSubscribersCount.next(0);\n  isLoadingSubsMap.clear();\n};\nconst subService = {\n  api: {\n    name: \"sub\",\n    subscribe,\n    fetchNewSubscribersCount,\n    markNewSubscribersSeen,\n    useNewSubscribersCount: () => {\n      const [count] = Hooks.useBehaviorSubject(State.store.newSubscribersCount);\n      return count ?? 0;\n    },\n    updateFollowers,\n    update: _async(function () {\n      State.store.followersEnded.next(false);\n      State.store.followingsEnded.next(false);\n      return _awaitIgnored(Promise.all([updateFollowers(0, SUB_PAGE_SIZE), updateFollowings(0, SUB_PAGE_SIZE)]));\n    }),\n    moreFollowers: _async(function () {\n      return _awaitIgnored(updateFollowers(State.store.followersStore.value?.items?.length ?? 0, SUB_PAGE_SIZE));\n    }),\n    useFollowers: () => {\n      const [isEnded] = Hooks.useBehaviorSubject(State.store.followersEnded);\n      const [isLoading] = Hooks.useBehaviorSubject(State.store.followersLoading);\n      const [isLoadingMore] = Hooks.useBehaviorSubject(State.store.followersLoadingMore);\n      const [data] = Hooks.useBehaviorSubject(State.store.followersStore);\n      const items = React.useMemo(() => data?.items ?? [], [data?.items]);\n      React.useEffect(() => {\n        if (!State.store.followersInited.value || !State.store.followersStore.value?.items?.length) {\n          State.store.followersLoading.next(null);\n          State.store.followersInited.next(true);\n          State.store.followersEnded.next(false);\n          updateFollowers(0, SUB_PAGE_SIZE);\n        }\n      }, []);\n      return [items, data?.total ?? 0, isLoading ?? true, isLoadingMore, isEnded];\n    },\n    updateFollowings,\n    moreFollowings: _async(function () {\n      return _awaitIgnored(updateFollowings(State.store.followingsStore.value?.items?.length ?? 0, SUB_PAGE_SIZE));\n    }),\n    useFollowings: () => {\n      const [isEnded] = Hooks.useBehaviorSubject(State.store.followingsEnded);\n      const [isLoading] = Hooks.useBehaviorSubject(State.store.followingsLoading);\n      const [isLoadingMore] = Hooks.useBehaviorSubject(State.store.followingsLoadingMore);\n      const [data] = Hooks.useBehaviorSubject(State.store.followingsStore);\n      const items = React.useMemo(() => data?.items ?? [], [data?.items]);\n      React.useEffect(() => {\n        if (!State.store.followingsInited.value || !State.store.followingsStore.value?.items?.length) {\n          State.store.followingsLoading.next(null);\n          State.store.followingsInited.next(true);\n          State.store.followingsEnded.next(false);\n          updateFollowings(0, SUB_PAGE_SIZE);\n        }\n      }, []);\n      return [items, data?.total ?? 0, isLoading ?? true, isLoadingMore, isEnded];\n    },\n    useSubscription: userId => {\n      const [isSubscribing, setIsSubscribing] = React.useState(false);\n      const isSubscribingRef = React.useRef(false);\n      const isSubscribedLoaded = Hooks.useBehaviorSubjectMap(State.store.followingMap, React.useCallback(m => m?.[userId] != null, [userId]));\n      const isSubscribed = Hooks.useBehaviorSubjectMap(State.store.followingMapStore, React.useCallback(m => m?.[userId], [userId]));\n      const setIsSubscribed = React.useCallback(value => {\n        subscribe(userId, value);\n      }, [userId]);\n      React.useEffect(() => {\n        if (State.store.followingMap.value?.[userId] == null && !isLoadingSubsMap.has(userId)) {\n          isLoadingSubsMap.add(userId);\n          State.bus.followingsIdsToLoad.next(userId);\n        }\n      }, [userId]);\n      const setIsSubscribedApi = React.useCallback(_async(function (value, source) {\n        if (isSubscribingRef.value) return;\n        const analyticsSource = source ?? 'profile_page';\n        const shouldUnsubscribe = !!isSubscribed;\n        const analytics = {\n          ...Analytics.getGlobalParams(),\n          analytics_event: 'user_subscribe_toggled',\n          action: shouldUnsubscribe ? 'unsubscribe' : 'subscribe',\n          surface: analyticsSource\n        };\n        return _continueIgnored(_finallyRethrows(function () {\n          return _catch(function () {\n            isSubscribingRef.value = true;\n            setIsSubscribing(true);\n            setIsSubscribed(!shouldUnsubscribe);\n            return _invokeIgnored(function () {\n              if (shouldUnsubscribe) {\n                return _await(State.post('/api/login/subscription/remove', {\n                  friendId: userId\n                }, 'string', undefined, undefined, {\n                  analytics\n                }), function () {\n                  const updatedItems = State.store.followingsStore.value.items?.filter(item => {\n                    const id = item?.user?.id ?? item?.userId ?? item?.id;\n                    return id === userId ? false : true;\n                  });\n                  State.store.followingsStore.next({\n                    ...State.store.followingsStore.value,\n                    items: updatedItems\n                  });\n                });\n              } else {\n                return _await(State.post('/api/login/subscription/add', {\n                  friendId: userId\n                }, 'string', undefined, undefined, {\n                  analytics\n                }), function () {\n                  return _await(State.api?.users?.loadUser?.(userId), function (user) {\n                    const currentItems = State.store.followingsStore.value?.items ?? [];\n                    const exists = currentItems.some(item => {\n                      const id = item?.user?.id ?? item?.userId ?? item?.id;\n                      return id === userId;\n                    });\n                    if (user && !exists) {\n                      State.store.followingsStore.next({\n                        ...State.store.followingsStore.value,\n                        items: [user, ...currentItems]\n                      });\n                    }\n                  });\n                });\n              }\n            });\n          }, function (error) {\n            console.error(error);\n            setIsSubscribed(shouldUnsubscribe);\n          });\n        }, function (_wasThrown12, _result49) {\n          isSubscribingRef.value = false;\n          setIsSubscribing(false);\n          return _rethrow(_wasThrown12, _result49);\n        }));\n      }), [userId, isSubscribed, setIsSubscribed, isSubscribingRef]);\n      return [isSubscribedLoaded ? isSubscribed : null, setIsSubscribedApi, setIsSubscribed, isSubscribing];\n    }\n  },\n  use() {\n    State.useSocket('subscriptionChanged', event => {\n      const userId = event?.friendId ?? event?.userId;\n      if (!State.store.followingsStore.value || !userId) return;\n      const updatedItems = State.store.followingsStore.value.items?.filter(item => {\n        const id = item?.user?.id ?? item?.userId ?? item?.id;\n        return id === userId ? event.isSubscribed : true;\n      });\n      subscribe(userId, event.isSubscribed);\n      State.store.followingsStore.next({\n        ...State.store.followingsStore.value,\n        items: updatedItems\n      });\n    });\n    State.useSocket('subscriberChanged', event => {\n      const userId = event?.friendId ?? event?.userId;\n      if (!State.store.followersStore.value || !userId) return;\n      const updatedItems = State.store.followersStore.value.items?.filter(item => {\n        const id = item?.user?.id ?? item?.userId ?? item?.id;\n        return id === userId ? event.isSubscribed : true;\n      });\n      State.store.followersStore.next({\n        ...State.store.followersStore.value,\n        items: updatedItems\n      });\n      if (event.isSubscribed) {\n        State.bus.newSubscriberEvent.next(userId);\n      }\n    });\n  },\n  init: function () {\n    fetchNewSubscribersCount();\n    return _await();\n  },\n  subs: () => {\n    return Rx.combineLatest([State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(() => {\n      // Clear stale subscriptions/followers when auth user changes\n      resetSubsState();\n    })), State.bus.followingsIdsToLoad.pipe(Rx.bufferTime(1000, null, SUB_PAGE_SIZE), Rx.filter(ids => ids.length > 0), Rx.tap(_async(function (ids) {\n      if (State.api?.guest?.isGuestOrEmptySession?.()) {\n        return;\n      }\n      ids = [...new Set([...ids])];\n      return _continueIgnored(_finallyRethrows(function () {\n        return _catch(function () {\n          return _await(State.post('/api/login/subscription/following/get', {\n            friendIds: ids\n          }, 'json'), function (result) {\n            for (const item of ids) {\n              subscribe(item, result?.includes(item));\n            }\n          });\n        }, function (error) {\n          console.error(error);\n        });\n      }, function (_wasThrown13, _result50) {\n        for (const item of ids) {\n          isLoadingSubsMap.delete(item);\n        }\n        return _rethrow(_wasThrown13, _result50);\n      }));\n    }))), State.bus.newSubscriberEvent.pipe(Rx.bufferTime(2000, null, 50), Rx.filter(ids => ids.length > 0), Rx.tap(ids => {\n      ids = [...new Set([...ids])];\n      const current = State.store.newSubscribersCount.value ?? 0;\n      State.store.newSubscribersCount.next(current + ids.length);\n    }))]);\n  }\n};\n\n/* === Inlined module: services/feed.jsx === */\nconst FEED_PAGE_SIZE = 20;\nconst fetchOnline = _async(function (limit = FEED_PAGE_SIZE, exceptIds = []) {\n  return _await(State.post(`/api/feed/online`, {\n    exceptIds,\n    limit\n  }, \"json\"), function (response) {\n    const items = response?.data ?? [];\n    return {\n      items: response?.data || [],\n      total: response?.total ?? items?.length ?? 0\n    };\n  });\n});\nconst updateOnline = _async(function (limit = FEED_PAGE_SIZE, exceptIds = []) {\n  if (State.store.onlineEnded.value && exceptIds?.length > 0) return;\n  if (State.store.onlineLoading.value) return;\n  if (State.store.onlineLoadingMore.value) return;\n  if (exceptIds?.length > 0) {\n    State.store.onlineLoadingMore.next(true);\n  } else {\n    State.store.onlineLoading.next(true);\n  }\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      return _await(fetchOnline(limit, exceptIds), function ({\n        items,\n        total\n      }) {\n        if (exceptIds?.length > 0) {\n          State.store.onlineStore.next({\n            total,\n            items: [...(State.store.onlineStore.value?.items ?? []), ...(items ?? [])]\n          });\n        } else {\n          State.store.onlineStore.next({\n            total,\n            items: items ?? []\n          });\n        }\n        for (let meta of items) {\n          State.api?.online?.setOnline?.(meta?.user?.id ?? meta?.userId ?? meta?.id ?? null, true);\n        }\n        State.store.onlineEnded.next((items?.length ?? 0) < FEED_PAGE_SIZE);\n      });\n    }, function (error) {\n      State.store.onlineEnded.next(true);\n      console.error(error);\n    });\n  }, function (_wasThrown14, _result51) {\n    State.store.onlineLoading.next(false);\n    State.store.onlineLoadingMore.next(false);\n    return _rethrow(_wasThrown14, _result51);\n  }));\n});\nconst fetchRegular = _async(function (skip, limit) {\n  return _await(State.post(`/api/feed/regular?skip=${skip}&limit=${limit}`), function (response) {\n    const items = response?.data ?? [];\n    return {\n      items,\n      total: response?.total ?? items.length\n    };\n  });\n});\nconst updateRegular = _async(function (skip, limit) {\n  if (State.store.regularEnded.value && skip > 0) return;\n  if (State.store.regularLoading.value) return;\n  if (State.store.regularLoadingMore.value) return;\n  if (skip > 0) {\n    State.store.regularLoadingMore.next(true);\n  } else {\n    State.store.regularLoading.next(true);\n  }\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      return _await(fetchRegular(skip, limit), function ({\n        items,\n        total\n      }) {\n        if (skip > 0) {\n          State.store.regularStore.next({\n            total,\n            items: [...(State.store.regularStore.value?.items ?? []), ...(items ?? [])]\n          });\n        } else {\n          State.store.regularStore.next({\n            total,\n            items: items ?? []\n          });\n        }\n        State.store.regularEnded.next((items?.length ?? 0) < FEED_PAGE_SIZE);\n      });\n    }, function (error) {\n      State.store.regularEnded.next(true);\n      console.error(error);\n    });\n  }, function (_wasThrown15, _result52) {\n    State.store.regularLoading.next(false);\n    State.store.regularLoadingMore.next(false);\n    return _rethrow(_wasThrown15, _result52);\n  }));\n});\nconst feedService = {\n  api: {\n    name: \"feed\",\n    updateOnline,\n    update: _async(function () {\n      State.store.onlineEnded.next(false);\n      State.store.regularEnded.next(false);\n      return _awaitIgnored(Promise.all([updateOnline(FEED_PAGE_SIZE, []), updateRegular(0, FEED_PAGE_SIZE)]));\n    }),\n    moreOnline: _async(function () {\n      const ids = State.store.onlineStore.value?.items?.map(item => item?.user?.id)?.filter(Boolean) ?? [];\n      return _awaitIgnored(updateOnline(FEED_PAGE_SIZE, ids));\n    }),\n    useOnline: () => {\n      const [isEnded] = Hooks.useBehaviorSubject(State.store.onlineEnded);\n      const [isLoading] = Hooks.useBehaviorSubject(State.store.onlineLoading);\n      const [isLoadingMore] = Hooks.useBehaviorSubject(State.store.onlineLoadingMore);\n      const [data] = Hooks.useBehaviorSubject(State.store.onlineStore);\n      const items = React.useMemo(() => data?.items ?? [], [data?.items]);\n      React.useEffect(() => {\n        State.store.onlineLoading.next(null);\n        State.store.onlineEnded.next(false);\n        updateOnline(FEED_PAGE_SIZE, []);\n      }, []);\n      return [items, data?.total ?? 0, isLoading ?? true, isLoadingMore, isEnded];\n    },\n    updateRegular,\n    moreRegular: _async(function () {\n      return _awaitIgnored(updateRegular(State.store.regularStore.value?.items?.length ?? 0, FEED_PAGE_SIZE));\n    }),\n    useRegular: () => {\n      const [isEnded] = Hooks.useBehaviorSubject(State.store.regularEnded);\n      const [isLoading] = Hooks.useBehaviorSubject(State.store.regularLoading);\n      const [isLoadingMore] = Hooks.useBehaviorSubject(State.store.regularLoadingMore);\n      const [data] = Hooks.useBehaviorSubject(State.store.regularStore);\n      const items = React.useMemo(() => data?.items ?? [], [data?.items]);\n      React.useEffect(() => {\n        if (!State.store.regularInited.value || !State.store.regularStore.value?.items?.length) {\n          State.store.regularLoading.next(null);\n          State.store.regularInited.next(true);\n          State.store.regularEnded.next(false);\n          updateRegular(0, FEED_PAGE_SIZE);\n        }\n      }, []);\n      return [items, data?.total ?? 0, isLoading ?? true, isLoadingMore, isEnded];\n    }\n  }\n};\n\n/* === Inlined module: services/streamChat.jsx === */\nconst STREAM_CHAT_HISTORY_ENDPOINT = '/api/stream-chat/history';\nconst STREAM_CHAT_MESSAGE_ENDPOINT = '/api/stream-chat/message';\nconst STREAM_CHAT_EMPTY_STATE = {\n  messages: [],\n  lastSeq: null,\n  loaded: false,\n  loading: false,\n  error: null,\n  mode: null\n};\nconst streamChatHistoryRequests = new Map();\nconst streamChatRoomVersions = new Map();\nconst streamChatGetRoomState = roomId => {\n  const targetRoomId = roomId ?? null;\n  return targetRoomId ? State.store.streamChatRooms.value?.[targetRoomId] ?? STREAM_CHAT_EMPTY_STATE : STREAM_CHAT_EMPTY_STATE;\n};\nconst streamChatSetRoomState = (roomId, update) => {\n  const targetRoomId = roomId;\n  const rooms = State.store.streamChatRooms.value ?? {};\n  const current = rooms[targetRoomId] ?? STREAM_CHAT_EMPTY_STATE;\n  State.store.streamChatRooms.next({\n    ...rooms,\n    [targetRoomId]: update(current)\n  });\n};\nconst streamChatMergeMessages = (current, incoming) => {\n  const ids = new Set();\n  const sequences = new Set();\n  const messages = [];\n  let currentIndex = 0;\n  let incomingIndex = 0;\n  while (currentIndex < current.length || incomingIndex < incoming.length) {\n    const currentMessage = current[currentIndex];\n    const incomingMessage = incoming[incomingIndex];\n    const takeCurrent = incomingMessage == null || currentMessage != null && currentMessage.seq <= incomingMessage.seq;\n    const message = takeCurrent ? currentMessage : incomingMessage;\n    if (takeCurrent) currentIndex += 1;else incomingIndex += 1;\n    if (!message?.id || !Number.isFinite(message.seq)) continue;\n    const id = message.id;\n    const seq = message.seq;\n    if (ids.has(id) || sequences.has(seq)) continue;\n    ids.add(id);\n    sequences.add(seq);\n    messages.push(message);\n  }\n  return messages;\n};\nconst streamChatAddMessage = message => {\n  if (!message?.roomId) return;\n  streamChatSetRoomState(message.roomId, current => {\n    const messages = streamChatMergeMessages(current.messages ?? [], [message]);\n    const newest = messages[messages.length - 1];\n    return {\n      ...current,\n      messages,\n      lastSeq: newest?.seq ?? current.lastSeq\n    };\n  });\n};\nconst streamChatSendMessage = _async(function (roomId, text) {\n  return _await(State.post(STREAM_CHAT_MESSAGE_ENDPOINT, {\n    roomId,\n    text: text.trim(),\n    clientMessageId: UUID.v4()\n  }), function (message) {\n    streamChatAddMessage(message);\n    return message;\n  });\n});\nconst streamChatLoadHistory = (roomId, {\n  recover = false\n} = {}) => {\n  const targetRoomId = roomId ?? '';\n  if (!targetRoomId) return Promise.resolve(STREAM_CHAT_EMPTY_STATE);\n  const pending = streamChatHistoryRequests.get(targetRoomId);\n  if (pending) return pending;\n  const current = streamChatGetRoomState(targetRoomId);\n  const afterSeq = recover ? current.lastSeq : null;\n  const version = streamChatRoomVersions.get(targetRoomId) ?? 0;\n  const query = new URLSearchParams({\n    roomId: targetRoomId\n  });\n  if (afterSeq != null) query.set('afterSeq', String(afterSeq));\n  streamChatSetRoomState(targetRoomId, state => ({\n    ...state,\n    loading: true,\n    error: null\n  }));\n  const request = State.get(`${STREAM_CHAT_HISTORY_ENDPOINT}?${query}`, 'json').then(response => {\n    if ((streamChatRoomVersions.get(targetRoomId) ?? 0) !== version) {\n      return streamChatGetRoomState(targetRoomId);\n    }\n    const received = Array.isArray(response?.messages) ? response.messages : [];\n    const responseLastSeq = response?.lastSeq ?? null;\n    streamChatSetRoomState(targetRoomId, state => {\n      const messages = response?.mode === 'delta' ? streamChatMergeMessages(state.messages ?? [], received) : streamChatMergeMessages(received, (state.messages ?? []).filter(message => responseLastSeq == null || message.seq > responseLastSeq));\n      const newest = messages[messages.length - 1];\n      return {\n        messages,\n        lastSeq: Math.max(responseLastSeq ?? 0, newest?.seq ?? 0) || null,\n        loaded: true,\n        loading: false,\n        error: null,\n        mode: response?.mode === 'delta' ? 'delta' : 'snapshot'\n      };\n    });\n    return streamChatGetRoomState(targetRoomId);\n  }).catch(error => {\n    if ((streamChatRoomVersions.get(targetRoomId) ?? 0) !== version) {\n      return streamChatGetRoomState(targetRoomId);\n    }\n    console.error('[streamChat] history request failed', {\n      roomId: targetRoomId,\n      error: error?.message ?? error\n    });\n    streamChatSetRoomState(targetRoomId, state => ({\n      ...state,\n      loading: false,\n      error: error?.message ?? 'history-failed'\n    }));\n    return streamChatGetRoomState(targetRoomId);\n  }).finally(() => {\n    if (streamChatHistoryRequests.get(targetRoomId) === request) {\n      streamChatHistoryRequests.delete(targetRoomId);\n    }\n  });\n  streamChatHistoryRequests.set(targetRoomId, request);\n  return request;\n};\nconst streamChatReset = roomId => {\n  if (roomId == null) {\n    for (const targetRoomId of streamChatHistoryRequests.keys()) {\n      streamChatRoomVersions.set(targetRoomId, (streamChatRoomVersions.get(targetRoomId) ?? 0) + 1);\n    }\n    streamChatHistoryRequests.clear();\n    State.store.streamChatRooms.next({});\n    return;\n  }\n  const targetRoomId = roomId;\n  if (streamChatHistoryRequests.has(targetRoomId)) {\n    streamChatRoomVersions.set(targetRoomId, (streamChatRoomVersions.get(targetRoomId) ?? 0) + 1);\n    streamChatHistoryRequests.delete(targetRoomId);\n  }\n  const rooms = {\n    ...(State.store.streamChatRooms.value ?? {})\n  };\n  delete rooms[targetRoomId];\n  State.store.streamChatRooms.next(rooms);\n};\nconst streamChatService = {\n  api: {\n    name: 'streamChat',\n    addMessage: streamChatAddMessage,\n    getRoomState: streamChatGetRoomState,\n    loadHistory: streamChatLoadHistory,\n    recoverHistory: roomId => streamChatLoadHistory(roomId, {\n      recover: true\n    }),\n    reset: streamChatReset,\n    sendMessage: streamChatSendMessage,\n    useRoom(roomId) {\n      const targetRoomId = roomId ?? null;\n      const [rooms] = Hooks.useBehaviorSubject(State.store.streamChatRooms);\n      const state = targetRoomId ? rooms?.[targetRoomId] ?? STREAM_CHAT_EMPTY_STATE : STREAM_CHAT_EMPTY_STATE;\n      React.useEffect(() => {\n        if (targetRoomId && !state.loaded && !state.loading && !state.error) {\n          streamChatLoadHistory(targetRoomId);\n        }\n      }, [targetRoomId, state.loaded, state.loading, state.error]);\n      return state;\n    }\n  },\n  init() {\n    if (State.store.streamChatRooms.value == null) {\n      State.store.streamChatRooms.next({});\n    }\n  },\n  subs() {\n    return State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.pairwise(), Rx.tap(() => streamChatReset()));\n  }\n};\n\n/* === Inlined module: services/liveViewer.jsx === */\nconst LIVE_VIEWER_EVENTS_ENDPOINT = '/api/live-gateway/events';\nconst LIVE_VIEWER_COUNTS_ENDPOINT = '/api/live-gateway/viewers';\nconst LIVE_VIEWER_COUNT_PAGE_SIZE = 100;\nconst LIVE_VIEWER_COUNT_BATCH_MS = 200;\nconst LIVE_VIEWER_COUNT_REFRESH_MS = 15000;\nconst liveViewerGetKickStore = () => {\n  if (!State.store.liveViewerKick) {\n    State.store.liveViewerKick = new Rx.BehaviorSubject(null);\n  }\n  return State.store.liveViewerKick;\n};\nconst liveViewerApplyKick = event => {\n  const roomId = event?.roomId == null ? null : String(event.roomId);\n  if (!roomId) return;\n  liveViewerGetKickStore().next({\n    roomId,\n    kickedAt: event?.kickedAt ?? Date.now()\n  });\n  State.api?.live?.markViewerKicked?.(roomId, event?.kickedAt);\n  if (String(liveViewerRoomId ?? '') === roomId) {\n    liveViewerStopWatching(roomId);\n  }\n};\nconst liveViewerApplyUnkick = event => {\n  const roomId = event?.roomId == null ? null : String(event.roomId);\n  const current = liveViewerGetKickStore().value;\n  if (roomId && String(current?.roomId ?? '') === roomId) {\n    liveViewerGetKickStore().next(null);\n  }\n  if (roomId) {\n    State.api?.live?.clearViewerKick?.(roomId);\n    State.api?.live?.update?.({\n      silent: true,\n      force: true\n    });\n  }\n};\nlet liveViewerRoomId = null;\nlet liveViewerConnection = null;\nlet liveViewerPromise = null;\nlet liveViewerSeq = 0;\nconst liveViewerLoadingCountIds = new Set();\nconst liveViewerEnsureCountState = () => {\n  if (!State.store.liveViewerCountMap) {\n    State.store.liveViewerCountMap = new Rx.BehaviorSubject({});\n  }\n  if (!State.store.liveViewerCountMapStore) {\n    State.store.liveViewerCountMapStore = new Rx.BehaviorSubject({});\n  }\n  if (!State.bus.liveViewerCountIdsToLoad) {\n    State.bus.liveViewerCountIdsToLoad = new Rx.Subject();\n  }\n};\nconst liveViewerToCount = value => {\n  const number = Number(value ?? 0);\n  return Number.isFinite(number) ? Math.max(0, Math.round(number)) : 0;\n};\nconst liveViewerNormalizeParticipantCounts = value => {\n  const owner = liveViewerToCount(value?.owner);\n  const members = liveViewerToCount(value?.members);\n  const guests = liveViewerToCount(value?.guests);\n  return {\n    owner,\n    members,\n    guests,\n    total: owner + members + guests\n  };\n};\nconst liveViewerNormalizeCounts = value => {\n  const users = liveViewerToCount(value?.users);\n  const guests = liveViewerToCount(value?.guests);\n  const hasViewerBreakdown = value != null && typeof value === 'object' && (Object.prototype.hasOwnProperty.call(value, 'users') || Object.prototype.hasOwnProperty.call(value, 'guests'));\n  const total = hasViewerBreakdown ? users + guests : liveViewerToCount(value?.total ?? value?.viewers ?? (typeof value === 'number' ? value : 0));\n  const participants = liveViewerNormalizeParticipantCounts(value?.participants ?? value?.participantCounts);\n  return {\n    users,\n    guests,\n    total,\n    participants\n  };\n};\nconst liveViewerSetCount = (roomId, value) => {\n  if (roomId == null) return;\n  liveViewerEnsureCountState();\n  const targetRoomId = String(roomId);\n  const counts = liveViewerNormalizeCounts(value);\n  State.store.liveViewerCountMap.next({\n    ...(State.store.liveViewerCountMap.value ?? {}),\n    [targetRoomId]: counts\n  });\n  State.store.liveViewerCountMapStore.next({\n    ...(State.store.liveViewerCountMapStore.value ?? {}),\n    [targetRoomId]: counts\n  });\n};\nconst liveViewerQueueCount = roomId => {\n  if (roomId == null) return;\n  liveViewerEnsureCountState();\n  const targetRoomId = String(roomId);\n  if (!targetRoomId || liveViewerLoadingCountIds.has(targetRoomId)) return;\n  liveViewerLoadingCountIds.add(targetRoomId);\n  State.bus.liveViewerCountIdsToLoad.next(targetRoomId);\n};\nconst liveViewerUseCount = roomId => {\n  liveViewerEnsureCountState();\n  const targetRoomId = roomId == null ? null : String(roomId);\n  const isLoaded = Hooks.useBehaviorSubjectMap(State.store.liveViewerCountMap, React.useCallback(map => targetRoomId != null && map?.[targetRoomId] != null, [targetRoomId]));\n  const counts = Hooks.useBehaviorSubjectMap(State.store.liveViewerCountMapStore, React.useCallback(map => targetRoomId == null ? null : map?.[targetRoomId], [targetRoomId]));\n  React.useEffect(() => {\n    if (!targetRoomId) return undefined;\n    liveViewerQueueCount(targetRoomId);\n    const interval = setInterval(() => {\n      liveViewerQueueCount(targetRoomId);\n    }, LIVE_VIEWER_COUNT_REFRESH_MS);\n    return () => clearInterval(interval);\n  }, [targetRoomId]);\n  return [isLoaded ? counts?.total ?? 0 : null, counts];\n};\nconst liveViewerGetRouteStreamId = () => {\n  if (ReactNative.Platform.OS === 'web' && typeof window !== 'undefined') {\n    try {\n      const url = new URL(window.location.href);\n      if (url.pathname === '/live' || url.pathname === '/watch' || url.pathname === '/stream') {\n        return url.searchParams.get('id');\n      }\n    } catch (e) {}\n  }\n  const route = State._initialRoute;\n  if (route?.name === 'Live' && route?.params?.id != null) {\n    return String(route.params.id);\n  }\n  return null;\n};\nconst liveViewerStopWatching = (roomId = null) => {\n  const targetRoomId = roomId != null ? String(roomId) : liveViewerRoomId;\n  if (!targetRoomId) return;\n  if (String(liveViewerRoomId) !== String(targetRoomId)) return;\n  State.api?.live?.onViewerClosed?.(targetRoomId);\n  liveViewerSeq += 1;\n  liveViewerConnection?.close?.();\n  liveViewerConnection = null;\n  liveViewerRoomId = null;\n  liveViewerPromise = null;\n  State.api?.streamChat?.reset?.(targetRoomId);\n};\nconst liveViewerStartWatching = (roomId, source = 'live') => {\n  if (roomId == null) return null;\n  const targetRoomId = String(roomId);\n  if (!targetRoomId) return null;\n  if (liveViewerRoomId && liveViewerRoomId !== targetRoomId) {\n    liveViewerStopWatching(liveViewerRoomId);\n  }\n  if (liveViewerRoomId === targetRoomId && liveViewerPromise) {\n    return liveViewerPromise;\n  }\n  if (liveViewerRoomId === targetRoomId && liveViewerConnection) {\n    return Promise.resolve({\n      ok: true\n    });\n  }\n  const seq = ++liveViewerSeq;\n  liveViewerRoomId = targetRoomId;\n  liveViewerPromise = new Promise(resolve => {\n    let resolved = false;\n    let opened = false;\n    const resolveOnce = result => {\n      if (resolved) return;\n      resolved = true;\n      resolve(result);\n    };\n    try {\n      liveViewerConnection = State.sse(`${LIVE_VIEWER_EVENTS_ENDPOINT}?roomId=${encodeURIComponent(targetRoomId)}`, {\n        retry: Infinity,\n        retryDelayMs: 1000,\n        onOpen: () => {\n          if (seq !== liveViewerSeq) return;\n          const chatState = State.api?.streamChat?.getRoomState?.(targetRoomId);\n          if (opened) {\n            State.api?.streamChat?.recoverHistory?.(targetRoomId);\n          } else if (!chatState?.loaded && !chatState?.loading) {\n            State.api?.streamChat?.loadHistory?.(targetRoomId);\n          }\n          opened = true;\n          State.api?.live?.onViewerOpened?.(targetRoomId);\n        },\n        onEvent: event => {\n          if (seq !== liveViewerSeq) return;\n          if (event?.type === 'chat_message') {\n            const message = event?.data;\n            if (message?.roomId !== targetRoomId) return;\n            const chatState = State.api?.streamChat?.getRoomState?.(targetRoomId);\n            if (chatState?.loaded && chatState.lastSeq != null && message?.seq > chatState.lastSeq + 1) {\n              State.api?.streamChat?.recoverHistory?.(targetRoomId);\n            }\n            State.api?.streamChat?.addMessage?.(message);\n            return;\n          }\n          if (event?.type === 'status') {\n            const viewerCounts = event?.data?.viewerCounts ?? event?.data?.online?.viewerCounts ?? event?.data?.online?.viewers ?? event?.data?.viewers;\n            if (viewerCounts != null) {\n              liveViewerSetCount(targetRoomId, viewerCounts);\n            }\n            State.api?.live?.mergeViewerStatus?.(targetRoomId, event?.data);\n            resolveOnce({\n              ok: true,\n              status: event?.data\n            });\n            return;\n          }\n          if (event?.type === 'failed') {\n            console.warn('[liveViewer] stream events failed', {\n              roomId: targetRoomId,\n              source,\n              error: event?.data?.error\n            });\n            resolveOnce({\n              ok: false,\n              error: event?.data?.error ?? 'failed'\n            });\n            return;\n          }\n          if (event?.type === 'kicked') {\n            liveViewerApplyKick({\n              roomId: targetRoomId,\n              ...event?.data\n            });\n            resolveOnce({\n              ok: false,\n              error: 'stream-viewer-kicked'\n            });\n          }\n        },\n        onError: error => {\n          if (seq !== liveViewerSeq) return;\n          console.warn('[liveViewer] stream events error', {\n            roomId: targetRoomId,\n            source,\n            error: error?.message ?? error\n          });\n          resolveOnce({\n            ok: false,\n            error: error?.message ?? error\n          });\n        },\n        onClose: () => {\n          if (seq !== liveViewerSeq) return;\n          liveViewerConnection = null;\n          liveViewerPromise = null;\n        }\n      });\n    } catch (error) {\n      console.error('[liveViewer] stream events connect failed', {\n        roomId: targetRoomId,\n        source,\n        error: error?.message ?? error\n      });\n      if (seq === liveViewerSeq) {\n        liveViewerConnection = null;\n      }\n      resolveOnce({\n        ok: false,\n        error: error?.message ?? error\n      });\n    }\n  }).finally(() => {\n    if (seq === liveViewerSeq) {\n      liveViewerPromise = null;\n    }\n  });\n  return liveViewerPromise;\n};\nconst liveViewerService = {\n  api: {\n    name: 'liveViewer',\n    startWatching: liveViewerStartWatching,\n    stopWatching: liveViewerStopWatching,\n    getRoomId: () => liveViewerRoomId,\n    setCount: liveViewerSetCount,\n    useCount: liveViewerUseCount\n  },\n  init() {\n    liveViewerEnsureCountState();\n    liveViewerGetKickStore();\n  },\n  use() {\n    State.useSocket('stream:kicked', liveViewerApplyKick);\n    State.useSocket('stream:unkicked', liveViewerApplyUnkick);\n  },\n  subs() {\n    liveViewerEnsureCountState();\n    return Rx.combineLatest([State.state.session.pipe(Rx.map(session => session ? liveViewerGetRouteStreamId() : null), Rx.distinctUntilChanged(), Rx.tap(routeStreamId => {\n      if (routeStreamId) {\n        liveViewerStartWatching(routeStreamId, 'live-session-ready');\n      } else {\n        liveViewerStopWatching();\n      }\n    })), State.bus.liveViewerCountIdsToLoad.pipe(Rx.bufferTime(LIVE_VIEWER_COUNT_BATCH_MS, null, LIVE_VIEWER_COUNT_PAGE_SIZE), Rx.filter(ids => ids.length > 0), Rx.tap(_async(function (ids) {\n      const roomIds = [...new Set(ids.map(id => String(id)))];\n      return _continueIgnored(_finallyRethrows(function () {\n        return _catch(function () {\n          return _await(State.post(LIVE_VIEWER_COUNTS_ENDPOINT, {\n            roomIds\n          }, 'json'), function (result) {\n            const counts = result?.counts ?? {};\n            for (const roomId of roomIds) {\n              liveViewerSetCount(roomId, counts?.[roomId] ?? 0);\n            }\n          });\n        }, function (error) {\n          console.error('[liveViewer] viewer count request failed', error);\n        });\n      }, function (_wasThrown16, _result53) {\n        for (const roomId of roomIds) {\n          liveViewerLoadingCountIds.delete(roomId);\n        }\n        return _rethrow(_wasThrown16, _result53);\n      }));\n    })))]);\n  }\n};\n\n/* === Inlined module: services/live.jsx === */\nconst LIVE_STREAM_PAGE_SIZE = 20;\nconst LIVE_STREAM_ENDPOINT = '/api/room-watcher/streams';\nconst LIVE_COUNTRY_VIEWERS_ENDPOINT = '/api/room-watcher/countries/viewers';\nconst LIVE_OWN_STREAM_ENDPOINT = '/api/room-watcher/my-stream';\nconst LIVE_HLS_SYNC_ENDPOINT = '/api/live-gateway/sync';\nconst LIVE_HLS_READY_POLL_LIMIT = 12;\nconst LIVE_HLS_READY_POLL_DELAY = 1000;\nconst liveEmptyOwnStreamState = (loaded = false) => ({\n  active: false,\n  roomId: null,\n  startedAt: null,\n  viewers: 0,\n  updatedAt: null,\n  loaded\n});\nconst liveGetOwnStreamStore = () => {\n  if (!State.store.liveOwnStream) {\n    State.store.liveOwnStream = new Rx.BehaviorSubject(liveEmptyOwnStreamState());\n  }\n  return State.store.liveOwnStream;\n};\nconst liveNormalizeOwnStream = (value, loaded = true) => ({\n  active: value?.active === true,\n  roomId: value?.active === true && value?.roomId != null ? String(value.roomId) : null,\n  startedAt: value?.active === true && value?.startedAt != null && Number.isFinite(Number(value.startedAt)) ? Number(value.startedAt) : null,\n  viewers: Math.max(0, Number(value?.viewers) || 0),\n  updatedAt: value?.updatedAt != null && Number.isFinite(Number(value.updatedAt)) ? Number(value.updatedAt) : null,\n  loaded\n});\nconst liveApplyOwnStream = (value, loaded = true) => {\n  const store = liveGetOwnStreamStore();\n  const next = liveNormalizeOwnStream(value, loaded);\n  const currentUpdatedAt = Number(store.value?.updatedAt) || 0;\n  const nextUpdatedAt = Number(next.updatedAt) || 0;\n  if (currentUpdatedAt > nextUpdatedAt) return store.value;\n  store.next(next);\n  return next;\n};\nlet liveOwnStreamRequest = null;\nconst liveUpdateOwnStream = _async(function () {\n  const userId = State.state.session.value?.user?.id;\n  if (userId == null) {\n    const empty = liveEmptyOwnStreamState(true);\n    liveGetOwnStreamStore().next(empty);\n    return empty;\n  }\n  if (liveOwnStreamRequest?.userId === String(userId)) {\n    return liveOwnStreamRequest.promise;\n  }\n  const request = {\n    userId: String(userId),\n    promise: null\n  };\n  request.promise = _async(function () {\n    return _finallyRethrows(function () {\n      return _catch(function () {\n        return _await(State.post(LIVE_OWN_STREAM_ENDPOINT, {}, 'json'), function (response) {\n          return String(State.state.session.value?.user?.id ?? '') !== request.userId ? liveGetOwnStreamStore().value : liveApplyOwnStream(response);\n        });\n      }, function (error) {\n        console.error('[live] failed to load own stream state', error);\n        return liveGetOwnStreamStore().value;\n      });\n    }, function (_wasThrown17, _result54) {\n      if (liveOwnStreamRequest === request) liveOwnStreamRequest = null;\n      return _rethrow(_wasThrown17, _result54);\n    });\n  })();\n  liveOwnStreamRequest = request;\n  return request.promise;\n});\nconst liveGetMutedStreamStore = () => {\n  if (!State.store.mutedStream) {\n    State.store.mutedStream = new Rx.BehaviorSubject(false);\n  }\n  return State.store.mutedStream;\n};\nconst liveGetSwipeHintShowsStore = () => {\n  if (!State.store.liveSwipeHintShows) {\n    State.store.liveSwipeHintShows = new Rx.BehaviorSubject(0);\n  }\n  return State.store.liveSwipeHintShows;\n};\nconst liveGetSwipeHintVisibleStore = () => {\n  if (!State.store.liveSwipeHintVisible) {\n    State.store.liveSwipeHintVisible = new Rx.BehaviorSubject(false);\n  }\n  return State.store.liveSwipeHintVisible;\n};\nconst liveShowSwipeHint = () => {\n  liveGetSwipeHintVisibleStore().next(true);\n};\nconst liveHideSwipeHint = (source = 'tap') => {\n  const store = liveGetSwipeHintVisibleStore();\n  if (!store.value) return;\n  store.next(false);\n  State.anals.next({\n    name: 'live_swipe_hint_dismissed',\n    data: {\n      source\n    }\n  });\n};\nconst liveNormalizeCountries = countries => [...new Set((Array.isArray(countries) ? countries : []).map(country => String(country ?? '').trim().toLowerCase()).filter(Boolean))];\nconst liveGetCountriesStore = () => {\n  if (!State.store.liveCountries) {\n    State.store.liveCountries = new Rx.BehaviorSubject([]);\n  }\n  return State.store.liveCountries;\n};\nconst liveGetCountries = () => liveNormalizeCountries(liveGetCountriesStore().value);\nconst liveGetCountryViewersStore = () => {\n  if (!State.store.liveCountryViewers) {\n    State.store.liveCountryViewers = new Rx.BehaviorSubject({\n      countries: {},\n      totalViewers: 0\n    });\n  }\n  return State.store.liveCountryViewers;\n};\nlet liveCountryViewersPromise = null;\nconst liveUpdateCountryViewers = _async(function () {\n  if (liveCountryViewersPromise) {\n    return liveCountryViewersPromise;\n  }\n  const store = liveGetCountryViewersStore();\n  liveCountryViewersPromise = _async(function () {\n    return _finallyRethrows(function () {\n      return _catch(function () {\n        return _await(State.post(LIVE_COUNTRY_VIEWERS_ENDPOINT, {}, 'json'), function (response) {\n          const countries = {};\n          for (const [code, viewers] of Object.entries(response?.countries ?? {})) {\n            const normalizedCode = String(code ?? '').trim().toLowerCase();\n            if (!normalizedCode) continue;\n            countries[normalizedCode] = Math.max(0, Number(viewers) || 0);\n          }\n          for (const item of Array.isArray(response?.items) ? response.items : []) {\n            const normalizedCode = String(item?.country ?? '').trim().toLowerCase();\n            if (!normalizedCode) continue;\n            countries[normalizedCode] = Math.max(0, Number(item?.viewers) || 0);\n          }\n          const nextValue = {\n            countries,\n            totalViewers: Math.max(0, Number(response?.totalViewers) || 0)\n          };\n          store.next(nextValue);\n          return nextValue;\n        });\n      }, function (error) {\n        console.error('[live] failed to load country viewers', error);\n        return store.value;\n      });\n    }, function (_wasThrown18, _result55) {\n      liveCountryViewersPromise = null;\n      return _rethrow(_wasThrown18, _result55);\n    });\n  })();\n  return liveCountryViewersPromise;\n});\nconst liveHlsSyncTimers = new Map();\nconst liveHlsSyncPromises = new Map();\nconst liveHlsBatchSyncPromises = new Map();\nconst liveHlsLastPlayback = new Map();\nlet liveStreamsRequestSeq = 0;\nconst liveViewerKickedStreams = new Map();\nconst liveGetFirstMember = room => {\n  const members = room?.meta?.members;\n  if (Array.isArray(members) && members.length > 0) return members[0];\n  const participants = room?.meta?.participants ?? room?.participants;\n  if (Array.isArray(participants) && participants.length > 0) return participants[0];\n  return null;\n};\nconst liveGetRawItems = response => Array.isArray(response?.items) ? response.items : Array.isArray(response?.data) ? response.data : [];\nconst liveGetRawRoomId = (room, index = 0) => room?.roomId ?? room?.room?.roomId ?? room?.id ?? room?._id ?? null;\nconst liveGetStreamId = (item, index = 0) => {\n  const id = liveGetRawRoomId(item, index);\n  return id == null ? null : String(id);\n};\nconst liveGetStreamStartedAt = item => {\n  const value = Number(item?.streamStartedAt ?? item?.startedAt ?? item?.room?.startedAt);\n  return Number.isFinite(value) && value > 0 ? value : 0;\n};\nconst liveIsViewerKickedStream = item => {\n  const roomId = liveGetStreamId(item);\n  if (!roomId) return false;\n  const kickedAt = Number(liveViewerKickedStreams.get(roomId)) || 0;\n  if (!kickedAt) return false;\n  const streamStartedAt = liveGetStreamStartedAt(item);\n  if (streamStartedAt > kickedAt) {\n    liveViewerKickedStreams.delete(roomId);\n    return false;\n  }\n  return true;\n};\nconst liveMarkViewerKicked = (roomId, kickedAt = Date.now()) => {\n  const targetId = roomId == null ? null : String(roomId);\n  if (!targetId) return;\n  liveViewerKickedStreams.set(targetId, Number(kickedAt) || Date.now());\n  const current = State.store.liveStreams.value ?? {\n    total: 0,\n    items: []\n  };\n  let found = false;\n  const items = (current.items ?? []).map((item, index) => {\n    if (liveGetStreamId(item, index) !== targetId) return item;\n    found = true;\n    return {\n      ...item,\n      ended: true,\n      localEndReason: 'kicked'\n    };\n  });\n  if (!found) {\n    items.unshift({\n      id: targetId,\n      roomId: targetId,\n      routeOnly: true,\n      ended: true,\n      localEndReason: 'kicked'\n    });\n  }\n  State.store.liveStreams.next({\n    ...current,\n    total: Math.max(0, Number(current.total) || items.length),\n    items\n  });\n};\nconst liveClearViewerKick = roomId => {\n  const targetId = roomId == null ? null : String(roomId);\n  if (!targetId) return;\n  liveViewerKickedStreams.delete(targetId);\n};\nconst liveGetItemRoomId = item => item?.roomId ?? item?.room?.roomId ?? item?.id ?? null;\nconst liveGetPlaybackPeers = playback => playback?.peers && typeof playback.peers === 'object' ? playback.peers : {};\nconst liveGetProducerSignature = producers => ({\n  audio: producers?.audio === true,\n  video: producers?.video === true\n});\nconst liveGetPlaybackMetaSignature = playback => ({\n  status: playback?.status ?? null,\n  hlsUrl: playback?.hlsUrl ?? null,\n  error: playback?.error ?? null,\n  producers: liveGetProducerSignature(playback?.producers)\n});\nconst liveGetPlaybackSignature = playback => {\n  if (!playback) return 'null';\n  const peers = liveGetPlaybackPeers(playback);\n  const peerIds = Object.keys(peers).sort();\n  return JSON.stringify({\n    ...liveGetPlaybackMetaSignature(playback),\n    peers: peerIds.map(peerId => [peerId, {\n      sessionId: peers[peerId]?.sessionId ?? null,\n      ...liveGetPlaybackMetaSignature(peers[peerId])\n    }])\n  });\n};\nconst liveGetRouteSignature = route => {\n  if (!route) return 'null';\n  return JSON.stringify({\n    roomId: route?.roomId ?? null,\n    key: route?.key ?? null,\n    server: route?.server ?? null,\n    generation: route?.generation ?? null,\n    createdAt: route?.createdAt ?? null\n  });\n};\nconst liveGetRoomSignature = room => {\n  if (!room) return 'null';\n  try {\n    return JSON.stringify(room);\n  } catch (e) {\n    return String(room?.updatedAt ?? room?.roomId ?? 'room');\n  }\n};\nconst liveIsPlaybackReady = playback => {\n  if (!playback) return false;\n  const peers = Object.values(liveGetPlaybackPeers(playback));\n  if (peers.length > 0) {\n    return peers.every(peer => peer?.status === 'ready');\n  }\n  return playback?.status === 'ready';\n};\nconst liveMakePlaybackOnlyStream = (roomId, playback = null) => {\n  const streamId = String(roomId);\n  return {\n    roomId: streamId,\n    playback,\n    meta: {\n      members: []\n    },\n    routeOnly: true\n  };\n};\nconst liveIsRoomSnapshot = value => value && typeof value === 'object' && (Object.prototype.hasOwnProperty.call(value, 'playback') || Object.prototype.hasOwnProperty.call(value, 'room') || Object.prototype.hasOwnProperty.call(value, 'route') || Object.prototype.hasOwnProperty.call(value, 'snapshotUpdatedAt'));\nconst liveGetSnapshotPlayback = snapshot => liveIsRoomSnapshot(snapshot) ? snapshot?.playback ?? null : snapshot ?? null;\nconst liveGetSnapshotParticipants = snapshot => {\n  const room = liveIsRoomSnapshot(snapshot) ? snapshot?.room : null;\n  const candidates = [room?.meta?.participants, room?.meta?.members, room?.participants];\n  for (const candidate of candidates) {\n    if (Array.isArray(candidate)) return candidate;\n  }\n  return [];\n};\nconst liveGetParticipantCounts = (value, fallbackParticipants = []) => {\n  const counts = value?.participantCounts ?? value?.online?.participantCounts ?? value?.viewerCounts?.participants ?? value?.online?.viewerCounts?.participants;\n  if (counts && typeof counts === 'object') {\n    const owner = Math.max(0, Number(counts?.owner) || 0);\n    const members = Math.max(0, Number(counts?.members) || 0);\n    const guests = Math.max(0, Number(counts?.guests) || 0);\n    return {\n      owner,\n      members,\n      guests,\n      total: owner + members + guests\n    };\n  }\n  let owner = 0;\n  let members = 0;\n  let guests = 0;\n  for (const participant of fallbackParticipants) {\n    const role = String(participant?.role ?? 'member').toLowerCase();\n    if (role === 'viewer') continue;\n    if (role === 'owner') {\n      owner += 1;\n    } else if (role === 'guest') {\n      guests += 1;\n    } else {\n      members += 1;\n    }\n  }\n  return {\n    owner,\n    members,\n    guests,\n    total: owner + members + guests\n  };\n};\nconst liveGetViewerCounts = (value, fallbackTotal = 0) => {\n  const counts = value?.viewerCounts ?? value?.online?.viewerCounts;\n  if (counts && typeof counts === 'object') {\n    const users = Math.max(0, Number(counts?.users) || 0);\n    const guests = Math.max(0, Number(counts?.guests) || 0);\n    return {\n      users,\n      guests,\n      total: users + guests,\n      participants: liveGetParticipantCounts(value)\n    };\n  }\n  const total = Math.max(0, Number(value?.viewers ?? value?.online?.viewers ?? fallbackTotal) || 0);\n  return {\n    users: 0,\n    guests: total,\n    total,\n    participants: liveGetParticipantCounts(value)\n  };\n};\nconst liveIsTerminalRoomSnapshot = snapshot => {\n  if (!liveIsRoomSnapshot(snapshot)) return false;\n  const playback = snapshot?.playback ?? null;\n  const playbackStatus = playback?.status ?? null;\n  const participantCounts = liveGetParticipantCounts(snapshot, liveGetSnapshotParticipants(snapshot));\n  return snapshot?.route == null && snapshot?.room == null && Object.keys(liveGetPlaybackPeers(playback)).length === 0 && participantCounts.total === 0 && (playback == null || playbackStatus === 'disabled' || playbackStatus === 'stopped');\n};\nconst liveGetParticipantId = participant => participant?.id ?? participant?.sessionId ?? participant?.session_id ?? participant?.meta?.sessionId ?? null;\nconst liveCanRetainReadyPlayback = (snapshot, playback) => {\n  if (!liveIsRoomSnapshot(snapshot) || !liveIsPlaybackReady(playback)) return false;\n  const videoParticipantIds = new Set(liveGetSnapshotParticipants(snapshot).filter(participant => participant?.role !== 'viewer' && Array.isArray(participant?.producers) && participant.producers.some(producer => producer?.kind === 'video')).map(liveGetParticipantId).filter(Boolean).map(String));\n  const playbackPeerIds = Object.entries(liveGetPlaybackPeers(playback)).filter(([, peer]) => peer?.producers?.video === true && !!peer?.hlsUrl).map(([peerId, peer]) => String(peer?.sessionId ?? peerId));\n  return playbackPeerIds.length > 0 && playbackPeerIds.every(peerId => videoParticipantIds.has(peerId));\n};\nconst liveResolveSnapshotPlayback = (roomId, snapshot) => {\n  const targetId = String(roomId);\n  const playback = liveGetSnapshotPlayback(snapshot);\n  if (liveIsPlaybackReady(playback)) {\n    liveHlsLastPlayback.set(targetId, playback);\n    return playback;\n  }\n  const retainedPlayback = liveHlsLastPlayback.get(targetId) ?? null;\n  if (liveCanRetainReadyPlayback(snapshot, retainedPlayback)) {\n    return retainedPlayback;\n  }\n  if (liveIsRoomSnapshot(snapshot)) {\n    liveHlsLastPlayback.delete(targetId);\n  }\n  return playback;\n};\nconst liveApplyRoomSnapshotToItem = (roomId, item, snapshot, resolvedPlayback) => {\n  const targetId = String(roomId);\n  const isSnapshot = liveIsRoomSnapshot(snapshot);\n  const playback = resolvedPlayback === undefined ? liveGetSnapshotPlayback(snapshot) : resolvedPlayback;\n  const participants = liveGetSnapshotParticipants(snapshot);\n  const currentOnline = item?.online ?? {};\n  const viewerCounts = isSnapshot ? liveGetViewerCounts(snapshot) : liveGetViewerCounts(currentOnline, currentOnline?.viewers);\n  const viewers = viewerCounts.total;\n  const participantCounts = isSnapshot ? liveGetParticipantCounts(snapshot, participants) : liveGetParticipantCounts(currentOnline);\n  const members = participantCounts.total;\n  const ended = liveIsViewerKickedStream(item) || (isSnapshot ? liveIsTerminalRoomSnapshot(snapshot) : item?.ended === true);\n  return {\n    ...item,\n    roomId: targetId,\n    room: isSnapshot ? snapshot?.room ?? null : item?.room ?? null,\n    route: isSnapshot ? snapshot?.route ?? null : item?.route ?? null,\n    streamStatus: isSnapshot ? snapshot : item?.streamStatus,\n    playback,\n    ended,\n    online: {\n      ...currentOnline,\n      members,\n      viewers,\n      viewerCounts,\n      participantCounts,\n      total: Math.max(0, viewers)\n    }\n  };\n};\nconst liveMergeRoomSnapshot = (roomId, snapshot) => {\n  if (!roomId || !snapshot) return;\n  const targetId = String(roomId);\n  const isSnapshot = liveIsRoomSnapshot(snapshot);\n  const playback = liveResolveSnapshotPlayback(targetId, snapshot);\n  const current = State.store.liveStreams.value ?? {\n    total: 0,\n    items: []\n  };\n  const currentItems = current?.items ?? [];\n  const nextSignature = liveGetPlaybackSignature(playback);\n  const nextRouteSignature = isSnapshot ? liveGetRouteSignature(snapshot?.route) : null;\n  const nextRoomSignature = isSnapshot ? liveGetRoomSignature(snapshot?.room) : null;\n  const nextParticipants = isSnapshot ? liveGetParticipantCounts(snapshot, liveGetSnapshotParticipants(snapshot)) : null;\n  const nextMembers = nextParticipants?.total ?? null;\n  const nextViewerCounts = isSnapshot ? liveGetViewerCounts(snapshot) : null;\n  const nextViewers = nextViewerCounts?.total ?? null;\n  const nextEnded = isSnapshot ? liveIsTerminalRoomSnapshot(snapshot) : null;\n  let found = false;\n  let changed = false;\n  const items = currentItems.map(item => {\n    const itemRoomId = liveGetItemRoomId(item);\n    if (itemRoomId == null || String(itemRoomId) !== targetId) return item;\n    found = true;\n    const sameSnapshot = liveGetPlaybackSignature(item?.playback) === nextSignature && (!isSnapshot || liveGetRouteSignature(item?.route) === nextRouteSignature) && (!isSnapshot || liveGetRoomSignature(item?.room) === nextRoomSignature) && (!isSnapshot || Number(item?.online?.members ?? 0) === nextMembers) && (!isSnapshot || Number(item?.online?.viewers ?? 0) === nextViewers) && (!isSnapshot || Number(item?.online?.viewerCounts?.users ?? 0) === nextViewerCounts.users) && (!isSnapshot || Number(item?.online?.viewerCounts?.guests ?? nextViewers) === nextViewerCounts.guests) && (!isSnapshot || Number(item?.online?.participantCounts?.owner ?? 0) === nextParticipants.owner) && (!isSnapshot || Number(item?.online?.participantCounts?.members ?? 0) === nextParticipants.members) && (!isSnapshot || Number(item?.online?.participantCounts?.guests ?? 0) === nextParticipants.guests) && (!isSnapshot || item?.ended === true === nextEnded);\n    if (sameSnapshot) return item;\n    changed = true;\n    return liveApplyRoomSnapshotToItem(targetId, item, snapshot, playback);\n  });\n  if (!found) {\n    items.unshift(liveApplyRoomSnapshotToItem(targetId, liveMakePlaybackOnlyStream(targetId, playback), snapshot, playback));\n    changed = true;\n  }\n  if (!changed) return;\n  State.store.liveStreams.next({\n    ...current,\n    total: Math.max(current?.total ?? 0, items.length),\n    items\n  });\n};\nconst liveMergePlayback = (roomId, playback) => {\n  liveMergeRoomSnapshot(roomId, playback);\n};\nconst liveMergeStreamStatus = (roomId, status) => {\n  liveMergeRoomSnapshot(roomId, status);\n};\nconst liveClearHlsSyncTimer = roomId => {\n  const targetId = String(roomId ?? '');\n  const timer = liveHlsSyncTimers.get(targetId);\n  if (timer) clearTimeout(timer);\n  liveHlsSyncTimers.delete(targetId);\n};\nconst liveScheduleHlsSync = (roomId, attempt = 0, delay = LIVE_HLS_READY_POLL_DELAY) => {\n  const targetId = String(roomId ?? '');\n  if (!targetId || attempt >= LIVE_HLS_READY_POLL_LIMIT) return;\n  liveClearHlsSyncTimer(targetId);\n  const timer = setTimeout(() => {\n    liveHlsSyncTimers.delete(targetId);\n    liveSyncHlsPlayback(targetId, attempt + 1);\n  }, delay);\n  liveHlsSyncTimers.set(targetId, timer);\n};\nconst liveSyncHlsPlayback = _async(function (roomId, attempt = 0) {\n  const targetId = String(roomId ?? '');\n  if (!targetId) return null;\n  const pending = liveHlsSyncPromises.get(targetId);\n  if (pending) return pending;\n  const promise = _async(function () {\n    return _catch(function () {\n      return _await(State.post(LIVE_HLS_SYNC_ENDPOINT, {\n        roomIds: [targetId]\n      }, 'json'), function (hls) {\n        const snapshot = hls?.rooms?.[targetId] ?? null;\n        const playback = liveGetSnapshotPlayback(snapshot);\n        if (snapshot) {\n          liveMergeRoomSnapshot(targetId, snapshot);\n        }\n        if (State.api?.liveViewer?.getRoomId?.() !== targetId && !liveIsPlaybackReady(playback)) {\n          liveScheduleHlsSync(targetId, attempt);\n        } else {\n          liveClearHlsSyncTimer(targetId);\n        }\n        return snapshot;\n      });\n    }, function (error) {\n      console.error('[live] hls room sync failed', error);\n      liveScheduleHlsSync(targetId, attempt);\n      return liveHlsLastPlayback.get(targetId) ?? null;\n    });\n  })().finally(() => {\n    if (liveHlsSyncPromises.get(targetId) === promise) {\n      liveHlsSyncPromises.delete(targetId);\n    }\n  });\n  liveHlsSyncPromises.set(targetId, promise);\n  return promise;\n});\nconst liveSyncHlsRooms = _async(function (roomIds) {\n  const ids = [...new Set((roomIds ?? []).map(id => String(id)).filter(Boolean))];\n  if (!ids.length) return null;\n  const key = ids.slice().sort().join('|');\n  const pending = liveHlsBatchSyncPromises.get(key);\n  if (pending) return pending;\n  const promise = State.post(LIVE_HLS_SYNC_ENDPOINT, {\n    roomIds: ids\n  }, 'json').finally(() => {\n    if (liveHlsBatchSyncPromises.get(key) === promise) {\n      liveHlsBatchSyncPromises.delete(key);\n    }\n  });\n  liveHlsBatchSyncPromises.set(key, promise);\n  return promise;\n});\nconst liveAttachHlsPlayback = _async(function (response) {\n  const rawItems = liveGetRawItems(response);\n  if (!rawItems.length) return response;\n  const roomIds = rawItems.map(liveGetRawRoomId).map(id => String(id)).filter(Boolean);\n  return roomIds.length ? _catch(function () {\n    return _await(liveSyncHlsRooms(roomIds), function (hls) {\n      const statuses = hls?.rooms ?? {};\n      const items = rawItems.map((room, index) => {\n        const roomId = String(liveGetRawRoomId(room, index));\n        const snapshot = statuses[roomId] ?? null;\n        const playback = liveResolveSnapshotPlayback(roomId, snapshot) ?? room?.playback ?? liveHlsLastPlayback.get(roomId) ?? null;\n        return snapshot ? liveApplyRoomSnapshotToItem(roomId, room, snapshot, playback) : {\n          ...room,\n          playback\n        };\n      });\n      return {\n        ...response,\n        items\n      };\n    });\n  }, function (error) {\n    console.error('[live] hls sync failed', error);\n    return response;\n  }) : response;\n});\nconst liveReadResponse = response => {\n  const rawItems = liveGetRawItems(response);\n  const items = rawItems.filter((item, index) => !!liveGetStreamId(item, index));\n  return {\n    items,\n    total: response?.total ?? items.length\n  };\n};\nconst liveFetchStreams = _async(function (skip = 0, limit = LIVE_STREAM_PAGE_SIZE) {\n  const countries = liveGetCountries();\n  return _await(State.post(LIVE_STREAM_ENDPOINT, {\n    skip,\n    limit,\n    countries: countries.length > 0 ? countries : null\n  }, 'json'), function (response) {\n    return _await(liveAttachHlsPlayback(response), liveReadResponse);\n  });\n});\nconst liveUpdateStreams = _async(function (skip = 0, limit = LIVE_STREAM_PAGE_SIZE, options = {}) {\n  const isMore = skip > 0;\n  const silent = options?.silent === true;\n  const force = options?.force === true;\n  if (isMore && State.store.liveEnded.value) return;\n  if (!force && State.store.liveLoading.value) return;\n  if (!force && State.store.liveLoadingMore.value) return;\n  const requestSeq = ++liveStreamsRequestSeq;\n  if (isMore) {\n    State.store.liveLoadingMore.next(true);\n  } else if (!silent) {\n    State.store.liveLoadingMore.next(false);\n    State.store.liveLoading.next(true);\n    State.store.liveEnded.next(false);\n  }\n  return _finallyRethrows(function () {\n    return _catch(function () {\n      return _await(liveFetchStreams(skip, limit), function (response) {\n        if (requestSeq !== liveStreamsRequestSeq) return;\n        const hiddenItems = response.items.filter(liveIsViewerKickedStream);\n        const items = response.items.filter(item => !liveIsViewerKickedStream(item));\n        const total = Math.max(0, Number(response.total) - hiddenItems.length);\n        const currentItems = State.store.liveStreams.value?.items ?? [];\n        const playbackOnlyItems = isMore ? [] : currentItems.filter(item => (item?.routeOnly === true || item?.ended === true) && (item?.playback || item?.ended === true) && !items.some((nextItem, index) => liveGetStreamId(nextItem, index) === liveGetStreamId(item)));\n        const previousItems = isMore ? currentItems : playbackOnlyItems;\n        State.store.liveStreams.next({\n          total,\n          items: [...previousItems, ...items]\n        });\n        State.store.liveEnded.next((items?.length ?? 0) < limit || previousItems.length + items.length >= total);\n      });\n    }, function (error) {\n      if (requestSeq !== liveStreamsRequestSeq) return;\n      console.error(error);\n      if (!isMore && !silent) {\n        State.store.liveStreams.next({\n          total: 0,\n          items: []\n        });\n        State.store.liveEnded.next(true);\n      }\n    });\n  }, function (_wasThrown19, _result56) {\n    if (!silent && requestSeq === liveStreamsRequestSeq) {\n      State.store.liveLoading.next(false);\n      State.store.liveLoadingMore.next(false);\n    }\n    return _rethrow(_wasThrown19, _result56);\n  });\n});\nconst liveSetCountries = _async(function (countries) {\n  const nextCountries = liveNormalizeCountries(countries);\n  const currentCountries = liveGetCountries();\n  const changed = nextCountries.length !== currentCountries.length || nextCountries.some((country, index) => country !== currentCountries[index]);\n  if (changed) {\n    liveGetCountriesStore().next(nextCountries);\n  }\n  return liveUpdateStreams(0, LIVE_STREAM_PAGE_SIZE, {\n    force: true\n  });\n});\nconst liveGetStreams = () => State.store.liveStreams.value?.items ?? [];\nconst liveGetStreamById = id => {\n  const targetId = id == null ? null : String(id);\n  const items = liveGetStreams();\n  return items.find((item, index) => liveGetStreamId(item, index) === targetId) ?? items[0] ?? null;\n};\nconst liveGetStreamIndexById = id => {\n  const targetId = id == null ? null : String(id);\n  const items = liveGetStreams();\n  const index = items.findIndex((item, itemIndex) => liveGetStreamId(item, itemIndex) === targetId);\n  return index >= 0 ? index : 0;\n};\nconst liveService = {\n  api: {\n    name: 'live',\n    update: function (options) {\n      return liveUpdateStreams(0, LIVE_STREAM_PAGE_SIZE, options);\n    },\n    moreStreams: _async(function () {\n      const skip = State.store.liveStreams.value?.items?.length ?? 0;\n      return _awaitIgnored(liveUpdateStreams(skip, LIVE_STREAM_PAGE_SIZE));\n    }),\n    getStreams: liveGetStreams,\n    getStreamById: liveGetStreamById,\n    getStreamIndexById: liveGetStreamIndexById,\n    markViewerKicked: liveMarkViewerKicked,\n    clearViewerKick: liveClearViewerKick,\n    getMutedStreamStore: liveGetMutedStreamStore,\n    getSwipeHintShowsStore: liveGetSwipeHintShowsStore,\n    getSwipeHintVisibleStore: liveGetSwipeHintVisibleStore,\n    showSwipeHint: liveShowSwipeHint,\n    hideSwipeHint: liveHideSwipeHint,\n    getCountries: liveGetCountries,\n    setCountries: liveSetCountries,\n    updateCountryViewers: liveUpdateCountryViewers,\n    startWatching: (roomId, source) => State.api?.liveViewer?.startWatching?.(roomId, source),\n    stopWatching: roomId => State.api?.liveViewer?.stopWatching?.(roomId),\n    syncPlayback: liveSyncHlsPlayback,\n    mergeViewerStatus: liveMergeStreamStatus,\n    onViewerOpened: liveClearHlsSyncTimer,\n    onViewerClosed: liveClearHlsSyncTimer,\n    useCountries() {\n      return Hooks.useBehaviorSubject(liveGetCountriesStore());\n    },\n    useCountryViewers() {\n      return Hooks.useBehaviorSubject(liveGetCountryViewersStore());\n    },\n    useOwnStream() {\n      const [stream] = Hooks.useBehaviorSubject(liveGetOwnStreamStore());\n      React.useEffect(() => {\n        liveUpdateOwnStream();\n      }, []);\n      return stream ?? liveEmptyOwnStreamState();\n    },\n    useStreams() {\n      const [isEnded] = Hooks.useBehaviorSubject(State.store.liveEnded);\n      const [isLoading] = Hooks.useBehaviorSubject(State.store.liveLoading);\n      const [isLoadingMore] = Hooks.useBehaviorSubject(State.store.liveLoadingMore);\n      const [data] = Hooks.useBehaviorSubject(State.store.liveStreams);\n      const items = React.useMemo(() => data?.items ?? [], [data?.items]);\n      React.useEffect(() => {\n        if (!State.store.liveInited.value || !State.store.liveStreams.value?.items?.length) {\n          State.store.liveInited.next(true);\n          State.store.liveLoading.next(null);\n          State.store.liveEnded.next(false);\n          liveUpdateStreams(0, LIVE_STREAM_PAGE_SIZE);\n        }\n      }, []);\n      return [items, data?.total ?? 0, isLoading ?? true, isLoadingMore, isEnded ?? false];\n    },\n    useStream(id) {\n      const [items] = this.useStreams();\n      const targetId = id == null ? null : String(id);\n      return React.useMemo(() => items.find((item, index) => liveGetStreamId(item, index) === targetId) ?? items[0] ?? null, [targetId, items]);\n    }\n  },\n  init() {\n    liveGetMutedStreamStore();\n    liveGetSwipeHintShowsStore();\n    liveGetSwipeHintVisibleStore();\n    liveGetCountriesStore();\n    liveGetCountryViewersStore();\n    liveGetOwnStreamStore();\n    if (State.store.liveStreams.value == null) {\n      State.store.liveStreams.next({\n        total: 0,\n        items: []\n      });\n    }\n    State.store.liveEnded.next(false);\n    State.store.liveLoading.next(null);\n    State.store.liveLoadingMore.next(false);\n  },\n  use() {\n    State.useSocket('stream:state', liveApplyOwnStream);\n  },\n  subs() {\n    return Rx.combineLatest([State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(userId => {\n      liveGetOwnStreamStore().next(liveEmptyOwnStreamState(userId == null));\n      if (userId != null) liveUpdateOwnStream();\n    })), State.state.isConnected.pipe(Rx.filter(Boolean), Rx.distinctUntilChanged(), Rx.tap(() => liveUpdateOwnStream())), State.state.appState.pipe(Rx.filter(appState => appState === 'active'), Rx.distinctUntilChanged(), Rx.tap(() => liveUpdateOwnStream()))]);\n  }\n};\n\n/* === Inlined module: services/streamStats.jsx === */\nconst STREAM_STATS_START_ENDPOINT = '/api/room-watcher/streams/start';\nconst STREAM_STATS_FINISH_ENDPOINT = '/api/room-watcher/streams/finish';\nconst STREAM_STATS_CURRENT_ENDPOINT = '/api/room-watcher/insights/current';\nconst STREAM_STATS_GET_ENDPOINT = '/api/room-watcher/insights/get';\nconst streamStatsNumber = value => {\n  const number = Number(value ?? 0);\n  return Number.isFinite(number) ? Math.max(0, number) : 0;\n};\nconst normalizeStreamStats = response => {\n  if (!response || typeof response !== 'object') return null;\n  const startedAtValue = response?.startedAt == null ? null : new Date(response.startedAt).getTime();\n  const endedAtValue = response?.endedAt == null ? null : new Date(response.endedAt).getTime();\n  const newFollowers = streamStatsNumber(response?.followers?.new);\n  const followersAtStart = response?.followers?.atStart == null ? null : streamStatsNumber(response.followers.atStart);\n  const followersAtEnd = response?.followers?.atEnd == null ? null : streamStatsNumber(response.followers.atEnd);\n  return {\n    streamId: response?.streamId == null ? null : String(response.streamId),\n    roomId: response?.roomId == null ? null : String(response.roomId),\n    status: response?.status ?? null,\n    reconciled: response?.reconciled === true,\n    startedAt: Number.isFinite(startedAtValue) ? startedAtValue : null,\n    endedAt: Number.isFinite(endedAtValue) ? endedAtValue : null,\n    durationSeconds: streamStatsNumber(response?.durationSeconds),\n    currentViewers: streamStatsNumber(response?.viewers?.current),\n    peakViewers: streamStatsNumber(response?.viewers?.peak),\n    totalViewers: streamStatsNumber(response?.viewers?.unique),\n    registeredViewers: streamStatsNumber(response?.viewers?.registered),\n    guestViewers: streamStatsNumber(response?.viewers?.guests),\n    giftsCount: streamStatsNumber(response?.gifts?.count),\n    gemsEarned: streamStatsNumber(response?.gifts?.gemsEarned),\n    starsValue: streamStatsNumber(response?.gifts?.starsValue),\n    newFollowers,\n    followersAtStart,\n    followersAtEnd,\n    followers: followersAtEnd ?? (followersAtStart == null ? null : followersAtStart + newFollowers)\n  };\n};\nconst streamStatsPost = _async(function (endpoint, body) {\n  return _await(State.post(endpoint, body, 'json'), normalizeStreamStats);\n});\nconst streamStatsService = {\n  api: {\n    name: 'streamStats',\n    normalize: normalizeStreamStats,\n    start: (roomId, mode = 'solo') => streamStatsPost(STREAM_STATS_START_ENDPOINT, {\n      roomId,\n      mode\n    }),\n    finish: roomId => streamStatsPost(STREAM_STATS_FINISH_ENDPOINT, {\n      roomId\n    }),\n    current: roomId => streamStatsPost(STREAM_STATS_CURRENT_ENDPOINT, {\n      roomId\n    }),\n    get: streamId => streamStatsPost(STREAM_STATS_GET_ENDPOINT, {\n      streamId\n    })\n  }\n};\n\n/* === Inlined module: services/watch.jsx === */\nconst getLiveApi = () => State.api?.live;\nconst getWatchStreams = () => getLiveApi()?.getStreams?.() ?? [];\nconst getWatchStreamById = id => getLiveApi()?.getStreamById?.(id) ?? getWatchStreams()[0] ?? null;\nconst getWatchStreamIndexById = id => getLiveApi()?.getStreamIndexById?.(id) ?? 0;\nconst watchService = {\n  api: {\n    name: 'watch',\n    getStreams: getWatchStreams,\n    getStreamById: getWatchStreamById,\n    getStreamIndexById: getWatchStreamIndexById,\n    useStreams() {\n      return getLiveApi()?.useStreams?.() ?? [[], 0, true, false, false];\n    },\n    useStream(id) {\n      const [items] = this.useStreams();\n      return React.useMemo(() => items.find(item => item.id === id) ?? items[0] ?? null, [id, items]);\n    }\n  }\n};\n\n/* === Inlined module: services/online.jsx === */\nconst setOnline = (userId, value) => {\n  State.store.onlineMap.next({\n    ...(State.store.onlineMap.value ?? {}),\n    [userId]: value\n  });\n  State.store.onlineMapStore.next({\n    ...(State.store.onlineMapStore.value ?? {}),\n    [userId]: value\n  });\n};\nconst ONLINE_PAGE_SIZE = 100;\nconst isLoadingOnlineMap = new Set();\nconst onlineService = {\n  api: {\n    name: \"online\",\n    setOnline,\n    useOnline: userId => {\n      const isOnlineLoaded = Hooks.useBehaviorSubjectMap(State.store.onlineMap, React.useCallback(m => m?.[userId] != null, [userId]));\n      const isOnline = Hooks.useBehaviorSubjectMap(State.store.onlineMapStore, React.useCallback(m => m?.[userId], [userId]));\n      React.useEffect(() => {\n        if (State.store.onlineMap.value?.[userId] == null && !isLoadingOnlineMap.has(userId)) {\n          isLoadingOnlineMap.add(userId);\n          State.bus.onlineIdsToLoad.next(userId);\n        }\n        const interval = setInterval(() => {\n          if (!isLoadingOnlineMap.has(userId)) {\n            isLoadingOnlineMap.add(userId);\n            State.bus.onlineIdsToLoad.next(userId);\n          }\n        }, 15000);\n        return () => {\n          clearInterval(interval);\n        };\n      }, [userId]);\n      return [isOnlineLoaded ? isOnline : null, isOnline];\n    }\n  },\n  use() {\n    State.useSocket('onlineChanged', event => {\n      const userId = event?.friendId ?? event?.userId;\n      if (!userId) return;\n      setOnline(userId, event.isOnline);\n    });\n  },\n  subs: () => {\n    return Rx.combineLatest([State.bus.onlineIdsToLoad.pipe(Rx.bufferTime(1000, null, ONLINE_PAGE_SIZE), Rx.filter(ids => ids.length > 0), Rx.tap(_async(function (ids) {\n      ids = [...new Set([...ids])];\n      return _continueIgnored(_finallyRethrows(function () {\n        return _catch(function () {\n          return _await(State.post('/api/login/online', {\n            ids: ids\n          }, 'json'), function (result) {\n            for (const item of ids) {\n              setOnline(item, result?.includes(item));\n            }\n          });\n        }, function (error) {\n          console.error(error);\n        });\n      }, function (_wasThrown20, _result57) {\n        for (const item of ids) {\n          isLoadingOnlineMap.delete(item);\n        }\n        return _rethrow(_wasThrown20, _result57);\n      }));\n    })))]);\n  }\n};\n\n/* === Inlined module: services/chat.jsx === */\nconst CHATS_API_PATH = '/api/chat/camee-chat';\nfunction safeJsonParseChat(raw) {\n  if (raw == null || String(raw).trim() === '') return null;\n  try {\n    return JSON.parse(raw);\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Загрузка списка чатов с бэка. Контракт: GET /api/chat/camee-chat?sort=date|unread|online&limit=&offset=\n * @param {string} tab - 'all' | 'requests' | 'followers' | 'unread' (таб UI; для API передаём sort: unread только для unread)\n * @param {number} limit\n * @param {number} offset\n * @returns {Promise<Object>} - { requestsNew, followersNew, unreadsNew, PinnedChats, Chats }\n */\nconst fetchChatsApi = _async(function (limit = 50, offset = 0) {\n  const sort = 'date';\n  const url = `${CHATS_API_PATH}/list?sort=${sort}&limit=${limit}&offset=${offset}`;\n  return _await(State.post(url, {}, 'text'), function (rawText) {\n    return normalizeResponse(safeJsonParseChat(rawText));\n  });\n});\n\n/**\n * Загрузка списка чатов с бэка по ids.\n * @param {string} tab - 'all' | 'requests' | 'followers' | 'unread' (таб UI; для API передаём sort: unread только для unread)\n * @param {string[]} ids\n * @returns {Promise<Object>} - { requestsNew, followersNew, unreadsNew, PinnedChats, Chats }\n */\nconst fetchChatIdsApi = _async(function (ids = []) {\n  const sort = 'date';\n  const url = `${CHATS_API_PATH}/listByIds?sort=${sort}`;\n  return _await(State.post(url, {\n    ids\n  }, 'text'), function (rawText) {\n    return normalizeResponse(safeJsonParseChat(rawText));\n  });\n});\n\n/**\n * Поиск чатов по имени. GET /api/chat/camee-chat/search?q=...&sort=date&limit=&offset=\n * @param {string} q - поисковая строка\n * @param {number} limit\n * @param {number} offset\n * @returns {Promise<Object>} - тот же формат что и fetchChatIdsApi (chats, PinnedChats, ...)\n */\nconst fetchSearchChatsApi = _async(function (q, limit = 50, offset = 0) {\n  const query = typeof q === 'string' ? q.trim() : '';\n  if (!query) {\n    return {\n      Chats: [],\n      PinnedChats: []\n    };\n  }\n  const url = `${CHATS_API_PATH}/search?q=${encodeURIComponent(query)}&sort=date&limit=${limit}&offset=${offset}`;\n  return _await(State.post(url, {}, 'text'), function (rawText) {\n    const raw = safeJsonParseChat(rawText);\n    return normalizeResponse(raw ?? {\n      Chats: [],\n      PinnedChats: []\n    });\n  });\n});\n\n/**\n * Закрепить чат (Pin). POST /api/chat/camee-chat/:chatId/pin\n * @param {string} chatId - ID чата\n * @returns {Promise<Object>} - Результат setMemberStatus\n */\nconst apiPin = _async(function (chatId) {\n  const url = `${CHATS_API_PATH}/${encodeURIComponent(chatId)}/pin`;\n  return State.post(url, {}, 'json');\n});\n\n/**\n * Открепить чат (Unpin). POST /api/chat/camee-chat/:chatId/unpin\n * @param {string} chatId - ID чата\n * @returns {Promise<Object>} - Результат setMemberStatus\n */\nconst apiUnpin = _async(function (chatId) {\n  const url = `${CHATS_API_PATH}/${encodeURIComponent(chatId)}/unpin`;\n  return State.post(url, {}, 'json');\n});\n\n/**\n * Отключить уведомления (Mute). POST /api/chat/camee-chat/:chatId/mute\n * @param {string} chatId - ID чата\n * @returns {Promise<Object>} - Результат setMemberStatus\n */\nconst apiMute = _async(function (chatId) {\n  const url = `${CHATS_API_PATH}/${encodeURIComponent(chatId)}/mute`;\n  return State.post(url, {}, 'json');\n});\n\n/**\n * Включить уведомления (Unmute). POST /api/chat/camee-chat/:chatId/unmute\n * @param {string} chatId - ID чата\n * @returns {Promise<Object>} - Результат setMemberStatus\n */\nconst apiUnmute = _async(function (chatId) {\n  const url = `${CHATS_API_PATH}/${encodeURIComponent(chatId)}/unmute`;\n  return State.post(url, {}, 'json');\n});\n\n/**\n * Удалить чат (DELETE). Подтверждение/Undo выполняются на фронте.\n * @param {string} chatId - ID чата\n * @returns {Promise<Object>} - Результат soft-delete\n */\nconst apiDelete = _async(function (chatId) {\n  const url = `${CHATS_API_PATH}/${encodeURIComponent(chatId)}/delete`;\n  return State.post(url, {}, 'json');\n});\n\n/**\n * Отменить удаление (Cancel delete). POST /api/chat/camee-chat/:chatId/cancel-delete\n * @param {string} chatId - ID чата\n * @returns {Promise<Object>} - Результат setChatDeletedStatus (deleted=0)\n */\nconst apiCancelDelete = _async(function (chatId) {\n  const url = `${CHATS_API_PATH}/${encodeURIComponent(chatId)}/cancel-delete`;\n  return State.post(url, {}, 'json');\n});\n\n// ---------- Service ----------\n\nfunction parseLastMessageTs(value) {\n  if (!value) return 0;\n  if (typeof value === 'number') return Number.isNaN(value) ? 0 : value;\n  const raw = String(value);\n  const isoLike = raw.includes(' ') && !raw.includes('T') ? raw.replace(' ', 'T') : raw;\n  const t1 = new Date(isoLike).getTime();\n  if (!Number.isNaN(t1)) return t1;\n  const t2 = new Date(isoLike + 'Z').getTime();\n  return Number.isNaN(t2) ? 0 : t2;\n}\nfunction toBackendDateFormat(isoString) {\n  if (!isoString) return null;\n  const date = new Date(isoString);\n  if (Number.isNaN(date.getTime())) return isoString;\n  const pad = n => String(n).padStart(2, '0');\n  return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;\n}\nfunction parseStateChangedTs(v) {\n  if (!v) return 0;\n  if (typeof v === 'number') return Number.isNaN(v) ? 0 : v;\n  const raw = String(v);\n  // Бэк часто отдаёт \"YYYY-MM-DD HH:mm:ss\" (не ISO). На некоторых JS-движках это Invalid Date.\n  const isoLike = raw.includes(' ') && !raw.includes('T') ? raw.replace(' ', 'T') : raw;\n  const t1 = new Date(isoLike).getTime();\n  if (!Number.isNaN(t1)) return t1;\n  const t2 = new Date(isoLike + 'Z').getTime();\n  return Number.isNaN(t2) ? 0 : t2;\n}\nfunction sortChats() {\n  const input = State.store.chatsStore.value;\n  const source = Array.isArray(input) ? input : [];\n  const pinned = source.filter(c => !!State.store.pinnedChatsStore.value?.[c?.id]);\n  const regular = source.filter(c => !State.store.pinnedChatsStore.value?.[c?.id]);\n  const byLastMessageDesc = (a, b) => parseLastMessageTs(b?.lastMessageTime) - parseLastMessageTs(a?.lastMessageTime);\n  const byStateChangedDesc = (a, b) => parseStateChangedTs(b?.stateChangedAt) - parseStateChangedTs(a?.stateChangedAt);\n  pinned.sort(byStateChangedDesc);\n  regular.sort(byLastMessageDesc);\n  return [...pinned, ...regular];\n}\n\n// TODO: REMOVE\n/**\n * Transforms API chat item to internal UI model.\n * @param {Object} apiChat - Chat item from API\n * @param {Set<string>} [pinnedIds] - ID закреплённых из PinnedChats (бэкенд отдаёт закреплённость там; в Chats у всех может быть pinned: false).\n * @returns {Object} - Internal ChatItemData\n */\nfunction transformChat(apiChat) {\n  return {\n    id: apiChat.chatId,\n    title: apiChat.title || apiChat.username || '',\n    photo: apiChat.avatar ? {\n      path: apiChat.avatar\n    } : apiChat.photo || null,\n    userId: apiChat.userId ?? apiChat.peerUserId ?? apiChat.otherUserId ?? undefined,\n    isOnline: !!apiChat.online,\n    sex: apiChat.sex != null && apiChat.sex !== '' ? String(apiChat.sex) : undefined,\n    lastMessageText: apiChat.lastMessageText,\n    lastMessageTime: apiChat.lastMessageTime,\n    stateChangedAt: apiChat.stateChangedAt ?? apiChat.state_changed_at ?? null,\n    isLastMessageRead: apiChat.isLastMessageRead,\n    messagesCount: apiChat.messagesCount,\n    unreadCount: Math.max(0, Number(apiChat.unreadsCount) || 0),\n    isMuted: apiChat.muted,\n    isRequest: apiChat.type === 'initiator',\n    // outgoing = request\n    isFollower: apiChat.type === 'creator',\n    // incoming = follower (backend role)\n    isDeleted: apiChat.deleted\n  };\n}\n\n/**\n * Transforms API response to internal state.\n * Учитывает PinnedChats: бэкенд отдаёт закреплённые чаты в PinnedChats с pinned:true, в Chats тот же чат может быть с pinned:false — берём закреплённость из PinnedChats.\n * @param {Object} res\n * @returns {{ chats: Object[] }}\n */\nfunction normalizeResponse(res) {\n  const pinnedChats = res.PinnedChats ?? [];\n  const unpinnedChats = res.Chats ?? res.chats ?? [];\n  const pinnedIds = new Set(pinnedChats.map(c => c.chatId));\n  return {\n    pinned: [...pinnedIds].reduce((map, id) => {\n      map[id] = true;\n      return map;\n    }, {}),\n    chats: [...pinnedChats.map(transformChat), ...unpinnedChats.filter(c => !pinnedIds.has(c.chatId)).map(transformChat)]\n  };\n}\nconst updateFinalChats = () => {\n  const sorted = sortChats();\n  State.store.finalChatsStore.next(sorted);\n};\nconst loadChats = _async(function (update = false, ids = []) {\n  if (State.api?.guest?.isGuestOrEmptySession?.()) {\n    return;\n  }\n  if (State.store.chatsLoading.value) return;\n  State.store.chatsLoading.next(true);\n  update = update || !!ids?.length;\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      return _await(ids?.length ? fetchChatIdsApi(ids) : fetchChatsApi(), function (res) {\n        const {\n          pinned,\n          chats\n        } = res;\n        if (update) {\n          const getChatId = chat => chat.id ?? chat.chatId;\n          const map = new Map();\n          for (const chat of chats) {\n            map.set(getChatId(chat), chat);\n          }\n          const prev = State.store.chatsStore.value ?? [];\n          const merged = [];\n          const unmatched = [];\n          for (const chat of prev) {\n            const id = getChatId(chat);\n            if (map.has(id)) {\n              merged.push(map.get(id));\n              map.delete(id);\n            } else {\n              unmatched.push(chat);\n            }\n          }\n          State.store.chatsStore.next([...merged, ...Array.from(map.values()), ...unmatched]);\n          State.store.pinnedChatsStore.next({\n            ...(State.store.pinnedChatsStore.value ?? {}),\n            ...pinned\n          });\n        } else {\n          State.store.chatsStore.next(chats);\n          State.store.pinnedChatsStore.next(pinned);\n        }\n        updateFinalChats();\n      });\n    }, function (error) {\n      console.error(error);\n    });\n  }, function (_wasThrown21, _result58) {\n    State.store.chatsLoading.next(false);\n    return _rethrow(_wasThrown21, _result58);\n  }));\n});\nconst runPinChat = _async(function (chatId, isPinned) {\n  return _invokeIgnored(function () {\n    if (isPinned) return _awaitIgnored(apiUnpin(chatId));else return _awaitIgnored(apiPin(chatId));\n  });\n});\nconst MAX_PINNED_CHATS = 5;\nconst pinChat = _async(function (chatId) {\n  const stateChangedAt = State.store.chatsStore.value?.find(chat => chat.id === chatId)?.stateChangedAt;\n  const isPinned = !!State.store.pinnedChatsStore.value?.[chatId];\n  const prevPinnedCount = Object.keys(State.store.pinnedChatsStore.value).filter(key => !!State.store.pinnedChatsStore.value?.[key]).length;\n  if (!isPinned && prevPinnedCount >= MAX_PINNED_CHATS) {\n    return false;\n  }\n  runPinChat(chatId, isPinned).catch(error => {\n    console.error(error);\n    State.store.pinnedChatsStore.next({\n      ...(State.store.pinnedChatsStore.value ?? {}),\n      [chatId]: !!isPinned\n    });\n    State.store.chatsStore.next(State.store.chatsStore.value?.map(chat => chat.id === chatId ? {\n      ...chat,\n      stateChangedAt\n    } : chat));\n    updateFinalChats();\n  });\n  State.store.pinnedChatsStore.next({\n    ...(State.store.pinnedChatsStore.value ?? {}),\n    [chatId]: !isPinned\n  });\n  State.store.chatsStore.next(State.store.chatsStore.value?.map(chat => chat.id === chatId ? {\n    ...chat,\n    stateChangedAt: new Date().toISOString()\n  } : chat));\n  if (isPinned) {\n    // Unpin: убираем пин и делаем полный ресорт\n    updateFinalChats();\n  } else {\n    // Pin: сразу двигаем вверх (pinned секция)\n    const pinnedChat = State.store.finalChatsStore.value.find(chat => chat.id === chatId);\n    State.store.finalChatsStore.next([pinnedChat, ...(State.store.finalChatsStore.value?.filter(chat => chat.id !== chatId) ?? [])].filter(Boolean));\n  }\n  return true;\n});\nconst runMuteChat = _async(function (chatId, isMuted) {\n  return _invokeIgnored(function () {\n    if (isMuted) return _awaitIgnored(apiUnmute(chatId));else return _awaitIgnored(apiMute(chatId));\n  });\n});\nconst muteChat = _async(function (chatId) {\n  const stateChangedAt = State.store.chatsStore.value?.find(chat => chat.id === chatId)?.stateChangedAt;\n  const isMuted = !!State.store.chatsStore.value?.find(chat => chat.id === chatId);\n  runMuteChat(chatId, isMuted).catch(error => {\n    console.error(error);\n    State.store.chatsStore.next(State.store.chatsStore.value?.map(chat => chat.id === chatId ? {\n      ...chat,\n      isMuted: isMuted\n    } : chat));\n  });\n  State.store.chatsStore.next(State.store.chatsStore.value?.map(chat => chat.id === chatId ? {\n    ...chat,\n    isMuted: !isMuted\n  } : chat));\n  return true;\n});\nconst deleteChat = _async(function (chatId) {\n  const pinned = !!State.store.pinnedChatsStore.value?.[chatId];\n  const chats = State.store.chatsStore.value;\n  const promise = apiDelete(chatId).catch(error => {\n    console.error(error);\n    if (pinned) {\n      State.store.pinnedChatsStore.next({\n        ...(State.store.pinnedChatsStore.value ?? {}),\n        [chatId]: pinned\n      });\n    }\n    State.store.chatsStore.next(chats);\n    updateFinalChats();\n    State.api?.unread?.update();\n  });\n  State.store.chatsStore.next(State.store.chatsStore.value?.filter(chat => chat.id !== chatId));\n  State.store.finalChatsStore.next(State.store.finalChatsStore.value?.filter(chat => chat.id !== chatId));\n  State.api?.unread?.reset(chatId);\n  State.api?.chatRoom?.deleteChatConversation?.(chatId);\n  return [promise, _async(function () {\n    return _continueIgnored(_catch(function () {\n      return _await(promise, function () {\n        const chatsRemoved = State.store.chatsStore.value;\n        apiCancelDelete(chatId).catch(() => {\n          State.store.chatsStore.next(chatsRemoved);\n        });\n        State.store.chatsStore.next(chats);\n        updateFinalChats();\n        State.api?.unread?.update();\n      });\n    }, function (error) {\n      console.error(error);\n    }));\n  })];\n});\n\n// // TODO: Rework with delegate work to server (REMOVE tbd)\n// const fetchChatMemberInfo = async (chatId) => {\n//   if (!chatId) return { age: null, sex: null, userId: null };\n//   try {\n//     // memberCards (возраст, пол собеседника) до навигации — хедер рисуется сразу без дописывания.\n//     const url = `${CHATS_API_PATH}/${encodeURIComponent(chatId)}/messages?limit=1&offset=0`;\n//     const res = await State.get(url, 'json');\n//     const memberCards = res?.memberCards ?? [];\n//     const otherCard = memberCards.find((c) => c && String(c.userId) !== String(State?.state?.session?.value?.user?.id));\n//     const age = otherCard?.age != null && otherCard?.age !== '' ? String(otherCard.age) : null;\n//     const sex = otherCard?.sex === 'female' || otherCard?.sex === 'male' ? otherCard.sex : null;\n//     return { age, sex, userId: otherCard?.userId ?? null };\n//   } catch {\n//     return { age: null, sex: null, userId: null };\n//   }\n// };\n\nconst emptyChatsArray = [];\nlet chatsInitedForUserId = null;\nconst closeActiveDeletedChat = (chatId, deletedBy) => {\n  const activeChatId = State.store.chat_chatId?.value;\n  const activeUserId = State.store.user_userId?.value;\n  const isActiveChat = chatId != null && activeChatId != null && String(activeChatId) === String(chatId);\n  const isActiveUser = deletedBy != null && activeUserId != null && String(activeUserId) === String(deletedBy);\n  if (!isActiveChat && !isActiveUser) return;\n  State.store.chat_chatId?.next?.(null);\n  State.store.user_userId?.next?.(null);\n};\nconst chatService = {\n  api: {\n    set(userId, chatId) {\n      State.store.chat_chatId.next(chatId);\n      State.store.user_userId.next(userId);\n    },\n    name: 'chat',\n    loadChats,\n    pinChat,\n    muteChat,\n    deleteChat,\n    useChats() {\n      const [chats] = Hooks.useBehaviorSubject(State.store.finalChatsStore);\n      const [isLoading] = Hooks.useBehaviorSubject(State.store.chatsLoading);\n      const currentUserId = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.user?.id, []));\n      React.useEffect(() => {\n        if (chatsInitedForUserId !== currentUserId) {\n          chatsInitedForUserId = currentUserId;\n          loadChats();\n        } else {\n          updateFinalChats();\n        }\n      }, [currentUserId]);\n      return {\n        chats: chats ?? emptyChatsArray,\n        isLoading: isLoading ?? true\n      };\n    },\n    useChatPinned(id) {\n      const data = Hooks.useBehaviorSubjectMap(State.store.pinnedChatsStore, React.useCallback(pinnedChatsStore => !!pinnedChatsStore?.[id], [id]));\n      return data;\n    },\n    openModal(userId, source, options = {}) {\n      if (ReactNative.Platform.OS === 'web' && options.showLiveNotification === true && typeof Navigation.push === 'function') {\n        Navigation.push({\n          name: 'Chat',\n          params: {\n            userId,\n            source,\n            showLiveNotification: true\n          }\n        });\n        return;\n      }\n      const content = /*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"ChatModal\",\n        userId: userId,\n        source: source,\n        showLiveNotification: options.showLiveNotification === true\n      });\n      const props = {\n        nokeyboard: true,\n        closeClickOutside: false,\n        swipeDismissible: false,\n        swipeUp: false,\n        swipeDismissibleUp: false,\n        swipeDown: false,\n        swipeDismissibleDown: false,\n        backdropColor: 'transparent',\n        style: {\n          width: '100%',\n          maxWidth: '100%',\n          backgroundColor: 'transparent',\n          borderTopLeftRadius: 0,\n          borderTopRightRadius: 0,\n          borderBottomLeftRadius: 0,\n          borderBottomRightRadius: 0,\n          overflow: 'hidden'\n        },\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        }\n      };\n      const theme = Theme.isDark.value ? 'dark' : 'light';\n      if (ReactNative.Platform.OS === 'web' && typeof Sheet.showWebSheet === 'function') {\n        return Sheet.showWebSheet(content, {\n          theme,\n          props: {\n            ...props,\n            mode: 'side',\n            side: 'right',\n            padding: 0\n          }\n        });\n      }\n      return Sheet.showSheet(content, {\n        theme,\n        props\n      });\n    }\n  },\n  use() {\n    // Собеседник удалил/восстановил чат: обновляем список чатов.\n    State.useSocket('chat:deleted', data => {\n      const id = data?.id ?? data?.chatId ?? data?.idChat ?? null;\n      if (!id) return;\n      const deletedFlag = data?.deleted || data?.isDeleted;\n      const isRestore = deletedFlag === 0 || deletedFlag === false;\n      if (!isRestore) {\n        State.store.chatsStore.next((State.store.chatsStore.value ?? []).filter(c => c?.id !== id));\n        State.store.finalChatsStore.next((State.store.finalChatsStore.value ?? []).filter(c => c?.id !== id));\n        State.api?.chatRoom?.deleteChatConversation?.(id);\n        closeActiveDeletedChat(id, data?.deletedBy);\n        return;\n      }\n    });\n    State.useSocket('chat:pinned', _async(function (data) {\n      const chatId = data?.chatId;\n      if (chatId == null) return;\n      return _awaitIgnored(loadChats(true, [chatId]));\n    }));\n    State.useSocket('chat:message', _async(function (data) {\n      let _exit37 = false;\n      const chatId = data?.chatId ?? data?.chat?.id;\n      if (!chatId) return;\n      const messageId = data?.messageId ?? data?.id ?? data?.lastReadMessageId;\n      if (!messageId) return;\n      const chats = State.store.chatsStore.value ?? [];\n      const existingChat = chats.find(c => c.id === chatId);\n      return _invoke(function () {\n        if (!existingChat) {\n          return _await(loadChats(true, [chatId]), function () {\n            // Нашли загруженный чат и передвинули его\n            const loadedChats = State.store.chatsStore.value ?? [];\n            const pinnedStore = State.store.pinnedChatsStore.value ?? {};\n            const loadedChat = loadedChats.find(c => c.id === chatId);\n            if (!loadedChat) {\n              _exit37 = true;\n              return;\n            }\n            const withoutLoaded = loadedChats.filter(c => c.id !== chatId);\n            if (pinnedStore[chatId]) {\n              // Pinned — на самый верх (начало списка pinned)\n              State.store.chatsStore.next([loadedChat, ...withoutLoaded]);\n            } else {\n              // Не pinned — после pinned секции\n              const pinnedCount = Object.keys(pinnedStore).filter(k => pinnedStore[k]).length;\n              const pinnedChats = withoutLoaded.slice(0, pinnedCount);\n              const rest = withoutLoaded.slice(pinnedCount);\n              State.store.chatsStore.next([...pinnedChats, loadedChat, ...rest]);\n            }\n            _exit37 = true;\n          });\n        }\n      }, function (_result59) {\n        if (_exit37) return _result59;\n        const newLastMessageTime = toBackendDateFormat(data?.timestamp ?? null);\n        const newLastMessageText = data?.text ?? '';\n        const newLastMessageSenderId = data?.fromUserId ?? null;\n        const isLastMessageRead = data?.isRead ?? true;\n        const updateChat = chat => {\n          if (chat.id !== chatId) return chat;\n          return {\n            ...chat,\n            lastMessageTime: newLastMessageTime,\n            lastMessageText: newLastMessageText,\n            lastMessageSenderId: newLastMessageSenderId,\n            isLastMessageRead,\n            lastMessage: {\n              text: newLastMessageText,\n              time: newLastMessageTime,\n              senderId: newLastMessageSenderId,\n              isRead: isLastMessageRead\n            }\n          };\n        };\n        State.store.chatsStore.next(chats.map(updateChat));\n\n        // Обновляем finalChats без сортировки (просто заменяем элемент)\n        const finalChats = State.store.finalChatsStore.value ?? [];\n        State.store.finalChatsStore.next(finalChats.map(updateChat));\n      });\n    }));\n  },\n  subs() {\n    return Rx.combineLatest([State.store.chatsSearchQuery.pipe(Rx.map(search => search?.trim()), Rx.filter(Boolean), Rx.distinctUntilChanged(), Rx.tap(() => {\n      State.store.chatsSearchLoading.next(true);\n    }), Rx.debounceTime(300), Rx.switchMap(search => fetchSearchChatsApi(search).then(res => ({\n      search,\n      res\n    }))), Rx.tap(({\n      search,\n      res\n    }) => {\n      if (State.store.chatsSearchQuery.value?.trim() !== search) return;\n      try {\n        const {\n          chats\n        } = res;\n        State.store.chatsSearch.next(chats);\n      } catch (err) {\n        console.error(err);\n      } finally {\n        State.store.chatsSearchLoading.next(false);\n      }\n    })), State.store.chatsSearchQuery.pipe(Rx.map(search => !search?.trim()), Rx.filter(Boolean), Rx.distinctUntilChanged(), Rx.tap(() => {\n      State.store.chatsSearch.next([]);\n    })), State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.pairwise(), Rx.tap(([prevUserId, nextUserId]) => {\n      if (prevUserId !== nextUserId) {\n        State.store.chat_chatId?.next?.(null);\n        State.store.user_userId?.next?.(null);\n        State.store.chatsStore.next([]);\n        State.store.pinnedChatsStore.next({});\n        State.store.chatsSearch.next([]);\n        State.store.chatsSearchQuery.next('');\n        State.store.finalChatsStore.next([]);\n        if (nextUserId != null) {\n          loadChats();\n        }\n      }\n    })), State.state.isConnected.pipe(Rx.filter(Boolean), Rx.distinctUntilChanged(),\n    // Rx.switchMap(() => {\n    //   return Rx.combineLatest([]);\n    // }),\n    Rx.tap(() => {\n      loadChats();\n    }))]);\n  }\n  // api: {\n  //   upsertChatPeerCache,\n  //   clearChatPeerCache,\n  //   clearChatListCache,\n  //   removeChatPeerCacheForChat,\n  // },\n};\n\n/* === Inlined module: services/chatRoom.jsx === */\nconst CHAT_API = '/api/chat/camee-chat';\nconst CHAT_MESSAGES_PAGE_LIMIT = 50;\nconst apiPinMessage = _async(function (chatId, messageId) {\n  const url = `${CHAT_API}/${encodeURIComponent(chatId)}/messages/${encodeURIComponent(messageId)}/pin`;\n  return State.post(url, {}, 'json');\n});\nconst apiUnpinMessage = _async(function (chatId, messageId) {\n  const url = `${CHAT_API}/${encodeURIComponent(chatId)}/messages/${encodeURIComponent(messageId)}/unpin`;\n  return State.post(url, {}, 'json');\n});\nconst apiDeleteMessages = _async(function (chatId, messageIds) {\n  if (!messageIds?.length) return;\n  const url = `${CHAT_API}/${encodeURIComponent(chatId)}/messages/delete`;\n  const res = State.post(url, {\n    messageIds\n  }, 'json');\n  return res;\n});\n\n// const apiRestoreMessage = async (chatId, messageId) => {\n//   const url = `${CHAT_API}/${encodeURIComponent(chatId)}/messages/${encodeURIComponent(messageId)}/restore`;\n//   const res = await State.post(url, {}, 'json');\n//   return res;\n// };\n\nconst apiInviteMessage = _async(function (userId, message = '', tmpId, analytics) {\n  const url = `${CHAT_API}/invite?userId=${encodeURIComponent(userId)}`;\n  return State.post(url, {\n    message,\n    tmpId\n  }, 'json', undefined, undefined, {\n    analytics\n  });\n});\nconst apiCheckConversation = _async(function (userId) {\n  const url = `${CHAT_API}/withUser?userId=${encodeURIComponent(userId)}`;\n  return State.post(url, {}, 'json');\n});\nconst apiChat = _async(function (chatId) {\n  const url = `${CHAT_API}/${encodeURIComponent(chatId)}/get`;\n  return _await(State.post(url, {}, 'json'), function (res) {\n    return res ? {\n      ...res,\n      id: res.id ?? res.chatId,\n      title: res.title || res.username || '',\n      photo: res.photo ?? (res.avatar ? {\n        path: res.avatar\n      } : null)\n    } : res;\n  });\n});\nconst emptyHG = new Rx.BehaviorSubject(null);\nconst getChatStore = chatId => {\n  return chatId == null ? emptyHG : State.store[`chat_${chatId}_Store`];\n};\nconst getChatState = chatId => {\n  return chatId == null ? emptyHG : State.store[`chat_${chatId}_State`];\n};\nconst setGetCheckConversation = userId => {\n  const store = State.store.chatConverstaionStore;\n  const state = State.store.chatConverstaionState;\n  const storeGet = store.value?.[userId];\n  const stateGet = state.value?.[userId];\n  const storeSet = value => {\n    store.next({\n      ...(store.value ?? {}),\n      [userId]: value\n    });\n  };\n  const stateSet = value => {\n    state.next({\n      ...(state.value ?? {}),\n      [userId]: value\n    });\n  };\n  return {\n    storeGet,\n    stateGet,\n    storeSet,\n    stateSet\n  };\n};\nconst loadCheckConversation = _async(function (userId) {\n  const {\n    storeGet,\n    stateGet,\n    storeSet,\n    stateSet\n  } = setGetCheckConversation(userId);\n  if (stateGet?.chatId) {\n    return stateGet?.chatId;\n  }\n  let promise;\n  if (!stateGet?.isLoading) {\n    stateSet({\n      ...stateGet,\n      isLoading: true\n    });\n    promise = apiCheckConversation(userId).then(res => {\n      if (!res) {\n        stateSet({\n          isLoading: false\n        });\n        storeSet({});\n      } else {\n        stateSet({\n          ...res,\n          isLoading: false\n        });\n        storeSet({\n          ...res\n        });\n      }\n      return res?.chatId ?? res?.id;\n    }).catch(error => {\n      console.error(error);\n      stateSet({\n        ...stateGet,\n        isLoading: false\n      });\n      storeSet({\n        ...storeGet\n      });\n    });\n  }\n  return storeGet?.chatId ? storeGet?.chatId : promise;\n});\nconst useChatIdByUserId = userId => {\n  const store = State.store.chatConverstaionStore;\n  const state = State.store.chatConverstaionState;\n  const chatIdStore = Hooks.useBehaviorSubjectMap(store, React.useCallback(s => s?.[userId]?.chatId ?? s?.[userId]?.id, [userId]));\n  const chatIdState = Hooks.useBehaviorSubjectMap(state, React.useCallback(s => s?.[userId]?.chatId ?? s?.[userId]?.id, [userId]));\n  React.useEffect(() => {\n    if (userId != null) {\n      loadCheckConversation(userId);\n    }\n  }, [userId]);\n  return chatIdState ?? chatIdStore;\n};\nconst setGetChat = chatId => {\n  const store = getChatStore(chatId);\n  const state = getChatState(chatId);\n  const storeGet = store.value;\n  const stateGet = state.value;\n  const storeSet = value => {\n    store.next({\n      ...(store.value ?? {}),\n      ...value\n    });\n  };\n  const stateSet = value => {\n    state.next({\n      ...(state.value ?? {}),\n      ...value\n    });\n  };\n  return {\n    storeGet,\n    stateGet,\n    storeSet,\n    stateSet\n  };\n};\nconst loadChat = _async(function (chatId) {\n  const {\n    storeGet,\n    stateGet,\n    storeSet,\n    stateSet\n  } = setGetChat(chatId);\n  if (stateGet && stateGet?.userId != null) {\n    return stateGet;\n  }\n  if (!stateGet?.isLoading) {\n    stateSet({\n      ...stateGet,\n      isLoading: true\n    });\n    apiChat(chatId).then(res => {\n      if (!res) {\n        stateSet({\n          isLoading: false\n        });\n        storeSet({});\n      } else {\n        stateSet({\n          ...res,\n          isLoading: false\n        });\n        storeSet({\n          ...res\n        });\n      }\n    }).catch(error => {\n      console.error(error);\n      stateSet({\n        ...stateGet,\n        isLoading: false\n      });\n      storeSet({\n        ...storeGet\n      });\n    });\n  }\n  return storeGet ? storeGet : null;\n});\nconst useChatByChatId = chatId => {\n  const store = getChatStore(chatId);\n  const state = getChatState(chatId);\n  const [chatIdStore] = Hooks.useBehaviorSubject(store);\n  const [chatIdState] = Hooks.useBehaviorSubject(state);\n  const chatFromChats = Hooks.useBehaviorSubjectMap(State.store.chatsStore, React.useCallback(chats => chats?.find(chat => String(chat?.id ?? chat?.chatId) === String(chatId)) ?? null, [chatId]));\n  React.useEffect(() => {\n    if (chatId != null) {\n      loadChat(chatId);\n    }\n  }, [chatId]);\n  const chat = React.useMemo(() => !!chatIdState || !!chatIdStore || !!chatFromChats ? {\n    ...(chatFromChats ?? {}),\n    ...(chatIdStore ?? {}),\n    ...(chatIdState ?? {})\n  } : null, [chatIdState, chatIdStore, chatFromChats]);\n  return chat;\n};\nfunction addMessage(chatId, message, messageId) {\n  const store = getChatStore(chatId);\n  let hasMessage = false;\n  const messages = (store.value?.messages ?? []).filter(m => messageId == null || m.id !== messageId).map(m => {\n    if (m.id === message.id) {\n      hasMessage = true;\n      return {\n        ...m,\n        ...message,\n        gift: message?.gift ?? m?.gift ?? null,\n        tmpId: message?.tmpId ?? m?.tmpId ?? m?.id ?? messageId ?? message?.id,\n        id: messageId ?? message.id ?? m.id\n      };\n    }\n    return m;\n  });\n  store.next({\n    ...(store.value ?? {}),\n    messages: hasMessage ? messages : [{\n      ...message,\n      tmpId: message?.tmpId ?? messageId ?? message?.id,\n      id: messageId ?? message.id\n    }, ...messages]\n  });\n}\nfunction attachGiftToMessage(gift) {\n  const chatId = gift?.chatId;\n  const messageId = gift?.messageId;\n  if (!chatId || !messageId) return false;\n  const store = getChatStore(chatId);\n  const messages = store.value?.messages ?? [];\n  let hasMessage = false;\n  const updatedMessages = messages.map(message => {\n    if (message.id !== messageId && message.messageId !== messageId) {\n      return message;\n    }\n    hasMessage = true;\n    return {\n      ...message,\n      gift,\n      text: message.text ?? gift.text ?? ''\n    };\n  });\n  if (hasMessage) {\n    store.next({\n      ...(store.value ?? {}),\n      messages: updatedMessages\n    });\n    return true;\n  }\n  addMessage(chatId, {\n    id: messageId,\n    chatId,\n    type: 'message',\n    fromUserId: gift.senderId,\n    isRead: false,\n    time: gift.created ?? new Date().toISOString(),\n    text: gift.text ?? '',\n    gift,\n    media: [],\n    files: []\n  }, messageId);\n  return true;\n}\nconst sendMessage = _async(function (payload, messageText, chatId, replyToMessage, user, confirm, source) {\n  let _exit38 = false;\n  messageText = messageText?.trim() || '';\n  const payloadText = payload?.text?.trim() || '';\n  const text = payloadText || messageText;\n  const userId = user?.user?.id;\n  let attachments = payload?.attachments ?? [];\n  const hasVideo = attachments?.some(a => a?.type === 'video');\n  const messageType = !!attachments?.length ? hasVideo ? 'video' : 'photo' : 'text';\n  attachments = attachments.map(a => {\n    return {\n      ...a,\n      type: a.type || 'image',\n      url: a.uri\n    };\n  });\n  if (!text && attachments.length === 0) {\n    return;\n  }\n  const existingMessageId = payload?.existingMessageId;\n  const replyToMessageId = payload?.replyToMessageId;\n  const messageId = existingMessageId || String(`msg_${Date.now()}_${Math.random().toString(36).slice(2)}`);\n  const replyToPayload = replyToMessage && replyToMessageId && {\n    messageId: replyToMessageId,\n    tmpId: messageId,\n    text: replyToMessage?.text || '',\n    authorName: replyToMessage?.authorName || ''\n  };\n\n  // Первое сообщение: нет chatId, есть userIdFromFeed — сначала модалка оплаты, затем invite\n  return _invoke(function () {\n    if (!chatId && userId) {\n      const limits = State.api.limits.getLimits();\n      const remainingSpins = Math.max(0, limits?.freeMessages ?? 0);\n      const hasSpins = remainingSpins > 0;\n      const hasSubscription = !!State.state.session.value?.subscription?.hasSubscription;\n      return _invoke(function () {\n        if (!hasSpins) {\n          const balance = State.state.session.value?.ballance?.amount ?? 0;\n          if (balance < (State?.state?.session?.value?.settings?.firstMessagePrice ?? 75)) {\n            _exit38 = true;\n            return 'insufficientBalance'; // TODO: extract modal into the service\n          }\n          return _call(confirm, function (confirmed) {\n            if (confirmed !== true) {\n              _exit38 = true;\n            }\n          }); // TODO: extract modal into the service\n        }\n      }, function (_result60) {\n        let _exit39 = false;\n        if (_exit38) return _result60;\n        return _continue(_finallyRethrows(function () {\n          return _catch(function () {\n            State.store.isSendingHello.next(true);\n            return _await(apiInviteMessage(userId, text, messageId, {\n              ...Analytics.getGlobalParams(),\n              analytics_event: 'message_sent',\n              message_format: messageType,\n              is_paid: !hasSpins,\n              chat_surface_page: source ?? 'chat_list',\n              ...(messageType === 'text' ? {\n                char_count: text.length\n              } : {})\n            }), function (res) {\n              const inviteCancelled = res?.cancelled === true || res?.cancelled === 'true';\n              if (inviteCancelled) {\n                _exit38 = true;\n                return;\n              }\n              if (hasSubscription && remainingSpins === 1) {\n                State.anals.next({\n                  name: 'premium_action',\n                  data: {\n                    limit_type_hit: 'first_message'\n                  }\n                });\n              }\n              return _await(new Promise(r => setTimeout(r, 1000)), function () {\n                return _await(loadCheckConversation(userId), function (_loadCheckConversatio) {\n                  chatId = _loadCheckConversatio;\n                  if (!!chatId) {\n                    State.api?.chat?.loadChats?.(true);\n                  }\n                  const _chatId = !!chatId;\n                  _exit38 = true;\n                  return _chatId;\n                });\n              });\n            });\n          }, function (error) {\n            console.log(error);\n          });\n        }, function (_wasThrown22, _result61) {\n          State.store.isSendingHello.next(false);\n          return _rethrow(_wasThrown22, _result61);\n        }), function (_result61) {\n          if (_exit39) return _result61;\n          _exit38 = true;\n        });\n      });\n    }\n  }, function (_result62) {\n    if (_exit38) return _result62;\n    if (!chatId) return;\n\n    // TODO: return function for the following code\n    const message = {\n      id: messageId,\n      tmpId: messageId,\n      chatId: chatId,\n      type: 'message',\n      fromUserId: State.state.session.value?.user?.id,\n      isRead: false,\n      sendStatus: 'sending',\n      time: new Date().toISOString(),\n      text: text || undefined,\n      gift: null,\n      media: [],\n      files: [],\n      attachments: !!attachments?.length ? attachments : undefined,\n      retryPayload: {\n        text: text || undefined,\n        attachments: attachments,\n        replyToMessageId: replyToMessageId || undefined\n      },\n      replyTo: replyToPayload || undefined\n    };\n    addMessage(chatId, message);\n    let serverMessageId = messageId;\n    const messageSentAnalytics = {\n      ...Analytics.getGlobalParams(),\n      analytics_event: 'message_sent',\n      message_format: messageType,\n      is_paid: false,\n      chat_surface_page: source ?? 'chat_list',\n      ...(messageType === 'text' ? {\n        char_count: text.length\n      } : {})\n    };\n    try {\n      const send = _async(function () {\n        return _invokeIgnored(function () {\n          if (attachments.length > 0) {\n            const form = new FormData();\n            form.append('message', text || '');\n            form.append('tmpId', messageId);\n            return _continue(_forTo(attachments, function (i) {\n              const attachment = attachments[i];\n              let localUri = attachment.uri;\n              const localUriRaw = attachment.uri;\n              if (!localUri) return;\n              const isVideo = attachment.type === 'video';\n              const ext = isVideo ? /\\.mov(\\?|$)/i.test(localUri) ? 'mov' : 'mp4' : 'jpg';\n              let mime = isVideo ? ext === 'mov' ? 'video/quicktime' : 'video/mp4' : 'image/jpeg';\n              let name = `${isVideo ? 'video' : 'image'}_${i}_${Date.now()}.${ext}`;\n              const isImage = mime?.startsWith('image/');\n              return _invoke(function () {\n                if (isImage) {\n                  return _await(Utils.compressLargeImage(localUri, 1024), function (_Utils$compressLargeI) {\n                    localUri = _Utils$compressLargeI;\n                    return _await(Utils.generateThumbhash(localUri), function (hash) {\n                      form.append(\"hash_\" + i, hash);\n                      attachment.hash = hash;\n                      addMessage(chatId, message);\n                    });\n                  });\n                } else return _invokeIgnored(function () {\n                  if (isVideo) {\n                    return _await(Utils.preprocessVideoForUpload?.(localUri, {\n                      maxBytes: 10 * 1024 * 1024,\n                      onProgress: progress => console.log(progress)\n                    }), function (preprocess) {\n                      localUri = preprocess?.uri ?? localUri;\n                      name = preprocess?.name ?? name;\n                      mime = preprocess?.mimeType ?? mime;\n                    });\n                  }\n                });\n              }, function () {\n                return _await(Utils.buildFormFile(localUri, name, mime), function (file) {\n                  if (file) {\n                    if (typeof Blob !== 'undefined' && file instanceof Blob) {\n                      form.append('files', file, name);\n                    } else {\n                      form.append('files', file);\n                    }\n                  }\n                });\n              });\n            }), function () {\n              const url = `${CHAT_API}/message/${chatId}/media`;\n              return _await(State.post(url, form, 'json', undefined, messageId, {\n                analytics: messageSentAnalytics\n              }), function (mediaRes) {\n                serverMessageId = mediaRes?.messageId;\n              });\n            });\n          } else {\n            const url = `${CHAT_API}/${chatId}/message`;\n            return _await(State.post(url, {\n              tmpId: messageId,\n              text: text || '',\n              draft: false,\n              ...(replyToMessageId ? {\n                replyToMessageId\n              } : {})\n            }, 'json', undefined, undefined, {\n              analytics: messageSentAnalytics\n            }), function (res) {\n              serverMessageId = res?.messageId ?? res?.id;\n            });\n          }\n        });\n      });\n      send().then(() => {\n        message.sendStatus = 'sent';\n        addMessage(chatId, message, serverMessageId);\n      }).catch(error => {\n        if (message) {\n          message.sendStatus = 'failed';\n          addMessage(chatId, message, serverMessageId);\n        }\n        console.error(error); // TODO: mark message as errored\n      });\n      return true;\n    } catch (error) {\n      console.error(error);\n      return false;\n    }\n  });\n});\nconst deleteMessages = _async(function (chatId, ids) {\n  let _exit40 = false;\n  return _continue(_catch(function () {\n    return _await(apiDeleteMessages(chatId, ids), function (res) {\n      const removed = new Set(res?.ok ?? []);\n      const store = getChatStore(chatId);\n      store.next({\n        ...(store.value ?? {}),\n        messages: (store.value?.messages ?? []).filter(message => !removed.has(message.id))\n      });\n      _exit40 = true;\n      return true;\n    });\n  }, function (error) {\n    console.error(error);\n  }), function (_result63) {\n    return _exit40 ? _result63 : false;\n  });\n});\nconst markRead = function (chatId) {\n  // try {\n  //   const res = await apiCancelDeleteChat(chatId);\n  //   return true;\n  // } catch (error) {\n  //   console.error(error);\n  // }\n\n  return _await(false);\n};\nconst deleteChatConversation = chatId => {\n  if (chatId != null) {\n    const store = getChatStore(chatId);\n    const state = getChatState(chatId);\n    const storeConverstaion = State.store.chatConverstaionStore;\n    const stateConverstaion = State.store.chatConverstaionState;\n    const userId = state.value?.userId ?? store.value?.userId ?? Object.keys(stateConverstaion.value ?? {}).find(userId => stateConverstaion.value?.[userId]?.chatId === chatId) ?? Object.keys(storeConverstaion.value ?? {}).find(userId => storeConverstaion.value?.[userId]?.chatId === chatId);\n    if (userId != null) {\n      const {\n        storeSet,\n        stateSet\n      } = setGetCheckConversation(userId);\n      storeSet(null);\n      stateSet(null);\n    }\n    store.next(null);\n    state.next(null);\n  }\n};\nfunction normalizeMessageTimestamp(value) {\n  if (value == null) return new Date().toISOString();\n  if (typeof value === 'number') {\n    const ms = value < 1e12 ? value * 1000 : value;\n    return new Date(ms).toISOString();\n  }\n  if (typeof value !== 'string') return new Date().toISOString();\n  const s = String(value).trim();\n  if (!s) return new Date().toISOString();\n  const hasNoTz = !/Z|[+-]\\d{2}:?\\d{2}$/.test(s);\n  const isoLike = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(s);\n  const spaceLike = /^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}/.test(s);\n  if (hasNoTz && (isoLike || spaceLike)) {\n    const forParse = spaceLike ? s.replace(/^(\\d{4}-\\d{2}-\\d{2})\\s+/, '$1T') : s;\n    return new Date(forParse + 'Z').toISOString();\n  }\n  const d = new Date(s);\n  return Number.isNaN(d.getTime()) ? new Date().toISOString() : d.toISOString();\n}\nconst chatRoomService = {\n  api: {\n    name: 'chatRoom',\n    loadMessages,\n    sendMessage,\n    attachGiftToMessage,\n    deleteMessages,\n    deleteChatConversation,\n    markRead,\n    useChat(id, userId) {\n      const chatIdByUserId = useChatIdByUserId(userId);\n      id = id ?? chatIdByUserId;\n      const chatByChatId = useChatByChatId(id);\n      const store = getChatStore(id);\n      const state = getChatState(id);\n      const [chatStore] = Hooks.useBehaviorSubject(store);\n      const [chatState] = Hooks.useBehaviorSubject(state);\n      const messages = React.useMemo(() => {\n        return chatStore?.messages?.map(message => ({\n          ...message,\n          timestamp: normalizeMessageTimestamp(message.time)\n        }));\n      }, [chatStore?.messages]);\n      return {\n        id,\n        ...chatByChatId,\n        ...chatStore,\n        ...chatState,\n        messages\n      };\n    }\n  },\n  use() {\n    const currentUserId = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.user?.id, []));\n    State.useSocket('chat:message', React.useCallback(data => {\n      const chatId = data?.chatId ?? data?.chat?.id;\n      if (!chatId) return;\n      const messageId = data?.messageId ?? data?.id ?? data?.lastReadMessageId;\n      if (!messageId) return;\n      const senderId = data?.fromUserId ?? data?.senderId ?? data?.from?.id ?? data?.userId;\n      if (data?.tmpId != null) {\n        const store = getChatStore(chatId);\n        const hasMessage = (store.value?.messages ?? []).some(m => m.id === data?.tmpId);\n        if (hasMessage) {\n          return;\n        }\n      }\n      const store = getChatStore(chatId);\n      let isNew = senderId !== currentUserId;\n      const message = {\n        ...data,\n        gift: data?.gift ?? null\n      };\n      addMessage(chatId, message, messageId);\n      if (isNew) {\n        State.bus.chatMessage.next(message);\n      }\n    }, [currentUserId]));\n    State.useSocket('gift:received', React.useCallback(payload => {\n      const gift = payload?.gift ?? payload;\n      attachGiftToMessage(gift);\n    }, []));\n    State.useSocket('chat:reads', React.useCallback(data => {\n      for (const event of data) {\n        const chatId = event?.chatId;\n        if (!chatId) return;\n        const messageId = event?.messageId;\n        if (!messageId) return;\n        const store = getChatStore(chatId);\n        store.next({\n          ...(store.value ?? {}),\n          messages: store.value?.messages?.map(message => {\n            if (message.id === messageId) {\n              return {\n                ...message,\n                isRead: true\n              };\n            }\n            return message;\n          })\n        });\n      }\n    }, []));\n    State.useSocket('chat:deleted', React.useCallback(data => {\n      const chatId = data?.chatId ?? data?.chat?.id;\n      const store = getChatStore(chatId);\n      if (!!data?.deleted) {\n        store.next({\n          ...(store.value ?? {}),\n          isDeleted: true\n        });\n      }\n    }, []));\n  },\n  subs() {\n    return Rx.combineLatest([State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.pairwise(), Rx.tap(([prevUserId, nextUserId]) => {\n      if (prevUserId !== nextUserId && nextUserId == null) {\n        State.store.chatConverstaionStore.next({});\n        State.store.chatConverstaionState.next({});\n      }\n    }))\n    // State.state.isConnected.pipe(\n    //   Rx.filter(Boolean),\n    //   Rx.distinctUntilChanged(),\n    //   Rx.tap(() => {\n    //     State.bus.updateMessages.next(true);\n    //   }),\n    // ),\n    ]);\n  }\n};\n\n/* === Inlined module: services/chatMessage.jsx === */\nconst chatMessageService = {\n  api: {\n    name: 'chatMessage',\n    useChatMessage(key) {\n      const [messages] = Hooks.useBehaviorSubject(State.store.chatMessageState);\n      return messages?.[key] ?? '';\n    },\n    useChatAttachments(key) {\n      const [attachments] = Hooks.useBehaviorSubject(State.store.chatAttachmentsState);\n      return attachments?.[key] ?? [];\n    },\n    getChatMessage(key) {\n      return State.store.chatMessageState.value?.[key] ?? '';\n    },\n    setChatMessage(key, text) {\n      if (key == null) return;\n      State.store.chatMessageState.next({\n        ...(State.store.chatMessageState.value ?? {}),\n        [key]: text\n      });\n    },\n    setChatAttachments(key, attachments) {\n      if (key == null) return;\n      State.store.chatAttachmentsState.next({\n        ...(State.store.chatAttachmentsState.value ?? {}),\n        [key]: attachments ?? []\n      });\n    },\n    cleanChatMessage(key) {\n      if (key == null) return;\n      const current = State.store.chatMessageState.value ?? {};\n      if (!(key in current)) return;\n      const next = {\n        ...current\n      };\n      delete next[key];\n      State.store.chatMessageState.next(next);\n    },\n    cleanChatAttachments(key) {\n      if (key == null) return;\n      const current = State.store.chatAttachmentsState.value ?? {};\n      if (!(key in current)) return;\n      const next = {\n        ...current\n      };\n      delete next[key];\n      State.store.chatAttachmentsState.next(next);\n    }\n  },\n  use() {\n    // no-op\n  },\n  subs() {\n    return State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(userId => {\n      if (userId == null) {\n        State.store.chatMessageState.next({});\n        State.store.chatAttachmentsState.next({});\n      }\n    }));\n  }\n};\n\n/* === Inlined module: services/users.jsx === */\nconst PROFILE_MODAL_API = '/api/feed/profile';\nconst isApprovedProfile = meta => {\n  const card = meta?.card;\n  if (!card) return false;\n  return card.verificationStatus === 'APPROVED' || card.hasVerifiedSnapshot === true;\n};\nconst sanitizeMeta = meta => {\n  if (!meta || isApprovedProfile(meta)) return meta;\n  return {\n    ...meta,\n    user: meta.user ? {\n      ...meta.user,\n      username: ''\n    } : meta.user,\n    card: meta.card ? {\n      ...meta.card,\n      country: '',\n      sex: '',\n      age: undefined,\n      birthdate: undefined,\n      about: '',\n      tags: []\n    } : meta.card,\n    photos: [],\n    status: undefined,\n    subscription: undefined\n  };\n};\nconst emptyProfileMeta = userId => ({\n  user: {\n    id: userId,\n    username: ''\n  },\n  card: {\n    userId,\n    verificationStatus: 'PENDING',\n    country: '',\n    sex: '',\n    about: '',\n    tags: []\n  },\n  photos: []\n});\nconst setUser = (userId, value) => {\n  const sanitizedValue = sanitizeMeta(value);\n  State.store.usersMap.next({\n    ...(State.store.usersMap.value ?? {}),\n    [userId]: sanitizedValue\n  });\n  State.store.usersMapStore.next({\n    ...(State.store.usersMapStore.value ?? {}),\n    [userId]: sanitizedValue\n  });\n};\nconst USERS_PAGE_SIZE = 20;\nconst isLoadingUsersMap = new Set();\nconst resetUsersState = () => {\n  State.store.usersMap.next({});\n  State.store.usersMapStore.next({});\n  isLoadingUsersMap.clear();\n};\nconst usersService = {\n  api: {\n    name: \"users\",\n    setUser,\n    sanitizeMeta,\n    isApprovedProfile,\n    emptyProfileMeta,\n    loadUser: function (userId) {\n      return _await(apiUsers([userId]), function (result) {\n        return result?.find(i => String(i?.user?.id) === String(userId)) ?? emptyProfileMeta(userId);\n      });\n    },\n    useSetUser: meta => {\n      React.useEffect(() => {\n        const userId = meta?.user?.id;\n        if (userId == null) return;\n        if (State.store.usersMap.value?.[userId] === meta) return;\n        if (State.store.usersMapStore.value?.[userId] === meta) return;\n        setUser(userId, meta);\n      }, [meta]);\n    },\n    useUser: userId => {\n      const userLoaded = Hooks.useBehaviorSubjectMap(State.store.usersMap, React.useCallback(m => m?.[userId], [userId]));\n      const user = Hooks.useBehaviorSubjectMap(State.store.usersMapStore, React.useCallback(m => m?.[userId], [userId]));\n      React.useEffect(() => {\n        if (State.store.usersMap.value?.[userId] == null && !isLoadingUsersMap.has(userId)) {\n          isLoadingUsersMap.add(userId);\n          State.bus.userIdsToLoad.next(userId);\n        }\n      }, [userId]);\n      return userLoaded ?? user;\n    }\n  },\n  subs: () => {\n    return Rx.combineLatest([State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(() => {\n      resetUsersState();\n    })), State.bus.userIdsToLoad.pipe(Rx.bufferTime(1000, null, USERS_PAGE_SIZE), Rx.filter(ids => ids.length > 0), Rx.tap(_async(function (ids) {\n      ids = [...new Set([...ids].filter(Boolean))];\n      return _continueIgnored(_finallyRethrows(function () {\n        return _catch(function () {\n          return _await(apiUsers(ids), function (result) {\n            for (const id of ids) {\n              const item = result?.find(i => String(i?.user?.id) === String(id)) ?? emptyProfileMeta(id);\n              setUser(id, item);\n            }\n          });\n        }, function (error) {\n          console.error(error);\n        });\n      }, function (_wasThrown23, _result64) {\n        for (const id of ids) {\n          isLoadingUsersMap.delete(id);\n        }\n        return _rethrow(_wasThrown23, _result64);\n      }));\n    })))]);\n  }\n};\n\n/* === Inlined module: services/limits.jsx === */\nconst loadLimits = _async(function () {\n  return _continueIgnored(_catch(function () {\n    return _invokeIgnored(function () {\n      if (State.state.session.value?.user?.id) {\n        return _await(State.post(\"/api/payment/limits\", {}, 'json'), function (limits) {\n          State.store.limits.next(limits);\n        });\n      }\n    });\n  }, function (error) {\n    console.error(error);\n  }));\n});\nconst limitsService = {\n  api: {\n    name: 'limits',\n    loadLimits() {\n      State.bus.updateLimits?.next(true);\n    },\n    // const limits = State.api.limits.useLimits();\n    useLimits() {\n      const [limits] = Hooks.useBehaviorSubject(State.store.limits);\n      return limits;\n    },\n    getLimits() {\n      return State.store.limits.value;\n    }\n  },\n  init() {\n    loadLimits();\n  },\n  use() {\n    State.useSocket('on:limits', limits => {\n      State.store.limits.next(limits);\n    });\n  },\n  subs() {\n    return Rx.combineLatest([State.state.isConnected.pipe(Rx.distinctUntilChanged(), Rx.debounceTime(100), Rx.tap(_async(function (isConnected) {\n      if (isConnected) {\n        State.bus.updateLimits.next(true);\n      }\n      return _await();\n    }))), State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(userId => {\n      if (userId != null) {\n        State.bus.updateLimits.next(true);\n      }\n    })), State.state.session.pipe(Rx.map(session => session?.subscription?.hasSubscription), Rx.distinctUntilChanged(), Rx.debounceTime(100), Rx.tap(() => {\n      State.bus.updateLimits.next(true);\n    })), State.bus.updateLimits.pipe(Rx.debounceTime(1000), Rx.tap(() => {\n      loadLimits();\n    }))]);\n  }\n};\n\n/* === Inlined module: services/status.jsx === */\nconst loadStatus = _async(function () {\n  return _continueIgnored(_catch(function () {\n    return _invokeIgnored(function () {\n      if (State.state.session.value?.user?.id) {\n        return _await(State.post(\"/api/payment/status\", {}, 'json'), function (status) {\n          State.store.statusStore.next(status);\n        });\n      }\n    });\n  }, function (error) {\n    console.error(error);\n  }));\n});\nconst statusService = {\n  api: {\n    name: 'status',\n    loadStatus() {\n      State.bus.updateStatus?.next(true);\n    },\n    // const status = State.api.status.useStatus();\n    useStatus() {\n      const [status] = Hooks.useBehaviorSubject(State.store.statusStore);\n      return status;\n    },\n    getStatus() {\n      return State.store.statusStore.value;\n    }\n  },\n  init() {\n    loadStatus();\n  },\n  use() {\n    State.useSocket('status', data => {\n      State.store.statusStore.next(data?.status);\n    });\n  },\n  subs() {\n    return Rx.combineLatest([State.state.isConnected.pipe(Rx.distinctUntilChanged(), Rx.debounceTime(100), Rx.tap(_async(function (isConnected) {\n      if (isConnected) {\n        State.bus.updateStatus.next(true);\n      }\n      return _await();\n    }))), State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(userId => {\n      if (userId != null) {\n        State.bus.updateStatus.next(true);\n      }\n    })), State.bus.updateStatus.pipe(Rx.debounceTime(1000), Rx.tap(() => {\n      loadStatus();\n    }))]);\n  }\n};\n\n/* === Inlined module: services/products.jsx === */\nconst loadProducts = _async(function () {\n  return _continueIgnored(_catch(function () {\n    return _invokeIgnored(function () {\n      if (State.state.session.value?.user?.id) {\n        return _await(State.post(\"/api/payment/store/products\", {}, 'json'), function (products) {\n          State.store.productsStore.next(products);\n        });\n      }\n    });\n  }, function (error) {\n    console.error(error);\n  }));\n});\nconst productsService = {\n  api: {\n    name: 'products',\n    loadProducts() {\n      State.bus.updateProducts?.next(true);\n    },\n    // const products = State.api.products.useProducts();\n    useProducts() {\n      const [products] = Hooks.useBehaviorSubject(State.store.productsStore);\n      React.useEffect(() => {\n        State.bus.updateProducts?.next(true);\n      }, []);\n      return products ?? [];\n    },\n    getProducts() {\n      return State.store.productsStore.value;\n    }\n  },\n  init() {\n    loadProducts();\n  },\n  subs() {\n    return Rx.combineLatest([State.state.isConnected.pipe(Rx.distinctUntilChanged(), Rx.debounceTime(100), Rx.tap(_async(function (isConnected) {\n      if (isConnected) {\n        State.bus.updateProducts.next(true);\n      }\n      return _await();\n    }))), State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(userId => {\n      State.bus.updateProducts.next(true);\n    })), State.bus.updateProducts.pipe(Rx.debounceTime(1000), Rx.tap(() => {\n      loadProducts();\n    }))]);\n  }\n};\n\n/* === Inlined module: services/profile.jsx === */\nconst profileService = {\n  api: {\n    name: 'profile',\n    update: _async(function (data, analytics) {\n      return _await(State.post('/api/login/profile', data, 'json', undefined, undefined, analytics ? {\n        analytics\n      } : undefined), function ({\n        card\n      }) {\n        State.state.session.next({\n          ...State.state.session.value,\n          card\n        });\n        return card;\n      });\n    })\n  }\n};\n\n/* === Inlined module: services/session.jsx === */\nconst sessionService = {\n  subs() {\n    const trafficAttributionKeys = ['trafficSource', 'custom_campaign_id', 'custom_adset', 'custom_ad'];\n    return State.state.session.pipe(Rx.map(session => session?.userConnection), Rx.distinctUntilChanged((prev, next) => prev?.type === next?.type && prev?.key === next?.key && trafficAttributionKeys.every(key => prev?.meta?.[key] === next?.meta?.[key])), Rx.switchMap(userConnection => {\n      if (!userConnection) return Rx.of(null);\n\n      // AppsFlyer install data can arrive after SSUI and the session are ready.\n      return Rx.timer(0, 1000).pipe(Rx.take(4), Rx.exhaustMap(_async(function () {\n        const attribution = Analytics.getTrafficAttribution();\n        const hasMissingAttribution = trafficAttributionKeys.some(key => attribution[key] && !(key === 'trafficSource' && attribution[key] === 'organic') && !userConnection.meta?.[key]);\n        return hasMissingAttribution ? _catch(function () {\n          return _await(State.post('/api/login/meta/traffic-source', attribution), function (response) {\n            if (!response?.userConnection) return null;\n            State.state.session.next({\n              ...State.state.session.value,\n              userConnection: response.userConnection\n            });\n            return response;\n          });\n        }, function (error) {\n          console.error(error);\n          return null;\n        }) : null;\n      })));\n    }));\n  },\n  api: {\n    name: 'session',\n    loadSession() {\n      State.bus.updateSession?.next(true);\n    },\n    // const session = State.api?.session?.useSession?.();\n    useSession() {\n      const [sessionRaw] = Hooks.useBehaviorSubject(State.state.session);\n      const hasSubscription = !!sessionRaw?.subscription?.hasSubscription;\n      const ballance = !!sessionRaw?.ballance?.amount;\n      const status = State.api.status?.useStatus?.();\n      const limits = State.api.limits.useLimits();\n      const session = React.useMemo(() => ({\n        ...sessionRaw,\n        status,\n        limits\n      }), [sessionRaw, hasSubscription, ballance, status, limits]);\n      return session;\n    },\n    getSession() {\n      const status = State.api.status?.getStatus?.();\n      return State.store.sessionStore.value ? {\n        ...State.store.sessionStore.value,\n        status\n      } : null;\n    }\n  }\n};\n\n/* === Inlined module: services/history.jsx === */\nconst CALL_HISTORY_PAGE_SIZE = 10;\nconst normalizeCallHistoryResponse = response => {\n  if (Array.isArray(response)) return response;\n  if (Array.isArray(response?.data)) return response.data;\n  return [];\n};\nconst loadCallHistory = _async(function ({\n  limit = CALL_HISTORY_PAGE_SIZE,\n  offset = 0\n} = {}) {\n  if (State.store.callHistoryLoading.value) {\n    return State.store.callHistory.value ?? [];\n  }\n  State.store.callHistoryLoading.next(true);\n  State.store.callHistoryError.next(null);\n  return _finallyRethrows(function () {\n    return _catch(function () {\n      return _await(State.get(`/api/login/call-history?limit=${limit}&offset=${offset}`, 'json'), function (response) {\n        const items = normalizeCallHistoryResponse(response);\n        State.store.callHistory.next(items);\n        State.store.callHistoryLoaded.next(true);\n        return items;\n      });\n    }, function (error) {\n      console.error('[historyService] Failed to load call history:', error);\n      State.store.callHistory.next([]);\n      State.store.callHistoryError.next(error?.message ?? true);\n      return [];\n    });\n  }, function (_wasThrown24, _result65) {\n    State.store.callHistoryLoading.next(false);\n    return _rethrow(_wasThrown24, _result65);\n  });\n});\nconst historyService = {\n  name: 'historyService',\n  api: {\n    name: 'history',\n    loadCallHistory,\n    useCallHistory: () => {\n      const [items] = Hooks.useBehaviorSubject(State.store.callHistory);\n      const [isLoading] = Hooks.useBehaviorSubject(State.store.callHistoryLoading);\n      const [error] = Hooks.useBehaviorSubject(State.store.callHistoryError);\n      React.useEffect(() => {\n        loadCallHistory();\n      }, []);\n      return [items ?? [], isLoading ?? true, error];\n    }\n  }\n};\n\n/* === Inlined module: services/snack.jsx === */\nconst ProfileVerificationToast = ({\n  verificationStatus,\n  hasVerifiedSnapshot\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const isApproved = verificationStatus === 'APPROVED';\n  const Icon = isApproved ? Assets.Done : Assets.ExclamationDown;\n  const rejectedLocalePrefix = hasVerifiedSnapshot ? 'lvs_secondary' : 'lvs_primary';\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 8,\n      width: 280,\n      maxWidth: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Icon, {\n    style: {\n      color: isApproved ? theme.theme.component.toast.positive.content : theme.theme.semantic.content.dangerous.content1\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700\n    }\n  }, isApproved ? t('profileReviewApprovedTitle') : t(`${rejectedLocalePrefix}_rejected_header`)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentSecondary,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 500\n    }\n  }, isApproved ? t('profileReviewApprovedDesc') : t(`${rejectedLocalePrefix}_rejected_desc`))));\n};\nconst snackService = {\n  name: 'snackService',\n  subs() {\n    return State.bus.profileVerification.pipe(Rx.tap(verificationStatus => {\n      const session = State.state.session.value;\n      const hasVerifiedSnapshot = typeof session?.card?.hasVerifiedSnapshot === 'boolean' ? session.card.hasVerifiedSnapshot : (session?.photos ?? []).some(photo => photo?.verificationStatus === 'APPROVED');\n      Notification.showNotification({\n        key: 'profileVerificationNotification',\n        children: /*#__PURE__*/React.createElement(ProfileVerificationToast, {\n          verificationStatus: verificationStatus,\n          hasVerifiedSnapshot: hasVerifiedSnapshot\n        }),\n        duration: 5000\n      });\n    }));\n  }\n};\n\n/* === Inlined module: services/rateUs.jsx === */\nconst RATE_US_PENDING_KEY = 'rate_us_pending_after_first_video_chat';\nconst RATE_US_SHOWN_KEY = 'rate_us_shown_once';\nconst MIN_VISIBLE_VIDEO_CHAT_MS = 5000;\nlet pendingAfterVideoChat = false;\nlet shownOnce = false;\nlet isShowing = false;\nlet visibleVideoChatTimer = null;\nconst isAndroid = () => ReactNative.Platform.OS === 'android';\nconst markShown = _async(function () {\n  shownOnce = true;\n  pendingAfterVideoChat = false;\n  return _awaitIgnored(Promise.all([Storage.setValue(RATE_US_SHOWN_KEY, true), Storage.setValue(RATE_US_PENDING_KEY, false)]));\n});\nconst markPending = _async(function () {\n  if (shownOnce || pendingAfterVideoChat) return;\n  pendingAfterVideoChat = true;\n  return _awaitIgnored(Storage.setValue(RATE_US_PENDING_KEY, true));\n});\nconst clearVisibleVideoChatTimer = () => {\n  if (visibleVideoChatTimer == null) return;\n  clearTimeout(visibleVideoChatTimer);\n  visibleVideoChatTimer = null;\n};\nconst scheduleVisibleVideoChatPending = () => {\n  if (shownOnce || pendingAfterVideoChat || visibleVideoChatTimer != null) return;\n  visibleVideoChatTimer = setTimeout(_async(function () {\n    visibleVideoChatTimer = null;\n    if (!State.state.peerCallStream.value) return;\n    return _callIgnored(markPending);\n  }), MIN_VISIBLE_VIDEO_CHAT_MS);\n};\nconst canShowRateUs = () => {\n  if (!isAndroid()) return false;\n  if (shownOnce || isShowing) return false;\n  if (!pendingAfterVideoChat) return false;\n  if (State.state.isPip.value || State.state.isPipLocal.value) return false;\n  return true;\n};\nconst showRateUsIfNeeded = _async(function () {\n  if (!canShowRateUs()) return;\n  isShowing = true;\n  return _call(markShown, function () {\n    return _continueIgnored(_finallyRethrows(function () {\n      return _awaitIgnored(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"RateUsModal\"\n      }), {\n        theme: Theme.isDark.value ? 'dark' : 'light',\n        props: {\n          holderMode: true,\n          dark: true,\n          lightBottom: false,\n          swipeUp: false,\n          swipeDismissibleUp: false,\n          style: {\n            maxWidth: 600,\n            overflow: 'visible'\n          },\n          sheetStyle: {\n            backgroundColor: 'transparent'\n          },\n          contentStyle: {\n            overflow: 'hidden'\n          }\n        }\n      }));\n    }, function (_wasThrown25, _result66) {\n      isShowing = false;\n      return _rethrow(_wasThrown25, _result66);\n    }));\n  });\n});\nconst rateUsService = {\n  name: 'rateUsService',\n  init: _async(function () {\n    if (!isAndroid()) return;\n    return _await(Promise.all([Storage.getValue(RATE_US_PENDING_KEY), Storage.getValue(RATE_US_SHOWN_KEY)]), function ([pending, shown]) {\n      pendingAfterVideoChat = !!pending;\n      shownOnce = !!shown;\n    });\n  }),\n  subs() {\n    if (!isAndroid()) return Rx.of(null);\n    return Rx.combineLatest([State.state.isSearching, State.state.isInQueue, State.state.call, State.state.peerCallStream, State.state.isPip, State.state.isPipLocal]).pipe(Rx.map(([isSearching, isInQueue, call, peerCallStream, isPip, isPipLocal]) => ({\n      hasVisiblePeerStream: !!peerCallStream,\n      isVideoChatActive: !!isSearching || !!isInQueue || !!call,\n      isBlocked: !!isPip || !!isPipLocal\n    })), Rx.distinctUntilChanged((a, b) => a.hasVisiblePeerStream === b.hasVisiblePeerStream && a.isVideoChatActive === b.isVideoChatActive && a.isBlocked === b.isBlocked), Rx.debounceTime(250), Rx.tap(_async(function ({\n      hasVisiblePeerStream,\n      isVideoChatActive,\n      isBlocked\n    }) {\n      if (hasVisiblePeerStream) {\n        scheduleVisibleVideoChatPending();\n        return;\n      }\n      clearVisibleVideoChatTimer();\n      if (isVideoChatActive) return;\n      if (isBlocked) return;\n      return _callIgnored(showRateUsIfNeeded);\n    })));\n  }\n};\n\n/* === Inlined module: services/appUpdate.jsx === */\nlet forceUpdateVisible = false;\nlet softUpdateShownThisLaunch = false;\nlet softUpdateOpen = false;\nlet lastMode = 'off';\nconst APP_UPDATE_CONFIG = {\n  killSwitch: 'auto',\n  // Keep hard/force updates disabled while still allowing the soft update flow.\n  minSupportedVersion: '0.0.0',\n  latestVersion: '4.2.0',\n  storeUrl: 'market://details?id=com.rulettv.app'\n};\nconst normalizeVersion = value => {\n  if (value == null) return null;\n  const parts = String(value).trim().split(/[.+\\-_]/).map(part => {\n    const match = String(part).match(/\\d+/);\n    return match ? Number(match[0]) : 0;\n  });\n  return parts.length ? parts : null;\n};\nconst compareVersions = (left, right) => {\n  const leftParts = normalizeVersion(left);\n  const rightParts = normalizeVersion(right);\n  if (!leftParts || !rightParts) return 0;\n  const length = Math.max(leftParts.length, rightParts.length);\n  for (let i = 0; i < length; i += 1) {\n    const a = leftParts[i] ?? 0;\n    const b = rightParts[i] ?? 0;\n    if (a < b) return -1;\n    if (a > b) return 1;\n  }\n  return 0;\n};\nconst getUpdateMode = ({\n  killSwitch,\n  minSupportedVersion,\n  latestVersion\n}, appVersion) => {\n  if (killSwitch !== 'auto') return 'off';\n  if (!appVersion || appVersion === 'unknown') return 'off';\n  if (minSupportedVersion && compareVersions(appVersion, minSupportedVersion) < 0) {\n    return 'force';\n  }\n  if (latestVersion && compareVersions(appVersion, latestVersion) < 0) {\n    return 'soft';\n  }\n  return 'off';\n};\nconst showForceUpdate = config => {\n  if (forceUpdateVisible) return;\n  forceUpdateVisible = true;\n  State.overpage.next(/*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ForceUpdateScreen\",\n    config: config\n  }));\n};\nconst hideForceUpdate = () => {\n  if (!forceUpdateVisible) return;\n  forceUpdateVisible = false;\n  State.overpage.next(null);\n};\nconst showSoftUpdate = _async(function (config) {\n  if (softUpdateShownThisLaunch || softUpdateOpen) return;\n  softUpdateOpen = true;\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      softUpdateShownThisLaunch = true;\n      return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"UpdateSoftModal\",\n        config: config\n      }), {\n        theme: Theme.isDark.value ? 'dark' : 'light',\n        props: {\n          holderMode: true,\n          dark: true,\n          lightBottom: false,\n          swipeUp: false,\n          swipeDismissibleUp: false,\n          style: {\n            maxWidth: 600,\n            overflow: 'visible'\n          },\n          sheetStyle: {\n            backgroundColor: 'transparent'\n          },\n          contentStyle: {\n            overflow: 'hidden'\n          }\n        }\n      }), function (result) {\n        if (result == null) {\n          State.anals.next({\n            name: 'update_screen_action',\n            data: {\n              action: 'later'\n            }\n          });\n        }\n      });\n    }, function (error) {\n      softUpdateShownThisLaunch = false;\n      console.error('[appUpdate] failed to show soft update', error);\n    });\n  }, function (_wasThrown26, _result67) {\n    softUpdateOpen = false;\n    return _rethrow(_wasThrown26, _result67);\n  }));\n});\nconst checkAppUpdate = _async(function () {\n  const device = State.state.device.value;\n  if (!device || ReactNative.Platform.OS === 'web') {\n    return;\n  }\n  const mode = getUpdateMode(APP_UPDATE_CONFIG, device.version);\n  lastMode = mode;\n  console.log('[appUpdate] check', {\n    version: device.version,\n    minSupportedVersion: APP_UPDATE_CONFIG.minSupportedVersion,\n    latestVersion: APP_UPDATE_CONFIG.latestVersion,\n    mode\n  });\n  if (mode === 'force') {\n    showForceUpdate(APP_UPDATE_CONFIG);\n    return;\n  }\n  hideForceUpdate();\n  return _invokeIgnored(function () {\n    if (mode === 'soft') {\n      return _awaitIgnored(showSoftUpdate(APP_UPDATE_CONFIG));\n    }\n  });\n});\nconst appUpdateService = {\n  name: 'appUpdateService',\n  init() {\n    checkAppUpdate().catch(error => {\n      console.error('[appUpdate] init failed', error);\n    });\n  },\n  api: {\n    name: 'appUpdate',\n    check() {\n      return checkAppUpdate();\n    },\n    getMode() {\n      return lastMode;\n    }\n  },\n  subs() {\n    return Rx.merge(State.state.device.pipe(Rx.map(device => [device?.platform ?? null, device?.version ?? null, device?.buildNumber ?? null].join(':')), Rx.distinctUntilChanged()), State.state.isConnected.pipe(Rx.distinctUntilChanged(), Rx.filter(Boolean)), State.state.appState.pipe(Rx.distinctUntilChanged(), Rx.filter(appState => appState === 'active'))).pipe(Rx.debounceTime(500), Rx.tap(() => {\n      checkAppUpdate().catch(error => {\n        console.error('[appUpdate] check failed', error);\n      });\n    }));\n  }\n};\n\n/* === Inlined module: services/gifts/constants.jsx === */\nconst GIFTS_API_PATH = '/api/payment/gifts';\nconst GIFTS_SEEN_AT_STORAGE_KEY = 'giftsSeenAt';\nconst DEFAULT_MY_GIFTS_TAKE = 50;\nconst SHOWCASE_SLOTS = 3;\nconst emptyCatalog = [];\nconst emptyQuickGifts = [];\nconst emptyShowcase = [];\nconst emptyMyGifts = [];\nconst defaultFlowState = () => ({\n  receiverId: null,\n  entrySource: null,\n  chatId: null,\n  messageId: null,\n  streamRoomId: null,\n  selectedGift: null,\n  message: '',\n  idempotentId: null,\n  returnPoint: null\n});\nconst defaultMyGiftsState = () => ({\n  items: [],\n  skip: 0,\n  take: DEFAULT_MY_GIFTS_TAKE,\n  loading: false\n});\nconst defaultGiftsFromSenderState = () => ({\n  ...defaultMyGiftsState(),\n  sender: null,\n  summary: {\n    totalGifts: null,\n    totalIncomeStars: null,\n    totalIncomeUsd: null\n  }\n});\n\n/* === Inlined module: services/gifts/mappers.jsx === */\nconst normalizeImageUrl = url => {\n  if (!url) return '';\n  if (/^https?:\\/\\//i.test(url)) return url;\n  return State.getUrl(url);\n};\nconst mapCatalogItem = item => {\n  if (!item) return null;\n  return {\n    id: item.id,\n    uid: item.uid,\n    code: item.code,\n    title: item.title,\n    tier: item.tier,\n    priceGems: Number(item.priceGems) || 0,\n    imageUrl: normalizeImageUrl(item.imageUrl),\n    sortOrder: Number(item.sortOrder) || 0,\n    isQuick: !!item.isQuick\n  };\n};\nconst mapGiftItem = item => {\n  if (!item) return null;\n  return {\n    id: item.id,\n    uid: item.uid,\n    catalogId: item.catalogId,\n    paymentId: item.paymentId,\n    senderId: item.senderId,\n    receiverId: item.receiverId,\n    chatId: item.chatId,\n    messageId: item.messageId,\n    text: item.text ?? null,\n    giftCode: item.giftCode,\n    giftTitle: item.giftTitle,\n    giftPriceGems: Number(item.giftPriceGems) || 0,\n    giftImageUrl: normalizeImageUrl(item.giftImageUrl),\n    status: item.status ?? 'sent',\n    created: item.created,\n    sender: item.sender ? {\n      userId: item.sender.userId,\n      name: item.sender.name ?? '',\n      photo: item.sender.photo ?? null,\n      rating: item.sender.rating ?? null,\n      status: item.sender.status ?? null,\n      subscription: item.sender.subscription ?? null\n    } : undefined\n  };\n};\nconst mapGiftSender = sender => {\n  if (!sender) return null;\n  return {\n    userId: sender.userId,\n    name: sender.name ?? '',\n    photo: sender.photo ?? null,\n    rating: sender.rating ?? null,\n    status: sender.status ?? null,\n    subscription: sender.subscription ?? null\n  };\n};\nconst toOptionalNumber = value => {\n  if (value == null) return null;\n  const parsed = Number(value);\n  return Number.isFinite(parsed) ? parsed : null;\n};\nconst mapGiftSenderSummary = summary => ({\n  totalGifts: toOptionalNumber(summary?.totalGifts),\n  totalIncomeStars: toOptionalNumber(summary?.totalIncomeStars),\n  totalIncomeUsd: toOptionalNumber(summary?.totalIncomeUsd)\n});\nconst mapGiftsFromSender = payload => {\n  if (Array.isArray(payload)) {\n    return {\n      sender: null,\n      summary: mapGiftSenderSummary(null),\n      gifts: mapGiftList(payload)\n    };\n  }\n  return {\n    sender: mapGiftSender(payload?.sender),\n    summary: mapGiftSenderSummary(payload?.summary),\n    gifts: mapGiftList(payload?.gifts)\n  };\n};\nconst mapShowcaseItem = item => {\n  if (!item) return null;\n  return {\n    catalogId: item.catalogId,\n    giftCode: item.giftCode,\n    giftTitle: item.giftTitle,\n    giftPriceGems: Number(item.giftPriceGems) || 0,\n    giftImageUrl: normalizeImageUrl(item.giftImageUrl),\n    count: Number(item.count) || 0,\n    totalCount: item.totalCount == null ? null : Number(item.totalCount) || 0\n  };\n};\nconst mapCatalogList = items => Array.isArray(items) ? items.map(mapCatalogItem).filter(Boolean) : [];\nconst mapGiftList = items => Array.isArray(items) ? items.map(mapGiftItem).filter(Boolean) : [];\nconst mapShowcaseList = items => Array.isArray(items) ? items.map(mapShowcaseItem).filter(Boolean) : [];\nconst groupCatalogByTier = items => {\n  const groups = {};\n  for (const item of items ?? []) {\n    const tier = item?.tier || 'default';\n    if (!groups[tier]) groups[tier] = [];\n    groups[tier].push(item);\n  }\n  return groups;\n};\nconst padShowcaseSlots = (items, slots = SHOWCASE_SLOTS) => {\n  const normalized = mapShowcaseList(items);\n  const result = normalized.slice(0, slots);\n  while (result.length < slots) {\n    result.push(null);\n  }\n  return result;\n};\n\n/* === Inlined module: services/gifts/api.jsx === */\nconst fetchCatalogApi = _async(function ({\n  quickOnly = false\n} = {}) {\n  return _await(State.post(`${GIFTS_API_PATH}/catalog`, {\n    quickOnly\n  }, 'json'), mapCatalogList);\n});\nconst fetchQuickGiftsApi = _async(function () {\n  return _await(State.post(`${GIFTS_API_PATH}/catalog/quick`, {}, 'json'), mapCatalogList);\n});\nconst fetchShowcaseTopApi = _async(function (userId) {\n  return _await(State.get(`${GIFTS_API_PATH}/showcase/${encodeURIComponent(userId)}/top`, 'json'), mapShowcaseList);\n});\nconst fetchMyGiftsApi = _async(function ({\n  skip = 0,\n  take = DEFAULT_MY_GIFTS_TAKE\n} = {}) {\n  const query = `?skip=${encodeURIComponent(skip)}&take=${encodeURIComponent(take)}`;\n  return _await(State.get(`${GIFTS_API_PATH}/my-gifts${query}`, 'json'), mapGiftList);\n});\nconst fetchGiftsFromSenderApi = _async(function (senderId, {\n  skip = 0,\n  take = DEFAULT_MY_GIFTS_TAKE\n} = {}) {\n  const query = `?skip=${encodeURIComponent(skip)}&take=${encodeURIComponent(take)}`;\n  return _await(State.get(`${GIFTS_API_PATH}/my-gifts/from/${encodeURIComponent(senderId)}${query}`, 'json'), mapGiftsFromSender);\n});\nconst fetchGiftByIdApi = _async(function (id) {\n  return _await(State.get(`${GIFTS_API_PATH}/${encodeURIComponent(id)}`, 'json'), mapGiftItem);\n});\nconst sendGiftApi = _async(function ({\n  catalogId,\n  receiverId,\n  chatId,\n  messageId,\n  streamRoomId,\n  text,\n  idempotentId,\n  analytics\n}) {\n  const body = {\n    receiverId,\n    chatId,\n    messageId,\n    streamRoomId,\n    text,\n    idempotent_id: idempotentId\n  };\n  return _await(State.post(`${GIFTS_API_PATH}/purchase/${encodeURIComponent(catalogId)}`, body, 'json', undefined, undefined, {\n    analytics\n  }), function (data) {\n    return {\n      balance: data?.balance ?? data?.ballance ?? null,\n      payment: data?.payment ?? null,\n      gift: mapGiftItem(data?.gift)\n    };\n  });\n});\n\n/* === Inlined module: services/gifts/state.jsx === */\nconst normalizeBalancePayload = payload => payload?.ballance ?? payload?.balance ?? payload ?? null;\nconst applyBalance = payload => {\n  const ballance = normalizeBalancePayload(payload);\n  if (!ballance || !State.state.session.value) return;\n  State.state.session.next({\n    ...State.state.session.value,\n    ballance\n  });\n};\nconst invalidateProfileShowcase = userId => {\n  if (userId == null) return;\n  const cache = State.store.giftsShowcaseStore?.value ?? {};\n  const cacheKey = Object.keys(cache).find(key => String(key) === String(userId));\n  if (!cacheKey) return;\n  const nextCache = {\n    ...cache\n  };\n  delete nextCache[cacheKey];\n  State.store.giftsShowcaseStore.next(nextCache);\n};\nconst getFlowState = () => State.store.giftFlowStore?.value ?? defaultFlowState();\nconst setFlowState = patch => {\n  State.store.giftFlowStore.next({\n    ...getFlowState(),\n    ...patch\n  });\n};\nconst getSeenAt = () => State.store.giftsSeenAtStore?.value ?? null;\nconst setSeenAt = _async(function (value) {\n  State.store.giftsSeenAtStore.next(value);\n  return _continueIgnored(_catch(function () {\n    return _awaitIgnored(Storage.setValue(GIFTS_SEEN_AT_STORAGE_KEY, value));\n  }, function (error) {\n    console.error('[gifts] failed to persist seenAt', error);\n  }));\n});\nconst loadSeenAt = _async(function () {\n  return _continueIgnored(_catch(function () {\n    return _await(Storage.getValue(GIFTS_SEEN_AT_STORAGE_KEY), function (value) {\n      State.store.giftsSeenAtStore.next(value ?? null);\n    });\n  }, function (error) {\n    console.error('[gifts] failed to load seenAt', error);\n    State.store.giftsSeenAtStore.next(null);\n  }));\n});\nconst incrementNewGiftsCount = (delta = 1) => {\n  const current = Number(State.store.giftsNewCountStore?.value) || 0;\n  State.store.giftsNewCountStore.next(current + delta);\n};\nconst resetNewGiftsCount = () => {\n  State.store.giftsNewCountStore.next(0);\n};\nconst countUnseenFromItems = (items, seenAt) => {\n  if (!seenAt || !Array.isArray(items) || !items.length) return 0;\n  const seenTime = new Date(seenAt).getTime();\n  if (Number.isNaN(seenTime)) return 0;\n  return items.filter(gift => {\n    const created = new Date(gift?.created).getTime();\n    return Number.isFinite(created) && created > seenTime;\n  }).length;\n};\nconst syncNewGiftsCountFromItems = items => {\n  const unseen = countUnseenFromItems(items, getSeenAt());\n  const current = Number(State.store.giftsNewCountStore?.value) || 0;\n  State.store.giftsNewCountStore.next(Math.max(current, unseen));\n};\nconst markGiftsSeen = _async(function () {\n  const now = new Date().toISOString();\n  return _await(setSeenAt(now), function () {\n    resetNewGiftsCount();\n  });\n});\nconst initGiftsStores = () => {\n  State.store.giftFlowStore.next(defaultFlowState());\n  State.store.giftsCatalogStore.next(emptyCatalog);\n  State.store.giftsQuickStore.next(emptyQuickGifts);\n  State.store.giftsShowcaseStore.next({});\n  State.store.myGiftsStore.next(defaultMyGiftsState());\n  State.store.giftsFromSenderStore.next({});\n  State.store.giftsCatalogLoading.next(false);\n  State.store.giftsQuickLoading.next(false);\n  State.store.giftsShowcaseLoading.next(false);\n  State.store.giftsNewCountStore.next(0);\n};\nconst resetGiftsStores = () => {\n  State.store.giftsCatalogStore.next(emptyCatalog);\n  State.store.giftsQuickStore.next(emptyQuickGifts);\n  State.store.giftsShowcaseStore.next({});\n  State.store.myGiftsStore.next(defaultMyGiftsState());\n  State.store.giftsFromSenderStore.next({});\n  State.store.giftsCatalogLoading.next(false);\n  State.store.giftsQuickLoading.next(false);\n  State.store.giftsShowcaseLoading.next(false);\n  resetNewGiftsCount();\n};\n\n/* === Inlined module: services/gifts/flow.jsx === */\nconst createIdempotentId = () => {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  const now = Date.now().toString(16);\n  const rnd = Math.random().toString(16).slice(2);\n  return `${now}-${rnd}`;\n};\nlet sendGiftInFlightId = null;\nconst getGiftSurface = source => {\n  const value = String(source ?? '').trim();\n  if (value === 'chat') return 'chat';\n  if (value === 'videochat' || value === 'video_chat') return 'videochat';\n  if (value === 'stream' || value === 'live') return 'stream';\n  if (value === 'feed' || value === 'feed_tab') return 'feed';\n  return 'feed';\n};\nconst startGiftFlow = ({\n  receiverId,\n  entrySource,\n  chatId,\n  messageId,\n  streamRoomId,\n  returnPoint\n} = {}) => {\n  const idempotentId = createIdempotentId();\n  setFlowState({\n    receiverId: receiverId ?? null,\n    entrySource: entrySource ?? null,\n    chatId: chatId ?? null,\n    messageId: messageId ?? null,\n    streamRoomId: streamRoomId ?? null,\n    selectedGift: null,\n    message: '',\n    idempotentId,\n    returnPoint: returnPoint ?? null\n  });\n  return getFlowState();\n};\nconst selectGift = gift => {\n  setFlowState({\n    selectedGift: gift ? mapCatalogItem(gift) : null\n  });\n  return getFlowState();\n};\nconst setGiftMessage = message => {\n  setFlowState({\n    message: typeof message === 'string' ? message : ''\n  });\n  return getFlowState();\n};\nconst clearGiftFlow = () => {\n  State.store.giftFlowStore.next(defaultFlowState());\n  sendGiftInFlightId = null;\n};\nconst getIdempotentId = () => {\n  const flow = getFlowState();\n  if (flow?.idempotentId) return flow.idempotentId;\n  const idempotentId = createIdempotentId();\n  setFlowState({\n    idempotentId\n  });\n  return idempotentId;\n};\nconst sendGift = _async(function ({\n  catalogId,\n  receiverId,\n  chatId,\n  messageId,\n  streamRoomId,\n  text,\n  idempotentId\n} = {}) {\n  const flow = getFlowState();\n  const resolvedCatalogId = catalogId ?? flow?.selectedGift?.id;\n  const resolvedReceiverId = receiverId ?? flow?.receiverId;\n  const resolvedChatId = chatId ?? flow?.chatId ?? undefined;\n  const resolvedMessageId = messageId ?? flow?.messageId ?? undefined;\n  const resolvedStreamRoomId = streamRoomId ?? flow?.streamRoomId ?? undefined;\n  const resolvedText = text ?? flow?.message ?? undefined;\n  const resolvedIdempotentId = idempotentId ?? getIdempotentId();\n  if (!resolvedCatalogId) {\n    throw new Error('Gift is required');\n  }\n  if (!resolvedReceiverId) {\n    throw new Error('Receiver is required');\n  }\n  if (sendGiftInFlightId === resolvedIdempotentId) {\n    throw new Error('Gift send already in progress');\n  }\n  sendGiftInFlightId = resolvedIdempotentId;\n  let result;\n  const giftAnalytics = {\n    ...Analytics.getGlobalParams(),\n    analytics_event: 'gift',\n    gift_id: flow?.selectedGift?.code ?? flow?.selectedGift?.giftCode ?? String(flow?.selectedGift?.id ?? flow?.selectedGift?.catalogId ?? resolvedCatalogId),\n    is_quick_gift: !!flow?.selectedGift?.isQuick,\n    surface: getGiftSurface(flow?.entrySource)\n  };\n  return _continue(_finallyRethrows(function () {\n    return _await(sendGiftApi({\n      catalogId: resolvedCatalogId,\n      receiverId: resolvedReceiverId,\n      chatId: resolvedChatId,\n      messageId: resolvedMessageId,\n      streamRoomId: resolvedStreamRoomId,\n      text: resolvedText,\n      idempotentId: resolvedIdempotentId,\n      analytics: giftAnalytics\n    }), function (_sendGiftApi) {\n      result = _sendGiftApi;\n    });\n  }, function (_wasThrown27, _result68) {\n    if (sendGiftInFlightId === resolvedIdempotentId) {\n      sendGiftInFlightId = null;\n    }\n    return _rethrow(_wasThrown27, _result68);\n  }), function () {\n    applyBalance(result.balance);\n    State.api?.chatRoom?.attachGiftToMessage?.(result.gift);\n    invalidateProfileShowcase(resolvedReceiverId);\n    clearGiftFlow();\n    State.bus.updateMyGifts?.next(true);\n    State.bus.updateGiftsShowcase?.next(resolvedReceiverId);\n    return result;\n  });\n});\n\n/* === Inlined module: services/gifts/toast.jsx === */\nconst GiftReceivedToast = ({\n  gift\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const title = t('giftReceivedTitle');\n  const senderName = gift?.sender?.name || gift?.senderName || '';\n  const subtitleTemplate = String(t('giftReceivedDesc') || '');\n  const subtitle = senderName ? subtitleTemplate.replace('{0}', `\"${senderName}\"`) : '';\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 10,\n      width: 280,\n      maxWidth: '100%'\n    }\n  }, !!gift?.giftImageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: gift.giftImageUrl\n    },\n    style: {\n      width: 40,\n      height: 40\n    },\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700\n    }\n  }, title), !!subtitle && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentSecondary,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 500\n    }\n  }, subtitle)));\n};\nconst showGiftReceivedToast = gift => {\n  if (!gift) return;\n  Notification.showNotification({\n    key: `gift-received-${gift.id ?? gift.messageId ?? Date.now()}`,\n    children: /*#__PURE__*/React.createElement(GiftReceivedToast, {\n      gift: gift\n    }),\n    duration: 5000\n  });\n};\nconst onGiftReceivedSocket = payload => {\n  const gift = mapGiftItem(payload?.gift ?? payload);\n  if (!gift) return;\n  const currentUserId = State.state.session.value?.user?.id;\n  if (currentUserId && gift.receiverId && String(gift.receiverId) !== String(currentUserId)) {\n    return;\n  }\n  incrementNewGiftsCount(1);\n  showGiftReceivedToast(gift);\n  invalidateProfileShowcase(gift.receiverId);\n  State.bus.updateMyGifts?.next(true);\n  State.bus.updateGiftsShowcase?.next(gift.receiverId);\n};\n\n/* === Inlined module: services/gifts/index.jsx === */\nlet catalogCacheLocale = null;\nlet quickGiftsCacheLocale = null;\nconst getCurrentLocale = () => String(State.state.locale?.value ?? 'en').toLowerCase();\nconst loadCatalog = _async(function ({\n  quickOnly = false,\n  force = false\n} = {}) {\n  let _exit41 = false;\n  if (State.api?.guest?.isGuestOrEmptySession?.()) {\n    return [];\n  }\n  return State.state.session.value?.user?.id ? _invoke(function () {\n    if (quickOnly) {\n      return _await(loadQuickGifts({\n        force\n      }), function (_await$loadQuickGifts) {\n        _exit41 = true;\n        return _await$loadQuickGifts;\n      });\n    }\n  }, function (_result69) {\n    if (_exit41) return _result69;\n    const locale = getCurrentLocale();\n    if (!force && !quickOnly && catalogCacheLocale === locale && State.store.giftsCatalogStore?.value?.length) {\n      return State.store.giftsCatalogStore.value;\n    }\n    State.store.giftsCatalogLoading.next(true);\n    return _finallyRethrows(function () {\n      return _catch(function () {\n        return _await(fetchCatalogApi({\n          quickOnly\n        }), function (items) {\n          catalogCacheLocale = locale;\n          State.store.giftsCatalogStore.next(items);\n          return items;\n        });\n      }, function (error) {\n        console.error('[gifts] loadCatalog failed', error);\n        throw error;\n      });\n    }, function (_wasThrown28, _result70) {\n      State.store.giftsCatalogLoading.next(false);\n      return _rethrow(_wasThrown28, _result70);\n    });\n  }) : emptyCatalog;\n});\nconst loadQuickGifts = _async(function ({\n  force = false\n} = {}) {\n  if (State.api?.guest?.isGuestOrEmptySession?.()) {\n    return [];\n  }\n  if (!State.state.session.value?.user?.id) return emptyQuickGifts;\n  const locale = getCurrentLocale();\n  if (!force && quickGiftsCacheLocale === locale && State.store.giftsQuickStore?.value?.length) {\n    return State.store.giftsQuickStore.value;\n  }\n  State.store.giftsQuickLoading.next(true);\n  return _finallyRethrows(function () {\n    return _catch(function () {\n      return _call(fetchQuickGiftsApi, function (items) {\n        quickGiftsCacheLocale = locale;\n        State.store.giftsQuickStore.next(items);\n        return items;\n      });\n    }, function (error) {\n      console.error('[gifts] loadQuickGifts failed', error);\n      throw error;\n    });\n  }, function (_wasThrown29, _result71) {\n    State.store.giftsQuickLoading.next(false);\n    return _rethrow(_wasThrown29, _result71);\n  });\n});\nconst loadProfileShowcase = _async(function (userId, {\n  force = false\n} = {}) {\n  if (!userId) return emptyShowcase;\n  const cache = State.store.giftsShowcaseStore?.value ?? {};\n  if (!force && cache[userId]) {\n    return cache[userId];\n  }\n  State.store.giftsShowcaseLoading.next(true);\n  return _finallyRethrows(function () {\n    return _catch(function () {\n      return _await(fetchShowcaseTopApi(userId), function (_fetchShowcaseTopApi) {\n        const items = padShowcaseSlots(_fetchShowcaseTopApi);\n        State.store.giftsShowcaseStore.next({\n          ...cache,\n          [userId]: items\n        });\n        return items;\n      });\n    }, function (error) {\n      console.error('[gifts] loadProfileShowcase failed', error);\n      throw error;\n    });\n  }, function (_wasThrown30, _result72) {\n    State.store.giftsShowcaseLoading.next(false);\n    return _rethrow(_wasThrown30, _result72);\n  });\n});\nconst loadMyGifts = _async(function ({\n  skip = 0,\n  take = DEFAULT_MY_GIFTS_TAKE,\n  append = false,\n  force = false\n} = {}) {\n  if (!State.state.session.value?.user?.id) return emptyMyGifts;\n  const prev = State.store.myGiftsStore?.value ?? defaultMyGiftsState();\n  if (!force && !append && skip === 0 && prev.items?.length) {\n    return prev.items;\n  }\n  State.store.myGiftsStore.next({\n    ...prev,\n    skip,\n    take,\n    loading: true\n  });\n  return _catch(function () {\n    return _await(fetchMyGiftsApi({\n      skip,\n      take\n    }), function (items) {\n      const merged = append ? [...(prev.items ?? []), ...items] : items;\n      State.store.myGiftsStore.next({\n        items: merged,\n        skip,\n        take,\n        loading: false\n      });\n      if (skip === 0) {\n        syncNewGiftsCountFromItems(merged);\n      }\n      return merged;\n    });\n  }, function (error) {\n    console.error('[gifts] loadMyGifts failed', error);\n    State.store.myGiftsStore.next({\n      ...prev,\n      loading: false\n    });\n    throw error;\n  });\n});\nconst loadGiftsFromSender = _async(function (senderId, {\n  skip = 0,\n  take = DEFAULT_MY_GIFTS_TAKE,\n  append = false,\n  force = false\n} = {}) {\n  if (!senderId) return emptyMyGifts;\n  const cache = State.store.giftsFromSenderStore?.value ?? {};\n  const prev = cache[senderId] ?? defaultGiftsFromSenderState();\n  if (!force && !append && skip === 0 && prev.items?.length) {\n    return prev;\n  }\n  State.store.giftsFromSenderStore.next({\n    ...cache,\n    [senderId]: {\n      ...prev,\n      skip,\n      take,\n      loading: true\n    }\n  });\n  return _catch(function () {\n    return _await(fetchGiftsFromSenderApi(senderId, {\n      skip,\n      take\n    }), function (response) {\n      const items = response.gifts ?? emptyMyGifts;\n      const merged = append ? [...(prev.items ?? []), ...items] : items;\n      const nextState = {\n        items: merged,\n        sender: response.sender ?? prev.sender ?? null,\n        summary: response.summary ?? prev.summary ?? defaultGiftsFromSenderState().summary,\n        skip,\n        take,\n        loading: false\n      };\n      State.store.giftsFromSenderStore.next({\n        ...(State.store.giftsFromSenderStore.value ?? {}),\n        [senderId]: {\n          ...nextState\n        }\n      });\n      return nextState;\n    });\n  }, function (error) {\n    console.error('[gifts] loadGiftsFromSender failed', error);\n    State.store.giftsFromSenderStore.next({\n      ...(State.store.giftsFromSenderStore.value ?? {}),\n      [senderId]: {\n        ...prev,\n        loading: false\n      }\n    });\n    throw error;\n  });\n});\nconst loadGiftById = function (id) {\n  return id ? _await(fetchGiftByIdApi(id)) : _await(null);\n};\nconst resetAllGiftState = () => {\n  catalogCacheLocale = null;\n  quickGiftsCacheLocale = null;\n  resetGiftsStores();\n  clearGiftFlow();\n};\nconst giftsService = {\n  api: {\n    name: 'gifts',\n    loadCatalog,\n    loadQuickGifts,\n    sendGift,\n    loadProfileShowcase,\n    loadMyGifts,\n    loadGiftsFromSender,\n    loadGiftById,\n    markGiftsSeen,\n    startGiftFlow,\n    selectGift,\n    setGiftMessage,\n    clearGiftFlow,\n    getGiftFlow: getFlowState,\n    getIdempotentId,\n    groupCatalogByTier,\n    padShowcaseSlots,\n    mapCatalogItem,\n    mapGiftItem,\n    mapShowcaseItem,\n    useCatalog() {\n      const [catalog] = Hooks.useBehaviorSubject(State.store.giftsCatalogStore);\n      const [loading] = Hooks.useBehaviorSubject(State.store.giftsCatalogLoading);\n      React.useEffect(() => {\n        State.bus.updateGiftsCatalog?.next(true);\n      }, []);\n      return {\n        catalog: catalog ?? emptyCatalog,\n        tiers: groupCatalogByTier(catalog ?? emptyCatalog),\n        loading: !!loading\n      };\n    },\n    useQuickGifts() {\n      const [quickGifts] = Hooks.useBehaviorSubject(State.store.giftsQuickStore);\n      const [loading] = Hooks.useBehaviorSubject(State.store.giftsQuickLoading);\n      React.useEffect(() => {\n        State.bus.updateGiftsQuick?.next(true);\n      }, []);\n      return {\n        quickGifts: quickGifts ?? emptyQuickGifts,\n        loading: !!loading\n      };\n    },\n    useProfileShowcase(userId) {\n      const [showcaseMap] = Hooks.useBehaviorSubject(State.store.giftsShowcaseStore);\n      const [loading] = Hooks.useBehaviorSubject(State.store.giftsShowcaseLoading);\n      const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n      React.useEffect(() => {\n        if (userId) {\n          loadProfileShowcase(userId, {\n            force: true\n          }).catch(console.error);\n        }\n      }, [userId, locale]);\n      return {\n        showcase: userId ? showcaseMap?.[userId] ?? emptyShowcase : emptyShowcase,\n        loading: !!loading\n      };\n    },\n    useMyGifts() {\n      const [state] = Hooks.useBehaviorSubject(State.store.myGiftsStore);\n      const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n      React.useEffect(() => {\n        State.bus.updateMyGifts?.next(true);\n      }, [locale]);\n      return {\n        gifts: state?.items ?? emptyMyGifts,\n        loading: !!state?.loading,\n        skip: state?.skip ?? 0,\n        take: state?.take ?? DEFAULT_MY_GIFTS_TAKE\n      };\n    },\n    useGiftsFromSender(senderId) {\n      const [cache] = Hooks.useBehaviorSubject(State.store.giftsFromSenderStore);\n      const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n      const state = senderId ? cache?.[senderId] ?? defaultGiftsFromSenderState() : defaultGiftsFromSenderState();\n      React.useEffect(() => {\n        if (senderId) {\n          loadGiftsFromSender(senderId, {\n            force: true\n          }).catch(console.error);\n        }\n      }, [senderId, locale]);\n      return {\n        gifts: state.items ?? emptyMyGifts,\n        sender: state.sender ?? null,\n        summary: state.summary ?? defaultGiftsFromSenderState().summary,\n        loading: !!state.loading,\n        skip: state.skip ?? 0,\n        take: state.take ?? DEFAULT_MY_GIFTS_TAKE\n      };\n    },\n    useGiftFlow() {\n      const [flow] = Hooks.useBehaviorSubject(State.store.giftFlowStore);\n      return flow ?? defaultFlowState();\n    },\n    useNewGiftsCount() {\n      const [count] = Hooks.useBehaviorSubject(State.store.giftsNewCountStore);\n      return Number(count) || 0;\n    },\n    getCatalog() {\n      return State.store.giftsCatalogStore?.value ?? emptyCatalog;\n    },\n    getQuickGifts() {\n      return State.store.giftsQuickStore?.value ?? emptyQuickGifts;\n    },\n    getMyGifts() {\n      return State.store.myGiftsStore?.value?.items ?? emptyMyGifts;\n    },\n    getNewGiftsCount() {\n      return Number(State.store.giftsNewCountStore?.value) || 0;\n    }\n  },\n  init: _async(function () {\n    initGiftsStores();\n    return _call(loadSeenAt, function () {\n      if (State.state.session.value?.user?.id) {\n        loadCatalog({\n          force: true\n        }).catch(console.error);\n        loadQuickGifts({\n          force: true\n        }).catch(console.error);\n      }\n    });\n  }),\n  use() {\n    State.useSocket('gift:received', onGiftReceivedSocket);\n    State.useSocket('ballance', applyBalance);\n  },\n  subs() {\n    return Rx.merge(State.state.isConnected.pipe(Rx.distinctUntilChanged(), Rx.debounceTime(100), Rx.tap(isConnected => {\n      if (isConnected && State.state.session.value?.user?.id) {\n        State.bus.updateGiftsCatalog.next(true);\n        State.bus.updateGiftsQuick.next(true);\n      }\n    })), State.state.session.pipe(Rx.map(session => session?.user?.id ?? null), Rx.distinctUntilChanged(), Rx.tap(userId => {\n      if (userId == null) {\n        resetAllGiftState();\n        return;\n      }\n      State.bus.updateGiftsCatalog.next(true);\n      State.bus.updateGiftsQuick.next(true);\n    })), State.state.locale.pipe(Rx.map(() => getCurrentLocale()), Rx.distinctUntilChanged(), Rx.tap(() => {\n      catalogCacheLocale = null;\n      quickGiftsCacheLocale = null;\n      State.store.giftsCatalogStore.next(emptyCatalog);\n      State.store.giftsQuickStore.next(emptyQuickGifts);\n      State.store.giftsShowcaseStore.next({});\n      State.store.myGiftsStore.next(defaultMyGiftsState());\n      State.store.giftsFromSenderStore.next({});\n      if (State.state.session.value?.user?.id) {\n        State.bus.updateGiftsCatalog.next(true);\n        State.bus.updateGiftsQuick.next(true);\n        State.bus.updateMyGifts.next(true);\n      }\n    })), State.bus.updateGiftsCatalog.pipe(Rx.debounceTime(300), Rx.tap(() => {\n      loadCatalog({\n        force: true\n      }).catch(console.error);\n    })), State.bus.updateGiftsQuick.pipe(Rx.debounceTime(300), Rx.tap(() => {\n      loadQuickGifts({\n        force: true\n      }).catch(console.error);\n    })), State.bus.updateMyGifts.pipe(Rx.debounceTime(300), Rx.tap(() => {\n      loadMyGifts({\n        force: true\n      }).catch(console.error);\n    })), State.bus.updateGiftsShowcase.pipe(Rx.debounceTime(300), Rx.tap(userId => {\n      if (userId) {\n        loadProfileShowcase(userId, {\n          force: true\n        }).catch(console.error);\n      }\n    })));\n  }\n};\n\n/* === Inlined module: services/guest.jsx === */\nconst acceptGuestAgeGate = () => {\n  State.store.guestAgeGateAcceptedStore.next(true);\n};\nlet registerSheetOpen = false;\nconst openRegisterSheet = _async(function (loginSurface = 'restricted_action', restrictionAction) {\n  if (registerSheetOpen) return;\n  registerSheetOpen = true;\n  return _continueIgnored(_finallyRethrows(function () {\n    return _catch(function () {\n      if (restrictionAction) {\n        State.anals.next({\n          name: 'guest_restriction_hit',\n          data: {\n            action: restrictionAction\n          }\n        });\n      }\n      return _awaitIgnored(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"GuestRegisterSheet\",\n        loginSurface: loginSurface\n      }), {\n        theme: Theme.isDark.value ? 'dark' : 'light',\n        props: {\n          style: {\n            maxWidth: 500\n          }\n        }\n      }));\n    }, function (e) {\n      console.error('[guest] openRegisterSheet error', e);\n    });\n  }, function (_wasThrown31, _result73) {\n    registerSheetOpen = false;\n    return _rethrow(_wasThrown31, _result73);\n  }));\n});\nconst DEV_FORCE_GUEST = false;\nconst isGuestSession = () => DEV_FORCE_GUEST || State.state.session.value?.userConnection?.type === 'guest' || State.state.session.value?.card?.isGuest === true;\nconst isGuestOrEmptySession = () => isGuestSession() || State.state.session.value?.user?.id == null;\nconst useIsGuestSession = () => {\n  return Hooks.useBehaviorSubjectMap(State.state.session, isGuestSession);\n};\nconst useIsGuestOrEmptySession = () => {\n  return Hooks.useBehaviorSubjectMap(State.state.session, isGuestOrEmptySession);\n};\nconst guestService = {\n  api: {\n    name: 'guest',\n    acceptGuestAgeGate,\n    isGuestSession,\n    isGuestOrEmptySession,\n    useIsGuestSession,\n    useIsGuestOrEmptySession,\n    openRegisterSheet\n  }\n};\n\n/* === Inlined module: services/guestVideoChatCounter.jsx === */\nconst toCounterValue = value => {\n  if (value == null || value === '') {\n    return null;\n  }\n  const number = Number(value);\n  return Number.isFinite(number) ? Math.max(0, number) : null;\n};\nconst setGuestVideoChatCounter = ({\n  starts,\n  limit\n} = {}) => {\n  const nextStarts = toCounterValue(starts);\n  const nextLimit = toCounterValue(limit);\n  if (nextStarts == null || nextLimit == null) {\n    return;\n  }\n  State.store.guestCallsLimitStore.next(nextLimit);\n  State.store.guestCallsCounterStore.next(nextStarts);\n};\nconst getGuestStarts = () => {\n  return toCounterValue(State.store.guestCallsCounterStore.value) ?? 0;\n};\nconst refreshGuestCallsRemaining = () => {\n  const starts = toCounterValue(State.store.guestCallsCounterStore.value);\n  const limit = toCounterValue(State.store.guestCallsLimitStore.value);\n  const remaining = starts != null && limit != null ? Math.max(0, limit - starts) : null;\n  State.store.guestCallsRemainingStore.next(remaining);\n  return remaining;\n};\nconst canGuestVideoChat = () => {\n  const starts = toCounterValue(State.store.guestCallsCounterStore.value);\n  const limit = toCounterValue(State.store.guestCallsLimitStore.value);\n  if (starts == null || limit == null) {\n    return true;\n  }\n  return starts < limit;\n};\nconst guestVideoChatCounterService = {\n  api: {\n    name: 'guestVideoChatCounter',\n    getGuestStarts,\n    canGuestVideoChat,\n    useGuestCallsRemaining() {\n      const [remaining] = Hooks.useBehaviorSubject(State.store.guestCallsRemainingStore);\n      return remaining;\n    }\n  },\n  use() {\n    State.useSocket(\"guest-connections:count\", setGuestVideoChatCounter);\n  },\n  subs() {\n    return Rx.combineLatest([State.store.guestCallsCounterStore, State.store.guestCallsLimitStore]).pipe(Rx.debounceTime(500), Rx.distinctUntilChanged(([previousStarts, previousLimit], [starts, limit]) => previousStarts === starts && previousLimit === limit), Rx.tap(refreshGuestCallsRemaining));\n  }\n};\n\n/* === Inlined module: services/banPolling.jsx === */\nconst BAN_POLL_INTERVAL_MS = 5_000;\nconst loadBanStatus = _async(function () {\n  const polledSession = State.state.session.value;\n  const polledUserId = polledSession?.user?.id;\n  const polledBanId = polledSession?.ban?.id;\n  return _await(State.post('/api/user/ban', undefined, 'json', 1), function (result) {\n    if (!result || typeof result !== 'object' || !Object.prototype.hasOwnProperty.call(result, 'ban')) {\n      throw new Error('Invalid /api/user/ban response');\n    }\n    const currentSession = State.state.session.value;\n    if (currentSession?.user?.id !== polledUserId || currentSession?.ban?.id !== polledBanId) {\n      return;\n    }\n    const currentBan = currentSession?.ban;\n    const ban = result.ban ?? undefined;\n    if (Boolean(currentBan) !== Boolean(ban) || currentBan?.id !== ban?.id) {\n      State.state.session.next({\n        ...currentSession,\n        ban\n      });\n    }\n    if (currentBan && !ban) {\n      State.state.socketRejectedToken.next(null);\n      State.reconnectSocket();\n    }\n  });\n});\nconst banPollingService = {\n  name: 'banPollingService',\n  subs() {\n    return State.state.session.pipe(Rx.map(session => Boolean(session?.ban)), Rx.distinctUntilChanged(), Rx.switchMap(isBanned => isBanned ? Rx.timer(0, BAN_POLL_INTERVAL_MS).pipe(Rx.exhaustMap(() => Rx.from(loadBanStatus()).pipe(Rx.catchError(error => {\n      console.error('[ban] status poll failed', error);\n      return Rx.EMPTY;\n    })))) : Rx.EMPTY));\n  }\n};\n\n/* === Inlined module: services/audit.jsx === */\nconst UI_AUDIT_TYPES = new Set(['page:open', 'page:close', 'modal:open', 'modal:close', 'profile:open', 'profile:close', 'error:frontend', 'error:network', 'error:crash']);\nconst UI_AUDIT_PARAM_BUDGET = 8 * 1024;\nconst UI_AUDIT_MAX_DEPTH = 5;\nconst UI_AUDIT_MAX_KEYS = 50;\nconst UI_AUDIT_MAX_ARRAY_ITEMS = 30;\nconst UI_AUDIT_MAX_STRING = 1024;\nconst UI_AUDIT_REQUEST_TIMEOUT_MS = 2500;\nconst UI_AUDIT_MAX_QUEUE = 100;\nconst UI_AUDIT_BATCH_SIZE = 20;\nconst UI_AUDIT_BATCH_DELAY_MS = 25;\nlet interactionSequence = 0;\nlet auditRequestInFlight = false;\nlet auditFlushTimer = null;\nconst auditQueue = [];\nconst UI_AUDIT_IGNORED_KEYS = new Set(['__noAnimation', 'children', 'ref', 'navigation', 'style', 'contentStyle']);\nconst asShortText = (value, maxLength) => {\n  if (typeof value !== 'string' && typeof value !== 'number') return undefined;\n  const normalized = String(value).trim();\n  return normalized ? normalized.slice(0, maxLength) : undefined;\n};\nconst isAnalyticsKey = key => key.replace(/[-_]/g, '').toLowerCase().includes('analytics');\nconst isSensitiveKey = key => {\n  const normalized = key.replace(/[-_]/g, '').toLowerCase();\n  if (normalized.endsWith('sessionid')) return false;\n  return normalized.includes('authorization') || normalized.includes('cookie') || normalized.includes('password') || normalized.includes('passwd') || normalized.includes('secret') || normalized.includes('token') || normalized.includes('privatekey') || normalized.includes('accesskey') || normalized.includes('apikey') || normalized.includes('credential') || normalized.includes('appdata') || normalized === 'session' || normalized.endsWith('session') || normalized === 'pass';\n};\nconst looksLikeEncodedMedia = value => typeof value === 'string' && (/^data:(?:image|video|audio)\\/[a-z0-9.+-]+;base64,/i.test(value.trim()) || value.length > 2048 && /^[A-Za-z0-9+/]*={0,2}$/.test(value.slice(0, 2048)));\nconst sanitizeUiValue = (value, budget, depth, seen) => {\n  if (budget.remaining <= 0) return '[TRUNCATED]';\n  if (value == null || typeof value === 'boolean' || typeof value === 'number') return value;\n  if (typeof value === 'function' || typeof value === 'symbol') return undefined;\n  if (typeof value === 'string') {\n    if (looksLikeEncodedMedia(value)) return `[BINARY:${value.length} chars]`;\n    const allowed = Math.max(0, Math.min(UI_AUDIT_MAX_STRING, budget.remaining));\n    const clipped = value.length > allowed ? `${value.slice(0, Math.max(0, allowed - 12))}…[truncated]` : value;\n    budget.remaining -= clipped.length;\n    return clipped;\n  }\n  if (value instanceof Date) return value.toISOString();\n  if (depth >= UI_AUDIT_MAX_DEPTH) return '[MAX_DEPTH]';\n  if (typeof value !== 'object') return asShortText(value, UI_AUDIT_MAX_STRING);\n  if (value.$$typeof) return '[REACT_ELEMENT]';\n  if (seen.has(value)) return '[CIRCULAR]';\n  seen.add(value);\n  if (Array.isArray(value)) {\n    return value.slice(0, UI_AUDIT_MAX_ARRAY_ITEMS).map(item => sanitizeUiValue(item, budget, depth + 1, seen)).filter(item => item !== undefined);\n  }\n  const constructorName = value?.constructor?.name;\n  if (constructorName && constructorName !== 'Object') {\n    return `[${constructorName}]`;\n  }\n  const result = {};\n  for (const [key, nested] of Object.entries(value).slice(0, UI_AUDIT_MAX_KEYS)) {\n    if (UI_AUDIT_IGNORED_KEYS.has(key) || isAnalyticsKey(key)) continue;\n    budget.remaining -= key.length;\n    if (budget.remaining <= 0) break;\n    const sanitized = isSensitiveKey(key) ? '[REDACTED]' : sanitizeUiValue(nested, budget, depth + 1, seen);\n    if (sanitized !== undefined) result[key] = sanitized;\n  }\n  return result;\n};\nconst sanitizeUiParams = value => sanitizeUiValue(value, {\n  remaining: UI_AUDIT_PARAM_BUDGET\n}, 0, new WeakSet());\nconst stableUiParams = value => {\n  const sanitized = sanitizeUiParams(value);\n  try {\n    return {\n      value: sanitized,\n      signature: JSON.stringify(sanitized) ?? ''\n    };\n  } catch {\n    return {\n      value: undefined,\n      signature: ''\n    };\n  }\n};\nconst nextInteractionId = () => {\n  interactionSequence = (interactionSequence + 1) % Number.MAX_SAFE_INTEGER;\n  return `${Date.now().toString(36)}-${interactionSequence.toString(36)}`;\n};\nconst TARGET_KEYS = [['targetUserId', 'user'], ['userId', 'user'], ['senderId', 'user'], ['receiverId', 'user'], ['ownerId', 'user'], ['peerId', 'user'], ['chatId', 'chat'], ['roomId', 'room'], ['messageId', 'message'], ['productId', 'product'], ['giftId', 'gift'], ['id', 'entity']];\nconst targetContextFromKey = (key, fallback) => {\n  const normalized = String(key).toLowerCase();\n  if (/(?:user|sender|receiver|owner|peer|card)/.test(normalized)) return 'user';\n  if (normalized === 'chat') return 'chat';\n  if (normalized === 'room') return 'room';\n  if (normalized === 'message') return 'message';\n  if (normalized === 'product') return 'product';\n  if (normalized === 'gift') return 'gift';\n  return fallback;\n};\nconst findTarget = (value, depth = 0, seen = new WeakSet(), contextType = null) => {\n  if (!value || typeof value !== 'object' || depth > 4 || seen.has(value)) return null;\n  seen.add(value);\n  for (const [key, type] of TARGET_KEYS) {\n    const candidate = asShortText(value?.[key], 128);\n    if (candidate) return {\n      targetEntityId: candidate,\n      targetEntityType: key === 'id' && contextType ? contextType : type\n    };\n  }\n  for (const [key, nested] of Object.entries(value)) {\n    const result = findTarget(nested, depth + 1, seen, targetContextFromKey(key, contextType));\n    if (result) return result;\n  }\n  return null;\n};\nconst scheduleUiAuditFlush = () => {\n  if (auditRequestInFlight || auditFlushTimer != null || !auditQueue.length) return;\n  auditFlushTimer = setTimeout(() => {\n    auditFlushTimer = null;\n    flushUiAuditQueue();\n  }, UI_AUDIT_BATCH_DELAY_MS);\n};\nconst flushUiAuditQueue = () => {\n  if (auditRequestInFlight || !auditQueue.length) return;\n  const batch = auditQueue.splice(0, UI_AUDIT_BATCH_SIZE);\n  auditRequestInFlight = true;\n  const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n  let released = false;\n  let timeout;\n  const release = () => {\n    if (released) return;\n    released = true;\n    if (timeout != null) clearTimeout(timeout);\n    auditRequestInFlight = false;\n    scheduleUiAuditFlush();\n  };\n  timeout = setTimeout(() => {\n    try {\n      controller?.abort();\n    } catch (_) {}\n  }, UI_AUDIT_REQUEST_TIMEOUT_MS);\n  try {\n    const fetchFn = globalThis?.fetch;\n    if (typeof fetchFn !== 'function') {\n      release();\n      return;\n    }\n    const appData = typeof State?.appData === 'function' ? State.appData() : {};\n    const request = fetchFn(State.getUrl('/api/audit'), {\n      method: 'POST',\n      headers: {\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n        appdata: JSON.stringify(appData)\n      },\n      body: JSON.stringify(batch.length === 1 ? batch[0] : batch),\n      ...(controller ? {\n        signal: controller.signal\n      } : {})\n    });\n    Promise.resolve(request).catch(() => undefined).finally(release);\n  } catch (_) {\n    release();\n    // UI audit is intentionally isolated, fail-open and never retried.\n  }\n};\nconst enqueueUiAuditEvent = event => {\n  if (auditQueue.length >= UI_AUDIT_MAX_QUEUE) return;\n  auditQueue.push(event);\n  scheduleUiAuditFlush();\n};\nconst trackUiAuditEvent = (type, data = {}) => {\n  if (!UI_AUDIT_TYPES.has(type)) return;\n  const name = asShortText(data.name, 96);\n  if (!name) return;\n  const sanitizedParams = sanitizeUiParams(data.params);\n  const inferredTarget = findTarget(sanitizedParams) ?? {};\n  const event = {\n    type,\n    name,\n    source: asShortText(data.source, 96),\n    targetEntityId: asShortText(data.targetEntityId, 128) ?? inferredTarget.targetEntityId,\n    targetEntityType: asShortText(data.targetEntityType, 32) ?? inferredTarget.targetEntityType,\n    interactionId: asShortText(data.interactionId, 128),\n    params: sanitizedParams,\n    resultData: sanitizeUiParams(data.resultData),\n    durationMs: Number.isFinite(Number(data.durationMs)) ? Math.max(0, Math.round(Number(data.durationMs))) : undefined,\n    result: asShortText(data.result, 64),\n    reason: asShortText(data.reason, 96),\n    presentation: asShortText(data.presentation, 32),\n    message: asShortText(data.message, 2048),\n    stack: asShortText(data.stack, 8192),\n    componentStack: asShortText(data.componentStack, 8192),\n    context: asShortText(data.context, 1024),\n    code: asShortText(data.code, 128),\n    fatal: typeof data.fatal === 'boolean' ? data.fatal : undefined,\n    openedAt: asShortText(data.openedAt, 64),\n    closedAt: asShortText(data.closedAt, 64),\n    occurredAt: asShortText(data.occurredAt, 64),\n    crashId: asShortText(data.crashId, 128),\n    replayed: typeof data.replayed === 'boolean' ? data.replayed : undefined\n  };\n\n  // Audit must not use State.post(): that transport mutates the application's\n  // global connectivity/retry state on network failure. A failed fire-and-forget\n  // audit request must never delay a later login, payment or chat request.\n  enqueueUiAuditEvent(event);\n};\nconst useUiPageAudit = (componentName, props) => {\n  const routeName = asShortText(props?.route?.name, 96) ?? asShortText(componentName, 96) ?? 'unknown';\n  const rootNavigationAuditEnabled = State.state?.uiAuditNavigationEnabled?.value === true;\n  const params = stableUiParams(props?.route?.params);\n  const target = findTarget(params.value) ?? {};\n  ReactNavigation.useFocusEffect(React.useCallback(() => {\n    if (rootNavigationAuditEnabled) return undefined;\n    const openedAt = Date.now();\n    const interactionId = nextInteractionId();\n    trackUiAuditEvent('page:open', {\n      name: routeName,\n      ...target,\n      interactionId,\n      params: params.value,\n      openedAt: new Date(openedAt).toISOString(),\n      occurredAt: new Date(openedAt).toISOString()\n    });\n    return () => {\n      const closedAt = Date.now();\n      trackUiAuditEvent('page:close', {\n        name: routeName,\n        ...target,\n        interactionId,\n        params: params.value,\n        openedAt: new Date(openedAt).toISOString(),\n        closedAt: new Date(closedAt).toISOString(),\n        occurredAt: new Date(closedAt).toISOString(),\n        durationMs: closedAt - openedAt\n      });\n    };\n  }, [routeName, rootNavigationAuditEnabled, params.signature]));\n};\nconst getElementTypeName = type => asShortText(typeof type === 'string' ? type : type?.displayName ?? type?.name ?? type?.render?.displayName ?? type?.render?.name ?? type?.type?.displayName ?? type?.type?.name, 96);\nconst MODAL_INFRASTRUCTURE_NAMES = new Set(['ModalItemProvider', 'CleanSheet', 'ModalSheet', 'WebSheetWrapper', 'Portal', 'ScopedTheme', 'Sheet', 'View', 'Text', 'Fragment']);\nconst findDescribedElement = (element, depth = 0) => {\n  if (!React.isValidElement(element) || depth > 8) return null;\n  const props = element.props ?? {};\n  const typeName = getElementTypeName(element.type);\n  const componentName = ['LazyComponent', 'ModuleComponent'].includes(typeName) ? asShortText(props.name, 96) : asShortText(props.auditName, 96) ?? (typeName && !MODAL_INFRASTRUCTURE_NAMES.has(typeName) ? typeName : null) ?? asShortText(props.name, 96);\n  if (componentName) return {\n    element,\n    name: componentName\n  };\n  const children = React.Children.toArray(props.children);\n  for (const child of children) {\n    const described = findDescribedElement(child, depth + 1);\n    if (described) return described;\n  }\n  return null;\n};\nconst getModalPresentation = element => {\n  const name = getElementTypeName(element?.type);\n  if (name === 'CleanSheet') return 'sheet';\n  if (name === 'ModalSheet') return 'modal';\n  if (name === 'WebSheetWrapper') return 'web-sheet';\n  if (name === 'Portal') return 'portal';\n  return 'fullscreen';\n};\nconst describeModalItem = item => {\n  const root = item?.element?.props?.children ?? item?.element;\n  const described = findDescribedElement(root);\n  if (!described) return null;\n  const props = described.element?.props ?? {};\n  if (props.audit === false) return null;\n  const params = stableUiParams({\n    ...props,\n    route: props?.route?.params\n  }).value;\n  const target = findTarget(params) ?? {};\n  const name = described.name;\n  return {\n    kind: /(?:card|profile)/i.test(name) ? 'profile' : 'modal',\n    name,\n    source: asShortText(props.source ?? props.purchaseSource ?? props.loginSurface, 96),\n    ...target,\n    interactionId: asShortText(item.id, 128) ?? nextInteractionId(),\n    params,\n    presentation: getModalPresentation(root),\n    openedAt: Date.now()\n  };\n};\nconst activeModals = new Map();\nconst closeTrackedModal = (id, result, reason = 'resolved') => {\n  const key = String(id);\n  const meta = activeModals.get(key);\n  if (!meta) return;\n  activeModals.delete(key);\n  const closedAt = Date.now();\n  trackUiAuditEvent(`${meta.kind}:close`, {\n    ...meta,\n    result: result === undefined ? 'dismissed' : reason,\n    resultData: result,\n    openedAt: new Date(meta.openedAt).toISOString(),\n    closedAt: new Date(closedAt).toISOString(),\n    occurredAt: new Date(closedAt).toISOString(),\n    durationMs: closedAt - meta.openedAt\n  });\n};\nconst trackModalStack = items => {\n  const currentIds = new Set();\n  for (const item of Array.isArray(items) ? items : []) {\n    const id = asShortText(item?.id, 128);\n    if (!id) continue;\n    currentIds.add(id);\n    if (activeModals.has(id)) continue;\n    const meta = describeModalItem(item);\n    if (!meta) continue;\n    activeModals.set(id, meta);\n    trackUiAuditEvent(`${meta.kind}:open`, {\n      ...meta,\n      openedAt: new Date(meta.openedAt).toISOString(),\n      occurredAt: new Date(meta.openedAt).toISOString()\n    });\n    const completion = item?.completer?.promise;\n    if (completion && typeof completion.then === 'function') {\n      Promise.resolve(completion).then(result => closeTrackedModal(id, result, 'resolved'), error => closeTrackedModal(id, error, 'rejected'));\n    }\n  }\n  for (const id of activeModals.keys()) {\n    if (currentIds.has(id)) continue;\n    Promise.resolve().then(() => closeTrackedModal(id, undefined, 'removed'));\n  }\n};\nconst useUiLifecycleAudit = ({\n  kind = 'modal',\n  name,\n  params: rawParams,\n  active = true,\n  presentation = 'overlay',\n  source\n}) => {\n  const params = stableUiParams(rawParams);\n  React.useEffect(() => {\n    if (!active) return undefined;\n    const normalizedName = asShortText(name, 96);\n    if (!normalizedName) return undefined;\n    const openedAt = Date.now();\n    const interactionId = nextInteractionId();\n    const target = findTarget(params.value) ?? {};\n    trackUiAuditEvent(`${kind}:open`, {\n      name: normalizedName,\n      source,\n      presentation,\n      interactionId,\n      params: params.value,\n      ...target,\n      openedAt: new Date(openedAt).toISOString(),\n      occurredAt: new Date(openedAt).toISOString()\n    });\n    return () => {\n      const closedAt = Date.now();\n      trackUiAuditEvent(`${kind}:close`, {\n        name: normalizedName,\n        source,\n        presentation,\n        interactionId,\n        params: params.value,\n        ...target,\n        openedAt: new Date(openedAt).toISOString(),\n        closedAt: new Date(closedAt).toISOString(),\n        occurredAt: new Date(closedAt).toISOString(),\n        durationMs: closedAt - openedAt\n      });\n    };\n  }, [active, kind, name, params.signature, presentation, source]);\n};\nconst uiAuditService = {\n  name: 'UiAudit',\n  api: {\n    name: 'audit',\n    track: trackUiAuditEvent,\n    useLifecycleAudit: useUiLifecycleAudit\n  },\n  init() {\n    State.state?.uiAuditNavigationEnabled?.next?.(true);\n  },\n  subs() {\n    return Rx.merge(State.bus.uiAudit.pipe(Rx.tap(event => trackUiAuditEvent(event?.type, event))), Modals.modals.pipe(Rx.tap(trackModalStack))).pipe(Rx.finalize(() => State.state?.uiAuditNavigationEnabled?.next?.(false)));\n  }\n};\nconst NETWORK_ERROR_PATTERN = /(?:network request failed|networkerror|network error|failed to fetch|load failed|internet connection appears to be offline|network is unreachable|request failed with status code|connection (?:refused|reset|timed out)|econnrefused|econnreset|etimedout|enetunreach|err_(?:network|bad_request|bad_response)|http_[45]\\d\\d)/i;\nconst recentFrontendErrors = new Map();\nconst errorRateWindows = new Map();\nconst isFrontendNetworkError = event => {\n  const source = asShortText(event?.source, 128) ?? '';\n  const name = asShortText(event?.name, 128) ?? '';\n  const code = asShortText(event?.code, 128) ?? '';\n  const message = asShortText(event?.message, 2048) ?? '';\n  return name === 'AbortError' || source.startsWith('network:') || NETWORK_ERROR_PATTERN.test(`${code} ${message}`);\n};\nconst reportFrontendErrorToAudit = event => {\n  if (!event || typeof event !== 'object' || event.name === 'AbortError') return;\n  const now = Date.now();\n  const isCrash = event.fatal === true;\n  const isNetwork = !isCrash && isFrontendNetworkError(event);\n  const auditType = isCrash ? 'error:crash' : isNetwork ? 'error:network' : 'error:frontend';\n  const rateWindow = errorRateWindows.get(auditType) ?? {\n    startedAt: now,\n    count: 0\n  };\n  if (now - rateWindow.startedAt >= 60_000) {\n    rateWindow.startedAt = now;\n    rateWindow.count = 0;\n  }\n  if (rateWindow.count >= 20) return;\n  const name = asShortText(event.name, 128) ?? 'Error';\n  const message = asShortText(event.message, 2048) ?? name;\n  const signature = [auditType, name, message, asShortText(event.stack, 512)].join('|');\n  const previous = recentFrontendErrors.get(signature) ?? 0;\n  if (now - previous < 30_000) return;\n  recentFrontendErrors.set(signature, now);\n  if (recentFrontendErrors.size > 100) {\n    for (const [key, timestamp] of recentFrontendErrors) {\n      if (now - timestamp >= 30_000) recentFrontendErrors.delete(key);\n    }\n  }\n  rateWindow.count += 1;\n  errorRateWindows.set(auditType, rateWindow);\n  trackUiAuditEvent(auditType, {\n    name,\n    source: event.source,\n    message,\n    stack: event.stack,\n    componentStack: event.componentStack,\n    context: event.context,\n    code: event.code,\n    fatal: event.fatal,\n    occurredAt: event.occurredAt\n  });\n};\nconst frontendErrorAuditService = {\n  name: 'FrontendErrorAudit',\n  subs() {\n    return State.bus.error.pipe(Rx.tap(reportFrontendErrorToAudit));\n  }\n};\nconst PageModule = name => props => {\n  useUiPageAudit(name, props);\n  // ModuleComponent прокидывает props внутрь LazyComponent, поэтому route.params будет доступен экрану.\n  return /*#__PURE__*/React.createElement(ModuleComponent, _extends({\n    name: name\n  }, props));\n};\nconst Page = name => props => {\n  useUiPageAudit(name, props);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: name,\n    route: props?.route,\n    navigation: props?.navigation\n  });\n};\nconst AuditedLoginScreen = props => {\n  useUiPageAudit('Login', props);\n  return /*#__PURE__*/React.createElement(LoginScreen, props);\n};\nconst login = {\n  name: 'AgeGate'\n};\nconst home = {\n  name: 'Random'\n};\nconst withAuthGuard = (WrappedComponent, current, {\n  authRequired\n} = {}) => {\n  return props => {\n    const session = State.api?.session?.useSession?.();\n    const [manifest] = Hooks.useBehaviorSubject(State.state.manifest);\n    const [ready] = Hooks.useBehaviorSubject(Navigation.navigationReady);\n    const isGuest = State.api?.guest?.useIsGuestSession?.();\n    const [guestAgeGateAccepted] = Hooks.useBehaviorSubject(State.store.guestAgeGateAcceptedStore);\n    const requiresGuestAgeGate = isGuest && guestAgeGateAccepted !== true;\n    const isNotAuthentificated = session?.user?.id == null || requiresGuestAgeGate || authRequired && isGuest;\n    React.useEffect(() => {\n      if (session?.ban) {\n        if (current !== 'Ban') Navigation.goto({\n          name: 'Ban'\n        });\n        return;\n      }\n      if (session?.remove) {\n        if (current !== 'Remove') Navigation.goto({\n          name: 'Remove'\n        });\n        return;\n      }\n      if (isNotAuthentificated || current === 'Ban' || current === 'Remove') {\n        if (isGuest && current === login.name) {\n          Navigation.goto(home);\n        } else if (current !== login.name) {\n          Navigation.goto(login);\n        }\n        return;\n      }\n      if (!isGuest && session?.userConnection?.type == 'email' && session?.userConnection?.verifyed != true) {\n        if (current !== 'Meta') {\n          Navigation.goto({\n            name: 'Meta'\n          });\n        }\n        return;\n      }\n      if (!isGuest && (!session?.card?.age || !session?.card?.sex?.length)) {\n        if (current !== 'Meta') {\n          Navigation.goto({\n            name: 'Meta'\n          });\n        }\n        return;\n      }\n    }, [session, isGuest, isNotAuthentificated, ready]);\n    if (session?.user?.id == null || requiresGuestAgeGate) {\n      return /*#__PURE__*/React.createElement(ReactNative.View, {\n        style: {\n          flex: 1\n        }\n      });\n    }\n    return /*#__PURE__*/React.createElement(WrappedComponent, props);\n  };\n};\nconst withoutAuthGuard = (WrappedComponent, current) => {\n  return props => {\n    const session = State.api?.session?.useSession?.();\n    const [manifest] = Hooks.useBehaviorSubject(State.state.manifest);\n    const isGuest = State.api?.guest?.useIsGuestSession?.();\n    const [guestAgeGateAccepted] = Hooks.useBehaviorSubject(State.store.guestAgeGateAcceptedStore);\n    const shouldRedirectGuestFromAgeGate = isGuest && current === login.name && guestAgeGateAccepted === true;\n    React.useEffect(() => {\n      if (session?.ban) {\n        if (current !== 'Ban') Navigation.goto({\n          name: 'Ban'\n        });\n        return;\n      }\n      if (session?.remove) {\n        if (current !== 'Remove') Navigation.goto({\n          name: 'Remove'\n        });\n        return;\n      }\n      if (session?.user?.id != null && (!isGuest || shouldRedirectGuestFromAgeGate)) {\n        if (current !== home.name) {\n          Navigation.goto(home);\n        }\n        return;\n      }\n    }, [session, isGuest, shouldRedirectGuestFromAgeGate]);\n    if (session?.user?.id != null && !isGuest) {\n      return null;\n    }\n    return /*#__PURE__*/React.createElement(WrappedComponent, props);\n  };\n};\nconst withGuestAccessGuard = (WrappedComponent, current) => {\n  return withAuthGuard(WrappedComponent, current);\n};\n\n// HOC для экранов с пререндером — возвращает пустой placeholder\n// Реальный контент рендерится в PrerenderProvider\nconst withPrerender = current => {\n  return withAuthGuard(() => {\n    // Пустой placeholder — реальный контент рендерится скрыто в Layout\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        flex: 1\n      }\n    });\n  }, current);\n};\n\n// Иконки таба «Подписки» — цвет из style (TabBar передаёт массив [styles.icon, inactiveTextStyle])\nconst SubscriptionsTabIcon = ({\n  style\n}) => {\n  const flat = Array.isArray(style) ? ReactNative.StyleSheet.flatten(style) : style;\n  const fill = flat?.color ?? '#04060F';\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9 12.25C11.0393 12.25 12.9229 12.7209 14.3223 13.5205C15.7002 14.308 16.75 15.5103 16.75 17C16.75 18.4897 15.7002 19.692 14.3223 20.4795C12.9229 21.2791 11.0393 21.75 9 21.75C6.96067 21.75 5.0771 21.2791 3.67773 20.4795C2.29976 19.692 1.25 18.4897 1.25 17C1.25 15.5103 2.29976 14.308 3.67773 13.5205C5.0771 12.7209 6.96067 12.25 9 12.25ZM9 13.75C7.17334 13.75 5.55601 14.1752 4.42188 14.8232C3.26693 15.4834 2.75 16.2808 2.75 17C2.75 17.7192 3.26693 18.5166 4.42188 19.1768C5.55601 19.8248 7.17334 20.25 9 20.25C10.8267 20.25 12.444 19.8248 13.5781 19.1768C14.7331 18.5166 15.25 17.7192 15.25 17C15.25 16.2808 14.7331 15.4834 13.5781 14.8232C12.444 14.1752 10.8267 13.75 9 13.75ZM17.2676 13.8389C17.3565 13.4346 17.7567 13.1789 18.1611 13.2676C19.1228 13.4785 19.9894 13.8593 20.6328 14.3857C21.2758 14.9119 21.75 15.6352 21.75 16.5C21.75 17.2786 21.3633 17.946 20.8174 18.4531C20.2739 18.9579 19.5382 19.3412 18.7158 19.5889C18.3194 19.7079 17.9017 19.4832 17.7822 19.0869C17.6628 18.6903 17.8876 18.2718 18.2842 18.1523C18.9477 17.9525 19.462 17.6646 19.7969 17.3535C20.1292 17.0447 20.25 16.7507 20.25 16.5C20.25 16.2237 20.1011 15.8893 19.6826 15.5469C19.2647 15.2049 18.6312 14.9062 17.8389 14.7324C17.4346 14.6435 17.1789 14.2433 17.2676 13.8389ZM9 1.25C11.6234 1.25 13.75 3.37665 13.75 6C13.75 8.62335 11.6234 10.75 9 10.75C6.37665 10.75 4.25 8.62335 4.25 6C4.25 3.37665 6.37665 1.25 9 1.25ZM15 2.25C17.0711 2.25 18.75 3.92893 18.75 6C18.75 8.07107 17.0711 9.75 15 9.75C14.5858 9.75 14.25 9.41421 14.25 9C14.25 8.58579 14.5858 8.25 15 8.25C16.2426 8.25 17.25 7.24264 17.25 6C17.25 4.75736 16.2426 3.75 15 3.75C14.5858 3.75 14.25 3.41421 14.25 3C14.25 2.58579 14.5858 2.25 15 2.25ZM9 2.75C7.20507 2.75 5.75 4.20507 5.75 6C5.75 7.79493 7.20507 9.25 9 9.25C10.7949 9.25 12.25 7.79493 12.25 6C12.25 4.20507 10.7949 2.75 9 2.75Z\",\n    fill: fill\n  }));\n};\nconst SubscriptionsTabIconActive = ({\n  style\n}) => {\n  const flat = Array.isArray(style) ? ReactNative.StyleSheet.flatten(style) : style;\n  const fill = flat?.color ?? '#FE375B';\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9.00098 13.001C12.867 13.001 16.001 14.7918 16.001 17.001C16.001 19.2101 12.867 21.001 9.00098 21.001C5.13498 21.001 2.00098 19.2101 2.00098 17.001C2.00098 14.7918 5.13498 13.001 9.00098 13.001ZM16.4766 14.001C18.9615 14.0011 20.9996 15.3434 21 17C21 18.6569 18.9638 20 16.4785 20C17.2107 19.1997 17.7148 18.1955 17.7148 17.002C17.7148 15.8071 17.2099 14.8017 16.4766 14.001ZM9.00098 2C11.2101 2 13.001 3.79086 13.001 6C13.001 8.20914 11.2101 10 9.00098 10C6.79184 10 5.00098 8.20914 5.00098 6C5.00098 3.79086 6.79184 2 9.00098 2ZM15 3.00098C16.6567 3.00118 18 4.34425 18 6.00098C17.9999 7.65759 16.6566 9.00078 15 9.00098C14.6388 9.00098 14.2924 8.93633 13.9717 8.81934C14.4445 7.98748 14.7148 7.02523 14.7148 6C14.7148 4.97534 14.4449 4.0132 13.9727 3.18164C14.2931 3.06489 14.6392 3.00098 15 3.00098Z\",\n    fill: fill\n  }));\n};\nconst LiveTabIcon = ({\n  style\n}) => {\n  const flat = Array.isArray(style) ? ReactNative.StyleSheet.flatten(style) : style;\n  const fill = flat?.color ?? '#04060F';\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 28,\n    height: 28,\n    viewBox: \"0 0 28 28\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.8353 2.93047C17.1498 2.56356 17.7027 2.52125 18.0697 2.83574C18.4363 3.15027 18.4787 3.70234 18.1644 4.06914L15.6527 6.99981H17.5003V25.6668H9.33333C6.03364 25.6668 4.38386 25.6664 3.35872 24.6414C2.33362 23.6163 2.33333 21.9664 2.33333 18.6668V13.9998C2.33333 10.7 2.3336 9.05032 3.35872 8.0252C4.38385 7.00009 6.03352 6.99981 9.33333 6.99981H12.348L9.83528 4.06914C9.52097 3.70223 9.56414 3.15018 9.93098 2.83574C10.2979 2.52133 10.8499 2.56359 11.1644 2.93047L14.0003 6.23809L16.8353 2.93047ZM19.2503 6.99981C22.1648 7.00336 23.6791 7.06238 24.6419 8.0252C25.6667 9.05034 25.6663 10.7003 25.6663 13.9998V18.6668C25.6663 21.9662 25.6668 23.6163 24.6419 24.6414C23.6791 25.6042 22.1648 25.6623 19.2503 25.6658V6.99981ZM22.1663 17.4998C21.5222 17.5 21.0003 18.0226 21.0003 18.6668C21.0005 19.3108 21.5223 19.8326 22.1663 19.8328C22.8105 19.8328 23.3331 19.3109 23.3333 18.6668C23.3333 18.0225 22.8107 17.4998 22.1663 17.4998ZM22.1663 12.8328C21.5222 12.833 21.0003 13.3556 21.0003 13.9998C21.0004 14.644 21.5222 15.1666 22.1663 15.1668C22.8106 15.1668 23.3333 14.6441 23.3333 13.9998C23.3333 13.3555 22.8107 12.8328 22.1663 12.8328Z\",\n    fill: fill\n  }));\n};\nconst LiveTabIconActive = ({\n  style\n}) => {\n  const flat = Array.isArray(style) ? ReactNative.StyleSheet.flatten(style) : style;\n  const fill = flat?.color ?? '#FE375B';\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 28,\n    height: 28,\n    viewBox: \"0 0 28 28\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.8353 2.93047C17.1498 2.56356 17.7027 2.52125 18.0697 2.83574C18.4363 3.15027 18.4787 3.70234 18.1644 4.06914L15.6527 6.99981H17.5003V25.6668H9.33333C6.03364 25.6668 4.38386 25.6664 3.35872 24.6414C2.33362 23.6163 2.33333 21.9664 2.33333 18.6668V13.9998C2.33333 10.7 2.3336 9.05032 3.35872 8.0252C4.38385 7.00009 6.03352 6.99981 9.33333 6.99981H12.348L9.83528 4.06914C9.52097 3.70223 9.56414 3.15018 9.93098 2.83574C10.2979 2.52133 10.8499 2.56359 11.1644 2.93047L14.0003 6.23809L16.8353 2.93047ZM19.2503 6.99981C22.1648 7.00336 23.6791 7.06238 24.6419 8.0252C25.6667 9.05034 25.6663 10.7003 25.6663 13.9998V18.6668C25.6663 21.9662 25.6668 23.6163 24.6419 24.6414C23.6791 25.6042 22.1648 25.6623 19.2503 25.6658V6.99981ZM22.1663 17.4998C21.5222 17.5 21.0003 18.0226 21.0003 18.6668C21.0005 19.3108 21.5223 19.8326 22.1663 19.8328C22.8105 19.8328 23.3331 19.3109 23.3333 18.6668C23.3333 18.0225 22.8107 17.4998 22.1663 17.4998ZM22.1663 12.8328C21.5222 12.833 21.0003 13.3556 21.0003 13.9998C21.0004 14.644 21.5222 15.1666 22.1663 15.1668C22.8106 15.1668 23.3333 14.6441 23.3333 13.9998C23.3333 13.3555 22.8107 12.8328 22.1663 12.8328Z\",\n    fill: fill\n  }));\n};\n\n// Проверка включения фич (Feed, Chat, Subscriptions) TODO: Вынести в отдельный сервис и сущность\n// На stage всё включено, иначе — по флагам (по умолчанию выключены)\n// const getFeatureFlags = () => {\n//   const session = State.state.session?.value;\n//   return {\n//   };\n// };\n\nconst openProtectedTab = (id, source) => {\n  if (State.api?.guest?.isGuestOrEmptySession?.()) {\n    State.api?.guest?.openRegisterSheet?.('restricted_action', source);\n    return;\n  }\n  Navigation.goto({\n    name: id\n  });\n};\nlet devClickCount = 0;\nconst getTabs = ({\n  onLongPressRandom\n}) => {\n  const allTabs = [{\n    id: 'Subscriptions',\n    text: 'subscriptionsTab',\n    icon: SubscriptionsTabIcon,\n    iconActive: SubscriptionsTabIconActive,\n    testID: 'tab_subscriptions',\n    onClick: () => openProtectedTab('Subscriptions', 'tab_subscriptions')\n  }, {\n    id: 'Live',\n    text: 'liveTab',\n    icon: LiveTabIcon,\n    iconActive: LiveTabIconActive,\n    testID: 'tab_live'\n  }, {\n    id: 'Feed',\n    text: 'feed',\n    icon: Assets.Feed,\n    iconActive: Assets.FeedFill,\n    testID: 'tab_feed',\n    onClick: () => openProtectedTab('Feed', 'tab_feed')\n  }, {\n    id: 'Random',\n    text: 'camee',\n    icon: Assets.Random,\n    iconActive: Assets.RandomFill,\n    onLongPress: onLongPressRandom,\n    testID: 'tab_random',\n    onClick: () => openProtectedTab('Random', 'tab_random')\n  }, {\n    id: 'Store',\n    text: 'shopPageTitle',\n    icon: Assets.Store,\n    iconActive: Assets.StoreFill,\n    testID: 'tab_store',\n    onClick: () => openProtectedTab('Store', 'tab_store'),\n    onLongPress: () => {\n      if (State.state.isDev.value) {\n        State.bus.debugMode.next(\"opaque\");\n      } else {\n        devClickCount++;\n        if (devClickCount >= 5) {\n          State.state.isDev.next(true);\n          Speech.speak(\"dev mode activated\", {\n            language: \"en-US\"\n          });\n        }\n      }\n    }\n  }, {\n    id: 'Chat',\n    text: 'chat',\n    icon: Assets.Chat,\n    iconActive: Assets.ChatFill,\n    testID: 'tab_chats',\n    onClick: () => openProtectedTab('Chat', 'tab_chats')\n  }];\n  return allTabs.filter(tab => {\n    return true;\n  });\n};\nconst getPrerender = () => {\n  return [];\n};\nreturn () => {\n  const initialRoute = {\n    ...login\n  };\n  const initialNavigationState = {\n    routes: [State._initialRoute ?? initialRoute].filter(Boolean)\n  };\n  const services = [uiAuditService, frontendErrorAuditService,\n  // {\n  //   name: \"ResetMute\",\n  //   subs() {\n  //     return Rx.combineLatest([\n  //       State.state.call.pipe(\n  //         Rx.map(call => call?.sessionId),\n  //         Rx.distinctUntilChanged(),\n  //         Rx.tap(async () => {\n  //           if (State.state.mute.value) {\n  //             State.state.mute.next(false);\n  //           }\n  //         }),\n  //       ),\n  //     ]);\n  //   },\n  // },\n  {\n    name: \"OnRemove\",\n    subs() {\n      return State.state.session.pipe(Rx.map(session => session?.remove), Rx.distinctUntilChanged(), Rx.tap(_async(function (remove) {\n        if (remove != null) {\n          State.stopStream();\n        }\n        return _await();\n      })));\n    }\n  }, {\n    name: \"OnBan\",\n    subs() {\n      return State.state.session.pipe(Rx.map(session => session?.ban), Rx.distinctUntilChanged(), Rx.tap(_async(function (ban) {\n        if (ban != null) {\n          State.stopStream();\n        }\n        return _await();\n      })));\n    }\n  }, ffService, callService, reconnectService, isPipLocalService, logoutCallService, removeOrBanCallService, peerService, roomService, socketConnectionService, showFaceService, reportService, headersService, storeService, checkService, videoService, timezoneService, unreadCounterService, pushService, subService, streamChatService, liveViewerService, liveService, streamStatsService, watchService, feedService, onlineService, chatService, chatRoomService, chatMessageService, usersService, limitsService, statusService, productsService, profileService, sessionService, historyService, snackService, rateUsService, appUpdateService, giftsService, guestService, guestVideoChatCounterService, banPollingService];\n  State.api = {};\n  for (const service of services) {\n    if (service?.api?.name) {\n      State.api[service.api.name] = service.api;\n    }\n  }\n  const manifest = {\n    onPush: onPushManifest,\n    onUrl: (url, data) => {\n      currentUrl = url;\n      const roomMatch1 = typeof url === 'string' ? url.match(/\\/room\\/([^/?#]+)/) : null;\n      const roomMatch2 = typeof url === 'string' ? url.match(/\\/room\\?id=([^/?#]+)/) : null;\n      const uri = new URL(url, 'https://camee.io');\n      const roomId = roomMatch1?.[1] ?? roomMatch2?.[1] ?? uri.searchParams?.get('roomId') ?? uri.searchParams?.get('id');\n      if (roomId != null) {\n        initialRoute.params = {\n          ...(initialRoute.params ?? {}),\n          roomId: decodeURIComponent(roomId)\n        };\n        initialRoute.name = 'Room';\n      } else if (url.endsWith('/settings')) {\n        initialRoute.name = 'Settings';\n      } else if (url.endsWith('/delete')) {\n        initialRoute.name = 'Delete';\n      } else if (url.includes('/profile/gifts/from')) {\n        try {\n          const pathSenderId = uri.pathname.match(/\\/profile\\/gifts\\/from\\/([^/?#]+)/)?.[1];\n          const querySenderId = uri.searchParams?.get('senderId');\n          const senderId = pathSenderId && pathSenderId !== ':senderId' ? decodeURIComponent(pathSenderId) : querySenderId;\n          initialRoute.name = 'ProfileGiftsSender';\n          initialRoute.params = senderId ? {\n            senderId\n          } : {};\n        } catch (e) {\n          initialRoute.name = 'ProfileGiftsSender';\n        }\n      } else if (url.endsWith('/profile/gifts')) {\n        initialRoute.name = 'ProfileGifts';\n      } else if (url.endsWith('/profile')) {\n        initialRoute.name = 'Profile';\n      } else if (url.endsWith('/store')) {\n        initialRoute.name = 'Store';\n      } else if (url.endsWith('/feed')) {\n        initialRoute.name = 'Feed';\n      } else if (url.endsWith('/live') || url.includes('/live?')) {\n        try {\n          const uri = new URL(url, 'https://camee.io');\n          const id = uri?.searchParams?.get('id');\n          if (!!id) {\n            if (initialRoute.params == null) initialRoute.params = {};\n            initialRoute.params.id = id;\n          }\n        } catch (e) {}\n        initialRoute.name = 'Live';\n      } else if (url.endsWith('/streaming') || url.includes('/streaming?')) {\n        try {\n          const uri = new URL(url, 'https://camee.io');\n          const id = uri?.searchParams?.get('id');\n          if (!!id) {\n            if (initialRoute.params == null) initialRoute.params = {};\n            initialRoute.params.id = id;\n          }\n        } catch (e) {}\n        initialRoute.name = 'Streaming';\n      } else if (url.endsWith('/watch') || url.includes('/watch?') || url.endsWith('/stream') || url.includes('/stream?')) {\n        try {\n          const uri = new URL(url, 'https://camee.io');\n          const id = uri?.searchParams?.get('id');\n          if (!!id) {\n            if (initialRoute.params == null) initialRoute.params = {};\n            initialRoute.params.id = id;\n          }\n        } catch (e) {}\n        initialRoute.name = 'Live';\n      } else if (url.endsWith('/subscriptions')) {\n        initialRoute.name = 'Subscriptions';\n      } else if (url.endsWith('/random') || uri.pathname === '/' || uri.pathname === '') {\n        initialRoute.name = 'Random';\n      } else if (url.endsWith('/profile-edit')) {\n        initialRoute.name = 'Profile';\n      } else if (url.endsWith('/chat') || url.includes('/chat?')) {\n        try {\n          const chatId = uri?.searchParams?.get('chatId');\n          const userId = uri?.searchParams?.get('userId');\n          if (!!chatId || !!userId) {\n            if (initialRoute.params == null) initialRoute.params = {};\n            if (chatId != null && chatId != 'null') initialRoute.params.chatId = chatId;\n            if (userId != null && userId != 'null') initialRoute.params.userId = userId;\n          }\n        } catch (e) {}\n        initialRoute.name = 'Chat';\n      } else if (typeof url === 'string' && url.includes('/sub-pay')) {\n        try {\n          const top = uri?.searchParams?.get('top');\n          if (initialRoute.params == null) initialRoute.params = {};\n          if (!!top) initialRoute.params.top = top;\n        } catch (e) {}\n        initialRoute.name = 'SubPay';\n      }\n    },\n    call: {\n      onRecall,\n      onReconnect,\n      onStart,\n      onTryStart,\n      onTryStartIfSearching,\n      onRecall,\n      onStop,\n      Call2P2\n    },\n    peer: {\n      setPeerData,\n      setPeerRemoteData,\n      subPeer,\n      subPeerData,\n      subPeerRemoteData,\n      subPeerByUserId,\n      unsetPeerData,\n      unsetPeerRemoteData,\n      updatePeer,\n      usePeer,\n      usePeerData,\n      usePeerRemoteData,\n      usePeerByUserId\n    },\n    purchase: {\n      loadIAPProducts,\n      ids: []\n    },\n    login: login,\n    home: home,\n    init: initialNavigationState,\n    tabs: getTabs({}),\n    // Список экранов для пререндера — рендерятся скрыто после авторизации\n    prerender: getPrerender(),\n    pages: {\n      // WebMainFrame: {\n      //   path: '',\n      //   screen: withoutAuthGuard(PageModule('webMainFrame'), 'WebMainFrame'),\n      //   options: {\n      //     title: 'Web Main Frame',\n      //     headerShown: false,\n      //   },\n      // },\n      Login: {\n        path: 'login',\n        screen: withoutAuthGuard(AuditedLoginScreen, 'Login'),\n        options: {\n          title: 'Login',\n          headerShown: false\n        }\n      },\n      LoginEmail: {\n        path: 'email',\n        screen: withoutAuthGuard(PageModule('loginEmail'), 'LoginEmail'),\n        options: {\n          title: 'Login Email',\n          headerShown: false\n        }\n      },\n      AgeGate: {\n        path: 'age-gate',\n        screen: withoutAuthGuard(PageModule('ageGate'), 'AgeGate'),\n        options: {\n          title: 'Age Verification',\n          headerShown: false\n        }\n      },\n      EmailPassword: {\n        path: 'password',\n        screen: withoutAuthGuard(PageModule('emailPassword'), 'EmailPassword'),\n        options: {\n          title: 'Email Password',\n          headerShown: false\n        }\n      },\n      EmailRestore: {\n        path: 'restore',\n        screen: withoutAuthGuard(PageModule('emailRestore'), 'EmailRestore'),\n        options: {\n          title: 'Email Restore',\n          headerShown: false\n        }\n      },\n      Meta: {\n        path: 'meta',\n        screen: withAuthGuard(PageModule('meta'), 'Meta', {\n          authRequired: true\n        }),\n        options: {\n          title: 'Meta',\n          headerShown: false\n        }\n      },\n      Delete: {\n        path: 'delete',\n        screen: withAuthGuard(PageModule('delete'), 'Delete', {\n          authRequired: true\n        }),\n        options: {\n          title: 'Delete',\n          headerShown: false\n        }\n      },\n      Remove: {\n        noTransition: true,\n        path: 'remove',\n        screen: withAuthGuard(PageModule('deleted'), 'Remove'),\n        options: {\n          title: 'Remove',\n          headerShown: false\n        }\n      },\n      Ban: {\n        noTransition: true,\n        path: 'ban',\n        screen: withAuthGuard(PageModule('ban'), 'Ban'),\n        options: {\n          title: 'Ban',\n          headerShown: false\n        }\n      },\n      // Home: {\n      //   screen: withAuthGuard(Screens.Home),\n      //   options: {\n      //     path: '',\n      //     title: 'Home',\n      //     headerShown: false,\n      //   },\n      // },\n\n      Random: {\n        noTransition: true,\n        // screen: withAuthGuard(Screens.RandomChat),\n        screen: withAuthGuard(PageModule('randomChat'), 'Random'),\n        options: {\n          path: 'random',\n          title: 'Camble',\n          headerShown: false,\n          lazy: false\n        }\n      },\n      Store: {\n        noTransition: true,\n        screen: withAuthGuard(PageModule('store'), 'Store'),\n        options: {\n          path: 'store',\n          title: 'Store',\n          headerShown: false,\n          lazy: false\n        }\n      },\n      Feed: {\n        noTransition: true,\n        screen: withAuthGuard(PageModule('feed'), 'Feed'),\n        options: {\n          path: 'feed',\n          title: 'Feed',\n          headerShown: false,\n          lazy: false\n        }\n      },\n      Live: {\n        noTransition: true,\n        screen: withGuestAccessGuard(PageModule('live'), 'Live'),\n        options: {\n          path: 'live',\n          title: 'Live',\n          headerShown: false,\n          lazy: false\n        }\n      },\n      Streaming: {\n        noTransition: true,\n        screen: withAuthGuard(Page('Streaming'), 'Streaming'),\n        options: {\n          path: 'streaming',\n          title: 'Streaming',\n          headerShown: false,\n          lazy: false\n        }\n      },\n      Subscriptions: {\n        noTransition: true,\n        screen: withAuthGuard(PageModule('subscriptions'), 'Subscriptions', {\n          authRequired: true\n        }),\n        options: {\n          path: 'subscriptions',\n          title: 'Subscriptions',\n          headerShown: false\n        }\n      },\n      Chat: {\n        noTransition: true,\n        screen: withAuthGuard(PageModule('chat'), 'Chat', {\n          authRequired: true\n        }),\n        options: {\n          path: 'chat',\n          title: 'Chat',\n          headerShown: false,\n          gestureEnabled: false\n        }\n      },\n      Profile: {\n        screen: withAuthGuard(PageModule('profile'), 'Profile', {\n          authRequired: true\n        }),\n        options: {\n          path: 'profile',\n          title: 'Profile',\n          headerShown: false,\n          lazy: false\n        }\n      },\n      ProfileEdit: {\n        screen: withAuthGuard(PageModule('profileEdit'), 'ProfileEdit', {\n          authRequired: true\n        }),\n        options: {\n          path: 'profile-edit',\n          title: 'Profile Edit',\n          headerShown: false\n        }\n      },\n      ProfileGifts: {\n        screen: withAuthGuard(PageModule('profileGifts'), 'ProfileGifts', {\n          authRequired: true\n        }),\n        options: {\n          path: 'profile/gifts',\n          title: 'Gifts',\n          headerShown: false\n        }\n      },\n      ProfileGiftsSender: {\n        screen: withAuthGuard(PageModule('profileGiftsSender'), 'ProfileGiftsSender'),\n        options: {\n          path: 'profile/gifts/from',\n          title: 'Gifter',\n          headerShown: false\n        }\n      },\n      Settings: {\n        screen: withAuthGuard(PageModule('settings'), 'Settings'),\n        options: {\n          path: 'settings',\n          title: 'Settings',\n          headerShown: false,\n          lazy: false\n        }\n      },\n      SubPay: {\n        screen: withAuthGuard(PageModule('subPay'), 'SubPay'),\n        options: {\n          path: 'sub-pay',\n          title: 'Subscribe',\n          headerShown: false\n        }\n      },\n      TikTok: {\n        screen: withAuthGuard(Page('TikTok'), 'TikTok'),\n        options: {\n          path: 'tiktok',\n          title: 'TikTok',\n          headerShown: false\n        }\n      },\n      Room: {\n        screen: withAuthGuard(Page('Room'), 'Room', {\n          authRequired: true\n        }),\n        options: {\n          path: 'room',\n          title: 'Room',\n          headerShown: false\n        }\n      }\n    },\n    services\n  };\n  return manifest;\n};","manifestKey":"330a8d70ad08c3b79b6ae970c427932cc4fb2b4a221067be737441148db8a1f5","modules":{"webMainFrame":{"name":"WebMainFrame"},"loginLayout":{"name":"LoginLayout"},"ageGate":{"name":"AgeGate"},"loginEmail":{"name":"LoginEmail"},"emailPassword":{"name":"EmailPassword"},"emailRestore":{"name":"EmailRestore"},"meta":{"name":"Meta"},"store":{"name":"Store","props":{"yookassa":false}},"profile":{"name":"Profile"},"profileEdit":{"name":"ProfileEdit"},"profileGifts":{"name":"ProfileGifts"},"profileGiftsSender":{"name":"ProfileGiftsSender"},"settings":{"name":"Settings"},"filter":{"name":"FilterModal"},"report":{"name":"ReportModal"},"randomChat":{"name":"RandomChat"},"pip":{"name":"Pip"},"cardModal":{"name":"CardModal"},"delete":{"name":"Delete"},"ban":{"name":"Ban"},"deleted":{"name":"Deleted"},"chat":{"name":"Chat"},"feed":{"name":"Feed"},"live":{"name":"Live"},"subscriptions":{"name":"Subscriptions"},"subPay":{"name":"SubPay"}},"components":{"WebMainFrame":{"name":"WebMainFrame","key":"8840441c2ef32bf5e29568098f4fa534bd56f64a528f412baebabf998986b67d","code":"deps: WebAppbar, WebFooter, WebNoCameraBanner;\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [assets] = ExpoAsset.useAssets?.([Assets.videoCards]) ?? [undefined];\n  const [videoCards] = assets?.map(a => a?.localUri) ?? [];\n  // Fallback to direct asset if ExpoAsset doesn't work (e.g., on web)\n  const imageSource = videoCards || Assets.videoCards;\n  const styles = {\n    root: {\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground,\n      position: 'relative',\n      width: '100%',\n      minWidth: 1640,\n      height: '100vh',\n      overflow: 'hidden'\n    },\n    contentContainer: {\n      position: 'absolute',\n      top: 90,\n      bottom: 90,\n      left: 0,\n      right: 0,\n      flexDirection: 'row',\n      width: '100%',\n      paddingHorizontal: 16,\n      gap: 16\n    },\n    leftContainer: {\n      flex: 1,\n      width: '50%',\n      backgroundColor: theme.theme.semantic.surface.regular.static.stPageBackground,\n      borderRadius: 40,\n      overflow: 'hidden'\n    },\n    rightContainer: {\n      flex: 1,\n      width: '50%',\n      borderRadius: 40,\n      overflow: 'hidden'\n    },\n    rightContainerImage: {\n      width: '100%',\n      height: '100%'\n    }\n  };\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    hide: true\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WebAppbar\"\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.leftContainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WebNoCameraBanner\"\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rightContainer\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory\",\n    source: imageSource,\n    style: styles.rightContainerImage,\n    contentFit: \"cover\"\n  }))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WebFooter\"\n  })));\n};"},"LoginLayout":{"name":"LoginLayout","key":"e1b32e32f864580820ee83acd08af7292e784fbeefe02399e0620d3e1d6aa3da","code":"deps: WithAppear\nfunction _empty() {}\nconst AppleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M19.6647 17.7233C19.3774 18.3871 19.0374 18.9981 18.6434 19.5599C18.1064 20.3257 17.6667 20.8558 17.3279 21.1502C16.8026 21.6334 16.2398 21.8809 15.6371 21.8949C15.2045 21.8949 14.6827 21.7718 14.0753 21.522C13.466 21.2733 12.906 21.1502 12.394 21.1502C11.857 21.1502 11.281 21.2733 10.665 21.522C10.048 21.7718 9.55099 21.902 9.17098 21.9149C8.59305 21.9395 8.017 21.685 7.442 21.1502C7.07501 20.83 6.61598 20.2812 6.06607 19.5036C5.47607 18.6732 4.991 17.7104 4.61099 16.6126C4.20402 15.4269 4 14.2787 4 13.1672C4 11.8939 4.27507 10.7956 4.82603 9.87534C5.25904 9.13612 5.83509 8.553 6.55606 8.12493C7.27703 7.69686 8.05605 7.47871 8.89497 7.46476C9.35401 7.46476 9.95597 7.60678 10.704 7.88591C11.45 8.16598 11.9289 8.308 12.1389 8.308C12.2959 8.308 12.828 8.14193 13.73 7.81085C14.583 7.50381 15.3029 7.37668 15.8927 7.42676C17.4908 7.55577 18.6915 8.18591 19.49 9.32119C18.0607 10.1874 17.3537 11.4007 17.3677 12.9571C17.3806 14.1694 17.8203 15.1783 18.6845 15.9793C19.0761 16.3511 19.5134 16.6384 20 16.8425C19.8945 17.1486 19.7831 17.4418 19.6647 17.7233ZM15.9994 3.29661C15.9994 4.24683 15.6524 5.13404 14.9606 5.95524C14.1258 6.93148 13.116 7.4956 12.021 7.40659C12.007 7.29259 11.9989 7.17261 11.9989 7.04654C11.9989 6.13433 12.396 5.15809 13.101 4.35988C13.453 3.95573 13.9006 3.61968 14.4435 3.35162C14.9852 3.08755 15.4976 2.94151 15.9795 2.9165C15.9936 3.04353 15.9994 3.17057 15.9994 3.2966Z\",\n    fill: \"white\"\n  }));\n};\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst GoogleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12.454 10.1818V14.0545H17.9457C17.7046 15.3 16.9809 16.3546 15.8956 17.0636L19.2073 19.5818C21.1368 17.8364 22.25 15.2728 22.25 12.2273C22.25 11.5183 22.1851 10.8364 22.0645 10.1819L12.454 10.1818Z\",\n    fill: \"#4285F4\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M6.73532 13.9033L5.9884 14.4637L3.34454 16.4818C5.02359 19.7454 8.46493 22 12.4538 22C15.2089 22 17.5189 21.1091 19.2073 19.5818L15.8956 17.0636C14.9865 17.6636 13.8267 18.0273 12.4538 18.0273C9.80074 18.0273 7.5466 16.2728 6.73949 13.9091L6.73532 13.9033Z\",\n    fill: \"#34A853\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M3.34455 7.51818C2.64885 8.86358 2.25 10.3818 2.25 11.9999C2.25 13.6181 2.64884 15.1364 3.34454 16.4818C3.34454 16.4908 6.73982 13.8999 6.73982 13.8999C6.53574 13.2999 6.41511 12.6636 6.41511 11.9998C6.41511 11.3361 6.53574 10.6998 6.73982 10.0998L3.34455 7.51818Z\",\n    fill: \"#FBBC05\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12.454 5.98181C13.9568 5.98181 15.2926 6.49089 16.3594 7.47272L19.2815 4.60912C17.5097 2.99097 15.2092 2 12.454 2C8.46514 2 5.0236 4.24544 3.34455 7.51818L6.73982 10.0998C7.54683 7.73613 9.80095 5.98181 12.454 5.98181Z\",\n    fill: \"#EA4335\"\n  }));\n};\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst VkIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: 2,\n    y: 2,\n    width: 20,\n    height: 20,\n    rx: 6,\n    fill: \"#0077FF\"\n  }), /*#__PURE__*/React.createElement(SVG.Text, {\n    x: 12,\n    y: 16,\n    textAnchor: \"middle\",\n    fontSize: 10,\n    fontWeight: 700,\n    fill: \"#FFFFFF\"\n  }, \"VK\"));\n};\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst getLegalLinks = (localeValue, ipCountryValue) => {\n  const normalizedLocale = String(localeValue ?? '').toLowerCase();\n  const isRuLocale = normalizedLocale === 'ru' || normalizedLocale.startsWith('ru-');\n  const isRuGeo = String(ipCountryValue ?? '').toUpperCase() === 'RU';\n  const useRuDocs = isRuLocale || isRuGeo;\n  if (useRuDocs) {\n    return {\n      eula: 'https://www.modern-com.ru/eula.html',\n      privacy: 'https://www.modern-com.ru/privacy.html',\n      terms: 'https://www.modern-com.ru/terms.html',\n      community: 'https://www.modern-com.ru/community.html'\n    };\n  }\n  return {\n    eula: 'https://welcome.camble.online/legal/docs/eula.html',\n    privacy: 'https://welcome.camble.online/legal/docs/privacy.html',\n    terms: 'https://welcome.camble.online/legal/docs/terms.html',\n    community: 'https://welcome.camble.online/legal/docs/community-guidelines.html'\n  };\n};\nconst styles = {\n  root: {\n    flex: 1,\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'flex-start'\n  },\n  container: {\n    flex: 1,\n    maxWidth: 600,\n    width: '100%',\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'flex-start'\n  },\n  buttonContent: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: 8\n  },\n  mailIcon: {\n    paddingLeft: 4\n  },\n  figmaBlock: {\n    paddingTop: 24,\n    width: 351,\n    maxWidth: '100%'\n  },\n  figmaTitle: {\n    fontWeight: 800,\n    fontSize: 44,\n    lineHeight: 52,\n    color: '#FFF',\n    letterSpacing: -0.6\n  },\n  figmaSubtitle: {\n    marginTop: 4,\n    fontWeight: 800,\n    fontSize: 44,\n    lineHeight: 52,\n    color: '#FE375B',\n    letterSpacing: -0.3\n  },\n  bottomTextWrapper: {\n    position: 'absolute',\n    bottom: 4,\n    left: 0,\n    right: 0,\n    alignItems: 'center',\n    paddingHorizontal: 24\n  },\n  bottomText: {\n    fontSize: 10,\n    lineHeight: 14,\n    fontWeight: '500',\n    textAlign: 'center',\n    color: 'rgba(255,255,255,0.6)',\n    opacity: 0.6\n  },\n  link: {\n    textDecorationLine: 'underline',\n    color: 'rgba(255,255,255,0.8)'\n  },\n  buttonsBlock: {\n    width: '100%',\n    marginTop: 48,\n    flexDirection: 'column',\n    gap: 12,\n    paddingHorizontal: 24\n  },\n  buttonBase: {\n    width: '100%',\n    height: 56,\n    borderRadius: 12,\n    alignItems: 'center',\n    justifyContent: 'center'\n  },\n  buttonPrimary: {\n    backgroundColor: '#FFFFFF'\n  },\n  buttonSecondary: {\n    backgroundColor: 'rgba(255,255,255,0.1)'\n  },\n  buttonTextPrimary: {\n    color: '#000',\n    fontSize: 16,\n    fontWeight: 600\n  },\n  buttonTextSecondary: {\n    color: '#FFF',\n    fontSize: 16,\n    fontWeight: 600\n  }\n};\nlet count = 0;\nreturn () => {\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const navigation = ReactNavigation.useNavigation();\n  const t = Locale.useTranslation();\n  const session = State.api?.session?.useSession?.();\n  const {\n    locale: currentLocale\n  } = Locale.useLocale();\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const [size] = Hooks.useBehaviorSubject(State.state.size);\n  const country = session?.ip?.country?.toLocaleUpperCase();\n  const ipCountry = session?.ip?.country;\n  const legalLinks = React.useMemo(() => getLegalLinks(currentLocale, ipCountry), [currentLocale, ipCountry]);\n  const [rootHeight, setRootHeight] = React.useState(0);\n  const [containerWidth, setContainerWidth] = React.useState(0);\n  const [bottomHeight, setBottomHeight] = React.useState(0);\n  const [headerLayout, setHeaderLayout] = React.useState({\n    x: 0,\n    y: 0,\n    width: 0,\n    height: 0\n  });\n  const isLandscape = size.width > size.height;\n  const isWide = isLandscape || isTablet;\n  const isStatic = ReactNative.Platform.OS === 'web' || isWide;\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      bottom: 0,\n      top: 0,\n      overflow: 'hidden'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: isStatic ? 1.1 : 1.0,\n    delay: 100,\n    duration: 2000,\n    translateY: 0,\n    style: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      bottom: 0,\n      top: 0\n    }\n  }, !isStatic && typeof MobileBG != 'undefined' && /*#__PURE__*/React.createElement(MobileBG, null), isStatic && /*#__PURE__*/React.createElement(Image, {\n    style: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      bottom: 0,\n      top: 0\n    },\n    transition: {\n      duration: 500,\n      effect: 'cross-dissolve'\n    },\n    cachePolicy: 'memory-disk',\n    contentFit: \"cover\",\n    source: State.getUrl('/api/component/assets/main.webp')\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      paddingTop: safeArea.top,\n      paddingLeft: safeArea.left,\n      paddingBottom: safeArea.bottom,\n      paddingRight: safeArea.right\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root,\n    onLayout: ({\n      nativeEvent\n    }) => setRootHeight(nativeEvent.layout.height)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container,\n    onLayout: ({\n      nativeEvent\n    }) => setContainerWidth(nativeEvent.layout.width)\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    translateY: 0,\n    style: {\n      width: '100%',\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: isWide ? 'center' : 'flex-start'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      paddingHorizontal: 24,\n      paddingTop: 32,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: isWide ? 'center' : 'flex-start'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    onLayout: ({\n      nativeEvent\n    }) => setHeaderLayout(nativeEvent.layout),\n    onLongPress: () => {\n      if (State.state.isDev.value) {\n        State.bus.debugMode.next(\"opaque\");\n      } else {\n        count++;\n        if (count >= 5) {\n          State.state.isDev.next(true);\n          Speech.speak(\"dev mode activated\", {\n            language: \"en-US\"\n          });\n        }\n      }\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [{\n      width: '100%',\n      paddingBottom: 16,\n      flexDirection: 'column',\n      alignItems: isWide ? 'center' : 'flex-start',\n      justifyContent: 'center'\n    }]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [{\n      width: '100%',\n      paddingBottom: 16,\n      flexDirection: 'column',\n      alignItems: isWide ? 'center' : 'flex-start',\n      justifyContent: 'center'\n    }]\n  }, /*#__PURE__*/React.createElement(Components.DSLogo, {\n    variant: \"full\",\n    colorScheme: \"pink-white\",\n    width: 195,\n    height: 57\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.figmaTitle\n  }, t(\"Real Conversations\")), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.figmaSubtitle, {\n      alignItems: isWide ? 'center' : 'left'\n    }]\n  }, t(\"Genuine vibes\")))))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    translateY: 0,\n    onLayout: ({\n      nativeEvent\n    }) => setBottomHeight(nativeEvent.layout.height),\n    style: {\n      width: '100%',\n      paddingHorizontal: 24,\n      paddingBottom: 16\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%',\n      flexDirection: 'column',\n      gap: 12,\n      marginBottom: 16\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => {\n      navigation.dispatch(ReactNavigation.StackActions.push('LoginEmail'));\n    },\n    style: [styles.buttonBase, styles.buttonPrimary]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonContent\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextPrimary\n  }, t(\"continueWithEmail\")), /*#__PURE__*/React.createElement(Assets.Email, {\n    style: styles.mailIcon\n  }))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: _async(function () {\n      const _State = State,\n        _loginApple = _State.loginApple;\n      return _await(State.api?.guestVideoChatCounter?.getGuestStarts?.(), function (_State$api$guestVideo) {\n        return _awaitIgnored(_loginApple.call(_State, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            trial_calls: _State$api$guestVideo ?? 0\n          }\n        }));\n      });\n    }),\n    style: [styles.buttonBase, styles.buttonSecondary]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonContent\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t(\"continueWithApple\")), /*#__PURE__*/React.createElement(AppleIcon, {\n    style: styles.mailIcon\n  }))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: _async(function () {\n      const _State2 = State,\n        _loginGoogle = _State2.loginGoogle;\n      return _await(State.api?.guestVideoChatCounter?.getGuestStarts?.(), function (_State$api$guestVideo2) {\n        return _awaitIgnored(_loginGoogle.call(_State2, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            trial_calls: _State$api$guestVideo2 ?? 0\n          }\n        }));\n      });\n    }),\n    style: [styles.buttonBase, styles.buttonSecondary]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonContent\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t(\"continueWithGmail\")), /*#__PURE__*/React.createElement(GoogleIcon, {\n    style: styles.mailIcon\n  }))), ['RU'].includes(country) && ReactNative.Platform.OS === 'web' && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: _async(function () {\n      const _State3 = State,\n        _loginVk = _State3.loginVk;\n      return _await(State.api?.guestVideoChatCounter?.getGuestStarts?.(), function (_State$api$guestVideo3) {\n        return _awaitIgnored(_loginVk.call(_State3, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            trial_calls: _State$api$guestVideo3 ?? 0\n          }\n        }));\n      });\n    }),\n    style: [styles.buttonBase, styles.buttonSecondary]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonContent\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t(\"continueWithVk\")), /*#__PURE__*/React.createElement(VkIcon, {\n    style: styles.mailIcon\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      alignItems: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.bottomText\n  }, t(\"authLegal\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.link,\n    onPress: () => Linking.openURL(State.getUrl(legalLinks.terms))\n  }, t(\"authToS\")), \" \", t(\"authAnd\"), \" \", /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.link,\n    onPress: () => Linking.openURL(State.getUrl(legalLinks.eula))\n  }, t(\"autheula\")), \".\\n\", t(\"authLearnHowWeUse\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.link,\n    onPress: () => Linking.openURL(State.getUrl(legalLinks.privacy))\n  }, t(\"authPrivacy\")), \".\")))))));\n};"},"AgeGate":{"name":"AgeGate","key":"23406f41abed3edd7de2f4d18e71e107f0496114839f070231fbad649d71e81d","code":"deps: EULAModal\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst styles = {\n  container: {\n    flex: 1,\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n    paddingHorizontal: 24\n  },\n  card: {\n    width: '100%',\n    maxWidth: 480,\n    flexDirection: 'column',\n    alignItems: 'center',\n    gap: 16\n  },\n  hero: {\n    width: 220,\n    height: 192,\n    marginBottom: 4\n  },\n  title: {\n    color: '#FFFFFF',\n    fontSize: 28,\n    fontWeight: 800,\n    lineHeight: 34,\n    textAlign: 'center',\n    letterSpacing: -0.4\n  },\n  subtitle: {\n    color: 'rgba(255,255,255,0.6)',\n    fontSize: 15,\n    lineHeight: 22,\n    textAlign: 'center'\n  },\n  buttons: {\n    width: '100%',\n    flexDirection: 'column',\n    gap: 12,\n    marginTop: 8\n  },\n  buttonBase: {\n    width: '100%',\n    height: 56,\n    borderRadius: 12,\n    alignItems: 'center',\n    justifyContent: 'center'\n  },\n  buttonPrimary: {\n    backgroundColor: '#FE375B'\n  },\n  buttonSecondary: {\n    backgroundColor: 'rgba(255,255,255,0.1)'\n  },\n  buttonTextPrimary: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: 600\n  },\n  buttonTextSecondary: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: 600\n  }\n};\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst getLegalLinks = (localeValue, ipCountryValue) => {\n  const normalizedLocale = String(localeValue ?? '').toLowerCase();\n  const isRuLocale = normalizedLocale === 'ru' || normalizedLocale.startsWith('ru-');\n  const isRuGeo = String(ipCountryValue ?? '').toUpperCase() === 'RU';\n  const useRuDocs = isRuLocale || isRuGeo;\n  if (useRuDocs) {\n    return {\n      eula: 'https://www.modern-com.ru/eula.html',\n      privacy: 'https://www.modern-com.ru/privacy.html',\n      terms: 'https://www.modern-com.ru/terms.html',\n      community: 'https://www.modern-com.ru/community.html'\n    };\n  }\n  return {\n    eula: 'https://welcome.camble.online/legal/docs/eula.html',\n    privacy: 'https://welcome.camble.online/legal/docs/privacy.html',\n    terms: 'https://welcome.camble.online/legal/docs/terms.html',\n    community: 'https://welcome.camble.online/legal/docs/community-guidelines.html'\n  };\n};\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nconst CookieConsentModal = () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const session = State.api?.session?.useSession?.();\n  const {\n    locale: currentLocale\n  } = Locale.useLocale();\n  const ipCountry = session?.ip?.country;\n  const legalLinks = React.useMemo(() => getLegalLinks(currentLocale, ipCountry), [currentLocale, ipCountry]);\n  const cookieModalStyles = React.useMemo(() => ({\n    container: {\n      width: '100%',\n      paddingTop: 20,\n      paddingHorizontal: 16,\n      paddingBottom: 16,\n      gap: 4,\n      position: 'relative'\n    },\n    icon: {\n      position: 'absolute',\n      top: -40,\n      left: 8,\n      width: 64,\n      height: 64\n    },\n    title: {\n      color: '#04060F',\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.7\n    },\n    description: {\n      color: 'rgba(4,6,15,0.5)',\n      fontFamily: theme.theme.typography.family.body,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    },\n    link: {\n      color: '#FE375B'\n    },\n    buttonsRow: {\n      flexDirection: 'row',\n      gap: 8,\n      width: '100%',\n      marginTop: 4\n    },\n    button: {\n      flex: 1,\n      borderRadius: 12,\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 12\n    },\n    buttonReject: {\n      backgroundColor: 'rgba(4,6,15,0.1)'\n    },\n    buttonAccept: {\n      backgroundColor: '#FE375B'\n    },\n    buttonText: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.14\n    },\n    buttonTextReject: {\n      color: '#04060F'\n    },\n    buttonTextAccept: {\n      color: '#FFFFFF'\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: cookieModalStyles.container\n  }, /*#__PURE__*/React.createElement(Image, {\n    style: cookieModalStyles.icon,\n    contentFit: \"contain\",\n    cachePolicy: 'memory-disk',\n    source: State.getUrl('/api/component/assets/cookie.webp')\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: cookieModalStyles.title\n  }, t(\"cookieConsentTitle\")), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: cookieModalStyles.description\n  }, t(\"cookieConsentDescriptionPrefix\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: cookieModalStyles.link,\n    onPress: () => Linking.openURL(State.getUrl(legalLinks.privacy))\n  }, t(\"cookieConsentDescriptionLink\")), \".\"), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: cookieModalStyles.buttonsRow\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    title: t(\"cookieConsentRejectAll\"),\n    type: \"ghost\",\n    size: \"S\",\n    onPress: () => sheet.close(false),\n    style: [cookieModalStyles.button, cookieModalStyles.buttonReject],\n    textStyle: [cookieModalStyles.buttonText, cookieModalStyles.buttonTextReject]\n  }), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    title: t(\"cookieConsentAcceptAll\"),\n    type: \"brand\",\n    size: \"S\",\n    onPress: () => {\n      State.store.cookieConsent.next(true);\n      Analytics.initGtag();\n      sheet.close(true);\n    },\n    style: [cookieModalStyles.button, cookieModalStyles.buttonAccept],\n    textStyle: [cookieModalStyles.buttonText, cookieModalStyles.buttonTextAccept]\n  })));\n};\nconst checkCookie = _async(function () {\n  return _await(Analytics.restoreCookieConsent(), function (accepted) {\n    if (accepted) {\n      return;\n    }\n    return _await(Storage.getValueSecure('cookieV1'), function (value) {\n      if (typeof value === 'string' || State.store.cookie.value) {\n        return;\n      }\n      State.store.cookie.next(true);\n      return _await(Sheet.showModal(/*#__PURE__*/React.createElement(CookieConsentModal, null), {\n        props: {\n          swipeUp: false,\n          swipeDismissibleUp: false,\n          swipeDown: false,\n          swipeDismissibleDown: false,\n          closeClickOutside: false,\n          style: {\n            maxWidth: 600\n          }\n        }\n      }), function (result) {\n        const valueResult = result ? 'accepted' : 'declined';\n        State.store.cookie.next(false);\n        return _await(Storage.setValueSecure('cookieV1', valueResult), function () {\n          State.store.cookieConsent.next(valueResult === 'accepted');\n        });\n      });\n    });\n  });\n});\nreturn () => {\n  const {\n    locale: currentLocale\n  } = Locale.useLocale();\n  const t = Locale.useTranslation();\n  const session = State.api?.session?.useSession?.();\n  const [view, setView] = React.useState('question'); // 'question' | 'denied'\n  const [loading, setLoading] = React.useState(false);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS === 'web') {\n      checkCookie();\n    }\n  }, []);\n  const showEULA = React.useCallback(_async(function () {\n    return Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"EULAModal\"\n    }), {\n      holderMode: true,\n      props: {\n        style: {\n          maxWidth: 500\n        }\n      }\n    });\n  }), []);\n  const onYes = React.useCallback(function () {\n    return loading ? _await() : _call(showEULA, function (agreed) {\n      if (!agreed) {\n        return;\n      }\n      setLoading(true);\n      const isGuest = session?.user?.id != null && (session?.userConnection?.type === 'guest' || session?.card?.isGuest === true);\n      if (isGuest) {\n        State.api?.guest?.acceptGuestAgeGate?.();\n      }\n      Navigation.goto({\n        name: isGuest ? 'Random' : 'Login'\n      });\n      setLoading(false);\n    });\n  }, [showEULA, loading, currentLocale, session]);\n  const onNo = React.useCallback(() => {\n    setView('denied');\n  }, []);\n  const onMistake = React.useCallback(() => {\n    setView('question');\n  }, []);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    hide: true,\n    style: {\n      backgroundColor: '#04060F'\n    },\n    testID: \"page_ageGate\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.card\n  }, view === 'question' && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSImage, {\n    showLoader: false,\n    source: State.getUrl('/api/component/assets/guest/AgeGateQuestion.webp'),\n    style: styles.hero,\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('guestAgeGateTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, t('guestAgeGateSubtitle')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttons\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    disabled: loading,\n    onPress: onYes,\n    style: [styles.buttonBase, styles.buttonPrimary, loading ? {\n      opacity: 0.6\n    } : null]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextPrimary\n  }, loading ? t('guestLoading') : t('guestAgeGateYes'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    disabled: loading,\n    onPress: onNo,\n    style: [styles.buttonBase, styles.buttonSecondary, loading ? {\n      opacity: 0.6\n    } : null]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t('guestAgeGateNo'))))), view === 'denied' && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSImage, {\n    showLoader: false,\n    source: State.getUrl('/api/component/assets/guest/AgeGateStop.webp'),\n    style: styles.hero,\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('guestAgeDeniedTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, t('guestAgeDeniedSubtitle')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttons\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onMistake,\n    style: [styles.buttonBase, styles.buttonPrimary]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t('guestAgeMistake'))))))));\n};"},"LoginEmail":{"name":"LoginEmail","key":"9770cec9b187dcc1e462dcec7a49854a72df179b759a3d79d8152eb8563fe30a","code":"deps: IOSWebKeyboardButton\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst APPBAR_HEIGHT = 80;\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst PADDING = 12;\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst resolveColors = theme => ({\n  textColor: theme.component.button.ghost.content\n});\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst styles = {\n  root: {\n    flex: 1,\n    width: \"100%\",\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'flex-start'\n  },\n  body: {\n    flex: 1,\n    width: \"100%\",\n    maxWidth: 600,\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'flex-start',\n    paddingHorizontal: PADDING\n  },\n  appbar: {\n    width: \"100%\",\n    height: APPBAR_HEIGHT,\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between'\n  },\n  content: {\n    flex: 1,\n    paddingVertical: 16,\n    width: '100%'\n  },\n  buttonContainer: {\n    width: '100%',\n    paddingBottom: 12\n  }\n};\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn () => {\n  const theme = Theme.useTheme();\n  const navigation = ReactNavigation.useNavigation();\n  const route = ReactNavigation.useRoute();\n  const t = Locale.useTranslation();\n  const {\n    textColor\n  } = resolveColors(theme.theme);\n  const [email, setEmail] = React.useState('');\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState(false);\n  const loginSurface = route?.params?.loginSurface;\n  const validate = React.useCallback(value => {\n    const v = value.trim();\n    if (!v.length) return t('pleaseEnterEmail');\n    if (v.length > 254) return t('emailValidationTooLong');\n    if (!/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/.test(v)) return t('emailValidationDomain');\n    return null;\n  }, [t]);\n  const checkEmail = React.useCallback(_async(function () {\n    const validationError = validate(email);\n    if (validationError) {\n      setError(validationError);\n      return;\n    }\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        setIsLoading(true);\n        return _await(State.post('/api/login/email/check', {\n          email,\n          resend: false\n        }, 'json'), function (resp) {\n          const emailExists = Number(resp) === 1;\n          // Navigation.goto({\n          //   name: 'EmailPassword',\n          //   params: { email, exists: emailExists },\n          // });\n          navigation.dispatch(ReactNavigation.StackActions.push('EmailPassword', {\n            email,\n            exists: emailExists,\n            loginSurface\n          }));\n        });\n      }, function () {\n        setError(t('serverErrorMessage'));\n      });\n    }, function (_wasThrown, _result) {\n      setIsLoading(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [email, validate, t, loginSurface]);\n  const onGoBack = React.useCallback(() => {\n    if (navigation.canGoBack()) {\n      navigation.goBack();\n      return;\n    }\n    const session = State.state.session?.value;\n    const isGuest = session?.userConnection?.type === 'guest' || session?.card?.isGuest === true;\n    Navigation.goto({\n      name: isGuest ? 'Random' : State.state.manifest?.value?.login?.name ?? 'AgeGate'\n    });\n  }, [navigation]);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    scrollable: true,\n    hide: true,\n    testID: \"page_loginEmail\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.root, {\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    }]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.body\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbar\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    hitSlop: {\n      top: 20,\n      bottom: 20,\n      left: 20,\n      right: 20\n    },\n    onPress: onGoBack\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    size: 24,\n    style: {\n      color: textColor\n    }\n  })), /*#__PURE__*/React.createElement(Components.DSLogo, {\n    variant: \"full\",\n    colorScheme: theme.isDark ? 'pink-white' : 'pink-black',\n    width: 147,\n    height: 40\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: 40\n    }\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t('registerEmailTitle'),\n    subtitle: t('dataProtectionEmailBadge')\n  }), /*#__PURE__*/React.createElement(Components.DSTextInput, {\n    autoCorrect: false,\n    autofocus: true,\n    returnKeyType: \"done\",\n    onSubmitEditing: checkEmail,\n    value: email,\n    onChangeText: v => {\n      setEmail(v);\n      setError(null);\n    },\n    placeholder: t('emailInput'),\n    error: error,\n    onRightPress: checkEmail\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: styles.buttonContainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    disabled: !email.trim().length || isLoading,\n    width: \"100%\",\n    loading: isLoading,\n    onPress: checkEmail\n  }, t('buttonContinue'))))));\n};"},"EmailPassword":{"name":"EmailPassword","key":"5fbb9577324737a9a4a36f86e6a2974754770de480cda65d7316febe81163399","code":"deps: PasswordConditions, IOSWebKeyboardButton\nfunction _empty() {}\nconst APPBAR_HEIGHT = 80;\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst PADDING = 12;\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst resolveColors = theme => ({\n  textColor: theme.component.button.ghost.content\n});\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn () => {\n  const {\n    params\n  } = ReactNavigation.useRoute();\n  const {\n    email,\n    exists,\n    loginSurface\n  } = params;\n  const theme = Theme.useTheme();\n  const navigation = ReactNavigation.useNavigation();\n  const t = Locale.useTranslation();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const {\n    textColor\n  } = resolveColors(theme.theme);\n  const [mode, setMode] = React.useState(exists ? 'existing' : 'new');\n  const [pwd1, setPwd1] = React.useState('');\n  const [pwd2, setPwd2] = React.useState('');\n  const [error1, setError1] = React.useState(null);\n  const [error2, setError2] = React.useState(null);\n  const [loading, setLoading] = React.useState(false);\n  const styles = {\n    root: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start'\n    },\n    body: {\n      flex: 1,\n      width: \"100%\",\n      maxWidth: 600,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingHorizontal: PADDING\n    },\n    appbar: {\n      height: APPBAR_HEIGHT,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      width: \"100%\"\n    },\n    content: {\n      flex: 1,\n      paddingVertical: 16,\n      width: \"100%\"\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingBottom: 12\n    },\n    // subtitle + email styling\n    subtitle: {\n      ...(theme.theme.typography?.fonts?.body?.l ?? {}),\n      color: theme.theme.semantic.content.regular.secondary\n    },\n    subtitleEmail: {\n      color: theme.theme.semantic.content.brand.content1,\n      fontWeight: 700,\n      lineHeight: 22,\n      fontFamily: theme.theme.typography.family.paragraph\n    }\n  };\n\n  /* ---------- validation ---------- */\n  const validateExisting = React.useCallback(v => {\n    if (!v.length) return t('enterPasswordTitle');\n    if (v.length < 6) return t('passwordValidationLength');\n    return null;\n  }, []);\n  const validateNew = React.useCallback(v => {\n    if (!v.length) return t('enterPasswordTitle');\n    if (v.length < 8) return t('passwordValidationLength');\n    if (!/[A-ZА-ЯЁ]/.test(v)) return t('passwordValidationUpperCase');\n    return null;\n  }, []);\n  const validateConfirm = React.useCallback(v => !v.length ? t('repeatNewPassword') : v !== pwd1 ? t('passwordValidationNotMatch') : null, [pwd1]);\n\n  /* ---------- submit ---------- */\n  const submit = React.useCallback(_async(function () {\n    const err1 = mode === 'existing' ? validateExisting(pwd1) : validateNew(pwd1);\n    const err2 = mode === 'new' && !err1 ? validateConfirm(pwd2) : null;\n    setError1(err1);\n    setError2(err2);\n    if (err1 || err2) return;\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        setLoading(true);\n        const trafficAttribution = Analytics.getTrafficAttribution();\n        return _invokeIgnored(function () {\n          if (mode === 'existing') {\n            return _await(State.post('/api/login/email', {\n              email,\n              password: pwd1,\n              ...trafficAttribution\n            }, 'string'), function (token) {\n              return _awaitIgnored(State.onToken(token, {\n                loginMethod: 'email',\n                loginSurface\n              }));\n            });\n          } else {\n            return _await(State.api?.guestVideoChatCounter?.getGuestStarts?.(), function (trialCalls) {\n              return _await(State.post('/api/login/email/register', {\n                email,\n                password: pwd1,\n                ...trafficAttribution\n              }, 'string', undefined, undefined, {\n                analytics: {\n                  ...Analytics.getGlobalParams(),\n                  trial_calls: trialCalls\n                }\n              }), function (token) {\n                return _await(new Promise(r => setTimeout(r, 140)), function () {\n                  return _await(State.post('/api/login/email/check', {\n                    email,\n                    resend: true\n                  }, 'string'), function () {\n                    return _awaitIgnored(State.onToken(token, {\n                      loginMethod: 'email',\n                      loginSurface\n                    }));\n                  });\n                });\n              });\n            });\n          }\n        });\n      }, function (error) {\n        if (!State.notifyRegistrationLimitError(error)) {\n          setError1(t('wrongPasswordMessage'));\n        }\n      });\n    }, function (_wasThrown, _result) {\n      setLoading(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [mode, pwd1, pwd2, email, loginSurface]);\n  const goBackOrFallback = React.useCallback(fallback => {\n    if (navigation.canGoBack()) {\n      navigation.goBack();\n      return;\n    }\n    Navigation.goto({\n      name: fallback\n    });\n  }, [navigation]);\n  const onGoBack = React.useCallback(() => goBackOrFallback('LoginEmail'), [goBackOrFallback]);\n  const onGoBackRestore = React.useCallback(() => goBackOrFallback(State.state.manifest?.value?.login?.name ?? 'AgeGate'), [goBackOrFallback]);\n\n  /* ---------- restore ---------- */\n\n  const pwd1Trimmed = pwd1.trim();\n  const pwd2Trimmed = pwd2.trim();\n  const isButtonDisabled = loading || !pwd1Trimmed.length || mode === 'new' && !pwd2Trimmed.length;\n  if (mode === 'restore') {\n    return /*#__PURE__*/React.createElement(Components.DSPage, {\n      scrollable: true,\n      hide: true,\n      testID: \"page_emailPassword_restore\"\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.root, {\n        backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n      }]\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.appbar\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      hitSlop: {\n        top: 20,\n        bottom: 20,\n        left: 20,\n        right: 20\n      },\n      onPress: onGoBackRestore\n    }, /*#__PURE__*/React.createElement(Assets.Back, {\n      size: 24,\n      style: {\n        color: textColor\n      }\n    })), /*#__PURE__*/React.createElement(Components.DSLogo, {\n      variant: \"full\",\n      colorScheme: theme.isDark ? 'pink-white' : 'pink-black',\n      width: 147,\n      height: 40\n    }), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        width: 40\n      }\n    }))));\n  }\n\n  /* ---------- ui ---------- */\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    scrollable: true,\n    hide: true,\n    testID: \"page_emailPassword\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.root, {\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    }]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.body]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbar\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    hitSlop: {\n      top: 20,\n      bottom: 20,\n      left: 20,\n      right: 20\n    },\n    onPress: onGoBack\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    size: 24,\n    style: {\n      color: textColor\n    }\n  })), /*#__PURE__*/React.createElement(Components.DSLogo, {\n    variant: \"full\",\n    colorScheme: theme.isDark ? 'pink-white' : 'pink-black',\n    width: 147,\n    height: 40\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: 40\n    }\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: mode === 'existing' ? t('welcomeBack') : t('signupPasswordHeader'),\n    subtitleNode: mode === 'existing' ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.subtitle\n    }, t('enterSpecified'), '\\u00A0', /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.subtitleEmail\n    }, email)) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.subtitle\n    }, t('signupPasswordSubheader'))\n  }), /*#__PURE__*/React.createElement(Components.DSTextInput, {\n    value: pwd1,\n    autofocus: true,\n    placeholder: t('password'),\n    secure: true,\n    error: error1,\n    onChangeText: v => {\n      setPwd1(v);\n      setError1(null);\n    }\n  }), mode === 'new' && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PasswordConditions\",\n    value: pwd1,\n    value2: pwd2\n  }), mode === 'new' && /*#__PURE__*/React.createElement(Components.DSTextInput, {\n    value: pwd2,\n    placeholder: t('repeatNewPassword'),\n    secure: true,\n    error: error2,\n    onChangeText: v => {\n      setPwd2(v);\n      setError2(null);\n    },\n    onRightPress: submit\n  }), mode === 'existing' && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      paddingVertical: 12,\n      flexDirection: 'row'\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => navigation.dispatch(ReactNavigation.StackActions.push('EmailRestore', {\n      email,\n      loginSurface\n    }))\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 16,\n      fontWeight: 600\n    }\n  }, t('signinPasswordResetHeader'))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: styles.buttonContainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    disabled: isButtonDisabled,\n    size: \"L\",\n    type: \"brand\",\n    width: \"100%\",\n    loading: loading,\n    onPress: submit\n  }, t('buttonContinue'))))));\n};"},"EmailRestore":{"name":"EmailRestore","key":"42a535281dd9bad4a7c632788328201861ba99e38a6b76ff2e845b20e710231c","code":"deps: PasswordConditions, IOSWebKeyboardButton\nconst APPBAR_HEIGHT = 80;\nconst PADDING = 12;\nconst CELL_COUNT = 6;\nconst RESEND_SECONDS = 30;\nconst resolveColors = theme => ({\n  textColor: theme.component.button.ghost.content\n});\nreturn () => {\n  const {\n    params\n  } = ReactNavigation.useRoute();\n  const navigation = ReactNavigation.useNavigation();\n  const {\n    email,\n    loginSurface\n  } = params;\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const {\n    textColor\n  } = resolveColors(theme.theme);\n  const styles = React.useMemo(() => ({\n    root: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start'\n    },\n    body: {\n      flex: 1,\n      width: \"100%\",\n      maxWidth: 600,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingHorizontal: PADDING\n    },\n    appbar: {\n      height: APPBAR_HEIGHT,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      width: \"100%\"\n    },\n    // OTP6 layout: outer container with space-between\n    inner: {\n      flex: 1,\n      paddingTop: 8,\n      justifyContent: 'space-between',\n      width: \"100%\"\n    },\n    content: {\n      flex: 1,\n      paddingVertical: 16,\n      width: \"100%\"\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingBottom: 12\n    },\n    // subtitle + email styling\n    subtitle: {\n      ...(theme.theme.typography?.fonts?.body?.l ?? {}),\n      color: theme.theme.semantic.content.regular.secondary\n    },\n    subtitleEmail: {\n      color: theme.theme.semantic.content.brand.content1,\n      fontWeight: '700',\n      lineHeight: 22,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    // error\n    error: {\n      color: theme.theme.semantic.content.danger?.primary ?? 'red'\n    },\n    // CodeField row wrapper (no inline styles)\n    codeFieldWrap: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center'\n    },\n    // OTP6 cell look\n    cell: {\n      aspectRatio: 0.94,\n      width: '14%',\n      borderRadius: 20,\n      borderWidth: 1,\n      backgroundColor: Utils.withOpacity(theme.theme.component.textField.bg, 0.05),\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    cellText: {\n      fontFamily: theme.theme.typography?.family?.heading ?? theme.theme.typography.family.heading ?? theme.theme.font?.heading ?? 'Geologica',\n      fontSize: 24,\n      fontWeight: 700,\n      letterSpacing: -0.3,\n      textAlign: 'center',\n      color: theme.theme.component?.textField?.['content-primary'] ?? theme.theme.component?.textField?.contentPrimary ?? theme.theme.semantic.content.regular.primary\n    },\n    resendWrap: {\n      marginTop: 12\n    },\n    resendText: {\n      ...(theme.theme.typography?.fonts?.body?.m ?? {}),\n      color: theme.theme.semantic.content.regular.secondary\n    },\n    resendLink: {\n      ...(theme.theme.typography?.fonts?.body?.m ?? {}),\n      color: theme.theme.semantic.content.accent.content1\n    }\n  }), [theme]);\n  const [mode, setMode] = React.useState('confirm');\n  const [code, setCode] = React.useState('');\n  const [codeError, setCodeError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState(false);\n  const [countdown, setCountdown] = React.useState(0);\n  const [pwd1, setPwd1] = React.useState('');\n  const [pwd2, setPwd2] = React.useState('');\n  const [errorPwd1, setErrorPwd1] = React.useState(null);\n  const [errorPwd2, setErrorPwd2] = React.useState(null);\n  const ref = CodeField.useBlurOnFulfill({\n    value: code,\n    cellCount: CELL_COUNT\n  });\n  const codeVerifiedRef = React.useRef(null);\n  const resend$ = React.useRef(new Rx.Subject()).current;\n  const verify$ = React.useRef(new Rx.Subject()).current;\n  const submitPwd$ = React.useRef(new Rx.Subject()).current;\n\n  /* ---------- countdown ---------- */\n  React.useEffect(() => {\n    const sub = resend$.pipe(Rx.tap(() => setCountdown(RESEND_SECONDS)), Rx.switchMap(() => Rx.interval(1000).pipe(Rx.takeWhile(i => i < RESEND_SECONDS), Rx.tap(i => setCountdown(RESEND_SECONDS - i - 1))))).subscribe();\n    return () => sub.unsubscribe();\n  }, []);\n\n  /* ---------- code verification ---------- */\n  React.useEffect(() => {\n    const sub = verify$.pipe(Rx.switchMap(codeToSend => {\n      if (codeToSend.length !== CELL_COUNT) {\n        setCodeError(t(\"pleaseEnterPin\"));\n        return Rx.of(null);\n      }\n      setIsLoading(true);\n      return State.post('/api/login/email/reset-check', {\n        email,\n        code: codeToSend\n      }, 'string').then(resp => {\n        if (Number(resp) === 1) {\n          codeVerifiedRef.current = codeToSend;\n          setMode('setup');\n          setCodeError(null);\n        } else {\n          setCodeError(t(\"signinOtpIncorrect\"));\n        }\n      }).catch(() => setCodeError(t(\"signinOtpIncorrect\"))).finally(() => setIsLoading(false));\n    })).subscribe();\n    return () => sub.unsubscribe();\n  }, [email]);\n\n  /* ---------- resend code ---------- */\n  React.useEffect(() => {\n    const sub = resend$.pipe(Rx.switchMap(() => {\n      if (isLoading) return Rx.of(null);\n      setIsLoading(true);\n      return State.post('/api/login/email/reset-init', {\n        email,\n        resend: true\n      }, 'string', undefined, undefined, {\n        analytics: Analytics.getGlobalParams()\n      }).then(() => {\n        setCode('');\n        setCodeError(null);\n      }).catch(() => setCodeError('Failed to resend code')).finally(() => setIsLoading(false));\n    })).subscribe();\n    resend$.next(); // initial send\n    return () => sub.unsubscribe();\n  }, [email]);\n\n  /* ---------- password submit ---------- */\n  const validatePassword = React.useCallback(v => {\n    if (!v.length) return t(\"enterPasswordTitle\");\n    if (v.length < 8) return t(\"passwordValidationLength\");\n    if (!/[A-ZА-ЯЁ]/.test(v)) return t(\"passwordValidationUpperCase\");\n    return null;\n  }, []);\n  const validateConfirm = React.useCallback(v => {\n    if (!v.length) return t(\"repeatNewPassword\");\n    if (v !== pwd1) return t(\"passwordValidationNotMatch\");\n    return null;\n  }, [pwd1]);\n  React.useEffect(() => {\n    const sub = submitPwd$.pipe(Rx.switchMap(() => {\n      const err1 = validatePassword(pwd1);\n      const err2 = err1 ? null : validateConfirm(pwd2);\n      setErrorPwd1(err1);\n      setErrorPwd2(err2);\n      if (err1 || err2) return Rx.of(null);\n      setIsLoading(true);\n      return State.post('/api/login/email/reset', {\n        email,\n        code: codeVerifiedRef.current,\n        password: pwd1\n      }, 'string').then(token => State.onToken(token, {\n        loginMethod: 'email',\n        loginSurface\n      })).catch(() => setErrorPwd1('Network error')).finally(() => setIsLoading(false));\n    })).subscribe();\n    return () => sub.unsubscribe();\n  }, [pwd1, pwd2, email, loginSurface]);\n\n  /* ---------- password validation for button ---------- */\n  const isPasswordValid = React.useMemo(() => {\n    if (!pwd1.length || !pwd2.length) return false;\n    const hasUppercase = /[A-ZА-ЯЁ]/.test(pwd1);\n    const hasMinLength = pwd1.length >= 8;\n    const passwordsMatch = pwd1 === pwd2;\n    return hasUppercase && hasMinLength && passwordsMatch;\n  }, [pwd1, pwd2]);\n\n  /* ---------- render ---------- */\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    scrollable: true,\n    hide: true,\n    testID: \"page_emailRestore\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.root, {\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    }]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.body\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbar\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    hitSlop: {\n      top: 20,\n      bottom: 20,\n      left: 20,\n      right: 20\n    },\n    onPress: () => {\n      if (navigation.canGoBack()) {\n        navigation.goBack();\n        return;\n      }\n      Navigation.goto({\n        name: 'LoginEmail'\n      });\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    size: 24,\n    style: {\n      color: textColor\n    }\n  })), /*#__PURE__*/React.createElement(Components.DSLogo, {\n    variant: \"full\",\n    colorScheme: theme.isDark ? 'pink-white' : 'pink-black',\n    width: 147,\n    height: 40\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: 40\n    }\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.inner\n  }, /*#__PURE__*/React.createElement(ReactNative.View, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, mode === 'confirm' ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t('pleaseEnterCode'),\n    subtitleNode: /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.subtitle\n    }, t('weSentYourCodeTo'), '\\u00A0', /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.subtitleEmail\n    }, email))\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      minHeight: 24\n    }\n  }, !!codeError && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.error\n  }, codeError)), /*#__PURE__*/React.createElement(CodeField.CodeField, {\n    ref: ref,\n    value: code,\n    autoFocus: true,\n    onChangeText: v => {\n      setCode(v);\n      setCodeError(null);\n      if (v.length === CELL_COUNT) verify$.next(v);\n    },\n    cellCount: CELL_COUNT,\n    keyboardType: \"number-pad\",\n    textContentType: \"oneTimeCode\",\n    renderCell: ({\n      index,\n      symbol,\n      isFocused\n    }) => /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: index,\n      style: [styles.cell, {\n        borderColor: Utils.withOpacity(theme.theme.component?.textField?.['border-default'] ?? theme.theme.component?.textField?.borderDefault ?? '#999', 0.1)\n      }, codeError && {\n        borderColor: theme.theme.component?.textField?.['border-error'] ?? theme.theme.component?.textField?.borderError ?? 'red'\n      }]\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.cellText\n    }, symbol || (isFocused ? /*#__PURE__*/React.createElement(CodeField.Cursor, null) : null)))\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.resendWrap\n  }, countdown > 0 ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.resendText\n  }, t('resendCodeIn', countdown)) : /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    onPress: () => resend$.next()\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.resendLink\n  }, t('resendCode'))))) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t('singinPasswordResetHeader'),\n    subtitle: t('singinPasswordResetSubHeader')\n  }), /*#__PURE__*/React.createElement(Components.DSTextInput, {\n    value: pwd1,\n    autoFocus: true,\n    placeholder: t('passwordInput'),\n    secure: true,\n    error: errorPwd1,\n    onChangeText: v => {\n      setPwd1(v);\n      setErrorPwd1(null);\n    }\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PasswordConditions\",\n    value: pwd1,\n    value2: pwd2\n  }), /*#__PURE__*/React.createElement(Components.DSTextInput, {\n    value: pwd2,\n    placeholder: t('repeatNewPassword'),\n    secure: true,\n    error: errorPwd2,\n    onChangeText: v => {\n      setPwd2(v);\n      setErrorPwd2(null);\n    },\n    onRightPress: () => submitPwd$.next()\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: styles.buttonContainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    width: \"100%\",\n    disabled: mode === 'confirm' ? code.length < CELL_COUNT : !isPasswordValid,\n    loading: isLoading,\n    onPress: () => mode === 'confirm' ? verify$.next(code) : submitPwd$.next()\n  }, mode === 'confirm' ? t('buttonContinue') : t('singinPasswordSet')))))));\n};"},"Meta":{"name":"Meta","key":"1bb5d72fb17a3cacc6cb0a993c8c4b8b45f9a2e2dbfb8d25213447872a04fbea","code":"deps: MetaEmailConfirmNew, GenderStep, UsernameStep, AgeStep, BioStep, PhotoStep\nfunction _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst MetaConfirmEmail = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"MetaEmailConfirmNew\"\n}, props));\nconst GenderStep = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"GenderStep\"\n}, props));\nconst UsernameStep = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"UsernameStep\"\n}, props));\nconst AgeStep = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"AgeStep\"\n}, props));\nconst BioStep = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"BioStep\"\n}, props));\nconst PhotoStep = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"PhotoStep\"\n}, props));\nconst styles = {\n  root: {\n    flex: 1,\n    width: \"100%\",\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'flex-start'\n  },\n  body: {\n    flex: 1,\n    width: \"100%\",\n    maxWidth: 600,\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'flex-start'\n  }\n};\nreturn () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const session = State.api?.session?.useSession?.();\n  const navigation = ReactNavigation.useNavigation();\n  const [autoLoggedIn] = Hooks.useBehaviorSubject(State.state.autoLoggedIn);\n  const userConnection = session?.userConnection;\n  const scenes = React.useMemo(() => {\n    if (!session || !userConnection) return null;\n    const baseScenes = [{\n      id: \"MetaGender\",\n      component: GenderStep\n      // onView: () => {\n      //   State.anals.next({\n      //     name: 'ymw_onboardstart',\n      //     data: {},\n      //   });\n      // },\n    }, {\n      id: \"UsernameStep\",\n      component: UsernameStep\n      // onView: () => {\n      //   State.anals.next({\n      //     name: 'ymw_onboard_1_name',\n      //     data: {},\n      //   });\n      // },\n    }, {\n      id: \"AgeStep\",\n      component: AgeStep\n      // onView: () => {\n      //   State.anals.next({\n      //     name: 'ymw_onboard_2_date',\n      //     data: {},\n      //   });\n      // },\n    }, {\n      id: \"BioStep\",\n      component: BioStep,\n      skippable: true,\n      // onView: () => {\n      //   State.anals.next({\n      //     name: 'ymw_onboard_3_aboutme',\n      //     data: {},\n      //   });\n      // },\n      onSkip: ctx => {\n        State.post('/api/login/profile', {}, 'json', undefined, undefined, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            analytics_event: 'on_board_steps',\n            step_number: 3,\n            is_skipped: true,\n            time_on_step: ctx?.time_on_step ?? 0\n          }\n        }).catch(console.error);\n      }\n    }, {\n      id: \"PhotoStep\",\n      component: PhotoStep,\n      onSkip: ctx => {\n        State.post('/api/login/profile', {}, 'json', undefined, undefined, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            analytics_event: 'on_board_steps',\n            step_number: 4,\n            is_skipped: true,\n            time_on_step: ctx?.time_on_step ?? 0\n          }\n        }).catch(console.error);\n      }\n    }];\n    if (userConnection.type === 'email' && userConnection.verifyed !== true) {\n      return [{\n        id: \"MetaConfirmEmail\",\n        component: MetaConfirmEmail\n      }, ...baseScenes];\n    }\n    return baseScenes;\n  }, [userConnection?.type, userConnection?.verifyed]);\n\n  // HARD BLOCK until everything required is loaded\n  if (!session || !userConnection || !scenes) {\n    return /*#__PURE__*/React.createElement(Components.DSPage, {\n      hide: true,\n      testID: \"page_meta_loading\"\n    });\n  }\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    scrollable: true,\n    hide: true,\n    testID: \"page_meta\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.body\n  }, /*#__PURE__*/React.createElement(Components.DSStepper, {\n    steps: scenes,\n    hideProgressBarOnFirstStep: userConnection.type === 'email' && userConnection.verifyed !== true,\n    onExit: () => {\n      if (autoLoggedIn) {\n        globalThis?.Telegram?.WebApp?.close?.();\n        return;\n      }\n      Components.wrapLoader(_async(function () {\n        return _await(new Promise(r => setTimeout(r, 400)), function () {\n          return _await(State.logout(), function () {\n            return _awaitIgnored(new Promise(r => setTimeout(r, 200)));\n          });\n        });\n      }), {});\n    },\n    onComplete: () => {\n      State.anals.next({\n        name: 'af_onboard_complete',\n        data: {}\n      });\n      State.anals.next({\n        name: 'ga_tutorial_complete',\n        data: {}\n      });\n      Navigation.goto({\n        name: 'Random'\n      });\n      // Navigation.goto({\n      //   name: 'SubPay',\n      //   params: { top: 2 },\n      // });\n      // navigation.dispatch(\n      //   ReactNavigation.StackActions.push('Random');\n      // );\n    }\n  }))));\n};"},"Store":{"name":"Store","key":"c8f0061a989cc4970e77e2fd09a6aad0707a21d4e1ac51ba7f046d140fdaa615","code":"deps: GetPro, StorePro, PurchaseErrorModal, PurchaseInterruptedModal, HistoryModal, EmailModal, PaymentMethodModalContent, WithAppear\nfunction _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction _invoke(body, then) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(then);\n  }\n  return then(result);\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst DiamondIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst AlertIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"32\",\n    height: \"32\",\n    viewBox: \"0 0 32 32\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16 1.66699C23.9158 1.66717 30.3338 8.08418 30.334 16C30.3338 23.9158 23.9158 30.3338 16 30.334C8.08418 30.3338 1.66717 23.9158 1.66699 16C1.66717 8.08418 8.08418 1.66717 16 1.66699ZM16 3.66699C9.18875 3.66717 3.66717 9.18875 3.66699 16C3.66717 22.8113 9.18875 28.3338 16 28.334C22.8113 28.3338 28.3338 22.8113 28.334 16C28.3338 9.18875 22.8113 3.66717 16 3.66699ZM16 20C16.7363 20 17.3328 20.5968 17.333 21.333C17.333 22.0694 16.7364 22.667 16 22.667C15.2636 22.667 14.667 22.0694 14.667 21.333C14.6672 20.5968 15.2637 20 16 20ZM16 8.33301C16.5522 8.33301 16.9998 8.78087 17 9.33301V17.333C17 17.8853 16.5523 18.333 16 18.333C15.4477 18.333 15 17.8853 15 17.333V9.33301C15.0002 8.78087 15.4478 8.33301 16 8.33301Z\",\n    fill: \"currentColor\"\n  }));\n};\n\n// const CrownIcon = ({ style }) => {\n//   return <SVG.Svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style={style}>\n//     <SVG.G clip-path=\"url(#clip0_1014_1134)\">\n//       <SVG.Path d=\"M11.9584 12.6512C11.72 13.2519 11.4576 13.7 11.1295 13.9161C10.3776 14.4114 9.41108 14.2408 7.47916 13.9002L5.99714 13.6388C4.06516 13.2982 3.09864 13.1279 2.56148 12.4053C2.32709 12.09 2.2338 11.5792 2.21518 10.9332L11.9584 12.6512ZM9.02099 0.82571C9.77315 0.958581 10.2691 1.70957 10.1293 2.50361C10.0307 3.06273 9.64322 3.4944 9.15981 3.65451C9.2354 3.85534 9.31452 4.10252 9.40956 4.39765L10.2222 6.91985C10.3763 7.39837 10.4532 7.63804 10.6124 7.74924C10.7006 7.8107 10.8037 7.84518 10.9103 7.84837C11.103 7.85407 11.303 7.70657 11.7022 7.41187C12.2203 7.02942 12.5643 6.77501 12.8119 6.66945C12.6905 6.45314 12.6405 6.19014 12.688 5.92075C12.7931 5.32528 13.3353 4.92354 13.8995 5.02275C14.4638 5.12225 14.8367 5.68544 14.7317 6.28111C14.6267 6.87683 14.0835 7.27941 13.5191 7.1799L13.5076 7.17787C13.4941 7.45607 13.3741 7.8804 13.1922 8.52243L12.8511 9.72562C12.6618 10.3938 12.4894 11.0314 12.316 11.6016L2.23811 9.82463C2.27024 9.22945 2.3263 8.5714 2.37694 7.87874L2.46796 6.63146C2.51662 5.96595 2.54899 5.52616 2.63143 5.26011L2.61989 5.25807C2.05552 5.15856 1.6828 4.59447 1.78784 3.99875C1.89295 3.40312 2.43594 3.00141 3.00025 3.10092C3.56439 3.20058 3.93644 3.76356 3.83151 4.35911C3.784 4.62852 3.64713 4.85854 3.45908 5.0203C3.65565 5.20415 3.89189 5.5609 4.24789 6.09747C4.52221 6.51093 4.65976 6.71796 4.84277 6.7785C4.94401 6.81198 5.05273 6.81481 5.15656 6.78722C5.34423 6.73718 5.49942 6.53844 5.80789 6.14149L7.43321 4.04916C7.62351 3.80428 7.78329 3.59933 7.92303 3.43643C7.52328 3.12069 7.30608 2.5825 7.4047 2.0232C7.54488 1.22906 8.26859 0.693042 9.02099 0.82571Z\" fill=\"currentColor\" />\n//     </SVG.G>\n//     <SVG.Defs>\n//       <SVG.ClipPath id=\"clip0_1014_1134\">\n//         <SVG.Rect width=\"15.387\" height=\"15.387\" fill=\"currentColor\" />\n//       </SVG.ClipPath>\n//     </SVG.Defs>\n//   </SVG.Svg>;\n// }\n\nconst NextIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"16\",\n    height: \"16\",\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M7.09277 3.69165C7.3547 3.4673 7.74995 3.49743 7.97461 3.75903L12.9746 9.59302C13.1751 9.827 13.175 10.1725 12.9746 10.4065L7.97461 16.2395C7.74997 16.5016 7.35485 16.5325 7.09277 16.3079C6.83093 16.0832 6.80082 15.688 7.02539 15.426L11.6758 9.99927L7.02539 4.57349C6.80101 4.31149 6.83098 3.91626 7.09277 3.69165Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"30\",\n    height: \"30\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst DiamondIconSmall = ({\n  style,\n  color\n}) => {\n  const fillColor = color || '#04060F';\n  const fillOpacity = color ? '1' : '0.5';\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M14.375 2.5C14.5552 2.5 14.727 2.57823 14.8457 2.71387L19.2207 7.71387C19.2281 7.72234 19.2334 7.73245 19.2402 7.74121C19.2534 7.75796 19.266 7.77491 19.2773 7.79297C19.2879 7.80978 19.2968 7.82721 19.3057 7.84473C19.3151 7.86331 19.3245 7.88177 19.332 7.90137C19.3392 7.91996 19.3443 7.93896 19.3496 7.95801C19.3543 7.97485 19.36 7.99141 19.3633 8.00879C19.369 8.03916 19.3709 8.06981 19.3721 8.10059C19.3724 8.10872 19.375 8.11679 19.375 8.125C19.375 8.1263 19.374 8.1276 19.374 8.12891C19.3736 8.20782 19.3582 8.2862 19.3281 8.36035C19.3212 8.37745 19.3111 8.39288 19.3027 8.40918C19.2931 8.42794 19.2841 8.44694 19.2725 8.46484C19.261 8.48246 19.2475 8.49832 19.2344 8.51465C19.2248 8.52653 19.2176 8.54044 19.207 8.55176L10.457 17.9268C10.4522 17.932 10.4455 17.9354 10.4404 17.9404C10.4191 17.9618 10.3962 17.981 10.3721 17.999C10.3663 18.0033 10.3614 18.0086 10.3555 18.0127C10.3244 18.0343 10.2914 18.0527 10.2568 18.0684C10.2467 18.0729 10.236 18.076 10.2256 18.0801C10.2017 18.0894 10.1774 18.0972 10.1523 18.1035C10.139 18.1069 10.1259 18.1108 10.1123 18.1133C10.0756 18.12 10.0382 18.125 10 18.125C9.96144 18.125 9.92372 18.1201 9.88672 18.1133C9.87315 18.1108 9.86002 18.1069 9.84668 18.1035C9.82162 18.0971 9.79733 18.0894 9.77344 18.0801C9.76305 18.076 9.75234 18.073 9.74219 18.0684C9.70765 18.0527 9.6746 18.0343 9.64355 18.0127C9.63767 18.0086 9.63271 18.0033 9.62695 17.999C9.60287 17.981 9.57992 17.9618 9.55859 17.9404C9.55372 17.9355 9.54769 17.9318 9.54297 17.9268L0.792969 8.55176C0.782265 8.54029 0.774332 8.5267 0.764648 8.51465C0.751533 8.49833 0.738013 8.48244 0.726562 8.46484C0.714938 8.44695 0.705902 8.42792 0.696289 8.40918C0.687914 8.39289 0.677846 8.37743 0.670898 8.36035C0.641747 8.28844 0.626276 8.21225 0.625 8.13574V8.125C0.625 8.11681 0.626641 8.1087 0.626953 8.10059C0.627968 8.07482 0.628621 8.04896 0.632812 8.02344L0.637695 7.99902C0.640562 7.98502 0.645627 7.97166 0.649414 7.95801C0.654696 7.93898 0.659873 7.91993 0.666992 7.90137C0.674505 7.88179 0.683992 7.86329 0.693359 7.84473C0.702182 7.82722 0.711104 7.80976 0.72168 7.79297C0.733043 7.77493 0.745693 7.75795 0.758789 7.74121C0.765774 7.73228 0.771758 7.7225 0.779297 7.71387L5.1543 2.71387C5.27298 2.57823 5.44477 2.5 5.625 2.5H14.375ZM7.17285 8.75L10 15.8174L12.8262 8.75H7.17285ZM2.68848 8.75L8.17969 14.6328L5.82715 8.75H2.68848ZM14.1729 8.75L11.8193 14.6328L17.3105 8.75H14.1729ZM2.62598 7.5H5.9375L8.75 3.75H5.9082L2.62598 7.5ZM7.49902 7.5H12.5L10 4.16602L7.49902 7.5ZM14.0625 7.5H17.373L14.0918 3.75H11.25L14.0625 7.5Z\",\n    fill: fillColor,\n    fillOpacity: fillOpacity\n  }));\n};\nconst staticPacks = [{\n  id: `${ReactNative.Platform.OS}.gems.min`,\n  name: \"Min\",\n  price: \"$1.99\",\n  webPrice: \"$1.29\",\n  rubPrice: 109,\n  crystals: 10,\n  crystalsPreDiscount: 10,\n  discount: 0,\n  web: true\n  // test: true,\n}, {\n  id: `${ReactNative.Platform.OS}.gems.med`,\n  name: \"Med\",\n  price: \"$2.99\",\n  webPrice: \"$2.49\",\n  rubPrice: 199,\n  crystals: 20,\n  crystalsPreDiscount: 20,\n  discount: 0,\n  web: true\n  // test: true,\n}, {\n  id: `${ReactNative.Platform.OS}.gems.large`,\n  name: \"Large\",\n  price: \"$7.99\",\n  webPrice: \"$5.99\",\n  rubPrice: 499,\n  crystals: 50,\n  crystalsPreDiscount: 50,\n  discount: 0,\n  web: true\n  // test: true,\n}, {\n  id: `${ReactNative.Platform.OS}.gems.big`,\n  name: \"Big\",\n  price: \"$14.99\",\n  webPrice: \"$11.99\",\n  rubPrice: 999,\n  crystals: 100,\n  crystalsPreDiscount: 100,\n  discount: 0,\n  web: true\n  // test: true,\n}, {\n  id: `${ReactNative.Platform.OS}.gems.massive`,\n  name: \"Massive\",\n  price: \"$28.99\",\n  webPrice: \"$22.99\",\n  rubPrice: 1999,\n  crystals: 200,\n  crystalsPreDiscount: 200,\n  discount: 0,\n  web: true\n  // test: true,\n}, {\n  id: `${ReactNative.Platform.OS}.gems.giant`,\n  name: \"Giant\",\n  price: \"$49.99\",\n  webPrice: \"$39.99\",\n  rubPrice: 3499,\n  crystals: 350,\n  crystalsPreDiscount: 350,\n  discount: 0,\n  web: true\n  // test: true,\n}, {\n  id: `${ReactNative.Platform.OS}.gems.mega`,\n  name: \"Mega\",\n  price: \"$79.99\",\n  webPrice: \"$59.99\",\n  rubPrice: 4999,\n  crystals: 550,\n  crystalsPreDiscount: 550,\n  discount: 0,\n  web: true\n  // test: true,\n}, {\n  id: `${ReactNative.Platform.OS}.gems.ultra`,\n  name: \"Ultra\",\n  price: \"$129.99\",\n  webPrice: \"$99.99\",\n  rubPrice: 7999,\n  crystals: 1000,\n  crystalsPreDiscount: 1000,\n  discount: 0,\n  web: true\n  // test: true,\n}];\nconst width = 800;\nconst googlePlayStoreUrl = 'https://play.google.com/store/apps/details?id=com.rulettv.app';\nconst getStyles = (theme, safeArea, isModal) => {\n  return {\n    container: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      backgroundColor: isModal ? theme.semantic.surface.regular.pageBackground : 'transparent',\n      paddingTop: isModal ? 12 : Math.max(safeArea.top + 12, 12),\n      paddingBottom: Math.max(safeArea.bottom, 12),\n      paddingLeft: (isModal ? 0 : safeArea.left) + 12,\n      paddingRight: (isModal ? 0 : safeArea.right) + 12\n    },\n    subcontainer: {\n      width: \"100%\",\n      maxWidth: width,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 20\n    },\n    head: {\n      container: {\n        marginBottom: -8,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 8,\n        width: '100%'\n      },\n      title: {\n        fontFamily: theme.typography.family.heading,\n        fontWeight: 600,\n        fontSize: 24,\n        lineHeight: 32,\n        letterSpacing: -0.7,\n        color: theme.component.appBar.contentPrimary,\n        flex: 1\n      },\n      button: {\n        gap: 8,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      buttonIcon: {\n        color: theme.semantic.content.regular.primary\n      },\n      buttonText: {\n        fontFamily: theme.typography.family.paragraph,\n        fontWeight: 600,\n        fontSize: 14,\n        lineHeight: 22,\n        color: theme.semantic.content.regular.primary,\n        paddingRight: 2\n      }\n    },\n    balance: {\n      container: {\n        padding: 20,\n        backgroundColor: theme.semantic.surface.regular.surface1,\n        borderRadius: 24,\n        flexDirection: 'column',\n        alignItems: 'stretch',\n        justifyContent: 'center',\n        width: '100%',\n        ...(ReactNative.Platform.OS === 'android' ? {} : {\n          shadowColor: '#04060F',\n          shadowOffset: {\n            width: 0,\n            height: 8\n          },\n          shadowOpacity: 0.03,\n          shadowRadius: 20,\n          elevation: 2\n        })\n      },\n      row: {\n        gap: 12,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        width: '100%'\n      },\n      info: {\n        flex: 1,\n        minWidth: 0,\n        gap: 12,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'flex-start'\n      },\n      indicator: {\n        backgroundColor: theme.semantic.surface.brand.surface1,\n        borderRadius: 100,\n        height: 56,\n        width: 56,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      content: {\n        flex: 1,\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'center',\n        width: '100%'\n      },\n      text: {\n        color: theme.semantic.content.regular.secondary,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 500,\n        fontFamily: theme.typography.family.paragraph\n      },\n      header: {\n        color: theme.semantic.content.regular.primary,\n        fontSize: 24,\n        lineHeight: 32,\n        fontWeight: 600,\n        fontFamily: theme.typography.family.heading\n      },\n      image: {\n        width: 36,\n        height: 36\n      },\n      historyButton: {\n        flexShrink: 0,\n        height: 40,\n        paddingHorizontal: 16,\n        paddingVertical: 10,\n        borderRadius: 12,\n        backgroundColor: theme.component.button.secondary.bgDefault,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 6\n      },\n      historyButtonText: {\n        color: theme.component.button.secondary.content,\n        fontFamily: theme.typography.family.heading,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 600,\n        letterSpacing: -0.14\n      },\n      historyButtonIcon: {\n        color: theme.component.button.secondary.content,\n        width: 16,\n        height: 16\n      }\n    },\n    sector: {\n      section: {\n        width: '100%',\n        gap: 12,\n        flexDirection: 'column'\n      },\n      container: {\n        width: '100%'\n      },\n      title: {\n        color: theme.semantic.content.regular.primary,\n        fontSize: 20,\n        fontWeight: 600\n      }\n    },\n    item: {\n      container: {\n        flex: 1,\n        padding: 16,\n        backgroundColor: theme.semantic.surface.regular.surface1,\n        borderRadius: 24,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        minHeight: 200,\n        gap: 4\n      },\n      middle: {\n        flex: 1,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      icon: {\n        width: 96,\n        height: 96,\n        resizeMode: 'contain',\n        marginTop: -16,\n        marginBottom: -32\n      },\n      title: {\n        color: theme.semantic.content.regular.primary,\n        fontSize: 20,\n        fontWeight: 600,\n        fontFamily: theme.typography.family.paragraph\n      },\n      text: {\n        color: theme.semantic.content.brand.content1,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 500,\n        fontFamily: theme.typography.family.paragraph\n      },\n      price: {\n        container: {\n          borderRadius: 12,\n          paddingHorizontal: 8,\n          paddingVertical: 6,\n          backgroundColor: theme.semantic.surface.regular.surface2,\n          flexDirection: 'column',\n          alignItems: 'center',\n          justifyContent: 'center',\n          width: '100%'\n        },\n        titleRed: {\n          color: theme.semantic.content.brand.content1,\n          fontSize: 14,\n          lineHeight: 20,\n          fontWeight: 700,\n          fontFamily: theme.typography.family.paragraph\n        },\n        title: {\n          color: theme.semantic.content.regular.primary,\n          fontSize: 14,\n          lineHeight: 20,\n          fontWeight: 700,\n          fontFamily: theme.typography.family.paragraph\n        }\n      }\n    },\n    history: {\n      container: {\n        flex: 1,\n        flexDirection: 'column',\n        width: '100%'\n      },\n      header: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        paddingHorizontal: 16,\n        paddingTop: 16,\n        paddingBottom: 16\n      },\n      headerTitle: {\n        flex: 1,\n        fontSize: 20,\n        fontWeight: 600,\n        color: theme.semantic.content.regular.primary,\n        fontFamily: theme.typography.family.paragraph\n      },\n      headerClose: {\n        fontSize: 18,\n        color: '#9c9ca3',\n        fontFamily: theme.typography.family.paragraph\n      },\n      tabsContainer: {\n        flexDirection: 'row',\n        position: 'relative',\n        gap: 4,\n        paddingHorizontal: 16,\n        paddingBottom: 12\n      },\n      tabsDivider: {\n        position: 'absolute',\n        bottom: 0,\n        left: 16,\n        right: 16,\n        height: 1,\n        borderTopWidth: 0.5,\n        borderTopColor: '#e2e5f9'\n      },\n      tab: {\n        paddingBottom: 12,\n        paddingHorizontal: 8,\n        position: 'relative'\n      },\n      tabText: {\n        fontSize: 14,\n        lineHeight: 16,\n        fontWeight: 600,\n        color: '#9c9ca3',\n        fontFamily: theme.typography.family.paragraph\n      },\n      tabTextActive: {\n        color: '#5a60ff',\n        fontFamily: theme.typography.family.paragraph\n      },\n      tabUnderline: {\n        position: 'absolute',\n        bottom: 0,\n        left: 8,\n        right: 8,\n        height: 2,\n        backgroundColor: '#5a60ff',\n        borderRadius: 2\n      },\n      listContainer: {\n        flex: 1,\n        width: '100%',\n        paddingHorizontal: 16,\n        paddingTop: 8,\n        paddingBottom: 16\n      },\n      listItem: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        paddingVertical: 8\n      },\n      iconCircle: {\n        width: 24,\n        height: 24,\n        borderRadius: 12,\n        backgroundColor: '#FFFFFF',\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        shadowColor: '#000',\n        shadowOffset: {\n          width: 0,\n          height: 1\n        },\n        shadowOpacity: 0.1,\n        shadowRadius: 2,\n        elevation: 1\n      },\n      iconPlus: {\n        fontSize: 16,\n        fontWeight: 600,\n        color: '#5a60ff',\n        lineHeight: 16,\n        fontFamily: theme.typography.family.paragraph\n      },\n      date: {\n        flex: 1,\n        fontSize: 12,\n        lineHeight: 14,\n        fontWeight: 400,\n        color: '#9c9ca3',\n        marginLeft: 12,\n        fontFamily: theme.typography.family.paragraph\n      },\n      value: {\n        fontSize: 14,\n        lineHeight: 16,\n        fontWeight: 600,\n        color: '#08081a',\n        textAlign: 'right',\n        marginLeft: 8,\n        fontFamily: theme.typography.family.paragraph\n      },\n      diamondIcon: {\n        flexShrink: 0\n      },\n      empty: {\n        flex: 1,\n        flexDirection: 'column',\n        justifyContent: 'center',\n        alignItems: 'center',\n        padding: 12,\n        gap: 8,\n        minHeight: 200\n      },\n      emptyTitle: {\n        width: 351,\n        fontSize: 20,\n        lineHeight: 23,\n        fontWeight: 600,\n        textAlign: 'center',\n        color: '#08081a',\n        fontFamily: theme.typography.family.paragraph\n      },\n      emptySubtitle: {\n        width: 145,\n        fontSize: 14,\n        lineHeight: 16,\n        fontWeight: 400,\n        textAlign: 'center',\n        color: '#9c9ca3',\n        fontFamily: theme.typography.family.paragraph\n      }\n    }\n  };\n};\nfunction Grid({\n  children\n}) {\n  const styles = React.useMemo(() => ({\n    grid: {\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    gridRow: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    gridItem: {\n      flex: 1,\n      maxWidth: '50%'\n    }\n  }), []);\n  const childrenArray = React.Children.toArray(children);\n  const rows = childrenArray.reduce((result, item, index) => {\n    const rowIndex = Math.floor(index / 2);\n    if (!result[rowIndex]) {\n      result[rowIndex] = [];\n    }\n    result[rowIndex].push(item);\n    return result;\n  }, []);\n  const [visibleCount, setVisibleCount] = React.useState(-1);\n  React.useEffect(() => {\n    const childs = React.Children.toArray(children);\n    if (!childs.length) return;\n    const step = 75;\n    const interval = setInterval(() => {\n      setVisibleCount(prev => {\n        if (prev >= childs.length) {\n          clearInterval(interval);\n          return prev;\n        }\n        return prev + 1;\n      });\n    }, step);\n    return () => clearInterval(interval);\n  }, [setVisibleCount, children]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.grid\n  }, rows.map((row, rowIndex) => /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: rowIndex,\n    style: styles.gridRow\n  }, row.map((item, itemIndex) => /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    key: itemIndex,\n    style: styles.gridItem,\n    visible: visibleCount >= rowIndex * 2 + itemIndex\n  }, item)))));\n}\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nfunction parsePriceNumber(value) {\n  if (value == null) return null;\n  const normalized = String(value).trim().replace(/[^0-9.,]/g, '').replace(',', '.');\n  if (!normalized) return null;\n  const parsed = Number.parseFloat(normalized);\n  return Number.isFinite(parsed) ? parsed : null;\n}\nconst getProductCurrencyCode = product => {\n  return product?.currency ?? product?.currencyCode ?? product?.priceCurrencyCode ?? product?.oneTimePurchaseOfferDetails?.priceCurrencyCode ?? product?.subscriptionOfferDetails?.[0]?.pricingPhases?.pricingPhaseList?.[0]?.priceCurrencyCode;\n};\nconst isRubProduct = product => {\n  return String(getProductCurrencyCode(product) ?? '').toUpperCase() === 'RUB';\n};\nfunction HistoryModal() {\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"HistoryModal\"\n  });\n}\nfunction PurchaseSuccessSheet({\n  amount\n}) {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const resolvedAmount = Number.isFinite(amount) ? Math.max(0, amount) : 0;\n  const styles = React.useMemo(() => ({\n    container: {\n      paddingTop: 12,\n      paddingBottom: Math.max(safeArea.bottom, 16),\n      paddingHorizontal: 16,\n      gap: 20,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    header: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingTop: 8\n    },\n    close: {\n      position: 'absolute',\n      right: 4,\n      top: 0\n    },\n    iconWrap: {\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface2,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    icon: {\n      color: theme.theme.semantic.content.brand.content1\n    },\n    iconText: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: 600,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: 700,\n      textAlign: 'center',\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    subtitle: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      textAlign: 'center',\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    button: {\n      width: '100%'\n    },\n    closeIcon: {\n      color: theme.theme.semantic.content.regular.primary\n    }\n  }), [theme, safeArea]);\n  const handleClose = React.useCallback(() => {\n    sheet.close('closed');\n  }, []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 4,\n    onPress: handleClose,\n    styleContainer: styles.close\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.iconWrap\n  }, /*#__PURE__*/React.createElement(DiamondIcon, {\n    style: styles.icon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.iconText\n  }, formatWithSpaces(resolvedAmount))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopPurchaseSuccess')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, t('shopPurchaseSuccessText')), /*#__PURE__*/React.createElement(Components.DSButton, {\n    size: \"L\",\n    feedback: true,\n    style: styles.button,\n    onPress: handleClose\n  }, t('gotItButton')));\n}\nfunction NoPaymentWebSheet() {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const CloseSmallIcon = React.useCallback(({\n    style\n  }) => {\n    return /*#__PURE__*/React.createElement(SVG.Svg, {\n      width: \"24\",\n      height: \"24\",\n      viewBox: \"0 0 24 24\",\n      fill: \"none\",\n      style: style\n    }, /*#__PURE__*/React.createElement(SVG.Path, {\n      d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n      fill: \"currentColor\"\n    }));\n  }, []);\n  const GooglePlayIcon = React.useCallback(({\n    size = 28\n  }) => {\n    return /*#__PURE__*/React.createElement(SVG.Svg, {\n      width: size,\n      height: size,\n      viewBox: \"0 0 24 24\",\n      fill: \"none\"\n    }, /*#__PURE__*/React.createElement(SVG.Path, {\n      d: \"M3.6 2.6L14.2 12L3.6 21.4C3.2 21.1 3 20.6 3 20V4C3 3.4 3.2 2.9 3.6 2.6Z\",\n      fill: \"#34A853\"\n    }), /*#__PURE__*/React.createElement(SVG.Path, {\n      d: \"M14.2 12L17.6 8.9L21 11C21.6 11.4 21.6 12.6 21 13L17.6 15.1L14.2 12Z\",\n      fill: \"#4285F4\"\n    }), /*#__PURE__*/React.createElement(SVG.Path, {\n      d: \"M3.6 2.6C4 2.3 4.6 2.2 5.1 2.5L17.6 8.9L14.2 12L3.6 2.6Z\",\n      fill: \"#FBBC05\"\n    }), /*#__PURE__*/React.createElement(SVG.Path, {\n      d: \"M3.6 21.4L14.2 12L17.6 15.1L5.1 21.5C4.6 21.8 4 21.7 3.6 21.4Z\",\n      fill: \"#EA4335\"\n    }));\n  }, []);\n  const styles = React.useMemo(() => ({\n    root: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      paddingTop: 12,\n      paddingHorizontal: 16,\n      paddingBottom: safeArea.bottom + 16\n    },\n    header: {\n      width: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      paddingTop: 8\n    },\n    headerSpacer: {\n      flex: 1\n    },\n    closeButton: {\n      width: 24,\n      height: 24,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    closeIcon: {\n      color: theme.theme.semantic.content.regular.primary,\n      width: 24,\n      height: 24\n    },\n    content: {\n      padding: 16,\n      gap: 4,\n      alignItems: 'center',\n      justifyContent: 'flex-start'\n    },\n    title: {\n      width: '100%',\n      fontFamily: theme.theme.typography.family.heading,\n      fontWeight: 600,\n      fontSize: 20,\n      lineHeight: 28,\n      letterSpacing: -0.7,\n      color: theme.theme.semantic.content.regular.primary,\n      textAlign: 'center'\n    },\n    description: {\n      width: '100%',\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontWeight: 500,\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: theme.theme.semantic.content.regular.secondary,\n      textAlign: 'center'\n    },\n    footer: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      gap: 8,\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start',\n      width: '100%',\n      paddingTop: 4\n    },\n    storeButton: {\n      width: '100%',\n      height: 54,\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingVertical: 12,\n      paddingHorizontal: 20\n    },\n    storeButtonContainer: {\n      width: '100%',\n      borderRadius: 12,\n      backgroundColor: \"#000000\"\n    },\n    storeButtonText: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontStyle: 'normal',\n      fontWeight: 600,\n      fontSize: 16,\n      lineHeight: 20,\n      letterSpacing: -0.16,\n      color: \"#FFFFFF\"\n    }\n  }), [theme]);\n  const onClose = React.useCallback(() => sheet.close('closed'), [sheet]);\n  const onOpenStore = React.useCallback(_async(function () {\n    return _continueIgnored(_finallyRethrows(function () {\n      return _awaitIgnored(Linking.openURL(State.getUrl(googlePlayStoreUrl)));\n    }, function (_wasThrown, _result) {\n      sheet.close('action');\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [sheet]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerSpacer\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.7,\n    onPress: onClose,\n    styleContainer: styles.closeButton\n  }, /*#__PURE__*/React.createElement(CloseSmallIcon, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopPaymentUnavailableTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('shopPaymentUnavailableDescription'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.footer\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.9,\n    onPress: onOpenStore,\n    styleContainer: styles.storeButtonContainer,\n    style: styles.storeButton\n  }, /*#__PURE__*/React.createElement(GooglePlayIcon, {\n    size: 24\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.storeButtonText\n  }, \"Google play\"))));\n}\nconst EmailModalWithRef = ({\n  ref,\n  ...props\n}) => {\n  return /*#__PURE__*/React.createElement(Sheet.Sheet, {\n    liftRef: ref,\n    style: {\n      maxWidth: 600\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, _extends({\n    name: \"EmailModal\"\n  }, props)));\n};\nconst PaymentMethodModal = ({\n  showGooglePlay = true\n} = {}) => {\n  return /*#__PURE__*/React.createElement(Sheet.Sheet, {\n    style: {\n      maxWidth: 600,\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      overflow: 'hidden'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PaymentMethodModalContent\",\n    showGooglePlay: showGooglePlay\n  }));\n};\nreturn ({\n  products,\n  isModal\n}) => {\n  State.useRequireSocketNavigation();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => getStyles(theme.theme, safeArea, isModal), [theme.theme, safeArea, isModal]);\n  const sheet = isModal ? Sheet.useSheet() : null;\n  const [iapProducts] = Hooks.useBehaviorSubject(State.state.storage.iapProducts);\n  const [iapError] = Hooks.useBehaviorSubject(State.state.storage.iapError);\n  const isWeb = ReactNative.Platform.OS === 'web';\n  const isAndroid = ReactNative.Platform.OS === 'android';\n  const enableYooKassaPaymentFlow = State.api.ff.useFF('enableYooKassaPaymentFlow');\n  const notGoogleAndroid = !!iapError && isAndroid;\n  const session = State.api?.session?.useSession?.();\n  const country = session?.ip?.country ? String(session.ip.country).toUpperCase() : undefined;\n  const isRuIp = country === 'RU';\n  const packs = React.useMemo(() => {\n    return {\n      items: staticPacks.map(p => {\n        const sp = iapProducts?.find(sp => sp.id === p.id);\n        const price = sp?.displayPrice ?? sp?.price ?? (isWeb ? p.webPrice : p.price);\n        return !sp && !p.test && !notGoogleAndroid && !isWeb ? null : {\n          ...p,\n          ...sp,\n          price: isWeb && isRuIp ? `${formatWithSpaces(p.rubPrice)} ₽` : price,\n          ...(isWeb && isRuIp ? {\n            currency: 'RUB'\n          } : {})\n        };\n      }).filter(Boolean)\n    };\n  }, [iapProducts, notGoogleAndroid, isWeb, isRuIp]);\n  const packBonuses = React.useMemo(() => {\n    const items = packs?.items ?? [];\n    if (!items.length) return {};\n    const minPack = items.find(item => Number(item?.crystals) > 0);\n    const minPrice = parsePriceNumber(minPack?.price);\n    const minCrystals = Number(minPack?.crystals ?? 0);\n    if (!(minPrice > 0) || !(minCrystals > 0)) return {};\n    const baseRate = minCrystals / minPrice;\n    if (!(baseRate > 0)) return {};\n    return items.reduce((acc, item) => {\n      const crystals = Number(item?.crystals ?? 0);\n      const price = parsePriceNumber(item?.price);\n      if (!(crystals > 0) || !(price > 0)) {\n        acc[item.id] = 0;\n        return acc;\n      }\n      const expectedByBase = Math.round(price * baseRate);\n      acc[item.id] = Math.max(0, crystals - expectedByBase);\n      return acc;\n    }, {});\n  }, [packs?.items]);\n  const lastPurchaseRef = React.useRef(null);\n  const purchaseRetryRef = React.useRef({\n    tried: false\n  });\n  const processedPurchaseIdsRef = React.useRef(new Set());\n  React.useEffect(() => {\n    manifest()?.purchase?.loadIAPProducts?.();\n  }, []);\n  const markPurchaseId = React.useCallback(purchase => {\n    const purchaseId = purchase?.transactionId ?? purchase?.purchaseToken ?? purchase?.originalTransactionIdentifierAndroid ?? purchase?.orderId;\n    if (!purchaseId) return;\n    const ids = manifest()?.purchase?.ids;\n    if (!Array.isArray(ids)) return;\n    if (!ids.includes(purchaseId)) {\n      ids.push(purchaseId);\n    }\n  }, []);\n  const isAlreadyPurchasedError = React.useCallback(error => {\n    const code = String(error?.code ?? '');\n    const message = String(error?.message ?? '').toLowerCase();\n    return ['E_ALREADY_OWNED', 'E_ALREADY_PURCHASED', 'E_ITEM_ALREADY_OWNED', 'E_ALREADY_OWNED', 'ALREADY_OWNED', 'ALREADY_PURCHASED'].includes(code) || message.includes('already been purchased') || message.includes('already been bought');\n  }, []);\n  const buildPurchaseRequest = React.useCallback(productId => ({\n    request: {\n      ios: {\n        sku: productId,\n        quantity: 1,\n        appAccountToken: State.state.session.value?.ballance?.uuid,\n        andDangerouslyFinishTransactionAutomatically: false\n      },\n      android: {\n        skus: [productId],\n        obfuscatedAccountIdAndroid: State.state.session.value?.user?.id,\n        obfuscatedProfileIdAndroid: State.state.session.value?.user?.id\n      }\n    },\n    type: 'in-app'\n  }), []);\n  const processPendingIap = React.useCallback(_async(function () {\n    if (ReactNative.Platform.OS !== 'ios') return;\n    return _catch(function () {\n      console.log('[IAP] Cleanup pending transactions start');\n      return _await(IAP.getPendingTransactionsIOS?.(), function (pendingIos) {\n        return _await(IAP.getAvailablePurchases?.(), function (pendingStore) {\n          const pending = [...(pendingIos || []), ...(pendingStore || [])].filter(Boolean);\n          if (!pending.length) {\n            console.log('[IAP] Cleanup pending transactions: none');\n            return;\n          }\n          const seen = new Set();\n          const uniquePending = pending.filter(purchase => {\n            const purchaseId = purchase?.transactionId ?? purchase?.purchaseToken ?? purchase?.originalTransactionIdentifierAndroid ?? purchase?.orderId;\n            if (!purchaseId) return true;\n            if (seen.has(purchaseId)) return false;\n            seen.add(purchaseId);\n            return true;\n          });\n          console.log('[IAP] Cleanup pending transactions: found', {\n            count: uniquePending.length,\n            productIds: uniquePending.map(p => p?.productId).filter(Boolean)\n          });\n          return _await(Promise.all(uniquePending.map(purchase => {\n            console.log('[IAP] finishTransaction pending params', {\n              productId: purchase?.productId,\n              transactionId: purchase?.transactionId,\n              isConsumable: true,\n              platform: ReactNative.Platform.OS\n            });\n            return IAP.finishTransaction?.({\n              purchase,\n              isConsumable: true\n            });\n          })), function () {\n            console.log('[IAP] Cleanup pending transactions: finished');\n          });\n        });\n      });\n    }, function (error) {\n      console.error('[IAP] Cleanup pending transactions failed', error);\n    });\n  }), []);\n  const retryLastPurchase = React.useCallback(_async(function () {\n    if (!lastPurchaseRef.current?.id) return;\n    if (purchaseRetryRef.current.tried) return;\n    purchaseRetryRef.current.tried = true;\n    return _continueIgnored(_catch(function () {\n      console.log('[IAP] Retry purchase after cleanup', {\n        productId: lastPurchaseRef.current?.id,\n        platform: ReactNative.Platform.OS\n      });\n      return _call(processPendingIap, function () {\n        return _awaitIgnored(IAP.requestPurchase(buildPurchaseRequest(lastPurchaseRef.current.id)));\n      });\n    }, function (retryError) {\n      console.error('[IAP] Retry purchase failed', retryError?.message);\n      Notification.showNotification({\n        text: retryError.message,\n        type: 'error',\n        duration: 5000\n      });\n    }));\n  }), [processPendingIap, buildPurchaseRequest]);\n  const purchaseModalOpenRef = React.useRef(false);\n  const showPurchaseErrorModal = React.useCallback(_async(function () {\n    if (purchaseModalOpenRef.current) return;\n    purchaseModalOpenRef.current = true;\n    State.anals.next({\n      name: 'popup_shown',\n      data: {\n        popup_type: 'info_pop_up',\n        popup_action: 'shown'\n      }\n    });\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"PurchaseErrorModal\",\n      onRetry: retryLastPurchase\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 450\n        }\n      }\n    }), function (result) {\n      State.anals.next({\n        name: 'popup_shown',\n        data: {\n          popup_type: 'info_pop_up',\n          popup_action: result === 'action' ? 'action' : 'closed'\n        }\n      });\n      purchaseModalOpenRef.current = false;\n    });\n  }), [retryLastPurchase, theme.isDark]);\n  const showPurchaseInterruptedModal = React.useCallback(_async(function () {\n    if (purchaseModalOpenRef.current) return;\n    purchaseModalOpenRef.current = true;\n    State.anals.next({\n      name: 'popup_shown',\n      data: {\n        popup_type: 'info_pop_up',\n        popup_action: 'shown'\n      }\n    });\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"PurchaseInterruptedModal\"\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 450\n        }\n      }\n    }), function (result) {\n      State.anals.next({\n        name: 'popup_shown',\n        data: {\n          popup_type: 'info_pop_up',\n          popup_action: result === 'action' ? 'action' : 'closed'\n        }\n      });\n      purchaseModalOpenRef.current = false;\n    });\n  }), [theme.isDark]);\n  const iapHookResult = IAP?.useIAP?.({\n    onPurchaseSuccess: _async(function (purchase) {\n      const purchaseId = purchase?.transactionId ?? purchase?.purchaseToken ?? purchase?.originalTransactionIdentifierAndroid ?? purchase?.orderId;\n      if (purchaseId && processedPurchaseIdsRef.current.has(purchaseId)) {\n        console.warn('[IAP] Attempt to process same transaction again', purchaseId);\n        return;\n      }\n      if (purchaseId) {\n        processedPurchaseIdsRef.current.add(purchaseId);\n      }\n      console.log('[IAP] Purchase success', {\n        productId: purchase?.productId,\n        transactionId: purchase?.transactionId,\n        platform: ReactNative.Platform.OS\n      });\n      markPurchaseId(purchase);\n      return _await(IAP.finishTransaction({\n        purchase,\n        isConsumable: true\n      }), function (finishResult) {\n        console.log('[IAP] finishTransaction params', finishResult);\n        purchaseRetryRef.current.tried = false;\n        // Notification.showNotification({\n        //   text: 'Покупка прошла успешно! ' + purchase.productId,\n        //   duration: 3000,\n        //   title: 'Успешно',\n        // });\n      });\n    }),\n    onPurchaseError: error => {\n      console.log('[IAP] Purchase error', {\n        code: error?.code,\n        message: error?.message,\n        platform: ReactNative.Platform.OS,\n        isAlreadyPurchased: isAlreadyPurchasedError(error),\n        retryTried: purchaseRetryRef.current.tried,\n        productId: lastPurchaseRef.current?.id\n      });\n      if (isAlreadyPurchasedError(error)) {\n        // void retryLastPurchase();\n        return;\n      }\n      if (error.code === IAP.ErrorCode?.UserCancelled) {\n        void showPurchaseInterruptedModal();\n        return;\n      }\n      void showPurchaseErrorModal();\n    }\n  });\n  const {\n    connected\n  } = iapHookResult ?? {};\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS === 'ios') {\n      processPendingIap();\n    }\n  }, [processPendingIap]);\n  const prevBalanceRef = React.useRef(null);\n  const purchaseSheetOpenRef = React.useRef(false);\n  const showPurchaseSuccessSheet = React.useCallback(_async(function (amount) {\n    if (purchaseSheetOpenRef.current) return;\n    purchaseSheetOpenRef.current = true;\n    State.anals.next({\n      name: 'popup_shown',\n      data: {\n        popup_type: 'info_pop_up',\n        popup_action: 'shown'\n      }\n    });\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(PurchaseSuccessSheet, {\n      amount: amount\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 450\n        }\n      }\n    }), function (result) {\n      State.anals.next({\n        name: 'popup_shown',\n        data: {\n          popup_type: 'info_pop_up',\n          popup_action: result === 'action' ? 'action' : 'closed'\n        }\n      });\n      purchaseSheetOpenRef.current = false;\n    });\n  }), [theme.isDark]);\n  const noPaymentSheetOpenRef = React.useRef(false);\n  const showNoPaymentWebSheet = React.useCallback(_async(function () {\n    if (noPaymentSheetOpenRef.current) return;\n    noPaymentSheetOpenRef.current = true;\n    State.anals.next({\n      name: 'popup_shown',\n      data: {\n        popup_type: 'paywall_first_offer',\n        popup_action: 'shown'\n      }\n    });\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(NoPaymentWebSheet, null), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600,\n          borderTopLeftRadius: 24,\n          borderTopRightRadius: 24,\n          overflow: 'hidden'\n        }\n      }\n    }), function (result) {\n      State.anals.next({\n        name: 'popup_shown',\n        data: {\n          popup_type: 'paywall_first_offer',\n          popup_action: result === 'action' ? 'action' : 'closed'\n        }\n      });\n      noPaymentSheetOpenRef.current = false;\n    });\n  }), [theme.isDark]);\n  React.useEffect(() => {\n    if (typeof session?.ballance?.amount === 'number') {\n      prevBalanceRef.current = session.ballance.amount;\n    }\n  }, [session?.ballance?.amount]);\n  State.useSocket('af_purchase', React.useCallback(payload => {\n    const data = payload?.data ?? payload;\n    if (!data || typeof data !== 'object') return;\n    const purchaseValue = Number(data.af_price ?? data.af_revenue);\n    State.anals.next({\n      name: 'af_purchase',\n      data\n    });\n    if (data.af_currency != null && data.af_transaction_id != null && Number.isFinite(purchaseValue)) {\n      State.anals.next({\n        name: 'ga_purchase',\n        data: {\n          currency: String(data.af_currency),\n          value: purchaseValue,\n          transaction_id: String(data.af_transaction_id)\n        }\n      });\n    }\n  }, []));\n  State.useSocket(\"ballance\", React.useCallback(({\n    ballance\n  }) => {\n    const nextBalance = typeof ballance?.amount === 'number' ? ballance.amount : Number(ballance?.amount ?? ballance);\n    if (!Number.isFinite(nextBalance)) return;\n    const prevBalance = prevBalanceRef.current;\n    prevBalanceRef.current = nextBalance;\n    if (prevBalance !== null) {\n      const delta = nextBalance - prevBalance;\n      if (delta > 0) {\n        showPurchaseSuccessSheet(delta);\n      }\n    }\n  }, [prevBalanceRef, showPurchaseSuccessSheet]));\n\n  // React.useEffect(() => {\n  //   Notification.showNotification({\n  //     text: session?.ballance?.amount,\n  //     type: 'info',\n  //     duration: 5000,\n  //   });\n  // }, [session?.ballance?.amount]);\n\n  const startYooKassaPurchase = React.useCallback((product, ref) => {\n    Sheet.showPortal(/*#__PURE__*/React.createElement(EmailModalWithRef, {\n      ref: ref,\n      product: product\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n  }, [theme.isDark]);\n  const startGooglePlayPurchase = React.useCallback(_async(function (product) {\n    if (!connected) return;\n    console.log('[IAP] Start purchase', {\n      productId: product?.id,\n      platform: ReactNative.Platform.OS,\n      connected\n    });\n    lastPurchaseRef.current = product;\n    purchaseRetryRef.current.tried = false;\n    console.log('[IAP] requestPurchase', {\n      productId: product?.id,\n      platform: ReactNative.Platform.OS\n    });\n    return _awaitIgnored(IAP.requestPurchase(buildPurchaseRequest(product.id)));\n  }), [connected, buildPurchaseRequest]);\n  const showPaymentMethodModal = React.useCallback(_async(function ({\n    showGooglePlay = true\n  } = {}) {\n    return Sheet.showPortal(/*#__PURE__*/React.createElement(PaymentMethodModal, {\n      showGooglePlay: showGooglePlay\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n  }), [theme.isDark]);\n  const onBuy = React.useCallback(_async(function (product, ref) {\n    let _exit = false;\n    return _invoke(function () {\n      if (enableYooKassaPaymentFlow) {\n        return _call(showPaymentMethodModal, function (method) {\n          let _exit2 = false;\n          return _invoke(function () {\n            if (method === 'google_play') {\n              return _invoke(function () {\n                if (isWeb) {\n                  return _awaitIgnored(Linking.openURL(State.getUrl(googlePlayStoreUrl)));\n                } else {\n                  return _awaitIgnored(startGooglePlayPurchase(product));\n                }\n              }, function () {\n                _exit = true;\n              });\n            }\n          }, function (_result4) {\n            if (_exit2) return _result4;\n            if (method === 'yoomoney') {\n              startYooKassaPurchase(product, ref);\n            }\n            _exit = true;\n          });\n        });\n      }\n    }, function (_result3) {\n      let _exit3 = false;\n      if (_exit) return _result3;\n      if (isWeb) {\n        if (isRuIp) {\n          startYooKassaPurchase(product, ref);\n        } else {\n          showNoPaymentWebSheet();\n        }\n        return;\n      }\n      return _invoke(function () {\n        if (isAndroid) {\n          return _invoke(function () {\n            if (isRubProduct(product)) {\n              startYooKassaPurchase(product, ref);\n            } else {\n              return _awaitIgnored(startGooglePlayPurchase(product));\n            }\n          }, function () {\n            _exit3 = true;\n          });\n        }\n      }, function (_result5) {\n        return _exit3 ? _result5 : _awaitIgnored(startGooglePlayPurchase(product));\n      });\n    });\n  }), [enableYooKassaPaymentFlow, isAndroid, isRuIp, isWeb, showNoPaymentWebSheet, showPaymentMethodModal, startGooglePlayPurchase, startYooKassaPurchase]);\n  const onGetPro = React.useCallback(_async(function () {\n    Sheet.showSheet(/*#__PURE__*/React.createElement(EmailModal, {\n      name: \"getpro\"\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n    return _await();\n  }), [theme.isDark]);\n  const onHistory = React.useCallback(_async(function () {\n    if (State.api?.guest?.isGuestSession?.()) {\n      State.api?.guest?.openRegisterSheet('restricted_action', 'profile');\n      return;\n    }\n    Sheet.showSheet(/*#__PURE__*/React.createElement(HistoryModal, null), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n    return _await();\n  }), [theme.isDark]);\n  const children = /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserAppbar\",\n    onPress: sheet?.close,\n    hideTopUpButton: true\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    style: {\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balance.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balance.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balance.info\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balance.indicator\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.balance.image,\n    source: State.getUrl('/api/component/assets/store/diamond.webp')\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balance.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.balance.text\n  }, t('shopBalance')), /*#__PURE__*/React.createElement(Components.DSCountdown, {\n    value: formatWithSpaces(session?.ballance?.amount ?? 0),\n    height: styles.balance.header.lineHeight,\n    style: styles.balance.header\n  }))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onHistory,\n    style: styles.balance.historyButton\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.balance.historyButtonText,\n    numberOfLines: 1\n  }, t('shopHistory')), /*#__PURE__*/React.createElement(NextIcon, {\n    style: styles.balance.historyButtonIcon\n  }))))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    delay: 100,\n    style: {\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StorePro\",\n    session: session,\n    onPress: sheet?.close\n  })), !!packs?.items?.length && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.sector.section\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.sector.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.sector.title\n  }, t(\"shopBuyHeader\"))), /*#__PURE__*/React.createElement(Grid, null, packs.items.map((product, index) => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    noloading: enableYooKassaPaymentFlow || isWeb || isAndroid && isRubProduct(product),\n    key: product.id,\n    feedback: true,\n    opacity: 0.4,\n    translateY: 4,\n    onPress: (_, ref) => onBuy(product, ref),\n    style: styles.item.container\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.item.icon,\n    source: State.getUrl(`/api/component/assets/store/gems-${index + 1}.webp`),\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.item.middle\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.item.title\n  }, formatWithSpaces(product.crystals)), packBonuses?.[product.id] > 0 ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.item.text\n  }, \"+\", formatWithSpaces(packBonuses[product.id]), \" \", t(\"shopBonus\")) : null), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.item.price.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: product.red ? styles.item.price.titleRed : styles.item.price.title\n  }, product.price))))))));\n  if (isModal) return children;\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    scrollable: true,\n    testID: \"page_store\"\n  }, children);\n};"},"Profile":{"name":"Profile","key":"be39a1df79af6a0ab6c3c01dac081429ea39c920be08b92d2161f65bcbdc52ee","code":"deps: Card, Balance, ProfileGiftsShowcase, RatingBlock, StatusBlock, Pro, ProfilePremium, About, Interests, Media, StatusesModal, VerificationNotificationBanner, WithAppear, WithAppearFocused\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst DiamondIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst SettingsIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.9993 1.25C12.4546 1.25 12.8345 1.24938 13.1448 1.27051C13.4617 1.29213 13.7618 1.33886 14.052 1.45898C14.7257 1.73803 15.2611 2.27366 15.5403 2.94727C15.6856 3.29804 15.7254 3.66849 15.7405 4.07031C15.7527 4.39303 15.9152 4.66284 16.1555 4.80176C16.3961 4.94063 16.7116 4.94682 16.9973 4.7959C17.3526 4.60812 17.6924 4.45688 18.0686 4.40723C18.7915 4.31205 19.5232 4.50838 20.1018 4.95215C20.3511 5.14345 20.5417 5.37982 20.719 5.64355C20.8925 5.9017 21.0821 6.2305 21.3098 6.625C21.5375 7.01943 21.7277 7.34768 21.8645 7.62695C22.0043 7.9123 22.1135 8.19532 22.1545 8.50684C22.2497 9.22993 22.0536 9.96142 21.6096 10.54C21.3785 10.8412 21.078 11.0605 20.7375 11.2744C20.464 11.4464 20.3118 11.7223 20.3118 12C20.3118 12.2777 20.464 12.5536 20.7375 12.7256C21.078 12.9395 21.3785 13.1588 21.6096 13.46C22.0536 14.0386 22.2497 14.7701 22.1545 15.4932C22.1135 15.8047 22.0043 16.0877 21.8645 16.373C21.7277 16.6523 21.5375 16.9806 21.3098 17.375C21.082 17.7695 20.8925 18.0983 20.719 18.3564C20.5417 18.6202 20.3511 18.8565 20.1018 19.0479C19.5232 19.4916 18.7915 19.688 18.0686 19.5928C17.6924 19.5431 17.3526 19.3919 16.9973 19.2041C16.7116 19.0532 16.396 19.0594 16.1555 19.1982C15.9152 19.3372 15.7526 19.607 15.7405 19.9297C15.7255 20.3315 15.6856 20.7019 15.5403 21.0527C15.2611 21.7263 14.7257 22.262 14.052 22.541C13.7618 22.6611 13.4617 22.7079 13.1448 22.7295C12.8345 22.7506 12.4546 22.75 11.9993 22.75C11.5441 22.75 11.1648 22.7506 10.8547 22.7295C10.5379 22.7079 10.2377 22.6612 9.94751 22.541C9.27394 22.2619 8.73834 21.7263 8.45923 21.0527C8.31397 20.702 8.27406 20.3315 8.25903 19.9297C8.24682 19.6069 8.08443 19.3371 7.84399 19.1982C7.60342 19.0595 7.28791 19.0531 7.0022 19.2041C6.64691 19.3919 6.3071 19.5432 5.93091 19.5928C5.208 19.6879 4.47621 19.4917 3.89771 19.0479C3.64845 18.8565 3.45775 18.6202 3.28052 18.3564C3.10705 18.0983 2.91746 17.7695 2.6897 17.375C2.46197 16.9806 2.27182 16.6523 2.13501 16.373C1.99526 16.0877 1.88601 15.8047 1.84497 15.4932C1.7498 14.7701 1.946 14.0385 2.38989 13.46C2.62098 13.1588 2.92158 12.9395 3.26196 12.7256C3.53563 12.5536 3.68772 12.2778 3.68774 12C3.68776 11.7222 3.53563 11.4464 3.26196 11.2744C2.92163 11.0606 2.62095 10.8412 2.38989 10.54C1.94601 9.96145 1.74979 9.22985 1.84497 8.50684C1.88601 8.19532 1.99525 7.9123 2.13501 7.62695C2.27181 7.34768 2.46197 7.01943 2.6897 6.625C2.91743 6.23055 3.10706 5.90169 3.28052 5.64355C3.45775 5.37983 3.64845 5.14346 3.89771 4.95215C4.47623 4.50828 5.20796 4.31214 5.93091 4.40723C6.30712 4.45681 6.64689 4.60812 7.0022 4.7959C7.28788 4.9469 7.60344 4.94051 7.84399 4.80176C8.08445 4.6629 8.24684 4.39315 8.25903 4.07031C8.27406 3.66851 8.31396 3.29803 8.45923 2.94727C8.73834 2.2737 9.27394 1.73808 9.94751 1.45898C10.2377 1.33882 10.5379 1.29215 10.8547 1.27051C11.1648 1.24937 11.5441 1.25 11.9993 1.25ZM11.9993 2.75C11.5235 2.75 11.2036 2.7507 10.9563 2.76758C10.7164 2.78398 10.5988 2.81286 10.5217 2.84473C10.2156 2.97161 9.97182 3.21537 9.84497 3.52148C9.80497 3.61811 9.77141 3.76901 9.75806 4.12598C9.72843 4.91826 9.31993 5.68139 8.59399 6.10059C7.86802 6.5196 7.00195 6.49254 6.30103 6.12207C5.98542 5.95529 5.83825 5.90817 5.73462 5.89453C5.4061 5.85142 5.07366 5.94087 4.81079 6.14258C4.74459 6.19345 4.66 6.28053 4.52563 6.48047C4.38736 6.68627 4.22739 6.96296 3.9895 7.375C3.75146 7.78729 3.59176 8.06439 3.48267 8.28711C3.37658 8.50371 3.34317 8.62035 3.33228 8.70312C3.28913 9.03162 3.37867 9.36406 3.58032 9.62695C3.64398 9.70984 3.75783 9.81413 4.05981 10.0039C4.73124 10.4258 5.18777 11.1616 5.18774 12C5.1877 12.8384 4.7312 13.5743 4.05981 13.9961C3.75781 14.1859 3.64399 14.2902 3.58032 14.373C3.37865 14.636 3.2891 14.9684 3.33228 15.2969C3.34317 15.3797 3.37658 15.4963 3.48267 15.7129C3.59174 15.9356 3.75059 16.2129 3.98853 16.625C4.22649 17.0372 4.38734 17.3137 4.52563 17.5195C4.66006 17.7196 4.74457 17.8066 4.81079 17.8574C5.07369 18.0592 5.40608 18.1486 5.73462 18.1055C5.83826 18.0918 5.98539 18.0447 6.30103 17.8779C7.00198 17.5075 7.86798 17.4804 8.59399 17.8994C9.31992 18.3186 9.72841 19.0817 9.75806 19.874C9.77141 20.231 9.80497 20.3819 9.84497 20.4785C9.97182 20.7846 10.2156 21.0284 10.5217 21.1553C10.5988 21.1871 10.7164 21.216 10.9563 21.2324C11.2036 21.2493 11.5235 21.25 11.9993 21.25C12.4753 21.25 12.7958 21.2493 13.0432 21.2324C13.283 21.216 13.4006 21.1871 13.4778 21.1553C13.784 21.0284 14.0276 20.7847 14.1545 20.4785C14.1946 20.3819 14.2281 20.2311 14.2415 19.874C14.2711 19.0818 14.6797 18.3187 15.4055 17.8994C16.1315 17.4802 16.9975 17.5075 17.6985 17.8779C18.0139 18.0446 18.1613 18.0918 18.2649 18.1055C18.5934 18.1487 18.9258 18.0591 19.1887 17.8574C19.2549 17.8066 19.3394 17.7196 19.4739 17.5195C19.6122 17.3137 19.7721 17.0371 20.01 16.625C20.248 16.2128 20.4077 15.9356 20.5168 15.7129C20.623 15.4962 20.6563 15.3797 20.6672 15.2969C20.7104 14.9683 20.621 14.636 20.4192 14.373C20.3555 14.2902 20.2417 14.1859 19.9397 13.9961C19.2684 13.5742 18.8118 12.8383 18.8118 12C18.8118 11.1618 19.2685 10.4257 19.9397 10.0039C20.2417 9.81414 20.3555 9.70984 20.4192 9.62695C20.621 9.36401 20.7104 9.03173 20.6672 8.70312C20.6563 8.62033 20.623 8.50375 20.5168 8.28711C20.4077 8.0644 20.248 7.78724 20.01 7.375C19.7721 6.96294 19.6122 6.68625 19.4739 6.48047C19.3394 6.28035 19.255 6.19341 19.1887 6.14258C18.9258 5.9409 18.5934 5.85131 18.2649 5.89453C18.1613 5.90824 18.014 5.95535 17.6985 6.12207C16.9975 6.49246 16.1315 6.51973 15.4055 6.10059C14.6797 5.68134 14.2711 4.91818 14.2415 4.12598C14.2281 3.76889 14.1946 3.6181 14.1545 3.52148C14.0276 3.21533 13.784 2.97156 13.4778 2.84473C13.4006 2.81289 13.283 2.78396 13.0432 2.76758C12.7958 2.75072 12.4753 2.75 11.9993 2.75ZM12.0002 8.25C14.0712 8.25008 15.7502 9.92898 15.7502 12C15.7502 14.071 14.0712 15.7499 12.0002 15.75C9.92918 15.75 8.25024 14.0711 8.25024 12C8.25025 9.92893 9.92918 8.25 12.0002 8.25ZM12.0002 9.75C10.7576 9.75 9.75025 10.7574 9.75024 12C9.75024 13.2426 10.7576 14.25 12.0002 14.25C13.2428 14.2499 14.2502 13.2426 14.2502 12C14.2502 10.7574 13.2428 9.75008 12.0002 9.75Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst EditIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M14.7573 2.62109C16.586 0.793009 19.551 0.792667 21.3794 2.62109C23.2077 4.44953 23.2074 7.41458 21.3794 9.24316L11.9312 18.6914C11.3668 19.2558 11.0409 19.5832 10.6782 19.8662C10.2601 20.1924 9.8073 20.473 9.32861 20.7012C8.91326 20.8991 8.47438 21.0435 7.71729 21.2959L3.6333 22.6572C2.98287 22.8739 2.2656 22.7045 1.78076 22.2197C1.29592 21.7349 1.12652 21.0177 1.34326 20.3672L2.70459 16.2832C2.95699 15.526 3.10135 15.0873 3.29932 14.6719C3.52751 14.1931 3.80811 13.7404 4.13428 13.3223C4.41726 12.9596 4.7447 12.6337 5.30908 12.0693L14.7573 2.62109ZM6.36963 13.1299C5.78017 13.7193 5.53013 13.9718 5.31689 14.2451C5.05773 14.5774 4.83513 14.937 4.65381 15.3174C4.50463 15.6304 4.39107 15.9669 4.12744 16.7578L3.18018 19.5986L4.40088 20.8193L7.24268 19.873C8.03344 19.6095 8.37011 19.4958 8.68311 19.3467C9.06344 19.1654 9.42314 18.9427 9.75537 18.6836C10.0287 18.4704 10.2812 18.2203 10.8706 17.6309L18.4399 10.0596C17.6514 9.7814 16.635 9.26728 15.6841 8.31641C14.7327 7.36499 14.218 6.34832 13.9399 5.55957L6.36963 13.1299ZM20.3188 3.68164C19.0762 2.439 17.0607 2.43934 15.8179 3.68164L15.1567 4.3418C15.1909 4.51694 15.2474 4.75607 15.3442 5.03516C15.5614 5.66107 15.9718 6.48301 16.7446 7.25586C17.5175 8.02863 18.3395 8.43908 18.9653 8.65625C19.2437 8.7528 19.4827 8.80861 19.6577 8.84277L20.3188 8.18262C21.5611 6.93982 21.5613 4.92429 20.3188 3.68164Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst StarIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style ?? {\n      color: '#FFB60A'\n    }\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12.618 4.15194C12.9432 4.62645 13.0603 5.22252 12.8619 5.76247C12.6047 6.46235 12.2573 7.1317 11.823 7.75195L10.9744 8.96289C10.9373 9.01624 10.9962 9.08379 11.0544 9.05469L14.7869 7.18848C15.0583 7.0528 15.3361 6.93398 15.6189 6.83182C15.9725 6.70405 16.3581 6.71264 16.7187 6.81895L17.0548 6.91802C18.4028 7.31535 18.9314 8.94238 18.0744 10.0561L16.4834 12.1238C16.2028 12.4884 16.0565 12.9386 16.0692 13.3986L16.141 16.0057C16.1797 17.4104 14.7958 18.416 13.4718 17.9452L11.0135 17.0712C10.5801 16.9171 10.1069 16.9171 9.67351 17.0712L7.21522 17.9452C5.89117 18.416 4.50727 17.4104 4.54599 16.0057L4.61785 13.3986C4.63053 12.9386 4.48424 12.4884 4.20365 12.1238L2.61267 10.0562C1.75562 8.94245 2.2843 7.31538 3.63232 6.9181L6.13477 6.18059C6.57614 6.05052 6.95915 5.77223 7.21924 5.39265L8.6938 3.24064C9.48815 2.08134 11.199 2.08126 11.9934 3.2405L12.618 4.15194Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nconst width = 800;\nconst delayMlt = 75;\nreturn () => {\n  State.useRequireSocketNavigation();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const session = State.api?.session?.useSession?.();\n  const navigation = ReactNavigation.useNavigation();\n  const shouldShowBack = navigation.canGoBack();\n  const photos = session?.photos ?? [];\n  const about = session?.card?.about?.trim() ?? \"\";\n  const tags = session?.card?.tags ?? [];\n  const progress = React.useMemo(() => {\n    let value = 0;\n    value += photos.length * 15;\n    if (!!about?.length) {\n      value += 25;\n    }\n    if (!!tags.length) {\n      value += 30;\n    }\n    return Math.min(100, value);\n  }, [photos.length, about, tags.length]);\n  const shouldComplete = progress < 100;\n  const onTopUp = React.useCallback(_async(function () {\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"store\",\n      isModal: true,\n      purchaseSource: \"settings\"\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n    return _await();\n  }), []);\n  const onStatuses = React.useCallback(_async(function () {\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"StatusesModal\",\n      session: session,\n      onTopUp: onTopUp\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n    return _await();\n  }), [session, onTopUp, theme.isDark]);\n  const styles = React.useMemo(() => {\n    return {\n      absolute: {\n        position: 'absolute',\n        height: 400,\n        left: 0,\n        right: 0,\n        top: 0\n      },\n      container: {\n        flex: 1,\n        width: \"100%\",\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        paddingTop: Math.max(safeArea.top, 16),\n        paddingBottom: shouldComplete ? 64 : 0\n      },\n      header: {\n        container: {\n          flexDirection: 'row',\n          justifyContent: 'center',\n          width: '100%'\n        },\n        inner: {\n          flexDirection: 'row',\n          justifyContent: 'space-between',\n          alignItems: 'center',\n          paddingHorizontal: 16,\n          gap: 12,\n          maxWidth: width,\n          width: '100%',\n          position: 'relative',\n          overflow: 'visible'\n        },\n        left: {\n          flexDirection: 'row',\n          alignItems: 'center',\n          gap: 4,\n          minWidth: 24\n        },\n        right: {\n          flexDirection: 'row',\n          justifyContent: 'flex-end',\n          alignItems: 'center',\n          gap: 16\n        },\n        icon: {\n          width: 24,\n          height: 24,\n          color: theme.theme.semantic.content.regular.primary\n        },\n        titleWrap: {\n          position: 'absolute',\n          left: 56,\n          right: 56,\n          top: 0,\n          bottom: 0,\n          justifyContent: 'center',\n          alignItems: 'center',\n          pointerEvents: 'none'\n        },\n        title: {\n          fontFamily: theme.theme.typography.family.heading,\n          fontWeight: '500',\n          fontSize: 16,\n          lineHeight: 24,\n          letterSpacing: -0.3,\n          color: theme.theme.component?.appBar?.contentPrimary ?? theme.theme.semantic?.content?.regular?.primary,\n          textAlign: 'center'\n        },\n        titleLeft: {\n          // Стиль, как заголовок страницы магазина (Store head.title)\n          fontFamily: theme.theme.typography.family.heading,\n          fontWeight: 600,\n          fontSize: 24,\n          lineHeight: 28,\n          letterSpacing: -0.7,\n          color: theme.theme.component.appBar.contentPrimary,\n          textAlign: 'left'\n        }\n      },\n      profile: {\n        container: {\n          width: '100%',\n          paddingTop: 12,\n          paddingBottom: 24,\n          flexDirection: 'column',\n          alignItems: 'center',\n          justifyContent: 'center',\n          minHeight: 200\n        },\n        subcontainer: {\n          flexDirection: 'column',\n          alignItems: 'center',\n          justifyContent: 'center',\n          width: '100%',\n          maxWidth: width\n        }\n      },\n      topSection: {\n        width: '100%',\n        position: 'relative',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        overflow: 'hidden'\n      },\n      topSectionPremiumOffset: {\n        marginTop: -Math.max(safeArea.top, 16),\n        paddingTop: Math.max(safeArea.top, 16)\n      },\n      topSectionGradient: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0\n      },\n      status: {\n        container: {\n          flexDirection: 'row-reverse',\n          alignItems: 'flex-end',\n          gap: 8\n        },\n        subcontainer: {\n          flex: 1,\n          alignItems: 'stretch',\n          justifyContent: 'flex-end'\n        }\n      },\n      content: {\n        container: {\n          width: '100%',\n          maxWidth: width,\n          paddingHorizontal: 12,\n          paddingTop: 0,\n          paddingBottom: 12,\n          gap: 8\n        }\n      },\n      panel: {\n        position: 'absolute',\n        height: '100%',\n        maxHeight: '100%',\n        top: 0,\n        left: 0,\n        right: 0,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-end'\n      }\n    };\n  }, [theme, safeArea, shouldComplete]);\n\n  // React.useEffect(() => {\n  //   Notification.showNotification({\n  //     text: \"TEST\",\n  //     type: 'info',\n  //     duration: 5000,\n  //   });\n  // }, []);\n\n  const paddingBottom = Math.max(safeArea.bottom, 4);\n  const hasSubscription = !!session?.subscription?.hasSubscription;\n  const premiumTopGradientColors = React.useMemo(() => {\n    const pageBg = theme.theme.semantic.surface.regular.pageBackground;\n    if (theme.isDark) {\n      return ['rgba(254, 55, 91, 0.32)', 0];\n    }\n    return ['#FFD7DE', 0];\n  }, [theme.isDark, theme.theme.semantic.surface.regular.pageBackground]);\n  let delay = 0;\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    scrollable: true,\n    testID: \"page_profile\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.topSection, hasSubscription && styles.topSectionPremiumOffset]\n  }, hasSubscription && /*#__PURE__*/React.createElement(LinearGradient, {\n    start: {\n      x: 0,\n      y: 0\n    },\n    end: {\n      x: 0,\n      y: 1\n    },\n    colors: premiumTopGradientColors,\n    style: styles.topSectionGradient\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header.inner\n  }, shouldShowBack ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header.left\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: () => {\n      navigation.canGoBack() && navigation.goBack();\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    style: styles.header.icon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header.titleWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header.title,\n    numberOfLines: 1\n  }, t(\"profile\")))) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header.left\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header.titleLeft,\n    numberOfLines: 1\n  }, t(\"profile\"))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header.right\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: () => {\n      navigation.dispatch(ReactNavigation.StackActions.push('Settings'));\n    }\n  }, /*#__PURE__*/React.createElement(SettingsIcon, {\n    style: styles.header.icon\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: () => {\n      navigation.dispatch(ReactNavigation.StackActions.push('ProfileEdit'));\n    }\n  }, /*#__PURE__*/React.createElement(EditIcon, {\n    style: styles.header.icon\n  }))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.profile.container\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    delay: ++delay * delayMlt,\n    style: styles.profile.subcontainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Card\",\n    session: session,\n    progress: progress\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content.container\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VerificationNotificationBanner\",\n    session: session\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Balance\",\n    session: session\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ProfileGiftsShowcase\",\n    session: session,\n    delay: ++delay * delayMlt\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.status.container\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    delay: ++delay * delayMlt,\n    style: styles.status.subcontainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StatusBlock\",\n    session: session,\n    onPress: onStatuses\n  })), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    delay: ++delay * delayMlt,\n    style: styles.status.subcontainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"RatingBlock\",\n    session: session\n  }))), !session?.subscription?.hasSubscription && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    style: {\n      width: '100%'\n    },\n    delay: ++delay * delayMlt\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StorePro\",\n    session: session,\n    top: 2\n  })), !!session?.subscription?.hasSubscription && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ProfilePremium\",\n    session: session,\n    delay: ++delay * delayMlt\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"About\",\n    session: session,\n    delay: ++delay * delayMlt\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Interests\",\n    session: session,\n    delay: ++delay * delayMlt\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Media\",\n    session: session,\n    delay: ++delay * delayMlt\n  })))), shouldComplete && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    delay: ++delay * delayMlt,\n    scale: 1,\n    translateY: 50,\n    style: [styles.panel, {\n      paddingBottom: Navigation.tabBarHeight + paddingBottom + 12\n    }],\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSTopBarGradient, {\n    visible: true,\n    duration: 1000,\n    multiply: 1.25,\n    colors: hasSubscription ? premiumTopGradientColors : [theme.theme.semantic.surface.accent.surface2, Utils.withOpacity(theme.theme.semantic.surface.accent.surface2, 0)],\n    style: styles.topSectionGradient\n  }), /*#__PURE__*/React.createElement(Components.DSButton, {\n    size: \"L\",\n    onPress: () => {\n      navigation.dispatch(ReactNavigation.StackActions.push('ProfileEdit'));\n    }\n  }, t(\"profileCompleteButton\"))));\n};"},"ProfileEdit":{"name":"ProfileEdit","key":"f21d85fe3b88763219dc384741d7e17d492e0b53c17bc61d3b5d11fba7479127","code":"deps: MediaEdit, TagsModal, CountryModal, IOSWebKeyboardButton\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst width = 800;\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst AddIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"18\",\n    height: \"18\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_1076_8193)\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M8 0.833008C11.9578 0.833184 15.1658 4.04222 15.166 8C15.1658 11.9578 11.9578 15.1658 8 15.166C4.04222 15.1658 0.833184 11.9578 0.833008 8C0.833184 4.04222 4.04222 0.833184 8 0.833008ZM8 1.83301C4.5945 1.83318 1.83318 4.5945 1.83301 8C1.83318 11.4055 4.5945 14.1658 8 14.166C11.4055 14.1658 14.1658 11.4055 14.166 8C14.1658 4.5945 11.4055 1.83318 8 1.83301Z\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8 5.5C8.27614 5.5 8.5 5.72386 8.5 6V7.5H10C10.2761 7.5 10.5 7.72387 10.5 8C10.5 8.27614 10.2761 8.5 10 8.5H8.5V10C8.5 10.2761 8.27614 10.5 8 10.5C7.72386 10.5 7.5 10.2761 7.5 10V8.5H6C5.72386 8.5 5.5 8.27614 5.5 8C5.50001 7.72387 5.72386 7.5 6 7.5H7.5V6C7.5 5.72386 7.72386 5.5 8 5.5Z\",\n    fill: \"currentColor\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_1076_8193\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"18\",\n    height: \"18\",\n    fill: \"currentColor\"\n  }))));\n};\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M6.47 6.47C6.763 6.177 7.237 6.177 7.53 6.47L12 10.94L16.47 6.47C16.763 6.177 17.237 6.177 17.53 6.47C17.823 6.763 17.823 7.237 17.53 7.53L13.06 12L17.53 16.47C17.823 16.763 17.823 17.237 17.53 17.53C17.237 17.823 16.763 17.823 16.47 17.53L12 13.06L7.53 17.53C7.237 17.823 6.763 17.823 6.47 17.53C6.177 17.237 6.177 16.763 6.47 16.47L10.94 12L6.47 7.53C6.177 7.237 6.177 6.763 6.47 6.47Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _empty() {}\nconst ProfileReviewNotification = () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: 280,\n      maxWidth: '100%',\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 4\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 4\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Assets.ExclamationDown, {\n    style: {\n      color: theme.theme.component.toast.informational.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      flex: 1,\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: 700,\n      letterSpacing: -0.2\n    }\n  }, t('profileChangesUnderReview'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: () => Notification.hideNotificationByKey('profileReviewNotification')\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      paddingLeft: 32,\n      color: theme.theme.component.toast.contentSecondary,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    }\n  }, t('profileChangesUnderReviewDesc')));\n};\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nreturn () => {\n  State.useRequireSocketNavigation();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const navigation = ReactNavigation.useNavigation();\n  const {\n    params\n  } = ReactNavigation.useRoute();\n  const session = State.api?.session?.useSession?.();\n  const [about, setAbout] = React.useState(session?.card?.about);\n  const [username, setUsername] = React.useState(session?.user?.username);\n  const [country, setCountry] = React.useState(session?.card?.country);\n  const [tags, setTags] = React.useState(session?.card?.tags);\n  const photos = session?.photos ?? [];\n  const [photos_changed, set_photos_changed] = React.useState(false);\n  const previewSession = React.useMemo(() => ({\n    ...session,\n    user: {\n      ...session.user,\n      username\n    },\n    card: {\n      ...session.card,\n      about,\n      country,\n      tags\n    }\n  }), [session, username, about, country, tags]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingTop: Math.max(safeArea.top, 12),\n      paddingBottom: safeArea.bottom + 76,\n      paddingLeft: safeArea.left,\n      paddingRight: safeArea.right\n    },\n    subcontainer: {\n      width: \"100%\",\n      maxWidth: width,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 8,\n      paddingHorizontal: 12\n    },\n    head: {\n      position: 'relative',\n      alignSelf: 'stretch',\n      marginHorizontal: -12,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      minHeight: 48\n    },\n    title: {\n      fontFamily: theme.theme.typography.family.paragraph,\n      color: theme.theme.component.appBar.contentPrimary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      padding: 12\n    },\n    section: {\n      container: {\n        padding: 16,\n        backgroundColor: theme.theme.semantic.surface.regular.surface1,\n        borderRadius: 24,\n        gap: 8,\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'center',\n        width: '100%',\n        overflow: 'visible'\n      },\n      row: {\n        flexDirection: 'row',\n        alignItems: 'flex-start',\n        justifyContent: 'flex-start',\n        width: '100%'\n      },\n      header: {\n        color: theme.theme.semantic.content.regular.secondary,\n        fontFamily: theme.theme.typography.family.paragraph,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 500\n      },\n      text: {\n        color: theme.theme.semantic.content.regular.primary,\n        fontFamily: theme.theme.typography.family.paragraph,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 500,\n        letterSpacing: -0.2\n      }\n    },\n    aboutSection: {\n      overflow: 'hidden'\n    },\n    aboutHeader: {\n      letterSpacing: -0.2\n    },\n    nameField: {\n      width: '100%',\n      height: 48,\n      justifyContent: 'center',\n      paddingHorizontal: 16,\n      borderWidth: 1,\n      borderRadius: 12,\n      borderColor: theme.theme.component.textField.borderDefault,\n      backgroundColor: Utils.withOpacity(theme.theme.component.textField.bg, 0.05)\n    },\n    nameLabel: {\n      color: theme.theme.component.textField.contentSecondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    },\n    nameInput: {\n      height: 20,\n      padding: 0,\n      color: theme.theme.component.textField.contentPrimary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      ...(ReactNative.Platform.OS === 'android' && {\n        includeFontPadding: false\n      }),\n      ...(ReactNative.Platform.OS === 'web' && {\n        outlineStyle: 'none'\n      })\n    },\n    aboutField: {\n      position: 'relative',\n      width: '100%',\n      height: 96,\n      borderWidth: 1,\n      borderRadius: 24,\n      borderColor: theme.theme.component.textField.borderDefault,\n      backgroundColor: Utils.withOpacity(theme.theme.component.textField.bg, 0.05),\n      overflow: 'hidden'\n    },\n    aboutInput: {\n      width: '100%',\n      height: '100%',\n      paddingTop: 12,\n      paddingRight: 16,\n      paddingBottom: 30,\n      paddingLeft: 16,\n      color: theme.theme.component.textField.contentPrimary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      textAlignVertical: 'top',\n      ...(ReactNative.Platform.OS === 'android' && {\n        includeFontPadding: false\n      }),\n      ...(ReactNative.Platform.OS === 'web' && {\n        outlineStyle: 'none',\n        resize: 'none'\n      })\n    },\n    aboutCounter: {\n      position: 'absolute',\n      right: 16,\n      bottom: 12,\n      color: theme.theme.component.textField.contentTertiary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    },\n    tags: {\n      flexDirection: 'row',\n      flexWrap: 'wrap',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 8,\n      overflow: 'visible'\n    },\n    tag: {\n      backgroundColor: theme.theme.component.chip.bgDefault,\n      borderRadius: 999,\n      paddingHorizontal: 16,\n      paddingVertical: 12,\n      shadowColor: \"#00000033\",\n      shadowOffset: {\n        width: 0,\n        height: 6\n      },\n      shadowOpacity: 0.1,\n      shadowRadius: 8,\n      elevation: 8,\n      overflow: 'visible'\n    },\n    tagText: {\n      color: theme.theme.component.chip.contentDefault,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    },\n    panel: {\n      position: ReactNative.Platform.OS === 'web' ? 'fixed' : 'absolute',\n      bottom: 12,\n      left: 0,\n      right: 0,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    panelRow: {\n      width: '100%',\n      maxWidth: width,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      maxWidth: width,\n      paddingLeft: 12 + safeArea.left,\n      paddingRight: 12 + safeArea.right\n    }\n  }), [theme, safeArea]);\n  const onTag = React.useCallback(_async(function () {\n    ReactNative.Keyboard.dismiss();\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"TagsModal\",\n      tags: tags\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    }), function (result) {\n      if (result != null) {\n        setTags(result);\n      }\n    });\n  }), [tags, setTags]);\n  const onSave = Components.useCallbackLoader(_async(function () {\n    ReactNative.Keyboard.dismiss();\n    return _continueIgnored(_catch(function () {\n      const name_changed = (username ?? '') !== (session?.user?.username ?? '');\n      const bio_changed = (about ?? '') !== (session?.card?.about ?? '');\n      const tagsEqual = (tags ?? []).length === (session?.card?.tags ?? []).length && (tags ?? []).every((value, index) => value === (session?.card?.tags ?? [])[index]);\n      const interests_changed = !tagsEqual;\n      const geo_changed = (country ?? null) !== (session?.card?.country ?? null);\n      const profileEditedAnalytics = {\n        ...Analytics.getGlobalParams(),\n        analytics_event: 'profile_edited',\n        photos_changed: !!photos_changed,\n        name_changed,\n        bio_changed,\n        interests_changed,\n        geo_changed\n      };\n      return _await(State.post('/api/login/meta/username', {\n        \"username\": username\n      }), function ({\n        user\n      }) {\n        return _await(State.post('/api/login/profile', {\n          \"about\": about,\n          \"tags\": tags,\n          \"country\": country\n        }, 'json', undefined, undefined, {\n          analytics: profileEditedAnalytics\n        }), function ({\n          card\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            user,\n            card\n          });\n          if ((name_changed || bio_changed || photos_changed) && card?.verificationStatus === 'PENDING') {\n            Notification.showNotification({\n              key: 'profileReviewNotification',\n              children: /*#__PURE__*/React.createElement(ProfileReviewNotification, null),\n              duration: 5000\n            });\n          }\n          navigation.canGoBack() && navigation.goBack();\n        });\n      });\n    }, function (error) {\n      console.error(error);\n      Notification.showNotification({\n        text: error.message,\n        type: 'error',\n        duration: 5000\n      });\n    }));\n  }), [photos_changed, session?.user?.username, session?.card?.about, session?.card?.tags, session?.card?.country, username, about, tags, country]);\n  const onPreview = React.useCallback(() => {\n    ReactNative.Keyboard.dismiss();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: previewSession,\n      source: \"profile_edit\",\n      ownerPreview: true\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [previewSession]);\n  const bottomStyle = Components.useKeyboardPage();\n  const isIOSWeb = React.useMemo(() => {\n    if (ReactNative.Platform.OS !== 'web') return false;\n    const ua = globalThis?.navigator?.userAgent ?? '';\n    return /iPad|iPhone|iPod/i.test(ua);\n  }, []);\n  const [isIOSWebKeyboardOpen, setIsIOSWebKeyboardOpen] = React.useState(false);\n  React.useEffect(() => {\n    if (!isIOSWeb) return;\n    const viewport = globalThis?.visualViewport;\n    const doc = globalThis?.document;\n    if (!viewport || !doc) return;\n    const updateKeyboardState = () => {\n      const currentHeight = viewport.height || 0;\n      const offsetTop = viewport.offsetTop || 0;\n      const innerHeight = globalThis?.innerHeight || 0;\n      const keyboardInset = Math.max(0, innerHeight - currentHeight - offsetTop);\n      setIsIOSWebKeyboardOpen(keyboardInset > 0);\n    };\n    updateKeyboardState();\n    viewport.addEventListener('resize', updateKeyboardState);\n    viewport.addEventListener('scroll', updateKeyboardState);\n    doc.addEventListener('focusin', updateKeyboardState);\n    doc.addEventListener('focusout', updateKeyboardState);\n    return () => {\n      viewport.removeEventListener('resize', updateKeyboardState);\n      viewport.removeEventListener('scroll', updateKeyboardState);\n      doc.removeEventListener('focusin', updateKeyboardState);\n      doc.removeEventListener('focusout', updateKeyboardState);\n    };\n  }, [isIOSWeb]);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    scrollable: true,\n    testID: \"page_profileEdit\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.head\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      left: 4,\n      top: '50%',\n      transform: [{\n        translateY: '-50%'\n      }]\n    },\n    feedback: true,\n    onPress: () => {\n      navigation.canGoBack() && navigation.goBack();\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    style: styles.title\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('profileEditHeader'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.section.container, styles.aboutSection]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.section.header, styles.aboutHeader]\n  }, t('profileBioHeader')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameField\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.nameLabel\n  }, t('profileEditName')), /*#__PURE__*/React.createElement(ReactNative.TextInput, {\n    value: username,\n    onChangeText: setUsername,\n    style: styles.nameInput,\n    autoCorrect: false,\n    maxLength: 100\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.aboutField\n  }, /*#__PURE__*/React.createElement(ReactNative.TextInput, {\n    value: about,\n    onChangeText: setAbout,\n    style: styles.aboutInput,\n    autoFocus: params?.focus === 'about',\n    placeholder: t('profileEditBio'),\n    placeholderTextColor: theme.theme.component.textField.contentTertiary,\n    autoCorrect: true,\n    multiline: true,\n    numberOfLines: 4,\n    maxLength: 250,\n    returnKeyType: \"default\",\n    blurOnSubmit: false\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    pointerEvents: \"none\",\n    style: styles.aboutCounter\n  }, about?.length ?? 0, \"/250\"))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 0,\n    styleContainer: {\n      width: \"100%\"\n    },\n    style: {\n      padding: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    onPress: _async(function () {\n      ReactNative.Keyboard.dismiss();\n      Sheet.showPortal(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"CountryModal\",\n        initialCode: country ? [country] : [],\n        mode: \"radio\",\n        onSave: codes => {\n          if (codes?.[0]) {\n            setCountry(codes[0]);\n          }\n        },\n        onReset: () => setCountry(null)\n      }), {\n        theme: theme.isDark ? 'dark' : 'light'\n      });\n      return _await();\n    })\n  }, country ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: country\n  }), /*#__PURE__*/React.createElement(Components.DSCountryText, {\n    numberOfLines: 1,\n    code: country,\n    style: {\n      flex: 1,\n      color: theme.theme.component.listItem.contentPrimaryDefault,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      ...(ReactNative.Platform.OS === 'android' && {\n        includeFontPadding: false\n      })\n    }\n  })) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 16,\n      lineHeight: 24,\n      fontFamily: theme.theme.typography.family.paragraph\n    }\n  }, \"\\uD83C\\uDF0D\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      flex: 1,\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    }\n  }, t('countrySelectCountry'))), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: {\n      color: theme.theme.component.listItem.contentPrimaryDefault\n    }\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.row\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.section.header, {\n      flex: 1\n    }]\n  }, t('profileEditInterests')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.header\n  }, tags?.length || 0, \"/7\", \" \")), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tags\n  }, tags?.map(tag => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    key: tag,\n    style: styles.tag,\n    feedback: true,\n    onPress: () => {\n      onTag();\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.tagText, {\n      fontFamily: theme.theme.typography.family.paragraph\n    }]\n  }, t(tag)))), tags?.length < 7 && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: [styles.tag, {\n      backgroundColor: theme.theme.component.button.brandSoft.bgDefault,\n      overflow: 'visible'\n    }],\n    feedback: true,\n    onPress: () => {\n      onTag();\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      gap: 4,\n      alignItems: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.button.brandSoft.content,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.14\n    }\n  }, t(\"buttonAddMore\")), /*#__PURE__*/React.createElement(AddIcon, {\n    style: {\n      color: theme.theme.component.button.brandSoft.content\n    }\n  }))))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"MediaEdit\",\n    session: session,\n    onEdit: () => set_photos_changed(true)\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.panel]\n  }, /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.panelRow, !isIOSWeb || !isIOSWebKeyboardOpen ? bottomStyle : null]\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    size: \"L\",\n    style: {\n      flex: 1\n    },\n    onPress: onSave\n  }, t('profileEditSave')), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    size: \"L\",\n    type: \"brandSoft\",\n    style: {\n      flex: 1\n    },\n    onPress: onPreview\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      gap: 4,\n      alignItems: 'center',\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Eye, {\n    style: {\n      color: theme.theme.component.button.brandSoft.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.button.brandSoft.content,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    }\n  }, t('profileEditPreview')))))));\n};"},"ProfileGifts":{"name":"ProfileGifts","key":"2c4ab2e12bdf2784dd05f25943a7436893e898bfdb45a222b1a05d8aed3217af","code":"deps: Avatar\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst SHOWCASE_SLOTS = 3;\nconst formatWithSpaces = number => String(number ?? 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\nconst getImageSource = url => {\n  if (!url) return null;\n  if (/^https?:\\/\\//i.test(url)) return {\n    uri: url\n  };\n  return {\n    uri: State.getUrl(url)\n  };\n};\nconst mergeSender = (...senders) => {\n  const result = {};\n  for (const sender of senders) {\n    if (!sender) continue;\n    if (!result.userId && sender.userId) result.userId = sender.userId;\n    if (!result.name && sender.name) result.name = sender.name;\n    if (!result.photo && sender.photo) result.photo = sender.photo;\n    if (result.rating == null && sender.rating != null) result.rating = sender.rating;\n    if (result.status == null && sender.status != null) result.status = sender.status;\n    if (!result.subscription && sender.subscription) result.subscription = sender.subscription;\n  }\n  return Object.keys(result).length ? result : null;\n};\nconst senderFromMeta = meta => {\n  if (!meta) return null;\n  return {\n    userId: meta?.user?.id ?? meta?.card?.userId,\n    name: meta?.user?.username ?? meta?.card?.username ?? '',\n    photo: meta?.photos?.[0] ?? null,\n    status: meta?.status?.status ?? null,\n    subscription: meta?.subscription ?? null\n  };\n};\nconst formatGiftDate = (value, locale) => {\n  const date = new Date(value);\n  if (!Number.isFinite(date.getTime())) return '';\n  try {\n    return date.toLocaleString(locale || undefined, {\n      month: 'short',\n      day: 'numeric',\n      year: 'numeric',\n      hour: '2-digit',\n      minute: '2-digit'\n    });\n  } catch {\n    return date.toLocaleString();\n  }\n};\nconst BackIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M14.4306 4.51215C14.7002 4.19785 15.1738 4.16159 15.4882 4.43109C15.8022 4.70072 15.8386 5.17439 15.5692 5.48871L9.9872 12.0004L15.5692 18.5121C15.8384 18.8266 15.8023 19.3003 15.4882 19.5698C15.1738 19.8392 14.7002 19.8027 14.4306 19.4887L8.43056 12.4887C8.18981 12.2078 8.18981 11.793 8.43056 11.5121L14.4306 4.51215Z\",\n  fill: \"currentColor\"\n}));\nconst InfoIcon = ({\n  size = 16,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8 1.33337C11.6819 1.33337 14.6667 4.31814 14.6667 8.00004C14.6667 11.6819 11.6819 14.6667 8 14.6667C4.3181 14.6667 1.33334 11.6819 1.33334 8.00004C1.33334 4.31814 4.3181 1.33337 8 1.33337ZM8 2.66671C5.05449 2.66671 2.66667 5.05452 2.66667 8.00004C2.66667 10.9456 5.05449 13.3334 8 13.3334C10.9455 13.3334 13.3333 10.9456 13.3333 8.00004C13.3333 5.05452 10.9455 2.66671 8 2.66671ZM8 6.66671C8.36819 6.66671 8.66667 6.96518 8.66667 7.33337V10.6667C8.66667 11.0349 8.36819 11.3334 8 11.3334C7.63181 11.3334 7.33334 11.0349 7.33334 10.6667V7.33337C7.33334 6.96518 7.63181 6.66671 8 6.66671ZM8 4.66671C8.46024 4.66671 8.83334 5.0398 8.83334 5.50004C8.83334 5.96028 8.46024 6.33337 8 6.33337C7.53977 6.33337 7.16667 5.96028 7.16667 5.50004C7.16667 5.0398 7.53977 4.66671 8 4.66671Z\",\n  fill: color\n}));\nconst ShowcaseInfoTooltip = ({\n  styles,\n  text\n}) => {\n  const [visible, setVisible] = React.useState(false);\n  const isWeb = ReactNative.Platform.OS === 'web';\n  const show = React.useCallback(() => setVisible(true), []);\n  const hide = React.useCallback(() => setVisible(false), []);\n  const toggle = React.useCallback(() => setVisible(value => !value), []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, _extends({\n    style: styles.infoIconWrap\n  }, isWeb ? {\n    onMouseEnter: show,\n    onMouseLeave: hide\n  } : {}), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: () => !isWeb && toggle(),\n    hitSlop: 8\n  }, /*#__PURE__*/React.createElement(InfoIcon, {\n    size: 16,\n    color: styles.infoIcon.color\n  })), visible && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tooltip,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.tooltipText\n  }, text), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tooltipArrow\n  })));\n};\nconst FeedExploreIcon = ({\n  color,\n  size = 16\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M7.80387 0.896581C8.2224 0.799178 8.64919 0.821905 9.13786 0.909276C9.62073 0.995653 10.2091 1.15448 10.9523 1.35361C11.6951 1.55265 12.2831 1.70949 12.7443 1.87607C13.2114 2.04485 13.5935 2.23837 13.9074 2.53232C14.3642 2.96035 14.6841 3.51447 14.8263 4.12412C14.924 4.54291 14.9001 4.97011 14.8127 5.45908C14.7263 5.94187 14.5684 6.52958 14.3693 7.27256L14.0246 8.56064C13.8254 9.30384 13.6678 9.89223 13.5011 10.3536C13.3324 10.8205 13.1396 11.202 12.8459 11.5157C12.4312 11.9584 11.897 12.2705 11.3097 12.419C11.1384 12.8125 10.8895 13.1698 10.5734 13.4659C10.2595 13.7599 9.87753 13.9534 9.41032 14.1222C8.94901 14.2888 8.36132 14.4465 7.61833 14.6456C6.87504 14.8448 6.28678 15.0026 5.80387 15.089C5.31509 15.1763 4.88853 15.1992 4.46989 15.1017C3.86003 14.9594 3.30521 14.6398 2.87712 14.1827C2.58317 13.8689 2.38964 13.4878 2.22087 13.0206C2.05419 12.5592 1.89757 11.9709 1.6984 11.2276L1.35368 9.93955C1.1545 9.19621 0.995705 8.60804 0.909342 8.1251C0.821979 7.63632 0.799076 7.20976 0.896647 6.79111C1.03881 6.18142 1.35878 5.62738 1.81559 5.19932C2.12947 4.90534 2.51148 4.71185 2.97868 4.54307C3.43997 4.37646 4.02766 4.21872 4.77067 4.01963C4.94769 3.9722 5.11578 3.92782 5.27458 3.88584C5.53553 2.95361 5.76352 2.2934 6.2111 1.81553C6.63918 1.35866 7.19413 1.03875 7.80387 0.896581ZM4.96989 5.00107C4.24126 5.19638 3.71879 5.33855 3.31755 5.48349C2.91163 5.63018 2.6727 5.76629 2.49919 5.92881C2.18671 6.22161 1.96759 6.60065 1.87028 7.01767C1.81632 7.24923 1.81775 7.52434 1.89372 7.94932C1.97086 8.38067 2.11587 8.9208 2.3195 9.68076L2.66422 10.9688C2.86784 11.7287 3.0134 12.2687 3.16227 12.6808C3.30896 13.0867 3.44506 13.3256 3.60758 13.4991C3.90044 13.8117 4.27934 14.0307 4.69645 14.128C4.92805 14.182 5.20298 14.1806 5.62809 14.1046C6.0594 14.0275 6.59971 13.8824 7.35954 13.6788C8.11891 13.4753 8.6585 13.3305 9.07047 13.1817C9.47663 13.035 9.71622 12.899 9.88981 12.7364C9.98156 12.6505 10.064 12.5558 10.1388 12.4562C10.0198 12.4394 9.89732 12.4188 9.77067 12.3937C9.31932 12.3039 8.77578 12.1584 8.10465 11.9786C7.36172 11.7795 6.77395 11.6218 6.31266 11.4552C5.84544 11.2864 5.46347 11.0938 5.14958 10.7999C4.69246 10.3718 4.37285 9.81707 4.23063 9.20713C4.13307 8.78847 4.15595 8.36194 4.24333 7.87314C4.3297 7.39024 4.48851 6.80192 4.68766 6.05869L4.96989 5.00107ZM8.96208 1.89365C8.53716 1.81767 8.26197 1.81633 8.03044 1.87021C7.61345 1.96744 7.23441 2.18676 6.94157 2.49912C6.65086 2.80951 6.47142 3.2899 6.16032 4.42881C6.1098 4.61376 6.05614 4.8132 5.99821 5.02939L5.65348 6.31748C5.44988 7.07732 5.30485 7.6176 5.2277 8.04892C5.15171 8.47399 5.15028 8.74898 5.20426 8.98057C5.30157 9.39768 5.52061 9.77659 5.83317 10.0694C6.0067 10.2319 6.24562 10.3681 6.65153 10.5147C7.0636 10.6636 7.60375 10.8092 8.36344 11.0128C9.04687 11.1959 9.55408 11.3313 9.96598 11.4132C10.3759 11.4947 10.6549 11.5146 10.883 11.4864C10.9323 11.4803 10.9803 11.4718 11.0265 11.461C11.4435 11.3637 11.8226 11.1446 12.1154 10.8321C12.2778 10.6586 12.4141 10.4197 12.5607 10.0138C12.7096 9.60167 12.8552 9.06165 13.0588 8.30185L13.4035 7.01377C13.6071 6.254 13.7512 5.71361 13.8283 5.28232C13.9042 4.8577 13.9066 4.5831 13.8527 4.35166C13.7554 3.93451 13.5364 3.55469 13.2238 3.26182C13.0502 3.09927 12.8105 2.96322 12.4045 2.8165C11.9925 2.66773 11.4528 2.52289 10.6935 2.31943C9.93381 2.11587 9.39336 1.97081 8.96208 1.89365Z\",\n  fill: color\n}));\nconst MainCurrencyIcon = ({\n  size = 16,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nconst GiftShowcaseSlot = ({\n  gift,\n  styles\n}) => {\n  if (!gift) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.showcaseSlot\n    }, /*#__PURE__*/React.createElement(Image, {\n      source: State.getUrl('/api/component/assets/gifts/placeholder-gf.webp'),\n      style: styles.placeholderImage,\n      contentFit: \"contain\"\n    }));\n  }\n  const count = Number(gift.count) || 0;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.showcaseSlot\n  }, !!gift.giftImageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: gift.giftImageUrl\n    },\n    style: styles.showcaseImage,\n    contentFit: \"contain\"\n  }), count > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.countBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.countText,\n    numberOfLines: 1\n  }, \"x\", count)));\n};\nconst GiftRow = ({\n  gift,\n  styles,\n  locale,\n  onPress\n}) => {\n  const t = Locale.useTranslation();\n  const senderId = gift?.senderId ?? gift?.sender?.userId;\n  const senderMeta = State.api?.users?.useUser?.(senderId);\n  const sender = mergeSender(senderFromMeta(senderMeta), gift?.sender) ?? {};\n  const senderName = sender.name || t('profilePlaceholderUser') || 'User';\n  const status = String(gift?.status ?? '').toLowerCase();\n  const isRevoked = status === 'revoked' || status === 'chargeback';\n  const revokedText = status === 'chargeback' ? t('profileGiftsStatusChargeback') : t('profileGiftsStatusRevoked');\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: () => onPress?.({\n      ...gift,\n      sender\n    }),\n    style: styles.giftRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.senderColumn\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: sender.photo,\n    size: 36\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.senderTextColumn\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.senderName,\n    numberOfLines: 1\n  }, senderName), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftDate,\n    numberOfLines: 1\n  }, formatGiftDate(gift?.created, locale)))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftInfoColumn\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.priceRow\n  }, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n    size: 16,\n    style: styles.priceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.priceText,\n    numberOfLines: 1\n  }, formatWithSpaces(gift?.giftPriceGems))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftTitle,\n    numberOfLines: 1\n  }, gift?.giftTitle || ''), isRevoked && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.revokedText,\n    numberOfLines: 1\n  }, revokedText)), !!gift?.giftImageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: gift.giftImageUrl\n    },\n    style: styles.rowGiftImage,\n    contentFit: \"contain\"\n  }));\n};\nreturn () => {\n  State.useRequireSocketNavigation();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const navigation = ReactNavigation.useNavigation();\n  const session = State.api?.session?.useSession?.();\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const userId = session?.user?.id ?? session?.card?.userId ?? null;\n  const {\n    showcase\n  } = State.api?.gifts?.useProfileShowcase?.(userId) ?? {\n    showcase: []\n  };\n  const {\n    gifts\n  } = State.api?.gifts?.useMyGifts?.() ?? {\n    gifts: []\n  };\n  React.useEffect(() => {\n    State.api?.gifts?.markGiftsSeen?.().catch?.(console.error);\n  }, []);\n  const slots = React.useMemo(() => {\n    return Array.from({\n      length: SHOWCASE_SLOTS\n    }, (_, index) => showcase?.[index] ?? null);\n  }, [showcase]);\n  const totalCount = React.useMemo(() => {\n    const explicitTotal = showcase?.find(item => item?.totalCount != null)?.totalCount;\n    return explicitTotal != null ? Number(explicitTotal) || 0 : null;\n  }, [showcase]);\n  const sortedGifts = React.useMemo(() => {\n    return [...(gifts ?? [])].sort((a, b) => {\n      const aTime = new Date(a?.created).getTime();\n      const bTime = new Date(b?.created).getTime();\n      return (Number.isFinite(bTime) ? bTime : 0) - (Number.isFinite(aTime) ? aTime : 0);\n    });\n  }, [gifts]);\n  const openGifterGifts = React.useCallback(gift => {\n    const senderId = gift?.senderId ?? gift?.sender?.userId;\n    if (!senderId) return;\n    State._profileGiftsSender = {\n      senderId,\n      sender: gift?.sender ?? null\n    };\n    navigation.dispatch(ReactNavigation.StackActions.push('ProfileGiftsSender', {\n      senderId\n    }));\n    if (ReactNative.Platform.OS === 'web') {\n      setTimeout(() => {\n        globalThis?.history?.replaceState?.(globalThis.history.state, '', `/profile/gifts/from/${encodeURIComponent(senderId)}`);\n      }, 0);\n    }\n  }, [navigation]);\n  const styles = React.useMemo(() => ({\n    page: {\n      flex: 1,\n      width: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    },\n    appbar: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center',\n      height: 48 + Math.max(safeArea.top, 0),\n      paddingTop: Math.max(safeArea.top, 0),\n      paddingHorizontal: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      position: 'relative'\n    },\n    appbarSide: {\n      width: 48,\n      height: 48,\n      justifyContent: 'center',\n      alignItems: 'flex-start'\n    },\n    appbarIcon: {\n      color: theme.theme.component?.appBar?.contentPrimary ?? theme.theme.semantic.content.regular.primary\n    },\n    appbarTitleWrap: {\n      position: 'absolute',\n      left: 64,\n      right: 64,\n      top: Math.max(safeArea.top, 0),\n      bottom: 0,\n      justifyContent: 'center',\n      alignItems: 'center',\n      pointerEvents: 'none'\n    },\n    appbarTitle: {\n      color: theme.theme.component?.appBar?.contentPrimary ?? theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '500',\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    },\n    content: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center',\n      paddingHorizontal: 12,\n      paddingTop: 12,\n      paddingBottom: Math.max(safeArea.bottom, 12) + 12,\n      gap: 20\n    },\n    showcaseCard: {\n      width: '100%',\n      padding: 16,\n      borderRadius: 24,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      gap: 12\n    },\n    showcaseTitleRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4,\n      zIndex: 2\n    },\n    showcaseTitle: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7\n    },\n    infoIcon: {\n      color: theme.theme.semantic.content.regular.secondary\n    },\n    infoIconWrap: {\n      position: 'relative',\n      zIndex: 2\n    },\n    tooltip: {\n      position: 'absolute',\n      top: '100%',\n      left: -112,\n      width: 240,\n      marginTop: 8,\n      padding: 12,\n      borderRadius: 12,\n      backgroundColor: theme.theme.component?.tooltip?.inversion?.bg ?? '#232832'\n    },\n    tooltipText: {\n      color: theme.theme.component?.tooltip?.inversion?.content ?? '#F3F5F7',\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      letterSpacing: -0.2\n    },\n    tooltipArrow: {\n      position: 'absolute',\n      width: 16,\n      height: 8,\n      left: 112,\n      top: -8,\n      borderBottomWidth: 8,\n      borderLeftWidth: 8,\n      borderRightWidth: 8,\n      borderLeftColor: 'transparent',\n      borderRightColor: 'transparent',\n      borderBottomColor: theme.theme.component?.tooltip?.inversion?.bg ?? '#232832'\n    },\n    showcaseRow: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 8\n    },\n    showcaseSlot: {\n      flex: 1,\n      minWidth: 0,\n      height: 101,\n      padding: 12,\n      borderRadius: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface2,\n      alignItems: 'center',\n      justifyContent: 'center',\n      position: 'relative',\n      overflow: 'hidden'\n    },\n    showcaseImage: {\n      width: 82,\n      height: 82,\n      maxWidth: '100%',\n      maxHeight: '100%'\n    },\n    placeholderImage: {\n      width: 82,\n      height: 82,\n      maxWidth: '100%',\n      maxHeight: '100%'\n    },\n    countBadge: {\n      position: 'absolute',\n      top: 8,\n      right: 4,\n      minHeight: 18,\n      minWidth: 24,\n      paddingHorizontal: 4,\n      borderRadius: 999,\n      backgroundColor: theme.theme.component?.badge?.regularInversion?.bg ?? '#04060F',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    countText: {\n      color: theme.theme.component?.badge?.regularInversion?.content ?? '#FFFFFF',\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 12,\n      lineHeight: 12,\n      fontWeight: '500',\n      letterSpacing: -0.3\n    },\n    recentSection: {\n      width: '100%',\n      gap: 8\n    },\n    recentTitle: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: '600',\n      letterSpacing: -0.7\n    },\n    giftRow: {\n      width: '100%',\n      minHeight: 68,\n      paddingVertical: 12,\n      borderBottomWidth: 1,\n      borderBottomColor: theme.theme.semantic.stroke.regular.stroke2,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: 8\n    },\n    senderColumn: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    avatar: {\n      width: 36,\n      height: 36,\n      borderRadius: 999,\n      overflow: 'hidden',\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    avatarImage: {\n      width: 36,\n      height: 36,\n      borderRadius: 999\n    },\n    avatarFallback: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: '600'\n    },\n    senderTextColumn: {\n      flex: 1,\n      minWidth: 0,\n      gap: 2\n    },\n    senderName: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7\n    },\n    giftDate: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      letterSpacing: -0.2\n    },\n    giftInfoColumn: {\n      flexShrink: 0,\n      maxWidth: 104,\n      alignItems: 'flex-end',\n      justifyContent: 'center',\n      gap: 2\n    },\n    priceRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      gap: 4\n    },\n    priceIcon: {\n      color: theme.theme.semantic.content.brand.content1\n    },\n    priceText: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'right'\n    },\n    giftTitle: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      textAlign: 'right'\n    },\n    revokedText: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 11,\n      lineHeight: 14,\n      fontWeight: '600',\n      letterSpacing: -0.2,\n      textAlign: 'right'\n    },\n    rowGiftImage: {\n      width: 44,\n      height: 44,\n      flexShrink: 0\n    },\n    emptyWrap: {\n      flex: 1,\n      minHeight: 380,\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 12,\n      paddingHorizontal: 12\n    },\n    emptyImage: {\n      width: 100,\n      height: 100\n    },\n    emptyTextWrap: {\n      width: '100%',\n      alignItems: 'center',\n      gap: 8\n    },\n    emptyTitle: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'center'\n    },\n    emptySubtitle: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    emptyButton: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6,\n      height: 40,\n      paddingHorizontal: 16,\n      borderRadius: 12,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B'\n    },\n    emptyButtonText: {\n      color: theme.theme.component?.button?.brand?.content ?? '#FFFFFF',\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.14\n    }\n  }), [safeArea.bottom, theme]);\n  const appbarTitle = totalCount == null ? t('profileGiftsTitle') : t('profileGiftsTotalTitle').replace('{0}', formatWithSpaces(totalCount));\n  const isEmpty = sortedGifts.length === 0;\n  const buttonContent = theme.theme.component?.button?.brand?.content ?? '#FFFFFF';\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    scrollable: true,\n    testID: \"page_profile_gifts\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.page\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbar\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbarSide\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: () => {\n      navigation.canGoBack() ? navigation.goBack() : Navigation.goto({\n        name: 'Profile'\n      });\n    }\n  }, /*#__PURE__*/React.createElement(BackIcon, {\n    style: styles.appbarIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbarTitleWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.appbarTitle,\n    numberOfLines: 1\n  }, appbarTitle)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbarSide\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.showcaseCard\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.showcaseTitleRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.showcaseTitle,\n    numberOfLines: 1\n  }, t('profileGiftsShowcaseTitle')), /*#__PURE__*/React.createElement(ShowcaseInfoTooltip, {\n    styles: styles,\n    text: t('profileGiftsShowcaseTooltip')\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.showcaseRow\n  }, slots.map((gift, index) => /*#__PURE__*/React.createElement(GiftShowcaseSlot, {\n    key: gift?.catalogId ?? index,\n    gift: gift,\n    styles: styles\n  })))), isEmpty ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.emptyWrap\n  }, /*#__PURE__*/React.createElement(Image, {\n    source: State.getUrl('/api/component/assets/gifts/placeholder-gf.webp'),\n    style: styles.emptyImage,\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.emptyTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t('profileGiftsEmptyTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptySubtitle\n  }, t('profileGiftsEmptySubtitle'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.emptyButton,\n    onPress: () => Navigation.goto({\n      name: 'Feed'\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyButtonText\n  }, t('profileGiftsExploreFeed')), /*#__PURE__*/React.createElement(FeedExploreIcon, {\n    color: buttonContent,\n    size: 16\n  }))) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.recentSection\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.recentTitle\n  }, t('profileGiftsRecentTitle')), sortedGifts.map((gift, index) => /*#__PURE__*/React.createElement(GiftRow, {\n    key: gift?.id ?? `${gift?.senderId ?? 'gift'}-${index}`,\n    gift: gift,\n    styles: styles,\n    locale: locale,\n    onPress: openGifterGifts\n  }))))));\n};"},"ProfileGiftsSender":{"name":"ProfileGiftsSender","key":"358d411d6bd7ca667342bf48e7592000c34234ce5be6dd109d04abf2e5d08a7c","code":"deps: Avatar, CardModal\nconst formatWithSpaces = number => {\n  if (number == null) return '—';\n  return String(number).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n};\nconst formatGiftDate = (value, locale) => {\n  const date = new Date(value);\n  if (!Number.isFinite(date.getTime())) return '';\n  try {\n    return date.toLocaleString(locale || undefined, {\n      month: 'short',\n      day: 'numeric',\n      year: 'numeric',\n      hour: '2-digit',\n      minute: '2-digit'\n    });\n  } catch {\n    return date.toLocaleString();\n  }\n};\nconst getSenderIdFromLocation = () => {\n  if (ReactNative.Platform.OS !== 'web') return null;\n  try {\n    const uri = new URL(globalThis.location?.href);\n    const pathSenderId = uri.pathname.match(/\\/profile\\/gifts\\/from\\/([^/?#]+)/)?.[1];\n    const querySenderId = uri.searchParams?.get('senderId');\n    return pathSenderId && pathSenderId !== ':senderId' ? decodeURIComponent(pathSenderId) : querySenderId;\n  } catch {\n    return null;\n  }\n};\nconst replaceCanonicalSenderUrl = senderId => {\n  if (ReactNative.Platform.OS !== 'web' || !senderId) return;\n  try {\n    globalThis.history?.replaceState?.(globalThis.history.state, '', `/profile/gifts/from/${encodeURIComponent(senderId)}`);\n  } catch {}\n};\nconst mergeSender = (...senders) => {\n  const result = {};\n  for (const sender of senders) {\n    if (!sender) continue;\n    if (!result.userId && sender.userId) result.userId = sender.userId;\n    if (!result.name && sender.name) result.name = sender.name;\n    if (!result.photo && sender.photo) result.photo = sender.photo;\n    if (result.rating == null && sender.rating != null) result.rating = sender.rating;\n    if (result.status == null && sender.status != null) result.status = sender.status;\n    if (!result.subscription && sender.subscription) result.subscription = sender.subscription;\n  }\n  return Object.keys(result).length ? result : null;\n};\nconst senderFromMeta = meta => {\n  if (!meta) return null;\n  return {\n    userId: meta?.user?.id ?? meta?.card?.userId,\n    name: meta?.user?.username ?? meta?.card?.username ?? '',\n    photo: meta?.photos?.[0] ?? null,\n    status: meta?.status?.status ?? null,\n    subscription: meta?.subscription ?? null\n  };\n};\nconst BackIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M14.4306 4.51215C14.7002 4.19785 15.1738 4.16159 15.4882 4.43109C15.8022 4.70072 15.8386 5.17439 15.5692 5.48871L9.9872 12.0004L15.5692 18.5121C15.8384 18.8266 15.8023 19.3003 15.4882 19.5698C15.1738 19.8392 14.7002 19.8027 14.4306 19.4887L8.43056 12.4887C8.18981 12.2078 8.18981 11.793 8.43056 11.5121L14.4306 4.51215Z\",\n  fill: \"currentColor\"\n}));\nconst ArrowRightIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9.56941 4.51215C9.29978 4.19785 8.82612 4.16159 8.5118 4.43109C8.19775 4.70072 8.16139 5.17439 8.43077 5.48871L14.0128 12.0004L8.43077 18.5121C8.16161 18.8266 8.19774 19.3003 8.5118 19.5698C8.82612 19.8392 9.29978 19.8027 9.56941 19.4887L15.5694 12.4887C15.8102 12.2078 15.8102 11.793 15.5694 11.5121L9.56941 4.51215Z\",\n  fill: \"currentColor\"\n}));\nconst MainCurrencyIcon = ({\n  size = 16,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nconst CrownIcon = ({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nconst GiftRow = ({\n  gift,\n  sender,\n  styles,\n  locale\n}) => {\n  const t = Locale.useTranslation();\n  const senderName = sender?.name || gift?.sender?.name || t('profilePlaceholderUser');\n  const status = String(gift?.status ?? '').toLowerCase();\n  const isRevoked = status === 'revoked' || status === 'chargeback';\n  const revokedText = status === 'chargeback' ? t('profileGiftsStatusChargeback') : t('profileGiftsStatusRevoked');\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.senderColumn\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: sender?.photo ?? gift?.sender?.photo,\n    size: 36\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.senderTextColumn\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.senderName,\n    numberOfLines: 1\n  }, senderName), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftDate,\n    numberOfLines: 1\n  }, formatGiftDate(gift?.created, locale)))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftInfoColumn\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.priceRow\n  }, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n    size: 16,\n    style: styles.priceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.priceText,\n    numberOfLines: 1\n  }, formatWithSpaces(gift?.giftPriceGems))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftTitle,\n    numberOfLines: 1\n  }, gift?.giftTitle || ''), isRevoked && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.revokedText,\n    numberOfLines: 1\n  }, revokedText)), !!gift?.giftImageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: gift.giftImageUrl\n    },\n    style: styles.rowGiftImage,\n    contentFit: \"contain\"\n  }));\n};\nreturn () => {\n  State.useRequireSocketNavigation();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const navigation = ReactNavigation.useNavigation();\n  const route = ReactNavigation.useRoute?.();\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const cachedRoute = State._profileGiftsSender ?? null;\n  const senderId = route?.params?.senderId ?? cachedRoute?.senderId ?? getSenderIdFromLocation();\n  const fallbackSender = route?.params?.sender ?? cachedRoute?.sender ?? null;\n  const senderMeta = State.api?.users?.useUser?.(senderId);\n  const {\n    gifts,\n    sender,\n    summary,\n    loading,\n    skip,\n    take\n  } = State.api?.gifts?.useGiftsFromSender?.(senderId) ?? {};\n  const visibleGifts = gifts ?? [];\n  const giftSender = visibleGifts.find(gift => gift?.sender?.name)?.sender ?? visibleGifts[0]?.sender ?? null;\n  const effectiveSender = mergeSender(senderFromMeta(senderMeta), sender, fallbackSender, giftSender);\n  const hasPremium = effectiveSender?.subscription?.hasSubscription === true;\n  const totalGifts = summary?.totalGifts ?? null;\n  const canLoadMore = totalGifts != null && visibleGifts.length < totalGifts && !loading;\n  React.useEffect(() => {\n    replaceCanonicalSenderUrl(senderId);\n  }, [senderId]);\n  const totalIncomeText = React.useMemo(() => {\n    if (summary?.totalIncomeStars == null) return '—';\n    return formatWithSpaces(summary.totalIncomeStars);\n  }, [summary?.totalIncomeStars]);\n  const loadMore = React.useCallback(() => {\n    if (!senderId || loading) return;\n    State.api?.gifts?.loadGiftsFromSender?.(senderId, {\n      skip: (skip ?? 0) + (take ?? 0),\n      take,\n      append: true,\n      force: true\n    }).catch(console.error);\n  }, [senderId, loading, skip, take]);\n  const openSenderCard = React.useCallback(() => {\n    if (!senderId) return;\n    const fallbackMeta = {\n      user: {\n        id: senderId,\n        username: effectiveSender?.name ?? ''\n      },\n      card: {\n        userId: senderId,\n        verificationStatus: 'APPROVED',\n        hasVerifiedSnapshot: true\n      },\n      photos: effectiveSender?.photo?.path ? [effectiveSender.photo] : [],\n      status: effectiveSender?.status != null ? {\n        status: effectiveSender.status\n      } : undefined,\n      subscription: effectiveSender?.subscription ?? undefined\n    };\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: senderMeta ?? fallbackMeta,\n      source: \"gifts_sender\"\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [senderId, senderMeta, effectiveSender]);\n  const openProfileGifts = React.useCallback(() => {\n    if (ReactNavigation.StackActions?.replace) {\n      navigation.dispatch(ReactNavigation.StackActions.replace('ProfileGifts'));\n      return;\n    }\n    Navigation.goto({\n      name: 'ProfileGifts'\n    });\n  }, [navigation]);\n  const styles = React.useMemo(() => ({\n    page: {\n      flex: 1,\n      width: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    },\n    appbar: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center',\n      height: 48 + Math.max(safeArea.top, 0),\n      paddingTop: Math.max(safeArea.top, 0),\n      paddingHorizontal: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      position: 'relative'\n    },\n    appbarSide: {\n      width: 48,\n      height: 48,\n      justifyContent: 'center',\n      alignItems: 'flex-start'\n    },\n    appbarIcon: {\n      color: theme.theme.component?.appBar?.contentPrimary ?? theme.theme.semantic.content.regular.primary\n    },\n    appbarTitleWrap: {\n      position: 'absolute',\n      left: 64,\n      right: 64,\n      top: Math.max(safeArea.top, 0),\n      bottom: 0,\n      justifyContent: 'center',\n      alignItems: 'center',\n      pointerEvents: 'none'\n    },\n    appbarTitle: {\n      color: theme.theme.component?.appBar?.contentPrimary ?? theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    },\n    content: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center',\n      paddingHorizontal: 12,\n      paddingTop: 12,\n      paddingBottom: Math.max(safeArea.bottom, 12) + 12,\n      gap: 16\n    },\n    headerCard: {\n      width: '100%',\n      padding: 24,\n      borderRadius: 24,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 12\n    },\n    headerArrow: {\n      color: theme.theme.semantic.content.regular.secondary,\n      flexShrink: 0\n    },\n    headerInfo: {\n      flex: 1,\n      minWidth: 0,\n      gap: 8\n    },\n    headerNameRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 6\n    },\n    headerName: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 20,\n      lineHeight: 24,\n      fontWeight: '700',\n      letterSpacing: -0.7\n    },\n    metricsRow: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      gap: 24\n    },\n    metricValue: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: '700',\n      letterSpacing: -0.4\n    },\n    metricLabel: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: '500',\n      letterSpacing: -0.2\n    },\n    giftRow: {\n      width: '100%',\n      minHeight: 68,\n      paddingVertical: 12,\n      borderBottomWidth: 1,\n      borderBottomColor: theme.theme.semantic.stroke.regular.stroke2,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: 8\n    },\n    senderColumn: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    senderTextColumn: {\n      flex: 1,\n      minWidth: 0,\n      gap: 2\n    },\n    senderName: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7\n    },\n    giftDate: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      letterSpacing: -0.2\n    },\n    giftInfoColumn: {\n      flexShrink: 0,\n      maxWidth: 120,\n      alignItems: 'flex-end',\n      justifyContent: 'center',\n      gap: 2\n    },\n    priceRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      gap: 4\n    },\n    priceIcon: {\n      color: theme.theme.semantic.content.brand.content1\n    },\n    priceText: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'right'\n    },\n    giftTitle: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      textAlign: 'right'\n    },\n    revokedText: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 11,\n      lineHeight: 14,\n      fontWeight: '600',\n      letterSpacing: -0.2,\n      textAlign: 'right'\n    },\n    rowGiftImage: {\n      width: 44,\n      height: 44,\n      flexShrink: 0\n    },\n    emptyText: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      textAlign: 'center',\n      paddingVertical: 40\n    },\n    loadMoreButton: {\n      height: 40,\n      paddingHorizontal: 16,\n      borderRadius: 12,\n      alignSelf: 'center',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component?.button?.secondary?.bgDefault ?? theme.theme.semantic.surface.regular.surface1\n    },\n    loadMoreText: {\n      color: theme.theme.component?.button?.secondary?.content ?? theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '600'\n    },\n    premiumIcon: {\n      width: 16,\n      height: 16,\n      borderRadius: 16,\n      backgroundColor: theme.theme.component.button.brand.bgDefault,\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }), [safeArea.bottom, safeArea.top, theme]);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    scrollable: true,\n    testID: \"page_profile_gifts_sender\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.page\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbar\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbarSide\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: openProfileGifts\n  }, /*#__PURE__*/React.createElement(BackIcon, {\n    style: styles.appbarIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbarTitleWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.appbarTitle,\n    numberOfLines: 1\n  }, t('profileGiftsSenderTitle'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbarSide\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.headerCard,\n    onPress: openSenderCard\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: effectiveSender?.photo,\n    size: 64,\n    placeholderBackgroundColor: theme.theme.semantic.surface.brand.surface1\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerInfo\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerNameRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.headerName,\n    numberOfLines: 1\n  }, effectiveSender?.name || t('profilePlaceholderUser')), hasPremium && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.premiumIcon\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: theme.theme.semantic.content.inversion.static.stPrimary\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.metricsRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.metricValue,\n    numberOfLines: 1\n  }, formatWithSpaces(totalGifts)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.metricLabel,\n    numberOfLines: 1\n  }, t('profileGiftsSenderTotalGifts'))), /*#__PURE__*/React.createElement(ReactNative.View, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.metricValue,\n    numberOfLines: 1\n  }, totalIncomeText), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.metricLabel,\n    numberOfLines: 1\n  }, t('profileGiftsSenderTotalIncome'))))), /*#__PURE__*/React.createElement(ArrowRightIcon, {\n    style: styles.headerArrow\n  })), visibleGifts.length === 0 && !loading ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyText\n  }, t('profileGiftsSenderEmpty')) : /*#__PURE__*/React.createElement(ReactNative.View, null, visibleGifts.map((gift, index) => /*#__PURE__*/React.createElement(GiftRow, {\n    key: gift?.id ?? `${senderId ?? 'sender'}-${index}`,\n    gift: gift,\n    sender: effectiveSender,\n    styles: styles,\n    locale: locale\n  }))), canLoadMore && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.loadMoreButton,\n    onPress: loadMore\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.loadMoreText\n  }, t('profileGiftsLoadMore'))))));\n};"},"Settings":{"name":"Settings","key":"1e285e893c16e0287c30f6e1e64e3651fb75685b63d86396381509bf27809a3b","code":"deps: LanguageModal, ThemeModal, SignOutModal\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nconst width = 800;\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _invoke(body, then) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(then);\n  }\n  return then(result);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction Divided({\n  children\n}) {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    div: {\n      backgroundColor: theme.theme.semantic.stroke.regular.stroke2,\n      height: 1,\n      width: '100%'\n    }\n  }), [theme]);\n  const childrenArray = React.Children.toArray(children);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, childrenArray.map((row, rowIndex) => /*#__PURE__*/React.createElement(React.Fragment, {\n    key: rowIndex\n  }, row, rowIndex < childrenArray.length - 1 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: rowIndex,\n    style: styles.div\n  }))));\n}\nconst getMediaDevices = _async(function () {\n  return _catch(function () {\n    const mediaDevices = WebRTC?.mediaDevices ?? globalThis?.navigator?.mediaDevices;\n    const enumerate = mediaDevices?.enumerateDevices?.bind(mediaDevices) ?? globalThis?.navigator?.mediaDevices?.enumerateDevices?.bind(globalThis?.navigator?.mediaDevices);\n    return enumerate ? _call(enumerate, function (list) {\n      return {\n        audioInputs: list.filter(device => device?.kind === 'audioinput'),\n        videoInputs: list.filter(device => device?.kind === 'videoinput')\n      };\n    }) : {\n      audioInputs: [],\n      videoInputs: []\n    };\n  }, function (error) {\n    console.error('Failed to enumerate devices', error);\n    return {\n      audioInputs: [],\n      videoInputs: []\n    };\n  });\n});\nconst DevicePickerSheet = ({\n  title,\n  items,\n  selectedId,\n  onSelect\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const styles = React.useMemo(() => ({\n    container: {\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 16,\n      paddingTop: Math.max(20, safeArea.top),\n      paddingBottom: Math.max(20, safeArea.bottom),\n      paddingHorizontal: 16\n    },\n    header: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      position: 'relative',\n      minHeight: 32\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    close: {\n      color: theme.theme.semantic.content.regular.primary\n    },\n    list: {\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'flex-start',\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.05),\n      borderRadius: 24,\n      paddingHorizontal: 16,\n      overflow: 'hidden'\n    },\n    row: {\n      width: '100%',\n      height: 56,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: 12\n    },\n    rowText: {\n      flex: 1,\n      color: theme.theme.component.listItem.contentPrimaryDefault,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 500,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    radio: {\n      borderColor: Utils.withOpacity(theme.theme.component.radioButton.borderDefault, 0.4),\n      borderWidth: 2,\n      borderRadius: 999,\n      height: 24,\n      width: 24,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    radioSelected: {\n      borderColor: theme.theme.component.radioButton.content\n    },\n    radioDot: {\n      backgroundColor: theme.theme.component.radioButton.content,\n      borderRadius: 999,\n      height: 12,\n      width: 12\n    },\n    empty: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      fontFamily: theme.theme.typography.family.paragraph,\n      paddingVertical: 12\n    }\n  }), [theme, safeArea]);\n  const renderRow = (label, value, isSelected) => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    key: label,\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.row,\n    onPress: () => {\n      onSelect(value);\n      sheet.close();\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText\n  }, label), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.radio, isSelected && styles.radioSelected]\n  }, isSelected && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.radioDot\n  })));\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, title), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 0\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.close\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.list\n  }, /*#__PURE__*/React.createElement(Divided, null, renderRow(t('deviceDefault'), null, selectedId == null), items?.length ? items.map((item, index) => {\n    const id = item?.deviceId ?? item?.id ?? `${item?.kind ?? 'device'}-${index}`;\n    const name = item?.label || item?.name || `${t('deviceUnnamed')} ${index + 1}`;\n    return renderRow(name, {\n      id,\n      name\n    }, selectedId === id);\n  }) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.empty\n  }, t('deviceNoDevices')))));\n};\nreturn () => {\n  State.useRequireSocket();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const navigation = ReactNavigation.useNavigation();\n  const [isDark] = Hooks.useBehaviorSubject(Theme.isDark);\n  const session = State.api?.session?.useSession?.();\n  const {\n    locale: currentLocale\n  } = Locale.useLocale();\n  const ipCountry = session?.ip?.country ? String(session.ip.country).toUpperCase() : undefined;\n  const [selectedCamera] = Hooks.useBehaviorSubject(State.state.camera);\n  const [selectedMic] = Hooks.useBehaviorSubject(State.state.audio);\n  const [autoLoggedIn] = Hooks.useBehaviorSubject(State.state.autoLoggedIn);\n  const isGuest = State.api?.guest?.useIsGuestSession?.();\n  const sheetTheme = isDark ? 'dark' : 'light';\n  const loadDevices = React.useCallback(_async(function (withPermissions = false) {\n    return _invoke(function () {\n      if (withPermissions) {\n        return _awaitIgnored(State.requestAllPermissions());\n      }\n    }, function () {\n      return _call(getMediaDevices);\n    });\n  }), []);\n  const applyDeviceSelection = React.useCallback(_async(function (type, value) {\n    return _continueIgnored(_catch(function () {\n      if (type === 'audio') {\n        State.state.audio.next(value);\n      } else {\n        State.state.camera.next(value);\n      }\n      return _awaitIgnored(State.requestStream(true));\n    }, function (error) {\n      console.error('Failed to apply device selection', error);\n    }));\n  }), []);\n  const currentLanguageName = React.useMemo(() => {\n    const languageMap = {\n      'en': 'English',\n      'ru': 'Русский'\n    };\n    return languageMap[currentLocale] || languageMap['en'] || 'English';\n  }, [currentLocale]);\n  const currentLanguageCountry = React.useMemo(() => {\n    const normalizedLocale = (currentLocale || 'en').split('-')[0].toLowerCase();\n    const countryMap = {\n      en: 'gb',\n      ru: 'ru'\n    };\n    return countryMap[normalizedLocale] || 'gb';\n  }, [currentLocale]);\n  const legalLinks = React.useMemo(() => {\n    const normalizedLocale = String(currentLocale ?? '').toLowerCase();\n    const isRuLocale = normalizedLocale === 'ru' || normalizedLocale.startsWith('ru-');\n    const isRuGeo = ipCountry === 'RU';\n    const useRuDocs = isRuLocale || isRuGeo;\n    if (useRuDocs) {\n      return {\n        eula: 'https://www.modern-com.ru/eula.html',\n        privacy: 'https://www.modern-com.ru/privacy.html',\n        terms: 'https://www.modern-com.ru/terms.html',\n        community: 'https://www.modern-com.ru/community.html'\n      };\n    }\n    return {\n      eula: 'https://welcome.camble.online/legal/docs/eula.html',\n      privacy: 'https://welcome.camble.online/legal/docs/privacy.html',\n      terms: 'https://welcome.camble.online/legal/docs/terms.html',\n      community: 'https://welcome.camble.online/legal/docs/community-guidelines.html'\n    };\n  }, [currentLocale, ipCountry]);\n  const currentCameraLabel = React.useMemo(() => {\n    return selectedCamera?.name ?? t('deviceDefault');\n  }, [selectedCamera, t]);\n  const currentMicLabel = React.useMemo(() => {\n    return selectedMic?.name ?? t('deviceDefault');\n  }, [selectedMic, t]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingTop: Math.max(safeArea.top, 12),\n      paddingBottom: Math.max(safeArea.bottom, 12),\n      paddingLeft: safeArea.left,\n      paddingRight: safeArea.right\n    },\n    subcontainer: {\n      width: \"100%\",\n      maxWidth: width,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 24\n    },\n    header: {\n      position: 'relative',\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      minHeight: 48\n    },\n    title: {\n      padding: 12,\n      color: theme.theme.component.appBar.contentPrimary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    content: {\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 24,\n      paddingHorizontal: 12\n    },\n    section: {\n      container: {\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        gap: 8,\n        width: \"100%\"\n      },\n      title: {\n        color: theme.theme.semantic.content.regular.secondary,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 500,\n        width: \"100%\",\n        fontFamily: theme.theme.typography.family.paragraph\n      },\n      body: {\n        backgroundColor: theme.theme.semantic.surface.regular.surface1,\n        borderRadius: 24,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        paddingHorizontal: 16,\n        width: \"100%\"\n      },\n      row: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        gap: 10,\n        width: \"100%\",\n        paddingVertical: 16\n      },\n      icon: {\n        color: theme.theme.component.listItem.contentIconDefault\n      },\n      text: {\n        flex: 1,\n        color: theme.theme.component.listItem.contentPrimaryDefault,\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 500,\n        letterSpacing: -0.3,\n        fontFamily: theme.theme.typography.family.paragraph\n      },\n      iconRed: {\n        color: theme.theme.component.listItem.contentDangerous\n      },\n      textRed: {\n        flex: 1,\n        color: theme.theme.component.listItem.contentDangerous,\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 500,\n        letterSpacing: -0.3,\n        fontFamily: theme.theme.typography.family.paragraph\n      },\n      subtext: {\n        color: theme.theme.component.listItem.contentSecondaryDefault,\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 500,\n        letterSpacing: -0.3,\n        fontFamily: theme.theme.typography.family.paragraph\n      },\n      next: {\n        color: theme.theme.component.listItem.contentSecondaryDefault\n      }\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    scrollable: true,\n    testID: \"page_settings\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      left: 16,\n      top: '50%',\n      transform: [{\n        translateY: '-50%'\n      }]\n    },\n    feedback: true,\n    onPress: () => {\n      navigation.canGoBack() && navigation.goBack();\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    style: styles.title\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('profileSettingsHeader'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.title\n  }, t('appearanceSettingsHeader')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.body\n  }, /*#__PURE__*/React.createElement(Divided, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"LanguageModal\"\n      }), {\n        theme: sheetTheme,\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      });\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: currentLanguageCountry,\n    size: 20\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, currentLanguageName), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"ThemeModal\"\n      }), {\n        theme: sheetTheme,\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      });\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('themeSetting')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.subtext\n  }, isDark ? t('themeNight') : t('themeDay')), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  }))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.title\n  }, t('hardwareSettingsHeader')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.body\n  }, /*#__PURE__*/React.createElement(Divided, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: _async(function () {\n      return _await(loadDevices(true), function ({\n        videoInputs\n      }) {\n        Sheet.showSheet(/*#__PURE__*/React.createElement(DevicePickerSheet, {\n          title: t('cameraSetting'),\n          items: videoInputs,\n          selectedId: selectedCamera?.id ?? null,\n          onSelect: value => applyDeviceSelection('video', value)\n        }), {\n          theme: sheetTheme,\n          props: {\n            style: {\n              maxWidth: 600\n            }\n          }\n        });\n      });\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('cameraSetting')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.subtext,\n    numberOfLines: 1\n  }, currentCameraLabel), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: _async(function () {\n      return _await(loadDevices(true), function ({\n        audioInputs\n      }) {\n        Sheet.showSheet(/*#__PURE__*/React.createElement(DevicePickerSheet, {\n          title: t('microphoneSetting'),\n          items: audioInputs,\n          selectedId: selectedMic?.id ?? null,\n          onSelect: value => applyDeviceSelection('audio', value)\n        }), {\n          theme: sheetTheme,\n          props: {\n            style: {\n              maxWidth: 600\n            }\n          }\n        });\n      });\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('microphoneSetting')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.subtext,\n    numberOfLines: 1\n  }, currentMicLabel), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  }))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.title\n  }, t('profileSettingsHelp')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.body\n  }, /*#__PURE__*/React.createElement(Divided, null, ReactNative.Platform.OS !== 'web' && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Intercom.present();\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('profileSettingsHelp')), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Linking.openURL(\"mailto:help@camble.io\");\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('profileSettingsContact')), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  }))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.title\n  }, t('otherSettingsHeader')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.body\n  }, /*#__PURE__*/React.createElement(Divided, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Linking.openURL(State.getUrl(legalLinks.eula));\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, \"EULA\"), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Linking.openURL(State.getUrl(legalLinks.privacy));\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('profileSettingsPrivacy')), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Linking.openURL(State.getUrl(legalLinks.terms));\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('profileSettingsTerms')), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Linking.openURL(State.getUrl(legalLinks.community));\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('profileSettingsCommunity')), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  })), !isGuest && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      navigation.dispatch(ReactNavigation.StackActions.push('Delete'));\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.text\n  }, t('profileSettingsDelete')), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: styles.section.next\n  }))))), !autoLoggedIn && !isGuest && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.body\n  }, /*#__PURE__*/React.createElement(Divided, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    styleContainer: {\n      width: '100%'\n    },\n    style: styles.section.row,\n    onPress: () => {\n      Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"SignOutModal\"\n      }), {\n        theme: sheetTheme,\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      });\n    }\n  }, /*#__PURE__*/React.createElement(Assets.SignOut, {\n    size: 24,\n    style: styles.section.iconRed\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.textRed\n  }, t('profileSettingsSignout'))))))))));\n};"},"FilterModal":{"name":"FilterModal","key":"31d28f18c193183e6112b86d9ef0b5175b5936a7144a4c434207b581691ed5a4","code":"deps: CountryModal, FilterPaywallOverlay, FilterGenderTabs\nfunction _empty() {}\n// Age filter disabled dependency: FilterPro\n\nconst stripAgeFilter = (filter = {}) => {\n  const rest = {\n    ...(filter ?? {})\n  };\n  // Age filtering disabled; keep stripping stale persisted filter.age values.\n  delete rest.age;\n  return rest;\n};\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst PremiumIcon = ({\n  size = 10,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nfunction _invoke(body, then) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(then);\n  }\n  return then(result);\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nreturn () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [isLoading, setIsLoading] = React.useState();\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingBottom: Math.max(safeArea.bottom + 4, 8)\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    full: {\n      width: '100%'\n    },\n    flex: {\n      flex: 1\n    },\n    sectionTitle: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%'\n    },\n    buttonBody: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    buttonText: {\n      color: theme.theme.component.button.brand.content,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    },\n    freeFiltersInfo: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    freeFiltersText: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500\n    },\n    freeFiltersResetText: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500\n    },\n    freeFiltersCounter: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    freeFiltersCounterText: {\n      color: theme.theme.semantic.content.brand.content1,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.3\n    },\n    freeFiltersBadge: {\n      width: 16,\n      height: 16,\n      borderRadius: 999,\n      backgroundColor: theme.theme.component.badge.brand.bg,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    freeFiltersBadgeIcon: {\n      color: theme.theme.component.badge.brand.content\n    }\n  }), [theme, safeArea]);\n  const session = State.api?.session?.useSession?.();\n  // const spinsSelector = React.useCallback(s => Number.parseInt(s?.limits?.spins ?? 0), []);\n  // const spins = Hooks.useBehaviorSubjectMap(State.state.session, spinsSelector);\n  const hasSubscription = !!session?.subscription?.hasSubscription;\n  const limits = State.api.limits.useLimits();\n  const freeSpins = 30;\n  const remainingSpins = Math.max(0, limits?.freeFilters ?? 0);\n\n  // Free spins only for subscribers: server override via settings.freeSpins, then limits.freeSpins, default 5\n  // const freeSpins = hasSubscription ? (session?.settings?.freeSpins ?? session?.limits?.freeSpins ?? 5) : 0;\n  // const remainingSpins = Math.max(0, freeSpins - spins);\n  // Show paywall overlay only for non-subscribers (subscribers see filters even with 0 spins)\n  const showCardPaywall = !hasSubscription;\n  const paywallShownRef = React.useRef(false);\n  const [callFilter, setCallFilter] = Hooks.useBehaviorSubject(State.store.callFilterStore);\n  const [price, setPrice] = Hooks.useBehaviorSubject(State.state.storage.price);\n  const [filter, setFilter] = React.useState(() => stripAgeFilter(callFilter));\n  React.useEffect(() => {\n    if (!showCardPaywall) return;\n    if (paywallShownRef.current) return;\n    paywallShownRef.current = true;\n    State.anals.next({\n      name: 'popup_shown',\n      data: {\n        popup_type: 'paywall_premium_filter',\n        popup_action: 'shown'\n      }\n    });\n  }, [showCardPaywall, hasSubscription]);\n  const sex = filter.sex;\n  // Age filter disabled:\n  // const min = filter.age?.min ?? 18;\n  // const max = filter.age?.max ?? 80;\n  const countries = filter.countries ?? [];\n\n  // Age filter disabled:\n  // const ageMin = 18;\n  // const ageMax = 80;\n\n  const apply = React.useCallback(_async(function () {\n    const nextFilter = stripAgeFilter(filter);\n    return _invoke(function () {\n      if (Object.keys(nextFilter).length === 0) {\n        setPrice(null);\n      } else {\n        return _awaitIgnored(State.post('/api/payment/price/queue/v2', nextFilter, 'json').then(res => {\n          setPrice(res);\n        }).catch(error => {\n          Notification.showNotification({\n            text: error.message,\n            type: 'error',\n            duration: 5000\n          });\n        }));\n      }\n    }, function () {\n      setCallFilter(nextFilter);\n      sheet.close();\n    });\n  }), [sheet, filter]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, {\n    visible: !!Object.keys(filter).length,\n    translateY: 2,\n    style: {\n      position: 'absolute',\n      left: 16,\n      top: 20\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    feedback: true,\n    onPress: () => {\n      setFilter({});\n      // setCallFilter({});\n      // setPrice(null);\n      // apply();\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Update, {\n    style: styles.title\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 14,\n      lineHeight: 22,\n      fontWeight: 600\n    }\n  }, t(\"filterResetAll\")))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t(\"filterHeader\"))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => {\n      if (showCardPaywall) {\n        State.anals.next({\n          name: 'popup_shown',\n          data: {\n            popup_type: 'paywall_premium_filter',\n            popup_action: 'closed'\n          }\n        });\n      }\n      sheet.close();\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      paddingHorizontal: 16,\n      paddingBottom: 16,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%',\n      position: 'relative'\n    }\n  }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      marginTop: 8\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.flex, styles.sectionTitle, {\n      opacity: showCardPaywall ? 0.3 : 1\n    }]\n  }, t(\"filterLocation\"))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      marginTop: 8,\n      opacity: showCardPaywall ? 0.3 : 1\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSCountries, {\n    style: {\n      width: '100%'\n    },\n    colors: {\n      bgDefault: theme.theme.semantic.surface.regular.surface2\n    },\n    codes: countries,\n    onPress: _async(function () {\n      Sheet.showPortal(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"CountryModal\",\n        initialCode: countries,\n        multiple: true,\n        onSave: result => {\n          setFilter(f => ({\n            ...f,\n            countries: result ?? null\n          }));\n        },\n        onReset: () => {\n          setFilter(f => ({\n            ...f,\n            countries: null\n          }));\n        }\n      }), {\n        theme: theme.isDark ? 'dark' : 'light'\n      });\n      return _await();\n    })\n  }))), showCardPaywall && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"FilterPaywallOverlay\"\n  })), /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.flex, styles.sectionTitle]\n  }, t(\"filtersInterestHeader\")), !hasSubscription && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => {\n      State.anals.next({\n        name: 'popup_shown',\n        data: {\n          popup_type: 'paywall_premium_filter',\n          popup_action: 'action'\n        }\n      });\n      sheet.close();\n      manifest().call.onStop();\n      // Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('SubPay'));\n      Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n        name: \"subPay\",\n        isModal: true\n      }), {\n        theme: theme?.isDark ? 'dark' : 'light',\n        props: {\n          swipeUp: true,\n          swipeDismissibleUp: true,\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden',\n            backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n          }\n        }\n      });\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.brand.content1,\n      fontSize: 14,\n      fontWeight: 600\n    }\n  }, t(\"filterGetFreeFilters\") || \"Get free filters\"), /*#__PURE__*/React.createElement(Assets.Next, {\n    style: {\n      color: theme.theme.semantic.content.brand.content1,\n      width: 16,\n      height: 16\n    }\n  }))), hasSubscription && freeSpins > 0 && (remainingSpins > 0 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.freeFiltersInfo\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.freeFiltersText\n  }, t(\"filterFreeFilters\") || \"Free filters\"), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.freeFiltersCounter\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.freeFiltersCounterText\n  }, remainingSpins, \" / \", freeSpins), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.freeFiltersBadge\n  }, /*#__PURE__*/React.createElement(PremiumIcon, {\n    size: 10,\n    color: styles.freeFiltersBadgeIcon.color\n  })))) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.freeFiltersResetText\n  }, t(\"filterResetsAtUTC\") || \"Resets at 00:00 UTC\"))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"FilterGenderTabs\",\n    sex: sex,\n    remainingSpins: remainingSpins,\n    filterCostFemale: session?.settings?.filterCostFemale ?? 10,\n    filterCostMale: session?.settings?.filterCostMale ?? 10,\n    onChangeSex: nextSex => setFilter(f => ({\n      ...f,\n      sex: nextSex\n    }))\n  }))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.buttonContainer, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    disabled: isLoading,\n    style: styles.button,\n    size: \"L\",\n    feedback: true,\n    onPress: apply\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonBody\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t(\"filterApply\"))))));\n};"},"ReportModal":{"name":"ReportModal","key":"3688dc0c05859bf5dd3351e61c284131650de8253707dee03ada3d3d274d058d","code":"deps: ReportReasonModal\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst ReportSentNotification = () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Done, {\n    style: {\n      color: theme.theme.component.toast.positive.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700\n    }\n  }, t('reportSentTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentSecondary,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 500\n    }\n  }, t('reportSentDescription'))));\n};\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst ScreenshotUpdatedNotification = () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Assets.ExclamationDown, {\n    style: {\n      color: theme.theme.component.toast.informational.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700\n    }\n  }, t('reportScreenshotUpdated')));\n};\nfunction _empty() {}\nconst createReportId = () => {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  const now = Date.now().toString(16);\n  const rnd = Math.random().toString(16).slice(2);\n  return `${now}-${rnd}`;\n};\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  peer,\n  meta,\n  source,\n  chatId\n}) => {\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const t = Locale.useTranslation();\n  const [isLoading, setIsLoading] = React.useState();\n  const reportSource = source ?? 'profilepage';\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingBottom: Math.max(safeArea.bottom + 4, 8)\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    full: {\n      width: '100%'\n    },\n    flex: {\n      flex: 1\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%'\n    },\n    buttonBody: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    buttonText: {\n      color: theme.theme.component.button.brand.content,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    },\n    input: {\n      container: {\n        flex: 1,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        width: '100%'\n      },\n      icon: {\n        position: 'absolute',\n        right: 0,\n        top: 0,\n        bottom: 0,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        paddingHorizontal: 16,\n        paddingVertical: 12\n      },\n      text: {\n        width: '100%',\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 500,\n        borderWidth: 1,\n        borderColor: theme.theme.component.textField.borderDefault,\n        borderRadius: 12,\n        backgroundColor: theme?.isDark ? Utils?.withOpacity ? Utils.withOpacity(theme.theme.component.textField.bg, 0.05) : theme.theme.component.textField.bg : theme.theme.component.textField.bg,\n        color: theme.theme.component.textField.contentPrimary,\n        paddingLeft: 16,\n        paddingRight: 48,\n        paddingVertical: 14\n      },\n      iconColor: {\n        color: theme.theme.component.textField.contentPrimary\n      }\n    },\n    pic: {\n      button: {\n        gap: 6,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      buttonIcon: {\n        color: theme.theme.component.button.primaryInversion.content\n      },\n      buttonText: {\n        color: theme.theme.component.button.primaryInversion.content,\n        fontSize: 14,\n        fontWeight: 600\n      }\n    }\n  }), [theme, safeArea]);\n  const [reason, setReason] = React.useState(null);\n  const [reasonText, setReasonText] = React.useState(\"\");\n  const [image, setImage] = React.useState(null);\n  const userId = peer?.meta?.user?.id ?? meta?.user?.id;\n  peer = peer ?? (userId != null && manifest().peer?.usePeerByUserId(userId));\n  const stream = peer?.stream;\n  const streamId = stream?.id;\n  const capture = React.useCallback(_async(function (options = {}) {\n    if (stream == null) return;\n    return _continueIgnored(_catch(function () {\n      const {\n        silent = false\n      } = options;\n      return _await(State.capturePhoto(stream, 128, 128, false), function (image) {\n        if (!!image) {\n          setImage(image);\n          if (!silent) {\n            Notification.showNotification({\n              children: /*#__PURE__*/React.createElement(ScreenshotUpdatedNotification, null),\n              type: 'informational',\n              duration: 3000\n            });\n          }\n        }\n      });\n    }, function (error) {\n      console.error(error);\n    }));\n  }), [setImage, stream, t]);\n  React.useEffect(() => {\n    capture({\n      silent: true\n    });\n  }, []);\n  const onReport = React.useCallback(_async(function () {\n    if (isLoading || !reason?.id) return;\n    setIsLoading(true);\n    return _continueIgnored(_catch(function () {\n      const _temp = State.state.stream.value != null;\n      return _await(_temp && State.capturePhoto(State.state.stream.value, 128, 128, false), function (localPhoto) {\n        const message = reasonText?.trim();\n        const reportedUserId = peer?.meta?.user?.id ?? meta?.user?.id ?? meta?.userId ?? meta?.id;\n        const payload = {\n          id: createReportId(),\n          userId: reportedUserId,\n          sessionId: peer?.sessionId ?? peer?.meta?.sessionId ?? meta?.sessionId ?? meta?.user?.sessionId,\n          reason: reason?.id,\n          surface: reportSource,\n          analyticsdata: {\n            ...Analytics.getGlobalParams(),\n            analytics_event: 'report_used',\n            report_surface: reportSource\n          },\n          ...(chatId != null && String(chatId).length ? {\n            chatId: String(chatId)\n          } : {}),\n          ...(message?.length ? {\n            message\n          } : {}),\n          ...(image ? {\n            photo: image\n          } : {}),\n          ...(localPhoto ? {\n            localPhoto: localPhoto\n          } : {})\n        };\n        State.emitSocket('report', payload);\n        setIsLoading(false);\n        // sheet.close(true);\n        for (const sh of Object.values(Sheet.sheetDict)) {\n          sh.close();\n        }\n        for (const sh of Object.values(Sheet.scrollSheetDict)) {\n          sh.close();\n        }\n        Notification.showNotification({\n          children: /*#__PURE__*/React.createElement(ReportSentNotification, null),\n          type: 'success',\n          duration: 3000\n        });\n        const reportedSessionId = payload?.sessionId;\n        const currentSessionId = State.state.call.value?.sessionId;\n        if (reportedSessionId != null && reportedSessionId === currentSessionId) {\n          manifest().call.onTryStart();\n        }\n      }, !_temp);\n    }, function (error) {\n      setIsLoading(false);\n      console.error(error);\n    }));\n  }), [chatId, image, isLoading, peer, reason, reasonText, reportSource, t]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(Assets.Flag, {\n    style: styles.title\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('reportUser'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      paddingHorizontal: 16,\n      paddingBottom: 16,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 12\n    }\n  }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSSelect, {\n    style: {\n      width: '100%'\n    },\n    text: reason?.name ?? t('reportReasonHeader'),\n    noloading: true,\n    onPress: _async(function () {\n      ReactNative.Keyboard.dismiss();\n      return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"ReportReasonModal\",\n        reason: reason\n      }), {\n        theme: Theme.isDark.value ? 'dark' : 'light',\n        props: {\n          nokeyboard: true,\n          style: {\n            maxWidth: 600\n          }\n        }\n      }), function (value) {\n        if (value !== undefined) {\n          setReason(value);\n        }\n      });\n    })\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.input.container\n  }, /*#__PURE__*/React.createElement(ReactNative.TextInput, {\n    value: reasonText,\n    onChangeText: setReasonText,\n    style: styles.input.text,\n    multiline: true,\n    autoCorrect: true,\n    maxLength: 500,\n    numberOfLines: 4,\n    placeholder: t('profileEditYourMessage'),\n    placeholderTextColor: \"#999\"\n  })), streamId != null && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      backgroundColor: theme.theme.semantic.surface.dangerous.surface1,\n      borderRadius: 24,\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start',\n      padding: 20,\n      gap: 6,\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start',\n      gap: 6\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start',\n      gap: 6\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Pin, {\n    style: {\n      color: theme.theme.semantic.content.brand.content1\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600\n    }\n  }, t('reportScreenShotAttached'))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500\n    }\n  }, t('reportScreenshotHint')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start',\n      gap: 6,\n      paddingTop: 14\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"primaryInversion\",\n    feedback: true,\n    onPress: () => capture({\n      silent: false\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pic.button\n  }, /*#__PURE__*/React.createElement(Assets.Photo, {\n    style: styles.pic.buttonIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.pic.buttonText\n  }, t('reportUpdateScreenshot')))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      position: 'relative',\n      flexDirection: 'column',\n      alignItems: 'flex-end',\n      justifyContent: 'flex-end',\n      gap: 4,\n      minWidth: 80,\n      width: 80\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderColor: theme.theme.semantic.stroke.regular.stroke1,\n      borderWidth: 2,\n      borderRadius: 24,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      padding: 20,\n      gap: 6,\n      width: 104,\n      height: 104,\n      position: 'absolute',\n      right: 0,\n      top: 0,\n      transform: [{\n        translateY: 8\n      }, {\n        translateX: 20\n      }, {\n        rotate: `${15}deg`\n      }],\n      overflow: 'hidden'\n    }\n  }, !!image && /*#__PURE__*/React.createElement(ReactNative.Image, {\n    source: {\n      uri: \"data:image/png;base64,\" + image\n    },\n    style: {\n      position: 'absolute',\n      right: 0,\n      top: 0,\n      width: 104,\n      height: 104,\n      objectFit: 'cover'\n    }\n  })))))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.buttonContainer, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    disabled: isLoading || !reason?.id,\n    style: styles.button,\n    size: \"L\",\n    feedback: true,\n    onPress: onReport\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonBody\n  }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t('reportSendButton')))))));\n};"},"RandomChat":{"name":"RandomChat","key":"aca354f88223ec99a4e7bb2658c5d64ca1290c0c26532066f3bc8e728d6d4e54","code":"deps: VideoChatGate\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    width: '100%',\n    height: '100%'\n  }\n});\nreturn () => {\n  const theme = Theme.useTheme();\n  Stated.useBackHandler();\n  Stated.useDarkNavigation();\n  State.useRequireSocketNavigation();\n  Navigation.useOverflowX?.();\n  React.useEffect(() => {\n    return () => {\n      manifest().call.onStop();\n    };\n  }, []);\n  const [isSearchingRaw] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const shouldShowPaywall = State.api?.call?.usePayWall?.() ?? false;\n  const isSearching = shouldShowPaywall || isSearchingRaw;\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    transparent: true,\n    hide: isSearching || call != null,\n    style: {\n      maxHeight: '100%'\n    },\n    testID: \"page_random\"\n  }, /*#__PURE__*/React.createElement(Theme.ScopedTheme, {\n    name: \"dark\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.container, {\n      backgroundColor: theme.theme.semantic.surface.inversion.static.stPageBackground\n    }]\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatGate\"\n  }))));\n};"},"Pip":{"name":"Pip","key":"b072e169226cfefb7a05e1ab07f5c133a761dd01b8f0d8760f71ab6d4ba1b61b","code":"const styles = StyleSheet.create({\n  container: {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    gap: 8,\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: 'black'\n  },\n  video: {\n    flex: 1,\n    width: '100%',\n    height: '100%'\n  }\n});\nreturn () => {\n  const [stream] = Hooks.useBehaviorSubject(State.state.stream);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, stream && (ReactNative.Platform.OS !== 'web' ? /*#__PURE__*/React.createElement(WebRTC.RTCView, {\n    streamURL: stream.toURL(),\n    style: styles.video,\n    objectFit: \"cover\"\n  }) : /*#__PURE__*/React.createElement(WebRTC.RTCView, {\n    stream: stream,\n    style: styles.video,\n    objectFit: \"cover\"\n  })));\n};"},"CardModal":{"name":"CardModal","key":"b5249d5d13402ae87b665f772b9dba958d089b280a6b80ec0ecb791b81980fc5","code":"deps: ReportReasonModal, Card, PeerCountry, PeerStatus, BadgePremium, FoldableText, ChatDropdownMenu, GiftsCatalogSheet, WithAppear, PhotoViewer\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\n// Иконка контекстного меню — три точки вертикально (⋮)\nconst MenuDotsVerticalIcon = ({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10 0.833C10.9205 0.833 11.6667 1.579 11.6667 2.5C11.6667 3.421 10.9205 4.167 10 4.167C9.07953 4.167 8.33333 3.421 8.33333 2.5C8.33333 1.579 9.07953 0.833 10 0.833Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10 8.333C10.9205 8.333 11.6667 9.079 11.6667 10C11.6667 10.921 10.9205 11.667 10 11.667C9.07953 11.667 8.33333 10.921 8.33333 10C8.33333 9.079 9.07953 8.333 10 8.333Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10 15.833C10.9205 15.833 11.6667 16.579 11.6667 17.5C11.6667 18.421 10.9205 19.167 10 19.167C9.07953 19.167 8.33333 18.421 8.33333 17.5C8.33333 16.579 9.07953 15.833 10 15.833Z\",\n  fill: color\n}));\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst GiftIcon = ({\n  size = 24,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11 22.0001H7C6.20435 22.0001 5.44152 21.6838 4.87891 21.1212C4.31632 20.5586 4 19.7957 4 19.0001V15.0001C4.00002 14.7349 4.10545 14.4806 4.29297 14.2931C4.4805 14.1055 4.7348 14.0001 5 14.0001H11V22.0001ZM19 14.0001C19.2652 14.0001 19.5195 14.1055 19.707 14.2931C19.8946 14.4806 20 14.7349 20 15.0001V19.0001C20 19.7957 19.6837 20.5586 19.1211 21.1212C18.5585 21.6838 17.7956 22.0001 17 22.0001H13V14.0001H19ZM16.5 2.00009C17.0904 1.99997 17.6713 2.14903 18.1885 2.43369C18.7058 2.71849 19.1433 3.12996 19.459 3.629C19.7746 4.12796 19.9584 4.69886 19.9941 5.28818C20.0299 5.87758 19.9161 6.46658 19.6631 7.00009H20C20.5304 7.00009 21.039 7.21098 21.4141 7.58603C21.7891 7.96109 22 8.46968 22 9.00009V10.0001C22 10.5305 21.7891 11.0391 21.4141 11.4142C21.039 11.7892 20.5304 12.0001 20 12.0001H13V7.00009H11V12.0001H4C3.46957 12.0001 2.96101 11.7892 2.58594 11.4142C2.21088 11.0391 2 10.5305 2 10.0001V9.00009C2.00002 8.46968 2.21088 7.96109 2.58594 7.58603C2.96101 7.21098 3.46958 7.00009 4 7.00009H4.33691C4.11482 6.53127 3.99977 6.01886 4 5.50009C4.00003 3.56712 5.56742 2.00009 7.4834 2.00009C9.23816 1.97027 10.7953 3.09197 11.8643 4.93369L12 5.17685C13.033 3.26299 14.5601 2.06304 16.291 2.00205L16.5 2.00009ZM7.5 4.00009C7.10219 4.00009 6.72075 4.15826 6.43945 4.43955C6.15816 4.72083 6.00002 5.10229 6 5.50009C6 5.8979 6.15817 6.27934 6.43945 6.56064C6.72076 6.84194 7.10218 7.00009 7.5 7.00009H10.6426C9.90157 5.09521 8.69396 3.98009 7.5 4.00009ZM16.4834 4.00009C15.3034 3.98009 14.0984 5.09621 13.3574 7.00009H16.5C16.8978 6.99784 17.2789 6.83768 17.5586 6.55478C17.8382 6.2719 17.9935 5.88902 17.9912 5.4913C17.9889 5.09361 17.8287 4.71331 17.5459 4.43369C17.2631 4.15409 16.8811 3.99794 16.4834 4.00009Z\",\n  fill: color\n}));\nfunction _empty() {}\nconst GiftCountIcon = ({\n  size = 16,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M7.33301 14.6669H4.66699C4.13666 14.6669 3.62798 14.4559 3.25293 14.081C2.87788 13.7059 2.66702 13.1973 2.66699 12.6669V9.9999C2.66705 9.8232 2.73736 9.65416 2.8623 9.5292C2.98725 9.40425 3.15631 9.33397 3.33301 9.33389H7.33301V14.6669ZM12.667 9.33389C12.8437 9.33397 13.0127 9.40425 13.1377 9.5292C13.2626 9.65416 13.3329 9.8232 13.333 9.9999V12.6669C13.333 13.1973 13.1221 13.7059 12.7471 14.081C12.372 14.4559 11.8633 14.6669 11.333 14.6669H8.66699V9.33389H12.667ZM11 1.33389C11.3937 1.33381 11.7811 1.43308 12.126 1.62295C12.4708 1.81281 12.7622 2.08719 12.9727 2.41982C13.1829 2.75233 13.3052 3.13262 13.3291 3.52529C13.3529 3.91825 13.2771 4.31121 13.1084 4.6669H13.333C13.6866 4.6669 14.0263 4.80747 14.2764 5.05752C14.5262 5.30749 14.6669 5.64646 14.667 5.9999V6.6669C14.667 7.02035 14.5262 7.35928 14.2764 7.60928C14.0263 7.85933 13.6866 7.9999 13.333 7.9999H8.66699V4.6669H7.33301V7.9999H2.66699C2.31337 7.9999 1.97368 7.85933 1.72363 7.60928C1.47378 7.35928 1.33303 7.02035 1.33301 6.6669V5.9999C1.33307 5.64646 1.47377 5.30749 1.72363 5.05752C1.97368 4.80747 2.31337 4.6669 2.66699 4.6669H2.8916C2.74354 4.35436 2.66686 4.01273 2.66699 3.6669C2.66699 2.37836 3.71112 1.3341 4.98828 1.33389C6.15828 1.31389 7.19651 2.06194 7.90918 3.28994L8 3.45107C8.6886 2.17537 9.70657 1.37566 10.8604 1.33486L11 1.33389ZM5 2.6669C4.73478 2.6669 4.4805 2.77233 4.29297 2.95986C4.10546 3.1474 4 3.4017 4 3.6669C4.00002 3.93208 4.10545 4.18641 4.29297 4.37393C4.4805 4.56143 4.73481 4.6669 5 4.6669H7.0957C6.6017 3.3969 5.796 2.65356 5 2.6669ZM10.9883 2.6669C10.2017 2.65381 9.39822 3.39777 8.9043 4.6669H11C11.2651 4.66539 11.5186 4.55847 11.7051 4.37002C11.8916 4.18142 11.9956 3.92625 11.9941 3.66104C11.9926 3.39588 11.8858 3.1424 11.6973 2.95596C11.5087 2.76948 11.2535 2.66539 10.9883 2.6669Z\",\n  fill: color\n}));\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst SHOWCASE_SLOTS = 3;\nconst formatWithSpaces = number => String(number ?? 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\nconst GiftShowcaseSlot = ({\n  gift,\n  styles\n}) => {\n  if (!gift) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.gifts.slot\n    }, /*#__PURE__*/React.createElement(Image, {\n      source: State.getUrl('/api/component/assets/gifts/placeholder-gf.webp'),\n      style: styles.gifts.placeholderImage,\n      contentFit: \"contain\"\n    }));\n  }\n  const count = Number(gift.count) || 0;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gifts.slot\n  }, !!gift.giftImageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: gift.giftImageUrl\n    },\n    style: styles.gifts.image,\n    contentFit: \"contain\"\n  }), count > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gifts.countBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.gifts.countText,\n    numberOfLines: 1\n  }, \"x\", count)));\n};\nconst GiftsShowcase = ({\n  userId,\n  styles\n}) => {\n  const t = Locale.useTranslation();\n  const {\n    showcase\n  } = State.api?.gifts?.useProfileShowcase?.(userId) ?? {\n    showcase: []\n  };\n  const slots = React.useMemo(() => {\n    return Array.from({\n      length: SHOWCASE_SLOTS\n    }, (_, index) => showcase?.[index] ?? null);\n  }, [showcase]);\n  const totalCount = React.useMemo(() => {\n    const explicitTotal = showcase?.find(item => item?.totalCount != null)?.totalCount;\n    if (explicitTotal != null) {\n      return Number(explicitTotal) || 0;\n    }\n    return (showcase ?? []).reduce((sum, item) => sum + (Number(item?.count) || 0), 0);\n  }, [showcase]);\n  if (!userId) {\n    return null;\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gifts.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gifts.header\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.gifts.title,\n    numberOfLines: 1\n  }, t('profileGiftsTitle') || 'Gifts'), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gifts.total\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.gifts.totalText,\n    numberOfLines: 1\n  }, formatWithSpaces(totalCount)), /*#__PURE__*/React.createElement(GiftCountIcon, {\n    size: 16,\n    color: styles.gifts.totalIcon.color\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gifts.row\n  }, slots.map((gift, index) => /*#__PURE__*/React.createElement(GiftShowcaseSlot, {\n    key: gift?.catalogId ?? index,\n    gift: gift,\n    styles: styles\n  }))));\n};\nconst colors = ['rgba(0, 0, 0, 0.90)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.90)'];\nconst colorsStep = [0, 0.2056, 0.5864, 1];\nreturn ({\n  peer,\n  meta,\n  source,\n  ownerPreview = false\n}) => {\n  meta = ownerPreview ? meta : State.api?.users?.sanitizeMeta?.(meta) ?? meta;\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [isLoading, setIsLoading] = React.useState();\n  const session = State.api?.session?.useSession?.();\n  const isGuest = State.api?.guest?.useIsGuestSession?.();\n  const [menuVisible, setMenuVisible] = React.useState(false);\n\n  // Pending owner data is only for the local preview and must not enter the\n  // shared cache used for public profiles, chats and feeds.\n  State.api?.users?.useSetUser?.(ownerPreview ? null : meta);\n  const userId = meta?.user?.id ?? meta?.userId ?? meta?.id ?? null;\n  const isOwnCard = React.useMemo(() => {\n    return userId != null && session?.user?.id != null && String(userId) === String(session?.user?.id);\n  }, [userId, session?.user?.id]);\n  const callEnabled = State.api.ff.useFF('enableCalls');\n  const enableGifts = State.api.ff.useFF('enableGifts');\n  const canSendGift = !isOwnCard && enableGifts;\n  const [isSubscribed, setIsSubscribed] = State.api?.sub?.useSubscription(userId) ?? [];\n  const [isOnline] = State.api?.online?.useOnline(userId) ?? [];\n  const profileViewedRef = React.useRef(false);\n  const profileIdViewed = userId;\n  React.useEffect(() => {\n    if (profileViewedRef.current) return;\n    if (isOwnCard) return;\n    if (profileIdViewed == null) return;\n    profileViewedRef.current = true;\n    State.anals.next({\n      name: 'profile_viewed',\n      data: {\n        view_surface: source ?? 'chat_list'\n      }\n    });\n  }, [isOwnCard, profileIdViewed, source]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 12,\n      paddingBottom: 4 + 52 + 8 + 8 + safeArea.bottom\n    },\n    gradient: {\n      position: 'absolute',\n      left: -10,\n      right: -10,\n      top: -10,\n      height: 100,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    absolute: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      bottom: 4 + safeArea.bottom,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    section: {\n      container: {\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'center',\n        gap: 8,\n        paddingHorizontal: 16,\n        width: '100%'\n      },\n      empty: {\n        alignItems: 'center',\n        justifyContent: 'center',\n        paddingHorizontal: 20,\n        paddingTop: 20\n      },\n      title: {\n        color: theme.theme.semantic.content.regular.secondary,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 500\n      }\n    },\n    gifts: {\n      container: {\n        width: '100%',\n        paddingHorizontal: 16,\n        gap: 8\n      },\n      header: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        width: '100%',\n        gap: 12\n      },\n      title: {\n        flex: 1,\n        minWidth: 0,\n        color: theme.theme.semantic.content.regular.secondary,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '500',\n        letterSpacing: -0.2\n      },\n      total: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 6\n      },\n      totalText: {\n        color: theme.theme.semantic.content.regular.secondary,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '500',\n        letterSpacing: -0.2,\n        textAlign: 'right'\n      },\n      totalIcon: {\n        color: theme.theme.semantic.content.regular.secondary\n      },\n      row: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 8,\n        width: '100%'\n      },\n      slot: {\n        flex: 1,\n        aspectRatio: 1,\n        minWidth: 0,\n        borderRadius: 16,\n        backgroundColor: theme.theme.semantic.surface.regular.surface2,\n        alignItems: 'center',\n        justifyContent: 'center',\n        padding: 12,\n        position: 'relative',\n        overflow: 'hidden'\n      },\n      image: {\n        width: '86%',\n        height: '86%'\n      },\n      placeholderImage: {\n        width: '86%',\n        height: '86%'\n      },\n      countBadge: {\n        position: 'absolute',\n        top: 8,\n        right: 8,\n        minHeight: 22,\n        minWidth: 32,\n        paddingHorizontal: 6,\n        borderRadius: 999,\n        backgroundColor: theme.theme.component?.badge?.regularInversion?.bg ?? '#04060F',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      countText: {\n        color: theme.theme.component?.badge?.regularInversion?.content ?? '#FFFFFF',\n        fontSize: 12,\n        lineHeight: 16,\n        fontWeight: '500',\n        letterSpacing: -0.3\n      }\n    },\n    black: {\n      container: {\n        backgroundColor: theme.theme.semantic.surface.inversion.static.stPageBackground,\n        width: '100%',\n        minHeight: 600,\n        position: 'relative',\n        // Скругления для соответствия Sheet\n        borderTopLeftRadius: 24,\n        borderTopRightRadius: 24,\n        overflow: 'hidden'\n      },\n      gradientOverlay: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        pointerEvents: 'none'\n      },\n      placeholder: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: theme.theme.semantic.surface.inversion.static.stPageBackground\n      },\n      placeholderIconWrap: {\n        width: 112,\n        height: 112,\n        borderRadius: 999,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: theme.theme.semantic.surface.inversion.static.stSurface1\n      },\n      placeholderIcon: {\n        color: theme.theme.semantic.content.brand.content1\n      },\n      gradientBottom: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        bottom: 0,\n        height: 100,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      }\n    },\n    profile: {\n      container: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        bottom: 0,\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'center',\n        gap: 12,\n        objectFit: 'cover',\n        padding: 20,\n        pointerEvents: 'none'\n      },\n      subcontainer: {\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'center',\n        gap: 8\n      },\n      row: {\n        gap: 6,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        flexWrap: 'wrap',\n        width: '100%'\n      },\n      image: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      title: {\n        color: theme.theme.semantic.content.inversion.static.stPrimary,\n        fontSize: 28,\n        lineHeight: 38,\n        fontWeight: 600\n      },\n      desc: {\n        color: theme.theme.semantic.content.inversion.static.stPrimary,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 700\n      },\n      more: {\n        fontFamily: theme.theme.typography.family.paragraph,\n        fontWeight: 700,\n        fontSize: theme.theme.typography.fonts.body.m.fontSize,\n        lineHeight: theme.theme.typography.fonts.body.m.lineHeight,\n        letterSpacing: theme.theme.typography.fonts.body.m.letterSpacing,\n        color: theme.theme.semantic.content.brand.content1\n      }\n    },\n    tags: {\n      flexDirection: 'row',\n      flexWrap: 'wrap',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 6\n    },\n    tag: {\n      backgroundColor: theme.theme.component.chip.bgDefault,\n      borderRadius: 999,\n      paddingHorizontal: 16,\n      paddingVertical: 12,\n      shadowColor: \"#00000033\",\n      shadowOffset: {\n        width: 0,\n        height: 6\n      },\n      shadowOpacity: 0.1,\n      shadowRadius: 8,\n      elevation: 8\n    },\n    tagText: {\n      color: theme.theme.component.chip.contentDefault,\n      fontSize: 14,\n      lineHeight: 16,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    },\n    // Контейнер для кнопок внизу\n    bottomButtonsRow: {\n      width: '100%',\n      minWidth: 0,\n      maxWidth: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      paddingHorizontal: 16\n    },\n    closeButton: {\n      width: 48,\n      height: 48,\n      backgroundColor: theme.theme.component.button.secondary.bgDefault,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      padding: 12,\n      gap: 8,\n      shadowColor: 'rgba(4, 6, 15, 0.15)',\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      shadowOpacity: 1,\n      shadowRadius: 28,\n      elevation: 8\n    },\n    closeIcon: {\n      width: 24,\n      height: 24,\n      color: theme.theme.component.chip.contentDefault\n      // color: theme.theme.component.button.primaryInversion.content,\n    },\n    actionButtonContainer: {\n      flex: 1,\n      flexGrow: 1,\n      flexShrink: 1,\n      minWidth: 0\n    },\n    actionButton: {\n      width: '100%',\n      height: 48,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 20,\n      paddingVertical: 12,\n      gap: 8\n    },\n    chatButtonBg: {\n      backgroundColor: theme.theme.component.button.primary.bgDefault\n    },\n    giftButtonBg: {\n      backgroundColor: theme.theme.component.button.brand.bgDefault\n    },\n    callButtonBg: {\n      backgroundColor: theme.theme.component.button.primary.bgDefault\n      // backgroundColor: theme.theme.component.button.brand.bgDefault,\n    },\n    actionButtonIcon: {\n      width: 24,\n      height: 24,\n      color: theme.theme.component.button.primary.content\n    },\n    actionButtonText: {\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.16,\n      color: theme.theme.component.button.primary.content\n    },\n    giftButtonText: {\n      color: theme.theme.component.button.brand.content\n    },\n    menuIcon: {\n      width: 24,\n      height: 24,\n      color: Utils.withOpacity(theme.theme.semantic.content.inversion.static.stPrimary, 0.9)\n    },\n    indicatorsContainer: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      paddingTop: 20,\n      paddingHorizontal: 20,\n      zIndex: 10,\n      pointerEvents: 'box-none'\n    },\n    indicatorsRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    indicator: {\n      height: 6,\n      borderRadius: 3\n    },\n    // Верхняя строка: слева бейдж «Онлайн», справа иконка меню\n    topRow: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 42,\n      height: 32,\n      paddingHorizontal: 16,\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center'\n    },\n    noTopBar: {\n      top: 16\n    },\n    onlineBadge: {\n      height: 32,\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingLeft: 6,\n      paddingRight: 10,\n      gap: 2,\n      backgroundColor: 'rgba(255, 255, 255, 0.2)',\n      borderRadius: 999\n    },\n    onlineDot: {\n      width: 8,\n      height: 8,\n      borderRadius: 4,\n      backgroundColor: '#24BC75'\n    },\n    onlineBadgeText: {\n      fontFamily: 'Inter',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 16,\n      letterSpacing: -0.3,\n      color: '#FFFFFF'\n    },\n    // Левая группа: бейдж «Онлайн» + кнопка «Подписаться»\n    topRowLeft: {\n      height: 32,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    subscribeButton: {\n      height: 32,\n      minWidth: 92,\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      backgroundColor: '#FFFFFF',\n      borderRadius: 32\n    },\n    subscribeButtonText: {\n      fontFamily: 'Inter',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: '#04060F'\n    },\n    menuButton: {\n      width: 32,\n      height: 32,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }), [theme, safeArea]);\n  const tags = meta?.card?.tags?.map(tag => ({\n    id: tag,\n    name: tag\n  })) ?? [];\n  const photos = meta?.photos ?? [];\n  const photo = photos?.[0];\n  const hasPhoto = !!photo?.path;\n  const images = photos.map(photo => ({\n    cachePolicy: \"memory-disk\",\n    source: State.getUrl(`/file/photo/${photo?.path}`),\n    placeholder: {\n      thumbhash: photo?.hash\n    },\n    maximumLocalBrightness: true\n  }));\n  const about = meta?.card?.about;\n  const displayUsername = meta?.user?.username || t('profilePlaceholderUser') || 'User';\n  const hasCountry = !!meta?.card?.country;\n  const hasStatus = meta?.status?.status != null;\n  const [currentImageIndex, setCurrentImageIndex] = React.useState(0);\n  const onPressImage = React.useCallback(index => {\n    Modals.pushModal(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"PhotoViewer\",\n      images: images,\n      index: index\n    }));\n  }, [images]);\n  const hasTopBar = (photos?.length ?? 0) > 1;\n  const openGiftsSheet = React.useCallback(() => {\n    // Гость не может отправлять подарок — ведём на CTA авторизации.\n    // Контрол остаётся видимым (профиль собеседника открыт из видеочата).\n    if (isGuest) {\n      State.api?.guest?.openRegisterSheet?.('restricted_action', 'gift');\n      return;\n    }\n    State.api?.gifts?.startGiftFlow?.({\n      receiverId: userId,\n      entrySource: source ?? 'profile'\n    });\n    sheet.close();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsCatalogSheet\"\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet, source, userId, isGuest]);\n  const openChat = React.useCallback(() => {\n    if (isGuest) {\n      State.api?.guest?.openRegisterSheet?.('restricted_action', 'message');\n      return;\n    }\n    sheet.close();\n    if (userId != null) {\n      State.api.chat.openModal(userId, source ?? 'card_modal');\n    }\n  }, [isGuest, sheet, userId, source]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    duration: 150,\n    style: styles.black.container\n  }, hasPhoto ? /*#__PURE__*/React.createElement(Components.DSImageCarousel, {\n    style: styles.profile.image,\n    images: images,\n    onPress: onPressImage,\n    onIndexChange: setCurrentImageIndex\n  }, /*#__PURE__*/React.createElement(LinearGradient, {\n    start: {\n      x: 0,\n      y: 0\n    },\n    end: {\n      x: 0,\n      y: 1\n    },\n    colors: colors,\n    locations: colorsStep,\n    style: styles.black.gradientOverlay\n  })) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.black.placeholder\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.black.placeholderIconWrap\n  }, /*#__PURE__*/React.createElement(Assets.Avatar, {\n    size: 64\n  }))), /*#__PURE__*/React.createElement(LinearGradient, {\n    start: {\n      x: 0,\n      y: 0\n    },\n    end: {\n      x: 0,\n      y: 1\n    },\n    colors: colors,\n    locations: colorsStep,\n    style: styles.black.gradientOverlay\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.profile.container, {\n      pointerEvents: 'box-none'\n    }]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.profile.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.profile.title,\n    numberOfLines: 1\n  }, displayUsername), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.profile.row\n  }, hasCountry && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      height: 30,\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PeerCountry\",\n    country: meta?.card?.country\n  })), hasStatus && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      height: 30,\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PeerStatus\",\n    status: meta?.status?.status,\n    showRating: false\n  })), meta?.subscription?.hasSubscription && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      height: 30,\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"BadgePremium\"\n  })))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"FoldableText\",\n    text: about,\n    textStyle: styles.profile.desc,\n    moreStyle: styles.profile.more,\n    maxHeight: 200,\n    numberOfLines: 2\n  }))), !isOwnCard && enableGifts && !isGuest && /*#__PURE__*/React.createElement(GiftsShowcase, {\n    userId: userId,\n    styles: styles\n  }), !!tags?.length && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.title\n  }, t('profileInterests')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tags\n  }, tags.map(tag => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    key: tag.id,\n    style: styles.tag\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.tagText\n  }, t(tag.name)))))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [{\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      bottom: safeArea.bottom + 4 + 8\n    }, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomButtonsRow\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.closeButton,\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.closeIcon\n  })), !isOwnCard && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.actionButtonContainer,\n    style: [styles.actionButton, styles.chatButtonBg],\n    feedback: true,\n    onPress: openChat\n  }, /*#__PURE__*/React.createElement(Assets.ChatFill, {\n    size: 24,\n    style: styles.actionButtonIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.actionButtonText\n  }, t('cardModalChat'))), canSendGift && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.actionButtonContainer,\n    style: [styles.actionButton, styles.giftButtonBg],\n    feedback: true,\n    onPress: openGiftsSheet\n  }, /*#__PURE__*/React.createElement(GiftIcon, {\n    size: 24,\n    color: theme.theme.component.button.brand.content\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.actionButtonText, styles.giftButtonText]\n  }, t('cardModalGift') || 'Gift')))), !isOwnCard && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.topRow, !hasTopBar && styles.noTopBar, sheet.stickyTopStyle].filter(Boolean)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topRowLeft\n  }, !!isOnline && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.onlineBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.onlineDot\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.onlineBadgeText,\n    numberOfLines: 1\n  }, t('feedCardOnline') || 'Online')), !isOwnCard && !isGuest && isSubscribed != null && !isSubscribed && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 0.7,\n    duration: 150,\n    translateX: -16,\n    translateY: -16\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.subscribeButton,\n    onPress: _async(function () {\n      setIsSubscribed(true, source);\n      return _await();\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subscribeButtonText,\n    numberOfLines: 1\n  }, t('cardModalSubscribe') || 'Subscribe')))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.menuButton,\n    onPress: () => setMenuVisible(v => !v)\n  }, /*#__PURE__*/React.createElement(MenuDotsVerticalIcon, {\n    size: 24,\n    color: Utils.withOpacity(theme.theme.semantic.content.inversion.static.stPrimary, 0.9)\n  }))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatDropdownMenu\",\n    visible: menuVisible,\n    onClose: () => setMenuVisible(false),\n    onUnsubscribe: !isOwnCard && isSubscribed != null && isSubscribed ? _async(function () {\n      setMenuVisible(false);\n      return _awaitIgnored(setIsSubscribed(false, source));\n    }) : undefined,\n    onReport: !isOwnCard ? _async(function () {\n      setMenuVisible(false);\n      if (peer?.stream != null || meta != null) {\n        Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n          name: \"report\",\n          peer: peer,\n          meta: meta,\n          source: source\n        }), {\n          theme: Theme.isDark.value ? 'dark' : 'light',\n          props: {\n            style: {\n              maxWidth: 600\n            }\n          }\n        });\n      }\n      return _await();\n    }) : undefined,\n    topOffset: hasTopBar ? 80 : 60\n  })));\n};"},"Delete":{"name":"Delete","key":"afa6fafd1756583d62807dcefa246d8be82940c31e5f45f5984382089dc15968","code":"function _empty() {}\nconst width = 800;\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction generate(n, chunks = 0, separator = '') {\n  let add = 1,\n    max = 12 - add; // 12 is the min safe number Math.random() can generate without it starting to pad the end with zeros.\n\n  let out;\n  if (n > max) {\n    out = generate(max) + generate(n - max);\n  } else {\n    max = Math.pow(10, n + add);\n    let min = max / 10; // Math.pow(10, n) basically\n    let number = Math.floor(Math.random() * (max - min + 1)) + min;\n    out = (\"\" + number).substring(add);\n  }\n  if (chunks > 0 && n > chunks) {\n    // Insert separator every chunks characters\n    const instead = [];\n    for (let i = 0; i < out.length; i++) {\n      if (i > 0 && i % chunks === 0) instead.push(separator);\n      instead.push(out[i]);\n    }\n    return instead.join('');\n  }\n  return out;\n}\nconst CELL_COUNT = 6;\nreturn () => {\n  State.useRequireSocket();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const navigation = ReactNavigation.useNavigation();\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingTop: Math.max(safeArea.top, 12),\n      paddingBottom: 4,\n      paddingLeft: safeArea.left,\n      paddingRight: safeArea.right\n    },\n    subcontainer: {\n      flex: 1,\n      width: \"100%\",\n      maxWidth: width,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start'\n    },\n    header: {\n      position: 'relative',\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      minHeight: 48\n    },\n    title: {\n      padding: 12,\n      color: theme.theme.component.appBar.contentPrimary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    content: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 32,\n      paddingHorizontal: 12,\n      paddingTop: 24\n    },\n    section: {\n      container: {\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'flex-start',\n        gap: 8,\n        width: \"100%\"\n      },\n      title: {\n        color: theme.theme.semantic.content.regular.primary,\n        fontSize: theme.theme.typography?.fonts?.body?.l?.fontSize ?? 16,\n        lineHeight: theme.theme.typography?.fonts?.body?.l?.lineHeight ?? 24,\n        letterSpacing: theme.theme.typography?.fonts?.body?.l?.letterSpacing ?? -0.3,\n        fontWeight: 600,\n        width: \"100%\"\n      },\n      titleCentered: {\n        textAlign: 'center',\n        fontSize: 18,\n        lineHeight: 26\n      },\n      text: {\n        flex: 1,\n        color: theme.theme.semantic.content.regular.secondary,\n        fontSize: 18,\n        lineHeight: 26,\n        fontWeight: 500,\n        letterSpacing: -0.3\n      },\n      code: {\n        flex: 1,\n        fontFamily: theme.theme.typography?.family?.paragraph ?? theme.theme.font?.paragraph ?? 'Inter',\n        fontSize: theme.theme.typography?.fonts?.body?.l?.fontSize ?? 16,\n        letterSpacing: theme.theme.typography?.fonts?.body?.l?.letterSpacing ?? -0.3,\n        fontWeight: 700,\n        color: theme.theme.semantic.content.brand.content1\n      },\n      centerContainer: {\n        alignItems: 'center'\n      },\n      centerText: {\n        textAlign: 'center',\n        width: '100%'\n      },\n      bottom: {\n        flex: 1,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-end',\n        gap: 4,\n        width: \"100%\"\n      }\n    },\n    cell: {\n      aspectRatio: 0.94,\n      width: '14%',\n      borderRadius: 20,\n      borderWidth: 1,\n      borderColor: Utils.withOpacity(theme.theme.component?.textField?.['border-default'] ?? theme.theme.component?.textField?.borderDefault ?? '#999', 0.1),\n      backgroundColor: Utils.withOpacity(theme.theme.component.textField.bg, 0.05),\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    cellText: {\n      fontFamily: theme.theme.typography?.family?.heading ?? theme.theme.font?.heading ?? 'Geologica',\n      fontSize: 24,\n      fontWeight: 700,\n      letterSpacing: -0.3,\n      textAlign: 'center',\n      color: theme.theme.component?.textField?.['content-primary'] ?? theme.theme.component?.textField?.contentPrimary ?? theme.theme.semantic.content.regular.primary\n    }\n  }), [theme, safeArea]);\n  const [code, setCode] = React.useState('');\n  const [reason, setReason] = React.useState('');\n  const [text, setText] = React.useState('');\n  const [codeShould] = React.useState(() => generate(CELL_COUNT));\n  const ref = CodeField.useBlurOnFulfill({\n    value: code,\n    cellCount: CELL_COUNT\n  });\n  const onDelete = Components.useCallbackLoader(_async(function () {\n    const analytics = Analytics.getGlobalParams();\n    return _await(State.post('/api/ban/remove', {\n      \"reason\": reason,\n      \"text\": text\n    }, 'string', undefined, undefined, {\n      analytics\n    }).catch(error => {\n      console.error(error);\n    }), function () {\n      return _awaitIgnored(new Promise(r => setTimeout(r, 1000)));\n    });\n  }), [reason, text], {\n    backgroundColor: '#000'\n  });\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    edges: [],\n    scrollable: true,\n    testID: \"page_delete\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      left: 16,\n      top: '50%',\n      transform: [{\n        translateY: '-50%'\n      }]\n    },\n    feedback: true,\n    onPress: () => {\n      navigation.canGoBack() && navigation.goBack();\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    style: styles.title\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('deletingHeaderTop'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.section.title, styles.section.titleCentered]\n  }, t('deletingHeaderWarning')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.section.text, styles.section.centerText]\n  }, t('deletingDescriptionWarning'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.section.text, styles.section.centerText]\n  }, t('deletingCode')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.section.code, styles.section.centerText]\n  }, codeShould)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.section.container, styles.section.centerContainer, {\n      justifyContent: 'center'\n    }]\n  }, /*#__PURE__*/React.createElement(CodeField.CodeField, {\n    ref: ref,\n    value: code,\n    autoFocus: false,\n    onChangeText: setCode,\n    cellCount: CELL_COUNT,\n    keyboardType: \"number-pad\",\n    textContentType: \"oneTimeCode\",\n    rootStyle: {\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      width: '100%',\n      maxWidth: 400\n    },\n    renderCell: ({\n      index,\n      symbol,\n      isFocused\n    }) => /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: index,\n      style: styles.cell\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.cellText\n    }, symbol || (isFocused ? /*#__PURE__*/React.createElement(CodeField.Cursor, null) : null)))\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.bottom\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    scale: 0.98,\n    size: \"L\",\n    disabled: code !== codeShould,\n    style: {\n      width: '100%'\n    },\n    onPress: onDelete\n  }, t('deletingButton')))))));\n};"},"Ban":{"name":"Ban","key":"c3ec9f37a5084ae5be92fad3d438a23b586e758ecdd57e4c852e71ea764f953c","code":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst width = 800;\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst AvatarPlaceholderIcon = ({\n  size = 20\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9.59961 1.59961C11.3669 1.59961 12.7997 3.03258 12.7998 4.7998C12.7998 6.56712 11.3669 8 9.59961 8C7.83248 7.99979 6.40039 6.56699 6.40039 4.7998C6.4005 3.03271 7.83254 1.59982 9.59961 1.59961Z\",\n  fill: \"#FE879D\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.5\",\n  d: \"M9.59961 10.4004C13.1342 10.4004 16 12.0118 16 14C16 15.9882 15.9996 17.5996 9.59961 17.5996C3.2 17.5995 3.2002 15.9882 3.2002 14C3.2002 12.0118 6.06517 10.4005 9.59961 10.4004Z\",\n  fill: \"#FE879D\"\n}));\nconst CrownIcon = ({\n  size = 10,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nreturn () => {\n  State.useRequireSocket();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const session = State.api?.session?.useSession?.();\n  const mainPhoto = session?.photos?.[0] ?? session?.card?.mainPhoto;\n  const hasSubscription = !!session?.subscription?.hasSubscription;\n  const onSupport = React.useCallback(_async(function () {\n    Intercom.present();\n    return _await();\n  }), []);\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingTop: safeArea.top,\n      paddingBottom: Math.max(safeArea.bottom, 8)\n    },\n    subcontainer: {\n      flex: 1,\n      width: '100%',\n      maxWidth: width,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingHorizontal: 12\n    },\n    header: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 8,\n      paddingVertical: 12\n    },\n    avatarWrap: {\n      position: 'relative',\n      width: 40,\n      height: 40,\n      flexShrink: 0\n    },\n    avatar: {\n      width: 40,\n      height: 40,\n      borderRadius: 999,\n      overflow: 'hidden',\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    avatarImage: {\n      width: '100%',\n      height: '100%',\n      objectFit: 'cover'\n    },\n    premium: {\n      position: 'absolute',\n      top: -3,\n      right: -3,\n      width: 16,\n      height: 16,\n      borderRadius: 16,\n      backgroundColor: theme.theme.component.button.brand.bgDefault,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    premiumIcon: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary\n    },\n    username: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      letterSpacing: -0.7,\n      flexShrink: 1\n    },\n    content: {\n      flex: 1,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingTop: 12,\n      paddingBottom: 44\n    },\n    center: {\n      flex: 1,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 32\n    },\n    copy: {\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 4\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 28,\n      lineHeight: 36,\n      fontWeight: 600,\n      letterSpacing: -0.7,\n      width: '100%',\n      textAlign: 'center'\n    },\n    description: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 16,\n      lineHeight: 22,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    },\n    image: {\n      width: 308,\n      height: 213\n    },\n    support: {\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    supportLine: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    supportRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    supportLink: {\n      color: '#40A7E3',\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700,\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    hide: true,\n    testID: \"page_ban\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatar\n  }, !!mainPhoto ? /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.avatarImage,\n    source: State.getUrl(`/file/photo/${mainPhoto?.path}`),\n    cachePolicy: \"memory-disk\",\n    thumbhash: mainPhoto?.hash\n  }) : /*#__PURE__*/React.createElement(AvatarPlaceholderIcon, {\n    size: 20\n  })), hasSubscription && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.premium\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: styles.premiumIcon.color\n  }))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.username,\n    numberOfLines: 1\n  }, session?.user?.username ?? '')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.center\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.copy\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('bannedHeader')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('bannedDescription'))), /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.image,\n    source: State.getUrl('/api/component/assets/ban.webp')\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.support\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.supportLine\n  }, t('bannedSupportLine1')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.supportRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.supportLine\n  }, t('bannedSupportLine2'), \" \"), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: onSupport\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.supportLink\n  }, t('bannedSupportAction')))))))));\n};"},"Deleted":{"name":"Deleted","key":"4974377ac94b1bc797cb874ed3cf812fc98859665be37eee334aa91ec5f168cb","code":"function _empty() {}\nconst width = 800;\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn () => {\n  State.useRequireSocket();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const navigation = ReactNavigation.useNavigation();\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingBottom: 4\n    },\n    subcontainer: {\n      flex: 1,\n      width: \"100%\",\n      maxWidth: width,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start'\n    },\n    content: {\n      flex: 1,\n      width: \"100%\",\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 32,\n      paddingHorizontal: 12,\n      paddingTop: 24,\n      paddingBottom: 4\n    }\n  }), [theme, safeArea]);\n  const onLogout = Components.useCallbackLoader(_async(function () {\n    return _await(new Promise(r => setTimeout(r, 1000)), function () {\n      return _await(State.logout(), function () {\n        return _awaitIgnored(new Promise(r => setTimeout(r, 1000)));\n      });\n    });\n  }), [], {\n    backgroundColor: '#000'\n  });\n  const onSupport = React.useCallback(_async(function () {\n    Intercom.present();\n    return _await();\n  }), []);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    scrollable: true,\n    hide: true,\n    testID: \"page_deleted\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: \"100%\",\n      flex: 1,\n      gap: 16\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: {\n      width: 124,\n      height: 124\n    },\n    source: State.getUrl('/api/component/assets/ghost.webp')\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      width: \"100%\"\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 28,\n      lineHeight: 36,\n      fontWeight: 600,\n      letterSpacing: -0.7,\n      width: \"100%\",\n      textAlign: 'center'\n    }\n  }, t('deletedHeader')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      flex: 1,\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 16,\n      lineHeight: 22,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    }\n  }, t('deletedDescription'))), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    scale: 0.98,\n    size: \"L\",\n    onPress: onLogout\n  }, t('deletedButton'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      gap: 4,\n      width: \"100%\"\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    size: \"L\",\n    style: {\n      width: '100%'\n    },\n    onPress: onSupport\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      flex: 1,\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 16,\n      lineHeight: 22,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    }\n  }, t('deletedMistake'))))))));\n};"},"Chat":{"name":"Chat","key":"acc970e910ce642adc72ba4928e84731b98f8fb9de88efe3fa581651a120b6bd","code":"deps: ChatsMain, ChatRoom, WithAppear, LiveStreamNotificationBar\nconst DSSwipeBackWrapper = Components.DSSwipeBackWrapper ?? ReactNative.View;\nreturn () => {\n  State.useRequireSocketNavigation();\n  Navigation.useOverflowX?.();\n  const theme = Theme.useTheme();\n  const navigation = ReactNavigation.useNavigation();\n  const route = ReactNavigation.useRoute();\n  const params = route?.params || {};\n  const ownStream = State.api.live.useOwnStream();\n  const [chatId, setChatId] = Hooks.useBehaviorSubject(State.store.chat_chatId);\n  const [userId, setUserId] = Hooks.useBehaviorSubject(State.store.user_userId);\n  const {\n    width: windowWidth\n  } = ReactNative.useWindowDimensions();\n  const enableWebUI = State.api.ff.useFF('enableWebUI');\n  const isWeb = ReactNative.Platform.OS === 'web';\n  const isSplitWebLayout = enableWebUI && isWeb && windowWidth >= 960;\n  const [focused, setFocused] = React.useState(false);\n  const styles = React.useMemo(() => {\n    return {\n      relative: {\n        position: 'relative',\n        flex: 1,\n        width: '100%'\n      },\n      absolute: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        height: '100%',\n        backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n      },\n      chatRoom: {\n        flex: 1,\n        minHeight: 0,\n        width: '100%'\n      }\n    };\n  }, [theme]);\n  ReactNavigation.useFocusEffect(React.useCallback(() => {\n    setFocused(true);\n    return () => {\n      setFocused(false);\n    };\n  }, []));\n  React.useEffect(() => {\n    State.api?.chat?.mount?.();\n    return () => {\n      State.api?.chat?.unmount?.();\n    };\n  }, []);\n  const fromJumper = React.useRef(!!params.chatId || !!params.userId);\n  React.useEffect(() => {\n    fromJumper.current = !!params.chatId || !!params.userId;\n    if (fromJumper.current) {\n      if (params.chatId) setChatId(params.chatId);\n      if (params.userId) setUserId(params.userId);\n    } else {\n      setChatId(null);\n      setUserId(null);\n    }\n  }, [params.chatId, params.userId]);\n  const onBack = React.useCallback(() => {\n    if (fromJumper.current) {\n      if (navigation.canGoBack()) {\n        navigation.goBack();\n      }\n      if (!!chatId || !!userId) {\n        setChatId(null);\n        setUserId(null);\n      } else {\n        Navigation.goto({\n          name: 'Random'\n        });\n      }\n    } else if (!!chatId || !!userId) {\n      setChatId(null);\n      setUserId(null);\n    } else if (navigation.canGoBack()) {\n      navigation.goBack();\n    } else {\n      Navigation.goto({\n        name: 'Random'\n      });\n    }\n  }, [navigation, chatId, userId]);\n  const hideTabbar = (!!chatId || !!userId) && !isSplitWebLayout;\n  const showLiveNotification = params.showLiveNotification === true || ownStream?.active === true;\n  const onReturnToLive = React.useCallback(() => {\n    if (params.showLiveNotification === true && navigation.canGoBack()) {\n      navigation.goBack();\n      return;\n    }\n    if (ownStream?.roomId == null) return;\n    Navigation.push({\n      name: 'Streaming',\n      params: {\n        id: String(ownStream.roomId)\n      }\n    });\n  }, [navigation, ownStream?.roomId, params.showLiveNotification]);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPage, {\n    hide: hideTabbar,\n    tabbar: false,\n    testID: \"page_chat\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.relative\n  }, (!fromJumper.current || isSplitWebLayout) && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.absolute\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatsMain\"\n  })), hideTabbar && /*#__PURE__*/React.createElement(DSSwipeBackWrapper, {\n    onBack: onBack,\n    style: styles.absolute,\n    limit: fromJumper.current\n  }, showLiveNotification && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"LiveStreamNotificationBar\",\n    onPress: onReturnToLive\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.chatRoom\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatRoom\",\n    onBack: onBack,\n    chatId: chatId,\n    userId: userId,\n    source: params?.source ?? 'chat_list'\n  }))))));\n};"},"Feed":{"name":"Feed","key":"2189b91580b9804374e42f5f87ad34338b0028da244da25151de73d64930a191","code":"deps: UserAppbar, FeedList, FeedMasonry, SkeletonRowGrid\nconst DSTabsHeader = Components.DSTabsHeader ?? React.Fragment;\nreturn () => {\n  State.useRequireSocketNavigation();\n  Navigation.useOverflowX?.();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: '100%',\n      maxWidth: '100%',\n      alignSelf: 'center'\n    },\n    subContainer: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center'\n    },\n    padding: {\n      paddingVertical: 12,\n      paddingHorizontal: 12\n    }\n  }), [theme]);\n  const [tab, setTab] = React.useState(0);\n  const sessionStartedAtRef = React.useRef(Date.now());\n  const tabRef = React.useRef(0);\n  const scrollDepthRef = React.useRef([0, 0]);\n  const cardsOpenedRef = React.useRef([0, 0]);\n  const exitReasonRef = React.useRef('new_page');\n  const sendSessionEnded = React.useCallback((exitReason = exitReasonRef.current) => {\n    State.anals.next({\n      name: 'feed_session_ended',\n      data: {\n        scroll_depth: scrollDepthRef.current[tabRef.current] ?? 0,\n        cards_opened: cardsOpenedRef.current[tabRef.current] ?? 0,\n        session_length: Math.round(Date.now() - sessionStartedAtRef.current),\n        exit_reason: exitReason,\n        feed_tab: tabRef.current === 1 ? 'recomendations' : 'online'\n      }\n    });\n  }, []);\n  const resetSession = React.useCallback(nextTab => {\n    tabRef.current = nextTab;\n    sessionStartedAtRef.current = Date.now();\n    scrollDepthRef.current[nextTab] = 0;\n    cardsOpenedRef.current[nextTab] = 0;\n    exitReasonRef.current = 'new_page';\n  }, []);\n  React.useEffect(() => {\n    return () => {\n      sendSessionEnded();\n    };\n  }, [sendSessionEnded]);\n  const handleTabChange = React.useCallback(index => {\n    if (index !== tabRef.current) {\n      sendSessionEnded('new_page');\n      resetSession(index);\n    }\n    setTab(index);\n  }, [resetSession, sendSessionEnded]);\n  const handleScrollDepthChange = React.useCallback(depth => {\n    scrollDepthRef.current[tabRef.current] = Math.max(scrollDepthRef.current[tabRef.current] ?? 0, depth);\n  }, []);\n  const handleCardOpen = React.useCallback(() => {\n    cardsOpenedRef.current[tabRef.current] = (cardsOpenedRef.current[tabRef.current] ?? 0) + 1;\n  }, []);\n  const handleMessageAttempt = React.useCallback(() => {\n    exitReasonRef.current = 'message_attempt';\n  }, []);\n  const tabs = React.useMemo(() => [{\n    id: 0,\n    label: t('onlineBtn')\n  }, {\n    id: 1,\n    label: t('recommendationsBtn')\n  }], [t]);\n  const renderTabsPlaceholder = React.useCallback(() => /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"SkeletonRowGrid\"\n  }), []);\n  const tabContent = React.useMemo(() => [/*#__PURE__*/React.createElement(LazyComponent, {\n    key: \"feed-online\",\n    name: \"FeedList\",\n    onScrollDepthChange: handleScrollDepthChange,\n    onCardOpen: handleCardOpen,\n    onMessageAttempt: handleMessageAttempt\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    key: \"feed-recommendations\",\n    name: \"FeedMasonry\",\n    onScrollDepthChange: handleScrollDepthChange,\n    onCardOpen: handleCardOpen,\n    onMessageAttempt: handleMessageAttempt\n  })], [handleCardOpen, handleMessageAttempt, handleScrollDepthChange]);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    testID: \"page_feed\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.subContainer, styles.padding]\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserAppbar\"\n  })), /*#__PURE__*/React.createElement(DSTabsHeader, {\n    style: styles.subContainer,\n    selectedIndex: tab,\n    onIndexChange: handleTabChange,\n    tabs: tabs\n  }), /*#__PURE__*/React.createElement(Components.DSSwipeableTabs, {\n    selectedIndex: tab,\n    onSwipe: handleTabChange,\n    style: {\n      height: '100%'\n    },\n    renderPlaceholder: renderTabsPlaceholder\n  }, tabContent)));\n};"},"Live":{"name":"Live","key":"9215d594684472059a6624c8b2ae85c271fcdab4d1c52159b71500af61d34417","code":"deps: LiveGrid, WatchStream\nconst getRouteId = route => {\n  if (route?.params?.initialTab === 'list') return null;\n  if (ReactNative.Platform.OS === 'web' && typeof window !== 'undefined') {\n    try {\n      return new URL(window.location.href).searchParams.get('id');\n    } catch (e) {}\n  }\n  const paramId = route?.params?.id;\n  if (paramId != null) return String(paramId);\n  return null;\n};\nconst makeRouteStreamItem = id => {\n  if (!id) return null;\n  const streamId = String(id);\n  return {\n    roomId: streamId,\n    meta: {\n      members: []\n    },\n    routeOnly: true\n  };\n};\nconst getStreamId = item => {\n  const id = item?.roomId ?? item?.id ?? item?._id ?? null;\n  return id == null ? null : String(id);\n};\nconst LIVE_SWIPE_HINT_MAX_SHOWS = 2;\nconst LIVE_SWIPE_HINT_DELAY_MS = 600;\nconst startLiveWatchingWhenReady = (id, source) => {\n  if (!id) return () => {};\n  let stopped = false;\n  let timer = null;\n  let attempt = 0;\n  const run = () => {\n    if (stopped) return;\n    const result = State.api?.live?.startWatching?.(String(id), source);\n    if (result != null || attempt >= 20) return;\n    attempt += 1;\n    timer = setTimeout(run, 150);\n  };\n  run();\n  return () => {\n    stopped = true;\n    if (timer) clearTimeout(timer);\n  };\n};\nreturn ({\n  route,\n  navigation\n}) => {\n  const session = State.api?.session?.useSession?.();\n  const isGuest = session?.user?.id == null;\n  Navigation.useOverflowX?.();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [watchStreams] = State.api?.live?.useStreams?.() ?? [[], 0, false, false, true];\n  const watchItems = React.useMemo(() => (watchStreams ?? []).filter(item => item?.ended !== true), [watchStreams]);\n  const routeId = getRouteId(route);\n  const [tab, setTab] = React.useState(routeId ? 1 : 0);\n  const [realIndex, setRealIndex] = React.useState(routeId ? 1 : 0);\n  const [chromeIndex, setChromeIndex] = React.useState(routeId ? 1 : 0);\n  const [selectedStreamId, setSelectedStreamId] = React.useState(routeId);\n  const tabRef = React.useRef(tab);\n  const realIndexRef = React.useRef(routeId ? 1 : 0);\n  const chromeIndexRef = React.useRef(routeId ? 1 : 0);\n  const selectedStreamIdRef = React.useRef(routeId);\n  const shouldSeedListHistoryRef = React.useRef(ReactNative.Platform.OS === 'web' && !!routeId);\n  const didSeedListHistoryRef = React.useRef(false);\n  const watchNextPrev = React.useRef(new Rx.Subject()).current;\n  React.useEffect(() => {\n    tabRef.current = tab;\n  }, [tab]);\n  React.useEffect(() => {\n    selectedStreamIdRef.current = selectedStreamId;\n  }, [selectedStreamId]);\n  const selectedItem = React.useMemo(() => {\n    if (!selectedStreamId) return null;\n    return (watchStreams ?? []).find(item => getStreamId(item) === String(selectedStreamId)) ?? makeRouteStreamItem(selectedStreamId);\n  }, [selectedStreamId, watchStreams]);\n  const watchData = React.useMemo(() => {\n    if (!selectedItem) return watchItems;\n    const selectedId = getStreamId(selectedItem);\n    if (watchItems.some(item => getStreamId(item) === selectedId)) return watchItems;\n    return [selectedItem, ...watchItems];\n  }, [selectedItem, watchItems]);\n  const hasSelectedItem = !!selectedItem;\n  const visibleTab = hasSelectedItem ? tab : 0;\n  const visibleRealIndex = hasSelectedItem ? realIndex : 0;\n  const visibleChromeIndex = hasSelectedItem ? chromeIndex : 0;\n  const chromeHidden = visibleChromeIndex === 1;\n  const isWatchVisible = visibleTab === 1 && visibleRealIndex === 1;\n  const selectedItemId = getStreamId(selectedItem) ?? selectedStreamId ?? null;\n  const keepAliveTabIndexes = React.useMemo(() => [0], []);\n  Stated.useDark({\n    dark: chromeHidden ? true : undefined\n  });\n\n  // Swipe-hint: показываем до LIVE_SWIPE_HINT_MAX_SHOWS раз за сессию при входе в режим просмотра,\n  // если доступно больше одного стрима. Триггер — isWatchVisible становится true (переход Tab0→Tab1\n  // или открытие по routeId). Свайпы между стримами isWatchVisible не меняют — повторного показа нет.\n  // Состояние видимости живёт в State.store.liveSwipeHintVisible — WatchStream/SwipeHintOverlay\n  // читают его напрямую, без prop drilling (иначе пересоздаётся tabContent и сбрасывается scroll DSTikTok).\n  React.useEffect(() => {\n    if (!isWatchVisible) return;\n    if (watchData.length <= 1) return;\n    if (State.store.liveSwipeHintVisible?.value) return;\n    const shows = Number(State.store.liveSwipeHintShows?.value ?? 0);\n    if (shows >= LIVE_SWIPE_HINT_MAX_SHOWS) return;\n    const timer = setTimeout(() => {\n      const currentShows = Number(State.store.liveSwipeHintShows?.value ?? 0);\n      if (currentShows >= LIVE_SWIPE_HINT_MAX_SHOWS) return;\n      if (State.store.liveSwipeHintVisible?.value) return;\n      State.store.liveSwipeHintShows?.next?.(currentShows + 1);\n      State.api?.live?.showSwipeHint?.();\n      State.anals.next({\n        name: 'live_swipe_hint_shown',\n        data: {\n          show: currentShows + 1\n        }\n      });\n    }, LIVE_SWIPE_HINT_DELAY_MS);\n    return () => clearTimeout(timer);\n  }, [isWatchVisible, watchData.length]);\n  const writeLiveUrl = React.useCallback((id, mode = 'replace') => {\n    if (ReactNative.Platform.OS !== 'web' || typeof window === 'undefined') {\n      return;\n    }\n    try {\n      const url = new URL(window.location.href);\n      url.pathname = '/live';\n      if (id) {\n        url.searchParams.set('id', id);\n      } else {\n        url.searchParams.delete('id');\n      }\n      const next = `${url.pathname}${url.search}${url.hash}`;\n      const current = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n      if (next !== current) {\n        const fn = mode === 'push' ? 'pushState' : 'replaceState';\n        window.history[fn](window.history.state, '', next);\n      }\n    } catch (e) {}\n  }, []);\n  const selectStreamId = React.useCallback(id => {\n    if (!id) return;\n    if (selectedStreamIdRef.current === id) return;\n    selectedStreamIdRef.current = id;\n    setSelectedStreamId(id);\n  }, []);\n  const setRealTabIndex = React.useCallback(index => {\n    const next = index === 1 ? 1 : 0;\n    if (realIndexRef.current === next) return;\n    realIndexRef.current = next;\n    setRealIndex(next);\n  }, []);\n  const setChromeTabIndex = React.useCallback(index => {\n    const next = index === 1 ? 1 : 0;\n    if (chromeIndexRef.current === next) return;\n    chromeIndexRef.current = next;\n    setChromeIndex(next);\n  }, []);\n  const revealStreamTab = React.useCallback(() => {\n    setChromeTabIndex(1);\n    if (tabRef.current !== 1) {\n      tabRef.current = 1;\n      setTab(1);\n    }\n  }, [setChromeTabIndex]);\n  const goToList = React.useCallback(() => {\n    State.api?.live?.hideSwipeHint?.('navigate');\n    State.api?.live?.stopWatching?.(selectedStreamIdRef.current);\n    setChromeTabIndex(0);\n    setRealTabIndex(0);\n    if (tabRef.current !== 0) {\n      tabRef.current = 0;\n      setTab(0);\n    }\n    writeLiveUrl(null, 'replace');\n  }, [setChromeTabIndex, setRealTabIndex, writeLiveUrl]);\n  React.useEffect(() => {\n    if (routeId == null) return;\n    tabRef.current = 1;\n    setChromeTabIndex(1);\n    setRealTabIndex(1);\n    selectStreamId(routeId);\n    setTab(1);\n    const stopStartWatching = startLiveWatchingWhenReady(routeId, 'live-route');\n    return stopStartWatching;\n  }, [routeId, selectStreamId, setChromeTabIndex, setRealTabIndex]);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'web' || typeof window === 'undefined') return;\n    const onPopState = () => {\n      let id = null;\n      try {\n        const url = new URL(window.location.href);\n        id = url.searchParams.get('id');\n      } catch (e) {}\n      if (id) {\n        State.api?.live?.startWatching?.(id, 'live-popstate');\n        tabRef.current = 1;\n        setChromeTabIndex(1);\n        setRealTabIndex(1);\n        selectStreamId(id);\n        setTab(1);\n      } else {\n        tabRef.current = 0;\n        setChromeTabIndex(0);\n        setRealTabIndex(0);\n        setTab(0);\n      }\n    };\n    window.addEventListener('popstate', onPopState);\n    return () => window.removeEventListener('popstate', onPopState);\n  }, [selectStreamId, setChromeTabIndex, setRealTabIndex]);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'android') return;\n    const sub = ReactNative.BackHandler.addEventListener('hardwareBackPress', () => {\n      if (tabRef.current !== 1) return false;\n      goToList();\n      return true;\n    });\n    return () => sub.remove();\n  }, [goToList]);\n  React.useEffect(() => {\n    if (tab === 1 && selectedItemId) {\n      if (ReactNative.Platform.OS === 'web' && typeof window !== 'undefined' && shouldSeedListHistoryRef.current && !didSeedListHistoryRef.current) {\n        try {\n          const url = new URL(window.location.href);\n          url.pathname = '/live';\n          url.searchParams.delete('id');\n          const listUrl = `${url.pathname}${url.search}${url.hash}`;\n          url.searchParams.set('id', selectedItemId);\n          const detailUrl = `${url.pathname}${url.search}${url.hash}`;\n          window.history.replaceState(window.history.state, '', listUrl);\n          window.history.pushState(window.history.state, '', detailUrl);\n          didSeedListHistoryRef.current = true;\n          return;\n        } catch (e) {\n          didSeedListHistoryRef.current = true;\n        }\n      }\n      writeLiveUrl(selectedItemId, 'replace');\n    } else if (tab === 0) {\n      writeLiveUrl(null, 'replace');\n    }\n  }, [selectedItemId, tab, writeLiveUrl]);\n  const openStream = React.useCallback((id, mode = 'push') => {\n    if (!id) return;\n    const targetId = String(id);\n    const alreadyOpen = selectedStreamIdRef.current === targetId && tabRef.current === 1;\n    State.api?.live?.startWatching?.(targetId, 'live-open');\n    selectStreamId(targetId);\n    revealStreamTab();\n    writeLiveUrl(targetId, mode);\n    return !alreadyOpen;\n  }, [revealStreamTab, selectStreamId, writeLiveUrl]);\n  const onOpenStream = React.useCallback(item => {\n    const streamId = getStreamId(item);\n    if (!streamId) return;\n    const didOpen = openStream(streamId, 'push');\n    if (!didOpen) return;\n    State.anals.next({\n      name: 'live_stream_opened',\n      data: {\n        id: streamId\n      }\n    });\n  }, [openStream]);\n  const updateRouteId = React.useCallback(nextItem => {\n    const streamId = getStreamId(nextItem);\n    if (!streamId) return;\n    State.api?.live?.startWatching?.(streamId, 'live-swipe');\n    State.anals.next({\n      name: 'watch_stream_changed',\n      data: {\n        id: streamId\n      }\n    });\n    writeLiveUrl(streamId, 'replace');\n  }, [writeLiveUrl]);\n  const onWatchSwipe = React.useCallback(toItem => {\n    State.api?.live?.hideSwipeHint?.('swipe');\n    updateRouteId(toItem);\n  }, [updateRouteId]);\n  const showNextWatchStream = React.useCallback(() => {\n    watchNextPrev.next(true);\n  }, [watchNextPrev]);\n  const watchItemStyle = React.useMemo(() => ({\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    backgroundColor: '#04060F'\n  }), []);\n  const showAuthModal = React.useCallback((source = 'live') => {\n    if (!isGuest) return false;\n    State.api?.guest?.openRegisterSheet?.('restricted_action', source);\n    return true;\n  }, [isGuest]);\n  const renderWatchStream = React.useCallback(({\n    item,\n    active,\n    watchVisible,\n    isGuest: watchIsGuest,\n    onBack,\n    onRequireAuth\n  }) => {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: watchItemStyle\n    }, /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"WatchStream\",\n      item: item,\n      active: active,\n      visible: watchVisible,\n      renderMedia: true,\n      isGuest: watchIsGuest,\n      onBack: onBack,\n      onRequireAuth: onRequireAuth,\n      onNext: showNextWatchStream\n    }));\n  }, [showNextWatchStream, watchItemStyle]);\n  const handleTabBegin = React.useCallback(index => {\n    setChromeTabIndex(hasSelectedItem ? index : 0);\n  }, [hasSelectedItem, setChromeTabIndex]);\n  const handleTabFinish = React.useCallback(index => {\n    const next = hasSelectedItem ? index : 0;\n    setChromeTabIndex(next);\n    setRealTabIndex(next);\n  }, [hasSelectedItem, setChromeTabIndex, setRealTabIndex]);\n  const handleTabChange = React.useCallback(index => {\n    if (index === tabRef.current) return;\n    if (index === 0) {\n      goToList();\n      return;\n    }\n    const id = selectedItemId ?? getStreamId(watchItems[0]) ?? null;\n    if (id) {\n      openStream(id, 'push');\n    } else {\n      setRealTabIndex(0);\n      setTab(0);\n    }\n  }, [goToList, openStream, selectedItemId, setRealTabIndex, watchItems]);\n  const styles = React.useMemo(() => {\n    const colors = theme.theme;\n    const pageBg = colors.semantic?.surface?.regular?.pageBackground ?? '#FFFFFF';\n    return {\n      page: {\n        flex: 1,\n        width: '100%'\n      },\n      pageList: {\n        backgroundColor: pageBg\n      },\n      pageWatch: {\n        backgroundColor: '#04060F'\n      },\n      tabs: {\n        flex: 1,\n        width: '100%'\n      },\n      watchPage: {\n        flex: 1,\n        width: '100%',\n        height: '100%',\n        backgroundColor: '#04060F'\n      }\n    };\n  }, [theme]);\n  const pageStyle = React.useMemo(() => [styles.page, visibleChromeIndex === 1 ? styles.pageWatch : styles.pageList], [styles, visibleChromeIndex]);\n  const tabContent = React.useMemo(() => [/*#__PURE__*/React.createElement(LazyComponent, {\n    key: \"live-list\",\n    name: \"LiveGrid\",\n    active: visibleTab === 0,\n    isGuest: isGuest,\n    onOpen: onOpenStream,\n    onRequireAuth: showAuthModal\n  }), ...(selectedItem ? [/*#__PURE__*/React.createElement(ReactNative.View, {\n    key: \"live-watch\",\n    style: styles.watchPage\n  }, /*#__PURE__*/React.createElement(Components.DSTikTok, {\n    item: selectedItem,\n    data: watchData,\n    horizontalEnabled: false,\n    menuEnabled: false,\n    pageEnabled: false,\n    pullToRefreshThreshold: 86,\n    topPullIndicatorTopPadding: safeArea.top + 8,\n    bottomPullIndicatorTopPadding: Math.max(safeArea.bottom, 8) + 76,\n    windowSizeBottom: 1,\n    windowSizeTop: 1,\n    nextPrev: watchNextPrev,\n    Element: renderWatchStream,\n    watchVisible: isWatchVisible,\n    isGuest: isGuest,\n    onBack: goToList,\n    onRequireAuth: showAuthModal,\n    onSwipeNext: onWatchSwipe,\n    onSwipePrev: onWatchSwipe\n  }))] : [])], [visibleTab, isGuest, isWatchVisible, goToList, onOpenStream, showAuthModal, onWatchSwipe, renderWatchStream, safeArea.bottom, safeArea.top, selectedItem, styles, watchData, watchNextPrev]);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    testID: \"page_live\",\n    hide: chromeHidden,\n    tabbar: false,\n    edges: [],\n    keyboard: false,\n    overscroll: false,\n    style: pageStyle\n  }, /*#__PURE__*/React.createElement(Components.DSSwipeableTabs, {\n    selectedIndex: visibleTab,\n    keepAliveIndexes: keepAliveTabIndexes,\n    onBegin: handleTabBegin,\n    onFinish: handleTabFinish,\n    onSwipe: handleTabChange,\n    style: styles.tabs\n  }, tabContent));\n};"},"Subscriptions":{"name":"Subscriptions","key":"2e8974c7cac3cf74aac098ad94b16c639f45d252c367df55b30f43cffe24cb82","code":"deps: UserAppbar, SubscriptionsList, SubscriptionsMasonry, SkeletonRowGrid\nconst DSTabsHeader = Components.DSTabsHeader ?? React.Fragment;\nreturn () => {\n  State.useRequireSocketNavigation();\n  Navigation.useOverflowX?.();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const newSubscribersCount = State.api?.sub?.useNewSubscribersCount?.() ?? 0;\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: '100%',\n      alignSelf: 'center'\n    },\n    subContainer: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center'\n    },\n    padding: {\n      paddingVertical: 12,\n      paddingHorizontal: 12\n    },\n    badgeRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingVertical: 6,\n      paddingHorizontal: 12,\n      gap: 6,\n      height: 32,\n      minWidth: 40,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF',\n      borderRadius: 999\n    },\n    badgeDot: {\n      width: 6,\n      height: 6,\n      borderRadius: 3,\n      backgroundColor: theme.theme.semantic?.content?.positive?.content1 ?? '#24BC75'\n    },\n    badgeCountText: {\n      fontFamily: 'Inter',\n      fontWeight: '700',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F'\n    },\n    newSubsBadge: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 4,\n      paddingHorizontal: 10,\n      height: 24,\n      backgroundColor: theme.theme.component?.badge?.brand?.bg ?? '#FE375B',\n      borderRadius: 999,\n      transform: [{\n        translateY: -6\n      }]\n    },\n    newSubsBadgeText: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 12,\n      lineHeight: 12,\n      letterSpacing: -0.3,\n      color: theme.theme.component?.badge?.brand?.content ?? '#FFFFFF',\n      textAlign: 'center'\n    }\n  }), [theme]);\n  const [tab, setTab] = React.useState(0);\n  const sessionStartedAtRef = React.useRef(Date.now());\n  const tabRef = React.useRef(0);\n  const scrollDepthRef = React.useRef([0, 0]);\n  const cardsOpenedRef = React.useRef([0, 0]);\n  const exitReasonRef = React.useRef('new_page');\n  const sendSessionEnded = React.useCallback((exitReason = exitReasonRef.current) => {\n    State.anals.next({\n      name: 'subscriptions_session_ended',\n      data: {\n        subs_tab: tabRef.current === 1 ? 'subscribers' : 'Subscriptions',\n        scroll_depth: scrollDepthRef.current[tabRef.current] ?? 0,\n        cards_opened: cardsOpenedRef.current[tabRef.current] ?? 0,\n        session_length: Math.round(Date.now() - sessionStartedAtRef.current),\n        exit_reason: exitReason\n      }\n    });\n  }, []);\n  const resetSession = React.useCallback(nextTab => {\n    tabRef.current = nextTab;\n    sessionStartedAtRef.current = Date.now();\n    scrollDepthRef.current[nextTab] = 0;\n    cardsOpenedRef.current[nextTab] = 0;\n    exitReasonRef.current = 'new_page';\n  }, []);\n  React.useEffect(() => {\n    return () => {\n      sendSessionEnded();\n    };\n  }, [sendSessionEnded]);\n  const handleTabChange = React.useCallback(index => {\n    if (index !== tabRef.current) {\n      sendSessionEnded('new_page');\n      resetSession(index);\n    }\n    setTab(index);\n    if (index === 1 && newSubscribersCount > 0) {\n      State.api?.sub?.markNewSubscribersSeen?.();\n    }\n  }, [newSubscribersCount, resetSession, sendSessionEnded]);\n  const handleScrollDepthChange = React.useCallback(depth => {\n    scrollDepthRef.current[tabRef.current] = Math.max(scrollDepthRef.current[tabRef.current] ?? 0, depth);\n  }, []);\n  const handleCardOpen = React.useCallback(() => {\n    cardsOpenedRef.current[tabRef.current] = (cardsOpenedRef.current[tabRef.current] ?? 0) + 1;\n  }, []);\n  const handleMessageAttempt = React.useCallback(() => {\n    exitReasonRef.current = 'message_attempt';\n  }, []);\n  const badgeNode = React.useMemo(() => {\n    if (newSubscribersCount <= 0) return null;\n    const label = `+${newSubscribersCount > 99 ? '99' : newSubscribersCount}`;\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.newSubsBadge\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.newSubsBadgeText\n    }, label), /*#__PURE__*/React.createElement(Assets.SubscriptionsFill, {\n      size: 16,\n      style: {\n        color: styles.newSubsBadgeText.color\n      }\n    }));\n  }, [newSubscribersCount, styles]);\n  const tabs = React.useMemo(() => [{\n    id: 0,\n    label: t('subscriptionsTabFollowing')\n  }, {\n    id: 1,\n    label: t('subscriptionsTabFollowers'),\n    badge: badgeNode\n  }], [t, badgeNode]);\n  const renderTabsPlaceholder = React.useCallback(() => /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"SkeletonRowGrid\"\n  }), []);\n  const tabContent = React.useMemo(() => [/*#__PURE__*/React.createElement(LazyComponent, {\n    key: \"subscriptions-following\",\n    name: \"SubscriptionsList\",\n    onScrollDepthChange: handleScrollDepthChange,\n    onCardOpen: handleCardOpen,\n    onMessageAttempt: handleMessageAttempt\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    key: \"subscriptions-followers\",\n    name: \"SubscriptionsMasonry\",\n    onScrollDepthChange: handleScrollDepthChange,\n    onCardOpen: handleCardOpen,\n    onMessageAttempt: handleMessageAttempt\n  })], [handleCardOpen, handleMessageAttempt, handleScrollDepthChange]);\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    testID: \"page_subscriptions\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.subContainer, styles.padding]\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserAppbar\"\n  })), /*#__PURE__*/React.createElement(DSTabsHeader, {\n    style: styles.subContainer,\n    selectedIndex: tab,\n    onIndexChange: handleTabChange,\n    tabs: tabs\n  }), /*#__PURE__*/React.createElement(Components.DSSwipeableTabs, {\n    selectedIndex: tab,\n    onSwipe: handleTabChange,\n    style: {\n      height: '100%'\n    },\n    renderPlaceholder: renderTabsPlaceholder\n  }, tabContent)));\n};"},"SubPay":{"name":"SubPay","key":"6de3931d2dfabf68095458940c00c2bc0970fee72d7eae27f0acf2c12a136579","code":"deps: NeedBalanceModal;\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\n// --- Icons ---\n\nconst CloseIcon = ({\n  style,\n  fill\n}) => {\n  const c = fill || \"currentColor\";\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: c\n  }));\n};\nfunction _empty() {}\nconst DiamondIcon = ({\n  style,\n  size,\n  fill\n}) => {\n  const s = size || 16;\n  const c = fill || \"currentColor\";\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: s,\n    height: s,\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n    fill: c\n  }));\n};\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nconst CameraIcon = ({\n  style,\n  fill,\n  size\n}) => {\n  const c = fill || \"currentColor\";\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: size ?? 20,\n    height: size ?? 20,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M9.5 4C12.7873 4 14.4308 4.00037 15.5371 4.9082C15.7396 5.07442 15.9256 5.26035 16.0918 5.46289C16.9996 6.56924 17 8.21267 17 11.5V12.5C17 15.7873 16.9996 17.4308 16.0918 18.5371C15.9256 18.7396 15.7396 18.9256 15.5371 19.0918C14.4308 19.9996 12.7873 20 9.5 20C6.21267 20 4.56924 19.9996 3.46289 19.0918C3.26035 18.9256 3.07442 18.7396 2.9082 18.5371C2.00037 17.4308 2 15.7873 2 12.5V11.5C2 8.21267 2.00037 6.56924 2.9082 5.46289C3.07442 5.26035 3.26035 5.07442 3.46289 4.9082C4.56924 4.00037 6.21267 4 9.5 4Z\",\n    fill: c\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M17.6582 9.17059C19.6041 8.19765 20.5777 7.71139 21.2891 8.15106C22.0002 8.59084 22 9.67891 22 11.8542V12.1462C22 14.3214 22.0002 15.4096 21.2891 15.8493C20.5777 16.289 19.6041 15.8017 17.6582 14.8288L17 14.4997V9.49969L17.6582 9.17059Z\",\n    fill: c\n  }));\n};\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst ChatsIcon = ({\n  style,\n  fill,\n  size\n}) => {\n  const c = fill || \"currentColor\";\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: size ?? 20,\n    height: size ?? 20,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M10 6C14.4183 6 18 9.58172 18 14C18 18.4183 14.4183 22 10 22C8.7645 22 7.59445 21.7198 6.5498 21.2197C6.19076 21.0478 5.78396 20.9879 5.39941 21.0908L4.17383 21.4189C3.20749 21.6775 2.3225 20.7925 2.58105 19.8262L2.90918 18.6006C3.01207 18.216 2.95217 17.8092 2.78027 17.4502C2.28015 16.4056 2 15.2355 2 14C2 9.58172 5.58172 6 10 6ZM6.5 13C5.94772 13 5.5 13.4477 5.5 14C5.5 14.5523 5.94772 15 6.5 15C7.05228 15 7.5 14.5523 7.5 14C7.5 13.4477 7.05228 13 6.5 13ZM10 13C9.44772 13 9 13.4477 9 14C9 14.5523 9.44772 15 10 15C10.5523 15 11 14.5523 11 14C11 13.4477 10.5523 13 10 13ZM13.5 13C12.9477 13 12.5 13.4477 12.5 14C12.5 14.5523 12.9477 15 13.5 15C14.0523 15 14.5 14.5523 14.5 14C14.5 13.4477 14.0523 13 13.5 13Z\",\n    fill: c\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.6\",\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M15.5 2C19.0899 2 22 4.91015 22 8.5C22 9.50385 21.7726 10.4549 21.3662 11.3037C21.2267 11.5954 21.1772 11.926 21.2607 12.2383L21.5273 13.2344C21.7373 14.0195 21.0195 14.7374 20.2344 14.5273L19.2383 14.2607C18.9259 14.1772 18.5954 14.2266 18.3037 14.3662C18.1988 14.4164 18.0923 14.4641 17.9844 14.5088C17.9949 14.3407 18 14.1708 18 14C18 9.58172 14.4183 6 10 6C9.82926 6 9.65929 6.00508 9.49121 6.01562C10.4669 3.6583 12.79 2.00006 15.5 2Z\",\n    fill: c\n  }));\n};\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nconst SearchIcon = ({\n  style,\n  fill,\n  size\n}) => {\n  const c = fill || \"currentColor\";\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: size ?? 20,\n    height: size ?? 20,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M11.1562 2C16.2132 2 20.3133 6.09936 20.3135 11.1562C20.3135 16.2133 16.2133 20.3135 11.1562 20.3135C6.09936 20.3133 2 16.2132 2 11.1562C2.0002 6.09948 6.09948 2.0002 11.1562 2Z\",\n    fill: c\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M21.7886 20.7661C22.0709 21.0484 22.0709 21.5063 21.7886 21.7886C21.5063 22.0709 21.0484 22.0709 20.7661 21.7886L17.1001 18.1226C17.4671 17.8091 17.8091 17.4671 18.1226 17.1001L21.7886 20.7661Z\",\n    fill: c\n  }));\n};\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst HeartIcon = ({\n  style,\n  fill,\n  size\n}) => {\n  const c = fill || \"currentColor\";\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: size ?? 20,\n    height: size ?? 20,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M12 5.50044C16.4998 0.825276 22 4.27423 22 9.13716C21.9998 13.9999 17.9803 16.5912 15.0381 18.9106C13.9998 19.7291 13 20.4995 12 20.4995C11 20.4995 10.0002 19.7291 8.96191 18.9106C6.01967 16.5912 2.00015 13.9999 2 9.13716C2 4.27423 7.50016 0.825276 12 5.50044Z\",\n    fill: c\n  }));\n};\nconst PremiumActivatedIcon = ({\n  size\n}) => {\n  const s = size || 24;\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: s,\n    height: s,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M7.75681 7.03219C8.11101 6.94857 8.45748 7.02911 8.85056 7.25973L8.80075 7.50387L8.79978 7.5068L8.79782 7.51559L8.79001 7.5527C8.78336 7.5858 8.77423 7.63574 8.76169 7.70016C8.73662 7.82901 8.70062 8.0174 8.65818 8.25289C8.5732 8.7244 8.46168 9.38363 8.35642 10.1338C8.14379 11.6491 7.96358 13.4819 8.05564 14.8857C8.1114 15.7356 8.29403 16.8353 8.46775 17.7421C8.55376 18.1912 8.63634 18.5856 8.69724 18.8671C8.72764 19.0077 8.75221 19.1204 8.7695 19.1972L8.79001 19.2841L8.7949 19.3066L8.90134 19.7656L8.23728 19.9873C7.9695 20.0765 7.71416 20.1612 7.47165 20.2412L7.33493 19.6523L7.33298 19.6445L7.32712 19.6191L7.30661 19.5263C7.28845 19.4457 7.26187 19.3289 7.23044 19.1836C7.16763 18.8931 7.08284 18.4866 6.99411 18.0234C6.81826 17.1053 6.62165 15.9304 6.55954 14.9834C6.45689 13.4179 6.65593 11.459 6.87107 9.92574C6.97966 9.15186 7.09403 8.4723 7.18161 7.98629C7.22541 7.74327 7.26277 7.54798 7.28904 7.41305C7.30212 7.34583 7.31308 7.29364 7.32029 7.25777L7.32517 7.23141C7.33663 7.22306 7.34869 7.21489 7.36032 7.20699L7.4531 7.14938C7.54792 7.0968 7.64861 7.05774 7.75681 7.03219ZM12.9228 11.0781C12.9214 11.0825 12.9195 11.087 12.9179 11.0918C12.8983 11.1535 12.8701 11.245 12.8359 11.3593C12.7673 11.5885 12.6753 11.9095 12.584 12.2754C12.397 13.0241 12.2275 13.8977 12.2275 14.5556C12.2276 15.2134 12.397 16.0863 12.584 16.8349C12.6753 17.2007 12.7673 17.5218 12.8359 17.7509C12.8702 17.8653 12.8983 17.9567 12.9179 18.0185C12.9276 18.0491 12.9354 18.0724 12.9404 18.0879L12.9463 18.1054L12.9472 18.1093L13.039 18.3867L11.6162 18.8603L11.5244 18.583L11.5215 18.5742L11.5136 18.5517C11.5076 18.5331 11.4991 18.5058 11.4883 18.4716C11.4664 18.4029 11.4351 18.3043 11.3984 18.1816C11.3249 17.9359 11.2271 17.5914 11.1289 17.1982C10.9368 16.4292 10.7276 15.4072 10.7275 14.5556C10.7275 13.7039 10.9368 12.6812 11.1289 11.9121C11.227 11.5191 11.3249 11.1754 11.3984 10.9296C11.4352 10.8067 11.4664 10.7075 11.4883 10.6386C11.4991 10.6044 11.5076 10.5772 11.5136 10.5586L11.5215 10.5371L11.5234 10.5302V10.5283C11.5235 10.5282 11.5315 10.5307 12.2353 10.7646L11.5244 10.5283L11.7353 9.89059L12.9228 11.0781ZM19.3369 12.6289C20.0697 11.9791 21.1134 11.8146 22.0107 12.207L22.3027 12.3339C22.6821 12.5 22.8553 12.9428 22.6894 13.3222C22.5235 13.7017 22.0806 13.8749 21.7011 13.7089L21.4101 13.581C21.0484 13.4229 20.6274 13.49 20.332 13.7519C19.5228 14.4693 18.3448 14.5885 17.4082 14.0478L17.1953 13.9248C16.8368 13.7177 16.714 13.259 16.9209 12.9004C17.128 12.5417 17.5866 12.4189 17.9453 12.6259L18.1582 12.748C18.5357 12.966 19.0107 12.9181 19.3369 12.6289ZM19.0097 7.38277C19.4769 6.91567 20.1053 6.74319 20.6592 6.99898C21.0792 7.19301 21.353 7.58522 21.456 8.06734C21.9383 8.1703 22.3313 8.44409 22.5254 8.86422C22.7811 9.41807 22.6077 10.0466 22.1406 10.5136C21.8697 10.7845 21.5068 10.9073 21.1836 10.9648C20.8529 11.0236 20.5034 11.0254 20.1972 11.0058C19.888 10.986 19.6044 10.943 19.3994 10.9062C19.2964 10.8877 19.2119 10.8703 19.1523 10.8574C19.1225 10.8509 19.0987 10.8456 19.082 10.8418L19.0625 10.8369L19.0566 10.8359H19.0547L19.0537 10.8349C18.8736 10.7903 18.733 10.6497 18.6884 10.4697L19.1738 10.3496C18.7293 10.4596 18.6916 10.4681 18.6884 10.4687L18.6875 10.4668L18.6865 10.4609L18.6816 10.4414C18.6777 10.4247 18.6725 10.4008 18.666 10.3711C18.653 10.3115 18.6357 10.2269 18.6172 10.124C18.5803 9.91897 18.5383 9.63534 18.5185 9.32613C18.4989 9.01992 18.4998 8.67046 18.5586 8.33981C18.6161 8.01654 18.7389 7.65365 19.0097 7.38277ZM12.1582 7.17867C12.3676 6.96924 12.7075 6.96931 12.917 7.17867C13.1264 7.38814 13.1264 7.72799 12.917 7.93746C12.7075 8.14691 12.3676 8.14692 12.1582 7.93746C11.9488 7.72799 11.9488 7.38811 12.1582 7.17867ZM9.15622 2.40914C9.37235 2.05598 9.83417 1.94511 10.1875 2.16109C10.5408 2.37718 10.6525 2.83899 10.4365 3.19234C10.2798 3.44874 10.3188 3.77865 10.5312 3.99117L10.6289 4.08981C11.2174 4.67846 11.4352 5.543 11.1943 6.33981C11.0744 6.73628 10.6552 6.96063 10.2588 6.84078C9.86233 6.72089 9.63795 6.30169 9.75779 5.90523C9.83852 5.6378 9.76581 5.34794 9.56833 5.15035L9.47068 5.05172C8.76825 4.34919 8.63804 3.25677 9.15622 2.40914ZM13.1611 2.07906C13.426 1.93984 13.6787 2.01414 13.8281 2.07906C13.9604 2.13663 14.1096 2.22989 14.248 2.31734L14.3506 2.38277L14.4765 2.34664C14.64 2.30011 14.8118 2.25138 14.9551 2.23238C15.1067 2.21229 15.3829 2.20247 15.6025 2.42184C15.8223 2.6416 15.8131 2.9186 15.7929 3.07027C15.7739 3.21356 15.7252 3.38527 15.6787 3.54879L15.6426 3.67477L15.707 3.77731C15.7945 3.91587 15.8887 4.06481 15.9463 4.19723C16.0111 4.34653 16.0852 4.59854 15.9463 4.86324C15.8097 5.12308 15.5647 5.20873 15.4092 5.2441C15.2676 5.27628 15.0902 5.2906 14.9218 5.30367L14.7949 5.31344L14.7842 5.31441L14.6924 5.42574C14.5827 5.55899 14.4685 5.6968 14.3613 5.79488C14.2477 5.89881 14.0345 6.05922 13.7373 6.01852C13.43 5.97643 13.2705 5.7543 13.1933 5.6152C13.1235 5.48925 13.0619 5.32341 13.0049 5.16891L12.9648 5.05953L12.8564 5.01949C12.702 4.96253 12.5361 4.90179 12.4101 4.83199C12.2711 4.75488 12.048 4.59525 12.0058 4.28805C11.9651 3.99081 12.1255 3.77667 12.2295 3.66305C12.3276 3.55583 12.4663 3.4426 12.5996 3.33297L12.7109 3.24117L12.7119 3.23043L12.7217 3.1025C12.7347 2.93433 12.7491 2.75763 12.7812 2.61617C12.8166 2.46066 12.9015 2.21566 13.1611 2.07906Z\",\n    fill: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M7.75731 7.03225C8.66348 6.81852 9.5202 7.67501 11.2329 9.38771L14.6118 12.7666C16.3245 14.4794 17.1812 15.336 16.9673 16.2422C16.7533 17.1484 15.6039 17.531 13.3061 18.2969L8.23778 19.9863C5.47267 20.9081 4.08979 21.3692 3.35985 20.6397C2.62998 19.9098 3.09041 18.5271 4.01219 15.7617L5.70165 10.6934C6.46766 8.39534 6.85105 7.24618 7.75731 7.03225ZM16.8081 5.33205C16.8893 4.92599 17.2839 4.66215 17.6899 4.74318C18.0961 4.82442 18.36 5.21983 18.2788 5.626L18.1343 6.34572C17.9361 7.33647 17.2226 8.14529 16.2641 8.46486C15.8162 8.61417 15.4827 8.99212 15.3901 9.4551L15.2456 10.1748C15.1644 10.5808 14.7698 10.8446 14.3638 10.7637C13.9576 10.6825 13.6937 10.287 13.7749 9.88088L13.9194 9.16115C14.1176 8.17037 14.831 7.36156 15.7895 7.04201C16.2374 6.89271 16.5709 6.51472 16.6636 6.05178L16.8081 5.33205ZM6.92919 3.96291C7.13866 3.75351 7.47755 3.75348 7.687 3.96291C7.89645 4.17236 7.8964 4.51125 7.687 4.72072C7.47753 4.93019 7.13866 4.93019 6.92919 4.72072C6.71973 4.51125 6.71972 4.17237 6.92919 3.96291Z\",\n    fill: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.7\",\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M19.0584 15.3356C19.2679 15.1262 19.6077 15.1262 19.8172 15.3356C20.0261 15.545 20.0261 15.8841 19.8172 16.0934C19.6077 16.3029 19.2679 16.3029 19.0584 16.0934C18.849 15.884 18.849 15.5451 19.0584 15.3356Z\",\n    fill: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.2\",\n    d: \"M17.1581 10.1791C17.3675 9.96961 17.7072 9.96961 17.9166 10.1791C18.1261 10.3885 18.1261 10.7282 17.9166 10.9376C17.7072 11.1471 17.3675 11.1471 17.1581 10.9376C16.9486 10.7282 16.9486 10.3885 17.1581 10.1791Z\",\n    fill: \"#1C274C\"\n  }));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\n\n/** Strip leading minus/dash (API / legacy); Figma discount row has no minus before % */\nconst formatPlanDiscountBadge = raw => {\n  if (raw == null || raw === '') return null;\n  const s = String(raw).replace(/^[\\s\\u2212\\u2013\\u2014\\u002D\\uFF0D]+/, '').trim();\n  return s.length ? s : null;\n};\nconst getMonthLabel = (months, t) => {\n  const lastTwo = months % 100;\n  const lastOne = months % 10;\n  if (lastTwo >= 11 && lastTwo <= 19) return t('subPayMonth_5');\n  if (lastOne === 1) return t('subPayMonth_1');\n  if (lastOne >= 2 && lastOne <= 4) return t('subPayMonth_2');\n  return t('subPayMonth_5');\n};\n\n// --- Feature list (shared across all variants) ---\n\nconst getFeatures = t => [{\n  key: 'noWait',\n  Icon: CameraIcon,\n  title: t('subPayNoWaitingTitle'),\n  description: t('subPayNoWaitingDesc')\n}, {\n  key: 'freeMsg',\n  Icon: ChatsIcon,\n  title: t('subPayFreeMessagesTitle'),\n  description: t('subPayFreeMessagesDesc')\n}, {\n  key: 'filters',\n  Icon: SearchIcon,\n  title: t('subPayFiltersTitle'),\n  description: t('subPayFiltersDesc')\n}, {\n  key: 'followers',\n  Icon: HeartIcon,\n  title: t('subPayFollowersTitle'),\n  description: t('subPayFollowersDesc')\n}];\nconst FeatureRow = ({\n  feature,\n  styles,\n  variant\n}) => {\n  const Icon = feature.Icon;\n  if (variant === 'wide') {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.featureWideSlot\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.featureWideText\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.featureTitle\n    }, feature.title), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.featureDescription\n    }, feature.description)), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.featureWideIconWrap\n    }, /*#__PURE__*/React.createElement(Icon, {\n      size: 24,\n      fill: styles.featureIcon.color\n    })));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.featureRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.featureIconCircle\n  }, /*#__PURE__*/React.createElement(Icon, {\n    size: 24,\n    fill: styles.featureIcon.color\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.featureTextContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.featureTitle\n  }, feature.title), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.featureDescription\n  }, feature.description)));\n};\nconst FeaturesList = ({\n  styles,\n  order,\n  t,\n  layoutWide\n}) => {\n  const features = getFeatures(t);\n  const ordered = order ? order.map(k => features.find(f => f.key === k)).filter(Boolean) : features;\n  const v = layoutWide ? 'wide' : 'compact';\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: layoutWide ? styles.featuresWideContainer : styles.featuresContainer\n  }, ordered.map(feature => /*#__PURE__*/React.createElement(FeatureRow, {\n    key: feature.key,\n    feature: feature,\n    styles: styles,\n    variant: v\n  })));\n};\n\n// --- Navbar (shared) — on page background (Figma) ---\n\n// App bar (Figma 10431:49702): title absolute centered; trailing row = [flex spacer] + [close]\nconst Navbar = ({\n  onClose,\n  styles,\n  t\n}) => {\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.navbar\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.navLeadSpacer\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.navTrailing\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onClose,\n    style: styles.navCloseBtn\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    fill: styles.navTitleColor\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\",\n    style: styles.navTitleOverlay\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.navTitle\n  }, t('subPayGetPremium'))));\n};\n\n/** Full exported hero collage (premium-paywall-4); no layered assembly */\nconst PREMIUM_HERO_ASPECT = 1024 / 615;\n\n/** Wide features tiles (Figma 10431:274491 — tablet/desktop); width-only breakpoint, aligns with Chat split at 960 */\nconst SUBPAY_FEATURES_WIDE_MIN_WIDTH = 960;\nconst PremiumHeroArt = ({\n  styles\n}) => {\n  const heroUri = State.getUrl('/api/component/assets/store/premium-paywall-hero.webp');\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.heroArt\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    source: heroUri,\n    style: styles.heroCompositeImage,\n    contentFit: \"contain\",\n    accessibilityIgnoresInvertColors: true\n  }));\n};\n\n// ============================================================\n// Top section variants (only `top` param, no mid/bot)\n// ============================================================\n\nconst TopHeroBanner = ({\n  styles,\n  onClose,\n  t\n}) => {\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.hero\n  }, /*#__PURE__*/React.createElement(Navbar, {\n    onClose: onClose,\n    styles: styles,\n    t: t\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.heroContent\n  }, /*#__PURE__*/React.createElement(PremiumHeroArt, {\n    styles: styles\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.heroTextBlock\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.heroSubtitle\n  }, t('subPayBetterMatches')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.heroTitle\n  }, t('subPayCamblePremium')))));\n};\nconst TopOfferBanner = ({\n  styles,\n  onClose,\n  t\n}) => {\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.hero\n  }, /*#__PURE__*/React.createElement(Navbar, {\n    onClose: onClose,\n    styles: styles,\n    t: t\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.heroContent\n  }, /*#__PURE__*/React.createElement(PremiumHeroArt, {\n    styles: styles\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.heroTextBlock\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.heroTitle\n  }, t('subPayCamblePremium')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.heroOfferInline,\n    numberOfLines: 2\n  }, t('subPayOfferBadge')))));\n};\nconst TopFollowers = ({\n  styles,\n  onClose,\n  t\n}) => {\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.hero\n  }, /*#__PURE__*/React.createElement(Navbar, {\n    onClose: onClose,\n    styles: styles,\n    t: t\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.heroContent\n  }, /*#__PURE__*/React.createElement(PremiumHeroArt, {\n    styles: styles\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.heroTextBlock\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.heroTitleBig\n  }, t('subPaySeeFollowers')))));\n};\n\n// ============================================================\n// Plan selector — same column width as features; tiles share row width equally\n// ============================================================\n\nconst PlanSelector = ({\n  products,\n  selectedProduct,\n  setSelectedProduct,\n  styles,\n  theme,\n  t\n}) => {\n  const [containerWidth, setContainerWidth] = React.useState(0);\n  if (!products?.length) return null;\n  const brandColor = theme.theme.semantic.content.brand.content1;\n  const defaultBadges = [t('subPayBadge1'), t('subPayBadge2'), t('subPayBadge3')];\n  const planGap = styles.planCardsGap;\n  const planSidePadding = styles.planSelectorSidePadding;\n  const cardsWidth = Math.max(0, containerWidth - planSidePadding * 2);\n  const cardWidth = products.length > 0 && cardsWidth > 0 ? (cardsWidth - planGap * (products.length - 1)) / products.length : null;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.planSelectorContainer,\n    onLayout: event => setContainerWidth(event.nativeEvent.layout.width)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.planCards, cardsWidth > 0 ? {\n      width: cardsWidth\n    } : null]\n  }, products.map((p, idx) => {\n    const isSelected = selectedProduct?.uid === p.uid;\n    const months = p.effect || 1;\n    const perMonth = months > 0 ? Math.round(p.price / months) : p.price;\n    const rawBadge = p.discount || defaultBadges[idx] || null;\n    const badgeText = formatPlanDiscountBadge(rawBadge);\n    return /*#__PURE__*/React.createElement(Components.DSPressable, {\n      key: p.uid,\n      feedback: true,\n      style: [styles.planCard, cardWidth != null ? {\n        flex: 0,\n        flexGrow: 0,\n        flexShrink: 0,\n        flexBasis: cardWidth,\n        width: cardWidth,\n        height: styles.planCardHeight\n      } : null, isSelected ? styles.planCardSelected : styles.planCardDefault],\n      onPress: () => setSelectedProduct(p)\n    }, !!badgeText && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.planBadge, isSelected ? styles.planBadgeSelected : styles.planBadgeDefault]\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.planBadgeText, isSelected ? styles.planBadgeTextSelected : styles.planBadgeTextDefault],\n      numberOfLines: 1,\n      ellipsizeMode: \"tail\"\n    }, badgeText)), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.planCardBody\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.planDuration\n    }, months, \" \", getMonthLabel(months, t)), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.planPriceBlock\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.planPriceRow\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.planPrice, isSelected ? styles.planPriceSelected : null]\n    }, formatWithSpaces(perMonth)), /*#__PURE__*/React.createElement(DiamondIcon, {\n      fill: isSelected ? brandColor : styles.planDiamondMutedColor,\n      size: 16\n    })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.planPerMonth\n    }, idx === 0 ? t('subPayFirstMonth') : t('subPayMonthShort')))));\n  })));\n};\n\n// ============================================================\n// Bottom CTA\n// ============================================================\n\nconst BottomCTA = ({\n  selectedProduct,\n  onBuy,\n  styles,\n  t\n}) => {\n  const price = selectedProduct?.price ? formatWithSpaces(selectedProduct.price) : '---';\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomContainer\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    style: styles.bottomButton,\n    size: \"L\",\n    feedback: true,\n    onPress: onBuy\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomButtonBody\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.bottomButtonText\n  }, t('subPayGetPremium')), /*#__PURE__*/React.createElement(DiamondIcon, {\n    fill: styles.bottomButtonTextColor,\n    size: 24\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.bottomButtonText\n  }, price))));\n};\n\n// ============================================================\n// Notifications\n// ============================================================\n\nconst PurchaseSuccessNotification = () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 8,\n      width: 250,\n      maxWidth: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(PremiumActivatedIcon, {\n    size: 24\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700\n    }\n  }, t('subPayPurchaseSuccessTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentSecondary,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 500\n    }\n  }, t('subPayPurchaseSuccessDesc'))));\n};\nconst PurchaseErrorNotification = ({\n  errorText\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 8,\n      width: 250,\n      maxWidth: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Assets.ExclamationDown, {\n    style: {\n      color: theme.theme.component.toast.dangerous.content\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentPrimary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700\n    }\n  }, t('subPayPurchaseErrorTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.component.toast.contentSecondary,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 500\n    }\n  }, errorText)));\n};\n\n// ============================================================\n// Main screen\n// ============================================================\n\nconst SubPay = ({\n  products,\n  isModal,\n  top,\n  onClose,\n  onSuccessClose\n}) => {\n  State.useRequireSocket();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const t = Locale.useTranslation();\n  const {\n    width: windowWidth\n  } = ReactNative.useWindowDimensions();\n  const featuresLayoutWide = windowWidth >= SUBPAY_FEATURES_WIDE_MIN_WIDTH;\n  top = Number(top) || 1;\n  const [selectedProduct, setSelectedProduct] = React.useState(null);\n  React.useEffect(() => {\n    if (!selectedProduct && products?.length) {\n      setSelectedProduct(products[0]);\n    }\n  }, [products]);\n  const onBuy = React.useCallback(_async(function () {\n    if (!selectedProduct?.uid) return;\n    return _continueIgnored(_catch(function () {\n      return _await(State.ackSocket(\"payment:buy\", {\n        id: selectedProduct.uid\n      }), function (result) {\n        return _invokeIgnored(function () {\n          if (result != null && result?.error == null) {\n            return _await(State.api?.products?.loadProducts?.(), function () {\n              Notification.showNotification({\n                children: /*#__PURE__*/React.createElement(PurchaseSuccessNotification, null),\n                duration: 3000\n              });\n              onSuccessClose();\n            });\n          } else if (result?.error && /not enough/i.test(result.error)) {\n            if (State.state.session.value?.subscription?.hasSubscription) {\n              State.anals.next({\n                name: 'premium_action',\n                data: {\n                  limit_type_hit: 'subscription_purchase'\n                }\n              });\n            }\n            Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n              name: \"NeedBalanceModal\",\n              source: \"sub_pay\"\n            }), {\n              theme: Theme?.isDark?.value ? 'dark' : 'light',\n              props: {\n                holderMode: true,\n                style: {\n                  maxWidth: 600\n                }\n              }\n            });\n          } else if (result?.error) {\n            Notification.showNotification({\n              children: /*#__PURE__*/React.createElement(PurchaseErrorNotification, {\n                errorText: result.error\n              }),\n              duration: 5000\n            });\n          }\n        });\n      });\n    }, function (error) {\n      Notification.showNotification({\n        children: /*#__PURE__*/React.createElement(PurchaseErrorNotification, {\n          errorText: error.message\n        }),\n        duration: 5000\n      });\n    }));\n  }), [selectedProduct, onSuccessClose]);\n  const brandColor = theme.theme.semantic.content.brand.content1;\n  const cardBg = theme.theme.semantic.surface.regular.surface1;\n  const styles = React.useMemo(() => ({\n    wrapper: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center',\n      flex: 1,\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground,\n      paddingTop: 0,\n      paddingBottom: isModal ? Math.max(safeArea.bottom, 12) : 0,\n      paddingLeft: 0,\n      paddingRight: 0\n    },\n    content: {\n      flex: 1\n    },\n    spacer: {\n      flex: 1,\n      minHeight: 8\n    },\n    // Navbar\n    navbar: {\n      width: '100%',\n      maxWidth: 600,\n      alignSelf: 'center',\n      flexDirection: 'row',\n      flexWrap: 'nowrap',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      paddingTop: safeArea.top,\n      height: 48 + safeArea.top,\n      position: 'relative'\n    },\n    navLeadSpacer: {\n      flex: 1,\n      minHeight: 24,\n      minWidth: 0\n    },\n    navTrailing: {\n      flexShrink: 0,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end'\n    },\n    navCloseBtn: {\n      width: 44,\n      height: 44,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    navTitleOverlay: {\n      position: 'absolute',\n      left: 56,\n      right: 56,\n      top: safeArea.top,\n      height: 48,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    navTitle: {\n      textAlign: 'center',\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      letterSpacing: -0.3\n    },\n    navTitleColor: theme.theme.semantic.content.regular.primary,\n    // Hero (Figma collage on page background)\n    hero: {\n      alignItems: 'center',\n      width: '100%'\n    },\n    heroContent: {\n      alignItems: 'center',\n      width: '100%',\n      gap: 0\n    },\n    heroArt: {\n      width: 356,\n      maxWidth: '100%',\n      marginTop: 8,\n      alignSelf: 'center',\n      aspectRatio: PREMIUM_HERO_ASPECT\n    },\n    heroCompositeImage: {\n      width: '100%',\n      height: '100%'\n    },\n    heroTextBlock: {\n      width: '100%',\n      paddingHorizontal: 16,\n      alignItems: 'center',\n      marginTop: 10\n    },\n    heroTitle: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.display,\n      fontSize: 36,\n      lineHeight: 44,\n      fontWeight: 600,\n      textAlign: 'center',\n      letterSpacing: -0.7\n    },\n    heroTitleBig: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.display,\n      fontSize: 32,\n      lineHeight: 40,\n      fontWeight: 600,\n      textAlign: 'center',\n      letterSpacing: -0.6\n    },\n    heroSubtitle: {\n      color: brandColor,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 18,\n      lineHeight: 26,\n      fontWeight: 500,\n      textAlign: 'center',\n      letterSpacing: -0.3\n    },\n    heroOfferInline: {\n      marginTop: 8,\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 15,\n      lineHeight: 22,\n      fontWeight: 500,\n      textAlign: 'center',\n      letterSpacing: -0.2,\n      paddingHorizontal: 8\n    },\n    // Features list (below pack selector per Figma)\n    featuresContainer: {\n      paddingHorizontal: 20,\n      gap: 12,\n      paddingTop: 24,\n      paddingBottom: 8,\n      width: '100%',\n      maxWidth: 600,\n      alignSelf: 'center'\n    },\n    featureRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    featureIconCircle: {\n      width: 48,\n      height: 48,\n      borderRadius: 999,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    featureIcon: {\n      color: brandColor\n    },\n    featureTextContainer: {\n      flex: 1\n    },\n    featureTitle: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      fontWeight: 700,\n      lineHeight: 22,\n      letterSpacing: -0.3\n    },\n    featureDescription: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      fontWeight: '500',\n      lineHeight: 20,\n      letterSpacing: -0.2\n    },\n    // Features wide tablet/desktop (Figma 10431:274491 — surface slots + trailing icon)\n    featuresWideContainer: {\n      paddingHorizontal: 20,\n      gap: 8,\n      paddingTop: 24,\n      paddingBottom: 8,\n      width: '100%',\n      maxWidth: 600,\n      alignSelf: 'center'\n    },\n    featureWideSlot: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      alignSelf: 'stretch',\n      padding: 16,\n      borderRadius: 24,\n      backgroundColor: cardBg\n    },\n    featureWideText: {\n      flex: 1,\n      minWidth: 0\n    },\n    featureWideIconWrap: {\n      width: 48,\n      height: 48,\n      borderRadius: 999,\n      alignItems: 'center',\n      justifyContent: 'center',\n      flexShrink: 0\n    },\n    // Plan selector — same content column width as features list (maxWidth 600, horizontal 20)\n    planSelectorSidePadding: 20,\n    planCardsGap: 8,\n    planSelectorContainer: {\n      paddingTop: 16,\n      paddingHorizontal: 20,\n      width: '100%',\n      maxWidth: 600,\n      alignSelf: 'center'\n    },\n    planCards: {\n      flexDirection: 'row',\n      gap: 8,\n      alignSelf: 'center',\n      paddingTop: 4,\n      paddingBottom: 12\n    },\n    // Plan card\n    planCardHeight: 116,\n    planCard: {\n      flex: 1,\n      minWidth: 0,\n      borderRadius: 16,\n      overflow: 'hidden',\n      alignItems: 'center',\n      backgroundColor: cardBg,\n      height: 116,\n      minHeight: 116,\n      maxHeight: 116,\n      shadowColor: '#04060F',\n      shadowOffset: {\n        width: 0,\n        height: 8\n      },\n      shadowOpacity: 0.03,\n      shadowRadius: 20,\n      elevation: 2\n    },\n    planCardBody: {\n      flexShrink: 0,\n      width: '100%',\n      alignItems: 'center',\n      paddingHorizontal: 4,\n      paddingVertical: 12,\n      gap: 6\n    },\n    planCardDefault: {\n      borderWidth: 0\n    },\n    planCardSelected: {\n      borderWidth: 1,\n      borderColor: brandColor\n    },\n    // Plan badge\n    planBadge: {\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 2,\n      paddingTop: 6,\n      paddingBottom: 4\n    },\n    planBadgeSelected: {\n      backgroundColor: brandColor\n    },\n    planBadgeDefault: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface3\n    },\n    planBadgeText: {\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 700,\n      letterSpacing: -0.2\n    },\n    planBadgeTextSelected: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary\n    },\n    planBadgeTextDefault: {\n      color: theme.theme.semantic.content.regular.primary\n    },\n    planDuration: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700,\n      letterSpacing: -0.2\n    },\n    planPriceBlock: {\n      width: '100%',\n      alignItems: 'center'\n    },\n    planPriceRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 2,\n      width: '100%'\n    },\n    planPrice: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700,\n      letterSpacing: -0.2\n    },\n    planPriceSelected: {\n      color: brandColor\n    },\n    planDiamondMutedColor: theme.theme.semantic.content.regular.secondary,\n    planPerMonth: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      textAlign: 'center',\n      width: '100%'\n    },\n    // Bottom CTA\n    bottomContainer: {\n      paddingHorizontal: 16,\n      paddingTop: 32,\n      paddingBottom: Math.max(safeArea.bottom, 24),\n      alignItems: 'center'\n    },\n    bottomButton: {\n      width: '100%',\n      maxWidth: 600,\n      borderRadius: 12\n    },\n    bottomButtonBody: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    bottomButtonText: {\n      color: theme.theme.component.button.brand.content,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.16\n    },\n    bottomButtonTextColor: theme.theme.component.button.brand.content\n  }), [theme, safeArea, cardBg, brandColor, isModal]);\n  const renderTop = () => {\n    switch (top) {\n      case 2:\n        return /*#__PURE__*/React.createElement(TopOfferBanner, {\n          styles: styles,\n          onClose: onClose,\n          t: t\n        });\n      case 3:\n        return /*#__PURE__*/React.createElement(TopFollowers, {\n          styles: styles,\n          onClose: onClose,\n          t: t\n        });\n      case 1:\n      default:\n        return /*#__PURE__*/React.createElement(TopHeroBanner, {\n          styles: styles,\n          onClose: onClose,\n          t: t\n        });\n    }\n  };\n  const featureOrder = top === 3 ? ['followers', 'noWait', 'freeMsg', 'filters'] : undefined;\n  const child = /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.wrapper\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, renderTop(), /*#__PURE__*/React.createElement(PlanSelector, {\n    products: products,\n    selectedProduct: selectedProduct,\n    setSelectedProduct: setSelectedProduct,\n    styles: styles,\n    theme: theme,\n    t: t\n  }), /*#__PURE__*/React.createElement(FeaturesList, {\n    styles: styles,\n    order: featureOrder,\n    t: t,\n    layoutWide: featuresLayoutWide\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.spacer\n  }), /*#__PURE__*/React.createElement(BottomCTA, {\n    selectedProduct: selectedProduct,\n    onBuy: onBuy,\n    styles: styles,\n    t: t\n  })));\n  if (isModal) return child;\n  return /*#__PURE__*/React.createElement(Components.DSPage, {\n    scrollable: true,\n    edges: [],\n    hide: true,\n    overscroll: false,\n    testID: \"page_subPay\"\n  }, child);\n};\nconst SubPayModal = ({\n  products,\n  top\n}) => {\n  const sheet = Sheet.useSheet();\n  const onClose = React.useCallback(() => {\n    sheet?.close();\n  }, []);\n  const onSuccessClose = React.useCallback(() => {\n    sheet?.close();\n  }, []);\n  return /*#__PURE__*/React.createElement(SubPay, {\n    products: products,\n    top: top,\n    onClose: onClose,\n    onSuccessClose: onSuccessClose,\n    isModal: true\n  });\n};\nconst SubPayPage = ({\n  products\n}) => {\n  const route = ReactNavigation.useRoute?.();\n  const params = route?.params ?? {};\n  const top = Number(params.top) || 1;\n  const onClose = React.useCallback(() => {\n    if (Navigation.navigationRef.current?.canGoBack()) {\n      Navigation.navigationRef.current?.goBack();\n    } else {\n      Navigation.goto({\n        name: 'Random'\n      });\n    }\n  }, []);\n  const onSuccessClose = React.useCallback(() => {\n    if (Navigation.navigationRef.current?.canGoBack()) {\n      Navigation.navigationRef.current?.goBack();\n    } else {\n      Navigation.goto({\n        name: 'Profile'\n      });\n    }\n  }, []);\n  return /*#__PURE__*/React.createElement(SubPay, {\n    products: products,\n    top: top,\n    onClose: onClose,\n    onSuccessClose: onSuccessClose,\n    isModal: false\n  });\n};\nreturn ({\n  isModal,\n  top\n}) => {\n  const products = State.api?.products?.useProducts?.() ?? [];\n  return isModal ? /*#__PURE__*/React.createElement(SubPayModal, {\n    products: products,\n    top: top\n  }) : /*#__PURE__*/React.createElement(SubPayPage, {\n    products: products\n  });\n};"},"WebAppbar":{"name":"WebAppbar","key":"aae44d9ad68c6122a5a92b3b6e7c1360e331df4f3484b54fdb862e37e8e8095a","code":"deps: WebAuthButtons, WebNavbar\nreturn () => {\n  const theme = Theme.useTheme();\n  const styles = {\n    appbarContainer: {\n      position: 'absolute',\n      flexDirection: 'row',\n      top: 0,\n      left: 0,\n      right: 0,\n      height: 90,\n      zIndex: 10,\n      paddingHorizontal: 16,\n      justifyContent: 'space-between'\n    },\n    subcontainer: {\n      flexDirection: 'row',\n      gap: 40,\n      paddingTop: 20,\n      paddingBottom: 16\n    }\n  };\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.appbarContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(Components.DSLogo, {\n    variant: \"full\",\n    colorScheme: theme.isDark ? 'pink-white' : 'pink-black',\n    width: 147,\n    height: 40\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WebNavbar\"\n  })), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WebAuthButtons\"\n  }));\n};"},"WebFooter":{"name":"WebFooter","key":"029d1d712cbe9f899fc1f1f6f09ccbee9b3bc6d61edddc1304b17df3086f784a","code":"deps: CameraBottomPanel\nfunction _empty() {}\nconst CloseCircleIcon = ({\n  style,\n  color\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Circle, {\n    cx: 12,\n    cy: 12,\n    r: 10,\n    fill: color,\n    opacity: 0.5\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M15 9L9 15M9 9L15 15\",\n    stroke: color,\n    strokeWidth: 2,\n    strokeLinecap: \"round\"\n  }));\n};\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst CameraIcon = ({\n  style,\n  color\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: 0.5,\n    d: \"M9.5 4C12.7873 4 14.4308 4.00037 15.5371 4.9082C15.7396 5.07442 15.9256 5.26035 16.0918 5.46289C16.9996 6.56924 17 8.21267 17 11.5V12.5C17 15.7873 16.9996 17.4308 16.0918 18.5371C15.9256 18.7396 15.7396 18.9256 15.5371 19.0918C14.4308 19.9996 12.7873 20 9.5 20C6.21267 20 4.56924 19.9996 3.46289 19.0918C3.26035 18.9256 3.07442 18.7396 2.9082 18.5371C2.00037 17.4308 2 15.7873 2 12.5V11.5C2 8.21267 2.00037 6.56924 2.9082 5.46289C3.07442 5.26035 3.26035 5.07442 3.46289 4.9082C4.56924 4.00037 6.21267 4 9.5 4Z\",\n    fill: color\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M17.6582 9.17065C19.6041 8.19771 20.5777 7.71145 21.2891 8.15112C22.0002 8.59091 22 9.67898 22 11.8542V12.1462C22 14.3215 22.0002 15.4096 21.2891 15.8494C20.5777 16.289 19.6041 15.8018 17.6582 14.8289L17 14.4998V9.49976L17.6582 9.17065Z\",\n    fill: color\n  }));\n};\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst ClockCircleIcon = ({\n  style,\n  color\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: 0.5,\n    d: \"M12 2C17.5228 2 22 6.47715 22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2Z\",\n    fill: color\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12 7.25C12.4142 7.25 12.75 7.58579 12.75 8V11.6895L15.0303 13.9697C15.3232 14.2626 15.3232 14.7374 15.0303 15.0303C14.7374 15.3232 14.2626 15.3232 13.9697 15.0303L11.4697 12.5303C11.3291 12.3896 11.25 12.1989 11.25 12V8C11.25 7.58579 11.5858 7.25 12 7.25Z\",\n    fill: color\n  }));\n};\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = {\n    footerContainer: {\n      position: 'absolute',\n      bottom: 0,\n      left: 0,\n      right: 0,\n      height: 90,\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      paddingHorizontal: 16\n    },\n    leftView: {\n      flex: 1,\n      alignItems: 'flex-start'\n    },\n    centerView: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    callHistoryButton: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      padding: 16,\n      gap: 8,\n      width: 56,\n      height: 56,\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.1),\n      opacity: 0.5,\n      borderRadius: 999,\n      marginLeft: 8\n    },\n    rightView: {\n      flex: 1,\n      alignItems: 'flex-end'\n    },\n    button: {\n      flexDirection: 'row',\n      justifyContent: 'flex-start',\n      alignItems: 'center',\n      paddingVertical: 16,\n      paddingHorizontal: 24,\n      gap: 8,\n      height: 56,\n      backgroundColor: Utils.withOpacity(theme.theme.component.button.secondary.bgDefault, 0.1),\n      borderRadius: 999,\n      alignSelf: 'flex-start'\n    },\n    buttonText: {\n      fontFamily: 'Geologica',\n      fontStyle: 'normal',\n      fontWeight: 600,\n      fontSize: 18,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: theme.theme.component.button.secondary.content\n    },\n    buttonPrimary: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 16,\n      paddingHorizontal: 24,\n      gap: 8,\n      height: 56,\n      backgroundColor: theme.theme.component.button.primary.bgDefault,\n      borderRadius: 999,\n      alignSelf: 'flex-end'\n    },\n    buttonTextPrimary: {\n      fontFamily: 'Geologica',\n      fontStyle: 'normal',\n      fontWeight: 600,\n      fontSize: 18,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: theme.theme.component.button.primary.content\n    }\n  };\n  const filterSheetOpen = React.useRef(false);\n  const openFilters = React.useCallback(_async(function () {\n    if (filterSheetOpen.current) return;\n    filterSheetOpen.current = true;\n    return _continueIgnored(_finallyRethrows(function () {\n      return _awaitIgnored(Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n        name: \"filter\"\n      }), {\n        theme: theme.isDark ? 'dark' : 'light',\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      }));\n    }, function (_wasThrown, _result) {\n      filterSheetOpen.current = false;\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [theme.isDark]);\n  const openCallHistory = React.useCallback(() => Sheet.showWebSheet(/*#__PURE__*/React.createElement(ReactNative.Text, null, \"600x600 Centered Modal\"), {\n    props: {\n      style: {\n        maxWidth: 600\n      }\n    }\n  }), []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.footerContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.leftView\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => {}\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.button\n  }, /*#__PURE__*/React.createElement(CloseCircleIcon, {\n    color: theme.theme.component.button.secondary.content\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t(\"webEndVideoChat\"))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.centerView\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CameraBottomPanelWeb\"\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => {}\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.callHistoryButton\n  }, /*#__PURE__*/React.createElement(ClockCircleIcon, {\n    color: theme.theme.component.button.secondary.content\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rightView\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => {\n      openCallHistory();\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonPrimary\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextPrimary\n  }, t(\"webStartVideoChat\")), /*#__PURE__*/React.createElement(CameraIcon, {\n    color: theme.theme.component.button.primary.content\n  })))));\n};"},"WebNoCameraBanner":{"name":"WebNoCameraBanner","key":"d52e0929b4c0b994922899588e9539b79d02c128a6bc21d33ebf8959c7a89059","code":"const LogoIcon = ({\n  fill,\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 444,\n    height: 444,\n    viewBox: \"0 0 444 444\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M165.906 71.8235C189.468 71.824 209.763 79.9972 224.562 93.6565L224.568 93.6627C244.341 111.917 254.298 139.969 249.086 171.432L242.449 211.476C265.065 198.891 282.514 176.262 286.794 150.434L298.989 76.8243H437.471L429.912 122.401C420.824 177.263 369.06 221.767 314.167 221.997H413.435L388.557 372.176H278.125C223.075 372.175 185.832 327.58 194.944 272.568L201.575 232.505C178.944 245.087 161.487 267.731 157.206 293.572L145.017 367.176H6.52942L14.0819 321.599C23.1931 266.595 75.209 222.004 130.26 222.003H30.6021L55.4739 71.8235H165.906Z\",\n    fill: fill\n  }));\n};\nconst RecordingIcon = ({\n  style\n}) => {\n  const scaleAnim = React.useRef(new ReactNative.Animated.Value(1)).current;\n  const useNativeDriver = ReactNative.Platform.OS !== 'web';\n  React.useEffect(() => {\n    const pulse = () => {\n      ReactNative.Animated.sequence([ReactNative.Animated.timing(scaleAnim, {\n        toValue: 1,\n        duration: 800,\n        easing: ReactNative.Easing.out(ReactNative.Easing.quad),\n        useNativeDriver\n      }), ReactNative.Animated.timing(scaleAnim, {\n        toValue: .8,\n        duration: 800,\n        easing: ReactNative.Easing.in(ReactNative.Easing.quad),\n        useNativeDriver\n      })]).start(() => pulse());\n    };\n    pulse();\n  }, [scaleAnim, useNativeDriver]);\n  const animatedStyle = {\n    transform: [{\n      scale: scaleAnim\n    }]\n  };\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [{\n      width: 16,\n      height: 16,\n      justifyContent: 'center',\n      alignItems: 'center'\n    }, style]\n  }, /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    style: [{\n      position: 'absolute',\n      width: 16,\n      height: 16\n    }, animatedStyle]\n  }, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 16,\n    height: 16,\n    viewBox: \"0 0 16 16\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Circle, {\n    cx: 8,\n    cy: 8,\n    r: 6.67,\n    fill: \"#24BC75\"\n  }))), /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 16,\n    height: 16,\n    viewBox: \"0 0 16 16\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Circle, {\n    cx: 8,\n    cy: 8,\n    r: 4.67,\n    fill: \"#1C274C\"\n  })));\n};\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = {\n    container: {\n      flex: 1,\n      justifyContent: 'center',\n      alignItems: 'center',\n      padding: 12,\n      backgroundColor: theme.theme.semantic.surface.inversion.static.stPageBackground\n    },\n    column: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      width: '100%',\n      minWidth: 650\n    },\n    talkingBadge: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 8,\n      paddingHorizontal: 16,\n      gap: 8,\n      height: 44,\n      position: 'relative'\n    },\n    talkingBadgeBackground: {\n      position: 'absolute',\n      left: 1,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.positive.surface4, 0.16),\n      borderRadius: 999\n    },\n    talkingBadgeContent: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      zIndex: 1\n    },\n    talkingText: {\n      fontFamily: 'Geologica',\n      fontStyle: 'normal',\n      fontWeight: 600,\n      fontSize: 22,\n      lineHeight: 28,\n      letterSpacing: -0.7,\n      color: theme.theme.semantic.content.inversion.static.stPrimary,\n      height: 28\n    },\n    title: {\n      fontFamily: 'Geologica',\n      fontStyle: 'normal',\n      fontWeight: 900,\n      fontSize: 40,\n      lineHeight: 44,\n      textAlign: 'center',\n      letterSpacing: -0.7,\n      color: theme.theme.semantic.content.inversion.primary\n    },\n    subtitle: {\n      fontFamily: 'Geologica',\n      fontStyle: 'normal',\n      fontWeight: 600,\n      fontSize: 20,\n      lineHeight: 26,\n      textAlign: 'center',\n      letterSpacing: -0.7,\n      color: Utils.withOpacity(theme.theme.semantic.content.inversion.primary, 0.6)\n    }\n  };\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.column\n  }, /*#__PURE__*/React.createElement(LogoIcon, {\n    fill: Utils.withOpacity(theme.theme.semantic.content.inversion.primary, 0.05)\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      height: 20\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.talkingBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.talkingBadgeBackground\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.talkingBadgeContent\n  }, /*#__PURE__*/React.createElement(RecordingIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.talkingText\n  }, t(\"webNoCameraBannerTalkingNow\")))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      height: 16\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t(\"webNoCameraBannerTitle\")), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      height: 12\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, t(\"webNoCameraBannerSubtitle\"))));\n};"},"WithAppear":{"name":"WithAppear","key":"eb093b0d6cddc4d92f60258da574e6212d40655d0fbc4dfd83737553a837d8bb","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nreturn ({\n  children,\n  delay,\n  visible,\n  scale,\n  duration,\n  ...props\n}) => {\n  const [show, setShow] = React.useState(false);\n  React.useEffect(() => {\n    setTimeout(() => {\n      setShow(true);\n    }, delay ?? 0);\n  }, [delay]);\n  return /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, _extends({\n    scale: scale ?? 0.9,\n    duration: duration ?? 150,\n    visible: show && visible !== false,\n    unmountOnHide: false\n  }, props), children);\n};"},"EULAModal":{"name":"EULAModal","key":"a1f6994ef36881240b14eb73a0af578bda693a0d7cf57275ec6c7b6bf15f2939","code":"const DiamondIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"30\",\n    height: \"30\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst CircleDotIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_373_18713)\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"1\",\n    y: \"1\",\n    width: \"22\",\n    height: \"22\",\n    rx: \"11\",\n    stroke: \"currentColor\",\n    \"stroke-width\": \"2\"\n  }), /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"6\",\n    y: \"6\",\n    width: \"12\",\n    height: \"12\",\n    rx: \"6\",\n    fill: \"currentColor\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_373_18713\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"24\",\n    height: \"24\",\n    fill: \"currentColor\"\n  }))));\n};\nconst CircleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_373_18725)\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"1\",\n    y: \"1\",\n    width: \"22\",\n    height: \"22\",\n    rx: \"11\",\n    stroke: \"currentColor\",\n    \"stroke-opacity\": \"0.4\",\n    \"stroke-width\": \"2\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_373_18725\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"24\",\n    height: \"24\",\n    fill: \"currentColor\"\n  }))));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nconst getLegalLinks = (localeValue, ipCountryValue) => {\n  const normalizedLocale = String(localeValue ?? '').toLowerCase();\n  const isRuLocale = normalizedLocale === 'ru' || normalizedLocale.startsWith('ru-');\n  const isRuGeo = String(ipCountryValue ?? '').toUpperCase() === 'RU';\n  const useRuDocs = isRuLocale || isRuGeo;\n  if (useRuDocs) {\n    return {\n      eula: 'https://www.modern-com.ru/eula.html',\n      privacy: 'https://www.modern-com.ru/privacy.html',\n      terms: 'https://www.modern-com.ru/terms.html',\n      community: 'https://www.modern-com.ru/community.html'\n    };\n  }\n  return {\n    eula: 'https://welcome.camble.online/legal/docs/eula.html',\n    privacy: 'https://welcome.camble.online/legal/docs/privacy.html',\n    terms: 'https://welcome.camble.online/legal/docs/terms.html',\n    community: 'https://welcome.camble.online/legal/docs/community-guidelines.html'\n  };\n};\nreturn ({\n  products\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const session = State.api?.session?.useSession?.();\n  const {\n    locale: currentLocale\n  } = Locale.useLocale();\n  const ipCountry = session?.ip?.country;\n  const legalLinks = React.useMemo(() => getLegalLinks(currentLocale, ipCountry), [currentLocale, ipCountry]);\n  const [product, setProduct] = React.useState();\n  const styles = React.useMemo(() => ({\n    container: {\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: 0\n    },\n    content: {\n      padding: 16,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 4,\n      alignSelf: 'stretch'\n    },\n    text: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph,\n      width: '100%',\n      alignSelf: 'stretch'\n    },\n    subtext: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph,\n      width: '100%',\n      alignSelf: 'stretch'\n    },\n    subtextRow: {\n      flexDirection: 'row',\n      width: '100%',\n      alignSelf: 'stretch'\n    },\n    bullet: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph,\n      width: 16,\n      flexShrink: 0\n    },\n    subtextContent: {\n      flex: 1,\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      fontFamily: theme.theme.typography.family.heading\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingBottom: Math.max(safeArea.bottom, 12),\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'flex-start',\n      gap: 8\n    },\n    button: {\n      width: '100%'\n    },\n    buttonText: {\n      fontFamily: theme.theme.typography.family.heading\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('eulaModalTitle'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 12,\n      top: 16\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, t('byContinuingUAccept')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subtextRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.bullet\n  }, '\\u2022'), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtextContent\n  }, t('eulaAgree1'), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.link.link\n    },\n    onPress: () => {\n      Linking.openURL(State.getUrl(legalLinks.eula));\n    }\n  }, t('eulaAgree2')), \",\", /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.link.link\n    },\n    onPress: () => {\n      Linking.openURL(State.getUrl(legalLinks.terms));\n    }\n  }, t('eulaAgree3')), \", \", /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.link.link\n    },\n    onPress: () => {\n      Linking.openURL(State.getUrl(legalLinks.privacy));\n    }\n  }, t('profileSettingsPrivacy')))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subtextRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.bullet\n  }, '\\u2022'), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtextContent\n  }, t('eulaAgree4')))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.buttonContainer, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    title: t('accept'),\n    size: \"L\",\n    feedback: true,\n    onPress: () => sheet.close(true)\n  }), /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"ghost\",\n    title: t('cancel'),\n    size: \"L\",\n    feedback: true,\n    onPress: () => sheet.close()\n  })));\n};"},"IOSWebKeyboardButton":{"name":"IOSWebKeyboardButton","key":"b5a168371544a50a5f46c74207dac5ee5e44b8dd9297c58f1c9be703b80dcf67","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst isIOSWeb = () => {\n  if (ReactNative.Platform?.OS !== 'web') return false;\n  const ua = globalThis?.navigator?.userAgent ?? '';\n  return /iPad|iPhone|iPod/i.test(ua);\n};\nreturn ({\n  style,\n  children,\n  ...props\n}) => {\n  const shouldLift = React.useMemo(() => isIOSWeb(), []);\n  const [keyboardInset, setKeyboardInset] = React.useState(0);\n  const initialViewportHeightRef = React.useRef(0);\n  React.useEffect(() => {\n    if (!shouldLift) return;\n    const viewport = globalThis?.visualViewport;\n    const doc = globalThis?.document;\n    if (!viewport || !doc) return;\n    if (!initialViewportHeightRef.current) {\n      initialViewportHeightRef.current = viewport.height || globalThis?.innerHeight || 0;\n    }\n    const updateInset = () => {\n      const currentHeight = viewport.height || 0;\n      const offsetTop = viewport.offsetTop || 0;\n      const innerHeight = globalThis?.innerHeight || 0;\n      const baseline = initialViewportHeightRef.current || innerHeight;\n      const fromBaseline = Math.max(0, baseline - currentHeight - offsetTop);\n      const fromInner = Math.max(0, innerHeight - currentHeight - offsetTop);\n      const nextInset = Math.max(fromBaseline, fromInner);\n      setKeyboardInset(nextInset > 0 ? nextInset + 12 : 0);\n    };\n    updateInset();\n    viewport.addEventListener('resize', updateInset);\n    viewport.addEventListener('scroll', updateInset);\n    doc.addEventListener('focusin', updateInset);\n    doc.addEventListener('focusout', updateInset);\n    return () => {\n      viewport.removeEventListener('resize', updateInset);\n      viewport.removeEventListener('scroll', updateInset);\n      doc.removeEventListener('focusin', updateInset);\n      doc.removeEventListener('focusout', updateInset);\n    };\n  }, [shouldLift]);\n  const buttonStyle = React.useMemo(() => [style, shouldLift ? {\n    marginBottom: keyboardInset\n  } : null], [style, shouldLift, keyboardInset]);\n  return /*#__PURE__*/React.createElement(Components.DSButton, _extends({}, props, {\n    style: buttonStyle\n  }), children);\n};"},"PasswordConditions":{"name":"PasswordConditions","key":"b9ddbaf3d774f13ead30ff28efcd500b95bf24097bc04ec347ee8afd97772c9d","code":"const INACTIVE = '#6B6B76';\nconst ACTIVE = '#24BC75';\nreturn ({\n  value,\n  value2\n}) => {\n  const t = Locale.useTranslation();\n  const hasUppercase = React.useMemo(() => /[A-ZА-ЯЁ]/.test(value), [value]);\n  const hasMinLength = React.useMemo(() => value.length >= 8, [value]);\n  const passwordsMatch = React.useMemo(() => {\n    if (!value2?.length) return false;\n    return value === value2;\n  }, [value, value2]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      gap: 4,\n      marginVertical: 14\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 14,\n      fontWeight: '400',\n      color: hasUppercase ? ACTIVE : INACTIVE\n    }\n  }, t('passwordConditionUppercase')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 14,\n      fontWeight: '400',\n      color: hasMinLength ? ACTIVE : INACTIVE\n    }\n  }, t('passwordConditionMinLetters')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 14,\n      fontWeight: '400',\n      color: passwordsMatch ? ACTIVE : INACTIVE\n    }\n  }, t('signupPasswordMatchRule')));\n};"},"MetaEmailConfirmNew":{"name":"MetaEmailConfirmNew","key":"c570c6638545f5b5866bf927c4e6e750492ae1490e47ff09edceefe6fbbddbd1","code":"deps: IOSWebKeyboardButton\nconst CELL_COUNT = 6;\nconst RESEND_SECONDS = 30;\nreturn ({\n  onNextStep\n}) => {\n  /* ---------- React state ---------- */\n  const [code, setCode] = React.useState('');\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState(false);\n  const [countdown, setCountdown] = React.useState(0);\n\n  /* ---------- Initial data ---------- */\n  const session = State.api?.session?.useSession?.();\n  const email = session.userConnection.key;\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const ref = CodeField.useBlurOnFulfill({\n    value: '',\n    cellCount: CELL_COUNT\n  });\n\n  /* ---------- RxJS streams ---------- */\n  const code$ = React.useRef(new Rx.BehaviorSubject('')).current;\n  const resend$ = React.useRef(new Rx.Subject()).current;\n  const isLoading$ = React.useRef(new Rx.BehaviorSubject(false)).current;\n  const error$ = React.useRef(new Rx.BehaviorSubject(null)).current;\n  const submitTrigger$ = React.useRef(new Rx.Subject()).current;\n\n  /* ---------- Submit pipeline ---------- */\n  const submit$ = React.useRef(submitTrigger$.pipe(Rx.withLatestFrom(code$), Rx.map(([, code]) => code.trim()), Rx.filter(v => v.length === CELL_COUNT), Rx.exhaustMap(code => {\n    if (isLoading$.value) return Rx.EMPTY;\n    console.log('[OTP] submit:', code);\n    isLoading$.next(true);\n    error$.next(null);\n    return Rx.from(State.post('/api/login/email/verify', {\n      code\n    })).pipe(Rx.tap(res => {\n      const {\n        userConnection\n      } = res;\n      if (!userConnection.verifyed) {\n        throw new Error('invalid');\n      } else {\n        State.state.session.next({\n          ...State.state.session.value,\n          userConnection\n        });\n      }\n      onNextStep?.();\n    }), Rx.catchError(() => {\n      error$.next(t('signinOtpIncorrect'));\n      return Rx.EMPTY;\n    }), Rx.finalize(() => isLoading$.next(false)));\n  }))).current;\n\n  /* ---------- Resend contract ---------- */\n  const countdown$ = React.useRef(resend$.pipe(Rx.exhaustMap(() => {\n    if (isLoading$.value) return Rx.EMPTY;\n    isLoading$.next(true);\n    return Rx.from(State.post('/api/login/email/check', {\n      email,\n      resend: true\n    })).pipe(Rx.tap(() => {\n      code$.next('');\n      error$.next(null);\n    }), Rx.catchError(() => {\n      error$.next('Failed to resend code');\n      return Rx.EMPTY;\n    }), Rx.finalize(() => isLoading$.next(false)), Rx.switchMap(() => Rx.timer(0, 1000).pipe(Rx.map(i => RESEND_SECONDS - i), Rx.takeWhile(v => v >= 0))));\n  }))).current;\n\n  /* ---------- Lifecycle ---------- */\n\n  React.useEffect(() => {\n    const subs = [code$.subscribe(setCode), error$.subscribe(setError), isLoading$.subscribe(setIsLoading), submit$.subscribe(), countdown$.subscribe(setCountdown)];\n    resend$.next();\n    return () => subs.forEach(s => s.unsubscribe());\n  }, []);\n\n  /* ---------- Styles ---------- */\n  const styles = {\n    content: {\n      flex: 1,\n      width: '100%',\n      paddingVertical: 16\n    },\n    cell: {\n      aspectRatio: 0.94,\n      width: '14%',\n      borderRadius: 20,\n      borderWidth: 1,\n      borderColor: Utils.withOpacity(theme.theme.component?.textField?.['border-default'] ?? theme.theme.component?.textField?.borderDefault ?? '#999', 0.1),\n      backgroundColor: Utils.withOpacity(theme.theme.component.textField.bg, 0.05),\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    cellText: {\n      fontFamily: theme.theme.typography?.family?.heading ?? theme.theme.font?.heading ?? 'Geologica',\n      fontSize: 24,\n      fontWeight: 700,\n      letterSpacing: -0.3,\n      textAlign: 'center',\n      color: theme.theme.component?.textField?.['content-primary'] ?? theme.theme.component?.textField?.contentPrimary ?? theme.theme.semantic.content.regular.primary\n    },\n    subtitleRow: {\n      flexDirection: 'row',\n      flexWrap: 'wrap',\n      alignItems: 'baseline'\n    },\n    subtitleText: {\n      ...(theme.theme.typography?.fonts?.body?.l ?? {}),\n      color: theme.theme.semantic.content.regular.secondary\n    },\n    emailText: {\n      fontFamily: theme.theme.typography?.family?.paragraph ?? theme.theme.font?.paragraph ?? 'Inter',\n      fontSize: theme.theme.typography?.fonts?.body?.l?.fontSize ?? 16,\n      letterSpacing: theme.theme.typography?.fonts?.body?.l?.letterSpacing ?? -0.3,\n      fontWeight: 700,\n      color: theme.theme.semantic.content.brand.content1\n    },\n    error: {\n      color: theme.theme.semantic.content.danger?.primary ?? 'red'\n    }\n  };\n  React.useEffect(() => {\n    console.log('[OTP6] mount');\n    return () => console.log('[OTP6] unmount');\n  }, []);\n\n  /* ---------- UI --------- */\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'column',\n      width: '100%',\n      justifyContent: 'space-between',\n      paddingBottom: 12\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t('pleaseEnterCode'),\n    subtitleNode: /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.subtitleRow\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.subtitleText\n    }, t('weSentYourCodeTo'), '\\u00A0'), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.emailText]\n    }, email))\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      minHeight: 24\n    }\n  }, !!error && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.error\n  }, error)), /*#__PURE__*/React.createElement(CodeField.CodeField, {\n    ref: ref,\n    value: code,\n    autoFocus: true,\n    onChangeText: v => {\n      code$.next(v);\n      error$.next(null);\n      if (v.length === CELL_COUNT) {\n        submitTrigger$.next();\n      }\n    },\n    cellCount: CELL_COUNT,\n    keyboardType: \"number-pad\",\n    textContentType: \"oneTimeCode\",\n    renderCell: ({\n      index,\n      symbol,\n      isFocused\n    }) => /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: index,\n      style: [styles.cell, error && {\n        borderColor: theme.theme.component?.textField?.['border-error'] ?? theme.theme.component?.textField?.borderError ?? 'red'\n      }]\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.cellText\n    }, symbol || (isFocused ? /*#__PURE__*/React.createElement(CodeField.Cursor, null) : null)))\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      marginTop: 12\n    }\n  }, countdown > 0 ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [theme.theme.typography.fonts.body.m, {\n      color: theme.theme.semantic.content.regular.secondary\n    }]\n  }, t('resendCodeIn', countdown)) : /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    onPress: () => {\n      if (countdown > 0) return;\n      resend$.next();\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [theme.theme.typography.fonts.body.m, {\n      color: theme.theme.semantic.content.accent.content1\n    }]\n  }, t('resendCode'))))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    width: \"100%\",\n    disabled: code.length < CELL_COUNT,\n    loading: isLoading,\n    onPress: () => submitTrigger$.next()\n  }, t('buttonContinue')));\n};"},"GenderStep":{"name":"GenderStep","key":"cf557e0f8585dd01ef845c9eb514f791f8459053f3116dbf3d2c96f654aa7750","code":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction _callIgnored(body, direct) {\n  return _call(body, _empty, direct);\n}\nreturn ({\n  onNextStep,\n  getTimeOnStepSec\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const session = State.api?.session?.useSession?.();\n  const sexFromSession = session?.card?.sex;\n  const [sex, setSex] = React.useState(sexFromSession);\n  React.useEffect(() => {\n    console.log('[EFFECT] session.card.sex changed:', session?.card?.sex);\n    setSex(session?.card?.sex);\n  }, [session?.card?.sex]);\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState(false);\n  const submit = React.useCallback(_async(function () {\n    console.log('[SUBMIT] called, sex:', sex, 'isLoading:', isLoading);\n    if (isLoading || !sex) return;\n    setIsLoading(true);\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        console.log('[SUBMIT] posting new sex:', sex);\n        return _await(State.post('/api/login/profile', {\n          sex\n        }, 'json', undefined, undefined, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            analytics_event: 'on_board_steps',\n            step_number: 0,\n            is_skipped: false,\n            time_on_step: getTimeOnStepSec?.() ?? 0\n          }\n        }), function (card) {\n          console.log('[SUBMIT] response card:', card);\n          State.state.session.next({\n            ...State.state.session.value,\n            card\n          });\n          console.log('[SUBMIT] session updated:', State.state.session.value.card.sex);\n          onNextStep?.();\n        });\n      }, function (err) {\n        console.error('[SUBMIT] error', err);\n        setError(err?.message || 'genderNA');\n      });\n    }, function (_wasThrown, _result) {\n      setIsLoading(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [getTimeOnStepSec, isLoading, onNextStep, sex]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: \"column\",\n      width: \"100%\",\n      gap: 4,\n      paddingBottom: 12\n    }\n  }, !!error && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: 'red'\n    }\n  }, error), /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t(\"genderTitle\"),\n    subtitle: t(\"genderSubtitle\")\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      justifyContent: \"center\",\n      gap: 16\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSGenderButtons, {\n    onPick: val => {\n      console.log('[DSGenderButtons] picked:', val);\n      setSex(val);\n    },\n    initial: sex\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 14,\n      color: theme.theme.semantic.content.regular.secondary,\n      textAlign: 'center'\n    }\n  }, t(\"signupGenderHelper\"))), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    width: \"100%\",\n    disabled: isLoading || !sex,\n    onPress: _async(function () {\n      console.log('[BUTTON] pressed, sex:', sex);\n      ReactNative.Keyboard.dismiss();\n      return _callIgnored(submit);\n    })\n  }, t(\"buttonContinue\")));\n};"},"UsernameStep":{"name":"UsernameStep","key":"61fc2e8feceb19ca46a013abc22b659029e70de70f1ffcc5892e8684105daf59","code":"deps: IOSWebKeyboardButton\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction _callIgnored(body, direct) {\n  return _call(body, _empty, direct);\n}\nreturn ({\n  onNextStep,\n  getTimeOnStepSec\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const session = State.api?.session?.useSession?.();\n  const username = session?.user?.username || '';\n  const [text, setText] = React.useState(username);\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState(false);\n  const validate = value => {\n    value = value.trim();\n    if (!value?.length) return t('nameValidationEmpty');\n    if (value.length > 20) return t('nameValidationTooLong');\n    if (!/^[a-zA-Zа-яА-ЯёЁ\\s]+$/g.test(value)) return t('nameValidationNoFancyLetters');\n    if (value.length < 2) return t('signupValidationNameShort');\n    return null;\n  };\n  const submit = _async(function () {\n    if (isLoading) return;\n    const err = validate(text);\n    setError(err);\n    return _invokeIgnored(function () {\n      if (!err) {\n        return _continueIgnored(_finallyRethrows(function () {\n          return _catch(function () {\n            setIsLoading(true);\n            return _await(State.post('/api/login/meta/username', {\n              username: text\n            }, 'json', undefined, undefined, {\n              analytics: {\n                ...Analytics.getGlobalParams(),\n                analytics_event: 'on_board_steps',\n                step_number: 1,\n                is_skipped: false,\n                time_on_step: getTimeOnStepSec?.() ?? 0\n              }\n            }), function (resp) {\n              const {\n                user\n              } = resp;\n              State.state.session.next({\n                ...State.state.session.value,\n                user\n              });\n              onNextStep?.();\n            });\n          }, function (err) {\n            console.error(err);\n            setError(err?.message || t('nameValidationProhibited'));\n          });\n        }, function (_wasThrown, _result) {\n          setIsLoading(false);\n          return _rethrow(_wasThrown, _result);\n        }));\n      }\n    });\n  });\n  const onChange = value => {\n    setError(null);\n    setText(value);\n  };\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: \"column\",\n      alignItems: \"stretch\",\n      justifyContent: \"flex-start\",\n      width: \"100%\",\n      gap: 8,\n      paddingBottom: 12\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t(\"nameStepTitle\"),\n    subtitle: t(\"signupNameSubHeader\")\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: \"column\",\n      alignItems: \"flex-start\",\n      justifyContent: \"flex-start\"\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSTextInput, {\n    autofocus: true,\n    value: text,\n    onChangeText: onChange,\n    placeholder: t(\"signupNameInput\"),\n    error: error,\n    onRightPress: submit\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: {\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    width: \"100%\",\n    disabled: isLoading || !text,\n    onPress: _async(function () {\n      ReactNative.Keyboard.dismiss();\n      return _callIgnored(submit);\n    })\n  }, t(\"buttonContinue\"))));\n};"},"AgeStep":{"name":"AgeStep","key":"ac68f8c1bf2e451cb029c08ab545bdcd090f41dfbe9e5325f118ed2434460263","code":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction _callIgnored(body, direct) {\n  return _call(body, _empty, direct);\n}\nreturn ({\n  onNextStep,\n  onStepUpdate,\n  getTimeOnStepSec\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const session = State.api?.session?.useSession?.();\n  const birthdate = React.useMemo(() => session?.card?.birthdate ? new Date(session.card.birthdate) : new Date(), [session?.card?.birthdate]);\n  const maxumumDate = React.useMemo(() => new Date(), []);\n  const [date, setDate] = React.useState(birthdate);\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState(false);\n  const isWeb = ReactNative.Platform?.OS === 'web';\n  const isIOS = ReactNative.Platform?.OS === 'ios';\n  const inputColors = theme.theme?.component?.selector?.outline;\n  React.useEffect(() => {\n    setDate(birthdate);\n  }, [birthdate]);\n  const pad2 = React.useCallback(n => String(n).padStart(2, '0'), []);\n  const toInputValue = React.useCallback(value => `${value.getFullYear()}-${pad2(value.getMonth() + 1)}-${pad2(value.getDate())}`, [pad2]);\n  const age = Utils.calculateAge(date);\n  const submit = React.useCallback(_async(function () {\n    if (isLoading) return;\n    if (!age || age < 18) {\n      setError(t('signupBirthdayError'));\n      return;\n    }\n    setError(null);\n    setIsLoading(true);\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        const timezone = new Date().getTimezoneOffset() / 60;\n        const isoString = date.toISOString();\n        return _await(State.post('/api/login/profile', {\n          birthdate: isoString,\n          age\n        }, 'json', undefined, undefined, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            analytics_event: 'on_board_steps',\n            step_number: 2,\n            is_skipped: false,\n            time_on_step: getTimeOnStepSec?.() ?? 0\n          }\n        }), function ({\n          card\n        }) {\n          return _await(State.post('/api/login/meta', {\n            str: {\n              birthday: `${date.getDate()}.${date.getMonth() + 1}.${date.getFullYear()}`\n            },\n            num: {\n              age,\n              timezone\n            }\n          }, 'json'), function ({\n            userMeta\n          }) {\n            State.state.session.next({\n              ...State.state.session.value,\n              card,\n              userMeta\n            });\n            onNextStep?.();\n          });\n        });\n      }, function (err) {\n        console.error(err);\n        setError(err?.message || t('signupBirthdayError'));\n      });\n    }, function (_wasThrown, _result) {\n      setIsLoading(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [getTimeOnStepSec, isLoading, date, age, onNextStep]);\n  const onChange = React.useCallback(value => {\n    setError(null);\n    setDate(value);\n  }, []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: \"column\",\n      alignItems: \"stretch\",\n      justifyContent: \"flex-start\",\n      width: \"100%\",\n      paddingBottom: 12\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t(\"signupBirthdayHeader\"),\n    subtitle: t(\"signupBirthdayDescription\")\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      minHeight: 20,\n      marginTop: 6\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: \"red\"\n    },\n    numberOfLines: 2\n  }, error ? error : ' ')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: \"column\",\n      alignItems: \"center\",\n      justifyContent: \"center\"\n    }\n  }, isWeb ? /*#__PURE__*/React.createElement(Components.DSDatePicker, {\n    date: date,\n    maximumDate: maxumumDate,\n    onDateChange: onChange,\n    style: {\n      margin: 40,\n      transform: [{\n        scale: .8\n      }]\n    }\n  })\n  // <ReactNative.View style={{ margin: 40 }}>\n  //   <style>{`\n  //     .age-date-input::-webkit-datetime-edit {\n  //       padding-right: 12px;\n  //     }\n  //     .age-date-input::-webkit-calendar-picker-indicator {\n  //       filter: ${theme.isDark ? 'invert(1)' : 'none'};\n  //     }\n  //   `}</style>\n  //   <input\n  //     type=\"date\"\n  //     value={toInputValue(date)}\n  //     max={toInputValue(maxumumDate)}\n  //     onChange={(event) => {\n  //       const value = event.currentTarget.value;\n  //       if (!value) return;\n  //       const [year, month, day] = value.split('-').map(Number);\n  //       const next = new Date(date);\n  //       next.setFullYear(year);\n  //       next.setMonth((month ?? 1) - 1);\n  //       next.setDate(day ?? 1);\n  //       onChange(next);\n  //     }}\n  //     className=\"age-date-input\"\n  //     style={{\n  //       backgroundColor: inputColors?.bgDefault,\n  //       color: inputColors?.content,\n  //       borderColor: inputColors?.borderDefault,\n  //       borderWidth: 1,\n  //       borderStyle: 'solid',\n  //       borderRadius: 16,\n  //       padding: 20,\n  //       fontSize: 32,\n  //       minHeight: 64,\n  //     }}\n  //   />\n  // </ReactNative.View>\n  : /*#__PURE__*/React.createElement(DatePicker, {\n    mode: \"date\",\n    theme: theme.isDark ? \"dark\" : \"light\",\n    date: date,\n    locale: State.state.locale.value,\n    maximumDate: maxumumDate,\n    onDateChange: onChange,\n    style: {\n      transform: [{\n        scale: isIOS ? 0.91 : 1.3\n      }],\n      margin: 40\n    }\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: {\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    width: \"100%\",\n    disabled: isLoading,\n    onPress: _async(function () {\n      ReactNative.Keyboard.dismiss();\n      return _callIgnored(submit);\n    })\n  }, t(\"buttonContinue\"))));\n};"},"BioStep":{"name":"BioStep","key":"294124f5f65a5aa3cc8174c73e6fd13ebd349c144b490e373b71d9cca12bc62e","code":"deps: IOSWebKeyboardButton\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction _callIgnored(body, direct) {\n  return _call(body, _empty, direct);\n}\nreturn ({\n  onNextStep,\n  onStepUpdate,\n  getTimeOnStepSec\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const session = State.api?.session?.useSession?.();\n  const about = session?.card?.about || '';\n  const [text, setText] = React.useState(about);\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState(false);\n  const MAX = 250;\n  const validate = React.useCallback(value => {\n    value = (value || '').trim();\n    if (value.length > MAX) return t('signupBioTooLong');\n    return null;\n  }, []);\n  const submit = React.useCallback(_async(function () {\n    if (isLoading) return;\n    const err = validate(text);\n    setError(err);\n    return _invokeIgnored(function () {\n      if (!err) {\n        return _continueIgnored(_finallyRethrows(function () {\n          return _catch(function () {\n            setIsLoading(true);\n            return _await(State.post('/api/login/profile', text !== about ? {\n              about: text\n            } : {}, 'json', undefined, undefined, {\n              analytics: {\n                ...Analytics.getGlobalParams(),\n                analytics_event: 'on_board_steps',\n                step_number: 3,\n                is_skipped: false,\n                bio_length: text.length,\n                time_on_step: getTimeOnStepSec?.() ?? 0\n              }\n            }), function ({\n              card\n            }) {\n              State.state.session.next({\n                ...State.state.session.value,\n                card\n              });\n              onNextStep?.();\n            });\n          }, function (e) {\n            console.error(e);\n            setError(e?.message || t('nameValidationProhibited'));\n          });\n        }, function (_wasThrown, _result) {\n          setIsLoading(false);\n          return _rethrow(_wasThrown, _result);\n        }));\n      }\n    });\n  }), [text, isLoading, about, onNextStep, validate, t, getTimeOnStepSec]);\n  React.useEffect(() => {\n    onStepUpdate?.({\n      skippable: !isLoading,\n      isValid: true\n    });\n  }, [isLoading, text, onStepUpdate]);\n  const onChange = React.useCallback(value => {\n    setError(null);\n    setText(value);\n  }, []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'flex-start',\n      width: '100%',\n      gap: 8,\n      paddingBottom: 12\n    }\n  }, !!error && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: 'red'\n    }\n  }, error), /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    style: {\n      width: '100%'\n    },\n    title: t('signupBioHeader'),\n    subtitle: t('signupBioSubheader')\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start',\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSMultilineTextField, {\n    style: {\n      flex: 1,\n      width: '100%'\n    },\n    autofocus: true,\n    value: text,\n    onChangeText: onChange,\n    placeholder: t('signupBioInput'),\n    autoCorrect: true,\n    numberOfLines: 8,\n    maxLetters: MAX,\n    returnKeyType: \"default\",\n    overLimitMessage: t('signupBioTooLong'),\n    blurOnSubmit: false\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: {\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"IOSWebKeyboardButton\",\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    width: \"100%\",\n    disabled: isLoading,\n    onPress: _async(function () {\n      ReactNative.Keyboard.dismiss();\n      return _callIgnored(submit);\n    })\n  }, t('buttonContinue'))));\n};"},"PhotoStep":{"name":"PhotoStep","key":"f5cc1bafed9aea1ddbe429bcb9bb497b6ee7cd704fb0fdcbf04b47a4000f1bb2","code":"deps: MetaPhotoComponent\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction _callIgnored(body, direct) {\n  return _call(body, _empty, direct);\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst COUNT = 3;\nconst GAP = 6;\nconst PHOTO_RATIO = 112 / 200;\nconst Element = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"MetaPhotoComponent\"\n}, props));\nreturn ({\n  onNextStep,\n  onStepUpdate,\n  getTimeOnStepSec\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const session = State.api?.session?.useSession?.();\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      flex: 1,\n      flexDirection: 'column',\n      justifyContent: 'flex-start',\n      paddingBottom: 12,\n      gap: 12\n    },\n    error: {\n      color: 'red'\n    },\n    content: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      maxWidth: '100%'\n    },\n    photoGroup: {\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: 410,\n      maxWidth: '100%',\n      gap: 16\n    },\n    tooltipIcon: {\n      color: theme.theme.component.tooltip.regular.content\n    },\n    photoRow: {\n      flexDirection: 'row',\n      gap: GAP,\n      width: '100%',\n      justifyContent: 'flex-start'\n    },\n    safetyHint: {\n      alignSelf: 'center',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingHorizontal: 16,\n      paddingVertical: 6,\n      borderRadius: 12,\n      backgroundColor: theme.theme.semantic.surface.information.surface2\n    },\n    safetyHintIcon: {\n      color: theme.theme.semantic.content.information.content1\n    },\n    safetyHintText: {\n      color: theme.theme.semantic.content.information.content1,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500\n    },\n    footer: {\n      width: '100%'\n    },\n    button: {\n      width: '100%'\n    }\n  }), [theme]);\n  const [rowWidth, setRowWidth] = React.useState(0);\n  const tileStyle = React.useMemo(() => {\n    const width = rowWidth ? Math.min((rowWidth - GAP * (COUNT - 1)) / COUNT, 140) : 112;\n    return {\n      width,\n      minWidth: width,\n      height: width / PHOTO_RATIO,\n      flexShrink: 0\n    };\n  }, [rowWidth]);\n  const photos = session?.photos ?? [];\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState([]);\n  const hoveredIndex = React.useRef(null);\n  const itemLayouts = React.useRef(new Map()).current;\n  React.useEffect(() => {\n    onStepUpdate?.({\n      skippable: !isLoading.length\n    });\n  }, [isLoading]);\n  const submit = React.useCallback(_async(function () {\n    return _invokeIgnored(function () {\n      if (!isLoading.length) {\n        return _continueIgnored(_finallyRethrows(function () {\n          return _catch(function () {\n            setIsLoading(['submit']);\n            return _await(State.post('/api/login/profile', {}, 'json', undefined, undefined, {\n              analytics: {\n                ...Analytics.getGlobalParams(),\n                analytics_event: 'on_board_steps',\n                step_number: 4,\n                is_skipped: false,\n                photo_num: photos?.length,\n                time_on_step: getTimeOnStepSec?.() ?? 0\n              }\n            }), function ({\n              card\n            }) {\n              if (card) {\n                State.state.session.next({\n                  ...State.state.session.value,\n                  card\n                });\n              }\n              onNextStep?.(true);\n            });\n          }, function (err) {\n            console.error(err);\n            setError(err?.message || 'Error');\n          });\n        }, function (_wasThrown, _result) {\n          setIsLoading([]);\n          return _rethrow(_wasThrown, _result);\n        }));\n      }\n    });\n  }), [getTimeOnStepSec, isLoading, onNextStep, photos]);\n  const reorder = Components.useCallbackLoader(_async(function (from, to) {\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        setIsLoading([from, to]);\n        const newPhotos = [...photos];\n        [newPhotos[from], newPhotos[to]] = [newPhotos[to], newPhotos[from]];\n        return _await(State.post('/api/login/profile/photo/reorder', {\n          uids: newPhotos.map(p => p.uid)\n        }, 'json'), function ({\n          photos: photosReordered\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            photos: photosReordered\n          });\n        });\n      }, function (err) {\n        console.error('Error picking image:', err);\n      });\n    }, function (_wasThrown2, _result2) {\n      setIsLoading([]);\n      return _rethrow(_wasThrown2, _result2);\n    }));\n  }), [photos]);\n  const handleDragStart = React.useCallback(index => {\n    console.log('Drag started:', index);\n  }, []);\n  const handleDragEnd = React.useCallback(index => {\n    console.log('Drag ended:', index);\n    if (hoveredIndex.current != null) reorder(index, hoveredIndex.current);\n  }, [reorder]);\n  const handleDragHover = React.useCallback(indexOver => {\n    console.log('Hover over:', indexOver);\n    hoveredIndex.current = indexOver;\n  }, []);\n  const handleDragLeave = React.useCallback(() => {\n    hoveredIndex.current = null;\n  }, []);\n  return /*#__PURE__*/React.createElement(ReactNativeGestureHandler.GestureHandlerRootView, {\n    style: styles.root\n  }, !!error && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.error\n  }, error), /*#__PURE__*/React.createElement(Components.DSTitleBlock, {\n    title: t(\"signupPhotoHeader\"),\n    subtitle: t(\"signupPhotoDescription\")\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.photoGroup\n  }, /*#__PURE__*/React.createElement(Components.DSTooltip, {\n    icon: /*#__PURE__*/React.createElement(Assets.Smile, {\n      style: styles.tooltipIcon\n    }),\n    text: t(\"signupPhotoTooltip\")\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.photoRow,\n    onLayout: e => setRowWidth(e.nativeEvent.layout.width)\n  }, [0, 1, 2].map(index => /*#__PURE__*/React.createElement(Components.DraggableComponent, {\n    key: index,\n    index: index,\n    onDragStart: handleDragStart,\n    onDragEnd: handleDragEnd,\n    onDragHover: handleDragHover,\n    onDragLeave: handleDragLeave,\n    itemLayouts: itemLayouts,\n    style: tileStyle,\n    isTarget: photos[index]?.path != null,\n    isDraggable: photos[index]?.path != null,\n    Element: Element,\n    photo: photos[index],\n    isLoading: isLoading.includes(index)\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.safetyHint\n  }, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"16\",\n    viewBox: \"0 0 24 16\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M10.7 2.3a1.5 1.5 0 0 1 2.6 0l7.3 11.2a1 1 0 0 1-.8 1.5H4.2a1 1 0 0 1-.8-1.5L10.7 2.3ZM12 5v4.5M12 12.5v.1\",\n    stroke: styles.safetyHintIcon.color,\n    strokeWidth: \"1.5\",\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\"\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.safetyHintText\n  }, t('signupPhotoSafetyHint'))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.footer\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    size: \"L\",\n    type: \"brand\",\n    style: styles.button,\n    disabled: !!isLoading.length,\n    onPress: _async(function () {\n      ReactNative.Keyboard.dismiss();\n      return _callIgnored(submit);\n    })\n  }, t(\"singupComplete\"))));\n};"},"GetPro":{"name":"GetPro","key":"ae966d3f7017bb764601d1cc44e856c89295a1721dbb5988f875c0801ae22348","code":"function _empty() {}\nconst DiamondIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"30\",\n    height: \"30\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _invoke(body, then) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(then);\n  }\n  return then(result);\n}\nconst CircleDotIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_373_18713)\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"1\",\n    y: \"1\",\n    width: \"22\",\n    height: \"22\",\n    rx: \"11\",\n    stroke: \"currentColor\",\n    \"stroke-width\": \"2\"\n  }), /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"6\",\n    y: \"6\",\n    width: \"12\",\n    height: \"12\",\n    rx: \"6\",\n    fill: \"currentColor\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_373_18713\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"24\",\n    height: \"24\",\n    fill: \"currentColor\"\n  }))));\n};\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst CircleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_373_18725)\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"1\",\n    y: \"1\",\n    width: \"22\",\n    height: \"22\",\n    rx: \"11\",\n    stroke: \"currentColor\",\n    \"stroke-opacity\": \"0.4\",\n    \"stroke-width\": \"2\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_373_18725\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"24\",\n    height: \"24\",\n    fill: \"currentColor\"\n  }))));\n};\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nreturn ({\n  products\n}) => {\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [product, setProduct] = React.useState();\n  const styles = React.useMemo(() => ({\n    container: {\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: Math.max(safeArea.bottom, 12)\n    },\n    content: {\n      paddingHorizontal: 16,\n      paddingBottom: 16,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    item: {\n      container: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        padding: 20,\n        gap: 8,\n        backgroundColor: theme.theme.semantic.surface.alfa.surface1,\n        borderRadius: 12,\n        width: '100%'\n      },\n      flex: {\n        flex: 1\n      },\n      text: {\n        fontFamily: theme.theme.typography.family.heading,\n        color: theme.theme.semantic.content.regular.primary,\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 600\n      },\n      textActive: {\n        fontFamily: theme.theme.typography.family.heading,\n        color: theme.theme.semantic.content.brand.content1,\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 600\n      },\n      icon: {\n        color: theme.theme.semantic.content.brand.content1\n      }\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%'\n    },\n    buttonBody: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    buttonText: {\n      color: theme.theme.component.button.brand.content,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    }\n  }), [theme, safeArea]);\n  const onBuy = React.useCallback(_async(function () {\n    if (!product.uid) return;\n    return _continueIgnored(_catch(function () {\n      return _await(State.ackSocket(\"payment:buy\", {\n        id: product.uid\n      }), function (result) {\n        return _invoke(function () {\n          if (result != null && result !== \"ok\") {\n            if (result?.error != null) {\n              Notification.showNotification({\n                text: result.error,\n                type: 'error',\n                duration: 5000\n              });\n            }\n          } else {\n            return _awaitIgnored(State.api?.products?.loadProducts?.());\n          }\n        }, function () {\n          sheet.close();\n        });\n      });\n    }, function (error) {\n      Notification.showNotification({\n        text: error.message,\n        type: 'error',\n        duration: 5000\n      });\n    }));\n  }), [product]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, \"Get Camble PRO \\uD83D\\uDD25\")), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 12,\n      top: 16\n    },\n    feedback: true,\n    onPress: sheet.close\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, products?.map(p => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    key: p.uid,\n    feedback: true,\n    style: styles.item.container,\n    onPress: () => {\n      setProduct(p);\n    }\n  }, product?.uid === p.uid ? /*#__PURE__*/React.createElement(CircleDotIcon, {\n    style: styles.item.textActive\n  }) : /*#__PURE__*/React.createElement(CircleIcon, {\n    style: styles.item.text\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.item.text, styles.item.flex]\n  }, p.name), /*#__PURE__*/React.createElement(DiamondIcon, {\n    style: styles.item.icon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.item.text\n  }, formatWithSpaces(p.price))))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.buttonContainer, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    disabled: !product?.uid,\n    style: styles.button,\n    size: \"L\",\n    feedback: true,\n    onPress: onBuy\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonBody\n  }, !!product?.uid ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, \"Get PRO for\"), /*#__PURE__*/React.createElement(DiamondIcon, {\n    style: styles.buttonText\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, formatWithSpaces(product.price))) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, \"Select PRO\"))))));\n};"},"StorePro":{"name":"StorePro","key":"9e42f9812776f2fd218ad7ab6611c880a4d704a12a8c3f495a6de82cd5ebd310","code":"return ({\n  session,\n  onPress,\n  top\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const {\n    width: screenWidth\n  } = ReactNative.useWindowDimensions();\n  const isWide = screenWidth >= 600;\n  const brandBg = theme.theme?.semantic?.surface?.brand?.surface4 ?? '#fe375b';\n  const stPrimary = theme.theme?.semantic?.content?.inversion?.static?.stPrimary ?? '#ffffff';\n  const stSecondary = theme.theme?.semantic?.content?.inversion?.static?.stSecondary ?? 'rgba(255,255,255,0.6)';\n  const buttonBg = theme.theme?.component?.button?.primaryPermanent?.bgDefault ?? '#ffffff';\n  const buttonContent = theme.theme?.component?.button?.primaryPermanent?.content ?? '#04060f';\n  const styles = React.useMemo(() => ({\n    outerContainer: {\n      width: '100%'\n    },\n    container: {\n      borderRadius: 24,\n      width: '100%',\n      backgroundColor: brandBg,\n      padding: 16\n    },\n    row: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4,\n      zIndex: 1\n    },\n    content: {\n      flex: 1,\n      gap: 2\n    },\n    title: {\n      color: stPrimary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: isWide ? 20 : 16,\n      fontWeight: '600',\n      lineHeight: isWide ? 28 : 24,\n      letterSpacing: -0.7\n    },\n    subtitle: {\n      color: stSecondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: isWide ? 16 : 12,\n      fontWeight: '500',\n      lineHeight: isWide ? 22 : 18,\n      letterSpacing: isWide ? -0.3 : -0.2\n    },\n    button: {\n      backgroundColor: buttonBg,\n      borderRadius: 12,\n      height: isWide ? 40 : 32,\n      paddingHorizontal: isWide ? 52 : 12,\n      paddingVertical: isWide ? 10 : 6,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6,\n      ...(isWide ? {} : {\n        shadowColor: '#04060F',\n        shadowOffset: {\n          width: 0,\n          height: 16\n        },\n        shadowOpacity: 0.15,\n        shadowRadius: 28,\n        elevation: 8\n      })\n    },\n    buttonText: {\n      color: buttonContent,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      fontWeight: '600',\n      letterSpacing: -0.14,\n      lineHeight: 20\n    },\n    buttonIcon: {\n      color: buttonContent,\n      width: 16,\n      height: 16\n    },\n    prosubButton: {\n      backgroundColor: Utils.withOpacity(stPrimary, 0.2),\n      borderRadius: 12,\n      height: isWide ? 40 : 32,\n      paddingHorizontal: isWide ? 52 : 12,\n      paddingVertical: isWide ? 10 : 6,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    prosubButtonText: {\n      color: stPrimary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      fontWeight: '600',\n      letterSpacing: -0.14,\n      lineHeight: 20\n    },\n    prosubButtonIcon: {\n      color: stPrimary,\n      width: 16,\n      height: 16\n    },\n    imageContainer: {\n      position: 'absolute',\n      right: 0,\n      bottom: 0,\n      width: 145\n    },\n    image: {\n      width: '100%',\n      aspectRatio: 290 / 172,\n      resizeMode: 'contain'\n    }\n  }), [theme, isWide]);\n  const onGetPro = React.useCallback(() => {\n    onPress?.();\n    Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('SubPay', {\n      top: top ?? 1\n    }));\n  }, [top]);\n  const remainingText = React.useMemo(() => {\n    const years = session?.subscription?.subscriptionRemaining?.years ?? 0;\n    const months = session?.subscription?.subscriptionRemaining?.months ?? 0;\n    const days = session?.subscription?.subscriptionRemaining?.days ?? 0;\n    return t('shopMiniBannerRemaining', years, months, days);\n  }, [session?.subscription?.subscriptionRemaining, t]);\n  const hasSubscription = !!session?.subscription?.hasSubscription;\n  return /*#__PURE__*/React.createElement(Theme.ScopedTheme, {\n    name: \"dark\"\n  }, !hasSubscription && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.outerContainer,\n    style: styles.container,\n    feedback: true,\n    onPress: onGetPro\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopMiniBannerTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, t('shopMiniBannerSubtitle'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.button\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t('shopMiniBannerButton')), /*#__PURE__*/React.createElement(Assets.Crown, {\n    style: styles.buttonIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.imageContainer,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.image,\n    source: State.getUrl('/api/component/assets/store/premium-banner-1.webp')\n  }))), hasSubscription && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.outerContainer,\n    style: styles.container,\n    feedback: true,\n    onPress: onGetPro\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopMiniBannerTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, remainingText)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.button\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, \"PRO\"), /*#__PURE__*/React.createElement(Assets.Crown, {\n    style: styles.buttonIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.imageContainer,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.image,\n    source: State.getUrl('/api/component/assets/store/premium-banner-1.webp')\n  }))));\n};"},"PurchaseErrorModal":{"name":"PurchaseErrorModal","key":"3626b3f5dc2f0707bbc5dc30974660245b1cdb6663c44490937ca4b540b4e9d9","code":"return ({\n  onRetry\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const handleRetry = React.useCallback(() => {\n    onRetry?.();\n    sheet.close('action');\n  }, [onRetry, sheet]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: safeArea.bottom,\n      width: '100%',\n      gap: 4\n    },\n    header: {\n      width: '100%',\n      flexDirection: 'row',\n      justifyContent: 'flex-end',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    content: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingHorizontal: 24,\n      paddingBottom: 8,\n      width: '100%'\n    },\n    iconWrap: {\n      width: 88,\n      height: 88,\n      borderRadius: 999,\n      alignItems: 'center',\n      justifyContent: 'center',\n      marginBottom: 6,\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.dangerous.surface4, 0.15)\n    },\n    icon: {\n      color: theme.theme.semantic.content.dangerous.content1\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: 600,\n      textAlign: 'center'\n    },\n    description: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      textAlign: 'center'\n    },\n    actions: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 10,\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingVertical: 8\n    },\n    button: {\n      width: '100%'\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => sheet.close('closed')\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.iconWrap\n  }, /*#__PURE__*/React.createElement(Assets.ExclamationDown, {\n    size: 42,\n    style: styles.icon\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopPurchaseError')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('shopPurchaseErrorDescription'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actions\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"brand\",\n    size: \"L\",\n    style: styles.button,\n    onPress: handleRetry\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 16,\n      fontWeight: '600',\n      color: theme.theme.component.button.brand.content\n    }\n  }, t('retry')))));\n};"},"PurchaseInterruptedModal":{"name":"PurchaseInterruptedModal","key":"f56ca6d8f77da496c647f56b79069c43d2f06cbab348e4702b40b68867e412e1","code":"return () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const onSupport = React.useCallback(() => {\n    sheet.close('action');\n    Intercom.present();\n  }, []);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: safeArea.bottom,\n      width: '100%',\n      gap: 4\n    },\n    header: {\n      width: '100%',\n      flexDirection: 'row',\n      justifyContent: 'flex-end',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    content: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingHorizontal: 24,\n      paddingBottom: 8,\n      width: '100%'\n    },\n    iconWrap: {\n      width: 88,\n      height: 88,\n      borderRadius: 999,\n      alignItems: 'center',\n      justifyContent: 'center',\n      marginBottom: 6,\n      backgroundColor: Utils.withOpacity(theme.theme.component.toast.informational.content, 0.12)\n    },\n    icon: {\n      color: theme.theme.component.toast.informational.content\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: 600,\n      textAlign: 'center'\n    },\n    description: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      textAlign: 'center'\n    },\n    actions: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 10,\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingVertical: 8\n    },\n    button: {\n      width: '100%'\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => sheet.close('closed')\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.iconWrap\n  }, /*#__PURE__*/React.createElement(Assets.ExclamationDown, {\n    size: 42,\n    style: styles.icon\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopPurchaseInterrupted')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('purchaseInterruptedDescription'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actions\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"brand\",\n    size: \"L\",\n    style: styles.button,\n    onPress: onSupport\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 16,\n      fontWeight: '600',\n      color: theme.theme.component.button.brand.content\n    }\n  }, t('purchaseInterruptedSupport')), /*#__PURE__*/React.createElement(Assets.Headphones, {\n    color: theme.theme.component.button.brand.content\n  }))), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"brandSoft\",\n    size: \"L\",\n    style: styles.button,\n    onPress: () => sheet.close('closed')\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 16,\n      fontWeight: '600',\n      color: theme.theme.component.button.brandSoft.content\n    }\n  }, t('gotItButton')))));\n};"},"HistoryModal":{"name":"HistoryModal","key":"166a2f09a3161be2c83e4299be5cb5bab87e0d000db67e0ed9a64df1397faa98","code":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst NotebookIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M20.0557 2.26904C21.5845 2.21579 22.75 3.47078 22.75 4.93408V16.144C22.7498 17.68 21.5063 18.8798 20.0322 18.9722C19.0735 19.0321 17.9944 19.147 17.1914 19.3589C16.1989 19.6208 14.9715 20.2037 13.9805 20.7319C12.7473 21.3892 11.2527 21.3892 10.0195 20.7319C9.02854 20.2037 7.80114 19.6208 6.80859 19.3589C6.00563 19.147 4.9265 19.0321 3.96777 18.9722C2.49373 18.8798 1.25018 17.68 1.25 16.144V4.99854C1.25 3.49941 2.47013 2.23095 4.02832 2.32666C5.01507 2.38731 6.2306 2.50965 7.19141 2.76318C8.32765 3.06305 9.6374 3.68703 10.6328 4.21338C11.4615 4.65143 12.4799 4.62708 13.2979 4.15381C14.1703 3.64888 15.2901 3.06694 16.2852 2.76904C17.4297 2.42646 18.9175 2.3087 20.0557 2.26904ZM3.93652 3.82373C3.30256 3.78477 2.75 4.30135 2.75 4.99854V16.144C2.75019 16.8296 3.31834 17.4285 4.06152 17.4751C5.0416 17.5364 6.24098 17.6579 7.19141 17.9087C8.36172 18.2175 9.71767 18.8704 10.7256 19.4077C10.8936 19.4972 11.0698 19.5661 11.25 19.6177V5.97314C10.7951 5.90228 10.3488 5.75915 9.93164 5.53857C8.9549 5.02211 7.77063 4.46726 6.80859 4.21338C5.99642 3.99906 4.90247 3.8831 3.93652 3.82373ZM20.1084 3.76807C18.9896 3.80704 17.664 3.92239 16.7148 4.20654C15.8947 4.45213 14.9001 4.96053 14.0498 5.45264C13.6425 5.68835 13.2022 5.84949 12.75 5.93994V19.6177C12.9302 19.5661 13.1064 19.4972 13.2744 19.4077C14.2823 18.8704 15.6383 18.2175 16.8086 17.9087C17.759 17.6579 18.9584 17.5364 19.9385 17.4751C20.6817 17.4285 21.2498 16.8296 21.25 16.144V4.93408C21.25 4.25261 20.723 3.74683 20.1084 3.76807ZM4.27246 12.8188C4.3729 12.4171 4.77987 12.1726 5.18164 12.2729L9.18164 13.2729C9.58335 13.3734 9.82784 13.7804 9.72754 14.1821C9.62692 14.5836 9.21995 14.8282 8.81836 14.728L4.81836 13.728C4.41673 13.6276 4.17243 13.2205 4.27246 12.8188ZM18.8184 12.2729C19.2201 12.1726 19.6271 12.4171 19.7275 12.8188C19.8276 13.2205 19.5833 13.6276 19.1816 13.728L15.1816 14.728C14.78 14.8282 14.3731 14.5836 14.2725 14.1821C14.1722 13.7804 14.4167 13.3734 14.8184 13.2729L18.8184 12.2729ZM4.27246 8.81885C4.3729 8.41708 4.77987 8.17264 5.18164 8.27295L9.18164 9.27295C9.58335 9.37344 9.82784 9.78039 9.72754 10.1821C9.62692 10.5836 9.21995 10.8282 8.81836 10.728L4.81836 9.72803C4.41673 9.62762 4.17243 9.22048 4.27246 8.81885ZM18.8184 8.27295C19.2201 8.17264 19.6271 8.41708 19.7275 8.81885C19.8276 9.22048 19.5833 9.62762 19.1816 9.72803L15.1816 10.728C14.78 10.8282 14.3731 10.5836 14.2725 10.1821C14.1722 9.78039 14.4167 9.37344 14.8184 9.27295L18.8184 8.27295Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"30\",\n    height: \"30\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst TopupIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25ZM12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM12 7.25C12.4142 7.25 12.75 7.58579 12.75 8V14.1895L14.4697 12.4697C14.7626 12.1768 15.2374 12.1768 15.5303 12.4697C15.8232 12.7626 15.8232 13.2374 15.5303 13.5303L12.5303 16.5303C12.3896 16.6709 12.1989 16.75 12 16.75C11.8011 16.75 11.6104 16.6709 11.4697 16.5303L8.46973 13.5303C8.17683 13.2374 8.17683 12.7626 8.46973 12.4697C8.76262 12.1768 9.23738 12.1768 9.53027 12.4697L11.25 14.1895V8C11.25 7.58579 11.5858 7.25 12 7.25Z\",\n    fill: Assets.getColorFromStyle(style) ?? \"currentColor\"\n  }));\n};\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst PaymentIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25ZM12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM15 8.25C15.4142 8.25 15.75 8.58579 15.75 9V13.5C15.75 13.9142 15.4142 14.25 15 14.25C14.5858 14.25 14.25 13.9142 14.25 13.5V10.8105L9.53027 15.5303C9.23738 15.8232 8.76262 15.8232 8.46973 15.5303C8.17683 15.2374 8.17683 14.7626 8.46973 14.4697L13.1895 9.75H10.5C10.0858 9.75 9.75 9.41421 9.75 9C9.75 8.58579 10.0858 8.25 10.5 8.25H15Z\",\n    fill: Assets.getColorFromStyle(style) ?? \"currentColor\"\n  }));\n};\nfunction _empty() {}\nconst HistoryDiamondIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M14.375 2.5C14.5552 2.5 14.727 2.57823 14.8457 2.71387L19.2207 7.71387C19.2281 7.72234 19.2334 7.73245 19.2402 7.74121C19.2534 7.75796 19.266 7.77491 19.2773 7.79297C19.2879 7.80978 19.2968 7.82721 19.3057 7.84473C19.3151 7.86331 19.3245 7.88177 19.332 7.90137C19.3392 7.91996 19.3443 7.93896 19.3496 7.95801C19.3543 7.97485 19.36 7.99141 19.3633 8.00879C19.369 8.03916 19.3709 8.06981 19.3721 8.10059C19.3724 8.10872 19.375 8.11679 19.375 8.125C19.375 8.1263 19.374 8.1276 19.374 8.12891C19.3736 8.20782 19.3582 8.2862 19.3281 8.36035C19.3212 8.37745 19.3111 8.39288 19.3027 8.40918C19.2931 8.42794 19.2841 8.44694 19.2725 8.46484C19.261 8.48246 19.2475 8.49832 19.2344 8.51465C19.2248 8.52653 19.2176 8.54044 19.207 8.55176L10.457 17.9268C10.4522 17.932 10.4455 17.9354 10.4404 17.9404C10.4191 17.9618 10.3962 17.981 10.3721 17.999C10.3663 18.0033 10.3614 18.0086 10.3555 18.0127C10.3244 18.0343 10.2914 18.0527 10.2568 18.0684C10.2467 18.0729 10.236 18.076 10.2256 18.0801C10.2017 18.0894 10.1774 18.0972 10.1523 18.1035C10.139 18.1069 10.1259 18.1108 10.1123 18.1133C10.0756 18.12 10.0382 18.125 10 18.125C9.96144 18.125 9.92372 18.1201 9.88672 18.1133C9.87315 18.1108 9.86002 18.1069 9.84668 18.1035C9.82162 18.0971 9.79733 18.0894 9.77344 18.0801C9.76305 18.076 9.75234 18.073 9.74219 18.0684C9.70765 18.0527 9.6746 18.0343 9.64355 18.0127C9.63767 18.0086 9.63271 18.0033 9.62695 17.999C9.60287 17.981 9.57992 17.9618 9.55859 17.9404C9.55372 17.9355 9.54769 17.9318 9.54297 17.9268L0.792969 8.55176C0.782265 8.54029 0.774332 8.5267 0.764648 8.51465C0.751533 8.49833 0.738013 8.48244 0.726562 8.46484C0.714938 8.44695 0.705902 8.42792 0.696289 8.40918C0.687914 8.39289 0.677846 8.37743 0.670898 8.36035C0.641747 8.28844 0.626276 8.21225 0.625 8.13574V8.125C0.625 8.11681 0.626641 8.1087 0.626953 8.10059C0.627968 8.07482 0.628621 8.04896 0.632812 8.02344L0.637695 7.99902C0.640562 7.98502 0.645627 7.97166 0.649414 7.95801C0.654696 7.93898 0.659873 7.91993 0.666992 7.90137C0.674505 7.88179 0.683992 7.86329 0.693359 7.84473C0.702182 7.82722 0.711104 7.80976 0.72168 7.79297C0.733043 7.77493 0.745693 7.75795 0.758789 7.74121C0.765774 7.73228 0.771758 7.7225 0.779297 7.71387L5.1543 2.71387C5.27298 2.57823 5.44477 2.5 5.625 2.5H14.375ZM7.17285 8.75L10 15.8174L12.8262 8.75H7.17285ZM2.68848 8.75L8.17969 14.6328L5.82715 8.75H2.68848ZM14.1729 8.75L11.8193 14.6328L17.3105 8.75H14.1729ZM2.62598 7.5H5.9375L8.75 3.75H5.9082L2.62598 7.5ZM7.49902 7.5H12.5L10 4.16602L7.49902 7.5ZM14.0625 7.5H17.373L14.0918 3.75H11.25L14.0625 7.5Z\",\n    fill: \"#FE375B\"\n  }));\n};\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nconst BookIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"22\",\n    height: \"22\",\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.7139 1.89014C17.9874 1.84614 18.9587 2.89183 18.959 4.11084V13.4536C18.9587 14.7335 17.9216 15.7331 16.6934 15.8101C15.8946 15.86 14.9952 15.9558 14.3262 16.1323C13.4991 16.3506 12.4761 16.8357 11.6504 17.2759C10.6228 17.8236 9.37728 17.8235 8.34961 17.2759C7.52396 16.8358 6.50075 16.3506 5.67383 16.1323C5.00481 15.9558 4.10538 15.86 3.30664 15.8101C2.07841 15.7331 1.04225 14.7334 1.04199 13.4536V4.16553C1.04199 2.91623 2.05889 1.85916 3.35742 1.93896C4.17964 1.98951 5.19263 2.091 5.99316 2.30225C6.93999 2.55216 8.03188 3.07166 8.86133 3.51025C9.55194 3.87526 10.4004 3.8559 11.082 3.46143C11.8091 3.04067 12.7422 2.55632 13.5713 2.30811C14.5251 2.02262 15.7654 1.92318 16.7139 1.89014ZM16.7568 3.14014C15.8247 3.17262 14.7206 3.26867 13.9297 3.50537C13.2462 3.70998 12.4167 4.13333 11.708 4.54346C11.3686 4.73985 11.0018 4.8752 10.625 4.95068V16.3481C10.7752 16.3052 10.9225 16.248 11.0625 16.1733C11.9024 15.7256 13.0326 15.1807 14.0078 14.9233C14.7996 14.7145 15.7988 14.6131 16.6152 14.562C17.2344 14.5231 17.7087 14.0248 17.709 13.4536V4.11084C17.7087 3.54321 17.2689 3.12248 16.7568 3.14014ZM3.28027 3.18701C2.75212 3.15475 2.29199 3.58467 2.29199 4.16553V13.4536C2.29225 14.0248 2.76561 14.5231 3.38477 14.562C4.20141 14.6131 5.20125 14.7144 5.99316 14.9233C6.96837 15.1807 8.09862 15.7256 8.93848 16.1733C9.07824 16.2478 9.22508 16.3043 9.375 16.3472V4.97803C8.99588 4.91911 8.62407 4.79954 8.27637 4.61572C7.46253 4.1854 6.47544 3.72282 5.67383 3.51123C4.9971 3.33269 4.08508 3.23649 3.28027 3.18701ZM4.31836 10.2271L7.65234 11.0601C7.98684 11.144 8.19011 11.4842 8.10645 11.8188C8.02255 12.1533 7.68323 12.3564 7.34863 12.2729L4.01562 11.4399C3.68084 11.3562 3.477 11.0169 3.56055 10.6821C3.64425 10.3473 3.98356 10.1435 4.31836 10.2271ZM15.6816 10.2271C16.0164 10.1435 16.3558 10.3473 16.4395 10.6821C16.523 11.0169 16.3192 11.3562 15.9844 11.4399L12.6514 12.2729C12.3168 12.3564 11.9775 12.1533 11.8936 11.8188C11.8099 11.4842 12.0132 11.144 12.3477 11.0601L15.6816 10.2271ZM4.31836 6.89404L7.65234 7.72705C7.98679 7.81107 8.1901 8.15121 8.10645 8.48584C8.02242 8.8201 7.68311 9.02333 7.34863 8.93994L4.01562 8.10693C3.68094 8.02326 3.4772 7.68381 3.56055 7.34912C3.64425 7.01433 3.98356 6.81048 4.31836 6.89404ZM15.6816 6.89404C16.0164 6.81048 16.3558 7.01433 16.4395 7.34912C16.5228 7.68381 16.3191 8.02326 15.9844 8.10693L12.6514 8.93994C12.3169 9.02333 11.9776 8.8201 11.8936 8.48584C11.8099 8.15121 12.0132 7.81107 12.3477 7.72705L15.6816 6.89404Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction formatLocalDate(datetimeString) {\n  if (!datetimeString) return \"\";\n  try {\n    const isoString = datetimeString.replace(\" \", \"T\");\n    const date = new Date(isoString);\n    if (isNaN(date.getTime())) {\n      console.error(\"Invalid date:\", datetimeString);\n      return datetimeString;\n    }\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, \"0\");\n    const day = String(date.getDate()).padStart(2, \"0\");\n    const hours = String(date.getHours()).padStart(2, \"0\");\n    const minutes = String(date.getMinutes()).padStart(2, \"0\");\n    return `${day}/${month}/${year}, ${hours}:${minutes}`;\n  } catch (err) {\n    console.error(\"Date parse error:\", err);\n    return datetimeString;\n  }\n}\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \" \");\n}\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [activeTab, setActiveTab] = React.useState('all');\n  const [transactions, setTransactions] = React.useState([]);\n  const [isLoading, setIsLoading] = React.useState(true);\n  const tabAnimValue = React.useRef(new ReactNative.Animated.Value(0)).current;\n  const [containerWidth, setContainerWidth] = React.useState(null);\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      flexDirection: 'column',\n      width: '100%',\n      paddingBottom: Math.max(safeArea.bottom, 12)\n    },\n    header: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      paddingTop: 16,\n      paddingBottom: 16\n    },\n    headerTitleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    headerTitle: {\n      fontSize: 18,\n      fontWeight: 600,\n      lineHeight: 26,\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    headerIcon: {\n      color: theme.theme.semantic.content.regular.primary\n    },\n    headerClose: {\n      fontSize: 18,\n      color: theme.theme.component?.icon?.primary?.iconFgPrimary || theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    tabsWrapper: {\n      paddingHorizontal: 16,\n      paddingBottom: 12\n    },\n    tabsContainer: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      padding: 4,\n      height: 40,\n      backgroundColor: Utils.withOpacity(theme.theme.component.tabs?.pillTabs?.bgOrganism || theme.theme.semantic.surface.alfa.surface1, 0.05),\n      borderRadius: 20,\n      position: 'relative'\n    },\n    tabIndicator: {\n      position: 'absolute',\n      top: 4,\n      bottom: 4,\n      left: 4,\n      right: 4,\n      width: '33.333%',\n      backgroundColor: theme.theme.component.tabs?.pillTabs?.buttonBgActive || theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 20\n    },\n    tab: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      gap: 6,\n      height: 32,\n      borderRadius: 20,\n      flexShrink: 1,\n      flexGrow: 1,\n      minWidth: 0,\n      zIndex: 1\n    },\n    tabText: {\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.5,\n      color: Utils.withOpacity(theme.theme.component.tabs.pillTabs.buttonContentDefault, 0.5),\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    tabTextActive: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    listContainer: {\n      flex: 1,\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 8,\n      paddingBottom: 16\n    },\n    listItem: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      paddingVertical: 12,\n      gap: 4,\n      borderBottomWidth: 1,\n      borderBottomColor: theme.theme.semantic.stroke.regular.stroke2\n    },\n    leftSection: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    iconCircle: {\n      width: 44,\n      height: 44,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    iconCircleTopup: {\n      backgroundColor: theme.theme.semantic.surface.positive.surface2\n    },\n    iconCirclePayment: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface2\n    },\n    textSection: {\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'flex-start',\n      gap: 2\n    },\n    transactionTitle: {\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.7,\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    transactionDate: {\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.secondary, 0.5),\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    rightSection: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 6,\n      alignSelf: 'flex-end'\n    },\n    value: {\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.7,\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    diamondIcon: {\n      width: 20,\n      height: 20,\n      flexShrink: 0\n    },\n    empty: {\n      flex: 1,\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 40,\n      paddingHorizontal: 0,\n      gap: 12,\n      width: '100%',\n      minHeight: 232\n    },\n    emptyIcon: {\n      width: 68,\n      height: 68\n    },\n    emptyTextContainer: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      padding: 0,\n      gap: 8,\n      width: '100%'\n    },\n    emptyTitle: {\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.7,\n      textAlign: 'center',\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    emptySubtitle: {\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      textAlign: 'center',\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.secondary, 0.5),\n      fontFamily: theme.theme.typography.family.paragraph\n    }\n  }), [theme, safeArea]);\n  const normalized = React.useMemo(() => {\n    if (!transactions) return [];\n    return transactions.map(item => {\n      const delta = parseInt(item.delta, 10) || 0;\n      return {\n        id: item.id,\n        type: delta < 0 ? \"expenses\" : \"topup\",\n        value: Math.abs(delta),\n        date: formatLocalDate(item.created)\n      };\n    });\n  }, [transactions]);\n  const filtered = React.useMemo(() => {\n    if (activeTab === \"all\") return normalized;\n    return normalized.filter(item => item.type === activeTab);\n  }, [normalized, activeTab]);\n  React.useEffect(() => {\n    const loadTransactions = _async(function () {\n      return _continueIgnored(_finallyRethrows(function () {\n        return _catch(function () {\n          setIsLoading(true);\n          return _await(State.get('/api/payment/store/history', 'json'), function (result) {\n            setTransactions(result || []);\n          });\n        }, function (error) {\n          console.error('Failed to load transactions:', error);\n          setTransactions([]);\n        });\n      }, function (_wasThrown, _result) {\n        setIsLoading(false);\n        return _rethrow(_wasThrown, _result);\n      }));\n    });\n    loadTransactions();\n  }, []);\n  const tabs = ['all', 'topup', 'expenses'];\n  const tabTranslationKeys = {\n    'all': 'historyTabAll',\n    'topup': 'historyTabTopUp',\n    'expenses': 'historyTabPayments'\n  };\n  const tabCount = tabs.length;\n  const activeTabIndex = React.useMemo(() => tabs.indexOf(activeTab), [activeTab]);\n  React.useEffect(() => {\n    if (containerWidth !== null) {\n      const tabWidth = (containerWidth - 8) / tabCount; // minus padding\n      const targetValue = activeTabIndex * tabWidth;\n      ReactNative.Animated.spring(tabAnimValue, {\n        toValue: targetValue,\n        useNativeDriver: true,\n        tension: 68,\n        friction: 8\n      }).start();\n    }\n  }, [activeTabIndex, containerWidth, tabCount, tabAnimValue]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerTitleContainer\n  }, /*#__PURE__*/React.createElement(BookIcon, {\n    style: styles.headerIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.headerTitle\n  }, t('shopHistory'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 4,\n    onPress: () => sheet.close(),\n    styleContainer: {\n      position: 'absolute',\n      right: 12,\n      top: 16\n    }\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.headerClose\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tabsWrapper\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tabsContainer,\n    onLayout: e => {\n      setContainerWidth(e.nativeEvent.layout.width);\n    }\n  }, containerWidth !== null && /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    style: [styles.tabIndicator, {\n      transform: [{\n        translateX: tabAnimValue\n      }]\n    }]\n  }), tabs.map(tab => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    key: tab,\n    onPress: () => setActiveTab(tab),\n    style: [styles.tab, {\n      flex: 1\n    }],\n    styleContainer: [{\n      flex: 1\n    }],\n    feedback: true\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.tabText, activeTab === tab && styles.tabTextActive]\n  }, t(tabTranslationKeys[tab])))))), /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n    style: styles.listContainer\n  }, isLoading ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.empty\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t('loading'))) : filtered.length > 0 ? filtered.map(item => /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: item.id,\n    style: styles.listItem\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.leftSection\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.iconCircle, item.type === \"topup\" ? styles.iconCircleTopup : styles.iconCirclePayment]\n  }, item.type === \"topup\" ? /*#__PURE__*/React.createElement(TopupIcon, {\n    style: {\n      color: theme.theme.semantic.content.positive.content1\n    }\n  }) : /*#__PURE__*/React.createElement(PaymentIcon, {\n    style: {\n      color: theme.theme.semantic.content.regular.secondary\n    }\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.textSection\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.transactionTitle\n  }, item.type === \"topup\" ? t('historyTabTopUp') : t('historyTabPayments')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.transactionDate\n  }, item.date))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rightSection\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.value\n  }, formatWithSpaces(item.value)), /*#__PURE__*/React.createElement(HistoryDiamondIcon, {\n    style: styles.diamondIcon\n  })))) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.empty\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.emptyIcon,\n    source: Assets.banana\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.emptyTextContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t('historyNoTransactionsTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptySubtitle\n  }, t('historyNoTransactionsSubtitle'))))));\n};"},"EmailModal":{"name":"EmailModal","key":"296d0de2cd7b71c9b8d9deb1524ce71dd894a63adc8135ca0693654f15f672d3","code":"function _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nreturn ({\n  product\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const BackIcon = ({\n    style\n  }) => {\n    return /*#__PURE__*/React.createElement(SVG.Svg, {\n      width: \"30\",\n      height: \"30\",\n      viewBox: \"0 0 24 24\",\n      fill: \"none\",\n      style: style\n    }, /*#__PURE__*/React.createElement(SVG.Path, {\n      d: \"M14.4312 4.51196C14.7008 4.19767 15.1743 4.1614 15.4888 4.43091C15.8028 4.70053 15.8392 5.1742 15.5698 5.48853L9.98779 12.0002L15.5698 18.512C15.839 18.8264 15.8029 19.3001 15.4888 19.5696C15.1744 19.839 14.7008 19.8026 14.4312 19.4885L8.43115 12.4885C8.19041 12.2077 8.19041 11.7928 8.43115 11.512L14.4312 4.51196Z\",\n      fill: \"currentColor\"\n    }));\n  };\n  const CloseIcon = ({\n    style\n  }) => {\n    return /*#__PURE__*/React.createElement(SVG.Svg, {\n      width: \"30\",\n      height: \"30\",\n      viewBox: \"0 0 24 24\",\n      fill: \"none\",\n      style: style\n    }, /*#__PURE__*/React.createElement(SVG.Path, {\n      d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n      fill: \"currentColor\"\n    }));\n  };\n  const openBrowser = _async(function (url) {\n    return _await(ReactNative.Linking.canOpenURL(url), function (canOpen) {\n      return _invokeIgnored(function () {\n        if (canOpen) {\n          return _awaitIgnored(ReactNative.Linking.openURL(url));\n        } else {\n          Notification.showNotification({\n            text: \"Не удается открыть ссылку, проверьте настройки вашей системы и браузера\",\n            type: 'error',\n            duration: 5000\n          });\n        }\n      });\n    });\n  });\n  const styles = React.useMemo(() => ({\n    container: {\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: Math.max(safeArea.bottom, 12)\n    },\n    content: {\n      paddingHorizontal: 16,\n      paddingVertical: 16,\n      width: '100%'\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    inputContainer: {\n      width: '100%',\n      position: 'relative'\n    },\n    inputIconRight: {\n      position: 'absolute',\n      right: 12,\n      top: 0,\n      bottom: 0,\n      justifyContent: 'center',\n      pointerEvents: 'none'\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%'\n    }\n  }), [theme, safeArea]);\n  const [email, setEmail] = Hooks.useBehaviorSubject(State.state.storage.emailStore);\n  const [paymentUrl, setPaymentUrl] = React.useState(null);\n  const onSubmit = React.useCallback(_async(function () {\n    ReactNative.Keyboard.dismiss();\n    return _continueIgnored(_catch(function () {\n      return _await(State.post(\"/api/payment/yookassa/payment-url/\" + product.id, {\n        email: email\n      }, \"json\"), function (result) {\n        if (!result.confirmation?.confirmation_url) {\n          Notification.showNotification({\n            text: \"Сервер занят, попробуйте позже\",\n            type: 'info',\n            duration: 5000\n          });\n        } else {\n          if (ReactNative.Platform.OS === 'web') {\n            setPaymentUrl(result.confirmation?.confirmation_url);\n          } else {\n            openBrowser(result.confirmation?.confirmation_url);\n            sheet.close();\n          }\n        }\n      });\n    }, function (error) {\n      console.error(error);\n      Notification.showNotification({\n        text: error.message,\n        type: 'error',\n        duration: 5000\n      });\n    }));\n  }), [sheet, email, product]);\n  const onOpen = React.useCallback(() => {\n    if (paymentUrl) {\n      openBrowser(paymentUrl);\n      sheet.close();\n    }\n  }, [paymentUrl]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 4,\n    onPress: sheet.close,\n    styleContainer: {\n      position: 'absolute',\n      left: 12,\n      top: 16\n    }\n  }, /*#__PURE__*/React.createElement(BackIcon, {\n    style: styles.title\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopPaymentEmail'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 4,\n    onPress: () => sheet.close(),\n    styleContainer: {\n      position: 'absolute',\n      right: 12,\n      top: 16\n    }\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.inputContainer, {\n      opacity: paymentUrl ? 0.4 : 1.0\n    }]\n  }, /*#__PURE__*/React.createElement(Components.DSTextInput, {\n    value: email,\n    onChangeText: setEmail,\n    placeholder: \"Email\",\n    returnKeyType: \"done\",\n    onSubmitEditing: onSubmit,\n    autoCorrect: false,\n    autofocus: ReactNative.Platform.OS !== 'web',\n    editable: !paymentUrl,\n    style: {\n      paddingRight: 44\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.inputIconRight\n  }, /*#__PURE__*/React.createElement(Assets.Email, {\n    style: {\n      color: theme.theme.component.textField.contentPrimary\n    }\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonContainer\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    style: styles.button,\n    size: \"L\",\n    feedback: true,\n    onPress: paymentUrl ? onOpen : onSubmit\n  }, t(paymentUrl ? 'shopPaymentOpen' : 'shopPaymentProceed'))));\n};"},"PaymentMethodModalContent":{"name":"PaymentMethodModalContent","key":"c7aa41920e4b52568913308cf7ca6879ada154eb390c7545f6f82bee615058d6","code":"deps:\nconst PaymentMethodGooglePlayIcon = ({\n  size = 24\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: size,\n    height: size,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.4061 11.5391L3.07426 20.1534C3.16782 20.4806 3.33596 20.7824 3.56583 21.0356C3.79569 21.2889 4.08119 21.487 4.4005 21.6146C4.71981 21.7423 5.06448 21.7963 5.40816 21.7724C5.75184 21.7485 6.08544 21.6473 6.38344 21.4767L15.7584 16.2077L11.4061 11.5391Z\",\n    fill: \"#EA4335\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M19.8302 10.0747L15.7762 7.7832L11.2129 11.7349L15.7948 16.1953L19.8179 13.9283C20.1743 13.7442 20.4729 13.4672 20.6811 13.1276C20.8894 12.7879 20.9996 12.3985 20.9996 12.0015C20.9996 11.6045 20.8894 11.215 20.6811 10.8754C20.4729 10.5357 20.1743 10.2588 19.8179 10.0746L19.8302 10.0747Z\",\n    fill: \"#FBBC04\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M3.07454 3.80664C3.02421 3.99038 2.99914 4.17996 3.00001 4.37029V19.5892C3.0005 19.7795 3.02555 19.9689 3.07454 20.1529L11.692 11.7592L3.07454 3.80664Z\",\n    fill: \"#4285F4\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.4682 11.9801L15.777 7.78328L6.41452 2.48971C6.06226 2.28614 5.66162 2.17832 5.2534 2.17725C4.24037 2.17531 3.34975 2.83881 3.07426 3.80089L11.4682 11.9801Z\",\n    fill: \"#34A853\"\n  }));\n};\nconst YooMoneyIcon = ({\n  size = 24\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: size,\n    height: size,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M15.0221 4C10.7225 4 7.30281 7.5948 7.30281 12C7.30281 16.456 10.7715 20 15.0221 20C19.2724 20 22.7414 16.4052 22.7414 12C22.7414 7.5948 19.2724 4 15.0221 4ZM15.0221 14.9368C13.4586 14.9368 12.1389 13.5696 12.1389 11.9492C12.1389 10.3292 13.4586 8.962 15.0221 8.962C16.5853 8.962 17.9045 10.3292 17.9045 11.9492C17.8555 13.6204 16.5853 14.9368 15.0217 14.9368H15.0221ZM7.25379 6.2784V17.924H4.5173L1 6.2784H7.25379Z\",\n    fill: \"#0070F0\"\n  }));\n};\nconst PaymentMethodCloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst PaymentMethodArrowRightIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9.71167 5.53033C10.0046 5.23744 10.4794 5.23744 10.7723 5.53033L16.7117 11.4697C17.0046 11.7626 17.0046 12.2374 16.7117 12.5303L10.7723 18.4697C10.4794 18.7626 10.0046 18.7626 9.71167 18.4697C9.41878 18.1768 9.41878 17.702 9.71167 17.409L15.1208 12L9.71167 6.59099C9.41878 6.2981 9.41878 5.82322 9.71167 5.53033Z\",\n    fill: \"currentColor\"\n  }));\n};\nreturn ({\n  showGooglePlay = true\n} = {}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const styles = React.useMemo(() => ({\n    root: {\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      width: '100%',\n      paddingBottom: Math.max(safeArea.bottom + 8, 16),\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      overflow: 'hidden',\n      backgroundColor: theme.theme.semantic.surface.regular.surface1\n    },\n    header: {\n      height: 56,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 16,\n      paddingTop: 12,\n      paddingBottom: 4\n    },\n    title: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      color: theme.theme.semantic.content.regular.primary,\n      textAlign: 'center'\n    },\n    closeButton: {\n      position: 'absolute',\n      right: 16,\n      top: 16,\n      width: 24,\n      height: 24,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    closeIcon: {\n      color: theme.theme.semantic.content.regular.primary\n    },\n    content: {\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingVertical: 16,\n      alignItems: 'center'\n    },\n    list: {\n      width: '100%',\n      borderRadius: 24,\n      overflow: 'hidden',\n      backgroundColor: theme.theme.semantic.surface.regular.surface2\n    },\n    row: {\n      height: 56,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      paddingHorizontal: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface2\n    },\n    rowLeft: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    rowText: {\n      flex: 1,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      color: theme.theme.component.listItem.contentPrimaryDefault\n    },\n    arrow: {\n      color: theme.theme.semantic.content.regular.secondary\n    },\n    divider: {\n      height: 1,\n      marginHorizontal: 16,\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.content.regular.primary, 0.06)\n    },\n    footer: {\n      paddingHorizontal: 16,\n      paddingTop: 4\n    },\n    cancelButton: {\n      height: 48,\n      width: '100%',\n      borderRadius: 12,\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component.button.secondary.bgDefault\n    },\n    cancelText: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.16,\n      color: theme.theme.component.button.secondary.content\n    }\n  }), [theme, safeArea]);\n  const select = React.useCallback(method => {\n    sheet.close(method);\n  }, [sheet]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('shopPaymentChoose')), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    onPress: () => sheet.close(),\n    styleContainer: styles.closeButton\n  }, /*#__PURE__*/React.createElement(PaymentMethodCloseIcon, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.list\n  }, showGooglePlay && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 2,\n    onPress: () => select('google_play'),\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowLeft\n  }, /*#__PURE__*/React.createElement(PaymentMethodGooglePlayIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText\n  }, \"Google play\")), /*#__PURE__*/React.createElement(PaymentMethodArrowRightIcon, {\n    style: styles.arrow\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 2,\n    onPress: () => select('yoomoney'),\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowLeft\n  }, /*#__PURE__*/React.createElement(YooMoneyIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText\n  }, \"\\u042EKassa\")), /*#__PURE__*/React.createElement(PaymentMethodArrowRightIcon, {\n    style: styles.arrow\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.footer\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 2,\n    onPress: () => sheet.close(),\n    styleContainer: styles.cancelButton\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.cancelText\n  }, t('cancelButton')))));\n};"},"Card":{"name":"Card","key":"03d0809a877dac49ffcfcdd8f79564afdcdffff95a3c2579bee16bc8ddb21879","code":"deps: Status, Country, CountryModal, BadgePremium\nfunction _empty() {}\nconst PremiumLeftSvg = React.memo(({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(PremiumRightSvg, {\n    style: [style, {\n      transform: [{\n        scaleX: -1\n      }]\n    }]\n  });\n});\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst PremiumRightSvg = React.memo(({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"108\",\n    height: \"77\",\n    viewBox: \"0 0 108 77\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8.04127 7.52945L7.30461 7.10823L7.72992 6.37865L8.46658 6.79987L8.04127 7.52945Z\",\n    fill: \"url(#paint0_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8.77879 7.95116L8.04127 7.52945L8.46658 6.79987L9.20411 7.22159L8.77879 7.95116Z\",\n    fill: \"url(#paint1_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9.51632 8.37288L8.77879 7.95116L9.20411 7.22159L9.94163 7.6433L9.51632 8.37288Z\",\n    fill: \"url(#paint2_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9.84935 14.4024C10.1544 14.577 10.2591 14.9636 10.0829 15.2658C9.55426 16.1726 8.38318 16.4833 7.46748 15.9599L0.957563 12.2375C0.0419585 11.7139 -0.271857 10.5541 0.256752 9.64721C0.432958 9.34495 0.823343 9.24144 1.12857 9.41585L9.84935 14.4024Z\",\n    fill: \"url(#paint3_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M10.3612 0.973644C11.306 0.345807 12.692 1.13821 12.6152 2.26249L12.384 5.63587C12.3068 6.76479 13.3889 7.75117 14.5788 7.63668L16.1134 7.48897C17.0218 7.40192 17.5934 8.49782 16.9236 9.04242L12.3089 12.7946C11.4457 13.4962 10.1558 13.5626 9.10046 12.9592L2.76498 9.33658C1.70968 8.73316 1.12283 7.59357 1.3047 6.50246L2.27753 0.667882C2.41896 -0.178914 3.66399 -0.236324 4.04185 0.586482L4.67916 1.97612C5.17386 3.05412 6.57747 3.48889 7.52614 2.85819L10.3612 0.973644Z\",\n    fill: \"url(#paint4_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M45.404 10.2934L44.8141 9.95609L45.1547 9.37191L45.7445 9.70918L45.404 10.2934Z\",\n    fill: \"url(#paint5_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M45.994 10.6307L45.404 10.2934L45.7445 9.70918L46.3345 10.0466L45.994 10.6307Z\",\n    fill: \"url(#paint6_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M46.584 10.9681L45.994 10.6307L46.3345 10.0466L46.9245 10.3839L46.584 10.9681Z\",\n    fill: \"url(#paint7_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M46.85 15.7908C47.0942 15.9304 47.1778 16.2397 47.0369 16.4815C46.6139 17.207 45.6771 17.4557 44.9445 17.0368L39.7369 14.0591C39.0043 13.6402 38.7533 12.7124 39.1762 11.9869C39.3172 11.745 39.6295 11.6621 39.8737 11.8018L46.85 15.7908Z\",\n    fill: \"url(#paint8_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M47.2593 5.04842C48.0152 4.54591 49.124 5.17995 49.0625 6.07949L48.878 8.77823C48.8164 9.68129 49.6819 10.4702 50.6338 10.3786L51.861 10.2604C52.5879 10.1904 53.0453 11.0667 52.5095 11.5025L48.8182 14.5043C48.1277 15.0657 47.095 15.1189 46.2507 14.6361L41.1821 11.738C40.338 11.2551 39.8689 10.3432 40.0145 9.47035L40.7929 4.80295C40.9063 4.12578 41.902 4.08026 42.2041 4.73862L42.7144 5.85035C43.1103 6.71245 44.2329 7.06049 44.9917 6.55608L47.2593 5.04842Z\",\n    fill: \"url(#paint9_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M77.1866 13.0559L76.7445 12.8031L76.9997 12.3652L77.4419 12.618L77.1866 13.0559Z\",\n    fill: \"url(#paint10_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M77.6291 13.3089L77.1866 13.0559L77.4419 12.618L77.8844 12.871L77.6291 13.3089Z\",\n    fill: \"url(#paint11_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M78.0716 13.562L77.6291 13.3089L77.8844 12.871L78.3269 13.1241L78.0716 13.562Z\",\n    fill: \"url(#paint12_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M78.2709 17.1792C78.4541 17.2839 78.5168 17.5159 78.4111 17.6973C78.0938 18.2413 77.3912 18.4279 76.8418 18.1137L72.9365 15.8807C72.3871 15.5665 72.1989 14.8707 72.5161 14.3265C72.6218 14.1451 72.856 14.083 73.0392 14.1877L78.2709 17.1792Z\",\n    fill: \"url(#paint13_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M78.5783 9.12234C79.1452 8.74545 79.9768 9.22098 79.9307 9.89564L79.7928 11.9197C79.7465 12.5971 80.3952 13.1892 81.1091 13.1205L82.0295 13.031C82.5747 12.9785 82.9182 13.6371 82.5162 13.9639L79.7474 16.2148C79.2296 16.6358 78.4553 16.6756 77.8221 16.3136L74.0205 14.1398C73.3873 13.7777 73.035 13.0938 73.1442 12.4391L73.7281 8.93888C73.8129 8.43067 74.5606 8.39603 74.7872 8.88989L75.1691 9.72409C75.466 10.3707 76.3081 10.631 76.8773 10.2526L78.5783 9.12234Z\",\n    fill: \"url(#paint14_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M14.9157 37.9228L14.0313 37.4172L14.5419 36.5413L15.4262 37.047L14.9157 37.9228Z\",\n    fill: \"url(#paint15_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M15.8007 38.4289L14.9157 37.9228L15.4262 37.047L16.3113 37.5531L15.8007 38.4289Z\",\n    fill: \"url(#paint16_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.6857 38.935L15.8007 38.4289L16.3113 37.5531L17.1963 38.0591L16.6857 38.935Z\",\n    fill: \"url(#paint17_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M17.0846 46.1694C17.4509 46.3788 17.5764 46.8427 17.3649 47.2055C16.7304 48.2938 15.3252 48.6667 14.2263 48.0384L6.41496 43.5719C5.31633 42.9435 4.93966 41.5517 5.57399 40.4635C5.78541 40.1008 6.25392 39.9767 6.62017 40.1859L17.0846 46.1694Z\",\n    fill: \"url(#paint18_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M17.6993 30.0557C18.8331 29.3019 20.4964 30.253 20.4041 31.6023L20.127 35.6508C20.0346 37.0055 21.3335 38.1888 22.7614 38.0512L24.6012 37.8738C25.6916 37.7687 26.3783 39.0846 25.5743 39.7383L20.0367 44.24C19.0009 45.0822 17.4531 45.161 16.1866 44.4368L8.58419 40.0898C7.31771 39.3656 6.61273 37.9986 6.8312 36.6892L7.9989 29.6888C8.16847 28.6724 9.66245 28.6035 10.1158 29.5912L10.8815 31.2583C11.4751 32.5519 13.1592 33.0744 14.2976 32.3176L17.6993 30.0557Z\",\n    fill: \"url(#paint19_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M49.6885 37.9223L48.9518 37.5011L49.3771 36.7715L50.1138 37.1927L49.6885 37.9223Z\",\n    fill: \"url(#paint20_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M50.426 38.344L49.6885 37.9223L50.1138 37.1927L50.8513 37.6144L50.426 38.344Z\",\n    fill: \"url(#paint21_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M51.1635 38.7657L50.426 38.344L50.8513 37.6144L51.5888 38.0361L51.1635 38.7657Z\",\n    fill: \"url(#paint22_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M51.4966 44.7952C51.8016 44.9698 51.9063 45.3564 51.7302 45.6586C51.2015 46.5654 50.0304 46.8761 49.1147 46.3527L42.6048 42.6303C41.6892 42.1067 41.3753 40.9469 41.904 40.04C42.0802 39.7378 42.4706 39.6343 42.7758 39.8087L51.4966 44.7952Z\",\n    fill: \"url(#paint23_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M52.0084 31.3665C52.9532 30.7386 54.3392 31.531 54.2624 32.6553L54.0312 36.0287C53.954 37.1576 55.0361 38.144 56.226 38.0295L57.7606 37.8818C58.669 37.7948 59.2406 38.8906 58.5708 39.4353L53.9561 43.1874C53.0929 43.889 51.803 43.9554 50.7477 43.352L44.4122 39.7294C43.3569 39.126 42.77 37.9864 42.9519 36.8953L43.9247 31.0607C44.0662 30.2139 45.3112 30.1565 45.6891 30.9793L46.3264 32.369C46.8211 33.447 48.2247 33.8817 49.1733 33.251L52.0084 31.3665Z\",\n    fill: \"url(#paint24_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M78.882 37.9233L78.2921 37.586L78.6327 37.0019L79.2225 37.3391L78.882 37.9233Z\",\n    fill: \"url(#paint25_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M79.472 38.2607L78.882 37.9233L79.2225 37.3391L79.8125 37.6765L79.472 38.2607Z\",\n    fill: \"url(#paint26_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M80.062 38.5981L79.472 38.2607L79.8125 37.6765L80.4026 38.0139L80.062 38.5981Z\",\n    fill: \"url(#paint27_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M80.328 43.4207C80.5722 43.5604 80.6559 43.8696 80.5149 44.1115C80.0919 44.837 79.1551 45.0856 78.4225 44.6667L73.2149 41.6891C72.4823 41.2702 72.2314 40.3424 72.6543 39.6168C72.7952 39.375 73.1075 39.2921 73.3517 39.4317L80.328 43.4207Z\",\n    fill: \"url(#paint28_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M80.7373 32.6784C81.4932 32.1759 82.6021 32.8099 82.5406 33.7095L82.356 36.4082C82.2944 37.3112 83.1599 38.1001 84.1118 38.0086L85.3391 37.8904C86.0659 37.8203 86.5233 38.6966 85.9876 39.1324L82.2962 42.1342C81.6057 42.6956 80.573 42.7489 79.7287 42.2661L74.6602 39.3679C73.8161 38.8851 73.3469 37.9731 73.4926 37.1003L74.2709 32.4329C74.3844 31.7557 75.38 31.7102 75.6821 32.3686L76.1924 33.4803C76.5883 34.3424 77.7109 34.6905 78.4697 34.186L80.7373 32.6784Z\",\n    fill: \"url(#paint29_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M102.495 37.9228L102.053 37.6699L102.308 37.232L102.75 37.4848L102.495 37.9228Z\",\n    fill: \"url(#paint30_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M102.938 38.1758L102.495 37.9228L102.75 37.4848L103.193 37.7379L102.938 38.1758Z\",\n    fill: \"url(#paint31_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M103.38 38.4288L102.938 38.1758L103.193 37.7379L103.636 37.9909L103.38 38.4288Z\",\n    fill: \"url(#paint32_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M103.58 42.046C103.763 42.1508 103.825 42.3827 103.72 42.5641C103.402 43.1082 102.7 43.2947 102.15 42.9805L98.2451 40.7475C97.6957 40.4334 97.5075 39.7375 97.8246 39.1933C97.9304 39.012 98.1646 38.9498 98.3477 39.0545L103.58 42.046Z\",\n    fill: \"url(#paint33_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M103.887 33.9892C104.454 33.6123 105.285 34.0878 105.239 34.7625L105.101 36.7866C105.055 37.4639 105.704 38.056 106.418 37.9874L107.338 37.8978C107.883 37.8453 108.227 38.5039 107.825 38.8307L105.056 41.0816C104.538 41.5026 103.764 41.5424 103.131 41.1804L99.3291 39.0067C98.6959 38.6446 98.3436 37.9606 98.4528 37.3059L99.0367 33.8057C99.1215 33.2975 99.8691 33.2629 100.096 33.7567L100.478 34.5909C100.775 35.2376 101.617 35.4978 102.186 35.1195L103.887 33.9892Z\",\n    fill: \"url(#paint34_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8.04127 68.3154L7.30461 67.8941L7.72992 67.1646L8.46658 67.5858L8.04127 68.3154Z\",\n    fill: \"url(#paint35_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8.77879 68.7371L8.04127 68.3154L8.46658 67.5858L9.20411 68.0075L8.77879 68.7371Z\",\n    fill: \"url(#paint36_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9.51632 69.1588L8.77879 68.7371L9.20411 68.0075L9.94163 68.4292L9.51632 69.1588Z\",\n    fill: \"url(#paint37_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9.84935 75.1883C10.1544 75.3629 10.2591 75.7495 10.0829 76.0517C9.55426 76.9585 8.38318 77.2692 7.46748 76.7458L0.957563 73.0234C0.0419585 72.4998 -0.271857 71.34 0.256752 70.4331C0.432958 70.1309 0.823343 70.0274 1.12857 70.2018L9.84935 75.1883Z\",\n    fill: \"url(#paint38_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M10.3612 61.7596C11.306 61.1317 12.692 61.9241 12.6152 63.0484L12.384 66.4218C12.3068 67.5507 13.3889 68.5371 14.5788 68.4226L16.1134 68.2749C17.0218 68.1878 17.5934 69.2837 16.9236 69.8283L12.3089 73.5805C11.4457 74.2821 10.1558 74.3485 9.10046 73.7451L2.76498 70.1225C1.70968 69.5191 1.12283 68.3795 1.3047 67.2884L2.27753 61.4538C2.41896 60.607 3.66399 60.5496 4.04185 61.3724L4.67916 62.762C5.17386 63.84 6.57747 64.2748 7.52614 63.6441L10.3612 61.7596Z\",\n    fill: \"url(#paint39_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M45.404 65.5533L44.8141 65.216L45.1547 64.6318L45.7445 64.9691L45.404 65.5533Z\",\n    fill: \"url(#paint40_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M45.994 65.8906L45.404 65.5533L45.7445 64.9691L46.3345 65.3065L45.994 65.8906Z\",\n    fill: \"url(#paint41_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M46.584 66.228L45.994 65.8906L46.3345 65.3065L46.9245 65.6438L46.584 66.228Z\",\n    fill: \"url(#paint42_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M46.85 71.0507C47.0942 71.1903 47.1778 71.4996 47.0369 71.7414C46.6139 72.4669 45.6771 72.7156 44.9445 72.2967L39.7369 69.319C39.0043 68.9001 38.7533 67.9723 39.1762 67.2468C39.3172 67.0049 39.6295 66.9221 39.8737 67.0617L46.85 71.0507Z\",\n    fill: \"url(#paint43_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M47.2593 60.3083C48.0152 59.8058 49.124 60.4399 49.0625 61.3394L48.878 64.0381C48.8164 64.9412 49.6819 65.7301 50.6338 65.6385L51.861 65.5203C52.5879 65.4503 53.0453 66.3266 52.5095 66.7624L48.8182 69.7642C48.1277 70.3256 47.095 70.3788 46.2507 69.896L41.1821 66.9979C40.338 66.515 39.8689 65.6031 40.0145 64.7303L40.7929 60.0629C40.9063 59.3857 41.902 59.3402 42.2041 59.9985L42.7144 61.1103C43.1103 61.9724 44.2329 62.3204 44.9917 61.816L47.2593 60.3083Z\",\n    fill: \"url(#paint44_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M77.1866 62.7898L76.7445 62.537L76.9997 62.0991L77.4419 62.3519L77.1866 62.7898Z\",\n    fill: \"url(#paint45_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M77.6291 63.0429L77.1866 62.7898L77.4419 62.3519L77.8844 62.605L77.6291 63.0429Z\",\n    fill: \"url(#paint46_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M78.0716 63.2959L77.6291 63.0429L77.8844 62.605L78.3269 62.858L78.0716 63.2959Z\",\n    fill: \"url(#paint47_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M78.2709 66.9131C78.4541 67.0179 78.5168 67.2498 78.4111 67.4312C78.0938 67.9753 77.3912 68.1618 76.8418 67.8476L72.9365 65.6146C72.3871 65.3005 72.1989 64.6046 72.5161 64.0604C72.6218 63.879 72.856 63.8169 73.0392 63.9216L78.2709 66.9131Z\",\n    fill: \"url(#paint48_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M78.5783 58.8563C79.1452 58.4794 79.9768 58.9549 79.9307 59.6296L79.7928 61.6537C79.7465 62.331 80.3952 62.9231 81.1091 62.8545L82.0295 62.7649C82.5747 62.7124 82.9182 63.371 82.5162 63.6978L79.7474 65.9487C79.2296 66.3697 78.4553 66.4095 77.8221 66.0475L74.0205 63.8738C73.3873 63.5116 73.035 62.8277 73.1442 62.173L73.7281 58.6728C73.8129 58.1646 74.5606 58.13 74.7872 58.6238L75.1691 59.458C75.466 60.1047 76.3081 60.3649 76.8773 59.9865L78.5783 58.8563Z\",\n    fill: \"url(#paint49_radial_9339_14200)\"\n  }), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint0_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint1_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint2_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint3_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint4_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint5_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint6_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint7_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint8_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint9_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint10_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint11_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint12_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint13_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint14_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint15_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint16_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint17_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint18_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint19_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint20_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint21_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint22_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint23_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint24_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint25_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint26_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint27_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint28_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint29_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint30_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint31_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint32_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint33_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint34_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint35_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint36_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint37_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint38_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint39_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint40_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint41_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint42_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint43_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint44_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint45_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint46_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint47_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint48_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  })), /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    id: \"paint49_radial_9339_14200\",\n    cx: \"0\",\n    cy: \"0\",\n    r: \"1\",\n    gradientUnits: \"userSpaceOnUse\",\n    gradientTransform: \"translate(-249.75 38.5) scale(526.982 150.391)\"\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    stopColor: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: \"white\",\n    stopOpacity: \"0\"\n  }))));\n});\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  session,\n  progress\n}) => {\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const navigation = ReactNavigation.useNavigation();\n  const AVATAR_SIZE = 120;\n  State.api?.users?.useSetUser?.(session);\n  const styles = React.useMemo(() => ({\n    container: {\n      gap: 4,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingHorizontal: 12\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.subtitle,\n      fontSize: 28,\n      lineHeight: 36,\n      fontWeight: 600\n    },\n    row: {\n      marginTop: 4,\n      gap: 6,\n      flexDirection: 'row',\n      flexWrap: 'wrap',\n      width: '100%',\n      ...ReactNative.Platform.select({\n        default: {\n          alignItems: 'center',\n          justifyContent: 'flex-start'\n        },\n        web: {\n          alignItems: 'flex-start',\n          justifyContent: 'center'\n        }\n      })\n    },\n    premiumAvatarWrap: {\n      width: '100%',\n      height: AVATAR_SIZE,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    premiumAvatarSide: {\n      flex: 1,\n      height: AVATAR_SIZE,\n      justifyContent: 'center',\n      alignItems: 'stretch'\n    },\n    premiumAvatarSideLeft: {\n      alignItems: 'flex-end'\n    },\n    premiumAvatarSideRight: {\n      alignItems: 'flex-start'\n    },\n    premiumAvatarCenter: {\n      width: AVATAR_SIZE,\n      height: AVATAR_SIZE,\n      justifyContent: 'center',\n      alignItems: 'center',\n      flexShrink: 0\n    },\n    premiumAvatarBg: {\n      width: '100%',\n      height: AVATAR_SIZE\n    }\n  }), [theme, safeArea]);\n  const hasSubscription = session?.subscription?.hasSubscription;\n  const photos = session?.photos;\n  const photo = photos?.[0];\n  const displayUsername = React.useMemo(() => {\n    const pendingUsername = session?.pending?.username?.trim();\n    return session?.user?.username || pendingUsername || session?.card?.username;\n  }, [session?.card?.username, session?.pending?.username, session?.user?.username]);\n  const image = React.useMemo(() => photo?.path != null ? {\n    source: State.getUrl(`/file/photo/${photo?.path}`),\n    contentFit: 'cover',\n    cachePolicy: \"memory-disk\",\n    placeholder: {\n      thumbhash: photo?.hash\n    }\n  } : null, [photo]);\n  const onEdit = React.useCallback(() => {\n    navigation.dispatch(ReactNavigation.StackActions.push('ProfileEdit'));\n  }, [navigation]);\n  const onCountry = React.useCallback(() => {\n    const currentCountry = session?.card?.country?.toLowerCase();\n    Sheet.showPortal(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"CountryModal\",\n      initialCode: currentCountry ? [currentCountry] : [],\n      mode: \"radio\",\n      onSave: _async(function (codes) {\n        const country = codes?.[0];\n        if (!country || country === currentCountry) return;\n        return _continueIgnored(_catch(function () {\n          return _awaitIgnored(State.api.profile.update({\n            country\n          }, {\n            ...Analytics.getGlobalParams(),\n            analytics_event: 'profile_edited',\n            photos_changed: false,\n            name_changed: false,\n            bio_changed: false,\n            interests_changed: false,\n            geo_changed: true\n          }));\n        }, function (error) {\n          console.error(error);\n          Notification.showNotification({\n            text: error.message,\n            type: 'error',\n            duration: 5000\n          });\n        }));\n      })\n    }), {\n      theme: theme.isDark ? 'dark' : 'light'\n    });\n  }, [session?.card?.country, theme.isDark]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, hasSubscription ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.premiumAvatarWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.premiumAvatarSide, styles.premiumAvatarSideLeft]\n  }, /*#__PURE__*/React.createElement(PremiumLeftSvg, {\n    style: styles.premiumAvatarBg\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.premiumAvatarCenter\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {},\n    onPress: onEdit\n  }, /*#__PURE__*/React.createElement(Components.DSCardAvatar, {\n    value: progress != null ? progress / 100 : 100,\n    image: image\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.premiumAvatarSide, styles.premiumAvatarSideRight]\n  }, /*#__PURE__*/React.createElement(PremiumRightSvg, {\n    style: styles.premiumAvatarBg\n  }))) : /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {},\n    onPress: onEdit\n  }, /*#__PURE__*/React.createElement(Components.DSCardAvatar, {\n    value: progress != null ? progress / 100 : 100,\n    image: image\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title,\n    numberOfLines: 1\n  }, displayUsername), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: onCountry\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Country\",\n    country: session?.card?.country\n  })), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Status\",\n    status: session?.status?.status\n  }), hasSubscription && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"BadgePremium\"\n  })));\n};"},"Balance":{"name":"Balance","key":"a3317c9247bf438aa5d847645ef92e315c7cd1f5077e41192eb88d43c28a28c7","code":"deps: WithAppear\nconst DiamondIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nreturn ({\n  session\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const styles = React.useMemo(() => ({\n    container: {\n      padding: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      gap: 24,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    row: {\n      gap: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      width: '100%'\n    },\n    indicator: {\n      backgroundColor: theme.theme.semantic.surface.brand.surface1,\n      borderRadius: 100,\n      height: 52,\n      width: 52,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    content: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    },\n    status: {\n      gap: 4,\n      flex: 1,\n      alignItems: 'flex-start'\n    },\n    text: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    },\n    header: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.subtitle,\n      fontSize: 24,\n      lineHeight: 32,\n      fontWeight: 600,\n      textAlign: 'left'\n    },\n    image: {\n      width: 36,\n      height: 36\n    },\n    panel: {}\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.indicator\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.image,\n    source: State.getUrl('/api/component/assets/store/diamond.webp')\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.status\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, t(\"profileBalance\")), /*#__PURE__*/React.createElement(Components.DSCountdown, {\n    value: formatWithSpaces(session?.ballance?.amount ?? 0),\n    height: styles.header.lineHeight,\n    style: styles.header\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.panel\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"brandSoft\",\n    onPress: () => {\n      Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n        name: \"store\",\n        isModal: true,\n        purchaseSource: \"settings\"\n      }), {\n        theme: Theme?.isDark?.value ? 'dark' : 'light',\n        props: {\n          swipeUp: true,\n          swipeDismissibleUp: true,\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden'\n          }\n        }\n      });\n    }\n  }, t(\"profileTopup\")))));\n};"},"ProfileGiftsShowcase":{"name":"ProfileGiftsShowcase","key":"c93a060303f6c5a942c7979d249f45d51f009bc47ea4c00107c2141392e115f8","code":"deps: WithAppear\nconst SHOWCASE_SLOTS = 3;\nconst formatNewGiftsBadge = (t, count) => {\n  return t('profileGiftsNewBadge').replace('{0}', String(count));\n};\nconst ArrowRightIcon = ({\n  size = 16,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6 3.33337L10.6667 8.00004L6 12.6667\",\n  stroke: color,\n  strokeWidth: \"1.5\",\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\nconst GiftShowcaseSlot = ({\n  gift,\n  styles\n}) => {\n  if (!gift) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.slot\n    }, /*#__PURE__*/React.createElement(Image, {\n      source: State.getUrl('/api/component/assets/gifts/placeholder-gf.webp'),\n      style: styles.placeholderImage,\n      contentFit: \"contain\"\n    }));\n  }\n  const count = Number(gift.count) || 0;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.slot\n  }, !!gift.giftImageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: gift.giftImageUrl\n    },\n    style: styles.image,\n    contentFit: \"contain\"\n  }), count > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.countBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.countText,\n    numberOfLines: 1\n  }, \"x\", count)));\n};\nreturn ({\n  session,\n  delay\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const enableGifts = State.api.ff.useFF('enableGifts');\n  const userId = session?.user?.id ?? session?.card?.userId ?? null;\n  const showcaseUserId = enableGifts ? userId : null;\n  const {\n    showcase\n  } = State.api?.gifts?.useProfileShowcase?.(showcaseUserId) ?? {\n    showcase: []\n  };\n  const newGiftsCount = State.api?.gifts?.useNewGiftsCount?.() ?? 0;\n  const newGiftsBadge = newGiftsCount > 0 ? formatNewGiftsBadge(t, newGiftsCount) : null;\n  const slots = React.useMemo(() => {\n    return Array.from({\n      length: SHOWCASE_SLOTS\n    }, (_, index) => showcase?.[index] ?? null);\n  }, [showcase]);\n  const openAllGifts = React.useCallback(() => {\n    State.api?.gifts?.markGiftsSeen?.().catch?.(console.error);\n    Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('ProfileGifts'));\n  }, []);\n  const styles = React.useMemo(() => ({\n    container: {\n      width: '100%',\n      padding: 16,\n      borderRadius: 24,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      gap: 16,\n      flexDirection: 'column',\n      alignItems: 'center',\n      overflow: 'hidden'\n    },\n    header: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: 8\n    },\n    title: {\n      flex: 1,\n      minWidth: 0,\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2\n    },\n    headerActions: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      flexShrink: 0\n    },\n    newBadge: {\n      height: 18,\n      paddingHorizontal: 4,\n      borderRadius: 999,\n      backgroundColor: theme.theme.component?.badge?.accent?.bg ?? '#008CF1',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    newBadgeText: {\n      color: theme.theme.component?.badge?.accent?.content ?? '#FFFFFF',\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 12,\n      lineHeight: 12,\n      fontWeight: '500',\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    },\n    seeAll: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 2\n    },\n    seeAllText: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2\n    },\n    seeAllIcon: {\n      color: theme.theme.semantic.content.regular.secondary\n    },\n    row: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 6\n    },\n    slot: {\n      flex: 1,\n      minWidth: 0,\n      height: 101,\n      padding: 12,\n      borderRadius: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface2,\n      alignItems: 'center',\n      justifyContent: 'center',\n      position: 'relative',\n      overflow: 'hidden'\n    },\n    image: {\n      width: 82,\n      height: 82,\n      maxWidth: '100%',\n      maxHeight: '100%'\n    },\n    placeholderImage: {\n      width: 82,\n      height: 82,\n      maxWidth: '100%',\n      maxHeight: '100%'\n    },\n    countBadge: {\n      position: 'absolute',\n      top: 6,\n      right: 6,\n      minHeight: 18,\n      minWidth: 24,\n      paddingHorizontal: 4,\n      borderRadius: 999,\n      backgroundColor: theme.theme.component?.badge?.regularInversion?.bg ?? '#04060F',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    countText: {\n      color: theme.theme.component?.badge?.regularInversion?.content ?? '#FFFFFF',\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 12,\n      lineHeight: 12,\n      fontWeight: '500',\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    }\n  }), [theme]);\n  if (!showcaseUserId) {\n    return null;\n  }\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    delay: delay,\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title,\n    numberOfLines: 1\n  }, t('profileGiftsTitle')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerActions\n  }, !!newGiftsBadge && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.newBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.newBadgeText,\n    numberOfLines: 1\n  }, newGiftsBadge)), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.seeAll,\n    onPress: openAllGifts\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.seeAllText,\n    numberOfLines: 1\n  }, t('profileGiftsSeeAll')), /*#__PURE__*/React.createElement(ArrowRightIcon, {\n    size: 16,\n    color: styles.seeAllIcon.color\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, slots.map((gift, index) => /*#__PURE__*/React.createElement(GiftShowcaseSlot, {\n    key: gift?.catalogId ?? index,\n    gift: gift,\n    styles: styles\n  }))));\n};"},"RatingBlock":{"name":"RatingBlock","key":"7125ac693bdf927c9d1103f76039d354dc6d3de603707c8ead7e4ec4474aca0b","code":"const ArrowRightIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"16\",\n    height: \"16\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M5.67505 2.95312C5.88471 2.7737 6.2005 2.79825 6.38013 3.00781L10.3801 7.67383C10.5405 7.86104 10.5405 8.13798 10.3801 8.3252L6.38013 12.9922C6.20044 13.2017 5.88467 13.2254 5.67505 13.0459C5.4654 12.8662 5.4407 12.5505 5.62036 12.3408L9.34106 7.99902L5.62036 3.6582C5.44088 3.44854 5.46547 3.13277 5.67505 2.95312Z\",\n    fill: \"currentColor\",\n    \"fill-opacity\": \"0.3\"\n  }));\n};\nconst StarIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M9.27236 2.09362C9.58846 1.51568 10.4182 1.51566 10.7343 2.09362L12.3319 5.01354C12.9437 6.13217 13.8638 7.05307 14.9823 7.66491L17.9032 9.26159C18.4808 9.57777 18.4808 10.4083 17.9032 10.7245L14.9823 12.3221C13.8639 12.9339 12.9436 13.8531 12.3319 14.9715L10.7343 17.8934C10.4181 18.4709 9.58848 18.471 9.27236 17.8934L7.67568 14.9715C7.06396 13.853 6.14282 12.9339 5.02432 12.3221L2.1044 10.7245C1.52669 10.4084 1.52676 9.57776 2.1044 9.26159L5.02432 7.66491C6.14289 7.05307 7.06396 6.13217 7.67568 5.01354L9.27236 2.09362Z\",\n    fill: \"#F28B0D\"\n  }));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nreturn ({\n  session\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const rating = parseInt(session?.rating?.rating ?? 0, 10);\n  const styles = React.useMemo(() => ({\n    container: {\n      position: 'relative',\n      padding: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      gap: 24,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: '100%',\n      minHeight: 88\n    },\n    row: {\n      gap: 12,\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    indicator: {\n      backgroundColor: theme.theme.semantic.surface.brand.surface1,\n      borderRadius: 100,\n      height: 52,\n      width: 52,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    content: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    },\n    status: {\n      gap: 4,\n      flex: 1,\n      alignItems: 'flex-start'\n    },\n    text: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.heading,\n      ...theme.theme.typography.fonts.body.m\n    },\n    header: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 24,\n      lineHeight: 32,\n      fontWeight: 600,\n      textAlign: 'left'\n    },\n    image: {\n      width: 36,\n      height: 36\n    },\n    panel: {},\n    labelRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    arrow: {\n      color: theme.theme.semantic.content.regular.secondary,\n      marginTop: 2\n    },\n    badge: {\n      position: 'absolute',\n      top: 8,\n      right: -4,\n      height: 18,\n      paddingHorizontal: 4,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component.badge.brand.bg,\n      borderRadius: 999,\n      transform: [{\n        rotate: '-6deg'\n      }],\n      shadowColor: theme.theme.semantic.surface.brand.surface3,\n      shadowOffset: {\n        width: 0,\n        height: 12\n      },\n      shadowOpacity: 0.55,\n      shadowRadius: 10,\n      elevation: 6,\n      zIndex: 2\n    },\n    badgeText: {\n      fontFamily: theme.theme.typography.family.heading,\n      color: theme.theme.component.badge.brand.content,\n      fontSize: 12,\n      lineHeight: 12,\n      fontWeight: '500',\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.badgeText\n  }, t('comingSoon'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.status\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.labelRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, t(\"profileRating\")), /*#__PURE__*/React.createElement(ArrowRightIcon, {\n    style: styles.arrow\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(StarIcon, {\n    style: styles.arrow\n  }), /*#__PURE__*/React.createElement(Components.DSCountdown, {\n    value: formatWithSpaces(rating),\n    height: styles.header.lineHeight,\n    style: styles.header\n  }))))));\n};"},"StatusBlock":{"name":"StatusBlock","key":"a5257f5693ba1b1acbf427965567962186f77396266835096be4df5e3637feae","code":"const ArrowRightIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"16\",\n    height: \"16\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M5.67505 2.95312C5.88471 2.7737 6.2005 2.79825 6.38013 3.00781L10.3801 7.67383C10.5405 7.86104 10.5405 8.13798 10.3801 8.3252L6.38013 12.9922C6.20044 13.2017 5.88467 13.2254 5.67505 13.0459C5.4654 12.8662 5.4407 12.5505 5.62036 12.3408L9.34106 7.99902L5.62036 3.6582C5.44088 3.44854 5.46547 3.13277 5.67505 2.95312Z\",\n    fill: \"currentColor\",\n    fillOpacity: 0.3\n  }));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nreturn ({\n  session,\n  onPress\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const status = parseInt(session?.status?.status ?? 0, 10);\n  const TIERS = React.useMemo(() => [{\n    key: 'bronze',\n    title: t('statusTierBronze'),\n    min: 0,\n    max: 550,\n    color: theme.theme.semantic.content.status.bronze2,\n    icon: 'bronze.webp'\n  }, {\n    key: 'silver',\n    title: t('statusTierSilver'),\n    min: 550,\n    max: 1250,\n    color: theme.theme.semantic.content.status.silver2,\n    icon: 'silver.webp'\n  }, {\n    key: 'gold',\n    title: t('statusTierGold'),\n    min: 1250,\n    max: 1950,\n    color: theme.theme.semantic.content.status.gold2,\n    icon: 'gold.webp'\n  }, {\n    key: 'emerald',\n    title: t('statusTierEmerald'),\n    min: 1950,\n    max: 3450,\n    color: theme.theme.semantic.content.status.emerald2,\n    icon: 'emerald.webp'\n  }, {\n    key: 'diamond',\n    title: t('statusTierDiamond'),\n    min: 3450,\n    max: Number.MAX_SAFE_INTEGER,\n    color: theme.theme.semantic.content.status.diamond2,\n    icon: 'diamond.webp'\n  }], [t, theme]);\n  const currentTier = React.useMemo(() => TIERS.find(t => status >= t.min && status <= t.max) || TIERS[0], [status, TIERS]);\n  const styles = React.useMemo(() => ({\n    container: {\n      overflow: \"hidden\",\n      position: 'relative',\n      padding: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      gap: 24,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: '100%',\n      minHeight: 88\n    },\n    row: {\n      gap: 12,\n      flexDirection: 'row',\n      justifyContent: 'flex-start',\n      alignItems: 'baseline',\n      width: '100%'\n    },\n    indicator: {\n      backgroundColor: theme.theme.semantic.surface.brand.surface1,\n      borderRadius: 100,\n      height: 52,\n      width: 52,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    content: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    status: {\n      gap: 4,\n      flex: 1,\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    text: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500\n    },\n    header: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 24,\n      lineHeight: 32,\n      fontWeight: 600,\n      textAlign: 'left'\n    },\n    image: {\n      width: 36,\n      height: 36\n    },\n    panel: {},\n    labelRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    arrow: {\n      color: theme.theme.semantic.content.regular.secondary,\n      marginTop: 2\n    },\n    tierText: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: 600\n    },\n    tierIconBg1: {\n      position: 'absolute',\n      top: \"10%\",\n      right: \"35%\",\n      width: 40,\n      height: 40,\n      opacity: 0.2\n    },\n    tierIconBg2: {\n      position: 'absolute',\n      bottom: -44,\n      right: 0,\n      width: 88,\n      height: 88,\n      opacity: 0.35,\n      transform: [{\n        rotate: '15deg'\n      }]\n    },\n    value: {\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontWeight: theme.theme.typography.fonts.body.s.fontWeight,\n      fontSize: theme.theme.typography.fonts.body.s.fontSize,\n      lineHeight: theme.theme.typography.fonts.body.s.lineHeight,\n      letterSpacing: theme.theme.typography.fonts.body.s.letterSpacing,\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.secondary, 0.5)\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onPress,\n    styleContainer: {\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    },\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.tierIconBg1,\n    source: State.getUrl(`/api/component/assets/status-big/${currentTier.icon}`)\n  }), /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.tierIconBg2,\n    source: State.getUrl(`/api/component/assets/status-big/${currentTier.icon}`)\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.status\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.labelRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, t(\"profileStatus\")), /*#__PURE__*/React.createElement(ArrowRightIcon, {\n    style: styles.arrow\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.tierText, {\n      color: currentTier.color\n    }]\n  }, currentTier.title), /*#__PURE__*/React.createElement(Components.DSCountdown, {\n    value: formatWithSpaces(status),\n    height: styles.value.lineHeight,\n    style: styles.value\n  }))))));\n};"},"Pro":{"name":"Pro","key":"fe6f89a620dbb8b5898e06230d0478399673dfa5a5482e963bb1ab3974042f5d","code":"return ({\n  session\n}) => {\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    pro: {\n      container: {\n        padding: 20,\n        backgroundColor: theme.theme.semantic.surface.brand.surface4,\n        borderRadius: 24,\n        gap: 24,\n        flexDirection: 'row',\n        alignItems: 'stretch',\n        justifyContent: 'center',\n        width: '100%'\n      },\n      content: {\n        flex: 1,\n        gap: 4\n      },\n      header: {\n        color: theme.theme.semantic.content.inversion.static.stPrimary,\n        fontSize: 18,\n        fontWeight: 600\n      },\n      text: {\n        color: theme.theme.semantic.content.inversion.static.stPrimary,\n        fontSize: 14,\n        fontWeight: 500\n      },\n      image: {\n        position: 'absolute',\n        top: -20,\n        right: -20,\n        bottom: -20,\n        width: 200\n      },\n      after: {\n        alignItems: 'flex-end',\n        justifyContent: 'flex-end'\n      },\n      button: {\n        gap: 6,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      buttonIcon: {\n        color: theme.theme.component.button.primaryInversion.content\n      },\n      buttonText: {\n        color: theme.theme.component.button.primaryInversion.content,\n        fontSize: 14,\n        fontWeight: 600\n      }\n    },\n    prosub: {\n      container: {\n        padding: 20,\n        backgroundColor: theme.theme.semantic.surface.regular.surface1,\n        borderRadius: 24,\n        gap: 24,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        minHeight: 100,\n        width: '100%',\n        shadowColor: \"#00000033\",\n        shadowOffset: {\n          width: 0,\n          height: 6\n        },\n        shadowOpacity: 0.1,\n        shadowRadius: 8,\n        elevation: 8\n      },\n      content: {\n        flex: 1,\n        gap: 4\n      },\n      header: {\n        color: theme.theme.semantic.content.regular.primary,\n        fontSize: 18,\n        fontWeight: 600\n      },\n      text: {\n        color: theme.theme.semantic.content.regular.secondary,\n        fontSize: 14,\n        fontWeight: 500\n      },\n      absolute: {\n        position: 'absolute',\n        bottom: -24,\n        left: -24,\n        right: -24,\n        top: -24\n      },\n      after: {\n        alignItems: 'flex-end',\n        justifyContent: 'flex-start'\n      },\n      button: {\n        gap: 6,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      buttonIcon: {\n        color: theme.theme.component.button.brand.content\n      },\n      buttonText: {\n        color: theme.theme.component.button.brand.content,\n        fontSize: 16,\n        lineHeight: 18,\n        fontWeight: 700\n      }\n    }\n  }), [theme, safeArea]);\n  const onGetPro = React.useCallback(() => {\n    Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('SubPay'));\n  }, []);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, !session?.subscription?.hasSubscription && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.pro.container,\n    feedback: true,\n    onPress: onGetPro\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.pro.header\n  }, t(\"shopBannerTitle\")), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.pro.text\n  }, t(\"shopBannerSubtitle\"))), /*#__PURE__*/React.createElement(ReactNative.View, null, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.pro.image,\n    source: State.getUrl('/api/component/assets/store/diamonds-bg.webp'),\n    contentFit: \"contain\",\n    contentPosition: 'bottom right'\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro.after\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"primaryInversion\",\n    onPress: onGetPro\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro.button\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.pro.buttonText\n  }, t(\"filtersSubscriptionGetpro\")), /*#__PURE__*/React.createElement(Assets.Diamond, {\n    style: styles.pro.buttonIcon\n  })))))), !!session?.subscription?.hasSubscription && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.prosub.container,\n    feedback: true,\n    onPress: onGetPro\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.prosub.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.prosub.header\n  }, \"Subscribe is active\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.prosub.text\n  }, session?.subscription?.subscriptionRemaining?.years, \" year \", session?.subscription?.subscriptionRemaining?.months, \" month \", session?.subscription?.subscriptionRemaining?.days, \" days\")), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.prosub.after\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"ghost\",\n    size: \"S\",\n    feedback: true,\n    onPress: onGetPro,\n    style: {\n      borderRadius: 24,\n      overflow: 'hidden'\n    }\n  }, /*#__PURE__*/React.createElement(LinearGradient, {\n    end: {\n      x: 0,\n      y: 0.5\n    },\n    start: {\n      x: 1,\n      y: 0.5\n    },\n    colors: [theme.theme.semantic.surface.brand.surface4, theme.theme.semantic.surface.additionalTwo.surface3],\n    style: styles.prosub.absolute\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.prosub.button\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.prosub.buttonText\n  }, \"PRO\"), /*#__PURE__*/React.createElement(Assets.Crown, {\n    style: styles.prosub.buttonIcon\n  }))))));\n};"},"ProfilePremium":{"name":"ProfilePremium","key":"0c92a5d3b0d6852f09a9633c19266e1c56f71fd84fede7c1439be61ed24c55c2","code":"const ManagePremiumIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"16\",\n    height: \"16\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.9439 12.0005C12.22 12.0005 12.4439 12.2244 12.4439 12.5005C12.4437 13.3287 11.7722 14.0005 10.9439 14.0005H5.05523C4.22709 14.0003 3.55544 13.3286 3.55523 12.5005C3.55523 12.2245 3.77924 12.0007 4.05523 12.0005H11.9439ZM6.98003 2.6001C7.37263 1.7999 8.62635 1.80003 9.01909 2.6001L10.1968 5.00245C10.5911 5.80594 11.7161 6.05785 12.4781 5.51319L13.4595 4.81104C14.0413 4.39514 14.8635 4.92158 14.6246 5.55713L12.9771 9.93506C12.6691 10.7539 11.8204 11.3041 10.8658 11.3042H5.13433C4.17956 11.3042 3.3301 10.7539 3.02202 9.93506L1.37554 5.55713C1.1364 4.92151 1.95775 4.39511 2.5396 4.81104L3.52202 5.51319C4.28389 6.05758 5.40796 5.8057 5.8023 5.00245L6.98003 2.6001Z\",\n    fill: \"currentColor\"\n  }));\n};\nreturn ({\n  session,\n  onManage,\n  delay\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const hasSubscription = !!session?.subscription?.hasSubscription;\n  const remainingText = React.useMemo(() => {\n    const years = session?.subscription?.subscriptionRemaining?.years ?? 0;\n    const months = session?.subscription?.subscriptionRemaining?.months ?? 0;\n    const days = session?.subscription?.subscriptionRemaining?.days ?? 0;\n    return t('profilePremiumRemaining', years, months, days);\n  }, [session?.subscription?.subscriptionRemaining, t]);\n  const styles = React.useMemo(() => ({\n    flex: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      width: '100%'\n    },\n    container: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      padding: 16,\n      flexDirection: 'row',\n      alignItems: 'center',\n      width: '100%'\n    },\n    content: {\n      flex: 1,\n      gap: 4\n    },\n    headerRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    header: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 18,\n      fontWeight: '600'\n    },\n    chevron: {\n      color: theme.theme.semantic.content.regular.primary,\n      width: 16,\n      height: 16\n    },\n    subtitle: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      fontWeight: '400'\n    },\n    button: {\n      backgroundColor: theme.theme.component.button.brandSoft.bgDefault,\n      borderRadius: 12,\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 6\n    },\n    buttonText: {\n      color: theme.theme.component.button.brandSoft.content,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      fontWeight: '600'\n    },\n    buttonIcon: {\n      color: theme.theme.component.button.brandSoft.content,\n      width: 16,\n      height: 16\n    }\n  }), [theme]);\n  const onContainerPress = React.useCallback(() => {\n    Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('SubPay'));\n  }, []);\n  const onManagePress = React.useCallback(() => {\n    onManage?.();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"store\",\n      isModal: true\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [onManage]);\n  if (!hasSubscription) return null;\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    style: styles.flex,\n    delay: delay\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.container,\n    styleContainer: styles.flex,\n    feedback: true,\n    onPress: onContainerPress\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header\n  }, t('profilePremiumActive')), /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"16\",\n    height: \"16\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: styles.chevron\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M5.67505 2.95312C5.88471 2.7737 6.2005 2.79825 6.38013 3.00781L10.3801 7.67383C10.5405 7.86104 10.5405 8.13798 10.3801 8.3252L6.38013 12.9922C6.20044 13.2017 5.88467 13.2254 5.67505 13.0459C5.4654 12.8662 5.4407 12.5505 5.62036 12.3408L9.34106 7.99902L5.62036 3.6582C5.44088 3.44854 5.46547 3.13277 5.67505 2.95312Z\",\n    fill: \"currentColor\",\n    \"fill-opacity\": \"0.3\"\n  }))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, remainingText)), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.button,\n    feedback: true,\n    onPress: onManagePress\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t('profilePremiumManage')), /*#__PURE__*/React.createElement(ManagePremiumIcon, {\n    style: styles.buttonIcon\n  }))));\n};"},"About":{"name":"About","key":"2e692ead09aea056a5e3c9a85b5599441ed1d9509b496cc32667242097334e1c","code":"deps: AddButton, WithAppear\nreturn ({\n  session,\n  delay\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const navigation = ReactNavigation.useNavigation();\n  const styles = React.useMemo(() => ({\n    container: {\n      padding: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    },\n    header: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500\n    },\n    text: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    }\n  }), [theme]);\n  const onEdit = React.useCallback(() => {\n    navigation.dispatch(ReactNavigation.StackActions.push('ProfileEdit', {\n      focus: 'about'\n    }));\n  }, [navigation]);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    style: styles.container,\n    delay: delay\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header\n  }, t(\"profileBioHeader\")), !!session?.card?.about ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: onEdit\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, session?.card?.about)) : /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"AddButton\",\n    onPress: onEdit\n  }));\n};"},"Interests":{"name":"Interests","key":"32001fc011432fba0aa2d6b08d036e9bb443e4f4702a45b10236d08443b21e10","code":"deps: AddButton, TagsModal, WithAppear\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst AddIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"18\",\n    height: \"18\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_1076_8193)\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M8 0.833008C11.9578 0.833184 15.1658 4.04222 15.166 8C15.1658 11.9578 11.9578 15.1658 8 15.166C4.04222 15.1658 0.833184 11.9578 0.833008 8C0.833184 4.04222 4.04222 0.833184 8 0.833008ZM8 1.83301C4.5945 1.83318 1.83318 4.5945 1.83301 8C1.83318 11.4055 4.5945 14.1658 8 14.166C11.4055 14.1658 14.1658 11.4055 14.166 8C14.1658 4.5945 11.4055 1.83318 8 1.83301Z\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8 5.5C8.27614 5.5 8.5 5.72386 8.5 6V7.5H10C10.2761 7.5 10.5 7.72387 10.5 8C10.5 8.27614 10.2761 8.5 10 8.5H8.5V10C8.5 10.2761 8.27614 10.5 8 10.5C7.72386 10.5 7.5 10.2761 7.5 10V8.5H6C5.72386 8.5 5.5 8.27614 5.5 8C5.50001 7.72387 5.72386 7.5 6 7.5H7.5V6C7.5 5.72386 7.72386 5.5 8 5.5Z\",\n    fill: \"currentColor\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_1076_8193\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"18\",\n    height: \"18\",\n    fill: \"currentColor\"\n  }))));\n};\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  session,\n  delay\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    section: {\n      container: {\n        padding: 16,\n        backgroundColor: theme.theme.semantic.surface.regular.surface1,\n        borderRadius: 24,\n        gap: 8,\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'center',\n        width: '100%',\n        overflow: 'visible'\n      },\n      row: {\n        flexDirection: 'row',\n        alignItems: 'flex-start',\n        justifyContent: 'flex-start',\n        width: '100%'\n      },\n      header: {\n        color: theme.theme.semantic.content.regular.secondary,\n        fontFamily: theme.theme.typography.family.paragraph,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: 500\n      }\n    },\n    tags: {\n      flexDirection: 'row',\n      flexWrap: 'wrap',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 8,\n      overflow: 'visible'\n    },\n    tag: {\n      backgroundColor: theme.theme.component.chip.bgDefault,\n      borderRadius: 999,\n      paddingHorizontal: 16,\n      paddingVertical: 12,\n      shadowColor: \"#00000033\",\n      shadowOffset: {\n        width: 0,\n        height: 6\n      },\n      shadowOpacity: 0.1,\n      shadowRadius: 8,\n      elevation: 8,\n      overflow: 'visible'\n    },\n    tagText: {\n      color: theme.theme.component.chip.contentDefault,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      fontWeight: 500,\n      letterSpacing: -0.2\n    },\n    tagAddButton: {\n      backgroundColor: theme.theme.component.button.brandSoft.bgDefault,\n      overflow: 'visible'\n    },\n    tagAddButtonInner: {\n      flexDirection: 'row',\n      gap: 4,\n      alignItems: 'center'\n    },\n    tagAddButtonText: {\n      color: theme.theme.component.button.brandSoft.content,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.14\n    },\n    tagAddButtonIcon: {\n      color: theme.theme.component.button.brandSoft.content\n    },\n    addButtonWrapper: {\n      width: '100%'\n    }\n  }), [theme]);\n  const tags = session?.card?.tags ?? [];\n  const onEdit = React.useCallback(_async(function () {\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"TagsModal\",\n      tags: tags\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    }), function (result) {\n      if (result == null || result.length === tags.length && result.every((tag, index) => tag === tags[index])) return;\n      return _continueIgnored(_catch(function () {\n        return _await(State.post('/api/login/profile', {\n          tags: result\n        }, 'json', undefined, undefined, {\n          analytics: {\n            ...Analytics.getGlobalParams(),\n            analytics_event: 'profile_edited',\n            photos_changed: false,\n            name_changed: false,\n            bio_changed: false,\n            interests_changed: true,\n            geo_changed: false\n          }\n        }), function ({\n          card\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            card\n          });\n        });\n      }, function (error) {\n        console.error(error);\n        Notification.showNotification({\n          text: error.message,\n          type: 'error',\n          duration: 5000\n        });\n      }));\n    });\n  }), [tags, theme.isDark]);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    style: styles.section.container,\n    delay: delay\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.section.row\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.section.header, {\n      flex: 1\n    }]\n  }, t('profileInterests')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.section.header\n  }, tags.length, \"/7\", \" \")), tags.length === 0 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.addButtonWrapper\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"AddButton\",\n    noloading: true,\n    onPress: onEdit\n  })) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tags\n  }, tags?.map(tag => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    key: tag,\n    style: styles.tag,\n    feedback: true,\n    noloading: true,\n    onPress: onEdit\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.tagText, {\n      fontFamily: theme.theme.typography.family.paragraph\n    }]\n  }, t(tag)))), tags.length < 7 && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: [styles.tag, styles.tagAddButton],\n    feedback: true,\n    noloading: true,\n    onPress: onEdit\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tagAddButtonInner\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.tagAddButtonText\n  }, t(\"buttonAddMore\")), /*#__PURE__*/React.createElement(AddIcon, {\n    style: styles.tagAddButtonIcon\n  })))));\n};"},"Media":{"name":"Media","key":"ced0edfc5cf2f9bffb5c7bcacce796937c6a1dcb21af1f9c4e4b716c4e74b6d0","code":"deps: PhotoButton, WithAppear, PhotoViewer\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction ensureMinLength(arr, minLength = 3, fillValue = null) {\n  if (!Array.isArray(arr)) {\n    return Array(minLength).fill(fillValue);\n  }\n  if (arr.length >= minLength) {\n    return arr;\n  }\n\n  // Создаем новый массив с недостающими null значениями\n  const result = [...arr];\n  while (result.length < minLength) {\n    result.push(fillValue);\n  }\n  return result;\n}\nreturn ({\n  session,\n  delay\n}) => {\n  const navigation = ReactNavigation.useNavigation();\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    container: {\n      paddingVertical: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    header: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      paddingHorizontal: 16,\n      width: '100%'\n    },\n    row: {\n      gap: 4,\n      paddingHorizontal: 16,\n      overflow: 'hidden',\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start'\n    },\n    item: {\n      maxWidth: 120,\n      minHeight: 120,\n      aspectRatio: 1\n    }\n  }), [theme]);\n  const onGetPro = React.useCallback(_async(function () {\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"getpro\"\n    }), {\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n    return _await();\n  }), []);\n  const photos = ensureMinLength(session.photos ?? [], 3, null);\n  const onUpload = Components.useCallbackLoader(_async(function (index) {\n    navigation.dispatch(ReactNavigation.StackActions.push('ProfileEdit'));\n    return _await();\n  }), []);\n  const onOpen = React.useCallback(index => {\n    const viewerPhotos = photos.filter(p => !!p?.path);\n    const openedPhoto = photos[index];\n    const viewerIndex = Math.max(0, viewerPhotos.findIndex(photo => photo?.uid === openedPhoto?.uid));\n    Modals.pushModal(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"PhotoViewer\",\n      images: viewerPhotos.map(photo => ({\n        source: State.getUrl(`/file/photo/${photo.path}`),\n        placeholder: {\n          thumbhash: photo.hash\n        }\n      })),\n      index: viewerIndex,\n      avatarIndex: 0,\n      setAvatarLabel: t('profileSetAsAvatar'),\n      avatarBadgeLabel: t('profileThisIsYourAvatar'),\n      backLabel: t('profilePhotoViewerBack'),\n      deleteLabel: t('buttonDelete'),\n      onSetAvatar: _async(function (viewerPhotoIndex) {\n        const targetPhoto = viewerPhotos[viewerPhotoIndex];\n        if (!targetPhoto?.uid) return;\n        const currentPhotos = (State.state.session.value?.photos ?? photos).filter(p => !!p?.path);\n        const targetIndex = currentPhotos.findIndex(photo => photo?.uid === targetPhoto.uid);\n        if (targetIndex <= 0) return;\n        const reorderedPhotos = [...currentPhotos];\n        const [avatarPhoto] = reorderedPhotos.splice(targetIndex, 1);\n        reorderedPhotos.unshift(avatarPhoto);\n        return _await(State.post('/api/login/profile/photo/reorder', {\n          uids: reorderedPhotos.map(p => p.uid)\n        }, 'json'), function ({\n          photos: photosReordered\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            photos: photosReordered\n          });\n        });\n      }),\n      onRemove: _async(function (viewerPhotoIndex) {\n        const targetPhoto = viewerPhotos[viewerPhotoIndex];\n        if (!targetPhoto?.uid) return;\n        return _await(State.post('/api/login/profile/photo/remove', {\n          uid: targetPhoto.uid\n        }, 'json'), function ({\n          photos\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            photos\n          });\n        });\n      })\n    }));\n  }, [t, ...photos]);\n  const [rowWidth, setRowWidth] = React.useState(null);\n  const itemSize = React.useMemo(() => rowWidth != null ? rowWidth / 3 - 4 * 2 - 5 : 120, [rowWidth]);\n  const style = React.useMemo(() => [styles.item, {\n    maxWidth: itemSize,\n    minWidth: itemSize,\n    width: itemSize,\n    height: itemSize\n  }], [itemSize]);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    delay: delay,\n    style: styles.container,\n    onLayout: e => setRowWidth(e.nativeEvent.layout.width)\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header\n  }, t(\"profileMedia\")), /*#__PURE__*/React.createElement(ReactNative.FlatList, {\n    contentContainerStyle: styles.row,\n    horizontal: true,\n    data: photos,\n    renderItem: ({\n      item,\n      index\n    }) => /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"PhotoButton\",\n      style: style,\n      photo: item,\n      index: index,\n      onOpen: onOpen,\n      onUpload: onUpload\n    }),\n    keyExtractor: (item, index) => item?.uid ?? index\n  }));\n};"},"StatusesModal":{"name":"StatusesModal","key":"b8b1e961594f310a60601c577914baee2ad61a39547a9b1fa752fe798c106140","code":"const CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"30\",\n    height: \"30\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nreturn ({\n  session,\n  onTopUp\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const currentRating = parseInt(session?.status?.status ?? 0, 10);\n  const leagues = React.useMemo(() => [{\n    key: 'bronze',\n    name: t('statusTierBronze'),\n    min: 0,\n    max: 550,\n    color: theme.theme.semantic.content.status.bronze2,\n    icon: 'bronze.webp'\n  }, {\n    key: 'silver',\n    name: t('statusTierSilver'),\n    min: 550,\n    max: 1250,\n    color: theme.theme.semantic.content.status.silver2,\n    icon: 'silver.webp'\n  }, {\n    key: 'gold',\n    name: t('statusTierGold'),\n    min: 1250,\n    max: 1950,\n    color: theme.theme.semantic.content.status.gold2,\n    icon: 'gold.webp'\n  }, {\n    key: 'emerald',\n    name: t('statusTierEmerald'),\n    min: 1950,\n    max: 3450,\n    color: theme.theme.semantic.content.status.emerald2,\n    icon: 'emerald.webp'\n  }, {\n    key: 'diamond',\n    name: t('statusTierDiamond'),\n    min: 3450,\n    max: Number.MAX_SAFE_INTEGER,\n    color: theme.theme.semantic.content.status.diamond2,\n    icon: 'diamond.webp'\n  }], [t, theme]);\n  const getCurrentLeague = React.useCallback(rating => {\n    return leagues.find(l => rating >= l.min && rating < l.max) || leagues[0];\n  }, [leagues]);\n  const getZoneInfo = React.useCallback((league, isCurrent) => {\n    // if (isCurrent) return formatWithSpaces(currentRating);\n    const {\n      min,\n      max\n    } = league;\n    return max === Number.MAX_SAFE_INTEGER ? `${formatWithSpaces(min)}+` : formatWithSpaces(min);\n  }, [currentRating]);\n  const currentLeague = React.useMemo(() => getCurrentLeague(currentRating), [currentRating, getCurrentLeague]);\n  const nextLeague = React.useMemo(() => {\n    if (!currentLeague) return null;\n    const currentIndex = leagues.findIndex(l => l.key === currentLeague.key);\n    return leagues[currentIndex + 1] || null;\n  }, [currentLeague, leagues]);\n  const {\n    statusMin,\n    statusMax\n  } = React.useMemo(() => {\n    if (!currentLeague) return {\n      statusMin: 0,\n      statusMax: 550\n    };\n\n    // statusMin shows progress value inside current league\n    const statusMinValue = currentRating - currentLeague.min;\n\n    // statusMax shows value left to the next tier\n    const statusMaxValue = nextLeague ? nextLeague.min - currentLeague.min : 0;\n    return {\n      statusMin: formatWithSpaces(statusMinValue),\n      statusMax: formatWithSpaces(statusMaxValue)\n    };\n  }, [currentRating, currentLeague, nextLeague]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      overflow: 'hidden',\n      paddingBottom: safeArea.bottom + 4\n    },\n    content: {\n      paddingHorizontal: 16,\n      width: '100%'\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 700,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    leagueItem: {\n      marginVertical: 4,\n      borderRadius: 24,\n      padding: 16,\n      gap: 20,\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.05)\n    },\n    currentBadge: {\n      position: 'absolute',\n      right: 16,\n      top: -8,\n      backgroundColor: '#FE375B',\n      borderRadius: 999,\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 6,\n      gap: 4,\n      zIndex: 2\n    },\n    currentBadgeText: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontWeight: 600,\n      fontSize: 12,\n      lineHeight: 12,\n      textAlign: 'center',\n      letterSpacing: -0.3,\n      color: theme.theme.component.badge.brand.content\n    },\n    leagueContent: {\n      flexDirection: 'column',\n      gap: 20\n    },\n    leagueTopRow: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      width: '100%'\n    },\n    leagueTopRowCurrent: {},\n    leagueTopRowOther: {},\n    leagueLeftSection: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 12,\n      flex: 1\n    },\n    leagueLeftSectionCurrent: {},\n    leagueLeftSectionOther: {},\n    leagueIconContainer: {\n      width: 52,\n      height: 52,\n      borderRadius: 999,\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    leagueIconContainerOther: {\n      backgroundColor: 'rgba(119, 134, 139, 0.2)'\n    },\n    leagueIcon: {\n      width: 24,\n      height: 24\n    },\n    leagueName: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontWeight: theme.theme.typography.fonts.heading.medium.fontWeight,\n      fontSize: theme.theme.typography.fonts.heading.medium.fontSize,\n      lineHeight: theme.theme.typography.fonts.heading.medium.lineHeight,\n      letterSpacing: theme.theme.typography.fonts.heading.medium.letterSpacing,\n      textAlign: 'center',\n      color: theme.theme.semantic.content.regular.primary\n    },\n    leagueNameCurrent: {},\n    leagueNameOther: {},\n    leagueInfoContainer: {\n      flexDirection: 'row',\n      justifyContent: 'flex-end',\n      alignItems: 'center',\n      gap: 6,\n      height: 24,\n      minWidth: 60\n    },\n    leagueInfoContainerCurrent: {},\n    leagueInfoContainerOther: {},\n    leagueInfo: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontWeight: 400,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    leagueInfoCurrent: {\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.7,\n      fontFamily: theme.theme.typography.family.paragraph,\n      color: theme.theme.semantic.content.regular.primary\n    },\n    leagueInfoOther: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontWeight: theme.theme.typography.fonts.heading.small.fontWeight,\n      fontSize: theme.theme.typography.fonts.heading.small.fontSize,\n      lineHeight: theme.theme.typography.fonts.heading.small.lineHeight,\n      letterSpacing: theme.theme.typography.fonts.heading.ultraSmall.letterSpacing,\n      textAlign: 'center',\n      color: theme.theme.semantic.content.regular.primary\n    },\n    leagueInfoIcon: {\n      width: 20,\n      height: 20\n    },\n    leagueProgressSection: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      gap: 20\n    },\n    leagueProgressInfo: {\n      flexDirection: 'column',\n      gap: 12,\n      flex: 1,\n      minWidth: 0\n    },\n    leagueProgressRow: {\n      flexDirection: 'row',\n      justifyContent: 'flex-start',\n      alignItems: 'baseline',\n      gap: 8\n    },\n    leagueProgressContainer: {\n      flex: 1\n    },\n    leagueProgressLabel: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 13,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    leagueProgressNumbers: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      gap: 2\n    },\n    leagueProgressCurrent: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    leagueProgressSeparator: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    leagueProgressMax: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 2\n    },\n    leagueProgressMaxText: {\n      color: '#FE375B',\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 700,\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    leagueProgressMaxIcon: {\n      width: 16,\n      height: 16\n    },\n    leagueProgressBar: {\n      width: '100%',\n      height: 8,\n      backgroundColor: 'rgba(4, 6, 15, 0.05)',\n      borderRadius: 999\n    },\n    leagueTopUpButton: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      gap: 6,\n      minHeight: 40,\n      backgroundColor: theme.theme.component.button.brandSoft.bgDefault,\n      borderRadius: 12\n    },\n    topUpButtonText: {\n      color: '#FE375B',\n      fontWeight: 600,\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      flexShrink: 0,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    headerSection: {\n      flexDirection: 'column',\n      gap: 4,\n      width: '100%',\n      marginBottom: 16\n    },\n    headerTitle: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontWeight: theme.theme.typography.fonts.heading.medium.fontWeight,\n      fontSize: theme.theme.typography.fonts.heading.medium.fontSize,\n      lineHeight: theme.theme.typography.fonts.heading.medium.lineHeight,\n      letterSpacing: theme.theme.typography.fonts.heading.medium.letterSpacing,\n      color: theme.theme.semantic.content.regular.primary\n    },\n    headerDescription: {\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontWeight: theme.theme.typography.fonts.body.l.fontWeight,\n      fontSize: theme.theme.typography.fonts.body.l.fontSize,\n      lineHeight: theme.theme.typography.fonts.body.l.lineHeight,\n      letterSpacing: theme.theme.typography.fonts.body.l.letterSpacing,\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.secondary, 0.5)\n    }\n  }), [theme, safeArea]);\n  const handleTopUp = React.useCallback(() => {\n    sheet.close();\n    if (onTopUp) {\n      onTopUp();\n    }\n  }, [sheet, onTopUp]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('statusModalHeader'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 4,\n    onPress: () => sheet.close(),\n    styleContainer: {\n      position: 'absolute',\n      right: 12,\n      top: 16\n    }\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerSection\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.headerTitle\n  }, t('statusModalMainHeader')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.headerDescription\n  }, t('statusModalDescription'))), leagues.map(league => {\n    const isCurrent = league === currentLeague;\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: league.key,\n      style: styles.leagueItem\n    }, isCurrent && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.currentBadge\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.currentBadgeText\n    }, t('statusModalCurrent'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.leagueContent\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.leagueTopRow, isCurrent ? styles.leagueTopRowCurrent : styles.leagueTopRowOther]\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.leagueLeftSection, isCurrent ? styles.leagueLeftSectionCurrent : styles.leagueLeftSectionOther]\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.leagueIconContainer, {\n        backgroundColor: Utils.withOpacity(league.color, 0.15)\n      }]\n    }, /*#__PURE__*/React.createElement(Components.DSImage, {\n      hideProgress: true,\n      style: styles.leagueIcon,\n      source: State.getUrl(`/api/component/assets/status/${league.icon}`)\n    })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.leagueName, isCurrent ? styles.leagueNameCurrent : styles.leagueNameOther]\n    }, league.name)), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.leagueInfoContainer, styles.leagueInfoContainerOther]\n    }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.leagueInfoOther\n    }, getZoneInfo(league, isCurrent))))), isCurrent && currentLeague.key !== 'diamond' && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.leagueProgressSection\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.leagueProgressInfo\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.leagueProgressRow\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.leagueProgressContainer\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.leagueProgressLabel\n    }, t('shopStatusNext'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.leagueProgressNumbers\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.leagueProgressCurrent,\n      numberOfLines: 1\n    }, statusMin), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.leagueProgressSeparator\n    }, \"/\"), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.leagueProgressMax\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.leagueProgressMaxText,\n      numberOfLines: 1\n    }, statusMax)))), /*#__PURE__*/React.createElement(Components.DSProgress, {\n      style: styles.leagueProgressBar,\n      value: nextLeague ? (currentRating - currentLeague.min) / (nextLeague.min - currentLeague.min) : 1,\n      inactiveColor: Utils.withOpacity(theme.theme.component.progressBar.contentNotActive, 0.05)\n    })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      onPress: handleTopUp,\n      style: styles.leagueTopUpButton\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.topUpButtonText,\n      numberOfLines: 1\n    }, t('bannedButtonBalanceTopup'))))));\n  })));\n};"},"VerificationNotificationBanner":{"name":"VerificationNotificationBanner","key":"ae183a9a5ad031380ffcf7363084d9b3b9d5c6c2610b26c1ff98758a9fc7efa7","code":"const InfoCircleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12 2.25C17.385 2.25 21.75 6.615 21.75 12C21.75 17.385 17.385 21.75 12 21.75C6.615 21.75 2.25 17.385 2.25 12C2.25 6.615 6.615 2.25 12 2.25ZM12 3.75C7.443 3.75 3.75 7.443 3.75 12C3.75 16.557 7.443 20.25 12 20.25C16.557 20.25 20.25 16.557 20.25 12C20.25 7.443 16.557 3.75 12 3.75ZM12 10.25C12.414 10.25 12.75 10.586 12.75 11V16C12.75 16.414 12.414 16.75 12 16.75C11.586 16.75 11.25 16.414 11.25 16V11C11.25 10.586 11.586 10.25 12 10.25ZM12 7.25C12.552 7.25 13 7.698 13 8.25C13 8.802 12.552 9.25 12 9.25C11.448 9.25 11 8.802 11 8.25C11 7.698 11.448 7.25 12 7.25Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst DangerTriangleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M10.705 3.83C11.281 2.818 12.719 2.818 13.295 3.83L22.04 19.204C22.606 20.2 21.887 21.438 20.745 21.438H3.255C2.113 21.438 1.394 20.2 1.96 19.204L10.705 3.83ZM12 4.572L3.255 19.946H20.745L12 4.572ZM12 9.25C12.414 9.25 12.75 9.586 12.75 10V14C12.75 14.414 12.414 14.75 12 14.75C11.586 14.75 11.25 14.414 11.25 14V10C11.25 9.586 11.586 9.25 12 9.25ZM12 16.25C12.552 16.25 13 16.698 13 17.25C13 17.802 12.552 18.25 12 18.25C11.448 18.25 11 17.802 11 17.25C11 16.698 11.448 16.25 12 16.25Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst ChevronDownIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M5.47 8.97C5.763 8.677 6.237 8.677 6.53 8.97L12 14.44L17.47 8.97C17.763 8.677 18.237 8.677 18.53 8.97C18.823 9.263 18.823 9.737 18.53 10.03L12.53 16.03C12.237 16.323 11.763 16.323 11.47 16.03L5.47 10.03C5.177 9.737 5.177 9.263 5.47 8.97Z\",\n    fill: \"currentColor\"\n  }));\n};\nreturn ({\n  session\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [open, setOpen] = React.useState(false);\n  const verificationStatus = session?.verificationStatus ?? session?.user?.verificationStatus ?? session?.card?.verificationStatus;\n  const isRejected = verificationStatus === 'REJECTED';\n  const isPending = verificationStatus === 'PENDING';\n  // Prefer the backend marker because a previously verified profile may not\n  // have photos. Keep the photo check as a compatibility fallback while old\n  // sessions/responses without the marker are still in circulation.\n  const hasVerifiedSnapshot = typeof session?.card?.hasVerifiedSnapshot === 'boolean' ? session.card.hasVerifiedSnapshot : (session?.photos ?? []).some(photo => photo?.verificationStatus === 'APPROVED');\n  const verificationLocalePrefix = hasVerifiedSnapshot ? 'lvs_secondary' : 'lvs_primary';\n  const verificationLocaleStatus = isRejected ? 'rejected' : 'pending';\n  const styles = React.useMemo(() => {\n    const warning = theme.theme.semantic.content.warning?.content1 ?? '#E8833B';\n    const dangerous = theme.theme.semantic.content.dangerous.content1;\n    return {\n      container: {\n        padding: 16,\n        backgroundColor: theme.theme.semantic.surface.regular.surface1,\n        borderRadius: 24,\n        width: '100%',\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 0\n      },\n      content: {\n        flex: 1,\n        minWidth: 0,\n        flexDirection: 'column',\n        alignItems: 'flex-start',\n        justifyContent: 'center',\n        gap: 4\n      },\n      header: {\n        width: '100%',\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 4\n      },\n      titleWrap: {\n        flex: 1,\n        minWidth: 0,\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 6\n      },\n      icon: {\n        width: 24,\n        height: 24,\n        color: isRejected ? dangerous : warning\n      },\n      title: {\n        flexShrink: 1,\n        color: isRejected ? dangerous : warning,\n        fontFamily: theme.theme.typography.family.paragraph,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: isRejected || open ? 700 : 500\n      },\n      description: {\n        color: theme.theme.semantic.content.regular.secondary,\n        fontFamily: theme.theme.typography.family.paragraph,\n        fontSize: 12,\n        lineHeight: 18,\n        fontWeight: 500\n      },\n      chevron: {\n        width: 24,\n        height: 24,\n        color: theme.theme.semantic.content.regular.secondary,\n        opacity: 0.5,\n        transform: open ? [{\n          rotate: '180deg'\n        }] : []\n      }\n    };\n  }, [theme, isRejected, open]);\n  if (!isPending && !isRejected) {\n    return null;\n  }\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.container,\n    onPress: () => setOpen(!open)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleWrap\n  }, isRejected ? /*#__PURE__*/React.createElement(DangerTriangleIcon, {\n    style: styles.icon\n  }) : /*#__PURE__*/React.createElement(InfoCircleIcon, {\n    style: styles.icon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title,\n    numberOfLines: 1\n  }, t(`${verificationLocalePrefix}_${verificationLocaleStatus}_header`))), /*#__PURE__*/React.createElement(ChevronDownIcon, {\n    style: styles.chevron\n  })), open && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t(`${verificationLocalePrefix}_${verificationLocaleStatus}_desc`))));\n};"},"WithAppearFocused":{"name":"WithAppearFocused","key":"68e03238cb13d9e3772166c2d513c9cce37e991d520bc8168ca28511d2949132","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nreturn ({\n  children,\n  delay,\n  visible,\n  ...props\n}) => {\n  const [show, setShow] = React.useState(false);\n  const [focused, setFocused] = React.useState(false);\n  ReactNavigation.useFocusEffect(React.useCallback(() => {\n    setFocused(true);\n    return () => {\n      setFocused(false);\n    };\n  }, []));\n  React.useEffect(() => {\n    if (visible !== false && focused) {\n      const timeout = setTimeout(() => {\n        setShow(true);\n      }, delay ?? 0);\n      return () => {\n        clearTimeout(timeout);\n      };\n    } else {\n      setShow(false);\n    }\n  }, [visible, focused, delay]);\n  return /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, _extends({\n    scale: 0.9,\n    duration: 150,\n    visible: show,\n    unmountOnHide: false\n  }, props), children);\n};"},"MediaEdit":{"name":"MediaEdit","key":"09750dc20fd3ff47e8f10c2fe024401b47a91591fe83ca87663b9b4d8c35c90a","code":"deps: PhotoButton, PhotoAccessDeniedModal, PhotoViewer\nfunction _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continue(value, then) {\n  return value && value.then ? value.then(then) : then(value);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst Element = props => /*#__PURE__*/React.createElement(LazyComponent, _extends({\n  name: \"PhotoButton\"\n}, props, {\n  style: props.itemStyle\n}));\nconst DiamondIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"20\",\n    height: \"20\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"30\",\n    height: \"30\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst CircleDotIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_373_18713)\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"1\",\n    y: \"1\",\n    width: \"22\",\n    height: \"22\",\n    rx: \"11\",\n    stroke: \"currentColor\",\n    \"stroke-width\": \"2\"\n  }), /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"6\",\n    y: \"6\",\n    width: \"12\",\n    height: \"12\",\n    rx: \"6\",\n    fill: \"currentColor\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_373_18713\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"24\",\n    height: \"24\",\n    fill: \"currentColor\"\n  }))));\n};\nconst CircleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_373_18725)\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"1\",\n    y: \"1\",\n    width: \"22\",\n    height: \"22\",\n    rx: \"11\",\n    stroke: \"currentColor\",\n    \"stroke-opacity\": \"0.4\",\n    \"stroke-width\": \"2\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_373_18725\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"24\",\n    height: \"24\",\n    fill: \"currentColor\"\n  }))));\n};\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nfunction ensureMinLength(arr, minLength = 3, fillValue = null) {\n  if (!Array.isArray(arr)) {\n    return Array(minLength).fill(fillValue);\n  }\n  if (arr.length >= minLength) {\n    return arr;\n  }\n\n  // Создаем новый массив с недостающими null значениями\n  const result = [...arr];\n  while (result.length < minLength) {\n    result.push(fillValue);\n  }\n  return result;\n}\nconst showPhotoAccessDeniedModal = _async(function () {\n  return _await(Sheet.showModal(/*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PhotoAccessDeniedModal\"\n  }), {\n    props: {\n      style: {\n        maxWidth: 600\n      }\n    }\n  }), function (shouldOpenSettings) {\n    if (!shouldOpenSettings) {\n      return;\n    }\n    return _catch(function () {\n      if (ReactNative.Platform.OS === 'web') {\n        return;\n      }\n      return _awaitIgnored(ReactNative.Linking.openSettings());\n    }, function (error) {\n      console.error('Error opening settings:', error);\n    });\n  });\n});\nreturn ({\n  session,\n  onEdit\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    container: {\n      paddingVertical: 16,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 24,\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    subcontainer: {\n      gap: 8,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    header: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      paddingHorizontal: 16,\n      width: '100%'\n    },\n    row: {\n      gap: 4,\n      paddingHorizontal: 16,\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      justifyContent: 'flex-start'\n    },\n    item: {\n      maxWidth: 120,\n      minHeight: 120,\n      aspectRatio: 1\n    }\n  }), [theme]);\n  const onGetPro = React.useCallback(_async(function () {\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"getpro\"\n    }), {\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n    return _await();\n  }), []);\n  const [width, setWidth] = React.useState(100);\n  const photos = ensureMinLength(session.photos ?? [], 3, null);\n  const [error, setError] = React.useState(null);\n  const [isLoading, setIsLoading] = React.useState([]);\n  const [hoveredIndex, setHoveredIndex] = React.useState(null);\n  const hoveredIndexRef = React.useRef(null);\n  const itemLayouts = React.useRef(new Map()).current;\n  const reorder = Components.useCallbackLoader(_async(function (from, to) {\n    return _finallyRethrows(function () {\n      return _catch(function () {\n        if (from === to) return;\n        setIsLoading([from, to]);\n        const newPhotos = photos.filter(photo => !!photo?.uid);\n        const [movedPhoto] = newPhotos.splice(from, 1);\n        if (!movedPhoto) return;\n        newPhotos.splice(to, 0, movedPhoto);\n        return _await(State.post('/api/login/profile/photo/reorder', {\n          uids: newPhotos.map(p => p.uid)\n        }, 'json'), function ({\n          photos: photosReordered\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            photos: photosReordered\n          });\n        });\n      }, function (err) {\n        console.error('Error picking image:', err);\n      });\n    }, function (_wasThrown, _result2) {\n      setIsLoading([]);\n      return _rethrow(_wasThrown, _result2);\n    });\n  }), [photos]);\n  const onUpload = Components.useCallbackLoader(_async(function (index) {\n    let _exit = false;\n    return _finallyRethrows(function () {\n      return _catch(function () {\n        return _continue(_catch(function () {\n          return _await(ImagePicker.requestMediaLibraryPermissionsAsync(), function ({\n            status\n          }) {\n            if (status !== 'granted' && status !== 'undetermined' && status != null) {\n              showPhotoAccessDeniedModal();\n              _exit = true;\n            }\n          });\n        }, function (error) {\n          console.error(error);\n        }), function (_result3) {\n          return _exit ? _result3 : _await(ImagePicker.launchImageLibraryAsync({\n            mediaTypes: ['images'],\n            allowsEditing: true,\n            aspect: [9, 16],\n            quality: 1\n          }), function (result) {\n            if (result.canceled || !result.assets[0]) return;\n\n            // setIsLoading(true);\n            const image = result.assets[0];\n            return _await(Utils.compressLargeImage(image.uri, 1600), function (imageUri) {\n              const formData = new FormData();\n              formData.append('order', index.toString());\n              const photoName = `photo_${index}_${Date.now()}.jpg`;\n              return _await(Utils.buildFormFile(imageUri, photoName, 'image/jpeg'), function (photoFile) {\n                if (!photoFile) {\n                  throw new Error('File is required');\n                }\n                if (typeof Blob !== 'undefined' && photoFile instanceof Blob) {\n                  formData.append('file', photoFile, photoName);\n                } else {\n                  formData.append('file', photoFile);\n                }\n                return _await(State.post('/api/login/profile/photo', formData, 'json'), function ({\n                  photos\n                }) {\n                  onEdit?.();\n                  State.state.session.next({\n                    ...State.state.session.value,\n                    photos\n                  });\n                });\n              });\n            });\n          });\n        });\n      }, function (error) {\n        console.error('Error picking image:', error);\n      });\n    }, function (_wasThrown2, _result4) {\n      return _rethrow(_wasThrown2, _result4);\n    });\n  }), []);\n  const onOpen = React.useCallback(index => {\n    const viewerPhotos = photos.filter(p => !!p?.path);\n    const openedPhoto = photos[index];\n    const viewerIndex = Math.max(0, viewerPhotos.findIndex(photo => photo?.uid === openedPhoto?.uid));\n    Modals.pushModal(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"PhotoViewer\",\n      images: viewerPhotos.map(photo => ({\n        source: State.getUrl(`/file/photo/${photo.path}`),\n        placeholder: {\n          thumbhash: photo?.hash\n        }\n      })),\n      index: viewerIndex,\n      avatarIndex: 0,\n      setAvatarLabel: t('profileSetAsAvatar'),\n      avatarBadgeLabel: t('profileThisIsYourAvatar'),\n      backLabel: t('profilePhotoViewerBack'),\n      deleteLabel: t('buttonDelete'),\n      onSetAvatar: _async(function (viewerPhotoIndex) {\n        const targetPhoto = viewerPhotos[viewerPhotoIndex];\n        if (!targetPhoto?.uid) return;\n        const currentPhotos = (State.state.session.value?.photos ?? photos).filter(p => !!p?.path);\n        const targetIndex = currentPhotos.findIndex(photo => photo?.uid === targetPhoto.uid);\n        if (targetIndex <= 0) return;\n        const reorderedPhotos = [...currentPhotos];\n        const [avatarPhoto] = reorderedPhotos.splice(targetIndex, 1);\n        reorderedPhotos.unshift(avatarPhoto);\n        return _await(State.post('/api/login/profile/photo/reorder', {\n          uids: reorderedPhotos.map(p => p.uid)\n        }, 'json'), function ({\n          photos: photosReordered\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            photos: photosReordered\n          });\n        });\n      }),\n      onRemove: _async(function (viewerPhotoIndex) {\n        const targetPhoto = viewerPhotos[viewerPhotoIndex];\n        if (!targetPhoto?.uid) return;\n        return _await(State.post(\"/api/login/profile/photo/remove\", {\n          uid: targetPhoto.uid\n        }, \"json\"), function ({\n          photos\n        }) {\n          State.state.session.next({\n            ...State.state.session.value,\n            photos\n          });\n        });\n      })\n    }));\n  }, [t, ...photos]);\n  const onRemove = Components.useCallbackLoader(_async(function (index) {\n    const photo = photos[index];\n    if (!photo) return;\n    return _continueIgnored(_catch(function () {\n      return _await(State.post(\"/api/login/profile/photo/remove\", {\n        uid: photo.uid\n      }, \"json\"), function ({\n        photos\n      }) {\n        State.state.session.next({\n          ...State.state.session.value,\n          photos\n        });\n      });\n    }, function (error) {\n      console.error(error);\n    }));\n  }), [photos]);\n  const handleDragStart = React.useCallback(index => {\n    console.log('Drag started:', index);\n  }, []);\n  const handleDragEnd = React.useCallback(index => {\n    console.log('Drag ended:', index);\n    if (hoveredIndexRef.current != null) reorder(index, hoveredIndexRef.current);\n    hoveredIndexRef.current = null;\n    setHoveredIndex(null);\n  }, [setHoveredIndex, reorder]);\n  const handleDragHover = React.useCallback(indexOver => {\n    console.log('Hover over:', indexOver);\n    hoveredIndexRef.current = indexOver;\n    setHoveredIndex(indexOver);\n  }, [setHoveredIndex]);\n  const handleDragLeave = React.useCallback(() => {\n    setHoveredIndex(null);\n  }, [setHoveredIndex]);\n  const [rowWidth, setRowWidth] = React.useState(null);\n  const itemSize = React.useMemo(() => rowWidth != null ? rowWidth / 3 - 4 * 2 - 5 : 120, [rowWidth]);\n  const style = React.useMemo(() => [styles.item, {\n    maxWidth: itemSize,\n    minWidth: itemSize,\n    width: itemSize,\n    height: itemSize\n  }], [itemSize]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container,\n    onLayout: e => setRowWidth(e.nativeEvent.layout.width)\n  }, /*#__PURE__*/React.createElement(ReactNativeGestureHandler.GestureHandlerRootView, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header\n  }, t(\"profileMedia\")), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, photos.map((item, index) => /*#__PURE__*/React.createElement(Components.DraggableComponent, {\n    key: item?.uid ?? index,\n    index: index,\n    lockY: true,\n    onDragStart: handleDragStart,\n    onDragEnd: handleDragEnd,\n    onDragHover: handleDragHover,\n    onDragLeave: handleDragLeave,\n    itemLayouts: itemLayouts,\n    style: style,\n    itemStyle: style,\n    isTarget: photos[index]?.path != null,\n    isDraggable: photos[index]?.path != null,\n    Element: Element,\n    hovered: hoveredIndex === index,\n    onOpen: () => {\n      if (photos[index]?.path) {\n        onOpen(index);\n      }\n    },\n    onUpload: onUpload,\n    onRemove: onRemove,\n    photo: item\n  })))));\n};"},"TagsModal":{"name":"TagsModal","key":"b27e0334f5460bed40d92e7c6c5557bf6ec00019887e3bfd6c258ad6be8ee839","code":"return ({\n  tags\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingBottom: Math.max(safeArea.bottom + 4, 8),\n      paddingTop: 20\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingBottom: 12\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    closeIcon: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    full: {\n      width: '100%'\n    },\n    flex: {\n      flex: 1\n    },\n    contentContainer: {\n      paddingHorizontal: 16,\n      paddingBottom: 8,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 12\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%'\n    },\n    buttonBody: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    buttonText: {\n      color: theme.theme.component.button.brand.content,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    },\n    tagsContainer: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      flexWrap: 'wrap',\n      gap: 8,\n      width: '100%'\n    },\n    chipShadow: {\n      shadowColor: 'rgba(4, 6, 15, 0.08)',\n      shadowOffset: {\n        width: 0,\n        height: 8\n      },\n      shadowOpacity: 1,\n      shadowRadius: 24,\n      elevation: 8\n    },\n    counterContainer: {\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'center',\n      marginTop: 4,\n      paddingBottom: 0\n    },\n    counterWrapper: {\n      height: 22,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    counter: {\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontWeight: '700',\n      fontSize: 16,\n      lineHeight: 22,\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    },\n    counterDigits: {\n      color: theme.theme.semantic.content.brand.content1\n    },\n    counterText: {\n      color: theme.theme.semantic.content.regular.primary\n    }\n  }), [theme, safeArea]);\n  const allTags = React.useMemo(() => ['interestAnimal', 'interestReading', 'interestDIY', 'interestMusic', 'interestArt', 'interestVideogames', 'interest_3d', 'interestAnime', 'interestCooking', 'interestCollecting', 'interestPhotography', 'interestSports', 'interestFishing'], []);\n  const allTagsItems = React.useMemo(() => allTags.map(tag => ({\n    id: tag,\n    text: t(tag)\n  })), [allTags, t]);\n  const [text, setText] = React.useState(() => tags?.filter(tag => allTags.includes(tag)) ?? []);\n  const MIN_TAGS = 1;\n  const MAX_TAGS = 7;\n  const onSubmit = React.useCallback(() => {\n    if (text.length >= MIN_TAGS && text.length <= MAX_TAGS) {\n      sheet.close(text);\n    }\n  }, [text, sheet]);\n  const onChange = React.useCallback((add, value) => {\n    setText(tags => {\n      if (add) {\n        if (tags.length >= MAX_TAGS) {\n          return tags;\n        }\n        return [...tags, value];\n      } else {\n        return tags.filter(tag => tag !== value);\n      }\n    });\n  }, []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('profileEditInterests'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 0\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentContainer\n  }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tagsContainer\n  }, allTagsItems.map(tag => /*#__PURE__*/React.createElement(Components.DSChip, {\n    key: tag.id,\n    text: tag.text,\n    isActive: text.includes(tag.id),\n    disabled: !text.includes(tag.id) && text.length >= MAX_TAGS,\n    onPress: value => onChange(value, tag.id),\n    style: styles.chipShadow\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.counterContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.counterWrapper\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.counter, styles.counterDigits]\n  }, t('tagsModalCounterDigits', text.length, MAX_TAGS)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.counter, styles.counterText]\n  }, '\\u00A0', t('tagsModalCounterText')))))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.buttonContainer, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    style: styles.button,\n    size: \"L\",\n    feedback: true,\n    disabled: text.length < MIN_TAGS || text.length > MAX_TAGS,\n    onPress: () => onSubmit()\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonBody\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t('profileEditSave'))))));\n};"},"CountryModal":{"name":"CountryModal","key":"949a4e5b1c7cc7343231a1e0a668af1a4e8413bb87cf0bb9a11145f7453678c0","code":"deps: PeerCountry\nconst Checkbox = ({\n  selected,\n  type = 'checkbox'\n}) => {\n  const theme = Theme.useTheme();\n  const colors = theme.theme.component.radioButton;\n  const getThemeColor = obj => {\n    if (!obj) return undefined;\n    if (typeof obj === 'string') return obj;\n    return obj.color;\n  };\n  if (type === 'radio') {\n    const contentColor = getThemeColor(colors.content);\n    const borderColor = selected ? contentColor : Utils.withOpacity(getThemeColor(colors.borderDefault), 0.4);\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        borderColor: borderColor,\n        borderWidth: 2,\n        borderRadius: 999,\n        height: 24,\n        width: 24,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      }\n    }, selected && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        backgroundColor: contentColor,\n        borderRadius: 999,\n        height: 11,\n        width: 11\n      }\n    }));\n  }\n  const activeColor = getThemeColor(colors.borderActive);\n  const defaultBorderColor = getThemeColor(colors.borderDefault);\n  const defaultBgColor = getThemeColor(colors.bgDefault);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: 24,\n      height: 24,\n      borderRadius: 4,\n      borderWidth: 2,\n      borderColor: selected ? activeColor : defaultBorderColor,\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: selected ? activeColor : defaultBgColor\n    }\n  }, selected && /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M17.4343 7.00676C17.7066 6.69487 18.1809 6.66249 18.4929 6.93449C18.8049 7.20683 18.8373 7.68105 18.5652 7.99309L10.7078 16.9931C10.5653 17.1562 10.3589 17.2499 10.1423 17.2499C9.92599 17.2498 9.72019 17.1561 9.57788 16.9931L6.43433 13.3935C6.16213 13.0815 6.19472 12.6073 6.50659 12.3349C6.81857 12.0626 7.29277 12.0953 7.56519 12.4072L10.1423 15.3593L17.4343 7.00676Z\",\n    fill: \"white\"\n  })));\n};\nconst CountryRenderItem = ({\n  item,\n  onSelect,\n  isSelected,\n  first,\n  last,\n  type\n}) => {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    row: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      paddingVertical: 16,\n      gap: 12\n    },\n    flag: {\n      width: 24,\n      height: 24,\n      borderRadius: 12,\n      overflow: 'hidden',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    country: {\n      flex: 1,\n      fontSize: 16,\n      color: theme.theme.component.listItem.contentPrimaryDefault,\n      fontFamily: theme.theme.typography.family.paragraph\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    scale: 0.98,\n    opacity: 0.8,\n    style: styles.row,\n    styleContainer: {\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.05),\n      borderTopLeftRadius: first ? 16 : 0,\n      borderTopRightRadius: first ? 16 : 0,\n      borderBottomLeftRadius: last ? 16 : 0,\n      borderBottomRightRadius: last ? 16 : 0\n    },\n    onPress: () => {\n      onSelect(item);\n    }\n  }, item.code ? /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: item.code,\n    size: 24,\n    style: styles.flag\n  }) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 16,\n      lineHeight: 24,\n      fontFamily: theme.theme.typography.family.paragraph\n    }\n  }, \"\\uD83C\\uDF0D\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.country\n  }, item.name), /*#__PURE__*/React.createElement(Checkbox, {\n    selected: isSelected,\n    type: type\n  }));\n};\nreturn ({\n  list,\n  initialCode,\n  multiple,\n  onSave,\n  onReset,\n  mode = 'multiselect'\n}) => {\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const keyboardSafeArea = Components.useSafeZoneMinusKeyboard(4);\n  const theme = Theme.useTheme();\n  const modal = Modals.useModal();\n  const id = modal.id;\n  const styles = React.useMemo(() => ({\n    header: {\n      position: 'relative',\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      paddingTop: 16\n    },\n    title: {\n      flex: 1,\n      textAlign: 'center',\n      fontSize: 18,\n      fontWeight: 700,\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    closeButton: {\n      position: 'absolute',\n      top: -16,\n      right: -16,\n      padding: 4\n    },\n    searchWrapper: {\n      position: 'relative'\n    },\n    searchInput: {\n      borderRadius: 12,\n      borderWidth: 1,\n      paddingLeft: 16 * 2 + 16,\n      paddingRight: 16,\n      paddingVertical: 12,\n      fontSize: 14,\n      fontWeight: 500,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    searchIcon: {\n      position: 'absolute',\n      left: 16,\n      top: '50%',\n      transform: [{\n        translateY: '-50%'\n      }],\n      color: theme.theme.component.listItem.contentPrimaryDefault\n    },\n    footer: {\n      flexDirection: 'column',\n      gap: 12\n    }\n  }), [theme]);\n  const [query, setQuery] = React.useState('');\n  const [selectedCode, setSelectedCode] = React.useState((initialCode ?? []).map(c => c?.toLowerCase()).filter(Boolean));\n  const t = Locale.useTranslation();\n  const [allCountries, setAllCountries] = React.useState(list ?? []);\n  React.useEffect(() => {\n    const countries = (list ?? Utils.buildCountryList(locale)).map(item => ({\n      ...item,\n      name: Utils.shortenCountryName(item.name)\n    }));\n    const sorted = [...countries].sort((a, b) => a.name.localeCompare(b.name));\n    setAllCountries(sorted);\n  }, [locale, list]);\n  const filtered = React.useMemo(() => {\n    const worldwideItem = Utils.WORLDWIDE_ITEM(t('filtersGeoWorldwide'));\n    const trimmed = query.trim().toLowerCase();\n    let baseList = allCountries;\n    if (trimmed) {\n      baseList = allCountries.filter(item => item.name.toLowerCase().includes(trimmed));\n    }\n    if (mode === 'radio') {\n      return baseList;\n    }\n    return [worldwideItem, ...baseList];\n  }, [allCountries, query, t, mode]);\n  const handleClose = React.useCallback(result => {\n    if (id && Sheet.scrollSheetDict[id]) {\n      Sheet.scrollSheetDict[id].close(result);\n    }\n  }, [id]);\n  const handleSave = React.useCallback(() => {\n    if (onSave) onSave(selectedCode);\n    handleClose(selectedCode);\n  }, [selectedCode, onSave, handleClose]);\n  const handleReset = React.useCallback(() => {\n    setSelectedCode([]);\n    if (onReset) onReset();\n    handleClose([]);\n  }, [onReset, handleClose]);\n  const onSelectItem = React.useCallback(item => {\n    const code = item.code?.toLowerCase();\n    if (code == null) {\n      setSelectedCode([]);\n      return;\n    }\n    if (mode === 'radio') {\n      const newCodes = [code];\n      setSelectedCode(newCodes);\n      if (onSave) onSave(newCodes);\n      handleClose(newCodes);\n      return;\n    }\n    setSelectedCode(codes => {\n      const newCodes = codes.includes(code) ? codes.filter(c => c !== code) : [...codes, code];\n      return newCodes.filter(Boolean);\n    });\n  }, [mode, multiple, onSave, handleClose]);\n  const data = filtered;\n  return /*#__PURE__*/React.createElement(Sheet.ScrollSheet, {\n    data: data,\n    keyExtractor: item => item.code ?? 'WORLDWIDE',\n    ItemSeparatorComponent: () => /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        height: 1,\n        backgroundColor: theme.theme.semantic.stroke.regular.stroke2\n      }\n    }),\n    renderItem: ({\n      item,\n      index\n    }) => {\n      const itemCode = item.code?.toLowerCase();\n      const isSelected = itemCode == null && selectedCode.length == 0 || itemCode != null && selectedCode.includes(itemCode);\n      return /*#__PURE__*/React.createElement(CountryRenderItem, {\n        first: index === 0,\n        last: index === data.length - 1,\n        isSelected: isSelected,\n        item: item,\n        type: mode === 'radio' ? 'radio' : 'checkbox',\n        onSelect: onSelectItem\n      });\n    },\n    listProps: {\n      contentContainerStyle: {\n        marginTop: 16,\n        marginHorizontal: 16,\n        paddingBottom: 164 + 60,\n        overflow: 'hidden',\n        borderRadius: 16\n      }\n    },\n    style: {\n      maxWidth: 600,\n      overflow: 'hidden',\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1\n    },\n    OverlayBuilder: /*#__PURE__*/React.createElement(ReactNative.View, {\n      pointerEvents: \"box-none\",\n      style: {\n        flex: 1,\n        justifyContent: 'flex-end'\n      }\n    }, /*#__PURE__*/React.createElement(Reanimated.View, {\n      style: [keyboardSafeArea, {\n        // paddingBottom: 4 + safeArea.bootom,\n        paddingTop: 12,\n        paddingHorizontal: 16,\n        backgroundColor: theme.theme.semantic.surface.regular.surface1,\n        borderTopLeftRadius: 16,\n        borderTopRightRadius: 16,\n        shadowColor: \"#000\",\n        shadowOffset: {\n          width: 0,\n          height: -4\n        },\n        shadowOpacity: 0.1,\n        shadowRadius: 8,\n        elevation: 10,\n        flexDirection: 'column',\n        gap: 12\n      }]\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.searchWrapper\n    }, /*#__PURE__*/React.createElement(ReactNative.TextInput, {\n      placeholder: t(\"countryPickerSearchHint\"),\n      placeholderTextColor: theme.theme.component.textField.contentTertiary,\n      value: query,\n      onChangeText: setQuery,\n      style: [styles.searchInput, {\n        borderColor: theme.theme.component.textField.borderDefault,\n        color: theme.theme.component.textField.contentPrimary\n      }]\n    }), /*#__PURE__*/React.createElement(Assets.Search, {\n      style: styles.searchIcon\n    })), /*#__PURE__*/React.createElement(Components.DSButton, {\n      title: t(\"profileEditSave\"),\n      size: \"L\",\n      onPress: handleSave\n    }), /*#__PURE__*/React.createElement(Components.DSButton, {\n      type: \"ghost\",\n      title: t(\"filtersButtonReset\"),\n      size: \"L\",\n      onPress: handleReset\n    })))\n  });\n};"},"Avatar":{"name":"Avatar","key":"2ca2105ad543c5a9b594b1f90b27624d270268d44e8c4c8e579ca6fdcd4d6ecd","code":"const AvatarPlaceholderIcon = ({\n  size = 20\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9.59961 1.59961C11.3669 1.59961 12.7997 3.03258 12.7998 4.7998C12.7998 6.56712 11.3669 8 9.59961 8C7.83248 7.99979 6.40039 6.56699 6.40039 4.7998C6.4005 3.03271 7.83254 1.59982 9.59961 1.59961Z\",\n  fill: \"#FE879D\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.5\",\n  d: \"M9.59961 10.4004C13.1342 10.4004 16 12.0118 16 14C16 15.9882 15.9996 17.5996 9.59961 17.5996C3.2 17.5995 3.2002 15.9882 3.2002 14C3.2002 12.0118 6.06517 10.4005 9.59961 10.4004Z\",\n  fill: \"#FE879D\"\n}));\nconst CrownIcon = ({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nreturn ({\n  style,\n  photo,\n  isPro,\n  onPress,\n  size = 52,\n  placeholderBackgroundColor\n}) => {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    container: {\n      position: 'relative'\n    },\n    button: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: photo ? theme.theme.semantic?.surface?.regular?.surface1 : placeholderBackgroundColor ?? theme.theme.semantic?.surface?.regular?.surface1,\n      borderRadius: 9999,\n      overflow: 'hidden',\n      width: size,\n      height: size\n    },\n    image: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      width: '100%',\n      height: '100%',\n      objectFit: 'cover'\n    },\n    pro: {\n      position: 'absolute',\n      top: -4,\n      right: -4,\n      width: 16,\n      height: 16,\n      borderRadius: 16,\n      backgroundColor: theme.theme.component.button.brand.bgDefault,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    proIcon: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary\n    }\n  }), [theme, size, photo, placeholderBackgroundColor]);\n  const Pressable = onPress != null ? Components.DSPressable : ReactNative.View;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.container, ...(style ?? [])]\n  }, /*#__PURE__*/React.createElement(Pressable, {\n    feedback: true,\n    style: styles.button,\n    noloading: true,\n    onPress: onPress\n  }, !!photo ? /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.image,\n    source: State.getUrl(`/file/photo/${photo?.path}`),\n    cachePolicy: \"memory-disk\",\n    thumbhash: photo?.hash\n  }) : /*#__PURE__*/React.createElement(AvatarPlaceholderIcon, {\n    size: Math.min(size * 0.4, 28)\n  })), isPro && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: theme.theme.semantic.content.inversion.static.stPrimary\n  })));\n};"},"LanguageModal":{"name":"LanguageModal","key":"f90feacc0d0cd0afa9affb7f6a76e8592e3ff622ad076be7a74d290dcd83d0b8","code":"function _empty() {}\nconst items = [{\n  id: 'ru',\n  name: 'Русский'\n}, {\n  id: 'en',\n  name: 'English'\n}];\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingBottom: Math.max(safeArea.bottom + 4, 8)\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    subcontainer: {\n      paddingHorizontal: 16,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    list: {\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'center',\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.05),\n      borderRadius: 24,\n      paddingHorizontal: 16,\n      overflow: 'hidden'\n    },\n    row: {\n      height: 56,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    rowText: {\n      flex: 1,\n      color: theme.theme.component.listItem.contentPrimaryDefault,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 500\n    },\n    radio: {\n      borderColor: Utils.withOpacity(theme.theme.component.radioButton.borderDefault, 0.4),\n      borderWidth: 2,\n      borderRadius: 999,\n      height: 24,\n      width: 24,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    radioSelected: {\n      borderColor: theme.theme.component.radioButton.content\n    },\n    radioDot: {\n      backgroundColor: theme.theme.component.radioButton.content,\n      borderRadius: 999,\n      height: 12,\n      width: 12\n    },\n    divider: {\n      height: 1,\n      width: '100%',\n      backgroundColor: theme.theme.semantic.stroke.regular.stroke2\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    full: {\n      width: '100%'\n    },\n    flex: {\n      flex: 1\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%'\n    },\n    buttonBody: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    buttonText: {\n      color: theme.theme.component.button.brand.content,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    },\n    input: {\n      container: {\n        flex: 1,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        width: '100%'\n      },\n      icon: {\n        position: 'absolute',\n        right: 0,\n        top: 0,\n        bottom: 0,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        paddingHorizontal: 16,\n        paddingVertical: 12\n      },\n      text: {\n        width: '100%',\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 500,\n        borderWidth: 1,\n        borderColor: theme.theme.component.textField.borderDefault,\n        borderRadius: 12,\n        backgroundColor: theme.theme.component.textField.bg,\n        color: theme.theme.component.textField.contentPrimary,\n        paddingLeft: 16,\n        paddingRight: 48,\n        paddingVertical: 14\n      },\n      iconColor: {\n        color: theme.theme.component.textField.contentPrimary\n      }\n    },\n    pic: {\n      button: {\n        gap: 6,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      buttonIcon: {\n        color: theme.theme.component.button.primaryInversion.content\n      },\n      buttonText: {\n        color: theme.theme.component.button.primaryInversion.content,\n        fontSize: 14,\n        fontWeight: 600\n      }\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('languageSetting'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.list\n  }, items.map((item, index) => {\n    const selected = item.id === locale;\n    return /*#__PURE__*/React.createElement(React.Fragment, {\n      key: item.id\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      style: styles.row,\n      onPress: () => {\n        if (selected) {\n          sheet.close();\n          return;\n        }\n        Components.wrapLoader(_async(function () {\n          return _await(new Promise(r => setTimeout(r, 200)), function () {\n            return _await(Locale.setLocale(item.id), function () {\n              sheet.close();\n              return _awaitIgnored(new Promise(r => setTimeout(r, 200)));\n            });\n          });\n        }));\n      }\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.rowText\n    }, item.name), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.radio, selected && styles.radioSelected]\n    }, selected && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.radioDot\n    }))), index < items.length - 1 && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.divider\n    }));\n  }))));\n};"},"ThemeModal":{"name":"ThemeModal","key":"1b2a874ed752cbf03caf28f0d443823ef3b27619e8815cada54484c6a821a51d","code":"function _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction Divided({\n  children\n}) {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    div: {\n      backgroundColor: theme.theme.semantic.stroke.regular.stroke2,\n      height: 1,\n      width: '100%'\n    }\n  }), [theme]);\n  const childrenArray = React.Children.toArray(children);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, childrenArray.map((row, rowIndex) => /*#__PURE__*/React.createElement(React.Fragment, {\n    key: rowIndex\n  }, row, rowIndex < childrenArray.length - 1 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: rowIndex,\n    style: styles.div\n  }))));\n}\nfunction Item({\n  icon,\n  text,\n  onPress,\n  selected\n}) {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    row: {\n      height: 56,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    text: {\n      color: theme.theme.component.listItem.contentPrimaryDefault,\n      flex: 1,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 500\n    },\n    radio: {\n      borderColor: Utils.withOpacity(theme.theme.component.radioButton.borderDefault, 0.4),\n      borderWidth: 2,\n      borderRadius: 999,\n      height: 24,\n      width: 24,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    radioSelected: {\n      borderColor: theme.theme.component.radioButton.content\n    },\n    radioDot: {\n      backgroundColor: theme.theme.component.radioButton.content,\n      borderRadius: 999,\n      height: 12,\n      width: 12\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.row,\n    onPress: onPress\n  }, icon, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, text), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.radio, selected && styles.radioSelected]\n  }, selected && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.radioDot\n  })));\n}\nreturn () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [isDark] = Hooks.useBehaviorSubject(Theme.isDark);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingBottom: Math.max(safeArea.bottom + 4, 8)\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    subcontainer: {\n      paddingHorizontal: 16,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    list: {\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'center',\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.05),\n      borderRadius: 24,\n      paddingHorizontal: 16,\n      overflow: 'hidden'\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('themeSetting'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.list\n  }, /*#__PURE__*/React.createElement(Divided, null, /*#__PURE__*/React.createElement(Item, {\n    text: t('themeDay'),\n    icon: /*#__PURE__*/React.createElement(Assets.Sun, {\n      style: {\n        color: theme.theme.component.listItem.contentPrimaryDefault\n      }\n    }),\n    onPress: () => {\n      if (!isDark) {\n        sheet.close();\n        return;\n      }\n      Components.wrapLoader(_async(function () {\n        return _await(new Promise(r => setTimeout(r, 400)), function () {\n          return _await(Theme.setTheme(false), function () {\n            sheet.close();\n            return _awaitIgnored(new Promise(r => setTimeout(r, 200)));\n          });\n        });\n      }), {\n        backgroundColor: '#000'\n      });\n    },\n    selected: !isDark\n  }), /*#__PURE__*/React.createElement(Item, {\n    text: t('themeNight'),\n    icon: /*#__PURE__*/React.createElement(Assets.Moon, {\n      style: {\n        color: theme.theme.component.listItem.contentPrimaryDefault\n      }\n    }),\n    onPress: () => {\n      if (isDark) {\n        sheet.close();\n        return;\n      }\n      Components.wrapLoader(_async(function () {\n        return _await(new Promise(r => setTimeout(r, 400)), function () {\n          return _await(Theme.setTheme(true), function () {\n            sheet.close();\n            return _awaitIgnored(new Promise(r => setTimeout(r, 200)));\n          });\n        });\n      }), {\n        backgroundColor: '#000'\n      });\n    },\n    selected: isDark\n  })))));\n};"},"SignOutModal":{"name":"SignOutModal","key":"a64f58a33b79c8e35b0d976963d2df2923bc259ea1c7a0537fa25ec065879597","code":"function _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [assets] = ExpoAsset.useAssets([Assets.brokenHeart]);\n  const [brokenHeart] = assets?.map(a => a?.localUri) ?? [];\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: safeArea.bottom\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'row',\n      gap: 8,\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 16 + 36,\n      paddingTop: 20,\n      paddingBottom: 12,\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      gap: 4,\n      alignItems: 'center',\n      justifyContent: 'center',\n      padding: 16\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory\",\n    style: {\n      width: 88,\n      height: 88\n    },\n    source: brokenHeart\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: 600,\n      textAlign: 'center'\n    }\n  }, t('modalSignOutHeader')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      textAlign: 'center'\n    }\n  }, t('modalSignOutDescription'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      gap: 8,\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingVertical: 4\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"brand\",\n    size: \"L\",\n    style: {\n      width: '100%'\n    },\n    onPress: () => {\n      Components.wrapLoader(_async(function () {\n        return _await(new Promise(r => setTimeout(r, 400)), function () {\n          const analytics = Analytics.getGlobalParams();\n          sheet.close();\n          return _await(State.logout(analytics), function () {\n            return _awaitIgnored(new Promise(r => setTimeout(r, 200)));\n          });\n        });\n      }), {\n        backgroundColor: '#000'\n      });\n    }\n  }, t('profileSettingsSignout')), /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"ghost\",\n    size: \"L\",\n    style: {\n      width: '100%'\n    },\n    onPress: () => sheet.close()\n  }, t('modalStayButton'))));\n};"},"FilterPaywallOverlay":{"name":"FilterPaywallOverlay","key":"42afed88a9a8349b74520c505009e619a319c8633803cc694be4e60e1b507c83","code":"const PremiumCrownIcon = ({\n  size = 24,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"48.25 32.6 28 28\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M69.8877 54C70.44 54 70.8876 54.4477 70.8877 55C70.8877 56.6568 69.5446 58 67.8877 58H56.1104C54.4537 57.9997 53.1104 56.6567 53.1104 55C53.1104 54.4479 53.5583 54.0002 54.1104 54H69.8877ZM59.96 35.2011C60.7451 33.6003 63.2529 33.6003 64.0381 35.2011L66.3936 40.0039C67.1819 41.6112 69.4311 42.1148 70.9551 41.0254L72.9189 39.6211C74.0827 38.7892 75.7263 39.843 75.2481 41.1142L71.9541 49.8701C71.3379 51.5078 69.64 52.6084 67.7305 52.6084H56.2676C54.3582 52.6082 52.6601 51.5077 52.0439 49.8701L48.75 41.1142C48.2719 39.8431 49.9155 38.7895 51.0791 39.6211L53.0439 41.0254C54.5679 42.1146 56.8161 41.6111 57.6045 40.0039L59.96 35.2011Z\",\n  fill: color\n}));\nreturn props => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const styles = React.useMemo(() => ({\n    overlay: {\n      position: 'absolute',\n      top: -8,\n      left: -8,\n      right: -8,\n      bottom: -8,\n      backgroundColor: 'transparent',\n      borderRadius: 12,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    container: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      borderRadius: 999,\n      gap: 8,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      paddingHorizontal: 12,\n      paddingVertical: 8,\n      ...(ReactNative.Platform.OS === 'web' ? {\n        boxShadow: '0 16px 28px 0 rgba(4, 6, 15, 0.15)'\n      } : {\n        shadowColor: '#04060F',\n        shadowOffset: {\n          width: 0,\n          height: 16\n        },\n        shadowOpacity: theme.isDark ? 0.08 : 0.15,\n        shadowRadius: 28,\n        elevation: theme.isDark ? 4 : 8\n      })\n    },\n    icon: {\n      color: theme.theme.semantic.content.brand.content1\n    },\n    chipText: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 22,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    }\n  }), [theme]);\n  const onPress = React.useCallback(() => {\n    sheet.close();\n    manifest().call.onStop();\n    // Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('SubPay'));\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"subPay\",\n      isModal: true\n    }), {\n      theme: theme?.isDark ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden',\n          backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n        }\n      }\n    });\n  }, [sheet]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.overlay,\n    style: styles.container,\n    feedback: true,\n    onPress: onPress\n  }, /*#__PURE__*/React.createElement(PremiumCrownIcon, {\n    size: 24,\n    color: styles.icon.color\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.chipText\n  }, t(\"filterUnlockWithPremium\")));\n};"},"FilterGenderTabs":{"name":"FilterGenderTabs","key":"57b108275b401913e20744599b5c6d2c1829d39c410609bb1b1ce0134262ae79","code":"return ({\n  sex,\n  remainingSpins,\n  filterCostFemale,\n  filterCostMale,\n  onChangeSex\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const [containerWidth, setContainerWidth] = React.useState(0);\n  const sliderTranslateX = React.useRef(new ReactNative.Animated.Value(0)).current;\n  const tabs = React.useMemo(() => [{\n    id: 'male',\n    title: t(\"filtersInterestMale\"),\n    icon: Assets.male,\n    price: filterCostMale ?? 10,\n    accentBg: theme.theme.semantic.surface.accent.surface3,\n    iconBg: theme.theme.semantic.surface.information.surface4,\n    accentBorder: theme.theme.semantic.stroke.information.stroke3\n  }, {\n    id: 'female',\n    title: t(\"filtersInterestFemale\"),\n    icon: Assets.female,\n    price: filterCostFemale ?? 10,\n    accentBg: theme.theme.semantic.surface.additionalOne.surface3,\n    iconBg: theme.theme.semantic.surface.additionalOne.surface4,\n    accentBorder: theme.theme.semantic.stroke.additionalOne.stroke3\n  }, {\n    id: null,\n    title: t(\"filtersInterestEveryone\"),\n    icon: null,\n    price: null,\n    accentBg: theme.theme.semantic.surface.brand.surface3,\n    iconBg: null,\n    accentBorder: theme.theme.semantic.stroke.brand.stroke3\n  }], [t, filterCostFemale, filterCostMale, theme]);\n  const activeIndex = React.useMemo(() => {\n    const found = tabs.findIndex(tab => tab.id === sex);\n    return found >= 0 ? found : tabs.length - 1;\n  }, [tabs, sex]);\n  const sliderMetrics = React.useMemo(() => {\n    const inset = 0;\n    const totalInnerWidth = Math.max(containerWidth - inset * 2, 0);\n    const segmentWidth = totalInnerWidth / tabs.length;\n    return {\n      inset,\n      segmentWidth\n    };\n  }, [containerWidth, tabs.length]);\n  React.useEffect(() => {\n    if (!sliderMetrics.segmentWidth) return;\n    ReactNative.Animated.spring(sliderTranslateX, {\n      toValue: activeIndex * sliderMetrics.segmentWidth,\n      damping: 22,\n      stiffness: 220,\n      mass: 0.9,\n      useNativeDriver: true\n    }).start();\n  }, [activeIndex, sliderMetrics.segmentWidth, sliderTranslateX]);\n  const sliderStyle = React.useMemo(() => {\n    return {\n      left: sliderMetrics.inset,\n      width: sliderMetrics.segmentWidth,\n      backgroundColor: tabs[activeIndex]?.accentBg ?? theme.theme.semantic.surface.brand.surface2,\n      borderColor: tabs[activeIndex]?.accentBorder ?? theme.theme.semantic.stroke.brand.stroke3\n    };\n  }, [sliderMetrics, tabs, activeIndex, theme]);\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      height: 150,\n      borderRadius: 24,\n      backgroundColor: theme.theme.semantic.surface.regular.surface2,\n      position: 'relative',\n      flexDirection: 'row'\n    },\n    slider: {\n      position: 'absolute',\n      top: 0,\n      bottom: 0,\n      borderRadius: 24,\n      borderWidth: 2,\n      transform: [{\n        translateX: sliderTranslateX\n      }],\n      ...sliderStyle\n    },\n    tabContainer: {\n      flex: 1\n    },\n    tabButton: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 4,\n      borderRadius: 20,\n      zIndex: 2\n    },\n    iconCircle: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      borderRadius: 999,\n      width: 56,\n      height: 56\n    },\n    iconImage: {\n      width: 36,\n      height: 36\n    },\n    bothIconWrap: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: 77,\n      height: 56,\n      position: 'relative'\n    },\n    bothFemaleIcon: {\n      position: 'absolute',\n      left: 0,\n      top: 1,\n      transform: [{\n        rotate: '-15deg'\n      }],\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      borderRadius: 999,\n      width: 44,\n      height: 44,\n      borderWidth: 2\n    },\n    bothMaleIcon: {\n      position: 'absolute',\n      left: 33,\n      top: 14,\n      transform: [{\n        rotate: '10deg'\n      }],\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      borderRadius: 999,\n      width: 42,\n      height: 42,\n      borderWidth: 2\n    },\n    bothIconImage: {\n      width: 28,\n      height: 28\n    },\n    title: {\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600\n    },\n    priceRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 4,\n      paddingTop: 4\n    },\n    priceText: {\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500\n    }\n  }), [theme, sliderStyle, sliderTranslateX]);\n  const tabUi = React.useMemo(() => {\n    return tabs.map((tab, index) => {\n      const isActive = index === activeIndex;\n      const showFree = tab.id == null || remainingSpins > 0;\n      return {\n        ...tab,\n        isActive,\n        showFree,\n        titleStyle: {\n          color: theme.theme.semantic.content.regular.primary\n        },\n        priceTextStyle: {\n          color: showFree ? theme.theme.semantic.content.brand.content1 : theme.theme.semantic.content.regular.primary\n        },\n        diamondStyle: {\n          color: theme.theme.semantic.content.brand.content1\n        },\n        iconCircleStyle: {\n          backgroundColor: tab.iconBg\n        },\n        bothFemaleStyle: {\n          backgroundColor: theme.theme.semantic.surface.additionalOne.surface4,\n          borderColor: isActive ? theme.theme.semantic.stroke.brand.stroke1 : theme.theme.semantic.stroke.regular.stroke1\n        },\n        bothMaleStyle: {\n          backgroundColor: theme.theme.semantic.surface.information.surface4,\n          borderColor: isActive ? theme.theme.semantic.stroke.brand.stroke1 : theme.theme.semantic.stroke.regular.stroke1\n        }\n      };\n    });\n  }, [tabs, activeIndex, remainingSpins, theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    onLayout: event => setContainerWidth(event?.nativeEvent?.layout?.width ?? 0),\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    pointerEvents: \"none\",\n    style: styles.slider\n  }), tabUi.map(tab => {\n    return /*#__PURE__*/React.createElement(Components.DSPressable, {\n      key: String(tab.id),\n      onPress: () => onChangeSex?.(tab.id),\n      styleContainer: styles.tabContainer,\n      style: styles.tabButton\n    }, tab.id == null ? /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.bothIconWrap\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.bothFemaleIcon, tab.bothFemaleStyle]\n    }, /*#__PURE__*/React.createElement(Components.DSImage, {\n      hideProgress: true,\n      style: styles.bothIconImage,\n      source: Assets.female\n    })), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.bothMaleIcon, tab.bothMaleStyle]\n    }, /*#__PURE__*/React.createElement(Components.DSImage, {\n      hideProgress: true,\n      style: styles.bothIconImage,\n      source: Assets.male\n    }))) : /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.iconCircle, tab.iconCircleStyle]\n    }, /*#__PURE__*/React.createElement(Components.DSImage, {\n      hideProgress: true,\n      style: styles.iconImage,\n      source: tab.icon\n    })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      numberOfLines: 1,\n      adjustsFontSizeToFit: true,\n      minimumFontScale: 0.5,\n      style: [styles.title, tab.titleStyle]\n    }, tab.title), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.priceRow\n    }, tab.showFree ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.priceText, tab.priceTextStyle]\n    }, t(\"filterFree\") || \"Free\") : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Assets.Diamond, {\n      style: tab.diamondStyle\n    }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.priceText, tab.priceTextStyle]\n    }, tab.price))));\n  }));\n};"},"ReportReasonModal":{"name":"ReportReasonModal","key":"ea4a524b1550e7c59042db54c790533a89f771e33755377be92c63611dacb3d6","code":"return ({\n  reason\n}) => {\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const t = Locale.useTranslation();\n  const [isLoading, setIsLoading] = React.useState();\n  const items = React.useMemo(() => [{\n    id: 'child_abuse',\n    name: t('reportReasonChildAbuse')\n  }, {\n    id: 'i_dont_like_it',\n    name: t('reportReasonDislike')\n  }, {\n    id: 'illegal_goods',\n    name: t('reportReasonIllegalGoods')\n  }, {\n    id: 'illegal_adult_content',\n    name: t('reportReasonAdult')\n  }], [t]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingBottom: Math.max(safeArea.bottom + 4, 8)\n    },\n    header: {\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    subcontainer: {\n      paddingHorizontal: 16,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    titleContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    },\n    full: {\n      width: '100%'\n    },\n    flex: {\n      flex: 1\n    },\n    buttonContainer: {\n      width: '100%',\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%'\n    },\n    buttonBody: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    buttonText: {\n      color: theme.theme.component.button.brand.content,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    },\n    input: {\n      container: {\n        flex: 1,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        width: '100%'\n      },\n      icon: {\n        position: 'absolute',\n        right: 0,\n        top: 0,\n        bottom: 0,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        paddingHorizontal: 16,\n        paddingVertical: 12\n      },\n      text: {\n        width: '100%',\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: 500,\n        borderWidth: 1,\n        borderColor: theme.theme.component.textField.borderDefault,\n        borderRadius: 12,\n        backgroundColor: theme?.isDark ? Utils?.withOpacity ? Utils.withOpacity(theme.theme.component.textField.bg, 0.05) : theme.theme.component.textField.bg : theme.theme.component.textField.bg,\n        color: theme.theme.component.textField.contentPrimary,\n        paddingLeft: 16,\n        paddingRight: 48,\n        paddingVertical: 14\n      },\n      iconColor: {\n        color: theme.theme.component.textField.contentPrimary\n      }\n    },\n    pic: {\n      button: {\n        gap: 6,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      buttonIcon: {\n        color: theme.theme.component.button.primaryInversion.content\n      },\n      buttonText: {\n        color: theme.theme.component.button.primaryInversion.content,\n        fontSize: 14,\n        fontWeight: 600\n      }\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      left: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    style: styles.title\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleContainer\n  }, /*#__PURE__*/React.createElement(Assets.Flag, {\n    style: styles.title\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('reportReasonHeader'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.title\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.subcontainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'center',\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.05),\n      borderRadius: 24,\n      paddingHorizontal: 16\n    }\n  }, items.map((item, index) => {\n    const selected = item.id === reason?.id;\n    return /*#__PURE__*/React.createElement(React.Fragment, {\n      key: item.id\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      style: {\n        paddingVertical: 16,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      onPress: () => sheet.close(item)\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: {\n        flex: 1,\n        fontSize: 16,\n        lineHeight: 20,\n        fontWeight: 500,\n        color: theme.theme.component.listItem.contentPrimaryDefault\n      }\n    }, item.name), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        borderColor: selected ? theme.theme.component.radioButton.content : Utils.withOpacity(theme.theme.component.radioButton.borderDefault, 0.4),\n        borderWidth: 2,\n        borderRadius: 999,\n        height: 24,\n        width: 24,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      }\n    }, selected && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        backgroundColor: theme.theme.component.radioButton.content,\n        borderRadius: 999,\n        height: 11,\n        width: 11\n      }\n    }))), index < items.length - 1 && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        height: 1,\n        width: \"100%\",\n        backgroundColor: theme.theme.semantic.stroke.regular.stroke2\n      }\n    }));\n  }))));\n};"},"VideoChatGate":{"name":"VideoChatGate","key":"21cf832319c55971b65b614f7f73783fd8563181ca3acfc8b1538299438dfeab","code":"deps: VideoChat, VideoPermissionGate\nreturn () => /*#__PURE__*/React.createElement(LazyComponent, {\n  name: \"VideoPermissionGate\"\n}, /*#__PURE__*/React.createElement(WebRTCSDK.BackgroundFiltersProvider, null, /*#__PURE__*/React.createElement(LazyComponent, {\n  name: \"VideoChat\"\n})));"},"PeerCountry":{"name":"PeerCountry","key":"db46cb43ee0a57af4011401094aa40d1aa42b5abf3bdebf029fd380dc96c8874","code":"return ({\n  country,\n  contentColor,\n  simple\n}) => {\n  const theme = Theme.useTheme();\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const styles = React.useMemo(() => ({\n    container: {\n      gap: 6,\n      width: \"auto\",\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 6,\n      backgroundColor: Utils.withOpacity(theme.theme.component.badge.transparent.invariably.bg, 0.2),\n      borderRadius: 100\n    },\n    flagWrapper: {\n      width: 18,\n      height: 18,\n      borderRadius: 14,\n      justifyContent: 'center',\n      alignItems: 'center',\n      overflow: 'hidden'\n    },\n    title: {\n      fontFamily: theme.theme.typography.family.subtitle,\n      color: contentColor ?? theme.theme.component.badge.transparent.content,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 600,\n      includeFontPadding: false,\n      maxWidth: 76\n    },\n    flagWrapperTablet: {\n      width: 20,\n      height: 20\n    },\n    titleTablet: {\n      maxWidth: 112\n    }\n  }), [theme.theme, contentColor]);\n  if (!country) {\n    return null;\n  }\n  if (simple) {\n    return /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n      code: country,\n      size: 16\n    });\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.flagWrapper, isTablet ? styles.flagWrapperTablet : null]\n  }, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: country,\n    size: isTablet ? 28 : 20\n  })), /*#__PURE__*/React.createElement(Components.DSCountryText, {\n    code: country,\n    style: [styles.title, isTablet ? styles.titleTablet : null],\n    numberOfLines: 1\n  }));\n};"},"PeerStatus":{"name":"PeerStatus","key":"bc02710b98b45ae215b27183d144259026e3109cc113d20dc4bf08b5930fcd44","code":"deps: Status\nreturn ({\n  status,\n  showRating = true,\n  simple\n}) => {\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Status\",\n    status: status,\n    showRating: showRating,\n    simple: simple\n  });\n};"},"BadgePremium":{"name":"BadgePremium","key":"07cec1c5631cc0a48e7b44710edccf9f72fd1ceeb98a3892bcbeaf6445910ae8","code":"const CrownIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"14\",\n    height: \"14\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M2 5.5L5 7.5L8 3L11 7.5L14 5.5L12.5 11.5H3.5L2 5.5ZM3 12.5H13V14H3V12.5Z\",\n    fill: \"currentColor\"\n  }));\n};\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 6,\n      borderRadius: 100,\n      gap: 4,\n      backgroundColor: theme.theme.component.badge.brand.bg,\n      minHeight: 30\n    },\n    text: {\n      fontFamily: theme.theme.typography.family.subtitle,\n      fontWeight: 600,\n      fontSize: 12,\n      lineHeight: 16,\n      includeFontPadding: false,\n      color: theme.theme.component.badge.brand.content\n    },\n    icon: {\n      color: theme.theme.component.badge.brand.content,\n      width: 14,\n      height: 14\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text,\n    numberOfLines: 1\n  }, t('badgePremium')), /*#__PURE__*/React.createElement(CrownIcon, {\n    style: styles.icon\n  }));\n};"},"FoldableText":{"name":"FoldableText","key":"b75b8ba2f705a3d5c1f1e0e582621d5be95c8986cb2c17bbe753ff9d936333d4","code":"return ({\n  text,\n  textStyle,\n  moreStyle,\n  maxHeight = 200,\n  numberOfLines = 2\n}) => {\n  const t = Locale.useTranslation();\n  const [more, setMore] = React.useState(false);\n  const [clippedText, setClippedText] = React.useState(null);\n  const content = (text ?? '').trim();\n  React.useEffect(() => {\n    setMore(false);\n    setClippedText(null);\n  }, [content]);\n  const setMoreWithLog = React.useCallback(value => {\n    console.log('[FoldableText] setMore', value);\n    setMore(value);\n  }, []);\n  const onTextLayout = React.useCallback(event => {\n    if (more || !content || clippedText !== null) {\n      return;\n    }\n    const {\n      lines\n    } = event.nativeEvent;\n    if (lines && lines.length > numberOfLines) {\n      const textValue = lines.slice(0, numberOfLines).map(line => line.text).join('');\n      const moreText = `... ${t('more')}`;\n      const charsToRemove = moreText.length + 5;\n      const clipped = textValue.substring(0, Math.max(0, textValue.length - charsToRemove));\n      setClippedText(clipped);\n    }\n  }, [more, content, clippedText, t, numberOfLines]);\n  if (!content) {\n    return null;\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n    style: {\n      maxHeight,\n      width: '100%',\n      overflow: 'hidden'\n    }\n  }, !more && clippedText === null && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [textStyle, {\n      position: 'absolute',\n      opacity: 0,\n      width: '100%'\n    }],\n    pointerEvents: \"none\",\n    onTextLayout: onTextLayout\n  }, content), more ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: textStyle,\n    onPress: () => setMoreWithLog(false)\n  }, content, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: moreStyle\n  }, ' ', t('less'))) : clippedText ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: textStyle,\n    onPress: () => setMoreWithLog(true)\n  }, clippedText, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: textStyle\n  }, \"...\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: moreStyle\n  }, ' ', t('more'))) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: numberOfLines,\n    ellipsizeMode: \"tail\",\n    style: textStyle,\n    onPress: () => setMoreWithLog(true)\n  }, content));\n};"},"ChatDropdownMenu":{"name":"ChatDropdownMenu","key":"ea0b8a574fcfa17183fa6e4841aa938f829693d37a7ea03fec4cfb357cfa713a","code":"deps: WithAppear\n/**\n * ChatDropdownMenu - выпадающее меню для страницы чата / карточки пользователя\n * \n * @param {Object} props\n * @param {boolean} props.visible - Показать/скрыть меню\n * @param {() => void} props.onClose - Закрыть меню\n * @param {() => void} [props.onSubscribe] - Подписаться\n * @param {() => void} [props.onUnsubscribe] - Отписаться (карточка)\n * @param {() => void} [props.onBlock] - Заблокировать пользователя\n * @param {() => void} [props.onMute] - Замьютить чат\n * @param {() => void} [props.onReport] - Пожаловаться\n * @param {() => void} [props.onDelete] - Удалить чат\n * @param {boolean} [props.isMuted] - Чат замьючен\n */\n\nconst OVERLAY_PRESS_GUARD_MS = 150;\n\n// Иконка Block (минус в круге)\nconst BlockIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M8 1.33334C4.31811 1.33334 1.33334 4.31811 1.33334 8C1.33334 11.6819 4.31811 14.6667 8 14.6667C11.6819 14.6667 14.6667 11.6819 14.6667 8C14.6667 4.31811 11.6819 1.33334 8 1.33334ZM5.33334 7.33334C4.96515 7.33334 4.66667 7.63182 4.66667 8C4.66667 8.36819 4.96515 8.66667 5.33334 8.66667H10.6667C11.0349 8.66667 11.3333 8.36819 11.3333 8C11.3333 7.63182 11.0349 7.33334 10.6667 7.33334H5.33334Z\",\n  fill: color\n}));\n\n// Иконка Mute (перечёркнутый динамик)\nconst MuteIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10.6667 5.99999V5.33332C10.6667 3.86056 9.47276 2.66666 8 2.66666C7.26362 2.66666 6.59695 2.96516 6.11438 3.44773M10.6667 10V10.6667C10.6667 12.1394 9.47276 13.3333 8 13.3333C6.52724 13.3333 5.33334 12.1394 5.33334 10.6667V7.99999M2 2L14 14M8 10.6667V10.6667C6.52724 10.6667 5.33334 9.47275 5.33334 7.99999V5.99999\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\n\n// Иконка Report (флаг)\nconst ReportIcon = ({\n  size = 16,\n  color = '#E83B3B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M2.66667 14.6667V2.00001M2.66667 10.6667C2.66667 10.6667 3.33334 10 5.33334 10C7.33334 10 8.66667 11.3333 10.6667 11.3333C12.6667 11.3333 13.3333 10.6667 13.3333 10.6667V2.00001C13.3333 2.00001 12.6667 2.66667 10.6667 2.66667C8.66667 2.66667 7.33334 1.33334 5.33334 1.33334C3.33334 1.33334 2.66667 2.00001 2.66667 2.00001\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\n\n// Иконка Delete (корзина)\nconst DeleteIcon = ({\n  size = 16,\n  color = '#E83B3B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M2 4H14M12.6667 4V13.3333C12.6667 14 12 14.6667 11.3333 14.6667H4.66667C4 14.6667 3.33333 14 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2 6 1.33334 6.66667 1.33334H9.33333C10 1.33334 10.6667 2 10.6667 2.66667V4M6.66667 7.33334V11.3333M9.33333 7.33334V11.3333\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\n\n// Иконка Subscribe (круг с плюсом)\nconst SubscribeIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8 0.833008C11.9578 0.833184 15.1658 4.04222 15.166 8C15.1658 11.9578 11.9578 15.1658 8 15.166C4.04222 15.1658 0.833184 11.9578 0.833008 8C0.833184 4.04222 4.04222 0.833184 8 0.833008ZM8 1.83301C4.5945 1.83318 1.83318 4.5945 1.83301 8C1.83318 11.4055 4.5945 14.1658 8 14.166C11.4055 14.1658 14.1658 11.4055 14.166 8C14.1658 4.5945 11.4055 1.83318 8 1.83301ZM8.5 5.5C8.5 5.22386 8.27614 5 8 5C7.72386 5 7.5 5.22386 7.5 5.5V7.5H5.5C5.22386 7.5 5 7.72386 5 8C5 8.27614 5.22386 8.5 5.5 8.5H7.5V10.5C7.5 10.7761 7.72386 11 8 11C8.27614 11 8.5 10.7761 8.5 10.5V8.5H10.5C10.7761 8.5 11 8.27614 11 8C11 7.72386 10.7761 7.5 10.5 7.5H8.5V5.5Z\",\n  fill: color\n}));\n\n// Иконка Unsubscribe (круг с минусом)\nconst UnsubscribeIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8 0.833008C11.9578 0.833184 15.1658 4.04222 15.166 8C15.1658 11.9578 11.9578 15.1658 8 15.166C4.04222 15.1658 0.833184 11.9578 0.833008 8C0.833184 4.04222 4.04222 0.833184 8 0.833008ZM8 1.83301C4.5945 1.83318 1.83318 4.5945 1.83301 8C1.83318 11.4055 4.5945 14.1658 8 14.166C11.4055 14.1658 14.1658 11.4055 14.166 8C14.1658 4.5945 11.4055 1.83318 8 1.83301ZM10 7.5C10.2761 7.5 10.5 7.72386 10.5 8C10.5 8.27614 10.2761 8.5 10 8.5H6C5.72386 8.5 5.5 8.27614 5.5 8C5.5 7.72386 5.72386 7.5 6 7.5H10Z\",\n  fill: color\n}));\nreturn ({\n  visible,\n  onClose,\n  onSubscribe,\n  onUnsubscribe,\n  onBlock,\n  onMute,\n  onReport,\n  onDelete,\n  isMuted,\n  topOffset = 64\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const openedAtRef = React.useRef(0);\n\n  // Цвета из темы\n  const bgColor = theme.theme.component?.dropdown?.bg || '#FFFFFF';\n  const contentDefault = theme.theme.component?.dropdown?.contentDefault || '#38404A';\n  const contentDangerous = theme.theme.component?.dropdown?.contentDangerous || '#E83B3B';\n  const dividerColor = theme.theme.component?.dropdown?.divider || '#E5E8EC';\n\n  // Размеры экрана для полноэкранного overlay\n  const {\n    width: screenWidth,\n    height: screenHeight\n  } = ReactNative.useWindowDimensions();\n  const styles = React.useMemo(() => ({\n    overlay: {\n      position: 'absolute',\n      // Выходим за пределы родителя для покрытия всего экрана\n      top: -topOffset,\n      left: -screenWidth,\n      width: screenWidth * 3,\n      height: screenHeight * 2,\n      zIndex: 100\n    },\n    container: {\n      position: 'absolute',\n      top: topOffset,\n      right: 8,\n      width: 240,\n      alignItems: 'stretch',\n      backgroundColor: bgColor,\n      borderRadius: 16,\n      borderWidth: 1,\n      borderColor: bgColor,\n      overflow: 'hidden',\n      zIndex: 101,\n      // Shadow\n      shadowColor: '#04060F',\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      elevation: 10\n    },\n    row: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      height: 44,\n      backgroundColor: bgColor,\n      width: '100%'\n    },\n    rowInner: {\n      flexDirection: 'row',\n      flex: 1,\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      minWidth: 0\n    },\n    rowTextWrap: {\n      flex: 1,\n      minWidth: 0\n    },\n    rowText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.3,\n      color: contentDefault\n    },\n    rowTextDanger: {\n      color: contentDangerous\n    },\n    divider: {\n      height: 1,\n      backgroundColor: dividerColor\n    }\n  }), [theme, topOffset, bgColor, contentDefault, contentDangerous, dividerColor, screenWidth, screenHeight]);\n  const handlePress = React.useCallback(action => {\n    action?.();\n    onClose?.();\n  }, [onClose]);\n  React.useEffect(() => {\n    if (visible) openedAtRef.current = Date.now();\n  }, [visible]);\n  const handleOverlayPress = React.useCallback(() => {\n    if (Date.now() - openedAtRef.current < OVERLAY_PRESS_GUARD_MS) return;\n    onClose?.();\n  }, [onClose]);\n  const hasAny = !!(onSubscribe || onUnsubscribe || onBlock || onMute || onReport || onDelete);\n  if (!hasAny) return null;\n  return /*#__PURE__*/React.createElement(React.Fragment, null, visible && /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.overlay,\n    onPress: handleOverlayPress\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: visible,\n    scale: 0.8,\n    duration: 100,\n    translateY: -25,\n    style: styles.container\n  }, (onSubscribe != null || onUnsubscribe != null) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handlePress(onUnsubscribe ?? onSubscribe)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, onUnsubscribe != null ? t('chatMenuUnsubscribe') || 'Unsubscribe' : t('chatMenuSubscribe') || 'Subscribe')), onUnsubscribe != null ? /*#__PURE__*/React.createElement(UnsubscribeIcon, {\n    size: 16,\n    color: contentDefault\n  }) : /*#__PURE__*/React.createElement(SubscribeIcon, {\n    size: 16,\n    color: contentDefault\n  })), (onBlock != null || onMute != null || onReport != null || onDelete != null) && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  })), onBlock != null && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handlePress(onBlock)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, t('chatMenuBlock') || 'Block user')), /*#__PURE__*/React.createElement(BlockIcon, {\n    size: 16,\n    color: contentDefault\n  })), (onMute != null || onReport != null || onDelete != null) && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  })), onMute != null && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handlePress(onMute)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, isMuted ? t('chatMenuUnmute') || 'Unmute' : t('chatMenuMute') || 'Mute')), /*#__PURE__*/React.createElement(MuteIcon, {\n    size: 16,\n    color: contentDefault\n  })), (onReport != null || onDelete != null) && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  })), onReport != null && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handlePress(onReport)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.rowText, styles.rowTextDanger],\n    numberOfLines: 1\n  }, t('chatMenuReport') || 'Report')), /*#__PURE__*/React.createElement(ReportIcon, {\n    size: 16,\n    color: contentDangerous\n  })), onDelete != null && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  })), onDelete != null && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handlePress(onDelete)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.rowText, styles.rowTextDanger],\n    numberOfLines: 1\n  }, t('chatMenuDelete') || 'Delete chat')), /*#__PURE__*/React.createElement(DeleteIcon, {\n    size: 16,\n    color: contentDangerous\n  }))));\n};"},"GiftsCatalogSheet":{"name":"GiftsCatalogSheet","key":"f89a0407e805d9efe3522523f382672ab4a568b1efc8499e31f8e477777764ee","code":"deps: AutoSizeText, BalancePill, GiftsConfirmationSheet, DraggableScrollView\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst TIER_SECTIONS = [{\n  key: 'classic',\n  titleKey: 'giftCatalogSectionClassic'\n}, {\n  key: 'special',\n  titleKey: 'giftCatalogSectionSpecial'\n}, {\n  key: 'premium',\n  titleKey: 'giftCatalogSectionPremium'\n}];\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst GIFT_GRID_COLUMNS = 4;\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst GIFT_GRID_GAP = 12;\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst normalizeTier = value => String(value ?? '').trim().toLowerCase();\nfunction _empty() {}\nconst formatWithSpaces = number => String(number ?? 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u00A0');\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nconst MainCurrencyIcon = ({\n  size = 16,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst CloseIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6 6L18 18M18 6L6 18\",\n  stroke: \"currentColor\",\n  strokeWidth: 1.8,\n  strokeLinecap: \"round\"\n}));\nconst SectionHeader = React.memo(({\n  section,\n  styles,\n  t\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.sectionHeader\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.sectionLine\n}), /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.sectionTitle\n}, t(section.titleKey)), /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.sectionLine\n})));\nconst GiftSkeleton = React.memo(({\n  styles,\n  giftCardLayoutStyle\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: [styles.giftCardContainer, giftCardLayoutStyle]\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.giftCard\n}, /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n  width: 72,\n  height: 72,\n  borderRadius: 18,\n  color: \"rgba(255,255,255,0.25)\"\n}), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n  width: 48,\n  height: 14,\n  borderRadius: 4,\n  color: \"rgba(255,255,255,0.22)\"\n}), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n  width: 40,\n  height: 16,\n  borderRadius: 4,\n  color: \"rgba(255,255,255,0.22)\"\n}))));\nconst GiftCard = React.memo(({\n  gift,\n  styles,\n  giftCardLayoutStyle,\n  disabled,\n  onPress\n}) => /*#__PURE__*/React.createElement(Components.DSPressable, {\n  feedback: true,\n  noloading: true,\n  disabled: disabled,\n  styleContainer: [styles.giftCardContainer, giftCardLayoutStyle],\n  style: styles.giftCard,\n  onPress: () => onPress?.(gift)\n}, /*#__PURE__*/React.createElement(Image, {\n  source: {\n    uri: gift.imageUrl\n  },\n  style: styles.giftImage,\n  contentFit: \"contain\"\n}), /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.giftTitle,\n  numberOfLines: 1\n}, gift.title), /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.giftPriceRow\n}, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n  size: 16,\n  style: styles.priceIcon\n}), /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.giftPriceContainer\n}, /*#__PURE__*/React.createElement(LazyComponent, {\n  name: \"AutoSizeText\",\n  fontSize: 14,\n  numberOfLines: 1,\n  style: styles.giftPrice\n}, formatWithSpaces(gift.priceGems))))));\nreturn () => {\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const {\n    height: windowHeight\n  } = ReactNative.useWindowDimensions();\n  const t = Locale.useTranslation();\n  const [catalog, setCatalog] = React.useState(() => State.api?.gifts?.getCatalog?.() ?? []);\n  const [loading, setLoading] = React.useState(!catalog?.length);\n  const [error, setError] = React.useState(null);\n  const [gridWidth, setGridWidth] = React.useState(0);\n  const loadCatalog = React.useCallback(_async(function ({\n    force = false\n  } = {}) {\n    setError(null);\n    setLoading(true);\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        return _await(State.api?.gifts?.loadCatalog?.({\n          force\n        }), function (items) {\n          setCatalog(items ?? []);\n        });\n      }, function (err) {\n        console.error('[GiftsCatalogSheet] load catalog failed', err);\n        setError(err);\n      });\n    }, function (_wasThrown, _result) {\n      setLoading(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), []);\n  React.useEffect(() => {\n    loadCatalog({\n      force: !catalog?.length\n    });\n  }, []);\n  const grouped = React.useMemo(() => {\n    const result = {};\n    for (const item of catalog ?? []) {\n      const key = normalizeTier(item?.tier);\n      if (!result[key]) result[key] = [];\n      result[key].push(item);\n    }\n    return result;\n  }, [catalog]);\n  const isEmpty = !loading && !error && TIER_SECTIONS.every(section => !grouped[section.key]?.length);\n  const openStore = React.useCallback(() => {\n    sheet.close();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"store\",\n      isModal: true,\n      purchaseSource: \"gifts\"\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet]);\n  const handleGiftPress = React.useCallback(gift => {\n    if (!gift) return;\n    State.api?.gifts?.selectGift?.(gift);\n    sheet.close({\n      gift\n    });\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsConfirmationSheet\",\n      gift: gift\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet]);\n  const handleGridLayout = React.useCallback(event => {\n    const nextWidth = Math.round(event?.nativeEvent?.layout?.width ?? 0);\n    if (nextWidth <= 0) return;\n    setGridWidth(currentWidth => currentWidth === nextWidth ? currentWidth : nextWidth);\n  }, []);\n  const giftCardLayoutStyle = React.useMemo(() => {\n    if (!gridWidth) return null;\n    const itemWidth = (gridWidth - GIFT_GRID_GAP * (GIFT_GRID_COLUMNS - 1)) / GIFT_GRID_COLUMNS;\n    return {\n      width: itemWidth,\n      flexBasis: itemWidth,\n      maxWidth: itemWidth\n    };\n  }, [gridWidth]);\n  const sheetBottomPadding = Math.max(safeArea.bottom, 16);\n  const sheetMaxHeight = Math.min(Math.max(320, windowHeight - safeArea.top - 12), Math.round(windowHeight * 0.78));\n  const contentMaxHeight = Math.max(220, sheetMaxHeight - 56 - sheetBottomPadding);\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      maxHeight: sheetMaxHeight,\n      backgroundColor: 'rgba(4, 6, 15, 0.8)',\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      overflow: 'hidden',\n      paddingBottom: sheetBottomPadding\n    },\n    header: {\n      height: 56,\n      paddingTop: 12,\n      paddingBottom: 4,\n      paddingHorizontal: 16,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    headerSide: {\n      width: 40,\n      height: 40\n    },\n    headerCenter: {\n      flex: 1,\n      minWidth: 0,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    contentScroll: {\n      width: '100%',\n      maxHeight: contentMaxHeight\n    },\n    closeButton: {\n      width: 40,\n      height: 40,\n      borderRadius: 20,\n      justifyContent: 'center',\n      alignItems: 'flex-end'\n    },\n    closeIcon: {\n      color: '#FFFFFF',\n      opacity: 0.9\n    },\n    content: {\n      paddingTop: 16,\n      paddingHorizontal: 16,\n      gap: 20\n    },\n    section: {\n      gap: 8,\n      width: '100%'\n    },\n    sectionHeader: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 12,\n      width: '100%'\n    },\n    sectionLine: {\n      height: 1,\n      flex: 1,\n      backgroundColor: 'rgba(255,255,255,0.12)'\n    },\n    sectionTitle: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: 'rgba(255,255,255,0.6)',\n      textAlign: 'center'\n    },\n    grid: {\n      flexDirection: 'row',\n      gap: GIFT_GRID_GAP,\n      justifyContent: 'flex-start',\n      flexWrap: 'wrap'\n    },\n    giftCardContainer: {\n      flexGrow: 0,\n      flexShrink: 0,\n      minWidth: 0\n    },\n    giftCard: {\n      width: '100%',\n      paddingBottom: 12,\n      flexDirection: 'column',\n      alignItems: 'center',\n      gap: 4\n    },\n    giftImage: {\n      width: 72,\n      height: 72,\n      maxWidth: '100%'\n    },\n    giftTitle: {\n      width: '100%',\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: '#FFFFFF',\n      textAlign: 'center'\n    },\n    giftPriceRow: {\n      width: '100%',\n      alignSelf: 'center',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 2,\n      flexShrink: 0,\n      overflow: 'visible'\n    },\n    priceIcon: {\n      color: '#FE375B',\n      flexShrink: 0\n    },\n    giftPriceContainer: {\n      minWidth: 0,\n      flexShrink: 1,\n      overflow: 'visible'\n    },\n    giftPrice: {\n      minWidth: 0,\n      flexShrink: 1,\n      fontFamily: 'Inter',\n      fontWeight: '700',\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: '#FFFFFF',\n      textAlign: 'center',\n      overflow: 'visible'\n    },\n    stateBox: {\n      minHeight: 160,\n      paddingHorizontal: 24,\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 12\n    },\n    stateTitle: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 18,\n      lineHeight: 24,\n      color: '#FFFFFF',\n      textAlign: 'center'\n    },\n    stateText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      color: 'rgba(255,255,255,0.6)',\n      textAlign: 'center'\n    },\n    retryButton: {\n      marginTop: 4,\n      height: 40,\n      paddingHorizontal: 18,\n      borderRadius: 999,\n      backgroundColor: '#FFFFFF',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    retryText: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 20,\n      color: '#04060F'\n    }\n  }), [contentMaxHeight, sheetBottomPadding, sheetMaxHeight]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerSide\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerCenter\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"BalancePill\",\n    onPress: openStore,\n    surfaceColor: \"rgba(4, 6, 15, 0.5)\",\n    contentColor: \"#FFFFFF\",\n    iconColor: \"#FE375B\",\n    buttonColor: \"#FFFFFF\",\n    buttonContentColor: \"#04060F\"\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.closeButton,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"DraggableScrollView\",\n    blockParentGesture: ReactNative.Platform.OS === 'web',\n    style: styles.contentScroll,\n    contentContainerStyle: styles.content,\n    showsVerticalScrollIndicator: false\n  }, loading ? TIER_SECTIONS.map(section => /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: section.key,\n    style: styles.section\n  }, /*#__PURE__*/React.createElement(SectionHeader, {\n    section: section,\n    styles: styles,\n    t: t\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.grid,\n    onLayout: handleGridLayout\n  }, [0, 1, 2, 3].map(item => /*#__PURE__*/React.createElement(GiftSkeleton, {\n    key: item,\n    styles: styles,\n    giftCardLayoutStyle: giftCardLayoutStyle\n  }))))) : error ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.stateBox\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.stateTitle\n  }, t('commonErrorTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.stateText\n  }, String(error?.message ?? error) || 'Failed to load gifts'), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.retryButton,\n    onPress: () => loadCatalog({\n      force: true\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.retryText\n  }, t('retry')))) : isEmpty ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.stateBox\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.stateTitle\n  }, t('giftsEmptyTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.stateText\n  }, t('giftsEmptyDescription'))) : TIER_SECTIONS.map(section => /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: section.key,\n    style: styles.section\n  }, /*#__PURE__*/React.createElement(SectionHeader, {\n    section: section,\n    styles: styles,\n    t: t\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.grid,\n    onLayout: handleGridLayout\n  }, (grouped[section.key] ?? []).map(gift => /*#__PURE__*/React.createElement(GiftCard, {\n    key: gift.id ?? gift.uid,\n    gift: gift,\n    styles: styles,\n    giftCardLayoutStyle: giftCardLayoutStyle,\n    disabled: false,\n    onPress: handleGiftPress\n  })))))));\n};"},"PhotoViewer":{"name":"PhotoViewer","key":"ca33f67c2f8695443500b39173cd158acb0fba52bd3cfe057c09883dc1e9cc61","code":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst MAX_SCALE = 3;\nconst SWIPE_THRESHOLD = 72;\nconst VELOCITY_THRESHOLD = 900;\nconst clamp = (value, min, max) => Math.max(min, Math.min(value, max));\nconst BackIcon = () => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M15 5L8 12L15 19\",\n  stroke: \"#FAFBFB\",\n  strokeWidth: 2,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\nconst TrashIcon = () => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9 4H15M4 7H20M18 7L17.4 17.2C17.31 18.72 16.05 20 14.53 20H9.47C7.95 20 6.69 18.72 6.6 17.2L6 7M10 11V16M14 11V16\",\n  stroke: \"#FAFBFB\",\n  strokeWidth: 1.8,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\nconst SmileIcon = ({\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 16,\n  height: 16,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Circle, {\n  cx: 8,\n  cy: 8,\n  r: 6.75,\n  stroke: color,\n  strokeWidth: 1.5\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M5.5 6.8V6.7M10.5 6.8V6.7M5.8 9.4C6.35 10.1 7.1 10.45 8 10.45C8.9 10.45 9.65 10.1 10.2 9.4\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n}));\nreturn ({\n  images = [],\n  index = 0,\n  avatarIndex,\n  setAvatarLabel,\n  avatarBadgeLabel,\n  backLabel,\n  deleteLabel,\n  onSetAvatar,\n  onRemove\n}) => {\n  const theme = Theme.useTheme();\n  const modal = Modals.useModal();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const {\n    width,\n    height\n  } = ReactNative.useWindowDimensions();\n  const Animated = ReactNative.Animated;\n  Stated.useDark({\n    dark: true,\n    immersive: true\n  });\n  const initialIndex = React.useRef(clamp(index, 0, Math.max(0, images.length - 1))).current;\n  const [currentIndex, setCurrentIndex] = React.useState(initialIndex);\n  const [pendingAction, setPendingAction] = React.useState(null);\n  const scale = React.useRef(new Animated.Value(1)).current;\n  const offsetX = React.useRef(new Animated.Value(0)).current;\n  const offsetY = React.useRef(new Animated.Value(0)).current;\n  const translateX = React.useRef(new Animated.Value(0)).current;\n  const translateY = React.useRef(new Animated.Value(0)).current;\n  const backdropOpacity = React.useRef(new Animated.Value(1)).current;\n  const gestureState = React.useRef({\n    scale: 1,\n    offsetX: 0,\n    offsetY: 0,\n    startX: 0,\n    startY: 0,\n    pinchStartScale: 1,\n    pageX: 0,\n    axis: null,\n    pinching: false,\n    ignorePanEnd: false,\n    closing: false\n  }).current;\n  React.useEffect(() => {\n    if (currentIndex < images.length) return;\n    setCurrentIndex(Math.max(0, images.length - 1));\n  }, [currentIndex, images.length]);\n  React.useEffect(() => {\n    const pageX = (initialIndex - currentIndex) * width;\n    gestureState.pageX = pageX;\n    translateX.setValue(pageX);\n  }, [currentIndex, initialIndex, translateX, width]);\n  const setScale = React.useCallback(value => {\n    gestureState.scale = value;\n    scale.setValue(value);\n  }, [scale]);\n  const setOffsets = React.useCallback((x, y) => {\n    gestureState.offsetX = x;\n    gestureState.offsetY = y;\n    offsetX.setValue(x);\n    offsetY.setValue(y);\n  }, [offsetX, offsetY]);\n  const resetZoom = React.useCallback((animated = false) => {\n    gestureState.scale = 1;\n    gestureState.offsetX = 0;\n    gestureState.offsetY = 0;\n    if (!animated) {\n      scale.setValue(1);\n      offsetX.setValue(0);\n      offsetY.setValue(0);\n      return;\n    }\n    Animated.parallel([Animated.timing(scale, {\n      toValue: 1,\n      duration: 150,\n      useNativeDriver: true\n    }), Animated.timing(offsetX, {\n      toValue: 0,\n      duration: 150,\n      useNativeDriver: true\n    }), Animated.timing(offsetY, {\n      toValue: 0,\n      duration: 150,\n      useNativeDriver: true\n    })]).start();\n  }, [Animated, offsetX, offsetY, scale]);\n  const resetSwipe = React.useCallback(() => {\n    gestureState.axis = null;\n    Animated.parallel([Animated.spring(translateX, {\n      toValue: gestureState.pageX,\n      useNativeDriver: true\n    }), Animated.spring(translateY, {\n      toValue: 0,\n      useNativeDriver: true\n    }), Animated.timing(backdropOpacity, {\n      toValue: 1,\n      duration: 150,\n      useNativeDriver: true\n    })]).start();\n  }, [Animated, backdropOpacity, translateX, translateY]);\n  const close = React.useCallback((animated = false) => {\n    if (gestureState.closing) return;\n    gestureState.closing = true;\n    if (!animated) {\n      modal.close({\n        index: currentIndex,\n        action: 'close'\n      });\n      return;\n    }\n    Animated.parallel([Animated.timing(translateY, {\n      toValue: height,\n      duration: 180,\n      useNativeDriver: true\n    }), Animated.timing(backdropOpacity, {\n      toValue: 0,\n      duration: 180,\n      useNativeDriver: true\n    })]).start(() => modal.close({\n      index: currentIndex,\n      action: 'close'\n    }));\n  }, [Animated, backdropOpacity, currentIndex, height, modal, translateY]);\n  Stated.useBackHandlerCatch(React.useCallback(() => {\n    close();\n    return false;\n  }, [close]));\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'web' || typeof globalThis.addEventListener !== 'function') return;\n    const onKeyDown = event => {\n      if (event.key !== 'Escape' || modal?.isInFront === false) return;\n      event.preventDefault?.();\n      close();\n    };\n    globalThis.addEventListener('keydown', onKeyDown);\n    return () => globalThis.removeEventListener('keydown', onKeyDown);\n  }, [close, modal]);\n  const finishPinch = React.useCallback(() => {\n    gestureState.pinching = false;\n    gestureState.ignorePanEnd = true;\n    if (gestureState.scale <= 1.01) {\n      resetZoom(true);\n      return;\n    }\n    const maxX = width * (gestureState.scale - 1) / 2;\n    const maxY = height * (gestureState.scale - 1) / 2;\n    setOffsets(clamp(gestureState.offsetX, -maxX, maxX), clamp(gestureState.offsetY, -maxY, maxY));\n  }, [height, resetZoom, setOffsets, width]);\n  const handlePanStart = React.useCallback(() => {\n    translateX.stopAnimation();\n    translateY.stopAnimation();\n    backdropOpacity.stopAnimation();\n    offsetX.stopAnimation();\n    offsetY.stopAnimation();\n    scale.stopAnimation();\n    gestureState.startX = gestureState.offsetX;\n    gestureState.startY = gestureState.offsetY;\n    gestureState.axis = null;\n    gestureState.ignorePanEnd = false;\n  }, [backdropOpacity, offsetX, offsetY, scale, translateX, translateY]);\n  const handlePanUpdate = React.useCallback(event => {\n    if (gestureState.pinching || gestureState.scale > 1.01) {\n      const maxX = width * (gestureState.scale - 1) / 2;\n      const maxY = height * (gestureState.scale - 1) / 2;\n      setOffsets(clamp(gestureState.startX + event.translationX, -maxX, maxX), clamp(gestureState.startY + event.translationY, -maxY, maxY));\n      return;\n    }\n    const dx = event.translationX;\n    const dy = event.translationY;\n    if (gestureState.axis == null && (Math.abs(dx) > 5 || Math.abs(dy) > 5)) {\n      gestureState.axis = Math.abs(dx) > Math.abs(dy) ? 'x' : 'y';\n    }\n    if (gestureState.axis === 'x') {\n      translateX.setValue(gestureState.pageX + dx);\n      return;\n    }\n    if (gestureState.axis === 'y') {\n      const distance = Math.max(0, dy);\n      translateY.setValue(distance);\n      backdropOpacity.setValue(1 - Math.min(0.7, distance / Math.max(1, height) * 1.4));\n    }\n  }, [backdropOpacity, height, setOffsets, translateX, translateY, width]);\n  const changePhoto = React.useCallback(direction => {\n    const nextIndex = clamp(currentIndex + direction, 0, images.length - 1);\n    if (nextIndex === currentIndex) {\n      resetSwipe();\n      return;\n    }\n    Animated.timing(translateX, {\n      toValue: (initialIndex - nextIndex) * width,\n      duration: 180,\n      useNativeDriver: true\n    }).start(({\n      finished\n    }) => {\n      if (!finished) return;\n      resetZoom();\n      translateY.setValue(0);\n      backdropOpacity.setValue(1);\n      setCurrentIndex(nextIndex);\n    });\n  }, [Animated, backdropOpacity, currentIndex, images.length, initialIndex, resetSwipe, resetZoom, translateX, translateY, width]);\n  const handlePanEnd = React.useCallback(event => {\n    if (gestureState.ignorePanEnd) {\n      gestureState.ignorePanEnd = false;\n      resetSwipe();\n      return;\n    }\n    if (gestureState.scale > 1.01) return;\n    if (gestureState.axis === 'y' && (event.translationY > SWIPE_THRESHOLD || event.velocityY > VELOCITY_THRESHOLD)) {\n      close(true);\n      return;\n    }\n    if (gestureState.axis === 'x' && (Math.abs(event.translationX) > SWIPE_THRESHOLD || Math.abs(event.velocityX) > VELOCITY_THRESHOLD)) {\n      changePhoto(event.translationX < 0 ? 1 : -1);\n      return;\n    }\n    resetSwipe();\n  }, [changePhoto, close, resetSwipe]);\n  const gesture = React.useMemo(() => {\n    const gestureApi = GestureHandler?.Gesture;\n    if (!gestureApi?.Pan || !gestureApi?.Pinch) return null;\n    const pan = gestureApi.Pan().runOnJS(true).minDistance(2).onStart(handlePanStart).onUpdate(handlePanUpdate).onEnd(handlePanEnd);\n    const pinch = gestureApi.Pinch().runOnJS(true).onStart(() => {\n      gestureState.pinching = true;\n      gestureState.pinchStartScale = gestureState.scale;\n    }).onUpdate(event => {\n      setScale(clamp(gestureState.pinchStartScale * event.scale, 1, MAX_SCALE));\n    }).onEnd(finishPinch);\n    return gestureApi.Simultaneous(pan, pinch);\n  }, [finishPinch, handlePanEnd, handlePanStart, handlePanUpdate, setScale]);\n  const webPinch = React.useRef({\n    distance: 0,\n    startScale: 1,\n    used: false\n  }).current;\n  const webResponder = React.useMemo(() => {\n    if (ReactNative.Platform.OS !== 'web') return null;\n    const getDistance = touches => {\n      const dx = touches[0].pageX - touches[1].pageX;\n      const dy = touches[0].pageY - touches[1].pageY;\n      return Math.sqrt(dx * dx + dy * dy);\n    };\n    return ReactNative.PanResponder.create({\n      onStartShouldSetPanResponder: () => true,\n      onMoveShouldSetPanResponder: () => true,\n      onPanResponderTerminationRequest: () => false,\n      onPanResponderGrant: event => {\n        handlePanStart();\n        const touches = event.nativeEvent.touches;\n        webPinch.distance = touches.length >= 2 ? getDistance(touches) : 0;\n        webPinch.startScale = gestureState.scale;\n        webPinch.used = touches.length >= 2;\n      },\n      onPanResponderMove: (event, state) => {\n        const touches = event.nativeEvent.touches;\n        if (touches.length >= 2) {\n          const distance = getDistance(touches);\n          if (!webPinch.distance) {\n            webPinch.distance = distance;\n            webPinch.startScale = gestureState.scale;\n          }\n          webPinch.used = true;\n          gestureState.pinching = true;\n          setScale(clamp(webPinch.startScale * distance / webPinch.distance, 1, MAX_SCALE));\n          return;\n        }\n        handlePanUpdate({\n          translationX: state.dx,\n          translationY: state.dy\n        });\n      },\n      onPanResponderRelease: (_, state) => {\n        if (webPinch.used) {\n          webPinch.distance = 0;\n          webPinch.used = false;\n          finishPinch();\n          gestureState.ignorePanEnd = false;\n          resetSwipe();\n          return;\n        }\n        handlePanEnd({\n          translationX: state.dx,\n          translationY: state.dy,\n          velocityX: state.vx,\n          velocityY: state.vy\n        });\n      },\n      onPanResponderTerminate: resetSwipe\n    });\n  }, [finishPinch, handlePanEnd, handlePanStart, handlePanUpdate, resetSwipe, setScale]);\n  const handleWheel = React.useCallback(event => {\n    const nativeEvent = event?.nativeEvent ?? event;\n    if (!nativeEvent?.ctrlKey) return;\n    nativeEvent.preventDefault?.();\n    const nextScale = clamp(gestureState.scale - nativeEvent.deltaY * 0.01, 1, MAX_SCALE);\n    setScale(nextScale);\n    if (nextScale <= 1.01) resetZoom(true);\n  }, [resetZoom, setScale]);\n  const handleRemove = React.useCallback(_async(function () {\n    if (!onRemove || pendingAction) return;\n    setPendingAction('remove');\n    return _continueIgnored(_catch(function () {\n      return _await(onRemove(currentIndex), function () {\n        modal.close({\n          index: currentIndex,\n          action: 'remove'\n        });\n      });\n    }, function (error) {\n      console.error('PhotoViewer remove failed', error);\n      setPendingAction(null);\n    }));\n  }), [currentIndex, modal, onRemove, pendingAction]);\n  const handleSetAvatar = React.useCallback(_async(function () {\n    if (!onSetAvatar || pendingAction) return;\n    setPendingAction('set-avatar');\n    return _continueIgnored(_catch(function () {\n      return _await(onSetAvatar(currentIndex), function () {\n        modal.close({\n          index: currentIndex,\n          action: 'set-avatar'\n        });\n      });\n    }, function (error) {\n      console.error('PhotoViewer set avatar failed', error);\n      setPendingAction(null);\n    }));\n  }), [currentIndex, modal, onSetAvatar, pendingAction]);\n  const styles = React.useMemo(() => ({\n    root: {\n      position: ReactNative.Platform.OS === 'web' ? 'fixed' : 'absolute',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      backgroundColor: '#04060F',\n      overflow: 'hidden',\n      zIndex: 10000,\n      elevation: 10000\n    },\n    imageArea: {\n      position: 'absolute',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      alignItems: 'center',\n      justifyContent: 'center',\n      ...(ReactNative.Platform.OS === 'web' ? {\n        touchAction: 'none',\n        userSelect: 'none'\n      } : {})\n    },\n    imagePage: {\n      position: 'absolute',\n      width: '100%',\n      height: '100%',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    image: {\n      width: '100%',\n      height: '100%'\n    },\n    controls: {\n      position: 'absolute',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0\n    },\n    topBar: {\n      position: 'absolute',\n      top: 0,\n      right: 0,\n      left: 0,\n      height: safeArea.top + 48,\n      paddingTop: safeArea.top,\n      paddingHorizontal: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      backgroundColor: '#04060F'\n    },\n    iconButton: {\n      width: 40,\n      height: 48,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    counter: {\n      color: '#FAFBFB',\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      letterSpacing: -0.3\n    },\n    avatarBadge: {\n      position: 'absolute',\n      top: safeArea.top + 60,\n      left: 12,\n      height: 32,\n      paddingHorizontal: 10,\n      borderRadius: 999,\n      backgroundColor: 'rgba(255,255,255,0.16)',\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 6\n    },\n    avatarBadgeText: {\n      color: '#FAFBFB',\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 600\n    },\n    bottomAction: {\n      position: 'absolute',\n      right: 0,\n      bottom: safeArea.bottom + 24,\n      left: 0,\n      alignItems: 'center'\n    },\n    setAvatarButton: {\n      height: 40,\n      paddingHorizontal: 16,\n      borderRadius: 999,\n      backgroundColor: '#FAFBFB',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    setAvatarText: {\n      color: '#04060F',\n      fontFamily: theme.theme.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 700\n    },\n    disabled: {\n      opacity: 0.6\n    }\n  }), [safeArea.bottom, safeArea.top, theme]);\n  if (!images.length) return null;\n  const pages = /*#__PURE__*/React.createElement(ReactNative.View, _extends({\n    collapsable: false,\n    style: styles.imageArea\n  }, webResponder?.panHandlers ?? {}, ReactNative.Platform.OS === 'web' ? {\n    onWheel: handleWheel\n  } : {}), images.map((image, photoIndex) => {\n    const isCurrent = photoIndex === currentIndex;\n    const pageX = Animated.add(translateX, (photoIndex - initialIndex) * width);\n    return /*#__PURE__*/React.createElement(Animated.View, {\n      key: photoIndex,\n      pointerEvents: \"none\",\n      style: [styles.imagePage, {\n        zIndex: isCurrent ? 1 : 0\n      }, {\n        transform: [{\n          translateX: isCurrent ? Animated.add(pageX, offsetX) : pageX\n        }, {\n          translateY: isCurrent ? Animated.add(translateY, offsetY) : 0\n        }, {\n          scale: isCurrent ? scale : 1\n        }]\n      }]\n    }, /*#__PURE__*/React.createElement(Image, _extends({\n      cachePolicy: \"memory-disk\",\n      contentFit: \"contain\"\n    }, image, {\n      style: [styles.image, image.style ?? {}]\n    })));\n  }));\n  return /*#__PURE__*/React.createElement(Animated.View, {\n    style: [styles.root, {\n      opacity: backdropOpacity\n    }]\n  }, ReactNative.Platform.OS !== 'web' && gesture && GestureHandler?.GestureDetector ? /*#__PURE__*/React.createElement(GestureHandler.GestureDetector, {\n    gesture: gesture\n  }, pages) : pages, /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: styles.controls\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topBar\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    accessibilityRole: \"button\",\n    accessibilityLabel: backLabel ?? 'Back',\n    hitSlop: 12,\n    onPress: () => close(),\n    style: styles.iconButton\n  }, /*#__PURE__*/React.createElement(BackIcon, null)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.counter\n  }, currentIndex + 1, \" / \", images.length), onRemove ? /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    accessibilityRole: \"button\",\n    accessibilityLabel: deleteLabel ?? 'Delete photo',\n    hitSlop: 12,\n    disabled: pendingAction != null,\n    onPress: handleRemove,\n    style: [styles.iconButton, pendingAction ? styles.disabled : null]\n  }, pendingAction === 'remove' ? /*#__PURE__*/React.createElement(ReactNative.ActivityIndicator, {\n    color: \"#FAFBFB\"\n  }) : /*#__PURE__*/React.createElement(TrashIcon, null)) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.iconButton\n  })), avatarIndex === currentIndex && !!avatarBadgeLabel && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarBadge\n  }, /*#__PURE__*/React.createElement(SmileIcon, {\n    color: \"#FAFBFB\"\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.avatarBadgeText\n  }, avatarBadgeLabel)), !!onSetAvatar && avatarIndex !== currentIndex && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomAction\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    accessibilityRole: \"button\",\n    disabled: pendingAction != null,\n    onPress: handleSetAvatar,\n    style: [styles.setAvatarButton, pendingAction ? styles.disabled : null]\n  }, pendingAction === 'set-avatar' ? /*#__PURE__*/React.createElement(ReactNative.ActivityIndicator, {\n    color: \"#04060F\"\n  }) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SmileIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.setAvatarText\n  }, setAvatarLabel ?? 'Set as avatar'))))));\n};"},"ChatsMain":{"name":"ChatsMain","key":"d4e77bc72d0d12e2f83f0138ab5ce4c8a5c8478791e613292a588e3e27a331c1","code":"deps: UserAppbar, ChatSearchBar, ChatTabs, ChatList, UnableToPinModal, ChatReportConfirmModal, ConfirmActionModal\nfunction _empty() {} /** Иконка «Смотреть ленту» для кнопки пустого состояния */\n\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction ChatsSkeleton({\n  rows = 7\n}) {\n  const items = Array.from({\n    length: rows\n  });\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1\n    }\n  }, items.map((_, i) => /*#__PURE__*/React.createElement(ReactNative.View, {\n    // eslint-disable-next-line react/no-array-index-key\n    key: i,\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      minHeight: 68\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n    width: 52,\n    height: 52,\n    borderRadius: 26\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      marginLeft: 10,\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n    width: 160,\n    height: 14,\n    borderRadius: 7\n  }), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n    width: 110,\n    height: 10,\n    borderRadius: 5\n  }), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n    width: 180,\n    height: 10,\n    borderRadius: 5\n  })))));\n}\nconst FeedExploreIcon = ({\n  color,\n  size = 16\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.7037 1.34618C12.3319 1.1997 12.9722 1.23459 13.7056 1.36571C14.4299 1.49522 15.3116 1.73205 16.4263 2.03075C17.5412 2.32948 18.4237 2.56495 19.1158 2.81493C19.8167 3.06813 20.3881 3.35828 20.859 3.7993C21.5446 4.44145 22.0245 5.27218 22.2379 6.187C22.3843 6.8152 22.3495 7.45545 22.2183 8.18895C22.0888 8.91321 21.852 9.79502 21.5533 10.9097L21.0357 12.8423C20.7371 13.9568 20.5015 14.8388 20.2515 15.5307C19.9984 16.2313 19.708 16.8032 19.2672 17.2739C18.6451 17.9379 17.8454 18.4067 16.9644 18.6294C16.7071 19.2195 16.3332 19.7555 15.859 20.1997C15.3882 20.6404 14.8164 20.931 14.1158 21.1841C13.4238 21.434 12.541 21.6696 11.4263 21.9682C10.3117 22.2669 9.42984 22.5038 8.70563 22.6333C7.97226 22.7644 7.33181 22.7993 6.70368 22.6528C5.78904 22.4394 4.95804 21.9594 4.31598 21.2739C3.87501 20.8031 3.58479 20.2316 3.33161 19.5307C3.0816 18.8387 2.84617 17.9562 2.54743 16.8413L2.02985 14.9097C1.73116 13.7949 1.49438 12.9132 1.36481 12.189C1.23366 11.4555 1.19893 10.8151 1.34528 10.187C1.55856 9.2723 2.03877 8.44047 2.72419 7.79833C3.19487 7.35762 3.76687 7.06801 4.46735 6.81493C5.15926 6.56499 6.04132 6.32938 7.15583 6.03075C7.42014 5.95993 7.67154 5.89357 7.90876 5.83055C8.30038 4.43136 8.64457 3.44229 9.31598 2.72508C9.95798 2.03963 10.7891 1.55961 11.7037 1.34618ZM7.45368 7.5034C6.36187 7.79602 5.57862 8.00783 4.97712 8.22508C4.36838 8.44503 4.00986 8.64942 3.74958 8.89305C3.28069 9.3324 2.95115 9.90204 2.80524 10.5278C2.72446 10.875 2.72747 11.2872 2.84137 11.9243C2.95709 12.5713 3.17366 13.3822 3.47907 14.522L3.99665 16.4536C4.30202 17.5933 4.51946 18.4029 4.74274 19.021C4.96285 19.6302 5.16686 19.9882 5.41071 20.2485C5.85 20.7175 6.4187 21.0459 7.0445 21.1919C7.39186 21.2729 7.80442 21.2707 8.44196 21.1567C9.08886 21.041 9.89909 20.8244 11.0386 20.519C12.1781 20.2137 12.9879 19.9962 13.606 19.7729C14.2149 19.553 14.5732 19.3486 14.8336 19.105C14.9711 18.9761 15.0952 18.8343 15.2076 18.685C15.0291 18.6598 14.8448 18.6291 14.6549 18.5913C13.9778 18.4566 13.1626 18.238 12.1558 17.9682C11.0412 17.6696 10.1593 17.434 9.46735 17.1841C8.76657 16.9309 8.195 16.6406 7.72419 16.1997C7.03867 15.5576 6.55868 14.7267 6.34528 13.812C6.19881 13.1838 6.23371 12.5435 6.36481 11.81C6.49432 11.0858 6.73118 10.204 7.02985 9.08934L7.45368 7.5034ZM13.442 2.84227C12.8044 2.72829 12.3919 2.72515 12.0445 2.80614C11.4187 2.95217 10.85 3.28147 10.4107 3.75047C9.97494 4.21612 9.70535 4.93608 9.23883 6.64403C9.16305 6.9215 9.08355 7.22107 8.99665 7.5454L8.47907 9.47704C8.17374 10.6165 7.95708 11.4268 7.84137 12.0737C7.72742 12.7112 7.72427 13.1238 7.80524 13.4712C7.95124 14.097 8.28053 14.6656 8.74958 15.105C9.00993 15.3488 9.36794 15.5529 9.97712 15.7729C10.5952 15.9962 11.4048 16.2137 12.5445 16.519C13.5697 16.7937 14.3299 16.9977 14.9478 17.1206C15.5627 17.2429 15.9807 17.2731 16.3228 17.2309C16.3971 17.2218 16.4691 17.209 16.5386 17.1929C17.1644 17.0469 17.7331 16.7174 18.1724 16.2485C18.4162 15.9882 18.6204 15.6299 18.8404 15.021C19.0636 14.4029 19.2812 13.5931 19.5865 12.4536L20.1041 10.522C20.4094 9.38247 20.626 8.57219 20.7418 7.92528C20.8558 7.28764 20.8579 6.87521 20.7769 6.52782C20.6309 5.90185 20.3027 5.33342 19.8336 4.89403C19.5732 4.65015 19.2154 4.4462 18.606 4.22606C17.9879 4.0028 17.1783 3.78534 16.0386 3.47997C14.899 3.1746 14.0889 2.95798 13.442 2.84227Z\",\n  fill: color\n}));\nconst SearchItem = ({\n  chat,\n  onPress\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const swipeableRef = React.useRef(null);\n  const userId = chat?.userId ?? null;\n  const userRaw = State.api?.users?.useUser?.(userId);\n  const user = State.api?.users?.sanitizeMeta?.(userRaw) ?? userRaw;\n  const [isOnline] = State.api?.online?.useOnline?.(userId) ?? [];\n  const photo = user?.photos?.[0] ?? chat?.photo;\n  const isPro = user?.subscription?.hasSubscription;\n  const styles = React.useMemo(() => ({\n    searchResultTile: {\n      width: 52,\n      alignItems: 'center',\n      gap: 4\n    },\n    searchResultAvatarWrap: {\n      position: 'relative',\n      width: 52,\n      height: 52\n    },\n    searchResultOnlineIndicator: {\n      position: 'absolute',\n      width: 10,\n      height: 10,\n      right: 3,\n      bottom: 3,\n      backgroundColor: '#24BC75',\n      borderRadius: 999,\n      zIndex: 1\n    },\n    searchResultName: {\n      width: 52,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      textAlign: 'center',\n      letterSpacing: -0.2,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F',\n      fontFamily: theme.theme.typography?.family?.paragraph\n    }\n  }), [theme]);\n  const onOpen = React.useCallback(() => onPress?.(chat, user), [chat, user]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.searchResultTile,\n    onPress: onOpen\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.searchResultAvatarWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: photo,\n    size: 52,\n    onPress: onOpen,\n    isPro: isPro\n  }), isOnline ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\",\n    style: styles.searchResultOnlineIndicator\n  }) : null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.searchResultName,\n    numberOfLines: 1\n  }, user?.user?.username || chat.title || t('profilePlaceholderUser') || 'User'));\n};\nreturn () => {\n  State.useRequireSocketNavigation();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const {\n    width: windowWidth\n  } = ReactNative.useWindowDimensions();\n  const enableWebUI = State.api.ff.useFF('enableWebUI');\n  const [activeTab, setActiveTab] = React.useState('all');\n  const {\n    chats,\n    isLoading\n  } = State.api?.chat?.useChats?.();\n  const [isRefreshing, setIsRefreshing] = React.useState(false);\n  const [isLoadingMore, setIsLoadingMore] = React.useState(false);\n  const [showUnableToPin, setShowUnableToPin] = React.useState(false);\n  const unableToPinTimerRef = React.useRef(null);\n  const [searchQuery, setSearchQuery] = Hooks.useBehaviorSubject(State.store.chatsSearchQuery);\n  const [selectedChatId, setSelectedChatId] = Hooks.useBehaviorSubject(State.store.chat_chatId);\n  const [selectedUserId, setSelectedUserId] = Hooks.useBehaviorSubject(State.store.user_userId);\n  const searchQueryTrimmed = (searchQuery || '').trim();\n  const isSearchActive = searchQueryTrimmed.length > 0;\n  const [searchLoading] = Hooks.useBehaviorSubject(State.store.chatsSearchLoading);\n  const [chatsSearch] = Hooks.useBehaviorSubject(State.store.chatsSearch);\n  const searchResults = chatsSearch ?? [];\n  const profileRequestLockRef = React.useRef(false);\n  const profileRequestTsRef = React.useRef(0);\n\n  // Табы с переводами\n  const tabs = React.useMemo(() => [{\n    id: 'all',\n    label: t('chatsTabAll')\n  }, {\n    id: 'requests',\n    label: t('chatsTabRequests')\n  }, {\n    id: 'followers',\n    label: t('chatsTabFollowers')\n  }, {\n    id: 'unread',\n    label: t('chatsTabUnread')\n  }], [t]);\n\n  // Pull-to-refresh\n  const handleRefresh = React.useCallback(_async(function () {\n    setIsRefreshing(true);\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        return _awaitIgnored(State.api?.chat?.loadChats?.());\n      }, _empty);\n    }, function (_wasThrown, _result) {\n      setIsRefreshing(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [activeTab]);\n\n  // Infinite scroll (пока заглушка)\n  const handleLoadMore = React.useCallback(() => {\n    if (isLoadingMore) return;\n    // TODO: Implement pagination when API is ready\n  }, [isLoadingMore]);\n\n  // Обработчики действий с чатами\n  const handleChatPress = React.useCallback((chat, user) => {\n    State.api.chat.set(null, chat?.id);\n    // Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('Chat', {\n    //     chatId: ,\n    // }));\n  }, []);\n  const handleSplitChatBack = React.useCallback(() => {\n    setSelectedChatId(null);\n    setSelectedUserId(null);\n  }, [setSelectedChatId, setSelectedUserId]);\n  const showUnableToPinToast = React.useCallback(() => {\n    setShowUnableToPin(true);\n    if (unableToPinTimerRef.current) {\n      clearTimeout(unableToPinTimerRef.current);\n    }\n    unableToPinTimerRef.current = setTimeout(() => {\n      setShowUnableToPin(false);\n      unableToPinTimerRef.current = null;\n    }, 2600);\n  }, []);\n  React.useEffect(() => {\n    return () => {\n      if (unableToPinTimerRef.current) {\n        clearTimeout(unableToPinTimerRef.current);\n        unableToPinTimerRef.current = null;\n      }\n    };\n  }, []);\n  const handlePin = React.useCallback(_async(function (chat) {\n    const chatId = chat.id;\n    return _await(State.api?.chat?.pinChat?.(chatId), function (result) {\n      if (result) {\n        State.bus.scrollChatsToTop.next(true);\n      } else {\n        showUnableToPinToast();\n      }\n    });\n  }), [showUnableToPinToast]);\n  const handleMute = React.useCallback(_async(function (chat) {\n    const chatId = chat.id;\n    return _awaitIgnored(State.api?.chat?.muteChat?.(chatId));\n  }), []);\n  const handleDelete = React.useCallback(_async(function (chat, user) {\n    const chatId = chat.id;\n    return _catch(function () {\n      return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"ConfirmActionModal\",\n        variant: \"deleteChat\",\n        chatId: chatId,\n        meta: user\n      }), {\n        theme: Theme?.isDark?.value ? 'dark' : 'light',\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      }), function (confirmed) {\n        if (confirmed !== true) return;\n        const undoPromise = Sheet.showToastSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n          name: \"ConfirmActionModal\",\n          variant: \"doubleCheck\",\n          timeout: 5000,\n          meta: user\n        }), {\n          theme: Theme?.isDark?.value ? 'dark' : 'light',\n          props: {\n            style: {\n              maxWidth: 600\n            }\n          }\n        });\n        return _await(State.api?.chat?.deleteChat?.(chatId), function ([promise, cancel]) {\n          return _await(undoPromise, function (undo) {\n            return _invokeIgnored(function () {\n              if (undo === true) {\n                return _await(promise, function () {\n                  return _awaitIgnored(cancel?.(chatId));\n                });\n              }\n            });\n          });\n        });\n      });\n    }, function (error) {\n      console.error(error);\n    });\n  }), [theme?.isDark]);\n  const handleProfile = React.useCallback(_async(function (chat, user) {\n    if (!user) return;\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: user,\n      source: \"chat_list\"\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n    return _await();\n  }), []);\n  const handleReport = React.useCallback(_async(function (chat, user) {\n    if (user == null) return;\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"report\",\n      meta: user,\n      source: \"chat_longpress\",\n      chatId: chat?.id\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    });\n    return _await();\n  }), [theme?.isDark]);\n  const hasChatsForTab = React.useMemo(() => {\n    if (chats.length === 0) return false;\n    switch (activeTab) {\n      case 'requests':\n        return chats.some(c => c.isRequest);\n      case 'followers':\n        return chats.some(c => c.isFollower);\n      case 'unread':\n        return chats.some(c => !c.isLastMessageRead);\n      default:\n        return true;\n    }\n  }, [chats, activeTab]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: '100%',\n      overflow: 'visible',\n      maxHeight: '100%'\n    },\n    containerWeb: {\n      flex: 1,\n      width: '100%',\n      overflow: 'visible',\n      maxHeight: '100%'\n    },\n    splitRoot: {\n      flex: 1,\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'stretch',\n      justifyContent: 'flex-start'\n    },\n    splitLeft: {\n      width: 360,\n      minWidth: 320,\n      maxWidth: 420,\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'flex-start',\n      backgroundColor: theme.theme.semantic.surface.regular.surface1\n    },\n    splitTopBar: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      overflow: 'visible',\n      zIndex: 2\n    },\n    splitTopBarContent: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center',\n      paddingVertical: 12,\n      paddingHorizontal: 12\n    },\n    splitRight: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'column',\n      alignItems: 'stretch',\n      justifyContent: 'flex-start',\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    },\n    splitRightPlaceholder: {\n      flex: 1,\n      minHeight: 0,\n      alignItems: 'center',\n      justifyContent: 'center',\n      padding: 24,\n      gap: 12\n    },\n    splitRightPlaceholderIcon: {\n      width: 68,\n      height: 68\n    },\n    splitRightPlaceholderTitle: {\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'center',\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading\n    },\n    contentWrap: {\n      flex: 1,\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center'\n    },\n    padding: {\n      paddingVertical: 12,\n      paddingHorizontal: 12\n    },\n    searchSection: {\n      paddingTop: 8,\n      paddingBottom: 8\n    },\n    searchContainer: {\n      paddingHorizontal: 16\n    },\n    content: {\n      flex: 1\n    },\n    // Блок результатов поиска: сразу под строкой поиска, отступ 20px\n    searchResultsBlock: {\n      minHeight: 74\n    },\n    emptyContainer: {\n      flex: 1,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    empty: {\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      gap: 12,\n      width: '100%'\n    },\n    emptyIcon: {\n      width: 68,\n      height: 68\n    },\n    emptyTextContainer: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      padding: 0,\n      gap: 8,\n      width: '100%'\n    },\n    emptyTitle: {\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'center',\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading\n    },\n    emptySubtitle: {\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      textAlign: 'center',\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.secondary, 0.5),\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    emptyExploreButton: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      gap: 6,\n      height: 40,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B',\n      borderRadius: 12\n    },\n    emptyExploreButtonText: {\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.14,\n      color: theme.theme.component?.button?.brand?.content ?? '#FFFFFF',\n      fontFamily: theme.theme.typography?.family?.heading ?? 'Geologica'\n    },\n    // Результаты поиска (горизонтальная строка по макету Figma)\n    searchResultsRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 12,\n      gap: 12\n    },\n    searchResultsEmptyText: {\n      marginTop: 24,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      textAlign: 'center',\n      color: theme.theme.semantic?.content?.regular?.secondary ?? '#6B7280',\n      fontFamily: theme.theme.typography?.family?.paragraph\n    }\n  }), [theme]);\n  const isWeb = ReactNative.Platform.OS === 'web';\n  const isSplit = enableWebUI && isWeb && windowWidth >= 960;\n  const hasAnyChats = (chats?.length ?? 0) > 0;\n  const hasSelectedChatTarget = Boolean(selectedChatId || selectedUserId);\n  const showChatsEmptyState = !isLoading && !hasAnyChats;\n  const showSplitEmptyState = isWeb && isSplit && showChatsEmptyState && !hasSelectedChatTarget;\n  const emptyState = /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.emptyContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.empty\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.emptyIcon,\n    source: Assets.banana\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.emptyTextContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t('chatsEmptyTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptySubtitle\n  }, t('chatsEmptySubtitle'))), /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.emptyExploreButton,\n    onPress: () => Navigation.goto({\n      name: 'Feed'\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyExploreButtonText\n  }, t('chatsEmptyExploreFeed')), /*#__PURE__*/React.createElement(FeedExploreIcon, {\n    color: theme.theme.component?.button?.brand?.content ?? '#FFFFFF',\n    size: 16\n  }))));\n  const leftPane = /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrap\n  }, !isSplit && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.padding\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserAppbar\"\n  })), !showChatsEmptyState && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.searchSection,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.searchContainer,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatSearchBar\",\n    value: searchQuery || '',\n    onChangeText: setSearchQuery\n  })), isSearchActive && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.searchResultsBlock,\n    pointerEvents: \"box-none\"\n  }, searchLoading ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      marginTop: 8\n    }\n  }, /*#__PURE__*/React.createElement(ChatsSkeleton, {\n    rows: 7\n  })) : searchResults.length === 0 ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.searchResultsEmptyText\n  }, t('chatsSearchEmpty')) : /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n    horizontal: true,\n    showsHorizontalScrollIndicator: false,\n    contentContainerStyle: styles.searchResultsRow\n  }, searchResults.map(chat => /*#__PURE__*/React.createElement(SearchItem, {\n    key: chat.id,\n    chat: chat,\n    onPress: handleChatPress\n  }))))), !showChatsEmptyState && isSearchActive ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, !chats?.length && !isLoading ? emptyState : !chats?.length && isLoading ? /*#__PURE__*/React.createElement(ChatsSkeleton, {\n    rows: 7\n  }) : /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatList\",\n    chats: chats,\n    activeTab: activeTab,\n    selectedChatId: selectedChatId,\n    highlightSelected: isSplit,\n    useSurface1Background: isSplit,\n    horizontalPadding: isSplit ? 12 : 0,\n    isRefreshing: isRefreshing,\n    isLoadingMore: isLoadingMore,\n    onRefresh: handleRefresh,\n    onLoadMore: handleLoadMore,\n    onChatPress: handleChatPress,\n    onPin: handlePin,\n    onMute: handleMute,\n    onDelete: handleDelete,\n    onProfile: handleProfile,\n    onReport: handleReport\n  }))));\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: isWeb ? styles.containerWeb : styles.container\n  }, isSplit ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.splitRoot\n  }, showSplitEmptyState ? null : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.splitLeft\n  }, leftPane), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.splitRight\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.splitTopBar\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.splitTopBarContent\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserAppbar\",\n    backgroundColor: theme.theme.semantic.surface.regular.surface1\n  }))), showSplitEmptyState ? emptyState : selectedChatId || selectedUserId ? /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatRoom\",\n    onBack: handleSplitChatBack,\n    chatId: selectedChatId,\n    userId: selectedUserId,\n    source: \"chat_list\"\n  }) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.splitRightPlaceholder\n  }, /*#__PURE__*/React.createElement(Image, {\n    style: styles.splitRightPlaceholderIcon,\n    source: State.getUrl('/api/component/assets/chats-split-placeholder.webp')\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.splitRightPlaceholderTitle\n  }, t('chatsSplitPlaceholderTitle') || 'Choose a chat\\nto start messaging')))) : leftPane, showUnableToPin ? /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UnableToPinModal\",\n    title: t('chatsUnableToPinLimit')\n  }) : null);\n};"},"ChatRoom":{"name":"ChatRoom","key":"e51520837482d068c8129a2f55473dea627cc9786f51edd3e734137598bca3b5","code":"deps: ChatAppbar, ChatMessage, SayHello, ChatRoomDock, ChatRoomOverlays, ChatAttachmentsLockedToast, ChatAttachmentsFilesLimitToast, ChatReportConfirmModal, ConfirmActionModal, NeedBalanceModal, GiftsCatalogSheet, GiftsConfirmationSheet, WithAppearFocused\nfunction _empty() {}\nconst showFirstPaidMessageConfirmSheet = function (user) {\n  return _call(closeKeyboard, function () {\n    const paidPrice = State?.state?.session?.value?.settings?.firstMessagePrice ?? 75;\n    State.anals.next({\n      name: 'popup_shown',\n      data: {\n        popup_type: 'paywall_first_msg',\n        popup_action: 'shown'\n      }\n    });\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"ConfirmActionModal\",\n      variant: \"firstMessage\",\n      paidPrice: paidPrice,\n      timeout: 30000,\n      meta: user\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    }), function (result) {\n      State.anals.next({\n        name: 'popup_shown',\n        data: {\n          popup_type: 'paywall_first_msg',\n          popup_action: result === true ? 'action' : 'closed'\n        }\n      });\n      return result === true;\n    });\n  });\n};\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\n// const FlatList = ReactNative.Platform.OS === 'web' ? ReactNative.FlatList : FlashList.FlashList;\nconst FlatList = ReactNative.FlatList;\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\nfunction openChatInsufficientBalanceModal() {\n  State.anals.next({\n    name: 'popup_shown',\n    data: {\n      popup_type: 'paywall_first_msg',\n      popup_action: 'shown'\n    }\n  });\n  Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"NeedBalanceModal\",\n    variant: \"startChat\"\n  }), {\n    theme: Theme?.isDark?.value ? 'dark' : 'light',\n    props: {\n      holderMode: true,\n      style: {\n        maxWidth: 600\n      }\n    }\n  });\n}\nconst closeKeyboard = _async(function () {\n  return _continueIgnored(_catch(function () {\n    return _await(ReactNative?.Keyboard?.dismiss?.(), function () {\n      return _awaitIgnored(new Promise(r => setTimeout(r, 60)));\n    });\n  }, _empty));\n});\nconst formatDateSeparatorLabel = (timestamp, е, locale) => {\n  const date = new Date(timestamp);\n  if (Number.isNaN(date.getTime())) return '';\n  const now = new Date();\n  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n  const yesterday = new Date(today);\n  yesterday.setDate(yesterday.getDate() - 1);\n  const eventDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n  if (eventDate.getTime() === today.getTime()) {\n    return е('chatDateToday');\n  }\n  if (eventDate.getTime() === yesterday.getTime()) {\n    return е('chatDateYesterday');\n  }\n  const isCurrentYear = date.getFullYear() === now.getFullYear();\n  const formatter = new Intl.DateTimeFormat(locale || undefined, isCurrentYear ? {\n    day: 'numeric',\n    month: 'long'\n  } : {\n    day: 'numeric',\n    month: 'long',\n    year: 'numeric'\n  });\n  return formatter.format(date);\n};\nreturn ({\n  onBack,\n  chatId: chatIdProps,\n  userId: userIdProps,\n  source\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const currentUserId = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.user?.id, []));\n  const firstMessagePrice = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.settings?.firstMessagePrice ?? 0, []));\n  const chat = State.api?.chatRoom?.useChat?.(chatIdProps, userIdProps ?? null, source);\n  const userId = chat?.userId ?? userIdProps ?? null;\n  const enableGifts = State.api.ff.useFF('enableGifts');\n  const user = State.api?.users?.useUser?.(userId);\n  const [isSubscribed, setIsSubscribed] = State.api?.sub?.useSubscription(userId) ?? [];\n  const [isOnline] = State.api?.online?.useOnline?.(userId) ?? [];\n  const chatId = chatIdProps ?? chat.id ?? chat.chatId ?? null;\n  const canSendGift = enableGifts && userId != null && String(userId) !== String(currentUserId ?? '');\n  const shouldShowSayHello = !chatId && !!userId;\n  const newMessagesCount = chat?.newMessagesCount ?? 0; // TODO: replace with unread count\n\n  const [replyToMessage, setReplyToMessage] = React.useState(null);\n  const messageKey = chatId ?? userId;\n  const messageText = State.api?.chatMessage?.useChatMessage?.(messageKey) ?? '';\n  const attachments = State.api?.chatMessage?.useChatAttachments?.(messageKey) ?? [];\n  const listRef = React.useRef(null);\n  const markedReadIdsRef = React.useRef(new Set());\n  const currentUserIdRef = React.useRef(currentUserId);\n  const chatIdRef = React.useRef(chatId);\n  const [isAtBottomState, setIsAtBottomState] = React.useState(true);\n  const [scrollState, setScrollState] = React.useState({\n    scrollDirection: null,\n    distanceToBottom: 0,\n    layoutHeight: 400\n  });\n  const {\n    height: screenHeight\n  } = ReactNative.useWindowDimensions();\n  const halfScreenScrollThreshold = (screenHeight || 0) / 2;\n  const showScrollToBottom = !isAtBottomState && scrollState.distanceToBottom > halfScreenScrollThreshold;\n  const scrollToBottom = React.useCallback(() => {\n    listRef.current?.scrollToOffset?.({\n      offset: 0,\n      animated: true\n    });\n  }, []);\n  React.useEffect(() => {\n    State.api?.chatRoom?.loadMessages?.(chatId);\n  }, [chatId]);\n  React.useEffect(() => {\n    currentUserIdRef.current = currentUserId;\n  }, [currentUserId]);\n  React.useEffect(() => {\n    chatIdRef.current = chatId;\n    markedReadIdsRef.current.clear();\n  }, [chatId]);\n  const viewabilityConfig = React.useRef({\n    itemVisiblePercentThreshold: 50,\n    minimumViewTime: 80\n  }).current;\n  const handleViewableItemsChanged = React.useRef(({\n    viewableItems\n  }) => {\n    const activeChatId = chatIdRef.current;\n    const activeUserId = currentUserIdRef.current;\n    if (activeChatId == null || activeUserId == null) return;\n    for (const token of viewableItems ?? []) {\n      const item = token?.item;\n      if (!token?.isViewable || item?.type !== 'message' || item?.isRead || item?.id == null) continue;\n      const fromUserId = item.userId ?? item.fromUserId;\n      if (fromUserId == null || String(fromUserId) === String(activeUserId)) continue;\n      const markerKey = `${activeChatId}:${item.id}`;\n      if (markedReadIdsRef.current.has(markerKey)) continue;\n      markedReadIdsRef.current.add(markerKey);\n      State.api?.unread?.mark?.(activeChatId, item.id);\n    }\n  }).current;\n  React.useEffect(() => {\n    const sub = State.state.isConnected.pipe(Rx.filter(Boolean), Rx.distinctUntilChanged()).subscribe(() => {\n      State.api?.chatRoom?.loadMessages?.(chatId, 'update'); // TODO: update only first on reconnect\n    });\n    return () => {\n      sub.unsubscribe();\n    };\n  }, [chatId]);\n\n  // Мультивыбор сообщений: long press по сообщению включает режим, tap переключает выбор\n  const [selectionMode, setSelectionMode] = React.useState(false);\n  const [selectedIds, setSelectedIds] = React.useState(() => new Set());\n  const handleEnterSelectionMode = React.useCallback(() => setSelectionMode(true), []);\n  const handleExitSelectionMode = React.useCallback(() => {\n    setSelectionMode(false);\n    setSelectedIds(new Set());\n  }, []);\n  const handleBack = React.useCallback(() => {\n    if (selectionMode) {\n      handleExitSelectionMode();\n      return;\n    }\n    onBack?.();\n  }, [selectionMode, handleExitSelectionMode, onBack]);\n  React.useEffect(() => {\n    if (chatId && chat?.isDeleted) {\n      handleBack();\n    }\n  }, [chatId, chat?.isDeleted, handleBack]);\n  const handleLoadMore = React.useCallback(_async(function () {\n    State.api?.chatRoom?.loadMessages?.(chatId, 'more');\n    return _await();\n  }), [chatId]);\n  const handleCall = React.useCallback(() => {}, [chatId]);\n  const handleToggleSubscription = React.useCallback(_async(function () {\n    if (isSubscribed) setIsSubscribed(false);else setIsSubscribed(false);\n    return _await();\n  }), [isSubscribed, setIsSubscribed]);\n  const handleMute = React.useCallback(() => {\n    // }, [chatId, user.isMuted]);\n  }, [chatId]);\n  const handleOpenPeerProfile = React.useCallback(_async(function () {\n    if (!user) return;\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: user,\n      source: \"chat_list\"\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n    return _await();\n  }), [user]);\n  const handleReport = React.useCallback(_async(function () {\n    if (!user) {\n      return;\n    }\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"ChatReportConfirmModal\"\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        style: {\n          maxWidth: 600\n        }\n      }\n    }), function (confirmed) {\n      if (confirmed !== true) return;\n      Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n        name: \"report\",\n        meta: user,\n        source: \"chat\",\n        chatId: chatId ?? undefined\n      }), {\n        theme: Theme?.isDark?.value ? 'dark' : 'light',\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      });\n    });\n  }), [chatId, user, theme?.isDark]);\n  const handleDelete = React.useCallback(_async(function () {\n    if (!chatId) return;\n    return _catch(function () {\n      return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"ConfirmActionModal\",\n        variant: \"deleteChat\",\n        chatId: chatId,\n        meta: user\n      }), {\n        theme: Theme?.isDark?.value ? 'dark' : 'light',\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      }), function (confirmed) {\n        if (confirmed !== true) return;\n        const undoPromise = Sheet.showToastSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n          name: \"ConfirmActionModal\",\n          variant: \"doubleCheck\",\n          timeout: 5000,\n          meta: user\n        }), {\n          theme: Theme?.isDark?.value ? 'dark' : 'light',\n          props: {\n            style: {\n              maxWidth: 600\n            }\n          }\n        });\n        return _await(State.api?.chat?.deleteChat?.(chatId), function ([promise, cancel]) {\n          handleBack();\n          return _await(undoPromise, function (undo) {\n            return _invokeIgnored(function () {\n              if (undo === true) {\n                return _await(promise, function () {\n                  return _awaitIgnored(cancel?.(chatId));\n                });\n              }\n            });\n          });\n        });\n      });\n    }, function (error) {\n      console.error(error);\n    });\n  }), [chatId, handleBack, user, theme]);\n  const handleGiftPress = React.useCallback(function () {\n    return canSendGift ? _call(closeKeyboard, function () {\n      State.api?.gifts?.startGiftFlow?.({\n        receiverId: userId,\n        entrySource: 'chat',\n        chatId: chatId ?? null\n      });\n      Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"GiftsCatalogSheet\"\n      }), {\n        theme: 'dark',\n        props: {\n          holderMode: true,\n          backdropColor: 'transparent',\n          sheetStyle: {\n            backgroundColor: 'transparent'\n          },\n          contentStyle: {\n            backgroundColor: 'transparent'\n          },\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden'\n          }\n        }\n      });\n    }) : _await();\n  }, [canSendGift, chatId, userId]);\n  const handleQuickGiftPress = React.useCallback(function (gift) {\n    return !canSendGift || !gift ? _await() : _call(closeKeyboard, function () {\n      State.api?.gifts?.startGiftFlow?.({\n        receiverId: userId,\n        entrySource: 'chat',\n        chatId: chatId ?? null\n      });\n      State.api?.gifts?.selectGift?.(gift);\n      Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"GiftsConfirmationSheet\",\n        gift: gift\n      }), {\n        theme: 'dark',\n        props: {\n          holderMode: true,\n          backdropColor: 'transparent',\n          sheetStyle: {\n            backgroundColor: 'transparent'\n          },\n          contentStyle: {\n            backgroundColor: 'transparent'\n          },\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden'\n          }\n        }\n      });\n    });\n  }, [canSendGift, chatId, userId]);\n  const messagesById = React.useMemo(() => {\n    const map = new Map();\n    const messages = chat?.messages ?? [];\n    for (let i = 0; i < messages.length; i++) {\n      const message = messages[i];\n      if (message?.id != null) {\n        map.set(message.id, message);\n        map.set(String(message.id), message);\n      }\n    }\n    return map;\n  }, [chat?.messages]);\n  const onScrollStateChange = React.useCallback(state => {\n    if (state && typeof state.scrollDirection !== 'undefined' && typeof state.distanceToBottom === 'number' && typeof state.layoutHeight === 'number') {\n      const next = {\n        scrollDirection: state.scrollDirection,\n        distanceToBottom: state.distanceToBottom,\n        layoutHeight: state.layoutHeight\n      };\n      setScrollState(next);\n    }\n  }, []);\n  const handleSendMessage = React.useCallback(_async(function (payload) {\n    return _await(State.api?.chatRoom?.sendMessage?.(payload, messageText, chatId, replyToMessage, user, function () {\n      return _await(showFirstPaidMessageConfirmSheet(user));\n    }, source), function (result) {\n      if (result === 'insufficientBalance') {\n        openChatInsufficientBalanceModal();\n      } else if (result === true) {\n        scrollToBottom();\n        State.api?.chatMessage?.cleanChatMessage?.(messageKey);\n        State.api?.chatMessage?.cleanChatAttacnments?.(messageKey);\n        setReplyToMessage(null);\n        return true;\n      }\n      return false;\n    });\n  }), [messageText, chatId, replyToMessage, user, scrollToBottom, messageKey, source]);\n  const handleChangeText = React.useCallback(text => {\n    State.api?.chatMessage?.setChatMessage?.(messageKey, text);\n  }, [messageKey]);\n  const handleAttachmentsChange = React.useCallback(attachments => {\n    State.api?.chatMessage?.setChatAttachments?.(messageKey, attachments);\n  }, [messageKey]);\n  const handleRetrySend = React.useCallback(_async(function (messageId) {\n    if (!messageId) return;\n    const message = messagesById.get(messageId) ?? messagesById.get(String(messageId));\n    const retryPayload = message?.retryPayload;\n    if (!retryPayload) return;\n    return _awaitIgnored(handleSendMessage({\n      existingMessageId: message.id,\n      text: retryPayload?.text ?? message?.text ?? '',\n      attachments: retryPayload?.attachments ?? [],\n      replyToMessageId: retryPayload?.replyToMessageId ?? undefined\n    }));\n  }), [handleSendMessage, messagesById]);\n  const handleSayHelloPress = React.useCallback(_async(function () {\n    return _awaitIgnored(handleSendMessage({\n      text: '👋'\n    }));\n  }), [handleSendMessage]);\n  const [showAttachmentsLockedToast, setShowAttachmentsLockedToast] = React.useState(false);\n  const hideAttachmentsLockedToastTimerRef = React.useRef(null);\n  const [showFilesLimitToast, setShowFilesLimitToast] = React.useState(false);\n  const hideFilesLimitToastTimerRef = React.useRef(null);\n  React.useEffect(() => {\n    return () => {\n      if (hideAttachmentsLockedToastTimerRef.current) {\n        clearTimeout(hideAttachmentsLockedToastTimerRef.current);\n      }\n      if (hideFilesLimitToastTimerRef.current) {\n        clearTimeout(hideFilesLimitToastTimerRef.current);\n      }\n    };\n  }, []);\n  const handleAttachment = React.useCallback(() => {\n    if (shouldShowSayHello) {\n      setShowAttachmentsLockedToast(true);\n      if (hideAttachmentsLockedToastTimerRef.current) {\n        clearTimeout(hideAttachmentsLockedToastTimerRef.current);\n      }\n      hideAttachmentsLockedToastTimerRef.current = setTimeout(() => setShowAttachmentsLockedToast(false), 2400);\n    }\n  }, [shouldShowSayHello]);\n  const handleFilesLimitExceeded = React.useCallback(() => {\n    setShowFilesLimitToast(true);\n    if (hideFilesLimitToastTimerRef.current) {\n      clearTimeout(hideFilesLimitToastTimerRef.current);\n    }\n    hideFilesLimitToastTimerRef.current = setTimeout(() => setShowFilesLimitToast(false), 2600);\n  }, []);\n  const handleToggleSelect = React.useCallback(id => {\n    setSelectedIds(prev => {\n      const next = new Set(prev);\n      if (next.has(id)) next.delete(id);else next.add(id);\n      return next;\n    });\n  }, []);\n\n  // Рефы для measureInWindow под контекстное меню\n  const bubbleRefsMap = React.useRef({});\n\n  // Контекстное меню при долгом тапе на сообщение (blur + lift баббла)\n  const [messageContext, setMessageContext] = React.useState({\n    visible: false,\n    messageId: null,\n    layout: null,\n    imageUri: null,\n    isOwner: undefined\n  });\n  const handleMessageContextOpen = React.useCallback((messageId, layout, imageUri, isOwner) => {\n    setMessageContext({\n      visible: true,\n      messageId,\n      layout,\n      imageUri,\n      isOwner\n    });\n  }, []);\n  const handleMessageContextClose = React.useCallback(() => {\n    setMessageContext(prev => ({\n      ...prev,\n      visible: false,\n      messageId: null,\n      layout: null,\n      imageUri: null,\n      isOwner: undefined\n    }));\n  }, []);\n  const handleMessageLongPress = React.useCallback((messageId, messageItem) => {\n    const isOwner = messageItem?.isOwner === true;\n    const ref = bubbleRefsMap.current?.[messageId];\n    if (typeof ref?.measureInWindow === 'function') {\n      ref.measureInWindow((x, y, w, h) => {\n        handleMessageContextOpen(messageId, {\n          x,\n          y,\n          width: w,\n          height: h\n        }, null, isOwner);\n      });\n    } else {\n      handleMessageContextOpen(messageId, null, null, isOwner);\n    }\n  }, [handleMessageContextOpen]);\n  const handleDeleteSelected = React.useCallback(_async(function () {\n    if (!chatId || !selectedIds?.size) return;\n    const ids = Array.from(selectedIds);\n    setSelectionMode(false);\n    setSelectedIds(new Set());\n    return _await(State.api?.chatRoom?.deleteMessages?.(chatId, ids), function (result) {\n      if (!result) {\n        setSelectedIds(new Set(ids));\n        setSelectionMode(true);\n      }\n    });\n  }), [chatId, selectedIds]);\n  const handleMessageDeleteForMe = React.useCallback(_async(function (messageId) {\n    if (!chatId || !messageId) return;\n    handleMessageContextClose();\n    return _awaitIgnored(State.api?.chatRoom?.deleteMessages?.(chatId, [messageId]));\n  }), [chatId, handleMessageContextClose]);\n  const handleMessageContextSelect = React.useCallback(messageId => {\n    handleMessageContextClose();\n    setSelectionMode(true);\n    setSelectedIds(prev => new Set(prev).add(messageId));\n  }, [handleMessageContextClose]);\n\n  // Ответ на сообщение: тайл над полем ввода; по тапу на тайл — скролл к сообщению по центру\n  const handleMessageReply = React.useCallback(messageId => {\n    const message = messagesById.get(messageId) ?? messagesById.get(String(messageId));\n    const text = (message?.text || '').trim();\n    const authorName = message?.isOwner ? t('you') : chat?.title || '';\n    setReplyToMessage({\n      messageId,\n      text,\n      authorName\n    });\n    handleMessageContextClose();\n  }, [messagesById, chat?.title, t, handleMessageContextClose]);\n  const handleScrollToMessage = React.useCallback(messageId => {\n    // setScrollToMessageTarget(messageId);\n    // setScrollToMessageTrigger((n) => n + 1);\n  }, []);\n  const handleReplyTilePress = React.useCallback(() => {\n    if (replyToMessage?.messageId) {\n      handleScrollToMessage(replyToMessage.messageId);\n    }\n  }, [replyToMessage?.messageId, handleScrollToMessage]);\n  const scrollUiStateRef = React.useRef({\n    atBottom: true,\n    showScrollToBottom: false\n  });\n  const handleFlatListScroll = React.useCallback(e => {\n    const y = Number(e?.nativeEvent?.contentOffset?.y) || 0;\n    const atBottom = y <= 16;\n    const nextShowScrollToBottom = !atBottom && y > halfScreenScrollThreshold;\n    const prev = scrollUiStateRef.current;\n    if (prev.atBottom === atBottom && prev.showScrollToBottom === nextShowScrollToBottom) {\n      return;\n    }\n    scrollUiStateRef.current = {\n      atBottom,\n      showScrollToBottom: nextShowScrollToBottom\n    };\n    setIsAtBottomState(atBottom);\n    setScrollState(current => current.distanceToBottom === y ? current : {\n      ...current,\n      distanceToBottom: y\n    });\n  }, [halfScreenScrollThreshold]);\n  React.useEffect(() => {\n    if (!isAtBottomState) return;\n    if (!newMessagesCount || newMessagesCount <= 0) return;\n    State.api?.chatRoom?.markRead?.(chatId);\n  }, [isAtBottomState, newMessagesCount, chatId]);\n  const messagesWithDateSeparators = React.useMemo(() => {\n    const out = [];\n    const messages = chat?.messages ?? [];\n    const len = messages.length;\n    if (len === 0) return out;\n\n    // O(n) algorithm: single pass, track last seen day\n    let lastDayKey = null;\n    for (let i = 0; i < len; i++) {\n      const item = messages[i];\n      if (!item || item.type === 'date_separator') continue;\n      out.push(item);\n\n      // Check if next message is a different day\n      const nextItem = messages[i + 1];\n      if (!nextItem || nextItem.type === 'date_separator' || nextItem.timestamp == null) continue;\n      const currentDate = new Date(item.timestamp);\n      if (Number.isNaN(currentDate.getTime())) continue;\n      const nextDate = new Date(nextItem.timestamp);\n      if (Number.isNaN(nextDate.getTime())) continue;\n      const currentDayKey = `${currentDate.getFullYear()}-${currentDate.getMonth()}-${currentDate.getDate()}`;\n      const nextDayKey = `${nextDate.getFullYear()}-${nextDate.getMonth()}-${nextDate.getDate()}`;\n      if (currentDayKey !== nextDayKey) {\n        out.push({\n          id: `date_${currentDayKey}_${item.id ?? i}`,\n          type: 'date_separator',\n          dateLabel: formatDateSeparatorLabel(item.timestamp, t, locale),\n          timestamp: item.timestamp\n        });\n      }\n    }\n    return out;\n  }, [chat?.messages, t, locale]);\n  const messagesWithSeparators = React.useMemo(() => {\n    if (!newMessagesCount || newMessagesCount <= 0) {\n      return messagesWithDateSeparators;\n    }\n    const out = [];\n    let inserted = false;\n    for (let i = 0; i < messagesWithDateSeparators.length; i++) {\n      const item = messagesWithDateSeparators[i];\n      if (!inserted && item?.type === 'message' && i >= newMessagesCount) {\n        out.push({\n          id: `new_separator`,\n          type: 'new_separator',\n          dateLabel: t('chatNewSeparator'),\n          timestamp: item.timestamp\n        });\n        inserted = true;\n      }\n      out.push(item);\n    }\n    return out;\n  }, [messagesWithDateSeparators, newMessagesCount, t]);\n  const renderMessage = React.useCallback(({\n    item\n  }) => {\n    if (!item) return null;\n    return /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"ChatMessage\",\n      message: item,\n      chatId: chatId,\n      bubbleRefsMap: bubbleRefsMap,\n      onReplyTilePress: handleReplyTilePress,\n      onRetrySend: handleRetrySend,\n      onToggleSelect: handleToggleSelect,\n      selectionMode: selectionMode,\n      isSelected: item?.id != null && selectedIds?.has(item?.id)\n    });\n  }, [handleReplyTilePress, selectionMode, selectedIds, handleRetrySend, handleToggleSelect, chatId]);\n  const keyExtractor = React.useCallback((item, index) => {\n    if (item?.type === 'message') {\n      return String(item?.tmpId ?? item?.id ?? `message_${index}`);\n    }\n    return String(item?.id ?? `${item?.type ?? 'event'}_${item?.timestamp ?? index}`);\n  }, []);\n  const styles = React.useMemo(() => {\n    return {\n      container: {\n        flex: 1,\n        width: '100%',\n        overflow: 'visible',\n        maxHeight: '100%'\n      },\n      containerWeb: {\n        flex: 1,\n        width: '100%',\n        overflow: 'visible',\n        maxHeight: '100%'\n      },\n      flex: {\n        flex: 1,\n        minHeight: 0\n      },\n      chatListContent: {\n        paddingTop: 12,\n        paddingBottom: 4\n      },\n      sayHelloWrap: {\n        flex: 1,\n        justifyContent: 'center'\n      },\n      inputDockPlaceholder: {\n        width: '100%',\n        height: 64,\n        backgroundColor: 'transparent'\n      }\n    };\n  }, [theme]);\n  const [isScrollInited, setIsScrollInited] = React.useState(false);\n  const isWeb = ReactNative.Platform.OS === 'web';\n  React.useEffect(() => {\n    setIsScrollInited(false);\n  }, [chatId]);\n  React.useLayoutEffect(() => {\n    if (messagesWithSeparators.length && !isScrollInited) {\n      setIsScrollInited(true);\n      scrollToBottom();\n    }\n  }, [isScrollInited, messagesWithSeparators, scrollToBottom]);\n  const isLoading = chat.isLoadingMessages && !chat?.messages?.length;\n  React.useEffect(() => {\n    if (!isWeb) return;\n    const handleWheel = e => {\n      e.preventDefault();\n      const scrollContainer = listRef.current?.getScrollableNode?.();\n      if (scrollContainer) {\n        scrollContainer.scrollTop -= e.deltaY;\n      }\n    };\n    const container = listRef.current?.getScrollableNode?.();\n    if (container) {\n      container.addEventListener('wheel', handleWheel, {\n        passive: false\n      });\n    }\n    return () => {\n      if (container) {\n        container.removeEventListener('wheel', handleWheel);\n      }\n    };\n  }, [isWeb, listRef.current]);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: isWeb ? styles.containerWeb : styles.container\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatAppbar\",\n    chat: chat,\n    user: user,\n    loading: !user && !chat?.title && !chat?.photo,\n    onBack: handleBack,\n    onProfilePress: handleOpenPeerProfile,\n    onCall: handleCall,\n    onSubscribe: !isSubscribed ? handleToggleSubscription : undefined,\n    onUnsubscribe: isSubscribed ? handleToggleSubscription : undefined,\n    onMute: handleMute,\n    onReport: handleReport,\n    onDelete: handleDelete,\n    selectionMode: selectionMode,\n    selectedCount: selectedIds.size,\n    onExitSelectionMode: handleExitSelectionMode,\n    limitContentWidthOnWideWeb: true\n  }), shouldShowSayHello || isLoading ? /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.sayHelloWrap,\n    onPress: closeKeyboard\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"SayHello\",\n    chat: chat,\n    user: user,\n    onSayHello: handleSayHelloPress,\n    loading: chat?.isLoading || !user || isLoading\n  })) : /*#__PURE__*/React.createElement(FlatList, {\n    ref: listRef,\n    data: messagesWithSeparators,\n    inverted: true,\n    estimatedItemSize: 60,\n    maintainVisibleContentPosition: {\n      minIndexForVisible: 0,\n      autoscrollToTopThreshold: 10\n    },\n    keyExtractor: keyExtractor,\n    renderItem: renderMessage,\n    contentContainerStyle: styles.chatListContent,\n    keyboardShouldPersistTaps: \"handled\",\n    keyboardDismissMode: \"interactive\",\n    style: styles.flex,\n    onScroll: handleFlatListScroll,\n    scrollEventThrottle: 120,\n    onViewableItemsChanged: handleViewableItemsChanged,\n    viewabilityConfig: viewabilityConfig,\n    onEndReached: handleLoadMore,\n    onEndReachedThreshold: 0.5,\n    automaticallyAdjustContentInsets: false,\n    removeClippedSubviews: false,\n    maxToRenderPerBatch: 5,\n    updateCellsBatchingPeriod: 50,\n    windowSize: 5,\n    initialNumToRender: 14\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatRoomDock\",\n    showScrollToBottom: showScrollToBottom,\n    onScrollToBottomPress: scrollToBottom,\n    newMessagesCount: newMessagesCount,\n    messageText: messageText,\n    onChangeText: handleChangeText,\n    attachments: attachments,\n    onAttachmentsChange: handleAttachmentsChange,\n    onSend: handleSendMessage,\n    onAttachment: handleAttachment,\n    onGiftPress: canSendGift ? handleGiftPress : undefined,\n    onQuickGiftPress: canSendGift ? handleQuickGiftPress : undefined,\n    onFilesLimitExceeded: handleFilesLimitExceeded,\n    forceAttachmentCallback: shouldShowSayHello,\n    replyTo: replyToMessage,\n    onReplyToClose: () => setReplyToMessage(null),\n    onReplyTilePress: handleReplyTilePress,\n    showPaidBadge: shouldShowSayHello,\n    paidPrice: firstMessagePrice,\n    selectionMode: selectionMode,\n    onCancelSelection: handleExitSelectionMode,\n    onDeleteSelected: handleDeleteSelected\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatRoomOverlays\",\n    messageContext: messageContext,\n    onMessageContextClose: handleMessageContextClose,\n    onMessageReply: handleMessageReply,\n    onMessageDeleteForMe: handleMessageDeleteForMe,\n    onMessageContextSelect: handleMessageContextSelect\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatAttachmentsLockedToast\",\n    visible: showAttachmentsLockedToast\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatAttachmentsFilesLimitToast\",\n    visible: showFilesLimitToast,\n    title: t('chatAttachmentsFilesLimitToastTitle') || 'Files limit reached',\n    description: t('chatAttachmentsFilesLimitToast') || 'Only first 10 files were selected'\n  })));\n};"},"LiveStreamNotificationBar":{"name":"LiveStreamNotificationBar","key":"e640e4f70bf195daf215ac91c619eb58910f1268d321fe8c75082c21101fb346","code":"return ({\n  onPress\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => {\n    const content = theme.theme.semantic?.content?.inversion?.static?.stPrimary ?? '#FFFFFF';\n    const paragraphFont = theme.theme.typography?.family?.paragraph ?? 'Inter';\n    const headingFont = theme.theme.typography?.family?.heading;\n    return {\n      root: {\n        width: '100%',\n        height: 44,\n        paddingHorizontal: 12,\n        paddingVertical: 6,\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 4,\n        backgroundColor: theme.theme.semantic?.surface?.positive?.surface4 ?? '#24BC75'\n      },\n      icon: {\n        width: 24,\n        height: 24,\n        color: content\n      },\n      title: {\n        flex: 1,\n        minWidth: 0,\n        color: content,\n        fontFamily: paragraphFont,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '500',\n        letterSpacing: -0.2\n      },\n      action: {\n        height: 32,\n        paddingHorizontal: 12,\n        alignItems: 'center',\n        justifyContent: 'center',\n        borderRadius: 12,\n        backgroundColor: theme.theme.component?.button?.secondaryInversion?.bgDefault ?? 'rgba(255,255,255,0.1)'\n      },\n      actionText: {\n        color: theme.theme.component?.button?.secondaryInversion?.content ?? content,\n        fontFamily: headingFont,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '600',\n        letterSpacing: -0.14\n      }\n    };\n  }, [theme]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    accessibilityRole: \"button\",\n    accessibilityLabel: t('streamChatReturnToLive') || 'Return to live stream',\n    style: styles.root,\n    onPress: onPress\n  }, /*#__PURE__*/React.createElement(Assets.Back, {\n    size: 24,\n    style: styles.icon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title,\n    numberOfLines: 1\n  }, t('streamChatLiveActive') || 'You’re live!'), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.action,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.actionText,\n    numberOfLines: 1\n  }, t('streamChatReturnButton') || 'Connect')));\n};"},"UserAppbar":{"name":"UserAppbar","key":"79c757c593db9555b396fa0ba2b0fe9e4ebc11c0e7e42f2b11fe0407701f110a","code":"/* === Inlined module: guestIcons.jsx === */\n// Shared guest UI icons.\n// Block-body arrow form (the concise `=> (<SVG/>)` form breaks babel on this content).\n\nconst GuestAvatarIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 20,\n    height: 20,\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M5.2002 10.4004C6.7465 10.4005 8 11.6539 8 13.2002C7.9999 14.7464 6.74644 15.9999 5.2002 16C3.65386 16 2.4005 14.7465 2.40039 13.2002C2.40039 11.6538 3.6538 10.4004 5.2002 10.4004ZM14 10.4004C15.5464 10.4004 16.7998 11.6538 16.7998 13.2002C16.7997 14.7465 15.5463 16 14 16C12.4537 16 11.2003 14.7465 11.2002 13.2002C11.2002 11.6538 12.4536 10.4004 14 10.4004ZM17.5996 7.40039C17.931 7.40039 18.2002 7.66863 18.2002 8C18.2002 8.33137 17.931 8.59961 17.5996 8.59961H1.59961C1.26842 8.5994 1 8.33124 1 8C1 7.66876 1.26842 7.4006 1.59961 7.40039H17.5996Z\",\n    fill: \"#04060F\",\n    fillOpacity: 0.5\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: 0.5,\n    d: \"M8.25879 12.4004C9.10337 11.9781 10.0978 11.9781 10.9424 12.4004L11.2725 12.5654C11.2252 12.7693 11.2002 12.9819 11.2002 13.2002C11.2002 13.4479 11.2326 13.6882 11.293 13.917L10.4053 13.4736C9.89859 13.2203 9.3026 13.2204 8.7959 13.4736L7.90723 13.917C7.96767 13.6882 7.99998 13.448 8 13.2002C8 12.9819 7.97498 12.7693 7.92773 12.5654L8.25879 12.4004ZM10.8525 2.40039C12.6522 2.40039 13.5521 2.39996 14.2031 2.9082C14.8542 3.41651 15.0723 4.28999 15.5088 6.03613L15.8496 7.40039H3.34961L3.69141 6.03613C4.12794 4.28999 4.34604 3.41651 4.99707 2.9082C5.64808 2.40004 6.54798 2.40039 8.34766 2.40039H10.8525Z\",\n    fill: \"#04060F\",\n    fillOpacity: 0.5\n  }));\n};\nconst DoorIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 13,\n    height: 15,\n    viewBox: \"0 0 13 15\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8.49902 0C9.42767 0 10.1751 -0.000612849 10.7607 0.078125C11.3607 0.158799 11.8664 0.331293 12.2676 0.732422C12.6686 1.13359 12.8412 1.63945 12.9219 2.23926C13.0006 2.82481 12.999 3.5717 12.999 4.5V9.83301C12.999 10.7615 13.0006 11.5091 12.9219 12.0947C12.8412 12.6946 12.6687 13.2004 12.2676 13.6016C11.8663 14.0028 11.3607 14.1752 10.7607 14.2559C10.1751 14.3346 9.4277 14.333 8.49902 14.333H7.83301C6.90433 14.333 6.15698 14.3346 5.57129 14.2559C4.97159 14.1752 4.46656 14.0025 4.06543 13.6016C3.71559 13.2516 3.53812 12.8207 3.44531 12.3154C3.35523 11.8245 3.338 11.2236 3.33398 10.5029C3.33263 10.227 3.55509 10.0016 3.83105 10C4.10703 9.99847 4.33219 10.2212 4.33398 10.4971C4.33804 11.2256 4.35678 11.7427 4.42871 12.1348C4.49809 12.5125 4.61029 12.7313 4.77246 12.8936C4.95696 13.0781 5.21592 13.1989 5.70508 13.2646C6.20862 13.3323 6.87618 13.333 7.83301 13.333H8.49902C9.45568 13.333 10.1234 13.3323 10.627 13.2646C11.1161 13.1989 11.376 13.0781 11.5605 12.8936C11.7447 12.7091 11.865 12.4496 11.9307 11.9609C11.9983 11.4574 11.999 10.7896 11.999 9.83301V4.5C11.999 3.54323 11.9984 2.87558 11.9307 2.37207C11.8649 1.88333 11.7449 1.6239 11.5605 1.43945C11.376 1.25504 11.116 1.13411 10.627 1.06836C10.1234 1.00073 9.45562 1 8.49902 1H7.83301C6.87623 1 6.20861 1.00069 5.70508 1.06836C5.21612 1.1341 4.95695 1.25509 4.77246 1.43945C4.6102 1.60171 4.49813 1.82057 4.42871 2.19824C4.3567 2.59031 4.33805 3.10725 4.33398 3.83594C4.33245 4.11208 4.10719 4.33454 3.83105 4.33301C3.55499 4.33139 3.33245 4.10617 3.33398 3.83008C3.33801 3.10943 3.35515 2.50843 3.44531 2.01758C3.53815 1.51238 3.71555 1.0823 4.06543 0.732422C4.46657 0.331421 4.97153 0.15881 5.57129 0.078125C6.15697 -0.000612849 6.90436 0 7.83301 0H8.49902ZM6.8125 4.14648C7.00773 3.95161 7.32437 3.9515 7.51953 4.14648L10.1865 6.81348C10.3815 7.00864 10.3814 7.32527 10.1865 7.52051L7.51953 10.1865C7.32427 10.3818 7.00776 10.3818 6.8125 10.1865C6.61757 9.99123 6.61735 9.67464 6.8125 9.47949L8.62598 7.66699H0.5C0.223966 7.66699 0.000175525 7.44299 0 7.16699C0.000178874 6.891 0.223968 6.66699 0.5 6.66699H8.62598L6.8125 4.85352C6.61746 4.65829 6.61746 4.3417 6.8125 4.14648Z\",\n    fill: \"white\"\n  }));\n};\n\n/** Обычный пробел — допустимая точка переноса (UAX #14); на части Android OEM Text при numberOfLines={1} всё равно переносит по пробелу. Разряды — неразрывный пробел U+00A0. */\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u00A0') + '\\u00A0';\n}\nconst DiamondIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: \"20\",\n  height: \"20\",\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nconst PlusIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: \"16\",\n  height: \"16\",\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8 2V14M2 8H14\",\n  stroke: \"currentColor\",\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n}));\nreturn ({\n  right,\n  onPress,\n  backgroundColor,\n  hideTopUpButton = false\n}) => {\n  const theme = Theme.useTheme();\n  const navigation = ReactNavigation.useNavigation();\n  const session = State.api?.session?.useSession?.();\n  const isGuest = State.api?.guest?.useIsGuestSession?.();\n  const tr = Locale.useTranslation();\n  const mainPhoto = session?.photos?.[0] ?? session?.card?.mainPhoto;\n  const balance = session?.ballance?.amount ?? 0;\n  const userName = session?.user?.username ?? '';\n  const t = theme.theme;\n  const contentPrimary = t.component?.appBar?.contentPrimary ?? t.semantic?.content?.regular?.primary;\n  const surface1 = t.semantic?.surface?.regular?.surface1;\n  const brandContent1 = t.semantic?.content?.brand?.content1;\n  const buttonBrandContent = t.component?.button?.brand?.content;\n  const onOpenShop = React.useCallback(() => {\n    onPress?.();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"store\",\n      isModal: true,\n      purchaseSource: \"settings\"\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [theme.isDark]);\n  const openRegister = React.useCallback(() => {\n    State.api?.guest?.openRegisterSheet('store_button');\n  }, []);\n  if (isGuest) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        flexDirection: 'row',\n        justifyContent: 'space-between',\n        alignItems: 'center',\n        gap: 8,\n        width: '100%',\n        minHeight: 48,\n        backgroundColor: backgroundColor ?? t.semantic?.surface?.regular?.pageBackground,\n        overflow: 'visible'\n      }\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      onPress: openRegister,\n      style: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 8\n      },\n      hitSlop: {\n        top: 12,\n        bottom: 12,\n        left: 12,\n        right: 12\n      }\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        width: 28,\n        height: 28,\n        borderRadius: 14,\n        backgroundColor: '#FFFFFF',\n        alignItems: 'center',\n        justifyContent: 'center'\n      }\n    }, /*#__PURE__*/React.createElement(GuestAvatarIcon, null)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: {\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: '500',\n        letterSpacing: -0.7,\n        color: contentPrimary,\n        fontFamily: t.typography?.family?.paragraph,\n        opacity: 0.7\n      },\n      numberOfLines: 1,\n      ellipsizeMode: \"tail\"\n    }, tr('guestBadge', 'Guest'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      onPress: openRegister,\n      style: {\n        height: 36,\n        paddingHorizontal: 14,\n        borderRadius: 18,\n        backgroundColor: '#FE375B',\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 6\n      }\n    }, /*#__PURE__*/React.createElement(DoorIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: {\n        color: '#FFFFFF',\n        fontFamily: 'Geologica',\n        fontSize: 14,\n        fontWeight: '600',\n        lineHeight: 20,\n        letterSpacing: -0.14\n      },\n      numberOfLines: 1\n    }, tr('guestSignInCta', 'Sign in'))));\n  }\n  const styles = React.useMemo(() => ({\n    bar: {\n      flexDirection: 'row',\n      justifyContent: 'flex-start',\n      alignItems: 'center',\n      gap: 8,\n      width: '100%',\n      minHeight: 48,\n      backgroundColor: backgroundColor ?? t.semantic?.surface?.regular?.pageBackground,\n      overflow: 'visible'\n    },\n    avatarPressInner: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    row: {\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    userName: {\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '500',\n      letterSpacing: -0.7,\n      color: contentPrimary,\n      fontFamily: t.typography?.family?.paragraph\n    },\n    right: {\n      flexDirection: 'row',\n      justifyContent: 'flex-end',\n      alignItems: 'center',\n      flexShrink: 0,\n      flexGrow: 0\n    },\n    row: {\n      flexDirection: 'row',\n      justifyContent: 'flex-end',\n      alignItems: 'center',\n      flexShrink: 0,\n      flexGrow: 0\n    },\n    balancePill: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      alignSelf: 'flex-start',\n      paddingLeft: 8,\n      paddingRight: 40,\n      gap: 4,\n      height: 32,\n      backgroundColor: surface1,\n      borderRadius: 999,\n      flexShrink: 0,\n      minWidth: 72\n    },\n    balanceIcon: {\n      color: brandContent1\n    },\n    balanceText: {\n      fontSize: 14,\n      lineHeight: 22,\n      fontWeight: 600,\n      letterSpacing: -0.2,\n      color: contentPrimary,\n      flexShrink: 0\n    },\n    plusButton: {\n      width: 32,\n      height: 32,\n      marginLeft: -32,\n      borderRadius: 999,\n      backgroundColor: brandContent1,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    plusIcon: {\n      color: buttonBrandContent\n    }\n  }), [t, contentPrimary, surface1, brandContent1, buttonBrandContent, backgroundColor]);\n  const openingProfileRef = React.useRef(false);\n  const onOpenProfile = React.useCallback(() => {\n    if (openingProfileRef.current) return;\n    openingProfileRef.current = true;\n    setTimeout(() => {\n      openingProfileRef.current = false;\n    }, 500);\n    onPress?.();\n    const route = Navigation.navigationRef.current?.getState?.();\n    if (route.routes[route.routes.length - 1]?.name !== 'Profile') {\n      navigation.dispatch(ReactNavigation.StackActions.push('Profile'));\n    }\n  }, [navigation]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bar\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onOpenProfile,\n    style: styles.avatarPressInner,\n    styleContainer: styles.avatarPressOuter,\n    hitSlop: {\n      top: 12,\n      bottom: 12,\n      left: 12,\n      right: 12\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: mainPhoto,\n    size: 40,\n    isPro: session?.subscription?.hasSubscription,\n    onPress: onOpenProfile,\n    placeholderBackgroundColor: theme.theme.semantic.surface.brand.surface1\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.userName,\n    numberOfLines: 1,\n    ellipsizeMode: \"tail\"\n  }, userName)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.right\n  }, right ?? (!hideTopUpButton ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onOpenShop,\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balancePill\n  }, /*#__PURE__*/React.createElement(DiamondIcon, {\n    style: styles.balanceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.balanceText,\n    numberOfLines: 1,\n    ellipsizeMode: \"clip\"\n  }, formatWithSpaces(balance))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.plusButton\n  }, /*#__PURE__*/React.createElement(PlusIcon, {\n    style: styles.plusIcon\n  }))) : null)));\n};"},"FeedList":{"name":"FeedList","key":"3647025d9e507447eaff0a6e8581346bf0ec43386c1d81dd19cfe1cbdbc39fdd","code":"deps: CardGridComponent\nreturn ({\n  onScrollDepthChange,\n  onCardOpen,\n  onMessageAttempt\n}) => {\n  const [items, total, isLoading, isLoadingMore, isEnded] = State.api?.feed?.useOnline?.() ?? [];\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CardGridComponent\",\n    listKey: \"FeedOnline\",\n    items: items,\n    isLoading: isLoading,\n    isLoadingMore: isLoadingMore,\n    isEnded: isEnded,\n    onEndReached: State.api?.feed?.moreOnline,\n    onScrollDepthChange: onScrollDepthChange,\n    onCardOpen: onCardOpen,\n    onMessageAttempt: onMessageAttempt,\n    cardComponentName: \"FeedCard\",\n    emptyComponentName: \"EmptyList\",\n    withPageBackground: true\n  });\n};"},"FeedMasonry":{"name":"FeedMasonry","key":"e4b68a0b107411ab78ca674c6317daddc8823cbb2d473eda538527667827cc79","code":"deps: CardGridComponent\nreturn ({\n  onScrollDepthChange,\n  onCardOpen,\n  onMessageAttempt\n}) => {\n  const [items, total, isLoading, isLoadingMore, isEnded] = State.api?.feed?.useRegular?.() ?? [];\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CardGridComponent\",\n    listKey: \"FeedRecs\",\n    items: items,\n    isLoading: isLoading,\n    isLoadingMore: isLoadingMore,\n    isEnded: isEnded,\n    onEndReached: State.api?.feed?.moreRegular,\n    onScrollDepthChange: onScrollDepthChange,\n    onCardOpen: onCardOpen,\n    onMessageAttempt: onMessageAttempt,\n    cardComponentName: \"FeedCard\",\n    emptyComponentName: \"EmptyList\"\n  });\n};"},"SkeletonRowGrid":{"name":"SkeletonRowGrid","key":"35a0fa0f56117778ecac9b633d96b03c60059c6bad34ae4b18bb9de5ec8ccd1c","code":"const Skeleton = Components.DSSkeleton ?? ReactNative.View;\nconst BASE_COLS = 2;\nconst WIDE_COLS = 3;\nconst ROWS_PER_BLOCK = 8;\nconst WIDE_BREAKPOINT = 800;\nconst MAX_CONTENT_WIDTH = 800;\nconst SQUARE_SIZE = 100;\nconst GAP = 8;\nconst PADDING = GAP;\nconst CARD_ASPECT = 263.85 / 171.5;\nconst separatorStyle = {\n  height: GAP\n};\nconst ItemSeparator = () => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: separatorStyle\n});\nconst SkeletonRowGrid = React.memo(({\n  styles,\n  gridItemSize,\n  columnCount\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: [styles.section, styles.gridRow]\n}, Array.from({\n  length: columnCount\n}).map((_, index) => /*#__PURE__*/React.createElement(Skeleton, {\n  key: index,\n  height: gridItemSize * CARD_ASPECT,\n  width: gridItemSize,\n  borderRadius: 24\n}))));\nreturn () => {\n  const theme = Theme.useTheme();\n  const {\n    height: screenHeight,\n    width: screenWidth\n  } = ReactNative.useWindowDimensions();\n  const [containerWidth, setContainerWidth] = React.useState(screenWidth);\n  const columnCount = containerWidth > WIDE_BREAKPOINT ? WIDE_COLS : BASE_COLS;\n  const itemsPerBlock = columnCount * ROWS_PER_BLOCK;\n  const sections = React.useMemo(() => {\n    const list = [];\n    list.push({\n      id: `loading-0`,\n      type: 'loading'\n    });\n    list.push({\n      id: `loading-1`,\n      type: 'loading'\n    });\n    list.push({\n      id: `loading-2`,\n      type: 'loading'\n    });\n    list.push({\n      id: `loading-3`,\n      type: 'loading'\n    });\n    list.push({\n      id: `loading-4`,\n      type: 'loading'\n    });\n    return list;\n  }, []);\n  const gridItemSize = React.useMemo(() => {\n    if (containerWidth <= 0) return SQUARE_SIZE;\n    const contentWidth = containerWidth - PADDING * 2;\n    const maxWidth = Math.min(contentWidth, MAX_CONTENT_WIDTH);\n    return (maxWidth - GAP * (columnCount - 1)) / columnCount;\n  }, [containerWidth, columnCount]);\n  const cardHeight = gridItemSize * CARD_ASPECT;\n  const sectionWidth = Math.min(Math.max(0, containerWidth - PADDING * 2), MAX_CONTENT_WIDTH);\n  const styles = React.useMemo(() => ({\n    root: {\n      flex: 1,\n      width: '100%',\n      minWidth: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    },\n    listContent: {\n      paddingHorizontal: PADDING,\n      paddingBottom: GAP,\n      width: \"100%\",\n      minWidth: '100%'\n    },\n    section: {\n      alignSelf: 'center',\n      width: sectionWidth,\n      maxWidth: '100%',\n      minHeight: cardHeight\n    },\n    gridRow: {\n      flexDirection: 'row',\n      gap: GAP\n    }\n  }), [theme, cardHeight, sectionWidth]);\n  const onLayout = React.useCallback(e => {\n    const w = e.nativeEvent.layout.width;\n    if (w > 0) setContainerWidth(w);\n  }, []);\n  const renderItem = React.useCallback(({\n    item\n  }) => {\n    return /*#__PURE__*/React.createElement(SkeletonRowGrid, {\n      styles: styles,\n      gridItemSize: gridItemSize,\n      columnCount: columnCount\n    });\n  }, [styles, gridItemSize, columnCount]);\n  const keyExtractor = React.useCallback(item => item.id, []);\n  const getItemType = React.useCallback(item => item.type, []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root,\n    onLayout: onLayout\n  }, /*#__PURE__*/React.createElement(FlashList.FlashList, {\n    data: sections,\n    renderItem: renderItem,\n    keyExtractor: keyExtractor,\n    getItemType: getItemType,\n    estimatedItemSize: cardHeight + GAP,\n    showsVerticalScrollIndicator: false,\n    contentContainerStyle: styles.listContent,\n    ItemSeparatorComponent: ItemSeparator,\n    edgeDragDisabled: true,\n    decelerationRate: \"normal\",\n    drawDistance: screenHeight * 1.5,\n    maintainVisibleContentPosition: {\n      minIndexForVisible: 0,\n      autoscrollToTopThreshold: 10\n    },\n    scrollEventThrottle: 16,\n    automaticallyAdjustContentInsets: false,\n    maxToRenderPerBatch: 6,\n    windowSize: 5,\n    initialNumToRender: 2\n  }));\n};"},"LiveGrid":{"name":"LiveGrid","key":"6704f1228ccd67c3948d8f290110851b3a334e5f92180257193a66949d0b5693","code":"deps: UserAppbar, CardGridComponent, LiveCountryModal, StreamingVerificationRequiredSheet\nfunction _empty() {}\nconst MAX_CONTENT_WIDTH = 800;\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst PADDING = 12;\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst DEFAULT_HEADER_HEIGHT = 108;\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst HEADER_HIDE_DISTANCE = 18;\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nconst HEADER_SHOW_DISTANCE = 8;\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst HEADER_ANIMATION_MS = 180;\nconst LIVE_LIST_REFRESH_MS = 5000;\nconst ArrowRightIcon = React.memo(({\n  size = 20,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M7.5 4.167 13.333 10 7.5 15.833\",\n  stroke: color,\n  strokeWidth: 1.6,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n})));\nconst VideoIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: 0.5,\n  d: \"M9.5 4C12.7873 4 14.4308 4.00037 15.5371 4.9082C15.7396 5.07442 15.9256 5.26035 16.0918 5.46289C16.9996 6.56924 17 8.21267 17 11.5V12.5C17 15.7873 16.9996 17.4308 16.0918 18.5371C15.9256 18.7396 15.7396 18.9256 15.5371 19.0918C14.4308 19.9996 12.7873 20 9.5 20C6.21267 20 4.56924 19.9996 3.46289 19.0918C3.26035 18.9256 3.07442 18.7396 2.9082 18.5371C2.00037 17.4308 2 15.7873 2 12.5V11.5C2 8.21267 2.00037 6.56924 2.9082 5.46289C3.07442 5.26035 3.26035 5.07442 3.46289 4.9082C4.56924 4.00037 6.21267 4 9.5 4Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M17.6582 9.17059C19.6041 8.19765 20.5777 7.71139 21.2891 8.15106C22.0002 8.59084 22 9.67891 22 11.8542V12.1462C22 14.3214 22.0002 15.4096 21.2891 15.8493C20.5777 16.289 19.6041 15.8017 17.6582 14.8288L17 14.4997V9.49969L17.6582 9.17059Z\",\n  fill: color\n})));\nconst GuestIcon = React.memo(({\n  size = 20,\n  color = 'rgba(4,6,15,0.5)'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M5.2 8.6c.4-3.1 2-4.8 4.8-4.8s4.4 1.7 4.8 4.8\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M4.2 8.9h11.6\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6.3 11.2h2.6a1.55 1.55 0 0 1 0 3.1H7.8a1.55 1.55 0 0 1-1.5-1.2l-.4-1.4a.4.4 0 0 1 .4-.5Zm4.8 0h2.6a.4.4 0 0 1 .4.5l-.4 1.4a1.55 1.55 0 0 1-1.5 1.2h-1.1a1.55 1.55 0 0 1 0-3.1Z\",\n  fill: color\n})));\nconst LoginIcon = React.memo(({\n  size = 16,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M7.333 5.333 10 8l-2.667 2.667M10 8H2.667\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6.667 3.333h4.667c.736 0 1.333.597 1.333 1.334v6.666c0 .737-.597 1.334-1.333 1.334H6.667\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n})));\nconst GuestAppbar = React.memo(({\n  styles,\n  onPress\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.guestBar\n}, /*#__PURE__*/React.createElement(Components.DSPressable, {\n  feedback: true,\n  onPress: onPress,\n  style: styles.guestLeft\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.guestAvatar\n}, /*#__PURE__*/React.createElement(GuestIcon, {\n  color: styles.guestIcon.color\n})), /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.guestName,\n  numberOfLines: 1\n}, \"Guest\")), /*#__PURE__*/React.createElement(Components.DSPressable, {\n  feedback: true,\n  onPress: onPress,\n  style: styles.signInButton\n}, /*#__PURE__*/React.createElement(LoginIcon, {\n  color: styles.signInText.color\n}), /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.signInText,\n  numberOfLines: 1\n}, \"Sign in\"))));\nreturn ({\n  onOpen,\n  active = true,\n  isGuest = false,\n  onRequireAuth\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const session = State.api?.session?.useSession?.();\n  const enableStreaming = State.api.ff.useFF('enableStreaming');\n  const [selectedCountries] = State.api?.live?.useCountries?.() ?? [[]];\n  const [streams, total, isLoading, isLoadingMore, isEnded] = State.api?.live?.useStreams?.() ?? [[], 0, false, false, true];\n  const countries = React.useMemo(() => selectedCountries ?? [], [selectedCountries]);\n  const displayedCountryCodes = React.useMemo(() => countries.length > 0 ? countries.slice(0, 3) : ['US', 'ES', 'VN'], [countries]);\n  const items = React.useMemo(() => (streams ?? []).filter(item => item?.ended !== true), [streams]);\n  const listBottomInset = (safeArea?.bottom ?? 0) + (Navigation.tabBarHeight ?? 0) + 4;\n  const initialHeaderHeight = (safeArea?.top ?? 0) + DEFAULT_HEADER_HEIGHT;\n  const [headerHeight, setHeaderHeight] = React.useState(initialHeaderHeight);\n  const [isRefreshing, setIsRefreshing] = React.useState(false);\n  const headerProgress = React.useRef(new ReactNative.Animated.Value(1)).current;\n  const headerVisibleRef = React.useRef(true);\n  const lastScrollYRef = React.useRef(0);\n  const requireAuth = React.useCallback(source => {\n    onRequireAuth?.(source);\n  }, [onRequireAuth]);\n  React.useLayoutEffect(() => {\n    State.api?.live?.update?.();\n    State.api?.live?.updateCountryViewers?.();\n  }, []);\n  React.useEffect(() => {\n    if (!active) return undefined;\n    State.api?.live?.update?.({\n      silent: true\n    });\n    const interval = setInterval(() => {\n      State.api?.live?.update?.({\n        silent: true\n      });\n    }, LIVE_LIST_REFRESH_MS);\n    return () => clearInterval(interval);\n  }, [active]);\n  const onRefresh = React.useCallback(_async(function () {\n    if (isRefreshing) return;\n    setIsRefreshing(true);\n    return _continueIgnored(_finallyRethrows(function () {\n      return _awaitIgnored(Promise.all([State.api?.live?.update?.({\n        silent: true,\n        force: true\n      }), State.api?.live?.updateCountryViewers?.()]));\n    }, function (_wasThrown, _result) {\n      setIsRefreshing(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [isRefreshing]);\n  const refreshIndicatorSource = React.useMemo(() => ({\n    uri: State.getUrl('/api/component/assets/pull-to-refresh-lottie.json')\n  }), []);\n  const onStartLive = React.useCallback(() => {\n    if (!enableStreaming) return;\n    State.anals.next({\n      name: 'live_start_pressed',\n      data: {}\n    });\n    if (isGuest) {\n      requireAuth('start_live');\n      return;\n    }\n    const verificationStatus = session?.verificationStatus ?? session?.user?.verificationStatus ?? session?.card?.verificationStatus;\n    const isVerified = verificationStatus === 'APPROVED' || session?.card?.verifyed === true || session?.user?.verifyed === true;\n    if (!isVerified) {\n      Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n        name: \"StreamingVerificationRequiredSheet\"\n      }), {\n        theme: Theme?.isDark?.value ? 'dark' : 'light',\n        props: {\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden',\n            backgroundColor: 'transparent'\n          }\n        }\n      });\n      return;\n    }\n    const userId = session?.user?.id;\n    if (userId == null) return;\n    Navigation.goto({\n      name: 'Streaming',\n      params: {\n        id: String(userId)\n      }\n    });\n  }, [enableStreaming, isGuest, requireAuth, session]);\n  const onChangeCountry = React.useCallback(() => {\n    Sheet.showPortal(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"LiveCountryModal\",\n      initialCode: countries,\n      onSave: result => {\n        State.api?.live?.setCountries?.(result);\n      },\n      onReset: () => {\n        State.api?.live?.setCountries?.([]);\n      }\n    }), {\n      theme: theme.isDark ? 'dark' : 'light'\n    });\n  }, [countries, theme.isDark]);\n  const animateHeader = React.useCallback(visible => {\n    if (headerVisibleRef.current === visible) return;\n    headerVisibleRef.current = visible;\n    ReactNative.Animated.timing(headerProgress, {\n      toValue: visible ? 1 : 0,\n      duration: HEADER_ANIMATION_MS,\n      easing: ReactNative.Easing?.out?.(ReactNative.Easing.cubic) ?? undefined,\n      useNativeDriver: true\n    }).start();\n  }, [headerProgress]);\n  const onHeaderLayout = React.useCallback(event => {\n    const nextHeight = Math.ceil(event.nativeEvent.layout.height);\n    if (nextHeight > 0) {\n      setHeaderHeight(prev => Math.abs(prev - nextHeight) < 1 ? prev : nextHeight);\n    }\n  }, []);\n  const onScrollOffsetChange = React.useCallback(offsetY => {\n    const y = Math.max(0, offsetY ?? 0);\n    const delta = y - lastScrollYRef.current;\n    lastScrollYRef.current = y;\n    if (y <= 2) {\n      animateHeader(true);\n      return;\n    }\n    if (delta > HEADER_HIDE_DISTANCE && y > headerHeight - 8) {\n      animateHeader(false);\n      return;\n    }\n    if (delta < -HEADER_SHOW_DISTANCE) {\n      animateHeader(true);\n    }\n  }, [animateHeader, headerHeight]);\n  const styles = React.useMemo(() => {\n    const colors = theme.theme;\n    const pageBg = colors.semantic?.surface?.regular?.pageBackground ?? '#FFFFFF';\n    const primary = colors.semantic?.content?.regular?.primary ?? '#04060F';\n    const secondary = colors.semantic?.content?.regular?.secondary ?? '#7B7B86';\n    const brand = colors.semantic?.content?.brand?.content1 ?? '#FE375B';\n    const brandButtonContent = colors.component?.button?.brand?.content ?? '#FFFFFF';\n    const surface1 = colors.semantic?.surface?.regular?.surface1 ?? '#FFFFFF';\n    const paragraphFont = colors.typography?.family?.paragraph;\n    return {\n      listPage: {\n        flex: 1,\n        width: '100%',\n        backgroundColor: pageBg\n      },\n      gridWrap: {\n        flex: 1,\n        width: '100%'\n      },\n      floatingHeader: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        zIndex: 20,\n        backgroundColor: pageBg\n      },\n      headerInner: {\n        width: '100%',\n        backgroundColor: pageBg\n      },\n      headerWrap: {\n        width: '100%',\n        maxWidth: MAX_CONTENT_WIDTH,\n        alignSelf: 'center',\n        paddingHorizontal: PADDING,\n        paddingTop: (safeArea?.top ?? 0) + 12,\n        paddingBottom: 8\n      },\n      filterRow: {\n        width: '100%',\n        maxWidth: MAX_CONTENT_WIDTH,\n        alignSelf: 'center',\n        paddingHorizontal: PADDING,\n        paddingTop: 8,\n        paddingBottom: 8,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'space-between'\n      },\n      countryLeft: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        minWidth: 0,\n        flexShrink: 1\n      },\n      countryChip: {\n        height: 36,\n        borderRadius: 18,\n        backgroundColor: surface1,\n        flexDirection: 'row',\n        alignItems: 'center',\n        paddingLeft: 8,\n        paddingRight: 12,\n        shadowColor: '#000000',\n        shadowOpacity: 0.04,\n        shadowOffset: {\n          width: 0,\n          height: 4\n        },\n        shadowRadius: 10,\n        elevation: 2\n      },\n      flagStack: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        marginRight: 8\n      },\n      flagWrap: {\n        width: 24,\n        height: 24,\n        borderRadius: 12,\n        overflow: 'hidden',\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexShrink: 0,\n        borderWidth: 1,\n        borderColor: pageBg,\n        marginRight: -7\n      },\n      flagWrapLast: {\n        marginRight: 0\n      },\n      moreText: {\n        fontFamily: paragraphFont,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '500',\n        letterSpacing: -0.2,\n        color: secondary,\n        flexShrink: 1\n      },\n      changeButton: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 2,\n        paddingLeft: 12,\n        minHeight: 32\n      },\n      changeText: {\n        fontFamily: paragraphFont,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '500',\n        color: primary\n      },\n      ctaWrap: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        bottom: listBottomInset + 10,\n        alignItems: 'center'\n      },\n      cta: {\n        height: 48,\n        paddingHorizontal: 20,\n        borderRadius: 24,\n        backgroundColor: brand,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 8,\n        shadowColor: '#FE375B',\n        shadowOpacity: 0.24,\n        shadowOffset: {\n          width: 0,\n          height: 10\n        },\n        shadowRadius: 16,\n        elevation: 8\n      },\n      ctaText: {\n        fontFamily: paragraphFont,\n        fontSize: 16,\n        lineHeight: 22,\n        fontWeight: '700',\n        color: brandButtonContent\n      },\n      ctaIcon: {\n        color: brandButtonContent\n      },\n      guestBar: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        width: '100%',\n        minHeight: 40\n      },\n      guestLeft: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 8,\n        minWidth: 0,\n        flexShrink: 1\n      },\n      guestAvatar: {\n        width: 40,\n        height: 40,\n        borderRadius: 20,\n        backgroundColor: surface1,\n        alignItems: 'center',\n        justifyContent: 'center',\n        flexShrink: 0\n      },\n      guestIcon: {\n        color: secondary\n      },\n      guestName: {\n        fontFamily: paragraphFont,\n        fontSize: 16,\n        lineHeight: 24,\n        fontWeight: '600',\n        letterSpacing: -0.2,\n        color: primary,\n        flexShrink: 1\n      },\n      signInButton: {\n        height: 40,\n        borderRadius: 20,\n        paddingHorizontal: 16,\n        backgroundColor: brand,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 6,\n        flexShrink: 0\n      },\n      signInText: {\n        fontFamily: paragraphFont,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '700',\n        color: brandButtonContent\n      }\n    };\n  }, [listBottomInset, safeArea?.top, theme]);\n  const headerTranslateY = React.useMemo(() => headerProgress.interpolate({\n    inputRange: [0, 1],\n    outputRange: [-Math.max(headerHeight, initialHeaderHeight), 0]\n  }), [headerHeight, headerProgress, initialHeaderHeight]);\n  const headerNode = React.useMemo(() => /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerInner\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerWrap\n  }, isGuest ? /*#__PURE__*/React.createElement(GuestAppbar, {\n    styles: styles,\n    onPress: () => requireAuth('guest_header_sign_in')\n  }) : /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserAppbar\"\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.filterRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.countryLeft\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.countryChip\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.flagStack\n  }, displayedCountryCodes.map((code, index) => /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: code,\n    style: [styles.flagWrap, index === displayedCountryCodes.length - 1 ? styles.flagWrapLast : null]\n  }, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: code,\n    size: 24\n  })))), countries.length === 1 ? /*#__PURE__*/React.createElement(Components.DSCountryText, {\n    code: countries[0],\n    style: styles.moreText,\n    numberOfLines: 1\n  }) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.moreText,\n    numberOfLines: 1\n  }, countries.length > 1 ? t('cameraBottomPanelCountries', [countries.length]) : t('liveMoreCountries')))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.changeButton,\n    onPress: onChangeCountry\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.changeText,\n    numberOfLines: 1\n  }, t('liveChangeCountry')), /*#__PURE__*/React.createElement(ArrowRightIcon, {\n    color: styles.changeText.color\n  })))), [countries, displayedCountryCodes, isGuest, onChangeCountry, requireAuth, styles, t]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.listPage\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gridWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CardGridComponent\",\n    listKey: \"LiveGrid\",\n    items: items,\n    isLoading: isLoading,\n    isLoadingMore: isLoadingMore,\n    isEnded: isEnded,\n    refreshing: isRefreshing,\n    onRefresh: onRefresh,\n    refreshIndicatorSource: refreshIndicatorSource,\n    refreshIndicatorTopOffset: headerHeight,\n    onCardOpen: onOpen,\n    cardComponentName: \"LiveCard\",\n    emptyComponentName: \"LiveEmptyState\",\n    onScrollOffsetChange: onScrollOffsetChange,\n    contentPaddingTop: headerHeight,\n    contentPaddingBottom: listBottomInset + 72,\n    withPageBackground: true\n  })), /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    style: [styles.floatingHeader, {\n      opacity: headerProgress,\n      transform: [{\n        translateY: headerTranslateY\n      }]\n    }],\n    onLayout: onHeaderLayout\n  }, headerNode), enableStreaming && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.ctaWrap,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.cta,\n    onPress: onStartLive\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.ctaText,\n    numberOfLines: 1\n  }, t('liveStartButton')), /*#__PURE__*/React.createElement(VideoIcon, {\n    color: styles.ctaIcon.color\n  }))));\n};"},"WatchStream":{"name":"WatchStream","key":"380a706cb80900e27a58ad0457c689f396dac1532d08f29cce18d7725a867e36","code":"deps: RoomWatch, StreamChatOverlay, VideoChatInputField, UserPanelOverlay, StreamEndedOverlay, GiftsCatalogSheet, GiftsConfirmationSheet, SwipeHintOverlay\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst WATCH_CONTENT_MAX_WIDTH = 800;\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst WATCH_BACKGROUND_OPACITY = 0.2;\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst formatGiftPrice = value => String(value ?? 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst isAbsoluteSource = value => /^https?:\\/\\//i.test(value) || /^data:/i.test(value) || /^file:/i.test(value) || /^blob:/i.test(value);\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst resolveLiveImageSource = value => {\n  if (!value) return null;\n  if (typeof value !== 'string') return value;\n  const source = value.trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source)) return source;\n  if (source.startsWith('/')) return State.getUrl(source);\n  return State.getUrl(`/api/component/assets/live/${source}`);\n};\nconst makeHashPlaceholder = (thumbhash, blurhash) => thumbhash ? {\n  thumbhash\n} : blurhash ? {\n  blurhash\n} : null;\nconst resolveStreamPreviewSource = value => {\n  if (!value || typeof value !== 'string') return value ?? null;\n  const source = value.trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source) || source.startsWith('/')) return resolveLiveImageSource(source);\n  if (/^[a-z0-9+/]+=*$/i.test(source) && source.length > 80) {\n    return `data:image/jpeg;base64,${source}`;\n  }\n  return resolveLiveImageSource(source);\n};\nconst getFirstMember = item => {\n  const candidates = [item?.meta?.members, item?.meta?.participants, item?.room?.meta?.members, item?.room?.meta?.participants, item?.room?.participants];\n  for (const candidate of candidates) {\n    if (Array.isArray(candidate) && candidate.length > 0) return candidate[0];\n  }\n  return null;\n};\nconst getMemberProfile = member => member?.meta ?? member?.public ?? {};\nconst getProfileCard = profile => profile?.card ?? profile?.userCard ?? {};\nconst getProfilePhoto = profile => profile?.photos?.[0] ?? getProfileCard(profile)?.mainPhoto ?? null;\nconst getPhotoSource = photo => photo?.path ? State.getUrl(`/file/photo/${photo.path}`) : null;\nconst BackIcon = React.memo(({\n  size = 28,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 28 28\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.0475 6.38071C11.3892 6.03912 11.9441 6.0391 12.2858 6.38071C12.6275 6.72239 12.6274 7.27728 12.2858 7.61899L6.77993 13.1249H23.3336C23.8167 13.125 24.2086 13.5168 24.2086 13.9999C24.2086 14.483 23.8167 14.8747 23.3336 14.8749H6.77993L12.2858 20.3807C12.6275 20.7224 12.6274 21.2773 12.2858 21.619C11.9441 21.9607 11.3892 21.9607 11.0475 21.619L4.04751 14.619C3.70586 14.2773 3.70582 13.7224 4.04751 13.3807L11.0475 6.38071Z\",\n  fill: color\n})));\nconst ToPipIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9 3.75H7.5C5.42893 3.75 3.75 5.42893 3.75 7.5V9M15 20.25H16.5C18.5711 20.25 20.25 18.5711 20.25 16.5V15\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n}), /*#__PURE__*/React.createElement(SVG.Rect, {\n  x: \"8.25\",\n  y: \"8.25\",\n  width: \"12\",\n  height: \"12\",\n  rx: \"3.25\",\n  stroke: color,\n  strokeWidth: 1.5\n})));\nconst StreamSoundOnIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.4844 3.56041C12.3104 3.15915 13.1242 2.93551 13.9424 3.21471C14.2143 3.30749 14.4759 3.44114 14.7109 3.60631C15.4169 4.10252 15.716 4.88661 15.8779 5.786C16.0392 6.68186 16.093 7.87284 16.1621 9.35924C16.2139 10.4742 16.25 11.4479 16.25 11.9999C16.25 12.5518 16.2139 13.5248 16.1621 14.6395C16.093 16.1262 16.0392 17.3178 15.8779 18.2137C15.716 19.1131 15.417 19.8972 14.7109 20.3934C14.476 20.5585 14.2142 20.6913 13.9424 20.784C13.1242 21.0633 12.3104 20.8406 11.4844 20.4393C10.6604 20.039 9.6583 19.3758 8.40527 18.5497L8.18652 18.4051C7.73874 18.1099 7.58414 18.0116 7.4248 17.9413C7.25436 17.8661 7.0753 17.8122 6.8916 17.7811C6.71985 17.7521 6.53651 17.7499 6 17.7499C4.69612 17.7499 3.80962 17.7659 3.02539 17.4032C2.33059 17.0817 1.66098 16.4521 1.29785 15.7782C0.889898 15.0208 0.85641 14.2272 0.786133 13.0741C0.763693 12.7059 0.750006 12.3414 0.75 11.9999C0.750001 11.6583 0.763689 11.2939 0.786133 10.9256C0.856437 9.77216 0.889664 8.97815 1.29785 8.22057C1.661 7.54665 2.33062 6.91799 3.02539 6.59655C3.80966 6.23379 4.69603 6.24987 6 6.24987C6.53652 6.24987 6.71985 6.24762 6.8916 6.21862C7.07527 6.18758 7.25438 6.13363 7.4248 6.05846C7.58416 5.98813 7.73862 5.88894 8.18652 5.59362L8.40527 5.44909C9.6582 4.62298 10.6604 3.96075 11.4844 3.56041ZM13.458 4.63463C13.2089 4.54962 12.8526 4.56326 12.1406 4.90905C11.4264 5.256 10.5212 5.85163 9.23145 6.70202L9.01172 6.84557C8.60484 7.11384 8.33194 7.29777 8.03125 7.43053C7.7469 7.55603 7.4471 7.64538 7.14062 7.69713C6.81649 7.75182 6.48741 7.74987 6 7.74987C4.55674 7.74987 4.06951 7.76632 3.65527 7.95787C3.25495 8.14309 2.8284 8.54417 2.61914 8.93248C2.40089 9.33755 2.36024 9.75264 2.2832 11.0165C2.26206 11.3634 2.25 11.6967 2.25 11.9999C2.25001 12.303 2.26207 12.6355 2.2832 12.9823C2.36025 14.2464 2.40087 14.6621 2.61914 15.0672C2.82846 15.4555 3.25506 15.8567 3.65527 16.0419C4.06948 16.2333 4.55691 16.2499 6 16.2499C6.48737 16.2499 6.81652 16.247 7.14062 16.3016C7.4471 16.3534 7.7469 16.4437 8.03125 16.5692C8.33182 16.7019 8.60505 16.8851 9.01172 17.1532L9.23145 17.2977C10.5211 18.148 11.4264 18.7428 12.1406 19.0897C12.8528 19.4356 13.2089 19.4501 13.458 19.3651C13.5954 19.3182 13.7299 19.2493 13.8486 19.1659C14.0652 19.0136 14.2625 18.719 14.4014 17.9481C14.5409 17.1732 14.592 16.1009 14.6631 14.5702C14.7151 13.4508 14.75 12.5117 14.75 11.9999C14.75 11.4882 14.7151 10.5489 14.6631 9.42955C14.592 7.89888 14.5408 6.8265 14.4014 6.05162C14.2625 5.28028 14.0653 4.98512 13.8486 4.83287C13.7299 4.74947 13.5953 4.6815 13.458 4.63463ZM19.5195 5.4237C19.8377 5.15859 20.311 5.20139 20.5762 5.5194L20.082 5.93151C20.5696 5.52525 20.5768 5.52013 20.5771 5.52037V5.52135L20.582 5.52623C20.5841 5.52881 20.5861 5.53255 20.5889 5.536C20.5945 5.54306 20.6021 5.55168 20.6104 5.56237C20.627 5.58391 20.6488 5.61283 20.6748 5.64928C20.727 5.72241 20.797 5.82597 20.8779 5.9608C21.0398 6.23061 21.2465 6.62644 21.4502 7.15612C21.8583 8.21748 22.25 9.80865 22.25 11.9999C22.25 14.1911 21.8583 15.7822 21.4502 16.8436C21.2465 17.3733 21.0398 17.7691 20.8779 18.0389C20.797 18.1738 20.727 18.2773 20.6748 18.3505C20.6488 18.3869 20.627 18.4158 20.6104 18.4374C20.6021 18.4481 20.5945 18.4567 20.5889 18.4637C20.5861 18.4672 20.5841 18.4709 20.582 18.4735L20.5771 18.4784V18.4794C20.5769 18.4797 20.5762 18.48 20 17.9999L20.5762 18.4803C20.311 18.7984 19.8377 18.8412 19.5195 18.576C19.2213 18.3274 19.1652 17.896 19.3779 17.5809L19.4199 17.5253C19.42 17.5251 19.4202 17.5241 19.4209 17.5233L19.4229 17.5214V17.5204L19.4238 17.5194C19.4292 17.5124 19.4395 17.4988 19.4541 17.4784C19.4839 17.4367 19.5312 17.3667 19.5908 17.2674C19.7102 17.0685 19.8786 16.7507 20.0498 16.3055C20.3916 15.4169 20.75 14.0083 20.75 11.9999C20.75 9.99147 20.3916 8.58283 20.0498 7.6942C19.8786 7.249 19.7102 6.93122 19.5908 6.73229C19.5312 6.633 19.4838 6.563 19.4541 6.52135L19.4238 6.48034L19.3779 6.41881C19.1652 6.10374 19.2213 5.67238 19.5195 5.4237ZM17.6357 8.34459C17.9978 8.14348 18.4541 8.27367 18.6553 8.63561L18.1162 8.93541L18.6562 8.63659L18.6572 8.63854C18.6577 8.63943 18.6586 8.64048 18.6592 8.64147C18.6603 8.64355 18.6617 8.64581 18.6631 8.6483C18.6658 8.65345 18.6683 8.65991 18.6719 8.66686C18.6791 8.68093 18.688 8.69907 18.6982 8.72057C18.7187 8.76351 18.7451 8.82112 18.7744 8.8944C18.8333 9.04156 18.906 9.25103 18.9766 9.52623C19.1178 10.0772 19.25 10.8899 19.25 11.9999C19.25 13.1099 19.1178 13.9226 18.9766 14.4735C18.906 14.7487 18.8333 14.9582 18.7744 15.1053C18.7451 15.1786 18.7187 15.2362 18.6982 15.2792C18.688 15.3007 18.6791 15.3188 18.6719 15.3329C18.6683 15.3398 18.6658 15.3463 18.6631 15.3514C18.6617 15.3539 18.6603 15.3562 18.6592 15.3583C18.6586 15.3593 18.6577 15.3603 18.6572 15.3612L18.6562 15.3631L18.6553 15.3641C18.4541 15.7261 17.9978 15.8563 17.6357 15.6551C17.274 15.454 17.1441 14.9985 17.3447 14.6366H17.3438L17.3447 14.6346C17.3516 14.6202 17.3645 14.5912 17.3818 14.5477C17.4167 14.4605 17.4691 14.3134 17.5234 14.1014C17.6322 13.6774 17.75 12.9897 17.75 11.9999C17.75 11.01 17.6322 10.3224 17.5234 9.8983C17.4691 9.68636 17.4167 9.5392 17.3818 9.45202C17.3644 9.40855 17.3516 9.37955 17.3447 9.3651L17.3438 9.36315L17.3447 9.36217C17.1447 9.00036 17.2742 8.54555 17.6357 8.34459Z\",\n  fill: color\n})));\nconst StreamSoundOffIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M21.4697 1.47016C21.7626 1.17726 22.2374 1.17727 22.5303 1.47016C22.823 1.76307 22.8231 2.23788 22.5303 2.5307L2.53027 22.5307C2.23743 22.8233 1.76257 22.8233 1.46973 22.5307C1.1769 22.2379 1.17703 21.7631 1.46973 21.4702L5.19238 17.7465C4.30891 17.737 3.63605 17.6861 3.02539 17.4038C2.3307 17.0823 1.66102 16.4526 1.29785 15.7788C0.889933 15.0214 0.856395 14.2275 0.786133 13.0746C0.763701 12.7066 0.750016 12.3418 0.75 12.0004C0.75 11.659 0.763703 11.2943 0.786133 10.9262C0.856429 9.77287 0.889819 8.97863 1.29785 8.22113C1.66097 7.54725 2.33067 6.91858 3.02539 6.59711C3.80966 6.23435 4.69603 6.25043 6 6.25043C6.53645 6.25043 6.71987 6.24817 6.8916 6.21918C7.07521 6.18816 7.25442 6.13417 7.4248 6.05903C7.58414 5.98871 7.73875 5.88942 8.18652 5.59418L8.40527 5.44965C9.65812 4.6236 10.6604 3.96132 11.4844 3.56098C12.3104 3.15971 13.1242 2.93607 13.9424 3.21528C14.2142 3.30805 14.4759 3.44173 14.7109 3.60688C15.3501 4.0562 15.6554 4.7415 15.8271 5.52973C15.9148 5.93199 15.9737 6.39563 16.0195 6.91938L21.4697 1.47016ZM15.5 11.2504C15.9142 11.2504 16.25 11.5862 16.25 12.0004C16.25 12.5525 16.2139 13.5257 16.1621 14.6401C16.093 16.1266 16.0392 17.3184 15.8779 18.2143C15.716 19.1135 15.4169 19.8979 14.7109 20.394C14.476 20.559 14.2141 20.6919 13.9424 20.7846C13.2005 21.0377 12.4628 20.8775 11.7207 20.5493C10.9878 20.2251 10.1276 19.6811 9.08887 19.0004C8.74256 18.7735 8.64638 18.3088 8.87305 17.9623C9.10007 17.6159 9.56468 17.5185 9.91113 17.7455C10.9697 18.4392 11.7264 18.9114 12.3271 19.1772C12.9184 19.4387 13.2326 19.4425 13.458 19.3657C13.5953 19.3188 13.7299 19.2499 13.8486 19.1664C14.0651 19.0142 14.2625 18.7193 14.4014 17.9487C14.5408 17.1739 14.592 16.1013 14.6631 14.5707C14.7151 13.4516 14.75 12.5123 14.75 12.0004C14.75 11.5862 15.0858 11.2504 15.5 11.2504ZM20.2646 6.31684C20.6422 6.1466 21.0865 6.31433 21.2568 6.69184C21.7238 7.72702 22.25 9.46028 22.25 12.0004C22.2499 14.1915 21.8583 15.7829 21.4502 16.8442C21.2465 17.3737 21.0398 17.7697 20.8779 18.0395C20.7971 18.1742 20.727 18.2779 20.6748 18.351C20.6488 18.3874 20.627 18.4164 20.6104 18.4379C20.6021 18.4485 20.5945 18.4573 20.5889 18.4643C20.5862 18.4677 20.5841 18.4715 20.582 18.4741L20.5771 18.4789V18.4799C20.5765 18.48 20.5619 18.4687 20 18.0004L20.5762 18.4809C20.311 18.7986 19.8376 18.8415 19.5195 18.5766C19.2214 18.328 19.1654 17.8965 19.3779 17.5815L19.4199 17.5258L19.4209 17.5239L19.4229 17.5219V17.5209L19.4238 17.52C19.4292 17.513 19.4396 17.4992 19.4541 17.4789C19.4838 17.4373 19.5313 17.3671 19.5908 17.268C19.7101 17.0691 19.8786 16.7511 20.0498 16.3061C20.3916 15.4175 20.7499 14.0086 20.75 12.0004C20.75 9.67465 20.2697 8.15165 19.8896 7.30903C19.7193 6.93151 19.8872 6.48724 20.2646 6.31684ZM13.458 4.6352C13.2089 4.55018 12.8526 4.56381 12.1406 4.90961C11.4264 5.25658 10.5211 5.85225 9.23145 6.70258L9.01172 6.84613C8.60494 7.11435 8.3319 7.29836 8.03125 7.4311C7.74694 7.55656 7.44705 7.64595 7.14062 7.6977C6.81651 7.75237 6.48738 7.75043 6 7.75043C4.55672 7.75043 4.06951 7.76688 3.65527 7.95844C3.25499 8.14369 2.82837 8.54477 2.61914 8.93305C2.40103 9.33802 2.36022 9.7535 2.2832 11.017C2.26207 11.3639 2.25 11.6973 2.25 12.0004C2.25002 12.3034 2.26208 12.6362 2.2832 12.9829C2.36024 14.2467 2.40089 14.6627 2.61914 15.0678C2.82852 15.4559 3.25516 15.8573 3.65527 16.0424C4.06945 16.2338 4.55709 16.2504 6 16.2504C6.26564 16.2504 6.48423 16.2502 6.68066 16.2582L14.6094 8.32953C14.5517 7.22856 14.4889 6.43462 14.3613 5.84906C14.2255 5.22563 14.0444 4.97111 13.8486 4.83344C13.73 4.75006 13.5953 4.68207 13.458 4.6352ZM18.1641 9.26606C18.5696 9.1819 18.9666 9.44254 19.0508 9.84809C19.1609 10.3785 19.25 11.0896 19.25 12.0004C19.25 13.1102 19.1178 13.9232 18.9766 14.4741C18.906 14.7491 18.8333 14.9588 18.7744 15.1059C18.7451 15.179 18.7187 15.2369 18.6982 15.2797C18.6881 15.3011 18.6791 15.3194 18.6719 15.3334C18.6684 15.3403 18.6658 15.3469 18.6631 15.352C18.6618 15.3544 18.6603 15.3568 18.6592 15.3588C18.6586 15.3597 18.6577 15.3609 18.6572 15.3618L18.6562 15.3637L18.6553 15.3647C18.454 15.7264 17.9976 15.8566 17.6357 15.6557C17.2741 15.4547 17.1443 14.999 17.3447 14.6371H17.3438L17.3447 14.6352C17.3516 14.6208 17.3645 14.5916 17.3818 14.5483C17.4167 14.4611 17.4691 14.3138 17.5234 14.102C17.6322 13.678 17.75 12.9901 17.75 12.0004C17.75 11.188 17.6705 10.579 17.582 10.1528C17.4979 9.74728 17.7586 9.35028 18.1641 9.26606Z\",\n  fill: color\n})));\nconst StreamMuteButton = React.memo(({\n  style\n}) => {\n  const [mutedStream, setMutedStream] = Hooks.useBehaviorSubject(State.store.mutedStream);\n  const toggleMuteStream = React.useCallback(() => {\n    setMutedStream(!mutedStream);\n  }, [mutedStream, setMutedStream]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    noloading: true,\n    hideAnimation: true,\n    scale: 1,\n    style: style,\n    onPress: toggleMuteStream\n  }, mutedStream ? /*#__PURE__*/React.createElement(StreamSoundOffIcon, null) : /*#__PURE__*/React.createElement(StreamSoundOnIcon, null));\n});\nconst EyeIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M12 3.25C16.5141 3.25 19.5546 5.95441 21.3193 8.24707C21.7307 8.78144 22.1112 9.26921 22.3672 9.84863C22.6342 10.4531 22.75 11.1118 22.75 12C22.75 12.8882 22.6342 13.5469 22.3672 14.1514C22.1112 14.7308 21.7307 15.2186 21.3193 15.7529C19.5546 18.0456 16.5141 20.75 12 20.75C7.48587 20.75 4.44539 18.0456 2.68066 15.7529C2.26934 15.2186 1.88879 14.7308 1.63281 14.1514C1.36582 13.5469 1.25 12.8882 1.25 12C1.25 11.1118 1.36582 10.4531 1.63281 9.84863C1.88879 9.26921 2.26934 8.78144 2.68066 8.24707C4.44539 5.95441 7.48587 3.25 12 3.25ZM12 4.75C8.15036 4.75 5.49856 7.04523 3.86914 9.16211C3.43083 9.73155 3.17384 10.0718 3.00488 10.4541C2.84696 10.8116 2.75 11.2489 2.75 12C2.75 12.7511 2.84696 13.1884 3.00488 13.5459C3.17384 13.9282 3.43083 14.2684 3.86914 14.8379C5.49856 16.9548 8.15036 19.25 12 19.25C15.8496 19.25 18.5014 16.9548 20.1309 14.8379C20.5692 14.2684 20.8262 13.9282 20.9951 13.5459C21.153 13.1884 21.25 12.7511 21.25 12C21.25 11.2489 21.153 10.8116 20.9951 10.4541C20.8262 10.0718 20.5692 9.73155 20.1309 9.16211C18.5014 7.04523 15.8496 4.75 12 4.75ZM12 8.25C14.0711 8.25 15.75 9.92893 15.75 12C15.75 14.0711 14.0711 15.75 12 15.75C9.92893 15.75 8.25 14.0711 8.25 12C8.25 9.92893 9.92893 8.25 12 8.25ZM12 9.75C10.7574 9.75 9.75 10.7574 9.75 12C9.75 13.2426 10.7574 14.25 12 14.25C13.2426 14.25 14.25 13.2426 14.25 12C14.25 10.7574 13.2426 9.75 12 9.75Z\",\n  fill: color\n})));\nconst ChatIcon = React.memo(({\n  size = 28,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 28 28\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.667 7C16.8214 7.00018 20.9998 11.1786 21 16.333C21 21.4876 16.8215 25.6668 11.667 25.667C10.2257 25.667 8.86027 25.3402 7.6416 24.7568C7.22271 24.5563 6.74747 24.4854 6.29883 24.6055L4.86914 24.9883C3.74175 25.2899 2.71007 24.2582 3.01172 23.1309L3.39453 21.7012C3.51457 21.2525 3.44371 20.7773 3.24316 20.3584C2.65979 19.1397 2.33301 17.7743 2.33301 16.333C2.33318 11.1785 6.51244 7 11.667 7ZM7.58301 15.167C6.93893 15.1672 6.41717 15.6889 6.41699 16.333C6.41699 16.9772 6.93883 17.4998 7.58301 17.5C8.22734 17.5 8.75 16.9773 8.75 16.333C8.74982 15.6888 8.22723 15.167 7.58301 15.167ZM11.667 15.167C11.0228 15.167 10.5002 15.6888 10.5 16.333C10.5 16.9773 11.0227 17.5 11.667 17.5C12.3112 17.4998 12.833 16.9772 12.833 16.333C12.8328 15.6889 12.3111 15.1672 11.667 15.167ZM15.75 15.167C15.1058 15.167 14.5832 15.6888 14.583 16.333C14.583 16.9773 15.1057 17.5 15.75 17.5C16.3943 17.5 16.917 16.9773 16.917 16.333C16.9168 15.6888 16.3942 15.167 15.75 15.167Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: 0.6,\n  d: \"M18.084 2.33301C22.2719 2.33327 25.667 5.72899 25.667 9.91699C25.6669 11.088 25.4018 12.1974 24.9277 13.1875C24.7649 13.5277 24.7073 13.9129 24.8047 14.2773L25.1152 15.4395C25.3603 16.3555 24.5224 17.1943 23.6064 16.9492L22.4443 16.6377C22.08 16.5403 21.6947 16.5979 21.3545 16.7607C21.2321 16.8193 21.1073 16.8747 20.9814 16.9268C20.9937 16.7306 21 16.5323 21 16.333C20.9998 11.1786 16.8215 7.00009 11.667 7C11.4677 7 11.2694 7.00625 11.0732 7.01855C12.2116 4.26826 14.9223 2.33301 18.084 2.33301Z\",\n  fill: color\n})));\nconst GiftIcon = React.memo(({\n  size = 32,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 32 32\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M14.667 29.3338H9.33301C8.27227 29.3337 7.25495 28.912 6.50488 28.1619C5.75482 27.4118 5.3331 26.3945 5.33301 25.3338V19.9998C5.33309 19.6464 5.47377 19.3074 5.72363 19.0574C5.97368 18.8074 6.31337 18.6668 6.66699 18.6668H14.667V29.3338ZM25.333 18.6668C25.6866 18.6668 26.0263 18.8074 26.2764 19.0574C26.5262 19.3074 26.6669 19.6464 26.667 19.9998V25.3338C26.6669 26.3945 26.2452 27.4118 25.4951 28.1619C24.7451 28.912 23.7277 29.3337 22.667 29.3338H17.333V18.6668H25.333ZM22 2.66679C22.7874 2.66663 23.5622 2.86518 24.252 3.24492C24.9416 3.62463 25.5234 4.17334 25.9443 4.83867C26.3652 5.50396 26.6115 6.26481 26.6592 7.05058C26.7068 7.83649 26.5552 8.62241 26.2178 9.33379H26.667C27.3741 9.33387 28.0527 9.61404 28.5527 10.1141C29.0528 10.6141 29.3329 11.2927 29.333 11.9998V13.3338C29.3329 14.0409 29.0527 14.7195 28.5527 15.2195C28.0527 15.7195 27.3741 15.9997 26.667 15.9998H17.333V9.33379H14.667V15.9998H5.33301C4.62589 15.9997 3.94728 15.7195 3.44727 15.2195C2.94725 14.7195 2.66709 14.0409 2.66699 13.3338V11.9998C2.66707 11.2927 2.94725 10.6141 3.44727 10.1141C3.94729 9.61404 4.62588 9.33387 5.33301 9.33379H5.78223C5.48612 8.70877 5.33276 8.02539 5.33301 7.33379C5.33301 4.75645 7.42287 2.66679 9.97754 2.66679C12.3174 2.62689 14.3931 4.12299 15.8184 6.5789L16 6.90312C17.3773 4.35112 19.4137 2.75106 21.7217 2.66972L22 2.66679ZM10 5.33379C9.46971 5.33379 8.96098 5.54387 8.58594 5.91875C8.21086 6.29382 8 6.80335 8 7.33379C8.00009 7.86409 8.21095 8.37286 8.58594 8.74785C8.96099 9.12281 9.46965 9.33379 10 9.33379H14.1904C13.2024 6.79379 11.592 5.30712 10 5.33379ZM21.9775 5.33379C20.4042 5.30712 18.7976 6.79512 17.8096 9.33379H22C22.5304 9.33078 23.0382 9.11718 23.4111 8.74004C23.7841 8.36284 23.9913 7.8525 23.9883 7.32207C23.9853 6.79165 23.7717 6.28387 23.3945 5.91094C23.0174 5.53822 22.5078 5.33084 21.9775 5.33379Z\",\n  fill: color\n})));\nconst DiamondIcon = React.memo(({\n  size = 9,\n  color = '#FE375B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 9 9\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M4.5 8 1 3.6 2.4 1h4.2L8 3.6 4.5 8Z\",\n  stroke: color,\n  strokeWidth: 1.1,\n  strokeLinejoin: \"round\"\n})));\nreturn ({\n  item,\n  active,\n  visible,\n  renderMedia = true,\n  isGuest = false,\n  onBack: onBackProp,\n  onRequireAuth,\n  onNext\n}) => {\n  const t = Locale.useTranslation();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const theme = Theme.useTheme();\n  const [hintVisible] = Hooks.useBehaviorSubject(State.api?.live?.getSwipeHintVisibleStore?.() ?? null);\n  const roomId = item?.roomId ?? item?.id ?? item?._id ?? null;\n  const [chatDraft, setChatDraft] = React.useState('');\n  const [isChatInputOpen, setIsChatInputOpen] = React.useState(false);\n  const [isSendingChat, setIsSendingChat] = React.useState(false);\n  const isSendingChatRef = React.useRef(false);\n  const sentChatAtRef = React.useRef([]);\n  const chatCooldownUntilRef = React.useRef(0);\n  const [chatCooldownSeconds, setChatCooldownSeconds] = React.useState(0);\n  const isChatCoolingDown = chatCooldownSeconds > 0;\n  const [liveViewerCount] = State.api.liveViewer.useCount(roomId);\n  const {\n    quickGifts\n  } = State.api?.gifts?.useQuickGifts?.() ?? {};\n  const enableGifts = State.api.ff.useFF('enableGifts');\n  const currentUserId = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(session => session?.user?.id, []));\n  const tabsContext = (Components.useDSSwipeableTabsContext ?? (() => ({\n    focused: true,\n    placeholder: false\n  })))();\n  const tikTokContext = (Components.useDSTikTokContext ?? (() => ({\n    focused: active !== false,\n    placeholder: active === false\n  })))();\n  const member = getFirstMember(item);\n  const profile = getMemberProfile(member);\n  const card = getProfileCard(profile);\n  const photo = getProfilePhoto(profile);\n  const photoSource = getPhotoSource(photo);\n  const videoCover = resolveStreamPreviewSource(member?.preview ?? member?.meta?.preview ?? item?.preview);\n  const videoThumbhash = member?.hash ?? member?.meta?.hash ?? item?.hash ?? null;\n  const videoBlurhash = null;\n  const cover = photoSource ?? videoCover;\n  const coverThumbhash = photo?.hash ?? (photoSource ? null : videoThumbhash);\n  const coverBlurhash = null;\n  const coverPlaceholder = React.useMemo(() => makeHashPlaceholder(coverThumbhash, coverBlurhash), [coverThumbhash, coverBlurhash]);\n  const videoPlaceholder = React.useMemo(() => makeHashPlaceholder(videoThumbhash, videoBlurhash), [videoThumbhash, videoBlurhash]);\n  const viewers = liveViewerCount ?? item?.online?.viewerCounts?.total ?? item?.online?.viewers ?? 0;\n  const userPanelPeer = React.useMemo(() => {\n    if (!member) return null;\n    const user = profile?.user ?? {};\n    const userId = user?.id ?? profile?.userId ?? profile?.id ?? member?.userId ?? member?.id ?? null;\n    const country = member?.country ?? card?.country ?? profile?.country ?? null;\n    const photos = Array.isArray(profile?.photos) && profile.photos.length > 0 ? profile.photos : card?.mainPhoto ? [card.mainPhoto] : profile?.photos;\n    const status = profile?.status ?? (card?.rating != null ? {\n      status: card.rating\n    } : null);\n    return {\n      sessionId: member?.sessionId ?? member?.session_id ?? member?.id ?? userId ?? item?.id,\n      meta: {\n        ...profile,\n        userId,\n        user: {\n          ...user,\n          id: userId,\n          username: user?.username ?? card?.username ?? member?.username ?? 'Stream'\n        },\n        card: {\n          ...(card ?? {}),\n          ...(country ? {\n            country\n          } : {})\n        },\n        ...(photos ? {\n          photos\n        } : {}),\n        ...(status ? {\n          status\n        } : {})\n      }\n    };\n  }, [card, item?.id, member, profile]);\n  const streamerUserId = userPanelPeer?.meta?.user?.id ?? userPanelPeer?.meta?.userId ?? null;\n  const canSendGift = enableGifts && streamerUserId != null && String(streamerUserId) !== String(currentUserId ?? '');\n  const shouldRenderSkeleton = typeof visible === 'boolean' ? visible === false || active === false : !!tabsContext?.placeholder || !!tikTokContext?.placeholder || tikTokContext?.focused === false;\n  const isStreamEnded = item?.ended === true;\n  const giftSwipeBlockerIdRef = React.useRef(`watch-gifts-${Math.random().toString(36).slice(2)}`);\n  const setTabsSwipeBlocked = tabsContext?.setSwipeBlocked;\n  const setGiftSwipeBlocked = React.useCallback(blocked => {\n    setTabsSwipeBlocked?.(giftSwipeBlockerIdRef.current, blocked);\n  }, [setTabsSwipeBlocked]);\n  const blockGiftSwipe = React.useCallback(() => {\n    setGiftSwipeBlocked(true);\n  }, [setGiftSwipeBlocked]);\n  const releaseGiftSwipe = React.useCallback(() => {\n    setGiftSwipeBlocked(false);\n  }, [setGiftSwipeBlocked]);\n  const giftSwipeBlockDataSet = React.useMemo(() => ({\n    dsSwipeBlock: 'true'\n  }), []);\n  React.useEffect(() => () => {\n    setGiftSwipeBlocked(false);\n  }, [setGiftSwipeBlocked]);\n  const onBack = React.useCallback(() => {\n    if (onBackProp) {\n      onBackProp();\n      return;\n    }\n    if (Navigation.navigationRef?.isReady?.() && Navigation.navigationRef?.canGoBack?.()) {\n      Navigation.navigationRef.goBack();\n      return;\n    }\n    Navigation.goto({\n      name: 'Live'\n    }, true);\n  }, [onBackProp]);\n  const showSoon = React.useCallback(() => {\n    Notification.showNotification({\n      text: t('comingSoon'),\n      type: 'information',\n      duration: 2200\n    });\n  }, [t]);\n  const openChatInput = React.useCallback(() => {\n    if (isGuest) {\n      onRequireAuth?.('watch_chat');\n      return;\n    }\n    setIsChatInputOpen(true);\n  }, [isGuest, onRequireAuth]);\n  const closeChatInput = React.useCallback(() => {\n    if (chatCooldownUntilRef.current > Date.now()) return;\n    setIsChatInputOpen(false);\n  }, []);\n  const startChatCooldown = React.useCallback((seconds = 60) => {\n    chatCooldownUntilRef.current = Date.now() + seconds * 1000;\n    sentChatAtRef.current = [];\n    setChatCooldownSeconds(seconds);\n  }, []);\n  React.useEffect(() => {\n    if (!isChatInputOpen || isChatCoolingDown || ReactNative.Platform.OS === 'web') return;\n    const subscription = ReactNative.Keyboard.addListener('keyboardDidHide', closeChatInput);\n    return () => subscription.remove();\n  }, [closeChatInput, isChatCoolingDown, isChatInputOpen]);\n  React.useEffect(() => {\n    if (!isChatCoolingDown) return;\n    const timer = setInterval(() => {\n      setChatCooldownSeconds(Math.max(0, Math.ceil((chatCooldownUntilRef.current - Date.now()) / 1000)));\n    }, 1000);\n    return () => clearInterval(timer);\n  }, [isChatCoolingDown]);\n  React.useEffect(() => {\n    sentChatAtRef.current = [];\n    chatCooldownUntilRef.current = 0;\n    setChatCooldownSeconds(0);\n  }, [roomId]);\n  const sendChatMessage = React.useCallback(_async(function () {\n    const text = chatDraft.trim();\n    if (!roomId || !text || isSendingChatRef.current || chatCooldownUntilRef.current > Date.now()) return;\n    isSendingChatRef.current = true;\n    setIsSendingChat(true);\n    return _finallyRethrows(function () {\n      return _catch(function () {\n        return _await(State.api.streamChat.sendMessage(roomId, text), function () {\n          setChatDraft('');\n          const now = Date.now();\n          sentChatAtRef.current = [...sentChatAtRef.current.filter(sentAt => now - sentAt < 10000), now];\n          if (sentChatAtRef.current.length >= 3) startChatCooldown();\n        });\n      }, function (error) {\n        if (error?.message === 'stream-chat-rate-limit') {\n          startChatCooldown(error.retryAfterSeconds ?? 60);\n          return;\n        }\n        Notification.showNotification({\n          text: error?.message,\n          type: 'error',\n          duration: 5000\n        });\n      });\n    }, function (_wasThrown, _result) {\n      isSendingChatRef.current = false;\n      setIsSendingChat(false);\n      return _rethrow(_wasThrown, _result);\n    });\n  }), [chatDraft, roomId, startChatCooldown]);\n  const startStreamGiftFlow = React.useCallback(() => {\n    if (!canSendGift) return false;\n    if (isGuest) {\n      onRequireAuth?.('watch_gift');\n      return false;\n    }\n    State.api?.gifts?.startGiftFlow?.({\n      receiverId: streamerUserId,\n      entrySource: 'stream',\n      streamRoomId: roomId,\n      returnPoint: 'stream'\n    });\n    return true;\n  }, [canSendGift, isGuest, onRequireAuth, roomId, streamerUserId]);\n  const openGiftCatalog = React.useCallback(() => {\n    if (!startStreamGiftFlow()) return;\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsCatalogSheet\"\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [startStreamGiftFlow]);\n  const openQuickGift = React.useCallback(gift => {\n    if (!gift || !startStreamGiftFlow()) return;\n    State.api?.gifts?.selectGift?.(gift);\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsConfirmationSheet\",\n      gift: gift\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [startStreamGiftFlow]);\n  const styles = React.useMemo(() => {\n    const headingFont = theme.theme.typography?.family?.heading;\n    const paragraphFont = theme.theme.typography?.family?.paragraph;\n    return {\n      root: {\n        width: '100%',\n        height: '100%',\n        backgroundColor: 'transparent'\n      },\n      overlayRoot: {\n        width: '100%',\n        height: '100%',\n        backgroundColor: 'transparent'\n      },\n      pageBackground: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        width: '100%',\n        height: '100%',\n        zIndex: 0\n      },\n      pageBackgroundLayer: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        width: '100%',\n        height: '100%',\n        zIndex: 0,\n        opacity: WATCH_BACKGROUND_OPACITY\n      },\n      pageBackgroundShade: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        backgroundColor: 'rgba(4, 6, 15, 0.42)',\n        zIndex: 1\n      },\n      contentFrame: {\n        flex: 1,\n        width: '100%',\n        maxWidth: WATCH_CONTENT_MAX_WIDTH,\n        height: '100%',\n        alignSelf: 'center',\n        position: 'relative',\n        overflow: 'hidden',\n        backgroundColor: '#04060F',\n        zIndex: 2\n      },\n      contentFrameWithHash: {\n        backgroundColor: 'transparent'\n      },\n      mediaLayer: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        width: '100%',\n        height: '100%',\n        zIndex: 1\n      },\n      cover: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        width: '100%',\n        height: '100%'\n      },\n      coverHash: {\n        zIndex: 1\n      },\n      mediaPlaceholder: {\n        zIndex: 0\n      },\n      dim: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n        zIndex: 3\n      },\n      skeletonTopBar: {\n        position: 'absolute',\n        top: safeArea.top + 18,\n        left: 18,\n        right: 18,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        zIndex: 4\n      },\n      skeletonTopSide: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 14\n      },\n      skeletonIcon: {\n        width: 28,\n        height: 28,\n        borderRadius: 14,\n        backgroundColor: 'rgba(255,255,255,0.2)'\n      },\n      skeletonViewers: {\n        width: 64,\n        height: 24,\n        borderRadius: 12,\n        backgroundColor: 'rgba(255,255,255,0.24)'\n      },\n      skeletonHint: {\n        position: 'absolute',\n        left: 28,\n        right: 28,\n        top: '39%',\n        alignItems: 'center',\n        zIndex: 4\n      },\n      skeletonHintCircle: {\n        width: 80,\n        height: 80,\n        borderRadius: 40,\n        backgroundColor: 'rgba(4,6,15,0.42)'\n      },\n      skeletonHintLine: {\n        width: 180,\n        maxWidth: '70%',\n        height: 18,\n        borderRadius: 9,\n        marginTop: 22,\n        backgroundColor: 'rgba(255,255,255,0.22)'\n      },\n      skeletonChatList: {\n        width: '100%',\n        height: 200,\n        borderRadius: 10,\n        marginBottom: 12,\n        backgroundColor: 'rgba(255,255,255,0.16)'\n      },\n      skeletonGifts: {\n        flexDirection: 'row',\n        gap: 12,\n        marginBottom: 12,\n        paddingHorizontal: 4\n      },\n      skeletonGift: {\n        width: 44,\n        height: 62,\n        borderRadius: 22,\n        backgroundColor: 'rgba(4,6,15,0.46)'\n      },\n      skeletonChat: {\n        width: 56,\n        height: 56,\n        borderRadius: 28,\n        backgroundColor: 'rgba(4,6,15,0.5)'\n      },\n      skeletonUserPanel: {\n        flex: 1,\n        minWidth: 0,\n        height: 56,\n        maxHeight: 56,\n        borderRadius: 999,\n        backgroundColor: 'rgba(4,6,15,0.58)',\n        flexDirection: 'row',\n        alignItems: 'center',\n        padding: 4,\n        gap: 8\n      },\n      skeletonAvatar: {\n        width: 48,\n        height: 48,\n        borderRadius: 24,\n        backgroundColor: 'rgba(255,255,255,0.18)'\n      },\n      skeletonProfileText: {\n        flex: 1,\n        minWidth: 0,\n        gap: 6\n      },\n      skeletonName: {\n        width: 128,\n        maxWidth: '82%',\n        height: 16,\n        borderRadius: 8,\n        backgroundColor: 'rgba(255,255,255,0.28)'\n      },\n      skeletonMeta: {\n        width: 86,\n        maxWidth: '62%',\n        height: 12,\n        borderRadius: 6,\n        backgroundColor: 'rgba(255,255,255,0.18)'\n      },\n      skeletonPanelButton: {\n        width: 48,\n        height: 48,\n        borderRadius: 24,\n        backgroundColor: 'rgba(255,255,255,0.82)'\n      },\n      skeletonGiftButton: {\n        width: 56,\n        height: 56,\n        borderRadius: 28,\n        backgroundColor: '#FE375B'\n      },\n      topBar: {\n        position: 'absolute',\n        top: safeArea.top + 18,\n        left: 18,\n        right: 18,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        zIndex: 4\n      },\n      topSide: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 14\n      },\n      topButton: {\n        width: 28,\n        height: 28,\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      viewers: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 6\n      },\n      viewersText: {\n        color: '#FFFFFF',\n        fontFamily: headingFont,\n        fontSize: 16,\n        lineHeight: 22,\n        fontWeight: '700'\n      },\n      bottom: {\n        position: 'absolute',\n        left: 12,\n        right: 12,\n        bottom: isChatInputOpen ? 12 : Math.max(safeArea.bottom, 8),\n        zIndex: 4\n      },\n      chat: {\n        marginBottom: 12\n      },\n      gifts: {\n        marginHorizontal: -4,\n        marginBottom: 12\n      },\n      giftContent: {\n        gap: 8,\n        paddingHorizontal: 4\n      },\n      giftItem: {\n        alignItems: 'center',\n        gap: 2,\n        width: 44\n      },\n      giftCircle: {\n        width: 44,\n        height: 44,\n        borderRadius: 22,\n        backgroundColor: 'rgba(4,6,15,0.58)',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      giftImage: {\n        width: 32,\n        height: 32\n      },\n      giftPrice: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 2\n      },\n      giftPriceText: {\n        color: 'rgba(255,255,255,0.8)',\n        fontFamily: paragraphFont,\n        fontSize: 10,\n        lineHeight: 14,\n        fontWeight: '500'\n      },\n      actionRow: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 6\n      },\n      userPanelSlot: {\n        flex: 1,\n        minWidth: 0,\n        height: 56,\n        maxHeight: 56\n      },\n      chatButton: {\n        width: 56,\n        height: 56,\n        borderRadius: 28,\n        backgroundColor: 'rgba(4,6,15,0.5)',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      giftCta: {\n        width: 56,\n        height: 56,\n        borderRadius: 28,\n        backgroundColor: '#FE375B',\n        alignItems: 'center',\n        justifyContent: 'center'\n      }\n    };\n  }, [isChatInputOpen, safeArea, theme]);\n  const pageBackground = cover ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pageBackgroundLayer,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory-disk\",\n    style: styles.pageBackground,\n    source: cover,\n    placeholder: coverPlaceholder,\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\",\n    thumbhash: coverThumbhash,\n    blurhash: coverBlurhash\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pageBackgroundShade\n  })) : null;\n  const videoBackdrop = renderMedia && videoPlaceholder ? /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    pointerEvents: \"none\",\n    cachePolicy: \"memory-disk\",\n    source: null,\n    placeholder: videoPlaceholder,\n    style: [styles.cover, styles.mediaPlaceholder],\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\",\n    thumbhash: videoThumbhash,\n    blurhash: videoBlurhash,\n    recyclingKey: `watch-stream-hash:${videoThumbhash ?? videoBlurhash ?? 'none'}`\n  }) : renderMedia ? /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    pointerEvents: \"none\",\n    cachePolicy: \"memory-disk\",\n    source: videoCover ?? null,\n    placeholder: videoCover ?? null,\n    style: [styles.cover, styles.mediaPlaceholder],\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\"\n  }) : null;\n  const dimColors = ['rgba(0,0,0,0.38)', 'rgba(0,0,0,0.05)', 'rgba(0,0,0,0.08)', 'rgba(0,0,0,0.64)'];\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: renderMedia ? styles.root : styles.overlayRoot,\n    pointerEvents: shouldRenderSkeleton ? 'none' : 'box-none'\n  }, renderMedia ? pageBackground : null, shouldRenderSkeleton ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    testID: `watch-stream-skeleton-${visible === false ? 0 : 1}-${active === false ? 0 : 1}`,\n    style: {\n      position: 'absolute',\n      width: 1,\n      height: 1,\n      opacity: 0,\n      pointerEvents: 'none'\n    }\n  }) : null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.contentFrame, videoPlaceholder ? styles.contentFrameWithHash : null],\n    pointerEvents: shouldRenderSkeleton ? 'none' : 'box-none'\n  }, videoBackdrop, renderMedia && !shouldRenderSkeleton ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.mediaLayer,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"RoomWatch\",\n    item: item,\n    active: active !== false,\n    cover: videoCover,\n    coverThumbhash: videoThumbhash,\n    coverBlurhash: videoBlurhash\n  })) : null, /*#__PURE__*/React.createElement(LinearGradient, {\n    pointerEvents: \"none\",\n    colors: dimColors,\n    locations: [0, 0.26, 0.58, 1],\n    style: styles.dim\n  }), isStreamEnded ? null : shouldRenderSkeleton ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonTopBar\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonTopSide\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonIcon\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonTopSide\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonViewers\n  }))) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topBar,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topSide\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.topButton,\n    onPress: onBack\n  }, /*#__PURE__*/React.createElement(BackIcon, null)), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.topButton,\n    onPress: showSoon\n  }, /*#__PURE__*/React.createElement(ToPipIcon, null))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topSide\n  }, /*#__PURE__*/React.createElement(StreamMuteButton, {\n    style: styles.topButton\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.viewers\n  }, /*#__PURE__*/React.createElement(EyeIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.viewersText,\n    numberOfLines: 1\n  }, viewers)))), isStreamEnded ? null : shouldRenderSkeleton ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonHint\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonHintCircle\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonHintLine\n  })) : /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"SwipeHintOverlay\",\n    visible: hintVisible === true,\n    onDismiss: () => State.api?.live?.hideSwipeHint?.('tap'),\n    zIndex: 4\n  }), !isStreamEnded ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottom,\n    pointerEvents: shouldRenderSkeleton ? 'none' : 'box-none'\n  }, shouldRenderSkeleton ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonChatList\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonGifts\n  }, [0, 1, 2, 3, 4].map(index => /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: index,\n    style: styles.skeletonGift\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actionRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonChat\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonUserPanel\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonAvatar\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonProfileText\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonName\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonMeta\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonPanelButton\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.skeletonGiftButton\n  }))) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.chat\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StreamChatOverlay\",\n    roomId: roomId\n  })), canSendGift && (quickGifts?.length ?? 0) > 0 ? /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n    horizontal: true,\n    directionalLockEnabled: true,\n    nestedScrollEnabled: true,\n    showsHorizontalScrollIndicator: false,\n    scrollEventThrottle: 16,\n    style: styles.gifts,\n    contentContainerStyle: styles.giftContent,\n    dataSet: giftSwipeBlockDataSet,\n    onTouchStart: blockGiftSwipe,\n    onTouchEnd: releaseGiftSwipe,\n    onTouchCancel: releaseGiftSwipe,\n    onScrollBeginDrag: blockGiftSwipe,\n    onScrollEndDrag: releaseGiftSwipe,\n    onMomentumScrollEnd: releaseGiftSwipe,\n    onStartShouldSetResponderCapture: () => {\n      blockGiftSwipe();\n      return false;\n    },\n    onResponderRelease: releaseGiftSwipe,\n    onResponderTerminate: releaseGiftSwipe\n  }, quickGifts.map(gift => /*#__PURE__*/React.createElement(Components.DSPressable, {\n    key: gift.id ?? gift.uid,\n    feedback: true,\n    noloading: true,\n    style: styles.giftItem,\n    onPress: () => openQuickGift(gift)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftCircle\n  }, /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: gift.imageUrl\n    },\n    style: styles.giftImage,\n    contentFit: \"contain\"\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftPrice\n  }, /*#__PURE__*/React.createElement(DiamondIcon, {\n    size: 12\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftPriceText,\n    numberOfLines: 1\n  }, formatGiftPrice(gift.priceGems)))))) : null, isChatInputOpen ? /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatInputField\",\n    autoFocus: true,\n    maxLength: 100,\n    value: chatDraft,\n    onChangeText: setChatDraft,\n    onBlur: closeChatInput,\n    onSend: sendChatMessage,\n    canSend: !!chatDraft.trim(),\n    disabled: isSendingChat || isChatCoolingDown,\n    cooldownSeconds: chatCooldownSeconds\n  }) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actionRow\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.chatButton,\n    onPress: openChatInput\n  }, /*#__PURE__*/React.createElement(ChatIcon, null)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.userPanelSlot,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserPanelOverlay\",\n    peer: userPanelPeer,\n    embedded: true,\n    source: \"watch_stream\"\n  })), canSendGift ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.giftCta,\n    onPress: openGiftCatalog\n  }, /*#__PURE__*/React.createElement(GiftIcon, null)) : null))) : null, isStreamEnded && !shouldRenderSkeleton ? /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StreamEndedOverlay\",\n    peer: userPanelPeer,\n    active: active !== false,\n    isGuest: isGuest,\n    onNext: onNext,\n    onRequireAuth: onRequireAuth\n  }) : null));\n};"},"SubscriptionsList":{"name":"SubscriptionsList","key":"eb6fc5163d0bbaef8a2ee4a489403693448fc793032ba43066c225170e6a1d4b","code":"deps: CardGridComponent\nreturn ({\n  onScrollDepthChange,\n  onCardOpen,\n  onMessageAttempt\n}) => {\n  const [items, total, isLoading, isLoadingMore, isEnded] = State.api?.sub?.useFollowings?.() ?? [];\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CardGridComponent\",\n    listKey: \"SubscriptionsList\",\n    items: items,\n    isLoading: isLoading,\n    isLoadingMore: isLoadingMore,\n    isEnded: isEnded,\n    onEndReached: State.api?.sub?.moreFollowings,\n    onScrollDepthChange: onScrollDepthChange,\n    onCardOpen: onCardOpen,\n    onMessageAttempt: onMessageAttempt,\n    cardComponentName: \"SubscriptionsCard\",\n    emptyComponentName: \"SubscriptionsEmptyList\",\n    withPageBackground: true\n  });\n};"},"SubscriptionsMasonry":{"name":"SubscriptionsMasonry","key":"a2f243ac1ab747b92e1c96c7837e4558f95e93cc1844b3f2bcb87f98a7cf9476","code":"deps: CardGridComponent\nreturn ({\n  onScrollDepthChange,\n  onCardOpen,\n  onMessageAttempt\n}) => {\n  const hasSubscription = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.subscription?.hasSubscription, []));\n  const [items, total, isLoading, isLoadingMore, isEnded] = State.api?.sub?.useFollowers?.() ?? [];\n  const cardExtraProps = React.useMemo(() => ({\n    paywall: !hasSubscription\n  }), [hasSubscription]);\n  const emptyComponentProps = React.useMemo(() => ({\n    forFollowers: true\n  }), []);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CardGridComponent\",\n    listKey: \"SubscriptionsMasonry\",\n    items: items,\n    isLoading: isLoading,\n    isLoadingMore: isLoadingMore,\n    isEnded: isEnded,\n    onEndReached: State.api?.sub?.moreFollowers,\n    onScrollDepthChange: onScrollDepthChange,\n    onCardOpen: onCardOpen,\n    onMessageAttempt: onMessageAttempt,\n    cardComponentName: \"SubscriptionsCard\",\n    cardExtraProps: cardExtraProps,\n    emptyComponentName: \"SubscriptionsEmptyList\",\n    emptyComponentProps: emptyComponentProps\n  });\n};"},"NeedBalanceModal":{"name":"NeedBalanceModal","key":"e0c573867863586c2a2fba53711b2d0f97789d3b9ddbcb25b5e118b8cd7db5f3","code":"function formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nreturn ({\n  variant = 'ban',\n  source = 'paywall_video_chat'\n} = {}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const session = State.api?.session?.useSession?.();\n  const balance = session?.ballance?.amount ?? 0;\n  const ghostContentColor = theme.theme.component?.button?.ghost?.content ?? theme.theme.semantic?.content?.regular?.primary ?? '#04060F';\n  const actionLabelStyle = React.useMemo(() => ({\n    fontFamily: 'Geologica',\n    fontWeight: '600',\n    fontSize: 14,\n    lineHeight: 20,\n    letterSpacing: -0.01,\n    color: ghostContentColor\n  }), [ghostContentColor]);\n  const brandActionLabelStyle = React.useMemo(() => ({\n    fontFamily: 'Geologica',\n    fontWeight: '600',\n    fontSize: 14,\n    lineHeight: 20,\n    letterSpacing: -0.01,\n    color: theme.theme.component?.button?.brand?.content ?? '#FFFFFF'\n  }), [theme]);\n  const TopupIcon = React.useMemo(() => /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M14.0206 4C16.402 4 17.5928 4.00003 18.4259 4.69141C19.2591 5.38288 19.4782 6.55365 19.9171 8.89453L20.6671 12.8945C21.2843 16.1861 21.5932 17.8319 20.6935 18.916C19.7938 19.9999 18.1194 20 14.7706 20H9.22963C5.88057 20 4.20552 20.0001 3.3058 18.916C2.40621 17.8319 2.71503 16.186 3.33217 12.8945L4.08217 8.89453C4.52105 6.55382 4.74036 5.3829 5.57338 4.69141C6.40655 3.99993 7.59795 4 9.97963 4H14.0206ZM15.0792 7.29297C14.6888 7.15507 14.2602 7.35953 14.1222 7.75C13.813 8.6249 12.9786 9.25 12.0001 9.25C11.0217 9.24994 10.1873 8.62487 9.87807 7.75C9.74001 7.35951 9.31155 7.15494 8.92104 7.29297C8.53052 7.43102 8.32597 7.85947 8.464 8.25C8.97846 9.70538 10.3663 10.7499 12.0001 10.75C13.634 10.75 15.0218 9.70538 15.5363 8.25C15.6743 7.85946 15.4698 7.431 15.0792 7.29297Z\",\n    fill: theme.theme.component?.button?.brand?.content ?? '#FFFFFF'\n  })), [theme]);\n  const isStartChat = variant === 'startChat';\n  const popupType = isStartChat ? 'paywall_first_msg' : null;\n  const titleKey = isStartChat ? 'notEnoughGems' : 'bannedNotEnoughHeader';\n  const descriptionKey = isStartChat ? 'chatTopUp' : 'bannedNotEnoughDesc';\n  const actionButtonKey = isStartChat ? 'getMoreGems' : 'bannedButtonBalanceTopup';\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: safeArea.bottom\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      flexDirection: 'row',\n      gap: 8,\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 16 + 36,\n      paddingTop: 20,\n      paddingBottom: 12,\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: \"100%\",\n      gap: 6\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Diamond, {\n    style: {\n      color: theme.theme.semantic.content.brand.content1\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500,\n      letterSpacing: -0.3,\n      textAlign: 'center'\n    }\n  }, formatWithSpaces(balance))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: {\n      position: 'absolute',\n      right: 16,\n      top: 20\n    },\n    feedback: true,\n    onPress: () => {\n      if (popupType) {\n        State.anals.next({\n          name: 'popup_shown',\n          data: {\n            popup_type: popupType,\n            popup_action: 'closed'\n          }\n        });\n      }\n      sheet.close();\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      gap: 4,\n      alignItems: 'center',\n      justifyContent: 'center',\n      padding: 16\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: {\n      width: 88,\n      height: 88\n    },\n    source: State.getUrl('/api/component/assets/store/diamond-big.webp')\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: 600,\n      textAlign: 'center'\n    }\n  }, t(titleKey)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      textAlign: 'center'\n    }\n  }, t(descriptionKey))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'column',\n      gap: 8,\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingVertical: 4\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"brand\",\n    size: \"L\",\n    style: {\n      width: '100%'\n    },\n    onPress: () => {\n      if (popupType) {\n        State.anals.next({\n          name: 'popup_shown',\n          data: {\n            popup_type: popupType,\n            popup_action: 'action'\n          }\n        });\n      }\n      sheet.close();\n      Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n        name: \"store\",\n        isModal: true,\n        purchaseSource: source\n      }), {\n        theme: Theme.isDark.value ? 'dark' : 'light',\n        props: {\n          swipeUp: true,\n          swipeDismissibleUp: true,\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden'\n          }\n        }\n      });\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: brandActionLabelStyle\n  }, t(actionButtonKey)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      marginLeft: 8\n    }\n  }, TopupIcon))), /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"ghost\",\n    size: \"L\",\n    style: {\n      width: '100%',\n      marginTop: 8\n    },\n    onPress: () => {\n      if (popupType) {\n        State.anals.next({\n          name: 'popup_shown',\n          data: {\n            popup_type: popupType,\n            popup_action: 'closed'\n          }\n        });\n      }\n      sheet.close();\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: actionLabelStyle\n  }, t('cancel') || 'Cancel'))));\n};"},"WebAuthButtons":{"name":"WebAuthButtons","key":"30588fc41120a0d90241e3879ebe4d178de59bcead9352d82678400271d11f3d","code":"const UnionIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M14 1.25C15.3928 1.25 16.5131 1.24815 17.3916 1.36621C18.2917 1.48723 19.0504 1.74672 19.6523 2.34863C20.254 2.95049 20.5128 3.70848 20.6338 4.6084C20.7519 5.48691 20.75 6.60708 20.75 8V16C20.75 17.3929 20.7519 18.5131 20.6338 19.3916C20.5128 20.2915 20.254 21.0495 19.6523 21.6514C19.0504 22.2533 18.2917 22.5128 17.3916 22.6338C16.5131 22.7519 15.3928 22.75 14 22.75H13C11.6071 22.75 10.4869 22.7519 9.6084 22.6338C8.7083 22.5128 7.95054 22.2533 7.34863 21.6514C6.82378 21.1265 6.55817 20.4816 6.41895 19.7236C6.28366 18.9871 6.25797 18.0854 6.25195 17.0039C6.2498 16.5898 6.58393 16.2523 6.99805 16.25C7.41213 16.2478 7.74965 16.582 7.75195 16.9961C7.75804 18.0894 7.78649 18.8649 7.89453 19.4531C7.99864 20.0196 8.16585 20.3474 8.40918 20.5908C8.68594 20.8676 9.07482 21.0478 9.80859 21.1465C10.5639 21.248 11.5648 21.25 13 21.25H14C15.4354 21.25 16.437 21.248 17.1924 21.1465C17.9258 21.0478 18.3141 20.8675 18.5908 20.5908C18.8676 20.3141 19.0488 19.9252 19.1475 19.1914C19.2489 18.4361 19.25 17.4351 19.25 16V8C19.25 6.56491 19.2489 5.56388 19.1475 4.80859C19.0488 4.07482 18.8676 3.68594 18.5908 3.40918C18.3141 3.13252 17.9258 2.95217 17.1924 2.85352C16.437 2.75196 15.4354 2.75 14 2.75H13C11.5648 2.75 10.5639 2.75199 9.80859 2.85352C9.07482 2.95217 8.68594 3.13242 8.40918 3.40918C8.16585 3.65256 7.99864 3.98044 7.89453 4.54688C7.78649 5.13507 7.75804 5.91055 7.75195 7.00391C7.74965 7.41802 7.41213 7.75216 6.99805 7.75C6.58393 7.74769 6.24979 7.41018 6.25195 6.99609C6.25797 5.91459 6.28366 5.01292 6.41895 4.27637C6.55817 3.51842 6.82378 2.87354 7.34863 2.34863C7.95054 1.74672 8.7083 1.48723 9.6084 1.36621C10.4869 1.2481 11.6071 1.25 13 1.25H14ZM11.4697 7.46973C11.7626 7.17684 12.2374 7.17684 12.5303 7.46973L16.5303 11.4697C16.6709 11.6104 16.75 11.8011 16.75 12C16.75 12.1989 16.6709 12.3896 16.5303 12.5303L12.5303 16.5303C12.2374 16.8232 11.7626 16.8232 11.4697 16.5303C11.1768 16.2374 11.1768 15.7626 11.4697 15.4697L14.1895 12.75H2C1.58579 12.75 1.25 12.4142 1.25 12C1.25 11.5858 1.58579 11.25 2 11.25H14.1895L11.4697 8.53027C11.1768 8.23738 11.1768 7.76262 11.4697 7.46973Z\",\n    fill: \"white\"\n  }));\n};\nconst AppleIcon = ({\n  style,\n  color\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M19.6647 17.7233C19.3774 18.3871 19.0374 18.9981 18.6434 19.5599C18.1064 20.3257 17.6667 20.8558 17.3279 21.1502C16.8026 21.6334 16.2398 21.8809 15.6371 21.8949C15.2045 21.8949 14.6827 21.7718 14.0753 21.522C13.466 21.2733 12.906 21.1502 12.394 21.1502C11.857 21.1502 11.281 21.2733 10.665 21.522C10.048 21.7718 9.55099 21.902 9.17098 21.9149C8.59305 21.9395 8.017 21.685 7.442 21.1502C7.07501 20.83 6.61598 20.2812 6.06607 19.5036C5.47607 18.6732 4.991 17.7104 4.61099 16.6126C4.20402 15.4269 4 14.2787 4 13.1672C4 11.8939 4.27507 10.7956 4.82603 9.87534C5.25904 9.13612 5.83509 8.553 6.55606 8.12493C7.27703 7.69686 8.05605 7.47871 8.89497 7.46476C9.35401 7.46476 9.95597 7.60678 10.704 7.88591C11.45 8.16598 11.9289 8.308 12.1389 8.308C12.2959 8.308 12.828 8.14193 13.73 7.81085C14.583 7.50381 15.3029 7.37668 15.8927 7.42676C17.4908 7.55577 18.6915 8.18591 19.49 9.32119C18.0607 10.1874 17.3537 11.4007 17.3677 12.9571C17.3806 14.1694 17.8203 15.1783 18.6845 15.9793C19.0761 16.3511 19.5134 16.6384 20 16.8425C19.8945 17.1486 19.7831 17.4418 19.6647 17.7233ZM15.9994 3.29661C15.9994 4.24683 15.6524 5.13404 14.9606 5.95524C14.1258 6.93148 13.116 7.4956 12.021 7.40659C12.007 7.29259 11.9989 7.17261 11.9989 7.04654C11.9989 6.13433 12.396 5.15809 13.101 4.35988C13.453 3.95573 13.9006 3.61968 14.4435 3.35162C14.9852 3.08755 15.4976 2.94151 15.9795 2.9165C15.9936 3.04353 15.9994 3.17057 15.9994 3.2966Z\",\n    fill: color || \"black\"\n  }));\n};\nconst GoogleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12.454 10.1818V14.0545H17.9457C17.7046 15.3 16.9809 16.3546 15.8956 17.0636L19.2073 19.5818C21.1368 17.8364 22.25 15.2728 22.25 12.2273C22.25 11.5183 22.1851 10.8364 22.0645 10.1819L12.454 10.1818Z\",\n    fill: \"#4285F4\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M6.73532 13.9033L5.9884 14.4637L3.34454 16.4818C5.02359 19.7454 8.46493 22 12.4538 22C15.2089 22 17.5189 21.1091 19.2073 19.5818L15.8956 17.0636C14.9865 17.6636 13.8267 18.0273 12.4538 18.0273C9.80074 18.0273 7.5466 16.2728 6.73949 13.9091L6.73532 13.9033Z\",\n    fill: \"#34A853\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M3.34455 7.51818C2.64885 8.86358 2.25 10.3818 2.25 11.9999C2.25 13.6181 2.64884 15.1364 3.34454 16.4818C3.34454 16.4908 6.73982 13.8999 6.73982 13.8999C6.53574 13.2999 6.41511 12.6636 6.41511 11.9998C6.41511 11.3361 6.53574 10.6998 6.73982 10.0998L3.34455 7.51818Z\",\n    fill: \"#FBBC05\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12.454 5.98181C13.9568 5.98181 15.2926 6.49089 16.3594 7.47272L19.2815 4.60912C17.5097 2.99097 15.2092 2 12.454 2C8.46514 2 5.0236 4.24544 3.34455 7.51818L6.73982 10.0998C7.54683 7.73613 9.80095 5.98181 12.454 5.98181Z\",\n    fill: \"#EA4335\"\n  }));\n};\nconst EnvelopeIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: 0.5,\n    d: \"M14.2002 3C18.3484 3 20.4222 3.00036 21.7109 4.31836C22.9997 5.63638 23 7.75737 23 12C23 16.2426 22.9997 18.3636 21.7109 19.6816C20.4222 20.9996 18.3484 21 14.2002 21H9.7998C5.65157 21 3.57777 20.9996 2.28906 19.6816C1.00034 18.3636 1 16.2426 1 12C1 7.75737 1.00034 5.63638 2.28906 4.31836C3.57777 3.00036 5.65158 3 9.7998 3H14.2002Z\",\n    fill: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M18.0723 6.76636C18.4223 6.47474 18.9427 6.52182 19.2344 6.87183C19.526 7.22176 19.4787 7.74221 19.1289 8.03394L16.7119 10.0476C15.7371 10.86 14.9474 11.519 14.25 11.9675C13.5235 12.4348 12.8152 12.7292 12 12.7292C11.185 12.7292 10.4774 12.4347 9.75098 11.9675C9.05351 11.5189 8.26308 10.8601 7.28809 10.0476L4.87207 8.03394C4.52208 7.74224 4.47492 7.22184 4.7666 6.87183C5.05831 6.52193 5.57873 6.47471 5.92871 6.76636L8.30371 8.74487C9.32984 9.59998 10.0421 10.192 10.6436 10.5789C11.2257 10.9533 11.6205 11.0798 12 11.0798C12.3796 11.0798 12.7751 10.9534 13.3574 10.5789C13.9589 10.192 14.6713 9.59987 15.6973 8.74487L18.0723 6.76636Z\",\n    fill: \"#FE375B\"\n  }));\n};\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const {\n    withAuthGuard\n  } = Hooks.withWebAuthGuard(/*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WebLoginLayout\"\n  }));\n  const styles = {\n    authContainer: {\n      flexDirection: 'row',\n      paddingTop: 18.5,\n      paddingBottom: 14.5\n    },\n    signInButton: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 16,\n      paddingHorizontal: 40,\n      gap: 8,\n      width: 172,\n      height: 56,\n      marginRight: 16,\n      backgroundColor: theme.theme.component.buttonVideochat.brand.bgDefault,\n      borderRadius: 999,\n      shadowColor: 'rgba(4, 6, 15, 0.08)',\n      shadowOffset: {\n        width: 0,\n        height: 8\n      },\n      shadowOpacity: 1,\n      shadowRadius: 24,\n      elevation: 8\n    },\n    signInButtonText: {\n      fontSize: 18,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.01,\n      color: theme.theme.component.button.brand.content,\n      fontFamily: theme.theme.typography.family.heading\n    },\n    iconButtonsContainer: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      width: 144,\n      height: 56\n    },\n    iconButton: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      width: 56,\n      height: 56,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: 999,\n      position: 'relative',\n      shadowColor: Utils.withOpacity(theme.theme.semantic.surface.regular.surface2, 0.08),\n      shadowOffset: {\n        width: 0,\n        height: 8\n      },\n      shadowOpacity: 1,\n      shadowRadius: 24,\n      elevation: 8\n    }\n  };\n  const onSignInButtonPress = withAuthGuard(() => {\n    console.log('Protected action executed');\n  });\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.authContainer\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onSignInButtonPress,\n    style: styles.signInButton\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.signInButtonText\n  }, t(\"buttonSignIn\")), /*#__PURE__*/React.createElement(UnionIcon, null)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.iconButtonsContainer\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: [styles.iconButton, {\n      marginRight: -12,\n      zIndex: 3\n    }]\n  }, /*#__PURE__*/React.createElement(GoogleIcon, null)), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: [styles.iconButton, {\n      marginRight: -12,\n      zIndex: 2\n    }]\n  }, /*#__PURE__*/React.createElement(AppleIcon, {\n    color: theme.theme.semantic.content.regular.primary\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: [styles.iconButton, {\n      zIndex: 1\n    }]\n  }, /*#__PURE__*/React.createElement(EnvelopeIcon, null))));\n};"},"WebNavbar":{"name":"WebNavbar","key":"db42a48f83ce7f81d12424fa56adb1129115d330583ecf471684254573b7d7fb","code":"return () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [activeTabWidth, setActiveTabWidth] = React.useState(null);\n  const [inactiveTabWidth, setInactiveTabWidth] = React.useState(null);\n  const styles = {\n    container: {\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      padding: 0,\n      gap: 12,\n      width: 276,\n      height: 48,\n      position: 'relative'\n    },\n    tabButton: {\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      padding: 0,\n      gap: 8,\n      height: 44\n    },\n    tabFrame: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      paddingVertical: 0,\n      gap: 8,\n      height: 36\n    },\n    tabText: {\n      fontFamily: 'Geologica',\n      fontStyle: 'normal',\n      fontWeight: 600,\n      fontSize: 26,\n      lineHeight: 36,\n      color: theme.theme.component.tabs.underlineTabs.contentDefault\n    },\n    tabTextActive: {\n      color: theme.theme.component.tabs.underlineTabs.contentActive\n    },\n    underline: {\n      height: 6,\n      backgroundColor: '#FE375B',\n      borderTopLeftRadius: 8,\n      borderTopRightRadius: 8,\n      borderBottomLeftRadius: 0,\n      borderBottomRightRadius: 0\n    },\n    underlineHidden: {\n      display: 'none'\n    }\n  };\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tabButton\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tabFrame,\n    onLayout: e => {\n      setActiveTabWidth(e.nativeEvent.layout.width);\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.tabText, styles.tabTextActive]\n  }, t(\"webNavbarTabVideo\"))), activeTabWidth !== null && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.underline, {\n      width: activeTabWidth\n    }]\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tabButton\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tabFrame,\n    onLayout: e => {\n      setInactiveTabWidth(e.nativeEvent.layout.width);\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.tabText\n  }, t(\"webNavbarTabFeed\"))), inactiveTabWidth !== null && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.underline, styles.underlineHidden, {\n      width: inactiveTabWidth\n    }]\n  })));\n};"},"CameraBottomPanel":{"name":"CameraBottomPanel","key":"22006f9a7399e9b2b4d22a728b872be452d516dab7f5cda2248c34e6cf202f84","code":"deps: BadgeSpins\nfunction _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst majorVersionIOS = parseInt(ReactNative.Platform.Version, 10);\nconst isAndroidNative = ReactNative.Platform.OS === 'android';\nconst Blur = ReactNative.Platform.OS === 'web' ? ExpoBlur.BlurView : isAndroidNative ? ReactNative.View : (ReactNative.Platform.OS === 'ios' && majorVersionIOS >= 26 ? ReactBlur?.LiquidGlassView : ReactBlur?.BlurView) ?? ReactNative.View;\n// const Blur = ReactNative.Platform.OS === 'web' ? ExpoBlur.BlurView : (ReactBlur?.BlurView ?? ReactNative.View);\nconst blurSurfaceProps = isAndroidNative ? {} : {\n  tint: 'dark',\n  blurType: 'dark',\n  blurAmount: 20,\n  overlayColor: '#00000066',\n  glassType: 'clear',\n  glassTintColor: '#000000',\n  glassOpacity: 0.05\n};\nconst LockIcon = ({\n  size = 16,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M8 1.33301C5.97496 1.33301 4.33333 2.97463 4.33333 4.99967V6.0338C3.43139 6.18844 2.74547 6.97185 2.74547 7.91797V11.8135C2.74547 12.8701 3.60201 13.7266 4.65861 13.7266H11.3414C12.398 13.7266 13.2545 12.8701 13.2545 11.8135V7.91797C13.2545 6.97185 12.5686 6.18844 11.6667 6.0338V4.99967C11.6667 2.97463 10.025 1.33301 8 1.33301ZM5.66667 5.99967V4.99967C5.66667 3.71099 6.71134 2.66634 8 2.66634C9.28866 2.66634 10.3333 3.71099 10.3333 4.99967V5.99967H5.66667ZM8.66667 9.33301C8.66667 8.96482 8.36819 8.66634 8 8.66634C7.63181 8.66634 7.33333 8.96482 7.33333 9.33301V10.333C7.33333 10.7012 7.63181 10.9997 8 10.9997C8.36819 10.9997 8.66667 10.7012 8.66667 10.333V9.33301Z\",\n  fill: color\n}));\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    container: {\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'center',\n      padding: 12\n    },\n    panelWrapper: {\n      width: '100%',\n      position: 'relative',\n      alignItems: 'center'\n    },\n    filtersPanelContainer: {\n      position: 'relative',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      maxWidth: '100%',\n      minWidth: 350,\n      width: 400,\n      paddingHorizontal: 12,\n      overflow: 'visible'\n    },\n    filtersPanel: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 0,\n      paddingHorizontal: 12,\n      borderRadius: 999,\n      backgroundColor: theme.theme.semantic.surface.alfa.static.stSurface4,\n      maxWidth: '100%',\n      width: '100%'\n    },\n    filtersPanelRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: 0,\n      maxWidth: '100%',\n      width: '100%'\n    },\n    filterItem: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 4,\n      paddingHorizontal: 8,\n      paddingVertical: 12,\n      overflow: 'hidden'\n    },\n    countryFilterItem: {\n      position: 'relative',\n      overflow: 'visible'\n    },\n    countryContent: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 4,\n      position: 'relative',\n      minWidth: 0\n    },\n    lockedCountryContent: {\n      opacity: 0.5\n    },\n    countryLock: {\n      position: 'absolute',\n      left: '75%',\n      top: 36,\n      marginLeft: -10,\n      width: 20,\n      height: 20,\n      alignItems: 'center',\n      justifyContent: 'center',\n      opacity: 0.5,\n      transform: [{\n        rotate: '-15deg'\n      }]\n    },\n    countryLockIcon: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary\n    },\n    filterEmoji: {\n      fontSize: 14,\n      lineHeight: 20,\n      minWidth: 16\n    },\n    filterText: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500\n    },\n    filterDivider: {\n      width: 1,\n      height: 16,\n      backgroundColor: theme.theme.semantic.surface.alfa.surface3,\n      marginHorizontal: 8\n    }\n  }), [theme]);\n  const filterSheetOpen = React.useRef(false);\n  const openFilters = React.useCallback(_async(function () {\n    if (filterSheetOpen.current) return;\n    filterSheetOpen.current = true;\n    return _continueIgnored(_finallyRethrows(function () {\n      return _awaitIgnored(Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n        name: \"filter\"\n      }), {\n        theme: Theme.isDark.value ? 'dark' : 'light',\n        props: {\n          style: {\n            maxWidth: 600\n          }\n        }\n      }));\n    }, function (_wasThrown, _result) {\n      filterSheetOpen.current = false;\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), [theme.isDark]);\n  const [filter] = Hooks.useBehaviorSubject(State.store.callFilterStore);\n  const session = State.api?.session?.useSession?.();\n  const hasSubscription = !!session?.subscription?.hasSubscription;\n  const sex = filter?.sex;\n  // Age filter tile disabled:\n  // const min = filter?.age?.min ?? 18;\n  // const max = filter?.age?.max ?? 80;\n  const countries = filter?.countries ?? [];\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.panelWrapper,\n    pointerEvents: \"auto\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.filtersPanelContainer\n  }, /*#__PURE__*/React.createElement(Blur, _extends({}, blurSurfaceProps, {\n    style: styles.filtersPanel\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.filtersPanelRow\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    styleContainer: {\n      flex: 1\n    },\n    style: styles.filterItem,\n    scale: 0.9,\n    onPress: openFilters\n  }, sex == null && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterEmoji\n  }, \"\\uD83D\\uDC69\\u200D\\uD83E\\uDDB0\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterEmoji\n  }, \"\\uD83D\\uDC68\\u200D\\uD83E\\uDDB1\")), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterText\n  }, t(\"filtersInterestEveryone\"))), sex === 'male' && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterEmoji\n  }, \"\\uD83D\\uDC68\\u200D\\uD83E\\uDDB1\")), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterText\n  }, t(\"filtersInterestMale\"))), sex === 'female' && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterEmoji\n  }, \"\\uD83D\\uDC69\\u200D\\uD83E\\uDDB0\")), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterText\n  }, t(\"filtersInterestFemale\")))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.filterDivider\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    styleContainer: {\n      flex: 1,\n      overflow: 'visible'\n    },\n    style: [styles.filterItem, styles.countryFilterItem],\n    scale: 0.9,\n    onPress: openFilters\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.countryContent, !hasSubscription && styles.lockedCountryContent]\n  }, !countries?.length && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterEmoji\n  }, \"\\uD83C\\uDF0E\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterText\n  }, t(\"filtersGeoWorldwide\"))), !!countries?.length && countries?.length === 1 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterEmoji\n  }, Components.toFlagEmoji(countries?.[0])), /*#__PURE__*/React.createElement(Components.DSCountryText, {\n    numberOfLines: 1,\n    code: countries?.[0],\n    style: styles.filterText\n  })), !!countries?.length && countries?.length > 1 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterEmoji\n  }, \"\\uD83C\\uDF0E\"), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.filterText\n  }, t(\"cameraBottomPanelCountries\", [countries?.length]))))))), !hasSubscription && /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\",\n    style: styles.countryLock\n  }, /*#__PURE__*/React.createElement(LockIcon, {\n    size: 16,\n    color: styles.countryLockIcon.color\n  })), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"BadgeSpins\"\n  }))));\n};"},"MetaPhotoComponent":{"name":"MetaPhotoComponent","key":"5c9ab6e1f018dd3c22c1e21d0663f204fc093d9490c9f32e0eb5f43d7a3b26ae","code":"deps: PhotoAccessDeniedModal\nfunction _empty() {}\nconst showPhotoAccessDeniedModal = _async(function () {\n  return _await(Sheet.showModal(/*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PhotoAccessDeniedModal\"\n  }), {\n    props: {\n      style: {\n        maxWidth: 600\n      }\n    }\n  }), function (shouldOpenSettings) {\n    if (!shouldOpenSettings) {\n      return;\n    }\n    return _catch(function () {\n      if (ReactNative.Platform.OS === 'web') {\n        return;\n      }\n      return _awaitIgnored(ReactNative.Linking.openSettings());\n    }, function (error) {\n      console.error('Error opening settings:', error);\n    });\n  });\n});\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continue(value, then) {\n  return value && value.then ? value.then(then) : then(value);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nreturn ({\n  photo,\n  index,\n  isLoading: isLoadingParent\n}) => {\n  const theme = Theme.useTheme();\n  const [hash, setHash] = React.useState(null);\n  const handlePick = Components.useCallbackLoader(_async(function () {\n    let _exit = false;\n    return _continue(_catch(function () {\n      return _await(ImagePicker.requestMediaLibraryPermissionsAsync(), function ({\n        status\n      }) {\n        if (status !== 'granted' && status !== 'undetermined' && status != null) {\n          showPhotoAccessDeniedModal();\n          _exit = true;\n        }\n      });\n    }, function (error) {\n      console.error(error);\n    }), function (_result2) {\n      return _exit ? _result2 : _await(ImagePicker.launchImageLibraryAsync({\n        mediaTypes: [\"images\"],\n        allowsEditing: true,\n        aspect: [9, 16],\n        quality: 1\n      }), function (result) {\n        if (result.canceled || !result.assets[0]) return;\n        return _finallyRethrows(function () {\n          return _catch(function () {\n            const image = result.assets[0];\n            return _await(Utils.generateThumbhash(image.uri), function (generatedHash) {\n              setHash(generatedHash);\n              return _await(Utils.compressLargeImage(image.uri, 1600), function (imageUri) {\n                const form = new FormData();\n                form.append(\"order\", String(index + 1));\n                const photoName = `photo_${index}_${Date.now()}.jpg`;\n                return _await(Utils.buildFormFile(imageUri, photoName, 'image/jpeg'), function (photoFile) {\n                  if (!photoFile) {\n                    throw new Error('File is required');\n                  }\n                  if (typeof Blob !== 'undefined' && photoFile instanceof Blob) {\n                    form.append('file', photoFile, photoName);\n                  } else {\n                    form.append('file', photoFile);\n                  }\n                  return _await(State.post('/api/login/profile/photo', form, \"json\"), function ({\n                    photos\n                  }) {\n                    State.state.session.next({\n                      ...State.state.session.value,\n                      photos\n                    });\n                  });\n                });\n              });\n            });\n          }, function (error) {\n            console.error(error);\n          });\n        }, function (_wasThrown, _result3) {\n          setHash(null);\n          return _rethrow(_wasThrown, _result3);\n        });\n      });\n    });\n  }), [index]);\n  const handleRemove = Components.useCallbackLoader(_async(function () {\n    if (!photo) return;\n    return _continueIgnored(_catch(function () {\n      return _await(State.post(\"/api/login/profile/photo/remove\", {\n        uid: photo.uid\n      }, \"json\"), function ({\n        photos\n      }) {\n        State.state.session.next({\n          ...State.state.session.value,\n          photos\n        });\n      });\n    }, function (error) {\n      console.error(error);\n    }));\n  }), [photo]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1\n    }\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: handlePick,\n    styleContainer: {\n      flex: 1\n    },\n    style: {\n      borderRadius: 12,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      overflow: \"hidden\",\n      justifyContent: \"center\",\n      alignItems: \"center\",\n      position: 'relative',\n      width: \"100%\",\n      height: \"100%\"\n    }\n  }, photo?.path || hash ? /*#__PURE__*/React.createElement(Image, {\n    source: !hash && photo?.path ? State.getUrl(`/file/photo/${photo.path}`) : undefined,\n    placeholder: hash || photo?.hash ? {\n      thumbhash: hash ?? photo.hash\n    } : undefined,\n    placeholderContentFit: \"cover\",\n    contentFit: \"cover\",\n    style: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      bottom: 0,\n      right: 0,\n      justifyContent: 'center',\n      alignItems: 'center',\n      width: \"100%\",\n      height: \"100%\"\n    }\n  }) : /*#__PURE__*/React.createElement(Assets.Upload, {\n    size: 32,\n    style: {\n      color: theme.theme.component.photoUploader.contentDefault\n    }\n  }), index === 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      position: \"absolute\",\n      top: 8,\n      left: 8,\n      borderRadius: 999,\n      backgroundColor: theme.theme.component.badge.transparent.bg,\n      flexDirection: \"row\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      paddingVertical: 4,\n      paddingHorizontal: 8,\n      gap: 2,\n      zIndex: 3\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: {\n      fontWeight: 500,\n      fontSize: 12,\n      lineHeight: 12,\n      color: theme.theme.component.badge.transparent.content,\n      textAlign: \"center\"\n    }\n  }, \"Avatar\"))), !!photo && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: handleRemove,\n    styleContainer: {\n      position: \"absolute\",\n      top: 8,\n      right: 8,\n      width: 16,\n      height: 16,\n      borderRadius: 12,\n      justifyContent: \"center\",\n      alignItems: \"center\",\n      zIndex: 1\n    },\n    hitSlop: {\n      top: 20,\n      bottom: 20,\n      left: 20,\n      right: 20\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    size: 20,\n    style: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary\n    }\n  })));\n};"},"Status":{"name":"Status","key":"08d87db91bb0f9651d0488fda7a3aadeeefcc2c0a0580de2412664be571cc3ca","code":"return ({\n  status,\n  simple\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const rating = parseInt(status || 0, 10);\n  const TIERS = React.useMemo(() => [{\n    key: 'bronze',\n    title: t('statusTierBronze'),\n    min: 0,\n    max: 550,\n    text: theme.theme.component.badge.status.bronze.content,\n    bg: theme.theme.component.badge.status.bronze.bg1,\n    simple: theme.theme.semantic.content.status.bronze2,\n    icon: 'bronze.webp'\n  }, {\n    key: 'silver',\n    title: t('statusTierSilver'),\n    min: 550,\n    max: 1250,\n    text: theme.theme.component.badge.status.silver.content,\n    bg: theme.theme.component.badge.status.silver.bg1,\n    simple: theme.theme.semantic.content.status.silver2,\n    icon: 'silver.webp'\n  }, {\n    key: 'gold',\n    title: t('statusTierGold'),\n    min: 1250,\n    max: 1950,\n    text: theme.theme.component.badge.status.gold.content,\n    bg: theme.theme.component.badge.status.gold.bg1,\n    simple: theme.theme.semantic.content.status.gold2,\n    icon: 'gold.webp'\n  }, {\n    key: 'emerald',\n    title: t('statusTierEmerald'),\n    min: 1950,\n    max: 3450,\n    text: theme.theme.component.badge.status.emerald.content,\n    bg: theme.theme.component.badge.status.emerald.bg1,\n    simple: theme.theme.semantic.content.status.emerald2,\n    icon: 'emerald.webp'\n  }, {\n    key: 'diamond',\n    title: t('statusTierDiamond'),\n    min: 3450,\n    max: Number.MAX_SAFE_INTEGER,\n    text: theme.theme.component.badge.status.diamond.content,\n    bg: theme.theme.component.badge.status.diamond.bg1,\n    simple: theme.theme.semantic.content.status.diamond2,\n    icon: 'diamond.webp'\n  }], [t]);\n  const currentTier = React.useMemo(() => TIERS.find(t => rating >= t.min && rating <= t.max) || TIERS[0], [rating, TIERS]);\n  const styles = React.useMemo(() => ({\n    container: {\n      gap: 4,\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 6,\n      minHeight: 30,\n      borderRadius: 100,\n      backgroundColor: currentTier.bg\n    },\n    containerSimple: {\n      gap: 4,\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    icon: {\n      width: 18,\n      height: 18\n    },\n    title: {\n      fontFamily: theme.theme.typography.family.subtitle,\n      color: currentTier.text,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 600,\n      includeFontPadding: false\n    },\n    titleSimple: {\n      fontFamily: theme.theme.typography.family.subtitle,\n      color: currentTier.simple,\n      fontSize: 12,\n      lineHeight: 12,\n      fontWeight: 600\n    },\n    iconTablet: {\n      width: 20,\n      height: 20\n    },\n    titleTablet: {\n      maxWidth: 112\n    }\n  }), [currentTier]);\n  if (simple) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.containerSimple\n    }, /*#__PURE__*/React.createElement(Components.DSImage, {\n      hideProgress: true,\n      style: [styles.icon],\n      source: State.getUrl(`/api/component/assets/status/${currentTier.icon}`)\n    }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.titleSimple]\n    }, currentTier.title));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: [styles.icon, isTablet ? styles.iconTablet : null],\n    source: State.getUrl(`/api/component/assets/status/${currentTier.icon}`)\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.title, isTablet ? styles.titleTablet : null],\n    numberOfLines: 1\n  }, currentTier.title));\n};"},"Country":{"name":"Country","key":"7e029f76325e25d416cb273f89d9af634a3d42edcd251c90f79f9f4e11039aba","code":"return ({\n  country\n}) => {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    container: {\n      gap: 6,\n      width: \"auto\",\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 6,\n      minHeight: 30,\n      backgroundColor: theme.theme.component.badge.regular.bg,\n      borderRadius: 100\n    },\n    flagWrapper: {\n      width: 18,\n      height: 18,\n      borderRadius: 14,\n      justifyContent: 'center',\n      alignItems: 'center',\n      overflow: 'hidden'\n    },\n    title: {\n      color: theme.theme.component.badge.regular.content,\n      fontFamily: theme.theme.typography.family.subtitle,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: 600,\n      includeFontPadding: false,\n      maxWidth: 76\n    }\n  }), [theme.theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.flagWrapper\n  }, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: country,\n    size: 20\n  })), /*#__PURE__*/React.createElement(Components.DSCountryText, {\n    code: country,\n    style: styles.title,\n    numberOfLines: 1\n  }));\n};"},"AddButton":{"name":"AddButton","key":"3723786b8fa175c177b7e8688150c9ca4909a707098cc8f6436c59698460d1ff","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst AddIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"18\",\n    height: \"18\",\n    viewBox: \"0 0 16 16\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.G, {\n    \"clip-path\": \"url(#clip0_1076_8193)\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M8 0.833008C11.9578 0.833184 15.1658 4.04222 15.166 8C15.1658 11.9578 11.9578 15.1658 8 15.166C4.04222 15.1658 0.833184 11.9578 0.833008 8C0.833184 4.04222 4.04222 0.833184 8 0.833008ZM8 1.83301C4.5945 1.83318 1.83318 4.5945 1.83301 8C1.83318 11.4055 4.5945 14.1658 8 14.166C11.4055 14.1658 14.1658 11.4055 14.166 8C14.1658 4.5945 11.4055 1.83318 8 1.83301Z\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8 5.5C8.27614 5.5 8.5 5.72386 8.5 6V7.5H10C10.2761 7.5 10.5 7.72387 10.5 8C10.5 8.27614 10.2761 8.5 10 8.5H8.5V10C8.5 10.2761 8.27614 10.5 8 10.5C7.72386 10.5 7.5 10.2761 7.5 10V8.5H6C5.72386 8.5 5.5 8.27614 5.5 8C5.50001 7.72387 5.72386 7.5 6 7.5H7.5V6C7.5 5.72386 7.72386 5.5 8 5.5Z\",\n    fill: \"currentColor\"\n  })), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n    id: \"clip0_1076_8193\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    width: \"18\",\n    height: \"18\",\n    fill: \"currentColor\"\n  }))));\n};\nreturn props => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    button: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '100%'\n    },\n    buttonBody: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6,\n      backgroundColor: theme.theme.component.button.secondary.bgDefault,\n      minHeight: 36,\n      borderRadius: 256,\n      padding: 6\n    },\n    buttonIcon: {\n      color: theme.theme.component.button.secondary.content\n    },\n    buttonText: {\n      fontFamily: theme.theme.typography.family.heading,\n      color: theme.theme.component.button.secondary.content,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 600\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, _extends({\n    feedback: true,\n    styleContainer: styles.button,\n    style: styles.buttonBody\n  }, props), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t('add')), /*#__PURE__*/React.createElement(AddIcon, {\n    style: styles.buttonIcon\n  }));\n};"},"PhotoButton":{"name":"PhotoButton","key":"be5be814dc0d2bc17135a5f6f2eb396185075373b27bc7a4bb122f38ccd414be","code":"const UploadIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M17.5 2C19.6213 2 20.6818 2.00017 21.3408 2.65918C21.9998 3.31819 22 4.37868 22 6.5C22 8.62132 21.9998 9.68181 21.3408 10.3408C20.6818 10.9998 19.6213 11 17.5 11C15.3787 11 14.3182 10.9998 13.6592 10.3408C13.0002 9.68181 13 8.62132 13 6.5C13 4.37868 13.0002 3.31819 13.6592 2.65918C14.3182 2.00017 15.3787 2 17.5 2ZM17.5 3.75C17.0858 3.75 16.75 4.08579 16.75 4.5V5.75H15.5C15.0858 5.75 14.75 6.08579 14.75 6.5C14.75 6.91421 15.0858 7.25 15.5 7.25H16.75V8.5C16.75 8.91421 17.0858 9.25 17.5 9.25C17.9142 9.25 18.25 8.91421 18.25 8.5V7.25H19.5C19.9142 7.25 20.25 6.91421 20.25 6.5C20.25 6.08579 19.9142 5.75 19.5 5.75H18.25V4.5C18.25 4.08579 17.9142 3.75 17.5 3.75Z\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M11.3018 2C11.6869 1.9996 11.9998 2.31214 12 2.69727C12 3.08258 11.6871 3.3951 11.3018 3.39551C9.44743 3.39747 8.06736 3.41462 6.98926 3.55957C5.80013 3.71946 5.0836 4.02382 4.55371 4.55371C4.02382 5.0836 3.71946 5.80013 3.55957 6.98926C3.39699 8.19854 3.39551 9.7877 3.39551 12C3.39551 12.2701 3.39519 12.5313 3.39551 12.7842L4.32715 11.9697C5.17482 11.228 6.45255 11.27 7.24902 12.0664L11.2393 16.0576C11.8785 16.6967 12.8844 16.7833 13.624 16.2637L13.9014 16.0693C14.9658 15.3213 16.406 15.408 17.373 16.2783L20.0068 18.6475C20.2718 18.0909 20.4287 17.3595 20.5127 16.3281C20.5919 15.3562 20.603 14.1757 20.6045 12.6982C20.6049 12.3129 20.9174 12 21.3027 12C21.6879 12.0002 22.0004 12.3131 22 12.6982C21.9985 14.1677 21.9868 15.4166 21.9033 16.4414C21.8064 17.6307 21.6085 18.6248 21.1641 19.4502C20.968 19.8143 20.7269 20.1403 20.4336 20.4336C19.6012 21.266 18.5402 21.6426 17.1963 21.8232C15.8834 21.9997 14.2008 22 12.0537 22H11.9463C9.79923 22 8.11662 21.9997 6.80371 21.8232C5.45977 21.6426 4.39879 21.266 3.56641 20.4336C2.8285 19.6957 2.44777 18.777 2.24512 17.6377C2.04605 16.5185 2.00952 15.1256 2.00195 13.3965C2.00003 12.9567 2 12.4916 2 12.001V11.9463C1.99999 9.79923 2.00027 8.11662 2.17676 6.80371C2.35745 5.45977 2.73403 4.39879 3.56641 3.56641C4.39879 2.73403 5.45977 2.35745 6.80371 2.17676C7.97129 2.0198 9.47343 2.00191 11.3018 2Z\",\n    fill: \"currentColor\"\n  }));\n};\nconst CloseIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n    fill: \"currentColor\"\n  }));\n};\nreturn ({\n  style,\n  index,\n  photo,\n  hovered,\n  dragging,\n  onUpload,\n  onOpen,\n  onLongPress,\n  onRemove\n}) => {\n  const theme = Theme.useTheme();\n  const [error, setError] = React.useState(null);\n  const [isLoadingLocal, setIsLoading] = React.useState(false);\n  const [hash, setHash] = React.useState(null);\n  const t = Locale.useTranslation();\n  const hoveredOrDragging = hovered || dragging;\n  const [hoveredOrDraggingDebounced, setHoveredOrDraggingDebounced] = React.useState(hoveredOrDragging);\n  const hoveredOrDraggingTimeoutRef = React.useRef(null);\n  React.useEffect(() => {\n    if (hoveredOrDraggingTimeoutRef.current) {\n      clearTimeout(hoveredOrDraggingTimeoutRef.current);\n      hoveredOrDraggingTimeoutRef.current = null;\n    }\n    if (hoveredOrDragging) {\n      setHoveredOrDraggingDebounced(true);\n      return;\n    }\n    hoveredOrDraggingTimeoutRef.current = setTimeout(() => {\n      setHoveredOrDraggingDebounced(false);\n      hoveredOrDraggingTimeoutRef.current = null;\n    }, 500);\n    return () => {\n      if (hoveredOrDraggingTimeoutRef.current) {\n        clearTimeout(hoveredOrDraggingTimeoutRef.current);\n        hoveredOrDraggingTimeoutRef.current = null;\n      }\n    };\n  }, [hoveredOrDragging]);\n  const styles = React.useMemo(() => ({\n    button: {\n      gap: 6,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.semantic.surface.regular.surface2,\n      borderRadius: 12,\n      overflow: 'hidden',\n      width: '100%',\n      height: '100%'\n    },\n    buttonIcon: {\n      color: theme.theme.component.button.brand.bgDefault\n    },\n    imageContainer: {\n      width: '100%',\n      height: '100%'\n    },\n    image: {\n      width: '100%',\n      height: '100%',\n      objectFit: 'cover',\n      borderRadius: 12\n    },\n    imageFade: {\n      position: 'absolute',\n      top: 0,\n      right: 0,\n      left: 0,\n      bottom: 0,\n      borderRadius: 12,\n      zIndex: 2,\n      pointerEvents: 'none'\n    },\n    avatarBadge: {\n      position: 'absolute',\n      height: 18,\n      left: 4,\n      top: 4,\n      backgroundColor: theme.theme.component.badge.transparent.bg,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 4,\n      gap: 2,\n      zIndex: 3\n    },\n    avatarBadgeText: {\n      height: 12,\n      fontFamily: theme.theme.typography.family.heading,\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 12,\n      textAlign: 'center',\n      letterSpacing: -0.3,\n      color: theme.theme.component.badge.transparent.content\n    },\n    closeButton: {\n      position: 'absolute',\n      top: 2,\n      right: 2,\n      width: 24,\n      height: 24,\n      zIndex: 10,\n      elevation: 10\n    },\n    closeIcon: {\n      color: '#FFFFFF'\n    }\n  }), [theme]);\n  return !!photo ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.button, style]\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    noloading: true,\n    feedback: true,\n    disabled: hoveredOrDraggingDebounced,\n    styleContainer: {\n      width: '100%',\n      height: '100%'\n    },\n    style: styles.imageContainer,\n    onPress: (_, ref) => !hoveredOrDraggingDebounced && onOpen?.(index, ref),\n    onLongPress: (_, ref) => !hoveredOrDraggingDebounced && onLongPress?.(index, ref)\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: [styles.image, hovered ? {\n      opacity: 0.2\n    } : null, {\n      transform: [{\n        scale: dragging ? 0.8 : 1.0\n      }]\n    }],\n    source: State.getUrl(`/file/photo/${photo.path}`),\n    thumbhash: photo?.hash,\n    cachePolicy: \"memory-disk\"\n  })), onRemove && /*#__PURE__*/React.createElement(LinearGradient, {\n    start: {\n      x: 1,\n      y: 0\n    },\n    end: {\n      x: 0.35,\n      y: 0.65\n    },\n    colors: ['rgba(4, 6, 15, 1)', 'rgba(4, 6, 15, 0)'],\n    locations: [0.03, 0.32],\n    style: styles.imageFade,\n    pointerEvents: \"none\"\n  }), index === 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.avatarBadgeText\n  }, t('profileAvatarHint'))), onRemove && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.closeButton,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    disabled: hoveredOrDraggingDebounced,\n    onPress: e => {\n      if (hoveredOrDraggingDebounced) return;\n      e?.stopPropagation?.();\n      onRemove(index);\n    },\n    style: {\n      width: 24,\n      height: 24,\n      alignItems: 'center',\n      justifyContent: 'center',\n      zIndex: 10\n    }\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.closeIcon\n  })))) : /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    disabled: hoveredOrDraggingDebounced,\n    style: [styles.button, style],\n    onPress: (_, ref) => {\n      if (hoveredOrDraggingDebounced) return;\n      onUpload?.(index, ref);\n    }\n  }, /*#__PURE__*/React.createElement(UploadIcon, {\n    style: styles.buttonIcon\n  }));\n};"},"PhotoAccessDeniedModal":{"name":"PhotoAccessDeniedModal","key":"6f964aa7283e9ed8dfbc578935dabeb999b61ae187da60ba64c547d44b8171ae","code":"const UploadIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"24\",\n    height: \"24\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M17.5 2C19.6213 2 20.6818 2.00017 21.3408 2.65918C21.9998 3.31819 22 4.37868 22 6.5C22 8.62132 21.9998 9.68181 21.3408 10.3408C20.6818 10.9998 19.6213 11 17.5 11C15.3787 11 14.3182 10.9998 13.6592 10.3408C13.0002 9.68181 13 8.62132 13 6.5C13 4.37868 13.0002 3.31819 13.6592 2.65918C14.3182 2.00017 15.3787 2 17.5 2ZM17.5 3.75C17.0858 3.75 16.75 4.08579 16.75 4.5V5.75H15.5C15.0858 5.75 14.75 6.08579 14.75 6.5C14.75 6.91421 15.0858 7.25 15.5 7.25H16.75V8.5C16.75 8.91421 17.0858 9.25 17.5 9.25C17.9142 9.25 18.25 8.91421 18.25 8.5V7.25H19.5C19.9142 7.25 20.25 6.91421 20.25 6.5C20.25 6.08579 19.9142 5.75 19.5 5.75H18.25V4.5C18.25 4.08579 17.9142 3.75 17.5 3.75Z\",\n    fill: \"currentColor\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M11.3018 2C11.6869 1.9996 11.9998 2.31214 12 2.69727C12 3.08258 11.6871 3.3951 11.3018 3.39551C9.44743 3.39747 8.06736 3.41462 6.98926 3.55957C5.80013 3.71946 5.0836 4.02382 4.55371 4.55371C4.02382 5.0836 3.71946 5.80013 3.55957 6.98926C3.39699 8.19854 3.39551 9.7877 3.39551 12C3.39551 12.2701 3.39519 12.5313 3.39551 12.7842L4.32715 11.9697C5.17482 11.228 6.45255 11.27 7.24902 12.0664L11.2393 16.0576C11.8785 16.6967 12.8844 16.7833 13.624 16.2637L13.9014 16.0693C14.9658 15.3213 16.406 15.408 17.373 16.2783L20.0068 18.6475C20.2718 18.0909 20.4287 17.3595 20.5127 16.3281C20.5919 15.3562 20.603 14.1757 20.6045 12.6982C20.6049 12.3129 20.9174 12 21.3027 12C21.6879 12.0002 22.0004 12.3131 22 12.6982C21.9985 14.1677 21.9868 15.4166 21.9033 16.4414C21.8064 17.6307 21.6085 18.6248 21.1641 19.4502C20.968 19.8143 20.7269 20.1403 20.4336 20.4336C19.6012 21.266 18.5402 21.6426 17.1963 21.8232C15.8834 21.9997 14.2008 22 12.0537 22H11.9463C9.79923 22 8.11662 21.9997 6.80371 21.8232C5.45977 21.6426 4.39879 21.266 3.56641 20.4336C2.8285 19.6957 2.44777 18.777 2.24512 17.6377C2.04605 16.5185 2.00952 15.1256 2.00195 13.3965C2.00003 12.9567 2 12.4916 2 12.001V11.9463C1.99999 9.79923 2.00027 8.11662 2.17676 6.80371C2.35745 5.45977 2.73403 4.39879 3.56641 3.56641C4.39879 2.73403 5.45977 2.35745 6.80371 2.17676C7.97129 2.0198 9.47343 2.00191 11.3018 2Z\",\n    fill: \"currentColor\"\n  }));\n};\nreturn () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const styles = React.useMemo(() => ({\n    container: {\n      width: '100%',\n      paddingTop: 16,\n      paddingHorizontal: 16,\n      paddingBottom: 16,\n      gap: 8\n    },\n    iconWrap: {\n      width: 84,\n      height: 84,\n      borderRadius: 999,\n      backgroundColor: 'rgba(254,55,91,0.12)',\n      alignItems: 'center',\n      justifyContent: 'center',\n      alignSelf: 'center',\n      marginBottom: 4\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    description: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontFamily: theme.theme.typography.family.body,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    buttonsRow: {\n      flexDirection: 'row',\n      gap: 8,\n      width: '100%',\n      marginTop: 8\n    },\n    button: {\n      flex: 1,\n      borderRadius: 12,\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 12,\n      minHeight: 44\n    },\n    buttonReject: {\n      backgroundColor: 'rgba(4,6,15,0.08)'\n    },\n    buttonAccept: {\n      backgroundColor: '#FE375B'\n    },\n    buttonText: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 600,\n      letterSpacing: -0.14\n    },\n    buttonTextReject: {\n      color: theme.theme.semantic.content.regular.primary\n    },\n    buttonTextAccept: {\n      color: '#FFFFFF'\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.iconWrap\n  }, /*#__PURE__*/React.createElement(UploadIcon, {\n    style: {\n      color: '#FE375B'\n    }\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('photoAccessDeniedTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('photoAccessDeniedDescription')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonsRow\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    title: t('cancel'),\n    type: \"ghost\",\n    size: \"S\",\n    onPress: () => sheet.close(false),\n    style: [styles.button, styles.buttonReject],\n    textStyle: [styles.buttonText, styles.buttonTextReject]\n  }), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    title: t('photoAccessDeniedSettingsButton'),\n    type: \"brand\",\n    size: \"S\",\n    onPress: () => sheet.close(true),\n    style: [styles.button, styles.buttonAccept],\n    textStyle: [styles.buttonText, styles.buttonTextAccept]\n  })));\n};"},"VideoChat":{"name":"VideoChat","key":"bca72e4b825d8618fbf6b8edd8a11b5a686ca814b4094cf526b589738c006594","code":"deps: WelcomeSection, WelcomeBackdrop, Camera, CameraOverlay, PipLocalCamera, Peer, PeerOverlay, NotEnoughGemsModal, EmptySearchModal, VideoChatPaywall, GuestRegisterSheet, VideoChatGuestBar, UserPanelOverlay, WithAppear, CallTopControls, SearchCancelButton\nfunction _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    flexDirection: 'column',\n    justifyContent: 'center',\n    alignItems: 'center'\n  },\n  overlay: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    justifyContent: 'center',\n    alignItems: 'center',\n    pointerEvents: 'none'\n  }\n});\nconst runPressHaptic = () => {\n  try {\n    if (ReactNative.Platform.OS === 'android') {\n      Haptics?.performAndroidHapticsAsync?.(Haptics?.AndroidHaptics?.Keyboard_Tap)?.catch(() => {});\n    } else {\n      Haptics?.impactAsync?.(Haptics?.ImpactFeedbackStyle?.Light)?.catch(() => {});\n    }\n  } catch {\n    // ignore haptics errors\n  }\n};\nconst fullSizeStyle = {\n  width: '100%',\n  height: '100%'\n};\nconst ResponsiveCameraOverlay = props => {\n  const {\n    isHorizontal\n  } = Components.useVideoGrid();\n  return /*#__PURE__*/React.createElement(LazyComponent, _extends({\n    name: \"CameraOverlay\"\n  }, props, {\n    showUserPanel: !isHorizontal,\n    showSideGift: !isHorizontal\n  }));\n};\nconst HorizontalLeftUserPanelOverlay = ({\n  peer,\n  visible\n}) => {\n  const {\n    isHorizontal\n  } = Components.useVideoGrid();\n  if (!isHorizontal || !visible) return null;\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserPanelOverlay\",\n    peer: peer,\n    centered: true,\n    showInlineGift: true\n  });\n};\nconst Container = React.memo(() => {\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const [isSearching] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const [isPipLocal] = Hooks.useBehaviorSubject(State.state.isPipLocal);\n  const [peers] = Hooks.useBehaviorSubject(State.state.peers);\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const [videoGridSwipeBlockers] = Hooks.useBehaviorSubject(State.state.storage.videoGridSwipeBlockers);\n  const tapStartAnimationAtRef = React.useRef(0);\n  const activePeer = React.useMemo(() => {\n    if (!peers?.length) return null;\n    if (call?.sessionId) {\n      return peers.find(peer => peer.sessionId === call.sessionId) ?? peers[0];\n    }\n    return peers[0];\n  }, [peers, call?.sessionId]);\n  const shouldShowPaywall = State.api?.call?.usePayWall?.() ?? false;\n  const hasActiveCall = call != null;\n  const hasActiveRoomPeer = call?.room != null && activePeer != null;\n  const isBlackLine = ReactNative.Platform.OS === 'web' && isTablet;\n  const isStopPip = isSearching || hasActiveCall || isTablet || shouldShowPaywall || isPipLocal;\n  const isVideoGridSwipeBlocked = React.useMemo(() => Object.keys(videoGridSwipeBlockers ?? {}).length > 0, [videoGridSwipeBlockers]);\n  const handlePaywallTimeout = React.useCallback(() => {\n    State.api?.call?.resetPayWall?.();\n    // Continue the spin that was paused by the paywall. Rechecking here would\n    // count the same user action twice and shift every following paywall.\n    manifest().call.onTryStart(false, {\n      countPaywallSpin: false\n    });\n    runPressHaptic();\n  }, []);\n  const handlePaywallPress = React.useCallback(() => {\n    State.api?.call?.resetPayWall?.();\n    manifest().call.onStop();\n    // Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('SubPay'));\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"subPay\",\n      isModal: true\n    }), {\n      // Use global app theme, not the current page scoped theme.\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: false,\n        swipeDismissibleUp: false,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, []);\n  const handlePaywallCancel = React.useCallback(() => {\n    State.api?.call?.resetPayWall?.();\n    manifest().call.onStop();\n  }, []);\n  const allowedSwipeDirection = React.useMemo(() => ({\n    down: false,\n    up: false,\n    left: shouldShowPaywall || isVideoGridSwipeBlocked ? false : !isSearching || hasActiveCall,\n    right: shouldShowPaywall || isVideoGridSwipeBlocked ? false : isSearching || hasActiveCall\n  }), [isSearching, hasActiveCall, shouldShowPaywall, isVideoGridSwipeBlocked]);\n  const {\n    bottom,\n    top\n  } = Components.useSquareContainer();\n  const safeAreaWindow = SafeArea.useSafeAreaInsets();\n  const paddingBottomAnimated = Navigation.useTabBarSizeAnimated();\n  const paddingBottom = Hooks.useAnimatedState(paddingBottomAnimated);\n  const safeArea = React.useMemo(() => ({\n    top: (safeAreaWindow?.top ?? 0) - top,\n    bottom: isBlackLine ? 0 : paddingBottom - bottom,\n    left: safeAreaWindow?.left ?? 0,\n    right: safeAreaWindow?.right ?? 0\n  }), [isBlackLine, bottom, top, paddingBottom, safeAreaWindow?.left, safeAreaWindow?.right, safeAreaWindow?.top, safeAreaWindow?.bottom]);\n  const handleStart = React.useCallback(_async(function () {\n    runPressHaptic();\n    return _awaitIgnored(manifest().call.onTryStart());\n  }), []);\n  const handleStop = React.useCallback(_async(function () {\n    runPressHaptic();\n    return _awaitIgnored(manifest().call.onStop());\n  }), []);\n  const handleLeft = React.useCallback(() => {\n    if (Date.now() - tapStartAnimationAtRef.current < 3000) {\n      tapStartAnimationAtRef.current = 0;\n      return;\n    }\n    handleStart();\n  }, [handleStart]);\n  const handleRight = React.useCallback(() => {\n    handleStop();\n  }, [handleStop]);\n  const handlePress = React.useCallback(() => {\n    tapStartAnimationAtRef.current = Date.now();\n    handleStart();\n    Components.nextAnimation();\n  }, [handleStart]);\n  const backdrop = React.useCallback((direction, progress, isLoading) => {\n    return /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n      style: styles.container,\n      pointerEvents: \"none\"\n    }, /*#__PURE__*/React.createElement(Views.BackdropSection, {\n      direction: direction,\n      isLoading: isLoading,\n      progress: progress\n    }));\n  }, []);\n  const peerItems = React.useMemo(() => (peers ?? []).map(peer => /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Peer\",\n    key: peer.sessionId ?? peer.id,\n    peer: peer\n  })), [peers]);\n  const welcomeAppearDelay = (isSearching || shouldShowPaywall) && tapStartAnimationAtRef.current > 0 ? 300 : 100;\n  const currentWelcome = React.useMemo(() => shouldShowPaywall && isTablet ? /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    translateY: 0,\n    duration: 500,\n    style: fullSizeStyle\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatPaywall\",\n    timeout: 3000,\n    onPress: handlePaywallPress,\n    onTimeout: handlePaywallTimeout,\n    onCancel: handlePaywallCancel,\n    style: fullSizeStyle\n  })) : /*#__PURE__*/React.createElement(Components.DSPressable, {\n    onPress: handlePress,\n    styleContainer: styles.overlay,\n    style: styles.overlay,\n    pointerEvents: isSearching ? 'none' : 'auto'\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 0.95,\n    translateY: 0,\n    duration: 500,\n    style: fullSizeStyle,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WelcomeSection\",\n    isSearching: isSearching || shouldShowPaywall,\n    appearDelay: welcomeAppearDelay\n  }))), [handlePaywallCancel, handlePaywallPress, handlePaywallTimeout, handlePress, isSearching, isTablet, shouldShowPaywall]);\n  const currentWelcomeProp = React.useMemo(() => isStopPip && !hasActiveRoomPeer ? currentWelcome : null, [currentWelcome, hasActiveRoomPeer, isStopPip]);\n  const currentLeftBack = React.useMemo(() => /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 0.95,\n    translateY: 0,\n    duration: 500,\n    style: fullSizeStyle\n  }, /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WelcomeBackdrop\",\n    visible: shouldShowPaywall || isSearching && !hasActiveCall\n  }))), [hasActiveCall, isSearching, shouldShowPaywall]);\n  const currentCameraItems = React.useMemo(() => !isPipLocal ? [/*#__PURE__*/React.createElement(LazyComponent, {\n    key: \"camera\",\n    name: \"Camera\"\n  })] : [], [isPipLocal]);\n  const currentLeftOverlay = React.useMemo(() => !shouldShowPaywall ? /*#__PURE__*/React.createElement(HorizontalLeftUserPanelOverlay, {\n    peer: activePeer,\n    visible: isSearching || hasActiveCall\n  }) : null, [activePeer, hasActiveCall, isSearching, shouldShowPaywall]);\n  const currentRightOverlay = React.useMemo(() => /*#__PURE__*/React.createElement(React.Fragment, null, !isStopPip && currentWelcome, !isPipLocal && !shouldShowPaywall && /*#__PURE__*/React.createElement(ResponsiveCameraOverlay, {\n    peer: activePeer,\n    activeCall: call,\n    isSearching: isSearching,\n    onSkip: handleLeft\n  })), [activePeer, currentWelcome, call, handleLeft, isPipLocal, isSearching, isStopPip, shouldShowPaywall]);\n  const currentOverlay = React.useMemo(() => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatGuestBar\"\n  }), shouldShowPaywall && !isTablet && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    translateY: 0,\n    duration: 500,\n    style: fullSizeStyle\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatPaywall\",\n    timeout: 3000,\n    onPress: handlePaywallPress,\n    onTimeout: handlePaywallTimeout,\n    onCancel: handlePaywallCancel,\n    style: fullSizeStyle\n  }))), isPipLocal && !shouldShowPaywall && /*#__PURE__*/React.createElement(ResponsiveCameraOverlay, {\n    peer: activePeer,\n    activeCall: call,\n    isSearching: isSearching,\n    onSkip: handleLeft\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CallTopControls\",\n    visible: hasActiveCall,\n    activeCall: call,\n    onPress: handleStop\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"SearchCancelButton\",\n    visible: isSearching && !hasActiveCall && !shouldShowPaywall,\n    onPress: handleStop\n  })), [activePeer, call, handleLeft, handlePaywallCancel, handlePaywallPress, handlePaywallTimeout, handleStop, hasActiveCall, isPipLocal, isSearching, isTablet, shouldShowPaywall]);\n  return /*#__PURE__*/React.createElement(Components.VideoGridContainer, {\n    safeArea: safeArea,\n    leftBack: currentLeftBack,\n    welcome: currentWelcomeProp,\n    backdrop: backdrop,\n    allowedSwipeDirection: allowedSwipeDirection,\n    onLeft: handleLeft,\n    onRight: handleRight,\n    swipeable: !shouldShowPaywall && !isVideoGridSwipeBlocked,\n    subject: State.state.randomPipe,\n    left: peerItems,\n    right: currentCameraItems,\n    leftOverlay: currentLeftOverlay,\n    rightOverlay: currentRightOverlay,\n    overlay: currentOverlay\n  });\n});\nconst TabBarZone = Navigation.TabBarZoneAnimated ?? Navigation.TabBarZone;\nreturn () => {\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const [isSearching] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const [isPipLocalRaw] = Hooks.useBehaviorSubject(State.state.isPipLocal);\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const isStopPip = isSearching || call || isTablet || true;\n  const isPipLocal = isPipLocalRaw && isStopPip;\n  const isBlackLine = ReactNative.Platform.OS === 'web' && isTablet;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      width: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Components.SquareContainer, {\n    styleContainer: {\n      maxHeight: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(Container, null)), isBlackLine && /*#__PURE__*/React.createElement(TabBarZone, {\n    dynamic: true\n  }), isPipLocal && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PipLocalCamera\"\n  }));\n};"},"VideoPermissionGate":{"name":"VideoPermissionGate","key":"99c5c1ee2dd534b797b7a43c48b009d09e70741478f5750607c7b355c0c573ba","code":"function _empty() {}\nconst styles = StyleSheet.create({\n  pressable: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    flexDirection: 'column',\n    justifyContent: 'center',\n    alignItems: 'center'\n  },\n  container: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    paddingHorizontal: 32,\n    flexDirection: 'column',\n    justifyContent: 'center',\n    alignItems: 'center',\n    gap: 24\n  },\n  iconsRow: {\n    flexDirection: 'row',\n    justifyContent: 'center',\n    alignItems: 'center',\n    gap: 12,\n    marginBottom: 8\n  },\n  iconCircle: {\n    width: 96,\n    height: 96,\n    borderRadius: 48,\n    justifyContent: 'center',\n    alignItems: 'center'\n  },\n  textBlock: {\n    alignItems: 'center',\n    gap: 8\n  },\n  title: {\n    textAlign: 'center',\n    fontSize: 28,\n    fontWeight: 900,\n    lineHeight: 36\n  },\n  subtitle: {\n    textAlign: 'center',\n    fontSize: 14,\n    fontWeight: 500,\n    lineHeight: 20\n  },\n  buttonBlock: {\n    width: '100%',\n    maxWidth: 360,\n    minHeight: 56,\n    flexDirection: 'column',\n    justifyContent: 'center',\n    alignItems: 'stretch'\n  },\n  button: {\n    width: '100%',\n    minHeight: 56\n  },\n  buttonBody: {\n    flexDirection: 'row',\n    justifyContent: 'center',\n    alignItems: 'center',\n    gap: 4,\n    paddingLeft: 12\n  },\n  buttonText: {\n    fontSize: 16,\n    fontWeight: '600'\n  }\n});\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  children,\n  buttonTitle,\n  contentContainerStyle\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  Stated.useBackHandler();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const paddingBottom = Navigation.useTabBarSize();\n  const [checkedPermission, setCheckedPermission] = React.useState(false);\n  const [askedPermissions] = Hooks.useBehaviorSubject(State.state.askedPermissions);\n  const [hasCameraPermissions] = Hooks.useBehaviorSubject(State.state.hasCameraPermissions);\n  const [hasMicPermissions] = Hooks.useBehaviorSubject(State.state.hasMicPermissions);\n  const [appState] = Hooks.useBehaviorSubject(State.state.appState);\n  const isCameraGranted = hasCameraPermissions === 'granted';\n  const isMicGranted = hasMicPermissions === 'granted';\n  const isCameraDenied = ['denied', 'blocked', 'unavailable'].includes(hasCameraPermissions);\n  const isMicDenied = ['denied', 'blocked', 'unavailable'].includes(hasMicPermissions);\n  const cameraIconBackground = Utils.withOpacity(isCameraGranted ? theme.theme.semantic.surface.positive.surface4 : theme.theme.semantic.surface.dangerous.surface4, 0.15);\n  const micIconBackground = Utils.withOpacity(isMicGranted ? theme.theme.semantic.surface.positive.surface4 : theme.theme.semantic.surface.dangerous.surface4, 0.15);\n  const cameraIconColor = isCameraGranted ? theme.theme.semantic.content.positive.content1 : theme.theme.semantic.content.dangerous.content1;\n  const micIconColor = isMicGranted ? theme.theme.semantic.content.positive.content1 : theme.theme.semantic.content.dangerous.content1;\n  const grantTitle = buttonTitle ?? t('permissionsButtonGrant') ?? t('permissionsButtonCam');\n  const checkPermissions = React.useCallback(() => {\n    State.checkAllPermissions().then(() => {\n      setCheckedPermission(true);\n    }).finally?.(() => {\n      setCheckedPermission(true);\n    });\n  }, []);\n  React.useEffect(() => {\n    checkPermissions();\n  }, [appState, checkPermissions]);\n  ReactNavigation.useFocusEffect(React.useCallback(() => {\n    checkPermissions();\n  }, [checkPermissions]));\n  if (ReactNative.Platform.OS === 'web' && !checkedPermission) {\n    return null;\n  }\n  if (askedPermissions && (isCameraDenied || isMicDenied)) {\n    return /*#__PURE__*/React.createElement(Components.DSPressable, {\n      size: 64,\n      onPress: _async(function () {\n        return _invokeIgnored(function () {\n          if (ReactNative.Platform.OS === 'web') {\n            return _awaitIgnored(State.requestAllPermissions());\n          } else {\n            ReactNative.Linking.openSettings();\n          }\n        });\n      }),\n      styleContainer: [styles.pressable, {\n        paddingTop: safeArea.top,\n        paddingBottom: paddingBottom + 4\n      }]\n    }, /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n      contentContainerStyle: [styles.container, contentContainerStyle]\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.iconsRow\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.iconCircle, {\n        backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.dangerous.surface4, 0.15)\n      }]\n    }, /*#__PURE__*/React.createElement(Assets.Tune, {\n      style: {\n        color: theme.theme.semantic.content.brand.content1\n      }\n    }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.textBlock\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.title, {\n        color: theme.theme.semantic.content.regular.primary\n      }]\n    }, t('permissionsHeader')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.subtitle, {\n        color: theme.theme.semantic.content.regular.secondary\n      }]\n    }, t('permissionsPopupDescription'))), ReactNative.Platform.OS !== 'web' && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.buttonBlock\n    }, /*#__PURE__*/React.createElement(Components.DSButton, {\n      type: \"brand\",\n      size: \"L\",\n      style: styles.button,\n      onPress: _async(function () {\n        return _invokeIgnored(function () {\n          if (ReactNative.Platform.OS === 'web') {\n            return _awaitIgnored(State.requestAllPermissions());\n          } else {\n            ReactNative.Linking.openSettings();\n          }\n        });\n      })\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.buttonBody\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.buttonText, {\n        color: theme.theme.component.button.brand.content\n      }]\n    }, t('permissionsButtonSettings')), /*#__PURE__*/React.createElement(Assets.Next, {\n      style: [styles.buttonText, {\n        color: theme.theme.component.button.brand.content\n      }]\n    }))))));\n  }\n  if (hasCameraPermissions !== 'granted' || hasMicPermissions !== 'granted') {\n    return /*#__PURE__*/React.createElement(Components.DSPressable, {\n      size: 64,\n      onPress: State.requestAllPermissions,\n      styleContainer: [styles.pressable, {\n        paddingTop: safeArea.top,\n        paddingBottom: paddingBottom + 4\n      }]\n    }, /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n      contentContainerStyle: [styles.container, contentContainerStyle]\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.iconsRow\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      style: [styles.iconCircle, {\n        backgroundColor: cameraIconBackground\n      }]\n    }, /*#__PURE__*/React.createElement(Assets.Camera, {\n      size: 40,\n      style: {\n        color: cameraIconColor\n      }\n    })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      style: [styles.iconCircle, {\n        backgroundColor: micIconBackground\n      }]\n    }, /*#__PURE__*/React.createElement(Assets.MicOff, {\n      size: 40,\n      style: {\n        color: micIconColor\n      }\n    }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.textBlock\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.title, {\n        color: theme.theme.semantic.content.regular.primary\n      }]\n    }, t('permissionsHeader')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.subtitle, {\n        color: theme.theme.semantic.content.regular.secondary\n      }]\n    }, t('permissionsDescription'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.buttonBlock\n    }, /*#__PURE__*/React.createElement(Components.DSButton, {\n      title: grantTitle,\n      type: \"brand\",\n      size: \"L\",\n      style: styles.button,\n      textStyle: [styles.buttonText, {\n        color: theme.theme.component.button.brand.content\n      }],\n      onPress: State.requestAllPermissions\n    }))));\n  }\n  return children ?? null;\n};"},"AutoSizeText":{"name":"AutoSizeText","key":"51de2e1ef7503a2b74ce4eb26138978f727478c372c7787b313c277011b95a40","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nreturn ({\n  children,\n  fontSize = 14,\n  numberOfLines = 1,\n  onTextLayout,\n  style,\n  ...props\n}) => {\n  const [currentFontSize, setCurrentFontSize] = React.useState(fontSize);\n  React.useEffect(() => {\n    setCurrentFontSize(fontSize);\n  }, [children, fontSize]);\n  const handleTextLayout = React.useCallback(event => {\n    onTextLayout?.(event);\n    if (event.nativeEvent.lines.length > numberOfLines) {\n      setCurrentFontSize(size => Math.max(size - 1, 1));\n    }\n  }, [numberOfLines, onTextLayout]);\n  return /*#__PURE__*/React.createElement(ReactNative.Text, _extends({}, props, {\n    adjustsFontSizeToFit: true,\n    numberOfLines: numberOfLines,\n    onTextLayout: handleTextLayout,\n    style: [style, {\n      fontSize: currentFontSize\n    }]\n  }), children);\n};"},"BalancePill":{"name":"BalancePill","key":"3803948f9b15616e71381e8372621fa1e1b669cc5a4ef85893715c3de53833d9","code":"/** Обычный пробел — допустимая точка переноса (UAX #14); на части Android OEM Text при numberOfLines={1} всё равно переносит по пробелу. Разряды — неразрывный пробел U+00A0. */\nfunction formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u00A0') + '\\u00A0';\n}\nconst DiamondIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: \"20\",\n  height: \"20\",\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nconst PlusIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: \"16\",\n  height: \"16\",\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8 2V14M2 8H14\",\n  stroke: \"currentColor\",\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n}));\nreturn ({\n  onPress,\n  surfaceColor,\n  contentColor,\n  iconColor,\n  buttonColor,\n  buttonContentColor\n}) => {\n  const theme = Theme.useTheme();\n  const session = State.api?.session?.useSession?.();\n  const balance = session?.ballance?.amount ?? 0;\n  const t = theme.theme;\n  const resolvedContentColor = contentColor ?? t.component?.appBar?.contentPrimary ?? t.semantic?.content?.regular?.primary;\n  const resolvedSurfaceColor = surfaceColor ?? t.semantic?.surface?.regular?.surface1;\n  const resolvedIconColor = iconColor ?? t.semantic?.content?.brand?.content1;\n  const resolvedButtonColor = buttonColor ?? resolvedIconColor;\n  const resolvedButtonContentColor = buttonContentColor ?? t.component?.button?.brand?.content;\n  const styles = React.useMemo(() => ({\n    row: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      flexShrink: 0,\n      flexGrow: 0\n    },\n    balancePill: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      alignSelf: 'flex-start',\n      paddingLeft: 8,\n      paddingRight: 40,\n      gap: 4,\n      height: 32,\n      backgroundColor: resolvedSurfaceColor,\n      borderRadius: 999,\n      flexShrink: 0,\n      minWidth: 72\n    },\n    balanceIcon: {\n      color: resolvedIconColor\n    },\n    balanceText: {\n      fontSize: 14,\n      lineHeight: 22,\n      fontWeight: 600,\n      letterSpacing: -0.2,\n      color: resolvedContentColor,\n      flexShrink: 0\n    },\n    plusButton: {\n      width: 32,\n      height: 32,\n      marginLeft: -32,\n      borderRadius: 999,\n      backgroundColor: resolvedButtonColor,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    plusIcon: {\n      color: resolvedButtonContentColor\n    }\n  }), [resolvedButtonColor, resolvedButtonContentColor, resolvedContentColor, resolvedIconColor, resolvedSurfaceColor]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onPress,\n    style: styles.row\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balancePill\n  }, /*#__PURE__*/React.createElement(DiamondIcon, {\n    style: styles.balanceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.balanceText,\n    numberOfLines: 1,\n    ellipsizeMode: \"clip\"\n  }, formatWithSpaces(balance))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.plusButton\n  }, /*#__PURE__*/React.createElement(PlusIcon, {\n    style: styles.plusIcon\n  })));\n};"},"GiftsConfirmationSheet":{"name":"GiftsConfirmationSheet","key":"7699ee64a4021b44eb1bb04780d1e71ddcb45e38e1789c507c06da977e02e342","code":"deps: BalancePill, GiftsCatalogSheet, GiftNotEnoughGemsSheet\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst MESSAGE_MAX_LENGTH = 100;\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst formatWithSpaces = number => String(number ?? 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst isNotEnoughGemsError = error => {\n  const messages = [error?.message, error?.error, error?.data?.message, error?.response?.data?.message, error?.body?.message, error];\n  return messages.some(value => /not enough balance/i.test(String(value ?? '').trim()));\n};\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst MainCurrencyIcon = ({\n  size = 16,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst CloseIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6 6L18 18M18 6L6 18\",\n  stroke: \"currentColor\",\n  strokeWidth: 1.8,\n  strokeLinecap: \"round\"\n}));\nconst BackIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M14.4306 4.51215C14.7002 4.19785 15.1738 4.16159 15.4882 4.43109C15.8022 4.70072 15.8386 5.17439 15.5692 5.48871L9.9872 12.0004L15.5692 18.5121C15.8384 18.8266 15.8023 19.3003 15.4882 19.5698C15.1738 19.8392 14.7002 19.8027 14.4306 19.4887L8.43056 12.4887C8.18981 12.2078 8.18981 11.793 8.43056 11.5121L14.4306 4.51215Z\",\n  fill: \"currentColor\"\n}));\nconst GiftSentIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11 13.2497C11.4141 13.2497 11.7498 13.5857 11.75 13.9997V21.9997C11.7498 22.4138 11.4141 22.7497 11 22.7497H7C6.00553 22.7497 5.05188 22.3542 4.34863 21.6511C3.64556 20.9479 3.2501 19.9941 3.25 18.9997V14.9997C3.25008 14.5357 3.43458 14.0896 3.7627 13.7614C4.09084 13.4335 4.53608 13.2497 5 13.2497H11ZM19 13.2497C19.4639 13.2497 19.9092 13.4335 20.2373 13.7614C20.5654 14.0896 20.7499 14.5357 20.75 14.9997V18.9997C20.7499 19.9941 20.3544 20.9479 19.6514 21.6511C18.9481 22.3542 17.9945 22.7497 17 22.7497H13C12.5859 22.7497 12.2502 22.4138 12.25 21.9997V13.9997C12.2502 13.5857 12.5859 13.2497 13 13.2497H19ZM5 14.7497C4.93377 14.7497 4.87011 14.7762 4.82324 14.823C4.77655 14.8698 4.75008 14.9336 4.75 14.9997V18.9997C4.7501 19.5963 4.98741 20.1687 5.40918 20.5905C5.83112 21.0124 6.40335 21.2497 7 21.2497H10.25V14.7497H5ZM13.75 21.2497H17C17.5966 21.2497 18.1689 21.0124 18.5908 20.5905C19.0126 20.1687 19.2499 19.5963 19.25 18.9997V14.9997C19.2499 14.9336 19.2234 14.8698 19.1768 14.823C19.1299 14.7762 19.0662 14.7497 19 14.7497H13.75V21.2497ZM16.5 1.24973C17.2169 1.24961 17.9227 1.43034 18.5508 1.7761C19.1788 2.12188 19.7095 2.62144 20.0928 3.22727C20.476 3.83307 20.6997 4.52642 20.7432 5.24192C20.7654 5.60899 20.7377 5.97597 20.666 6.33371C21.1455 6.45353 21.5889 6.69918 21.9443 7.05442C22.46 7.57007 22.7499 8.2705 22.75 8.99973V9.99973C22.7499 10.7289 22.4599 11.4284 21.9443 11.9441C21.4286 12.4597 20.7293 12.7497 20 12.7497H13C12.5859 12.7497 12.2502 12.4138 12.25 11.9997V6.99973C12.2502 6.58566 12.5859 6.24973 13 6.24973H19.1445C19.2288 5.95287 19.2649 5.64292 19.2461 5.33274C19.2179 4.86981 19.0731 4.42099 18.8252 4.02903C18.5772 3.63708 18.2334 3.31428 17.8271 3.09055C17.421 2.86696 16.9646 2.74977 16.501 2.74973L16.3047 2.75071C14.9389 2.80444 13.6163 3.76144 12.6602 5.53293C12.5302 5.77353 12.2793 5.92435 12.0059 5.92649C11.7323 5.92858 11.4793 5.78137 11.3457 5.5427L11.2148 5.3093C10.2292 3.61144 8.88723 2.7251 7.49609 2.74875L7.4834 2.74973C5.98409 2.74973 4.75017 3.97871 4.75 5.49973C4.7499 5.75401 4.78566 6.00646 4.85449 6.24973H11C11.4141 6.24973 11.7498 6.58566 11.75 6.99973V11.9997C11.7498 12.4138 11.4141 12.7497 11 12.7497H4C3.27075 12.7497 2.57137 12.4597 2.05566 11.9441C1.54013 11.4284 1.2501 10.7289 1.25 9.99973V8.99973C1.25008 8.2705 1.54001 7.57007 2.05566 7.05442C2.41107 6.69918 2.8545 6.45353 3.33398 6.33371C3.27922 6.0597 3.24988 5.77988 3.25 5.49875C3.25048 3.15878 5.14351 1.25792 7.46973 1.25071V1.24973C9.29582 1.21852 10.8629 2.22462 11.999 3.77414C13.0825 2.29345 14.5505 1.31209 16.2646 1.25168H16.2842L16.4932 1.24973H16.5ZM4 7.74973C3.66855 7.74973 3.35062 7.88162 3.11621 8.11594C2.88199 8.35027 2.75008 8.66841 2.75 8.99973V9.99973C2.7501 10.331 2.88198 10.6492 3.11621 10.8835C3.35061 11.1178 3.66857 11.2497 4 11.2497H10.25V7.74973H4ZM13.75 11.2497H20C20.3314 11.2497 20.6494 11.1178 20.8838 10.8835C21.118 10.6492 21.2499 10.331 21.25 9.99973V8.99973C21.2499 8.66841 21.118 8.35027 20.8838 8.11594C20.6494 7.88162 20.3314 7.74973 20 7.74973H13.75V11.2497Z\",\n  fill: \"currentColor\"\n}));\nconst GiftSentToast = ({\n  title,\n  notificationKey\n}) => {\n  const theme = Theme.useTheme();\n  const {\n    width: windowWidth\n  } = ReactNative.useWindowDimensions();\n  const toastWidth = Math.max(0, Math.min(windowWidth - 48, 600));\n  const styles = React.useMemo(() => ({\n    toast: {\n      width: toastWidth,\n      maxWidth: '100%',\n      minHeight: 24,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    content: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    icon: {\n      color: '#24BC75'\n    },\n    title: {\n      flex: 1,\n      minWidth: 0,\n      color: theme.theme.component.toast.contentPrimary,\n      fontFamily: theme.theme.typography?.family?.paragraph,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '700',\n      letterSpacing: -0.2\n    },\n    closeButton: {\n      width: 24,\n      height: 24,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    closeIcon: {\n      color: theme.theme.component.toast.contentPrimary\n    }\n  }), [theme, toastWidth]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.toast\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(GiftSentIcon, {\n    style: styles.icon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.title\n  }, title)), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.closeButton,\n    onPress: () => Notification.hideNotificationByKey(notificationKey)\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.closeIcon\n  })));\n};\nreturn ({\n  gift\n}) => {\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const {\n    height: windowHeight\n  } = ReactNative.useWindowDimensions();\n  const t = Locale.useTranslation();\n  const flow = State.api?.gifts?.useGiftFlow?.();\n  const session = State.api?.session?.useSession?.();\n  const selectedGift = gift ?? flow?.selectedGift;\n  const currentGems = Number(session?.ballance?.amount);\n  const [message, setMessage] = React.useState(() => String(flow?.message ?? '').slice(0, MESSAGE_MAX_LENGTH));\n  const [isMessageFocused, setIsMessageFocused] = React.useState(false);\n  const [isSubmitting, setIsSubmitting] = React.useState(false);\n  const [error, setError] = React.useState(null);\n  const submitLockedRef = React.useRef(false);\n  React.useEffect(() => {\n    if (gift) {\n      State.api?.gifts?.selectGift?.(gift);\n    }\n  }, [gift]);\n  const openStore = React.useCallback(() => {\n    sheet.close();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"store\",\n      isModal: true,\n      purchaseSource: \"gifts\"\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet]);\n  const openCatalog = React.useCallback(() => {\n    sheet.close('back');\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsCatalogSheet\"\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet]);\n  const onChangeMessage = React.useCallback(nextValue => {\n    const limited = String(nextValue ?? '').slice(0, MESSAGE_MAX_LENGTH);\n    setMessage(limited);\n    State.api?.gifts?.setGiftMessage?.(limited);\n    setError(null);\n  }, []);\n  const showGiftSentToast = React.useCallback(() => {\n    const notificationKey = 'gift-sent';\n    Notification.showNotification({\n      key: notificationKey,\n      children: /*#__PURE__*/React.createElement(GiftSentToast, {\n        title: t('giftSentToast'),\n        notificationKey: notificationKey\n      }),\n      duration: 3000\n    });\n  }, [t]);\n  const showNotEnoughGemsSheet = React.useCallback(() => {\n    sheet.close('not_enough_gems');\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftNotEnoughGemsSheet\"\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet]);\n  const submit = React.useCallback(_async(function () {\n    if (submitLockedRef.current || isSubmitting) return;\n    if (!selectedGift?.id) return;\n    const giftPrice = Number(selectedGift?.priceGems);\n    if (Number.isFinite(currentGems) && Number.isFinite(giftPrice) && currentGems < giftPrice) {\n      setError(null);\n      ReactNative.Keyboard.dismiss();\n      showNotEnoughGemsSheet();\n      return;\n    }\n    submitLockedRef.current = true;\n    setIsSubmitting(true);\n    setError(null);\n    ReactNative.Keyboard.dismiss();\n    return _finallyRethrows(function () {\n      return _catch(function () {\n        return _await(State.api?.gifts?.sendGift?.({\n          catalogId: selectedGift.id,\n          text: message.trim() || undefined\n        }), function () {\n          showGiftSentToast();\n          sheet.close(true);\n        });\n      }, function (err) {\n        console.error('[GiftsConfirmationSheet] send gift failed', err);\n        if (isNotEnoughGemsError(err)) {\n          showNotEnoughGemsSheet();\n          return;\n        }\n        setError(err);\n      });\n    }, function (_wasThrown, _result) {\n      submitLockedRef.current = false;\n      setIsSubmitting(false);\n      return _rethrow(_wasThrown, _result);\n    });\n  }), [currentGems, isSubmitting, message, selectedGift?.id, selectedGift?.priceGems, sheet, showGiftSentToast, showNotEnoughGemsSheet]);\n  const sheetBottomPadding = Math.max(safeArea.bottom, 16);\n  const sheetMaxHeight = Math.min(Math.max(360, windowHeight - safeArea.top - 12), Math.round(windowHeight * 0.78));\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      maxHeight: sheetMaxHeight,\n      backgroundColor: 'rgba(4, 6, 15, 0.8)',\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      overflow: 'hidden',\n      paddingBottom: sheetBottomPadding\n    },\n    header: {\n      height: 56,\n      paddingTop: 12,\n      paddingBottom: 4,\n      paddingHorizontal: 16,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    headerSide: {\n      width: 40,\n      height: 40\n    },\n    headerCenter: {\n      flex: 1,\n      minWidth: 0,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    closeButton: {\n      width: 40,\n      height: 40,\n      borderRadius: 20,\n      justifyContent: 'center',\n      alignItems: 'flex-end'\n    },\n    closeIcon: {\n      color: '#FFFFFF',\n      opacity: 0.9\n    },\n    backButton: {\n      width: 40,\n      height: 40,\n      borderRadius: 20,\n      justifyContent: 'center',\n      alignItems: 'flex-start'\n    },\n    backIcon: {\n      color: '#FAFBFB'\n    },\n    content: {\n      paddingTop: 32,\n      paddingHorizontal: 16,\n      alignItems: 'center',\n      gap: 20,\n      width: '100%'\n    },\n    giftPreview: {\n      width: 244,\n      height: 124,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    rays: {\n      position: 'absolute',\n      left: 0,\n      top: -60,\n      bottom: -60,\n      right: 0,\n      opacity: 1\n    },\n    giftImage: {\n      width: 100,\n      height: 100,\n      zIndex: 1\n    },\n    giftInfo: {\n      alignItems: 'center',\n      gap: 2,\n      width: '100%',\n      paddingBottom: 12\n    },\n    giftTitle: {\n      width: '100%',\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 22,\n      letterSpacing: -0.3,\n      color: 'rgba(255,255,255,0.6)',\n      textAlign: 'center'\n    },\n    priceRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6,\n      width: '100%'\n    },\n    priceIcon: {\n      color: '#FE375B'\n    },\n    price: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 20,\n      lineHeight: 28,\n      letterSpacing: -0.7,\n      color: '#FFFFFF',\n      textAlign: 'center'\n    },\n    slot: {\n      paddingTop: 4,\n      paddingHorizontal: 16,\n      paddingBottom: 8,\n      gap: 12,\n      width: '100%'\n    },\n    messageBox: {\n      height: 100,\n      width: '100%',\n      borderRadius: 24,\n      paddingHorizontal: 16,\n      marginTop: 12,\n      paddingTop: 12,\n      paddingBottom: 12,\n      backgroundColor: 'rgba(4,6,15,0.8)',\n      borderWidth: 1,\n      borderColor: 'rgba(255,255,255,0.1)',\n      justifyContent: 'space-between'\n    },\n    messageBoxFocused: {\n      borderColor: '#66BAF7'\n    },\n    messageInput: {\n      flex: 1,\n      width: '100%',\n      padding: 0,\n      color: '#FFFFFF',\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.3,\n      textAlignVertical: 'top',\n      outlineStyle: 'none'\n    },\n    messageInputFocused: {\n      color: '#FFFFFF'\n    },\n    counter: {\n      width: '100%',\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: '#FFFFFF',\n      textAlign: 'right'\n    },\n    counterFocused: {\n      color: 'rgba(255,255,255,0.6)'\n    },\n    errorText: {\n      color: '#FF6B81',\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    button: {\n      width: '100%'\n    },\n    missingGift: {\n      minHeight: 180,\n      paddingHorizontal: 24,\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 12\n    },\n    missingGiftText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      color: 'rgba(255,255,255,0.6)',\n      textAlign: 'center'\n    }\n  }), [sheetBottomPadding, sheetMaxHeight]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.backButton,\n    onPress: openCatalog\n  }, /*#__PURE__*/React.createElement(BackIcon, {\n    style: styles.backIcon\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerCenter\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"BalancePill\",\n    onPress: openStore,\n    surfaceColor: \"rgba(4, 6, 15, 0.5)\",\n    contentColor: \"#FFFFFF\",\n    iconColor: \"#FE375B\",\n    buttonColor: \"#FFFFFF\",\n    buttonContentColor: \"#04060F\"\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.closeButton,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.closeIcon\n  }))), selectedGift ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftPreview\n  }, /*#__PURE__*/React.createElement(Image, {\n    pointerEvents: \"none\",\n    source: State.getUrl('/api/component/assets/gifts/radial-rays.webp'),\n    style: styles.rays,\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(Image, {\n    pointerEvents: \"none\",\n    source: {\n      uri: selectedGift.imageUrl\n    },\n    style: styles.giftImage,\n    contentFit: \"contain\"\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftInfo\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftTitle,\n    numberOfLines: 1\n  }, selectedGift.title), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.priceRow\n  }, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n    size: 20,\n    style: styles.priceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.price,\n    numberOfLines: 1\n  }, formatWithSpaces(selectedGift.priceGems))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.slot\n  }, !!error && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.errorText\n  }, String(error?.message ?? error) || t('giftSendError')), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"brand\",\n    size: \"L\",\n    style: styles.button,\n    disabled: isSubmitting,\n    onPress: submit\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: '#FFFFFF',\n      fontSize: 16,\n      fontWeight: '600'\n    }\n  }, t('giftSendButton'))))) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.missingGift\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.missingGiftText\n  }, t('giftMissingSelection'))));\n};"},"DraggableScrollView":{"name":"DraggableScrollView","key":"8548da0dbed10ffafa436c6a853c9e4d34515a99ea2ebd2d4408db5f118ef168","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst DRAG_THRESHOLD = 3;\nreturn ({\n  horizontal = false,\n  style,\n  children,\n  onScroll,\n  onWheel,\n  scrollViewRef,\n  blockParentGesture = false,\n  ...props\n}) => {\n  const scrollRef = React.useRef(null);\n  const dragRef = React.useRef(null);\n  const suppressClickRef = React.useRef(false);\n  const setScrollRef = React.useCallback(value => {\n    scrollRef.current = value;\n    if (typeof scrollViewRef === 'function') scrollViewRef(value);else if (scrollViewRef) scrollViewRef.current = value;\n  }, [scrollViewRef]);\n  const scrollGesture = React.useMemo(() => {\n    if (ReactNative.Platform.OS === 'web') return null;\n    const gestureApi = GestureHandler?.Gesture;\n    const nativeGesture = gestureApi?.Native?.();\n    if (!nativeGesture) return null;\n    const protectedNativeGesture = nativeGesture.disallowInterruption?.(true) ?? nativeGesture;\n    if (!blockParentGesture || !gestureApi?.Pan || !gestureApi?.Simultaneous) {\n      return protectedNativeGesture;\n    }\n    let parentBlocker = gestureApi.Pan().activeOffsetX([-2, 2]).failOffsetY([-8, 8]).shouldCancelWhenOutside(false).cancelsTouchesInView(false);\n    parentBlocker = parentBlocker.cancelsJSResponder?.(false) ?? parentBlocker;\n    return gestureApi.Simultaneous(protectedNativeGesture, parentBlocker);\n  }, [blockParentGesture]);\n  const handlePointerDown = React.useCallback(event => {\n    const nativeEvent = event?.nativeEvent;\n    if (ReactNative.Platform.OS !== 'web' || nativeEvent?.pointerType !== 'mouse') return;\n    if (nativeEvent.button !== 0) return;\n    const scrollNode = scrollRef.current?.getScrollableNode?.();\n    dragRef.current = {\n      pointerId: nativeEvent.pointerId,\n      startPosition: horizontal ? nativeEvent.clientX : nativeEvent.clientY,\n      startOffset: horizontal ? scrollNode?.scrollLeft ?? 0 : scrollNode?.scrollTop ?? 0,\n      captured: false\n    };\n  }, [horizontal]);\n  const handlePointerMove = React.useCallback(event => {\n    const drag = dragRef.current;\n    const nativeEvent = event?.nativeEvent;\n    if (!drag || drag.pointerId !== nativeEvent?.pointerId) return;\n    const position = horizontal ? nativeEvent.clientX : nativeEvent.clientY;\n    const delta = position - drag.startPosition;\n    if (Math.abs(delta) <= DRAG_THRESHOLD) return;\n    if (!drag.captured) {\n      event.currentTarget?.setPointerCapture?.(drag.pointerId);\n      drag.captured = true;\n    }\n    if (blockParentGesture) event.stopPropagation?.();\n    suppressClickRef.current = true;\n    event.preventDefault?.();\n    scrollRef.current?.scrollTo?.({\n      [horizontal ? 'x' : 'y']: Math.max(0, drag.startOffset - delta),\n      animated: false\n    });\n  }, [blockParentGesture, horizontal]);\n  const finishDrag = React.useCallback(event => {\n    const drag = dragRef.current;\n    if (!drag || drag.pointerId !== event?.nativeEvent?.pointerId) return;\n    if (drag.captured) event.currentTarget?.releasePointerCapture?.(drag.pointerId);\n    dragRef.current = null;\n    setTimeout(() => {\n      suppressClickRef.current = false;\n    }, 0);\n  }, []);\n  const handleClickCapture = React.useCallback(event => {\n    if (!suppressClickRef.current) return;\n    suppressClickRef.current = false;\n    event.preventDefault?.();\n    event.stopPropagation?.();\n  }, []);\n  const handleTouch = React.useCallback(event => {\n    event?.stopPropagation?.();\n  }, []);\n  const handleWheel = React.useCallback(event => {\n    if (blockParentGesture) event?.stopPropagation?.();\n    onWheel?.(event);\n  }, [blockParentGesture, onWheel]);\n  const scrollView = /*#__PURE__*/React.createElement(ReactNative.ScrollView, _extends({}, props, {\n    ref: setScrollRef,\n    horizontal: horizontal,\n    directionalLockEnabled: true,\n    nestedScrollEnabled: true,\n    style: [style, ReactNative.Platform.OS === 'web' && {\n      cursor: 'grab',\n      overscrollBehavior: blockParentGesture ? 'contain' : undefined,\n      userSelect: 'none'\n    }],\n    onScroll: onScroll,\n    onPointerDown: handlePointerDown,\n    onPointerMove: handlePointerMove,\n    onPointerUp: finishDrag,\n    onPointerCancel: finishDrag,\n    onClickCapture: handleClickCapture,\n    onWheel: handleWheel,\n    onTouchStart: handleTouch,\n    onTouchMove: handleTouch\n  }), children);\n  if (!scrollGesture || !GestureHandler?.GestureDetector) return scrollView;\n  return /*#__PURE__*/React.createElement(GestureHandler.GestureDetector, {\n    gesture: scrollGesture\n  }, scrollView);\n};"},"ChatSearchBar":{"name":"ChatSearchBar","key":"8c50857437800a20ba2aecd799bda524c4c547f2ae199ba0492f0b9c169254e1","code":"deps:\n/**\n * Поисковая строка для чатов\n * \n * @param {Object} props\n * @param {string} props.value - Текущее значение поиска\n * @param {(text: string) => void} props.onChangeText - Callback при изменении текста\n * @param {string} [props.placeholder] - Placeholder текст\n */\nreturn ({\n  value,\n  onChangeText,\n  placeholder\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [isFocused, setIsFocused] = React.useState(false);\n  const inputRef = React.useRef(null);\n  const placeholderText = placeholder || t('chatsSearch');\n  const handleClear = React.useCallback(() => {\n    onChangeText?.('');\n    if (ReactNative.Platform.OS === 'web') {\n      requestAnimationFrame(() => {\n        inputRef.current?.focus?.();\n      });\n    }\n  }, [onChangeText]);\n\n  // Цвета из темы textField\n  const textFieldColors = theme.theme.component?.textField || {};\n  const surface2Bg = theme.theme.semantic?.surface?.alfa?.surface2 || 'rgba(4, 6, 15, 0.10)';\n  const contentPrimary = textFieldColors.contentPrimary || '#04060F';\n  const contentAccent = textFieldColors.contentAccent || '#66BAF7';\n  const focusBorderColor = textFieldColors.borderFocus || '#66BAF7';\n  // Placeholder с opacity 0.5\n  const placeholderColor = contentPrimary.length === 7 ? `${contentPrimary}80` : contentPrimary;\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      gap: 8,\n      height: 40,\n      backgroundColor: surface2Bg,\n      borderRadius: 12,\n      alignSelf: 'stretch'\n    },\n    containerFocused: {\n      borderWidth: 1,\n      borderColor: focusBorderColor\n    },\n    icon: {\n      width: 16,\n      height: 16,\n      color: contentPrimary\n    },\n    clearButton: {\n      width: 20,\n      height: 20,\n      borderRadius: 999,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    clearIcon: {\n      width: 16,\n      height: 16,\n      color: contentPrimary\n    },\n    input: {\n      flex: 1,\n      height: '100%',\n      fontSize: 14,\n      fontWeight: '500',\n      lineHeight: 20,\n      letterSpacing: -0.3,\n      color: contentPrimary,\n      padding: 0,\n      margin: 0\n    }\n  }), [surface2Bg, contentPrimary, focusBorderColor]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.container, isFocused && styles.containerFocused]\n  }, /*#__PURE__*/React.createElement(Assets.Search, {\n    size: 16,\n    style: styles.icon\n  }), /*#__PURE__*/React.createElement(ReactNative.TextInput, {\n    ref: inputRef,\n    style: styles.input,\n    value: value,\n    onChangeText: onChangeText,\n    onFocus: () => setIsFocused(true),\n    onBlur: () => setIsFocused(false),\n    placeholder: isFocused ? '' : placeholderText,\n    placeholderTextColor: placeholderColor,\n    selectionColor: contentAccent,\n    cursorColor: contentAccent,\n    returnKeyType: \"search\",\n    autoCapitalize: \"none\",\n    autoCorrect: false\n  }), !!value?.length && /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.clearButton,\n    onPress: handleClear,\n    hitSlop: 8\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    size: 16,\n    style: styles.clearIcon\n  })));\n};"},"ChatTabs":{"name":"ChatTabs","key":"f6d82e951c49d1026851eb800c530a5abb915113b175ce34a21e916b23ada150","code":"deps:\n/**\n * Underlined Tabs для чатов\n * \n * @param {Object} props\n * @param {Array<{id: string, label: string}>} props.tabs - Список табов\n * @param {string} props.activeTab - ID активного таба\n * @param {(tabId: string) => void} props.onTabPress - Callback при нажатии\n * @param {Object} [props.counters] - Счетчики для табов { tabId: number }\n */\nreturn ({\n  tabs,\n  activeTab,\n  onTabPress,\n  counters = {}\n}) => {\n  const theme = Theme.useTheme();\n  const tabLayoutsRef = React.useRef({});\n  const underlineX = React.useRef(new ReactNative.Animated.Value(0)).current;\n  const underlineW = React.useRef(new ReactNative.Animated.Value(0)).current;\n\n  // Цвета из темы\n  const colors = React.useMemo(() => ({\n    active: theme.theme.component?.tabs?.underlineTabs?.contentActive || theme.theme.semantic.content.regular.primary,\n    inactive: theme.theme.component?.tabs?.underlineTabs?.contentDefault || Utils.withOpacity(theme.theme.semantic.content.regular.primary, 0.5),\n    underline: theme.theme.component?.tabs?.underlineTabs?.contentBrand || theme.theme.semantic.content.brand.content1,\n    counterBg: theme.theme.component?.badge?.brand?.bg || '#FE375B',\n    borderColor: Utils.withOpacity(theme.theme.semantic.stroke?.regular?.stroke1 || '#04060F', 0.1)\n  }), [theme]);\n  const moveUnderline = React.useCallback(tabId => {\n    const layout = tabLayoutsRef.current[tabId];\n    if (!layout) return;\n    ReactNative.Animated.parallel([ReactNative.Animated.timing(underlineX, {\n      toValue: layout.x,\n      duration: 180,\n      useNativeDriver: false\n    }), ReactNative.Animated.timing(underlineW, {\n      toValue: layout.width,\n      duration: 180,\n      useNativeDriver: false\n    })]).start();\n  }, [underlineX, underlineW]);\n  React.useEffect(() => {\n    moveUnderline(activeTab);\n  }, [activeTab, moveUnderline]);\n  const handleTabLayout = React.useCallback((tabId, e) => {\n    const {\n      x,\n      width\n    } = e.nativeEvent.layout;\n    tabLayoutsRef.current[tabId] = {\n      x,\n      width\n    };\n    if (tabId === activeTab) {\n      moveUnderline(tabId);\n    }\n  }, [activeTab, moveUnderline]);\n  const styles = React.useMemo(() => ({\n    container: {\n      paddingBottom: 1,\n      borderBottomWidth: 1,\n      borderBottomColor: colors.borderColor,\n      overflow: 'visible'\n    },\n    scrollView: {\n      overflow: 'visible'\n    },\n    tabsRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      position: 'relative',\n      paddingHorizontal: 16\n    },\n    tabWrapper: {\n      marginRight: 20\n    },\n    tab: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingBottom: 6,\n      gap: 4\n    },\n    tabText: {\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '500',\n      fontFamily: theme.theme.typography?.family?.paragraph\n    },\n    tabTextActive: {\n      color: colors.active\n    },\n    tabTextInactive: {\n      color: colors.inactive\n    },\n    counter: {\n      minWidth: 18,\n      height: 18,\n      borderRadius: 99,\n      backgroundColor: colors.counterBg,\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 4\n    },\n    counterText: {\n      fontSize: 10,\n      lineHeight: 18,\n      fontWeight: '600',\n      letterSpacing: -0.5,\n      textAlign: 'center',\n      color: '#FFFFFF',\n      fontFamily: theme.theme.typography?.family?.paragraph\n    },\n    underline: {\n      position: 'absolute',\n      bottom: 0,\n      height: 2,\n      backgroundColor: colors.underline,\n      borderTopLeftRadius: 8,\n      borderTopRightRadius: 8,\n      borderBottomLeftRadius: 0,\n      borderBottomRightRadius: 0\n    }\n  }), [theme, colors]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n    horizontal: true,\n    showsHorizontalScrollIndicator: false,\n    style: styles.scrollView,\n    contentContainerStyle: styles.tabsRow\n  }, tabs.map(tab => {\n    const isActive = tab.id === activeTab;\n    const count = counters[tab.id] || 0;\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: tab.id,\n      style: styles.tabWrapper,\n      onLayout: e => handleTabLayout(tab.id, e)\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      onPress: () => onTabPress(tab.id),\n      style: styles.tab\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.tabText, isActive ? styles.tabTextActive : styles.tabTextInactive]\n    }, tab.label), count > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.counter\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.counterText\n    }, count))));\n  }), /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    style: [styles.underline, {\n      left: underlineX,\n      width: underlineW\n    }]\n  })));\n};"},"ChatList":{"name":"ChatList","key":"c5e1d559c57e14317943197cd8275e9dcba989c6d7af03f50946aa4fd23f9f71","code":"deps: ChatItem\nreturn ({\n  chats,\n  activeTab,\n  selectedChatId,\n  highlightSelected = false,\n  useSurface1Background = false,\n  horizontalPadding = 0,\n  isRefreshing = false,\n  isLoadingMore = false,\n  onRefresh,\n  onLoadMore,\n  onChatPress,\n  onPin,\n  onMute,\n  onDelete,\n  onProfile,\n  onReport\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const listRef = React.useRef(null);\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const tabBar = (safeArea?.bottom ?? 0) + (Navigation.tabBarHeight ?? 0) + 4;\n  React.useEffect(() => {\n    const sub = State.bus.scrollChatsToTop.subscribe(() => {\n      listRef.current?.scrollToOffset?.({\n        offset: 0,\n        animated: true\n      });\n    });\n    return () => {\n      sub?.unsubscribe?.();\n    };\n  }, [listRef.current]);\n\n  // Фильтрация по активному табу\n  const filteredChats = React.useMemo(() => {\n    if (!chats || chats.length === 0) return [];\n    switch (activeTab) {\n      case 'requests':\n        return chats.filter(chat => chat.isRequest);\n      case 'followers':\n        return chats.filter(chat => chat.isFollower);\n      case 'unread':\n        return chats.filter(chat => !chat.isLastMessageRead);\n      case 'all':\n      default:\n        return chats;\n    }\n  }, [chats, activeTab]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      backgroundColor: useSurface1Background ? theme.theme.semantic.surface.regular.surface1 : theme.theme.semantic.surface.regular.pageBackground\n    },\n    listContent: {\n      paddingHorizontal: horizontalPadding,\n      paddingBottom: tabBar,\n      flexGrow: 1\n    },\n    footerLoader: {\n      paddingVertical: 24,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    emptyContainer: {\n      flex: 1,\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 16\n    }\n  }), [horizontalPadding, theme, useSurface1Background, tabBar]);\n\n  // Рендер элемента списка\n  const renderItem = React.useCallback(({\n    item\n  }) => {\n    return /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"ChatItem\",\n      chat: item,\n      isSplitHighlighted: highlightSelected,\n      isSelected: highlightSelected && String(item?.id) === String(selectedChatId),\n      onPress: onChatPress,\n      onPin: onPin,\n      onMute: onMute,\n      onDelete: onDelete,\n      onProfile: onProfile,\n      onReport: onReport\n    });\n  }, [highlightSelected, onChatPress, onPin, onMute, onDelete, onProfile, onReport, selectedChatId]);\n\n  // Key extractor\n  const keyExtractor = React.useCallback(item => item.id, []);\n\n  // Footer с индикатором загрузки\n  const ListFooterComponent = React.useCallback(() => {\n    if (!isLoadingMore) {\n      return /*#__PURE__*/React.createElement(ReactNative.View, {\n        style: {\n          height: 16\n        }\n      });\n    }\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.footerLoader\n    }, /*#__PURE__*/React.createElement(ReactNative.ActivityIndicator, {\n      size: \"small\",\n      color: theme.theme.semantic.content.brand.content1\n    }));\n  }, [isLoadingMore, styles, theme]);\n  if (filteredChats.length === 0) {\n    return null;\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(Reanimated.FlatList, {\n    ref: listRef,\n    data: filteredChats,\n    renderItem: renderItem,\n    keyExtractor: keyExtractor,\n    estimatedItemSize: 68,\n    showsVerticalScrollIndicator: false,\n    contentContainerStyle: styles.listContent\n    // Pull-to-refresh\n    ,\n    refreshing: isRefreshing,\n    onRefresh: onRefresh\n    // Infinite scroll\n    ,\n    onEndReached: onLoadMore,\n    onEndReachedThreshold: 0.3,\n    ListFooterComponent: ListFooterComponent,\n    itemLayoutAnimation: Reanimated.LinearTransition.duration(300)\n  }));\n};"},"UnableToPinModal":{"name":"UnableToPinModal","key":"b105e38be3660c97ba24d8a7a369efccba163326a94b3908db6a8019d7e40479","code":"return ({\n  title\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const label = title || t('chatsUnableToPinLimit');\n  const styles = React.useMemo(() => ({\n    container: {\n      position: 'absolute',\n      top: Math.max(70, 70 + (safeArea?.top || 0) * 0),\n      left: 16,\n      right: 16,\n      alignItems: 'center',\n      pointerEvents: 'none',\n      overflow: 'visible'\n    },\n    animationContainer: {\n      width: '100%',\n      alignItems: 'center',\n      overflow: 'visible'\n    },\n    toast: {\n      minHeight: 56,\n      maxWidth: 340,\n      borderRadius: 24,\n      paddingHorizontal: 16,\n      paddingVertical: 16,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 || '#FFFFFF',\n      shadowColor: 'rgba(4, 6, 15, 1)',\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      elevation: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      overflow: 'visible'\n    },\n    title: {\n      flexShrink: 1,\n      color: theme.theme.semantic?.content?.regular?.primary || '#04060F',\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '700',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography?.family?.paragraph\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, {\n    visible: true,\n    duration: 220,\n    translateY: -18,\n    style: styles.animationContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.toast\n  }, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M11.5362 1.30366C12.4177 1.10944 13.1913 1.46219 13.9248 2.00679C14.6482 2.54388 15.484 3.38328 16.5196 4.41987L19.6026 7.50581C20.6307 8.53494 21.4638 9.36617 21.9971 10.0859C22.5383 10.8162 22.888 11.586 22.6983 12.4638C22.5083 13.3415 21.8716 13.8968 21.0772 14.3378C20.2942 14.7724 19.1922 15.1848 17.8311 15.6962L15.9141 16.4169C15.1205 16.7151 14.903 16.8081 14.7422 16.9472C14.6615 17.0171 14.5888 17.0967 14.5264 17.1835C14.4022 17.3566 14.3288 17.5818 14.1036 18.4003C13.8694 19.2516 13.6772 19.9532 13.4668 20.4775C13.257 21.0002 12.9737 21.4956 12.4649 21.7861C12.1114 21.9878 11.7107 22.0933 11.3038 22.0927C10.7177 22.0917 10.2266 21.801 9.78617 21.4501C9.34446 21.0983 8.83168 20.5832 8.20805 19.9589L6.65336 18.4023L2.53031 22.5302C2.23755 22.823 1.76272 22.8229 1.46977 22.5302C1.17702 22.2375 1.17712 21.7626 1.46977 21.4697L5.59281 17.3417L4.09086 15.8378C3.47106 15.2174 2.96007 14.7069 2.61039 14.2675C2.26167 13.8294 1.97247 13.3419 1.96879 12.7597C1.96625 12.3453 2.07353 11.9373 2.28031 11.5781C2.57096 11.0736 3.06359 10.7915 3.58305 10.583C4.10397 10.3739 4.80062 10.1831 5.64555 9.95015C6.46554 9.72407 6.69042 9.65078 6.86332 9.52632C6.95237 9.46218 7.03428 9.38724 7.10551 9.30366C7.2436 9.14136 7.33544 8.92237 7.62797 8.12398L8.32231 6.22847C8.8267 4.85179 9.23329 3.73794 9.6641 2.94624C10.101 2.14355 10.6546 1.49815 11.5362 1.30366ZM13.0303 3.21089C12.4278 2.76358 12.1081 2.71349 11.8584 2.76851C11.6088 2.82374 11.3402 3.00401 10.9815 3.66304C10.6164 4.33386 10.252 5.32065 9.73051 6.74409L9.03617 8.6396C8.7822 9.33278 8.60046 9.86133 8.24711 10.2763C8.09766 10.4517 7.92724 10.6094 7.74027 10.7441C7.29764 11.0628 6.75532 11.2003 6.04398 11.3964C5.16337 11.6392 4.56499 11.8056 4.14164 11.9755C3.71764 12.1458 3.6149 12.2659 3.58012 12.3261C3.50602 12.4548 3.46798 12.6013 3.46879 12.75C3.46923 12.8196 3.49805 12.9756 3.78324 13.3339C4.06757 13.6912 4.50626 14.1315 5.15238 14.7783L9.26859 18.8994C9.91874 19.5502 10.3616 19.9912 10.7207 20.2773C11.0812 20.5644 11.2372 20.5926 11.3067 20.5927C11.4521 20.5929 11.5953 20.5555 11.7217 20.4834C11.7824 20.4486 11.9038 20.346 12.0752 19.9189C12.2463 19.4925 12.4131 18.8892 12.6573 18.0019C12.8526 17.2918 12.9904 16.7517 13.3077 16.3095C13.4385 16.1272 13.5902 15.9603 13.7598 15.8134C14.1713 15.4572 14.697 15.2714 15.3858 15.0126L17.3028 14.2919C18.7107 13.763 19.687 13.3941 20.3496 13.0263C20.9999 12.6652 21.1783 12.3967 21.2325 12.1464C21.2865 11.896 21.2354 11.5768 20.792 10.9785C20.3406 10.3692 19.6045 9.62986 18.5411 8.56538L15.459 5.48042C14.3879 4.40819 13.6432 3.66593 13.0303 3.21089Z\",\n    fill: \"#40A7E3\"\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 2,\n    style: styles.title\n  }, label))));\n};"},"ChatReportConfirmModal":{"name":"ChatReportConfirmModal","key":"cd9498c8fcec07a25a6f0cce915c8345724e8adc1ec31e70e76306d9c3999354","code":"return () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const title = t('chatReportConfirmTitle') || \"You're about to report this user\";\n  const subtitle = t('chatReportConfirmSubtitle') || 'To review your report, the last 50 messages from this chat will be sent to moderation';\n  const primaryLabel = t('chatReportConfirmButton') || 'Report';\n  const cancelLabel = t('cancel') || 'Cancel';\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      width: '100%',\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF',\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      overflow: 'hidden'\n    },\n    header: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      paddingTop: 12,\n      paddingBottom: 4,\n      minHeight: 56,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF'\n    },\n    centerRow: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      alignItems: 'center',\n      justifyContent: 'center',\n      flexDirection: 'row',\n      gap: 6,\n      pointerEvents: 'none',\n      paddingTop: 4\n    },\n    centerTitle: {\n      fontFamily: 'Geologica',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.3,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F'\n    },\n    closeBtn: {\n      width: 24,\n      height: 24,\n      alignItems: 'center',\n      justifyContent: 'center',\n      zIndex: 1\n    },\n    content: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      gap: 4,\n      padding: 16,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF'\n    },\n    title: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 20,\n      lineHeight: 28,\n      letterSpacing: -0.7,\n      textAlign: 'center',\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F'\n    },\n    subtitle: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      textAlign: 'center',\n      color: theme.theme.semantic?.content?.regular?.secondary ?? 'rgba(4, 6, 15, 0.5)'\n    },\n    buttons: {\n      flexDirection: 'column',\n      gap: 8,\n      paddingTop: 4,\n      paddingRight: 16,\n      paddingBottom: 24,\n      paddingLeft: 16,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF'\n    },\n    dangerBtn: {\n      height: 48,\n      borderRadius: 12,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    dangerText: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: '#FFFFFF'\n    },\n    ghostBtn: {\n      width: '100%'\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: 24,\n      height: 24\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.centerRow\n  }, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 20,\n    height: 20,\n    viewBox: \"0 0 20 20\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M4.16699 18.3333V2.49996M4.16699 13.3333C4.16699 13.3333 5.00033 12.5 7.50033 12.5C10.0003 12.5 11.667 14.1666 14.167 14.1666C16.667 14.1666 17.5003 13.3333 17.5003 13.3333V2.49996C17.5003 2.49996 16.667 3.33329 14.167 3.33329C11.667 3.33329 10.0003 1.66663 7.50033 1.66663C5.00033 1.66663 4.16699 2.49996 4.16699 2.49996\",\n    stroke: theme.theme.semantic?.content?.regular?.primary ?? '#04060F',\n    strokeWidth: 1.25,\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\"\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.centerTitle\n  }, t('chatMenuReport') || 'Report')), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.closeBtn,\n    feedback: true,\n    onPress: () => sheet.close(false)\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: {\n      color: theme.theme.semantic?.content?.regular?.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, title), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, subtitle)), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.buttons, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.dangerBtn,\n    onPress: () => sheet.close(true)\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.dangerText\n  }, primaryLabel)), /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"ghost\",\n    size: \"L\",\n    style: styles.ghostBtn,\n    onPress: () => sheet.close(false)\n  }, cancelLabel)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      height: safeArea.bottom\n    }\n  }));\n};"},"ConfirmActionModal":{"name":"ConfirmActionModal","key":"714537ad752cbdc48d7e6d161a1d1b52b717c66edd44db5ac7d5b33656a819e1","code":"function formatWithSpaces(number) {\n  return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n}\nreturn ({\n  variant = 'firstMessage',\n  paidPrice = 75,\n  timeout: timeoutMs = 5000,\n  meta,\n  chatId\n}) => {\n  meta = State.api?.users?.sanitizeMeta?.(meta) ?? meta;\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const session = State.api?.session?.useSession?.();\n  const balance = session?.ballance?.amount ?? 0;\n  const photo = meta?.photos?.[0];\n  const isFirstMessage = variant === 'firstMessage';\n  const isDeleteChat = variant === 'deleteChat';\n  const isDoubleCheck = variant === 'doubleCheck';\n  const priceFormatted = formatWithSpaces(paidPrice);\n  const displayUsername = meta?.user?.username || t('profilePlaceholderUser') || 'User';\n  const titleText = isFirstMessage ? t('chatFirstMessageConfirmTitle', displayUsername, priceFormatted) : isDoubleCheck ? t('chatDeletedToastMessage') : t('chatDeleteConfirmTitle');\n  const subtitleText = isFirstMessage ? t('chatFirstMessageConfirmSubtitle') : isDoubleCheck ? null : t('chatDeleteConfirmSubtitle', displayUsername);\n  const primaryLabel = isFirstMessage ? t('chatFirstMessageConfirmButton') : t('chatDeleteConfirmButton');\n  const secondaryLabel = t('cancel');\n  const undoLabel = t('undo');\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: safeArea.bottom,\n      borderRadius: 16,\n      overflow: 'hidden',\n      minWidth: 280,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF'\n    },\n    header: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      paddingHorizontal: 16,\n      paddingTop: 12,\n      paddingBottom: 4,\n      gap: 132,\n      width: '100%',\n      minHeight: 56,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF'\n    },\n    headerLeft: {\n      width: 24,\n      height: 24\n    },\n    headerCenter: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingTop: 4,\n      pointerEvents: 'none'\n    },\n    balanceRow: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      gap: 6,\n      height: 24\n    },\n    balanceIcon: {\n      color: theme.theme.semantic?.content?.brand?.content1 ?? '#FE375B',\n      width: 20,\n      height: 20\n    },\n    balanceText: {\n      fontFamily: 'Geologica',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.3,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F'\n    },\n    closeBtn: {\n      width: 24,\n      height: 24,\n      justifyContent: 'center',\n      alignItems: 'center',\n      zIndex: 1\n    },\n    content: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      padding: 16,\n      gap: 4,\n      alignSelf: 'stretch',\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF'\n    },\n    avatarContainer: {\n      width: 88,\n      height: 88,\n      borderRadius: 999,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface2 ?? '#FFFFFF',\n      overflow: 'hidden',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    textFrame: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      padding: 0,\n      gap: 4,\n      alignSelf: 'stretch'\n    },\n    title: {\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F',\n      fontSize: 20,\n      fontWeight: '600',\n      lineHeight: 28,\n      textAlign: 'center',\n      letterSpacing: -0.7\n    },\n    subtitle: {\n      color: theme.theme.semantic?.content?.regular?.secondary ?? 'rgba(4, 6, 15, 0.5)',\n      fontSize: 14,\n      fontWeight: '500',\n      lineHeight: 20,\n      textAlign: 'center',\n      letterSpacing: -0.2\n    },\n    buttonContainer: {\n      width: '100%',\n      flexDirection: 'column',\n      gap: 8,\n      paddingHorizontal: 16,\n      paddingVertical: 16,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF'\n    },\n    button: {\n      width: '100%'\n    },\n    mainButton: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 12,\n      paddingHorizontal: 20,\n      gap: 8,\n      height: 48,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B',\n      borderRadius: 12,\n      alignSelf: 'stretch'\n    },\n    mainButtonLabel: {\n      fontSize: 16,\n      fontWeight: '600',\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: '#FFFFFF'\n    },\n    mainButtonPrice: {\n      fontSize: 16,\n      fontWeight: '600',\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: '#FFFFFF'\n    },\n    diamondWhite: {\n      color: '#FFFFFF',\n      width: 24,\n      height: 24\n    },\n    toastContainer: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      padding: 16,\n      gap: 4,\n      width: 327,\n      minHeight: 56,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 ?? '#FFFFFF',\n      borderRadius: 24,\n      shadowColor: '#04060F',\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      elevation: 8,\n      overflow: 'visible'\n    },\n    toastTimer: {\n      width: 24,\n      height: 24,\n      justifyContent: 'center',\n      alignItems: 'center',\n      position: 'relative'\n    },\n    toastTimerSvg: {\n      position: 'absolute',\n      width: 24,\n      height: 24,\n      left: 0,\n      top: 0,\n      right: 0,\n      bottom: 0\n    },\n    toastTimerTextWrap: {\n      width: 24,\n      height: 24,\n      justifyContent: 'center',\n      alignItems: 'center',\n      position: 'absolute',\n      left: 0,\n      top: 0\n    },\n    toastTimerText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.4,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F',\n      textAlign: 'center'\n    },\n    toastTitle: {\n      flex: 1,\n      fontFamily: 'Inter',\n      fontWeight: '700',\n      fontSize: 14,\n      lineHeight: 24,\n      letterSpacing: -0.2,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F'\n    },\n    toastUndo: {\n      fontFamily: 'Inter',\n      fontWeight: '700',\n      fontSize: 14,\n      lineHeight: 24,\n      letterSpacing: -0.2,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F'\n    },\n    toastWrap: {\n      flex: 1,\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      paddingBottom: safeArea.bottom + 90,\n      overflow: 'visible'\n    }\n  }), [theme, safeArea.bottom]);\n  const onTimeout = React.useCallback(() => sheet.close(false));\n  const onUndo = React.useCallback(() => sheet.close(true));\n  if (isDoubleCheck) {\n    return /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"CountdownToast\",\n      timeout: timeoutMs,\n      title: titleText,\n      undoLabel: undoLabel,\n      onUndo: onUndo,\n      onTimeout: onTimeout\n    });\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerLeft\n  }), isFirstMessage && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.headerCenter\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.balanceRow\n  }, /*#__PURE__*/React.createElement(Assets.Diamond, {\n    style: styles.balanceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.balanceText\n  }, formatWithSpaces(balance)))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.closeBtn,\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: {\n      color: theme.theme.semantic?.content?.regular?.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarContainer\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    size: 88,\n    photo: photo\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.textFrame\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, titleText), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, subtitleText))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.buttonContainer, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.mainButton,\n    onPress: () => {\n      if (isFirstMessage) {\n        try {\n          ReactNative?.Keyboard?.dismiss?.();\n        } catch (_) {}\n      }\n      sheet.close(true);\n    }\n  }, isFirstMessage ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.mainButtonLabel\n  }, primaryLabel), /*#__PURE__*/React.createElement(Assets.Diamond, {\n    style: styles.diamondWhite\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.mainButtonPrice\n  }, priceFormatted)) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.mainButtonLabel\n  }, primaryLabel)), /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"ghost\",\n    size: \"L\",\n    style: styles.button,\n    onPress: () => {\n      if (isFirstMessage) {\n        try {\n          ReactNative?.Keyboard?.dismiss?.();\n        } catch (_) {}\n      }\n      sheet.close();\n    }\n  }, secondaryLabel)));\n};"},"ChatAppbar":{"name":"ChatAppbar","key":"1952fd05cb6fdc4101e1719d2061931fee05cd0fe0e56dbba006fc835bdcfdc6","code":"deps: Avatar, ChatDropdownMenu\nfunction _empty() {}\n// Иконка стрелки назад\nconst BackArrowIcon = ({\n  size = 24,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M14.431 4.51215C14.7006 4.19785 15.1742 4.16159 15.4887 4.43109C15.8027 4.70072 15.8391 5.17439 15.5697 5.48871L9.98769 12.0004L15.5697 18.5121C15.8389 18.8266 15.8028 19.3003 15.4887 19.5698C15.1743 19.8392 14.7007 19.8027 14.431 19.4887L8.43105 12.4887C8.1903 12.2078 8.1903 11.793 8.43105 11.5121L14.431 4.51215Z\",\n  fill: color\n}));\n\n// Иконка телефона — раскомментировать при возврате кнопки звонка\n/*\nconst PhoneIcon = ({ size = 20, color = '#FFFFFF' }) => (\n  <SVG.Svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n    <SVG.Path d=\"M18.3082 15.2751C18.3082 15.5751 18.2415 15.8834 18.0999 16.1834C17.9582 16.4834 17.7749 16.7667 17.5332 17.0334C17.1249 17.4834 16.6749 17.8084 16.1665 18.0167C15.6665 18.2251 15.1249 18.3334 14.5415 18.3334C13.6915 18.3334 12.7832 18.1334 11.8249 17.7251C10.8665 17.3167 9.90822 16.7667 8.95822 16.0751C7.99989 15.3751 7.09155 14.6001 6.22489 13.7417C5.36655 12.8751 4.59155 11.9667 3.89989 11.0167C3.21655 10.0667 2.66655 9.11675 2.26655 8.17508C1.86655 7.22508 1.66655 6.31675 1.66655 5.45008C1.66655 4.88341 1.76655 4.34175 1.96655 3.84175C2.16655 3.33341 2.48322 2.86675 2.92489 2.45008C3.45822 1.92508 4.04155 1.66675 4.65822 1.66675C4.89155 1.66675 5.12489 1.71675 5.33322 1.81675C5.54989 1.91675 5.74155 2.06675 5.89155 2.28341L7.82489 5.00841C7.97489 5.21675 8.08322 5.40841 8.15822 5.59175C8.23322 5.76675 8.27489 5.94175 8.27489 6.10008C8.27489 6.30008 8.21655 6.50008 8.09989 6.69175C7.99155 6.88341 7.83322 7.08341 7.63322 7.28341L6.99989 7.94175C6.90822 8.03341 6.86655 8.14175 6.86655 8.27508C6.86655 8.34175 6.87489 8.40008 6.89155 8.46675C6.91655 8.53341 6.94155 8.58341 6.95822 8.63341C7.10822 8.90841 7.36655 9.26675 7.73322 9.70008C8.10822 10.1334 8.50822 10.5751 8.94155 11.0167C9.39155 11.4584 9.82489 11.8667 10.2665 12.2417C10.6999 12.6084 11.0582 12.8584 11.3415 13.0084C11.3832 13.0251 11.4332 13.0501 11.4915 13.0751C11.5582 13.1001 11.6249 13.1084 11.6999 13.1084C11.8415 13.1084 11.9499 13.0584 12.0415 12.9667L12.6749 12.3417C12.8832 12.1334 13.0832 11.9751 13.2749 11.8751C13.4665 11.7584 13.6582 11.7001 13.8665 11.7001C14.0249 11.7001 14.1915 11.7334 14.3749 11.8084C14.5582 11.8834 14.7499 11.9917 14.9582 12.1334L17.7165 14.0917C17.9332 14.2417 18.0832 14.4167 18.1749 14.6251C18.2582 14.8334 18.3082 15.0417 18.3082 15.2751Z\" fill={color} />\n  </SVG.Svg>\n);\n*/\n\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst MenuDotsIcon = ({\n  size = 20,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M4.16667 10C4.16667 10.9205 3.42048 11.6667 2.5 11.6667C1.57953 11.6667 0.833336 10.9205 0.833336 10C0.833336 9.07955 1.57953 8.33334 2.5 8.33334C3.42048 8.33334 4.16667 9.07955 4.16667 10Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.6667 10C11.6667 10.9205 10.9205 11.6667 10 11.6667C9.07953 11.6667 8.33334 10.9205 8.33334 10C8.33334 9.07955 9.07953 8.33334 10 8.33334C10.9205 8.33334 11.6667 9.07955 11.6667 10Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M19.1667 10C19.1667 10.9205 18.4205 11.6667 17.5 11.6667C16.5795 11.6667 15.8333 10.9205 15.8333 10C15.8333 9.07955 16.5795 8.33334 17.5 8.33334C18.4205 8.33334 19.1667 9.07955 19.1667 10Z\",\n  fill: color\n}));\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst CrownIcon = ({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst closeKeyboard = _async(function () {\n  return _continueIgnored(_catch(function () {\n    return _await(ReactNative?.Keyboard?.dismiss?.(), function () {\n      return _awaitIgnored(new Promise(r => setTimeout(r, 60)));\n    });\n  }, _empty));\n});\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  chat,\n  user,\n  loading = false,\n  onBack,\n  onCall,\n  onSubscribe,\n  onUnsubscribe,\n  onMute,\n  onReport,\n  onDelete,\n  selectionMode,\n  selectedCount = 0,\n  onExitSelectionMode,\n  onProfilePress,\n  limitContentWidthOnWideWeb = false\n}) => {\n  user = State.api?.users?.sanitizeMeta?.(user) ?? user;\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const navigation = ReactNavigation.useNavigation();\n  const {\n    width: windowWidth\n  } = ReactNative.useWindowDimensions();\n  const isWideWeb = ReactNative.Platform.OS === 'web' && windowWidth >= 960;\n  const shouldLimitContent = limitContentWidthOnWideWeb && isWideWeb;\n  const [isOnline] = State.api?.online?.useOnline?.(user?.user?.id) ?? [];\n  const [menuVisible, setMenuVisible] = React.useState(false);\n  const photo = user?.photos?.[0] ?? chat?.photo;\n  const sex = user?.card?.sex;\n  const handleMenuToggle = React.useCallback(() => {\n    closeKeyboard();\n    setMenuVisible(prev => !prev);\n  }, []);\n  const handleMenuClose = React.useCallback(() => {\n    setMenuVisible(false);\n  }, []);\n  const styles = React.useMemo(() => ({\n    wrapper: {\n      position: 'relative',\n      zIndex: 100,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1\n    },\n    contentWrapLimited: {\n      width: '100%',\n      maxWidth: 800,\n      alignSelf: 'center'\n    },\n    container: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 12,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1\n    },\n    selectionBarContainer: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      height: 48,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1\n    },\n    selectionBarLeft: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4,\n      flex: 1\n    },\n    selectionBarCenter: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      alignItems: 'center',\n      justifyContent: 'center',\n      pointerEvents: 'none'\n    },\n    selectionBarCancel: {\n      fontFamily: 'Inter',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 22,\n      letterSpacing: -0.2,\n      color: theme.theme.semantic.content.regular.primary\n    },\n    selectionBarTitle: {\n      fontFamily: 'Geologica',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.3,\n      color: theme.theme.semantic.content.regular.primary\n    },\n    leftSection: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      flex: 1\n    },\n    flex: {\n      flex: 1\n    },\n    profileTouch: {\n      flex: 1,\n      minWidth: 0\n    },\n    profileInner: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    backButtonContainer: {\n      width: 40,\n      height: 40\n    },\n    backButtonInner: {\n      width: 40,\n      height: 40,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    avatarContainer: {\n      width: 40,\n      height: 40,\n      position: 'relative'\n    },\n    onlineIndicatorContainer: {\n      position: 'absolute',\n      width: 16,\n      height: 16,\n      right: -1,\n      bottom: -1,\n      justifyContent: 'center',\n      alignItems: 'center',\n      zIndex: 1\n    },\n    onlineIndicator: {\n      width: 12,\n      height: 12,\n      backgroundColor: '#24BC75',\n      borderRadius: 999,\n      borderWidth: 2,\n      borderColor: theme.theme.semantic?.stroke?.regular?.stroke1 || '#E5E8EC'\n    },\n    nameWrap: {\n      marginLeft: 8,\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'column',\n      justifyContent: 'center'\n    },\n    nameRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 6,\n      minWidth: 0\n    },\n    name: {\n      fontFamily: 'Geologica',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      color: theme.theme.semantic.content.regular.primary,\n      flexShrink: 1\n    },\n    pro: {\n      width: 16,\n      height: 16,\n      borderRadius: 16,\n      backgroundColor: theme.theme.component.button.brand.bgDefault,\n      alignItems: 'center',\n      justifyContent: 'center',\n      flexShrink: 0\n    },\n    statusLine: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 12,\n      letterSpacing: -0.2,\n      marginTop: 0\n    },\n    statusOnline: {\n      color: '#24BC75'\n    },\n    statusOffline: {\n      color: Utils.withOpacity(theme.theme.semantic?.content?.regular?.secondary || '#04060F', 0.5)\n    },\n    rightSection: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    // Кнопка звонка — вернём при доработке\n    callButtonContainer: {\n      width: 40,\n      height: 40\n    },\n    callButtonInner: {\n      width: 40,\n      height: 40,\n      borderRadius: 999,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault || '#FE375B',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    menuButtonContainer: {\n      width: 40,\n      height: 40\n    },\n    menuButtonInner: {\n      width: 40,\n      height: 40,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    cancelButtonContainer: {\n      paddingHorizontal: 4,\n      height: 40,\n      justifyContent: 'center'\n    },\n    cancelButtonInner: {\n      paddingHorizontal: 8,\n      height: 40,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    cancelText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 16,\n      color: theme.theme.semantic?.content?.regular?.primary || '#04060F'\n    }\n  }), [theme]);\n  const iconColor = theme.theme.semantic.content.regular.primary;\n  const displayName = React.useMemo(() => {\n    const name = (user?.user?.username || chat?.title)?.trim() || t('profilePlaceholderUser') || 'User';\n    // Age display disabled. To restore: const age = user?.card?.age; if (age) return `${name}, ${age}`;\n    return name;\n  }, [chat?.title, t, user?.user?.username]);\n  const handleBack = React.useCallback(() => {\n    if (selectionMode && onExitSelectionMode) {\n      onExitSelectionMode();\n      return;\n    }\n    if (onBack) {\n      onBack();\n    }\n  }, [selectionMode, onExitSelectionMode, onBack, navigation]);\n  if (selectionMode) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.wrapper\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: shouldLimitContent ? styles.contentWrapLimited : null\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.selectionBarContainer\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.selectionBarLeft\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      styleContainer: styles.cancelButtonContainer,\n      style: styles.cancelButtonInner,\n      onPress: onExitSelectionMode\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.selectionBarCancel\n    }, \"Cancel\"))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.selectionBarCenter\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.selectionBarTitle\n    }, t('selected', selectedCount))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.flex\n    }))));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.wrapper\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: shouldLimitContent ? styles.contentWrapLimited : null\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.leftSection\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.backButtonContainer,\n    style: styles.backButtonInner,\n    onPress: handleBack\n  }, /*#__PURE__*/React.createElement(BackArrowIcon, {\n    size: 24,\n    color: iconColor\n  })), loading ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onProfilePress,\n    noloading: true,\n    styleContainer: styles.profileTouch,\n    style: styles.profileInner,\n    hitSlop: {\n      top: 12,\n      bottom: 12,\n      left: 0,\n      right: 24\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\",\n    style: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      opacity: 0\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: photo,\n    size: 40\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n    width: 40,\n    height: 40,\n    borderRadius: 20\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.nameWrap, {\n      gap: 6\n    }]\n  }, /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n    width: 120,\n    height: 14,\n    borderRadius: 4\n  }), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n    width: 72,\n    height: 10,\n    borderRadius: 4\n  }))) : /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: onProfilePress,\n    noloading: true,\n    styleContainer: styles.profileTouch,\n    style: styles.profileInner,\n    hitSlop: {\n      top: 12,\n      bottom: 12,\n      left: 0,\n      right: 24\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: photo,\n    size: 40\n  })), isOnline && /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\",\n    style: styles.onlineIndicatorContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.onlineIndicator\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.name,\n    numberOfLines: 1\n  }, displayName), user?.subscription?.hasSubscription && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: theme.theme.semantic.content.inversion.static.stPrimary\n  }))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.statusLine, isOnline ? styles.statusOnline : styles.statusOffline],\n    numberOfLines: 1\n  }, isOnline ? t('chatStatusOnline', 'online') : sex === 'female' ? t('chatStatusLastSeenRecentlyFemale') : sex === 'male' ? t('chatStatusLastSeenRecentlyMale') : t('chatStatusLastSeenRecently'))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rightSection\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.menuButtonContainer,\n    style: styles.menuButtonInner,\n    onPress: handleMenuToggle\n  }, /*#__PURE__*/React.createElement(MenuDotsIcon, {\n    size: 20,\n    color: iconColor\n  })))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatDropdownMenu\",\n    visible: menuVisible,\n    onClose: handleMenuClose,\n    onSubscribe: onSubscribe,\n    onUnsubscribe: onUnsubscribe\n    // onMute={onMute} // временно скрыто из меню\n    ,\n    onReport: onReport,\n    onDelete: onDelete,\n    isMuted: chat?.isMuted,\n    topOffset: 72\n  })));\n};"},"ChatMessage":{"name":"ChatMessage","key":"f0296eff52c0d6132418f1db068efc34cd0de967c8743e04b178368a51ad498d","code":"deps: ChatBubble, ChatEmoji, ChatCallEvent, ChatSubscriptionEvent, ChatDateSeparator\nfunction _empty() {}\nconst closeKeyboard = _async(function () {\n  return _awaitIgnored(ReactNative?.Keyboard?.dismiss?.());\n});\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst CheckBox = React.memo(() => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M17.4347 7.00685C17.7069 6.69496 18.1812 6.66258 18.4932 6.93458C18.8052 7.20692 18.8377 7.68114 18.5655 7.99318L10.7081 16.9932C10.5657 17.1563 10.3592 17.25 10.1427 17.25C9.92632 17.2499 9.72052 17.1561 9.57821 16.9932L6.43466 13.3936C6.16246 13.0816 6.19504 12.6073 6.50692 12.335C6.8189 12.0627 7.2931 12.0954 7.56552 12.4072L10.1427 15.3594L17.4347 7.00685Z\",\n    fill: \"white\"\n  }));\n});\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst MessageSelectionCheckbox = React.memo(({\n  messageId,\n  isSelected\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const style = React.useMemo(() => {\n    const borderColor = theme.theme.component?.checkbox?.borderDefault || theme.theme.component?.radioButton?.borderDefault || 'rgba(4, 6, 15, 0.4)';\n    const selectedBg = theme.theme.component?.button?.brand?.bgDefault || '#FE375B';\n    return isSelected ? {\n      width: 24,\n      height: 24,\n      borderRadius: 12,\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: selectedBg,\n      borderWidth: 2,\n      borderColor: selectedBg,\n      marginLeft: 12\n    } : {\n      width: 24,\n      height: 24,\n      borderRadius: 12,\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: 'transparent',\n      borderWidth: 2,\n      borderColor,\n      marginLeft: 12\n    };\n  }, [isSelected, theme.theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: style\n  }, isSelected ? /*#__PURE__*/React.createElement(CheckBox, null) : null);\n});\nfunction getFileUrl(path) {\n  if (!path) return null;\n  const normalized = path?.startsWith?.('/') ? path : `/api/chat/camee-chat/file/${path}`;\n  return State.getUrl(normalized);\n}\nreturn ({\n  message: messageRaw,\n  chat,\n  chatId,\n  bubbleRefsMap,\n  onReplyTilePress,\n  onRetrySend,\n  onToggleSelect,\n  onMessageLongPress,\n  selectionMode,\n  isSelected\n}) => {\n  const [ref, setRef] = React.useState(null);\n  const fromUserId = messageRaw.userId ?? messageRaw.fromUserId;\n  const user = State.api?.users?.useUser?.(fromUserId);\n  const currentUserId = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.user?.id, []));\n  const message = React.useMemo(() => {\n    const fromMedia = messageRaw?.media?.map(media => ({\n      ...media,\n      type: 'image',\n      url: getFileUrl(media.path || media.url) || '',\n      width: media.width || 0,\n      height: media.height || 0\n    })) ?? [];\n    const fromFiles = messageRaw.files?.map(file => {\n      const path = file.url || file.path;\n      const url = getFileUrl(path) || '';\n      const type = file.type === 'video' || path && /\\.(mp4|mov|webm|m4v)(\\?|$)/i.test(String(path)) ? 'video' : 'image';\n      return {\n        ...file,\n        type,\n        url\n      };\n    }) ?? [];\n    const attachments = [...(messageRaw.attachments ?? []), ...fromMedia, ...fromFiles];\n    return {\n      ...messageRaw,\n      user,\n      isOwner: currentUserId === fromUserId,\n      attachments\n    };\n  }, [messageRaw, user, fromUserId, currentUserId]);\n  const styles = React.useMemo(() => {\n    return {\n      flex: {\n        width: '100%',\n        alignSelf: 'center'\n      },\n      contentWrap: {\n        width: '100%',\n        maxWidth: 800,\n        alignSelf: 'center'\n      }\n    };\n  }, []);\n  React.useEffect(() => {\n    if (message?.id != null) {\n      if (ref) {\n        bubbleRefsMap.current[message?.id] = ref;\n      } else {\n        delete bubbleRefsMap.current[message?.id];\n      }\n      return () => {\n        delete bubbleRefsMap.current[message?.id];\n      };\n    }\n  }, [ref, message?.id]);\n  const onPress = React.useCallback(() => {\n    if (selectionMode) {\n      closeKeyboard();\n      onToggleSelect?.(messageRaw?.id);\n    }\n  }, [onToggleSelect, selectionMode, messageRaw]);\n  const onLongPress = React.useCallback(() => {\n    closeKeyboard();\n    onMessageLongPress?.(messageRaw?.id, messageRaw);\n  }, [onMessageLongPress, messageRaw]);\n  const onRetry = React.useCallback(() => {\n    return onRetrySend(messageRaw?.id, messageRaw);\n  }, [onRetrySend, messageRaw]);\n  if (!currentUserId) return null;\n  if (message.type === 'emoji') return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatEmoji\",\n    emoji: message.emoji,\n    timestamp: message.timestamp,\n    isOwner: !!message.isOwner\n  }));\n  if (message.type === 'call') return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatCallEvent\",\n    timestamp: message.timestamp,\n    text: message.text\n  }));\n  if (message.type === 'subscription') return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatSubscriptionEvent\",\n    timestamp: message.timestamp,\n    text: message.text\n  }));\n  if (message.type === 'date_separator') return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatDateSeparator\",\n    dateLabel: message.dateLabel\n  }));\n  if (message.type === 'new_separator') return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatDateSeparator\",\n    dateLabel: message.dateLabel\n  }));\n  const child = /*#__PURE__*/React.createElement(React.Fragment, null, selectionMode && /*#__PURE__*/React.createElement(MessageSelectionCheckbox, {\n    messageId: message.id,\n    isSelected: isSelected\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    ref: setRef,\n    collapsable: false,\n    style: {\n      flex: 1,\n      maxWidth: '100%'\n    }\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatBubble\",\n    messageId: message.tmpId ?? message.id,\n    text: message.text,\n    timestamp: message.timestamp,\n    isOwner: !!message.isOwner,\n    isRead: !!message.isRead,\n    sendStatus: message.sendStatus,\n    attachments: message.attachments,\n    gift: message.gift ?? null,\n    replyTo: message.replyTo,\n    onReplyTilePress: onReplyTilePress,\n    onRetry: onRetry,\n    isVisible: true\n  })));\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.flex\n  }, selectionMode && onToggleSelect || onMessageLongPress ? /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.contentWrap\n    // delayLongPress={280}\n    ,\n    onLongPress: onLongPress,\n    onPress: onPress\n  }, child) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrap\n  }, child));\n};"},"SayHello":{"name":"SayHello","key":"f72a141763a533b2b669bf8d6d0e393e9445f87d5782621d6682c1b29b20a58d","code":"deps: Avatar\nconst ChatLineIcon = ({\n  size = 16,\n  color = 'rgba(4, 6, 15, 0.5)'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9 1.33301C11.1823 1.33301 12.2736 1.33302 13.0752 1.82422C13.5237 2.09907 13.9009 2.47629 14.1758 2.9248C14.667 3.72637 14.667 4.81771 14.667 7V7.66699C14.667 9.21991 14.6668 9.99685 14.4131 10.6094C14.0748 11.4259 13.4259 12.0748 12.6094 12.4131C12.1692 12.5954 11.6436 12.6467 10.8066 12.6611C10.2399 12.6709 9.95654 12.6757 9.73145 12.8066C9.50639 12.9376 9.3661 13.1741 9.08594 13.6475L8.72461 14.2588C8.40247 14.8028 7.59754 14.8028 7.27539 14.2588L6.91406 13.6475C6.6339 13.1741 6.4936 12.9376 6.26855 12.8066C6.04346 12.6757 5.76005 12.6709 5.19336 12.6611C4.35645 12.6467 3.83083 12.5954 3.39062 12.4131C2.57412 12.0748 1.92522 11.4259 1.58691 10.6094C1.3332 9.99685 1.33301 9.21991 1.33301 7.66699V7C1.33301 4.81771 1.33302 3.72637 1.82422 2.9248C2.09907 2.47629 2.47629 2.09907 2.9248 1.82422C3.72637 1.33302 4.81771 1.33301 7 1.33301H9ZM5.33301 7.83301C5.05712 7.83318 4.83318 8.05712 4.83301 8.33301C4.83301 8.60904 5.05701 8.83283 5.33301 8.83301H9C9.27614 8.83301 9.5 8.60915 9.5 8.33301C9.49982 8.05702 9.27603 7.83301 9 7.83301H5.33301ZM5.33301 5.5C5.05701 5.50018 4.83301 5.72397 4.83301 6C4.83301 6.27603 5.05701 6.49982 5.33301 6.5H10.667C10.943 6.49982 11.167 6.27603 11.167 6C11.167 5.72397 10.943 5.50018 10.667 5.5H5.33301Z\",\n  fill: color\n}));\nreturn ({\n  chat,\n  user,\n  languages = '',\n  onSayHello,\n  loading = false,\n  inviteLoading = false,\n  error = null\n}) => {\n  user = State.api?.users?.sanitizeMeta?.(user) ?? user;\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const photo = user?.photos?.[0];\n  const sex = user?.card?.sex;\n  const isPlaceholderProfile = !!user && State.api?.users?.isApprovedProfile?.(user) === false;\n  const displayName = React.useMemo(() => {\n    const name = (user?.user?.username || (!isPlaceholderProfile ? chat?.title : ''))?.trim() || t('profilePlaceholderUser') || 'User';\n    // Age display disabled. To restore: const age = user?.card?.age; if (age) return `${name}, ${age}`;\n    return name;\n  }, [chat?.title, isPlaceholderProfile, t, user?.user?.username]);\n  const primary = theme.theme.semantic?.content?.regular?.primary ?? '#04060F';\n  const secondary = theme.theme.semantic?.content?.regular?.secondary ?? primary;\n  const btnContent = theme.theme.component?.button?.secondary?.content ?? primary;\n  const btnBgRaw = theme.theme.component?.button?.secondary?.bgDefault ?? primary;\n  const danger = theme.theme.semantic?.content?.danger?.primary ?? '#E53935';\n  const btnBg = Utils.withOpacity(btnBgRaw, 0.1);\n  const styles = React.useMemo(() => ({\n    outer: {\n      flex: 1,\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      gap: 8\n    },\n    frame: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      gap: 20,\n      maxWidth: 351,\n      width: '100%'\n    },\n    topBlock: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      gap: 8,\n      width: '100%'\n    },\n    avatarWrap: {\n      width: 80,\n      height: 80,\n      borderRadius: 999,\n      backgroundColor: '#FFFFFF',\n      overflow: 'hidden'\n    },\n    infoBlock: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      gap: 12,\n      width: '100%'\n    },\n    nameRow: {\n      width: '100%'\n    },\n    name: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 24,\n      lineHeight: 32,\n      letterSpacing: -0.7,\n      color: primary,\n      textAlign: 'center'\n    },\n    languagesRow: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      gap: 6,\n      width: '100%'\n    },\n    languagesText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: secondary,\n      opacity: 0.5,\n      textAlign: 'center'\n    },\n    bottomBlock: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      gap: 8,\n      width: '100%'\n    },\n    subtitle: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: secondary,\n      opacity: 0.5,\n      textAlign: 'center',\n      width: '100%'\n    },\n    button: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      borderRadius: 12,\n      backgroundColor: btnBg\n    },\n    buttonText: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: btnContent\n    },\n    errorText: {\n      marginTop: 8,\n      fontFamily: 'Inter',\n      fontSize: 14,\n      color: danger,\n      textAlign: 'center'\n    }\n  }), [primary, secondary, btnContent, btnBg, danger]);\n  if (loading) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        paddingHorizontal: 12,\n        gap: 32\n      }\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        alignItems: 'center',\n        gap: 8\n      }\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: {\n        position: 'absolute',\n        opacity: 0,\n        pointerEvents: 'none'\n      }\n    }, /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"Avatar\",\n      photo: photo,\n      size: 80\n    })), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n      width: 80,\n      height: 80,\n      borderRadius: 40\n    }), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n      width: 140,\n      height: 24,\n      borderRadius: 6,\n      style: {\n        marginTop: 4\n      }\n    }), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n      width: 100,\n      height: 14,\n      borderRadius: 4\n    })), /*#__PURE__*/React.createElement(Components.DSSkeleton, {\n      width: 160,\n      height: 40,\n      borderRadius: 999\n    }));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.outer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.frame\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topBlock\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: photo,\n    size: 80\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.infoBlock\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.name,\n    numberOfLines: 1\n  }, displayName)), (languages || '').trim() ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.languagesRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      opacity: 0.5\n    }\n  }, /*#__PURE__*/React.createElement(ChatLineIcon, {\n    color: secondary\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.languagesText,\n    numberOfLines: 1\n  }, languages)) : null)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomBlock\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, t('sayHelloSubtitle')), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.button,\n    disabled: inviteLoading,\n    onPress: onSayHello\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText\n  }, t('sayHelloButton'))), error ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.errorText\n  }, error) : null)));\n};"},"ChatRoomDock":{"name":"ChatRoomDock","key":"6c58ed7bd6a1b1a1b03089ce1587308843d8332b2fd393469d8a272b91958dac","code":"deps: ChatInputDock, DraggableScrollView\nconst ScrollToBottomChevronIcon = ({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 48,\n  height: 48,\n  viewBox: \"0 0 40 40\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M24.3407 17.6202C24.5504 17.4405 24.8661 17.4652 25.0458 17.6748C25.2253 17.8845 25.2016 18.2002 24.9921 18.3799L20.3251 22.3799C20.1378 22.5402 19.8609 22.5403 19.6737 22.3799L15.0077 18.3799C14.7982 18.2003 14.7737 17.8845 14.953 17.6748C15.1326 17.4653 15.4484 17.4407 15.6581 17.6202L19.9989 21.3409L24.3407 17.6202Z\",\n  fill: color\n}));\nconst MainCurrencyIcon = ({\n  size = 12,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nconst formatWithSpaces = number => String(number ?? 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\nconst QuickGiftItem = React.memo(({\n  gift,\n  styles,\n  onPress\n}) => /*#__PURE__*/React.createElement(Components.DSPressable, {\n  feedback: true,\n  noloading: true,\n  style: styles.quickGiftItem,\n  onPress: () => onPress?.(gift)\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.quickGiftImageWrap\n}, /*#__PURE__*/React.createElement(Image, {\n  source: {\n    uri: gift.imageUrl\n  },\n  style: styles.quickGiftImage,\n  contentFit: \"contain\"\n})), /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.quickGiftPriceRow\n}, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n  size: 12,\n  style: styles.quickGiftPriceIcon\n}), /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.quickGiftPrice,\n  numberOfLines: 1\n}, formatWithSpaces(gift.priceGems)))));\nreturn ({\n  showScrollToBottom = false,\n  onScrollToBottomPress,\n  newMessagesCount = 0,\n  messageText,\n  onChangeText,\n  attachments,\n  onAttachmentsChange,\n  onSend,\n  onAttachment,\n  onGiftPress,\n  onQuickGiftPress,\n  onFilesLimitExceeded,\n  forceAttachmentCallback = false,\n  replyTo,\n  onReplyToClose,\n  onReplyTilePress,\n  showPaidBadge = false,\n  paidPrice = 75,\n  selectionMode = false,\n  onCancelSelection,\n  onDeleteSelected\n}) => {\n  const theme = Theme.useTheme();\n  const {\n    width: windowWidth\n  } = ReactNative.useWindowDimensions();\n  const {\n    quickGifts\n  } = State.api?.gifts?.useQuickGifts?.() ?? {};\n  const isWideWeb = ReactNative.Platform.OS === 'web' && windowWidth >= 960;\n  const scrollToBottomIconColor = theme.theme.component?.button?.primaryInversion?.content || '#04060F';\n  const contentPrimary = theme.theme.semantic?.content?.regular?.primary || '#04060F';\n  const styles = React.useMemo(() => {\n    const scrollToBottomBtnBg = theme.theme.component?.button?.primaryInversion?.bgDefault || '#131721';\n    return {\n      contentWrap: {\n        width: '100%',\n        maxWidth: 800,\n        alignSelf: 'center',\n        paddingBottom: isWideWeb ? 8 : 0\n      },\n      dockColumn: {\n        width: '100%',\n        position: 'relative'\n      },\n      dockPanel: {\n        backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 || '#FFFFFF',\n        borderRadius: isWideWeb ? 24 : 0,\n        overflow: isWideWeb ? 'hidden' : 'visible'\n      },\n      quickGiftsPanel: {\n        width: '100%',\n        backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 || '#FFFFFF',\n        paddingTop: 0,\n        paddingBottom: 8\n      },\n      quickGiftsScroll: {\n        width: '100%'\n      },\n      quickGiftsContent: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 8,\n        paddingHorizontal: 12\n      },\n      quickGiftItem: {\n        width: 44,\n        flexShrink: 0,\n        alignItems: 'center',\n        justifyContent: 'flex-end',\n        gap: 2\n      },\n      quickGiftImageWrap: {\n        width: 44,\n        height: 44,\n        borderRadius: 22,\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      quickGiftImage: {\n        width: 32,\n        height: 32\n      },\n      quickGiftPriceRow: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 2,\n        maxWidth: 60\n      },\n      quickGiftPriceIcon: {\n        color: theme.theme.component?.button?.brand?.bgDefault || '#FE375B'\n      },\n      quickGiftPrice: {\n        fontFamily: 'Inter',\n        fontWeight: '500',\n        fontSize: 10,\n        lineHeight: 14,\n        letterSpacing: -0.2,\n        color: contentPrimary,\n        textAlign: 'center'\n      },\n      scrollBtnRow: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        top: -52,\n        flexDirection: 'row',\n        alignItems: 'flex-end',\n        paddingHorizontal: 12,\n        paddingBottom: 4,\n        justifyContent: 'flex-end'\n      },\n      scrollToBottomBtn: {\n        width: 40,\n        height: 40,\n        borderRadius: 20,\n        backgroundColor: scrollToBottomBtnBg,\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      scrollToBottomBadge: {\n        position: 'absolute',\n        top: -4,\n        right: -4,\n        minWidth: 18,\n        height: 18,\n        borderRadius: 9,\n        backgroundColor: theme.theme.component?.button?.brand?.bgDefault || '#FE375B',\n        alignItems: 'center',\n        justifyContent: 'center',\n        paddingHorizontal: 4\n      }\n    };\n  }, [theme, contentPrimary, isWideWeb]);\n  const showQuickGifts = !!onQuickGiftPress && !selectionMode && (quickGifts?.length ?? 0) > 0;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: styles.contentWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"box-none\",\n    style: styles.dockColumn\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: showScrollToBottom,\n    scale: 1,\n    translateY: 4,\n    style: styles.scrollBtnRow,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.scrollToBottomBtn,\n    onPress: onScrollToBottomPress,\n    accessible: true,\n    accessibilityRole: \"button\",\n    accessibilityLabel: \"Scroll to bottom\"\n  }, /*#__PURE__*/React.createElement(ScrollToBottomChevronIcon, {\n    color: scrollToBottomIconColor\n  }), newMessagesCount > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.scrollToBottomBadge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: '#FFFFFF',\n      fontSize: 11,\n      fontWeight: '600'\n    },\n    numberOfLines: 1\n  }, newMessagesCount > 99 ? '99+' : String(newMessagesCount))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.dockPanel\n  }, showQuickGifts && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.quickGiftsPanel\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"DraggableScrollView\",\n    horizontal: true,\n    blockParentGesture: true,\n    showsHorizontalScrollIndicator: false,\n    style: styles.quickGiftsScroll,\n    contentContainerStyle: styles.quickGiftsContent\n  }, quickGifts.map((gift, index) => /*#__PURE__*/React.createElement(QuickGiftItem, {\n    key: String(gift?.id ?? gift?.uid ?? index),\n    gift: gift,\n    styles: styles,\n    onPress: onQuickGiftPress\n  })))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatInputDock\",\n    value: messageText,\n    onChangeText: onChangeText,\n    attachments: attachments,\n    onAttachmentsChange: onAttachmentsChange,\n    onSend: onSend,\n    onAttachment: onAttachment,\n    onGiftPress: onGiftPress,\n    onFilesLimitExceeded: onFilesLimitExceeded,\n    forceAttachmentCallback: forceAttachmentCallback,\n    replyTo: replyTo,\n    onReplyToClose: onReplyToClose,\n    onReplyTilePress: onReplyTilePress,\n    showPaidBadge: showPaidBadge,\n    paidPrice: paidPrice,\n    selectionMode: selectionMode,\n    onCancelSelection: onCancelSelection,\n    onDeleteSelected: onDeleteSelected\n  }))));\n};"},"ChatRoomOverlays":{"name":"ChatRoomOverlays","key":"329187812031599f312f7823bab3174896180d62ea7b386d5a8dee7f361fc5b4","code":"deps: ChatMessageContextMenu\nconst EDGE_SWIPE_TOP = 56;\nreturn ({\n  messageContext,\n  onMessageContextClose,\n  onMessageReply,\n  onMessageDeleteForMe,\n  onMessageContextSelect\n}) => {\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatMessageContextMenu\",\n    visible: messageContext.visible,\n    messageId: messageContext.messageId,\n    layout: messageContext.layout,\n    imageUri: messageContext.imageUri,\n    isOwner: messageContext.isOwner,\n    onClose: onMessageContextClose,\n    onReply: onMessageReply,\n    onDeleteForMe: onMessageDeleteForMe,\n    onSelect: onMessageContextSelect\n  }));\n};"},"ChatAttachmentsLockedToast":{"name":"ChatAttachmentsLockedToast","key":"a5e98f6f7c60e288e1e80c7760ce4aa342aaaab9fb70f96dabb78fa97ed43e5a","code":"return ({\n  visible = false,\n  title,\n  description\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const titleText = title || t('chatAttachmentsLockedToastTitle') || 'Start chatting';\n  const descriptionText = description || t('chatAttachmentsLockedToastDescription') || t('chatAttachmentsUnlockAfterFirstMessage') || 'Photos and videos unlock after your first message';\n  const styles = React.useMemo(() => ({\n    container: {\n      position: 'absolute',\n      top: Math.max(70, 70 + (safeArea?.top || 0) * 0),\n      left: 16,\n      right: 16,\n      alignItems: 'center',\n      pointerEvents: 'none',\n      overflow: 'visible'\n    },\n    animationContainer: {\n      width: '100%',\n      alignItems: 'center',\n      overflow: 'visible'\n    },\n    toast: {\n      width: '100%',\n      maxWidth: 327,\n      minHeight: 108,\n      borderRadius: 24,\n      padding: 16,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 || '#FFFFFF',\n      shadowColor: 'rgba(4, 6, 15, 1)',\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      elevation: 8,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      gap: 4,\n      overflow: 'visible'\n    },\n    topRow: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      gap: 8,\n      minHeight: 24\n    },\n    titleText: {\n      flexShrink: 1,\n      color: theme.theme.semantic?.content?.regular?.primary || '#04060F',\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '700',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography?.family?.paragraph\n    },\n    descriptionRow: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingLeft: 32,\n      minHeight: 48\n    },\n    descriptionText: {\n      flexShrink: 1,\n      color: theme.theme.semantic?.content?.regular?.secondary || 'rgba(4, 6, 15, 0.5)',\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography?.family?.paragraph\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, {\n    visible: !!visible,\n    duration: 220,\n    translateY: -18,\n    style: styles.animationContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.toast\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topRow\n  }, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M10 6C14.4183 6 18 9.58172 18 14C18 18.4183 14.4183 22 10 22C8.7645 22 7.59445 21.7198 6.5498 21.2197C6.19076 21.0478 5.78396 20.9879 5.39941 21.0908L4.17383 21.4189C3.20749 21.6775 2.3225 20.7925 2.58105 19.8262L2.90918 18.6006C3.01207 18.216 2.95217 17.8092 2.78027 17.4502C2.28015 16.4056 2 15.2355 2 14C2 9.58172 5.58172 6 10 6ZM6.5 13C5.94772 13 5.5 13.4477 5.5 14C5.5 14.5523 5.94772 15 6.5 15C7.05228 15 7.5 14.5523 7.5 14C7.5 13.4477 7.05228 13 6.5 13ZM10 13C9.44772 13 9 13.4477 9 14C9 14.5523 9.44772 15 10 15C10.5523 15 11 14.5523 11 14C11 13.4477 10.5523 13 10 13ZM13.5 13C12.9477 13 12.5 13.4477 12.5 14C12.5 14.5523 12.9477 15 13.5 15C14.0523 15 14.5 14.5523 14.5 14C14.5 13.4477 14.0523 13 13.5 13Z\",\n    fill: \"#FE375B\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.6\",\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M15.5 2C19.0899 2 22 4.91015 22 8.5C22 9.50385 21.7726 10.4549 21.3662 11.3037C21.2267 11.5954 21.1772 11.926 21.2607 12.2383L21.5273 13.2344C21.7373 14.0195 21.0195 14.7374 20.2344 14.5273L19.2383 14.2607C18.9259 14.1772 18.5954 14.2266 18.3037 14.3662C18.1988 14.4164 18.0923 14.4641 17.9844 14.5088C17.9949 14.3407 18 14.1708 18 14C18 9.58172 14.4183 6 10 6C9.82926 6 9.65929 6.00508 9.49121 6.01562C10.4669 3.6583 12.79 2.00006 15.5 2Z\",\n    fill: \"#FE375B\"\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.titleText\n  }, titleText)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.descriptionRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 2,\n    style: styles.descriptionText\n  }, descriptionText)))));\n};"},"ChatAttachmentsFilesLimitToast":{"name":"ChatAttachmentsFilesLimitToast","key":"d904795ed0abe3cd48692ff6fb13552896d0663e524c9d5330c35ab06694dc1b","code":"return ({\n  visible = false,\n  title,\n  description\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const titleText = title || t('chatAttachmentsFilesLimitToastTitle') || t('chatAttachmentsFilesLimitToast') || 'Files limit reached';\n  const descriptionText = description || t('chatAttachmentsFilesLimitToast') || 'Only first 10 files were selected';\n  const styles = React.useMemo(() => ({\n    container: {\n      position: 'absolute',\n      top: Math.max(70, 70 + (safeArea?.top || 0) * 0),\n      left: 16,\n      right: 16,\n      alignItems: 'center',\n      pointerEvents: 'none',\n      overflow: 'visible'\n    },\n    animationContainer: {\n      width: '100%',\n      alignItems: 'center',\n      overflow: 'visible'\n    },\n    toast: {\n      width: '100%',\n      maxWidth: 327,\n      minHeight: 108,\n      borderRadius: 24,\n      padding: 16,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1 || '#FFFFFF',\n      shadowColor: 'rgba(4, 6, 15, 1)',\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      elevation: 8,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      gap: 4,\n      overflow: 'visible'\n    },\n    topRow: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      gap: 8,\n      minHeight: 24\n    },\n    titleText: {\n      flexShrink: 1,\n      color: theme.theme.semantic?.content?.regular?.primary || '#04060F',\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '700',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography?.family?.paragraph\n    },\n    descriptionRow: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingLeft: 32,\n      minHeight: 48\n    },\n    descriptionText: {\n      flexShrink: 1,\n      color: theme.theme.semantic?.content?.regular?.secondary || 'rgba(4, 6, 15, 0.5)',\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography?.family?.paragraph\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, {\n    visible: !!visible,\n    duration: 220,\n    translateY: -18,\n    style: styles.animationContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.toast\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topRow\n  }, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: \"0.5\",\n    d: \"M11.9997 2.25C13.4978 2.25 14.6339 3.11515 15.7057 4.47656C16.7685 5.82649 17.8954 7.8287 19.3415 10.3926L19.7048 11.0381C20.9036 13.1637 21.8511 14.8389 22.3464 16.1807C22.8472 17.5377 22.9662 18.7696 22.2087 19.8564C21.4733 20.9111 20.2463 21.3432 18.6989 21.5469C17.1455 21.7513 15.0518 21.75 12.363 21.75H11.6364C8.94748 21.75 6.85377 21.7514 5.30046 21.5469C3.75313 21.3431 2.526 20.9112 1.79069 19.8564C1.0333 18.7696 1.15221 17.5376 1.65299 16.1807C2.14822 14.8389 3.09575 13.1637 4.2946 11.0381L4.65788 10.3926C6.10391 7.82873 7.23091 5.82651 8.29362 4.47656C9.36545 3.11516 10.5017 2.25012 11.9997 2.25ZM11.9997 3.75C11.1872 3.75011 10.4372 4.1788 9.47233 5.4043C8.49838 6.64146 7.43649 8.52004 5.96452 11.1299L5.60124 11.7744C4.37505 13.9485 3.50355 15.4991 3.06022 16.7002C2.62281 17.8855 2.68322 18.5141 3.02116 18.999C3.38167 19.5161 4.0591 19.8703 5.49674 20.0596C6.92865 20.248 8.90311 20.25 11.6364 20.25H12.363C15.0962 20.25 17.0707 20.248 18.5026 20.0596C19.9403 19.8703 20.6176 19.5161 20.9782 18.999C21.3162 18.5141 21.3766 17.8856 20.9391 16.7002C20.4958 15.4991 19.6243 13.9485 18.3981 11.7744L18.0348 11.1299C16.5628 8.52 15.501 6.64144 14.527 5.4043C13.5621 4.17876 12.8122 3.75 11.9997 3.75Z\",\n    fill: \"#E8833B\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12 15C12.5523 15 13 15.4477 13 16C13 16.5523 12.5523 17 12 17C11.4477 17 11 16.5523 11 16C11 15.4477 11.4477 15 12 15ZM12 7.25C12.4142 7.25 12.75 7.58579 12.75 8V13C12.75 13.4142 12.4142 13.75 12 13.75C11.5858 13.75 11.25 13.4142 11.25 13V8C11.25 7.58579 11.5858 7.25 12 7.25Z\",\n    fill: \"#E8833B\"\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.titleText\n  }, titleText)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.descriptionRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 2,\n    style: styles.descriptionText\n  }, descriptionText)))));\n};"},"CardGridComponent":{"name":"CardGridComponent","key":"4ed91ddce2a2714a5c36f4db59d7197299d0ac5974afe91cfba0b255d8098494","code":"deps: FeedCard, SubscriptionsCard, LiveCard, EmptyList, SubscriptionsEmptyList, LiveEmptyState\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst Skeleton = Components.DSSkeleton ?? ReactNative.View;\nconst BASE_COLS = 2;\nconst WIDE_COLS = 3;\nconst INITIAL_LOADING_ROWS = 5;\nconst WIDE_BREAKPOINT = 800;\nconst MAX_CONTENT_WIDTH = 800;\nconst SQUARE_SIZE = 100;\nconst GAP = 8;\nconst PADDING = GAP;\nconst CARD_ASPECT = 263.85 / 171.5;\nconst HYDRATE_ROW_STEP_MS = 28;\nconst ROW_HYDRATION_BATCH_SIZE = 4;\nconst ROW_HYDRATION_BATCH_MS = 16;\nconst SCROLL_IDLE_MS = 90;\nconst WEB_SCROLL_DEPTH_THROTTLE_MS = 180;\nconst DEFAULT_INITIAL_HYDRATED_ROWS = 4;\nconst DEFAULT_DRAW_DISTANCE_MULTIPLIER = 2;\nconst DEFAULT_MAX_DRAW_DISTANCE = 1600;\nconst DEFAULT_ANDROID_DRAW_DISTANCE_MULTIPLIER = 2;\nconst DEFAULT_ANDROID_MAX_DRAW_DISTANCE = 1600;\nconst EMPTY_ITEMS = [];\nconst EMPTY_OBJECT = {};\nconst getCardItemKey = (item, index = 0) => String(item?.id ?? item?._id ?? item?.key ?? item?.slug ?? item?.user?.id ?? item?.userId ?? item?.card?.userId ?? `item-${index}`);\nconst scheduleAfterScroll = (callback, delay = 0) => {\n  let timeoutId = null;\n  let interaction = null;\n  let idleId = null;\n  let cancelled = false;\n  const run = () => {\n    if (cancelled) return;\n    if (delay > 0) {\n      timeoutId = setTimeout(() => {\n        if (!cancelled) callback();\n      }, delay);\n      return;\n    }\n    callback();\n  };\n  if (ReactNative.Platform.OS !== 'web' && ReactNative.InteractionManager?.runAfterInteractions) {\n    interaction = ReactNative.InteractionManager.runAfterInteractions(run);\n  } else if (typeof globalThis !== 'undefined' && typeof globalThis.requestIdleCallback === 'function') {\n    idleId = globalThis.requestIdleCallback(run, {\n      timeout: 300\n    });\n  } else {\n    timeoutId = setTimeout(run, 32);\n  }\n  return () => {\n    cancelled = true;\n    if (timeoutId != null) clearTimeout(timeoutId);\n    if (interaction?.cancel) interaction.cancel();\n    if (idleId != null && typeof globalThis !== 'undefined' && typeof globalThis.cancelIdleCallback === 'function') {\n      globalThis.cancelIdleCallback(idleId);\n    }\n  };\n};\nconst LoadingMoreGrid = React.memo(({\n  styles,\n  gridItemSize,\n  columnCount\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.loadingMoreRow\n}, Array.from({\n  length: columnCount\n}).map((_, index) => /*#__PURE__*/React.createElement(Skeleton, {\n  key: index,\n  height: gridItemSize * CARD_ASPECT,\n  width: gridItemSize,\n  borderRadius: 24\n}))));\nconst GridCell = React.memo(({\n  item,\n  index,\n  columnCount,\n  styles,\n  gridItemSize,\n  cardHeight,\n  cardComponentName,\n  cardExtraProps,\n  onCardOpen,\n  onMessageAttempt,\n  hydratedRowsRef,\n  isScrollActiveRef,\n  enqueueHydration,\n  deferCardMount,\n  initialHydratedRowCount\n}) => {\n  const rowIndex = Math.floor(index / columnCount);\n  const itemKey = getCardItemKey(item, index);\n  const hydrationKey = `${index}:${itemKey}`;\n  const shouldHydrateInitially = !deferCardMount || rowIndex < initialHydratedRowCount || hydratedRowsRef.current.has(hydrationKey);\n  const [hydratedKey, setHydratedKey] = React.useState(() => shouldHydrateInitially ? hydrationKey : null);\n  const shouldRenderCard = !deferCardMount || hydratedKey === hydrationKey || hydratedRowsRef.current.has(hydrationKey);\n  const hydrateCell = React.useCallback(() => {\n    hydratedRowsRef.current.add(hydrationKey);\n    setHydratedKey(previousKey => previousKey === hydrationKey ? previousKey : hydrationKey);\n  }, [hydratedRowsRef, hydrationKey]);\n  React.useEffect(() => {\n    if (!deferCardMount || rowIndex < initialHydratedRowCount) {\n      hydrateCell();\n      return undefined;\n    }\n    if (shouldRenderCard) return undefined;\n    if (isScrollActiveRef.current) {\n      return enqueueHydration(hydrationKey, hydrateCell, rowIndex);\n    }\n    let cancelQueuedHydration = null;\n    const cancelHydration = scheduleAfterScroll(() => {\n      if (isScrollActiveRef.current) {\n        cancelQueuedHydration = enqueueHydration(hydrationKey, hydrateCell, rowIndex);\n        return;\n      }\n      hydrateCell();\n    }, rowIndex % 4 * HYDRATE_ROW_STEP_MS);\n    return () => {\n      cancelHydration();\n      cancelQueuedHydration?.();\n    };\n  }, [deferCardMount, enqueueHydration, hydrateCell, hydrationKey, initialHydratedRowCount, isScrollActiveRef, rowIndex, shouldRenderCard]);\n  const columnIndex = index % columnCount;\n  const alignmentStyle = columnIndex === 0 ? styles.cellStart : columnIndex === columnCount - 1 ? styles.cellEnd : styles.cellCenter;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.gridCell, alignmentStyle]\n  }, shouldRenderCard ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.cardSlot\n  }, /*#__PURE__*/React.createElement(LazyComponent, _extends({\n    name: cardComponentName,\n    item: item,\n    width: gridItemSize\n  }, cardExtraProps, {\n    onOpen: onCardOpen,\n    onMessageAttempt: onMessageAttempt\n  }))) : /*#__PURE__*/React.createElement(Skeleton, {\n    height: cardHeight,\n    width: gridItemSize,\n    borderRadius: 24\n  }));\n}, (prev, next) => {\n  return prev.item === next.item && getCardItemKey(prev.item, prev.index) === getCardItemKey(next.item, next.index) && prev.index === next.index && prev.columnCount === next.columnCount && prev.styles === next.styles && prev.gridItemSize === next.gridItemSize && prev.cardHeight === next.cardHeight && prev.cardComponentName === next.cardComponentName && prev.cardExtraProps === next.cardExtraProps && prev.onCardOpen === next.onCardOpen && prev.onMessageAttempt === next.onMessageAttempt && prev.hydratedRowsRef === next.hydratedRowsRef && prev.isScrollActiveRef === next.isScrollActiveRef && prev.enqueueHydration === next.enqueueHydration && prev.deferCardMount === next.deferCardMount && prev.initialHydratedRowCount === next.initialHydratedRowCount;\n});\nreturn ({\n  listKey = 'CardGridComponent',\n  items,\n  isLoading,\n  isLoadingMore,\n  isEnded,\n  refreshing = false,\n  onRefresh,\n  refreshIndicatorSource,\n  refreshIndicatorTopOffset = 0,\n  onEndReached,\n  onScrollDepthChange,\n  onScrollOffsetChange,\n  onCardOpen,\n  onMessageAttempt,\n  cardComponentName,\n  cardExtraProps,\n  listHeaderComponent,\n  contentPaddingTop = 0,\n  contentPaddingBottom = GAP,\n  emptyComponentName,\n  emptyComponentProps,\n  withPageBackground = false,\n  deferCardMount = true,\n  initialHydratedRowCount = DEFAULT_INITIAL_HYDRATED_ROWS,\n  drawDistanceMultiplier,\n  maxDrawDistance\n}) => {\n  const theme = Theme.useTheme();\n  const {\n    height: screenHeight,\n    width: screenWidth\n  } = ReactNative.useWindowDimensions();\n  const [containerWidth, setContainerWidth] = React.useState(screenWidth);\n  const lastScrollDepthRef = React.useRef(0);\n  const lastWebDepthCallAtRef = React.useRef(0);\n  const scrollIdleTimeoutRef = React.useRef(null);\n  const hydrationFlushTimeoutRef = React.useRef(null);\n  const flushHydrationQueueRef = React.useRef(null);\n  const pendingHydrationRef = React.useRef(new Map());\n  const isScrollActiveRef = React.useRef(false);\n  const hydratedRowsRef = React.useRef(new Set());\n  const isWeb = ReactNative.Platform.OS === 'web';\n  const isAndroid = ReactNative.Platform.OS === 'android';\n  const shouldDeferCardMount = deferCardMount && isWeb;\n  const feedItems = items ?? EMPTY_ITEMS;\n  const safeCardExtraProps = cardExtraProps ?? EMPTY_OBJECT;\n  const safeEmptyComponentProps = emptyComponentProps ?? EMPTY_OBJECT;\n  const columnCount = containerWidth > WIDE_BREAKPOINT ? WIDE_COLS : BASE_COLS;\n  const shouldTrackScroll = isWeb && (shouldDeferCardMount || Boolean(onScrollDepthChange));\n  const shouldListenScroll = shouldTrackScroll || Boolean(onScrollOffsetChange);\n  const pageBackground = withPageBackground ? theme.theme.semantic.surface.regular.pageBackground : undefined;\n  const listWidth = Math.min(Math.max(0, containerWidth), MAX_CONTENT_WIDTH + PADDING * 2);\n  const contentWidth = Math.max(0, listWidth - PADDING * 2);\n  const gridItemSize = React.useMemo(() => {\n    if (contentWidth <= 0) return SQUARE_SIZE;\n    return Math.max(1, (contentWidth - GAP * (columnCount - 1)) / columnCount);\n  }, [contentWidth, columnCount]);\n  const cardHeight = gridItemSize * CARD_ASPECT;\n  const effectiveDrawDistanceMultiplier = drawDistanceMultiplier ?? (isAndroid ? DEFAULT_ANDROID_DRAW_DISTANCE_MULTIPLIER : DEFAULT_DRAW_DISTANCE_MULTIPLIER);\n  const effectiveMaxDrawDistance = maxDrawDistance ?? (isAndroid ? DEFAULT_ANDROID_MAX_DRAW_DISTANCE : DEFAULT_MAX_DRAW_DISTANCE);\n  const rawDrawDistance = effectiveMaxDrawDistance == null ? screenHeight * effectiveDrawDistanceMultiplier : Math.min(screenHeight * effectiveDrawDistanceMultiplier, effectiveMaxDrawDistance);\n  const drawDistance = Math.max(cardHeight + GAP, rawDrawDistance);\n  const estimatedListSize = React.useMemo(() => ({\n    height: screenHeight,\n    width: listWidth\n  }), [listWidth, screenHeight]);\n  const styles = React.useMemo(() => {\n    return {\n      root: {\n        flex: 1,\n        width: '100%',\n        minWidth: '100%',\n        backgroundColor: pageBackground\n      },\n      list: {\n        flex: 1,\n        width: listWidth,\n        alignSelf: 'center'\n      },\n      listContent: {\n        paddingHorizontal: PADDING,\n        paddingTop: contentPaddingTop,\n        paddingBottom: contentPaddingBottom,\n        flexGrow: !feedItems.length && !isLoading ? 1 : undefined\n      },\n      gridCell: {\n        width: '100%',\n        height: cardHeight + GAP\n      },\n      cellStart: {\n        alignItems: 'flex-start'\n      },\n      cellCenter: {\n        alignItems: 'center'\n      },\n      cellEnd: {\n        alignItems: 'flex-end'\n      },\n      cardSlot: {\n        width: gridItemSize,\n        height: cardHeight,\n        borderRadius: 24,\n        overflow: 'hidden',\n        backgroundColor: theme.theme.semantic?.surface?.inversion?.static?.stSurface1 ?? '#04060F'\n      },\n      loadingMoreRow: {\n        width: '100%',\n        height: cardHeight + GAP,\n        flexDirection: 'row',\n        justifyContent: 'center',\n        gap: GAP\n      }\n    };\n  }, [cardHeight, contentPaddingBottom, contentPaddingTop, feedItems.length, gridItemSize, isLoading, listWidth, pageBackground, theme]);\n  React.useEffect(() => () => {\n    if (scrollIdleTimeoutRef.current != null) {\n      clearTimeout(scrollIdleTimeoutRef.current);\n    }\n    if (hydrationFlushTimeoutRef.current != null) {\n      clearTimeout(hydrationFlushTimeoutRef.current);\n    }\n    pendingHydrationRef.current.clear();\n  }, []);\n  const onLayout = React.useCallback(e => {\n    const w = Math.round(e.nativeEvent.layout.width);\n    if (w > 0) {\n      setContainerWidth(prev => Math.abs(prev - w) < 1 ? prev : w);\n    }\n  }, []);\n  const scheduleHydrationFlush = React.useCallback((delay = 0) => {\n    if (hydrationFlushTimeoutRef.current != null) return;\n    hydrationFlushTimeoutRef.current = setTimeout(() => {\n      hydrationFlushTimeoutRef.current = null;\n      flushHydrationQueueRef.current?.();\n    }, delay);\n  }, []);\n  const flushHydrationQueue = React.useCallback(() => {\n    if (isScrollActiveRef.current || pendingHydrationRef.current.size === 0) return;\n    const entries = Array.from(pendingHydrationRef.current.entries()).sort((a, b) => a[1].rowIndex - b[1].rowIndex).slice(0, ROW_HYDRATION_BATCH_SIZE);\n    entries.forEach(([rowSignature, entry]) => {\n      pendingHydrationRef.current.delete(rowSignature);\n      entry.hydrate();\n    });\n    if (pendingHydrationRef.current.size > 0) {\n      scheduleHydrationFlush(ROW_HYDRATION_BATCH_MS);\n    }\n  }, [scheduleHydrationFlush]);\n  flushHydrationQueueRef.current = flushHydrationQueue;\n  const enqueueHydration = React.useCallback((rowSignature, hydrate, rowIndex = 0) => {\n    pendingHydrationRef.current.set(rowSignature, {\n      hydrate,\n      rowIndex\n    });\n    if (!isScrollActiveRef.current) {\n      scheduleHydrationFlush(rowIndex % 4 * HYDRATE_ROW_STEP_MS);\n    }\n    return () => {\n      pendingHydrationRef.current.delete(rowSignature);\n    };\n  }, [scheduleHydrationFlush]);\n  const listData = React.useMemo(() => {\n    if (feedItems.length) return feedItems;\n    if (!isLoading) return EMPTY_ITEMS;\n    return Array.from({\n      length: INITIAL_LOADING_ROWS * columnCount\n    }, (_, index) => ({\n      id: `loading-${index}`,\n      __cardGridLoading: true\n    }));\n  }, [columnCount, feedItems, isLoading]);\n  const renderItem = React.useCallback(({\n    item,\n    index\n  }) => {\n    const columnIndex = index % columnCount;\n    const alignmentStyle = columnIndex === 0 ? styles.cellStart : columnIndex === columnCount - 1 ? styles.cellEnd : styles.cellCenter;\n    if (item?.__cardGridLoading) {\n      return /*#__PURE__*/React.createElement(ReactNative.View, {\n        style: [styles.gridCell, alignmentStyle]\n      }, /*#__PURE__*/React.createElement(Skeleton, {\n        height: cardHeight,\n        width: gridItemSize,\n        borderRadius: 24\n      }));\n    }\n    return /*#__PURE__*/React.createElement(GridCell, {\n      item: item,\n      index: index,\n      columnCount: columnCount,\n      styles: styles,\n      gridItemSize: gridItemSize,\n      cardHeight: cardHeight,\n      cardComponentName: cardComponentName,\n      cardExtraProps: safeCardExtraProps,\n      onCardOpen: onCardOpen,\n      onMessageAttempt: onMessageAttempt,\n      hydratedRowsRef: hydratedRowsRef,\n      isScrollActiveRef: isScrollActiveRef,\n      enqueueHydration: enqueueHydration,\n      deferCardMount: shouldDeferCardMount,\n      initialHydratedRowCount: initialHydratedRowCount\n    });\n  }, [cardComponentName, cardHeight, columnCount, enqueueHydration, gridItemSize, initialHydratedRowCount, onCardOpen, onMessageAttempt, safeCardExtraProps, shouldDeferCardMount, styles]);\n  const keyExtractor = React.useCallback((item, index) => item?.__cardGridLoading ? item.id : getCardItemKey(item, index), []);\n  const getItemType = React.useCallback(item => item?.__cardGridLoading ? 'loading' : 'card', []);\n  const loadingMoreFooter = React.useMemo(() => isLoadingMore ? /*#__PURE__*/React.createElement(LoadingMoreGrid, {\n    styles: styles,\n    gridItemSize: gridItemSize,\n    columnCount: columnCount\n  }) : null, [columnCount, gridItemSize, isLoadingMore, styles]);\n  const emptyComponent = React.useMemo(() => emptyComponentName ? /*#__PURE__*/React.createElement(LazyComponent, _extends({\n    name: emptyComponentName\n  }, safeEmptyComponentProps)) : null, [emptyComponentName, safeEmptyComponentProps]);\n  const updateScrollDepth = React.useCallback(event => {\n    if (!onScrollDepthChange) return;\n    const viewportBottom = (event.nativeEvent.contentOffset?.y ?? 0) + (event.nativeEvent.layoutMeasurement?.height ?? 0);\n    const nextDepth = Math.ceil(viewportBottom / (cardHeight + GAP)) * columnCount;\n    if (nextDepth > lastScrollDepthRef.current) {\n      lastScrollDepthRef.current = nextDepth;\n      onScrollDepthChange(nextDepth);\n    }\n  }, [cardHeight, columnCount, onScrollDepthChange]);\n  const notifyScrollOffset = React.useCallback(event => {\n    if (!onScrollOffsetChange) return;\n    onScrollOffsetChange(event.nativeEvent.contentOffset?.y ?? 0, event);\n  }, [onScrollOffsetChange]);\n  const activateScroll = React.useCallback(() => {\n    if (scrollIdleTimeoutRef.current != null) {\n      clearTimeout(scrollIdleTimeoutRef.current);\n      scrollIdleTimeoutRef.current = null;\n    }\n    if (hydrationFlushTimeoutRef.current != null) {\n      clearTimeout(hydrationFlushTimeoutRef.current);\n      hydrationFlushTimeoutRef.current = null;\n    }\n    isScrollActiveRef.current = true;\n  }, []);\n  const finishScrollSoon = React.useCallback(() => {\n    if (scrollIdleTimeoutRef.current != null) {\n      clearTimeout(scrollIdleTimeoutRef.current);\n    }\n    scrollIdleTimeoutRef.current = setTimeout(() => {\n      scrollIdleTimeoutRef.current = null;\n      isScrollActiveRef.current = false;\n      scheduleHydrationFlush();\n    }, SCROLL_IDLE_MS);\n  }, [scheduleHydrationFlush]);\n  const handleScrollEnd = React.useCallback(event => {\n    updateScrollDepth(event);\n    finishScrollSoon();\n  }, [finishScrollSoon, updateScrollDepth]);\n  const handleWebScroll = React.useCallback(event => {\n    notifyScrollOffset(event);\n    if (!isWeb || !shouldTrackScroll) return;\n    activateScroll();\n    const now = Date.now();\n    if (now - lastWebDepthCallAtRef.current >= WEB_SCROLL_DEPTH_THROTTLE_MS) {\n      lastWebDepthCallAtRef.current = now;\n      updateScrollDepth(event);\n    }\n    finishScrollSoon();\n  }, [activateScroll, finishScrollSoon, isWeb, notifyScrollOffset, shouldTrackScroll, updateScrollDepth]);\n  const handleEndReached = React.useCallback(() => {\n    if (isLoading || isLoadingMore || isEnded) return;\n    onEndReached?.();\n  }, [isEnded, isLoading, isLoadingMore, onEndReached]);\n  if (!isLoading && !feedItems.length && emptyComponentName && !onRefresh) {\n    return /*#__PURE__*/React.createElement(LazyComponent, _extends({\n      name: emptyComponentName\n    }, safeEmptyComponentProps));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root,\n    onLayout: onLayout\n  }, /*#__PURE__*/React.createElement(Components.DSRefreshableFlashList, {\n    key: `${listKey}:${columnCount}`,\n    style: styles.list,\n    data: listData,\n    numColumns: columnCount,\n    renderItem: renderItem,\n    keyExtractor: keyExtractor,\n    getItemType: getItemType,\n    ListHeaderComponent: listHeaderComponent,\n    ListEmptyComponent: emptyComponent,\n    ListFooterComponent: loadingMoreFooter,\n    estimatedListSize: estimatedListSize,\n    showsVerticalScrollIndicator: false,\n    contentContainerStyle: styles.listContent,\n    refreshing: refreshing,\n    onRefresh: onRefresh,\n    refreshIndicatorSource: refreshIndicatorSource,\n    refreshIndicatorTopOffset: refreshIndicatorTopOffset,\n    onEndReached: handleEndReached,\n    onScroll: shouldListenScroll ? handleWebScroll : undefined,\n    onScrollBeginDrag: shouldTrackScroll ? activateScroll : undefined,\n    onMomentumScrollBegin: shouldTrackScroll ? activateScroll : undefined,\n    onScrollEndDrag: shouldTrackScroll ? handleScrollEnd : undefined,\n    onMomentumScrollEnd: shouldTrackScroll ? handleScrollEnd : undefined,\n    onEndReachedThreshold: 0.35,\n    decelerationRate: \"normal\",\n    drawDistance: drawDistance,\n    maintainVisibleContentPosition: {\n      disabled: true\n    },\n    scrollEventThrottle: shouldListenScroll ? 16 : isWeb ? WEB_SCROLL_DEPTH_THROTTLE_MS : 64,\n    automaticallyAdjustContentInsets: false\n  }));\n};"},"LiveCountryModal":{"name":"LiveCountryModal","key":"636633a9d9bea75aa260cc5f6cca63754fe388ee0aa90302f6e96096511e545e","code":"const formatViewerCount = value => String(Math.max(0, Math.floor(Number(value) || 0))).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\nconst ViewerIcon = React.memo(({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 12,\n  height: 12,\n  viewBox: \"0 0 12 12\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6 6.25a2.25 2.25 0 1 0 0-4.5 2.25 2.25 0 0 0 0 4.5ZM2.25 10.25c.25-1.7 1.5-2.75 3.75-2.75s3.5 1.05 3.75 2.75\",\n  stroke: color,\n  strokeWidth: 1.1,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n})));\nconst SearchIcon = React.memo(({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 20,\n  height: 20,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Circle, {\n  cx: 9,\n  cy: 9,\n  r: 5.75,\n  stroke: color,\n  strokeWidth: 1.5\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"m13.25 13.25 3.5 3.5\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n})));\nconst CheckIcon = React.memo(() => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 14,\n  height: 14,\n  viewBox: \"0 0 14 14\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"m3 7.2 2.45 2.45L11 4.5\",\n  stroke: \"#FFFFFF\",\n  strokeWidth: 1.7,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n})));\nconst Checkbox = React.memo(({\n  selected,\n  styles\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: [styles.checkbox, selected && styles.checkboxSelected]\n}, selected && /*#__PURE__*/React.createElement(CheckIcon, null)));\nreturn ({\n  initialCode = [],\n  onSave,\n  onReset\n}) => {\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const {\n    height: windowHeight\n  } = ReactNative.useWindowDimensions();\n  const keyboardSafeArea = Components.useSafeZoneMinusKeyboard(4);\n  const theme = Theme.useTheme();\n  const modal = Modals.useModal();\n  const id = modal.id;\n  const t = Locale.useTranslation();\n  const [countryViewers] = State.api?.live?.useCountryViewers?.() ?? [{\n    countries: {},\n    totalViewers: 0\n  }];\n  const [query, setQuery] = React.useState('');\n  const listRef = React.useRef(null);\n  const [selectedCodes, setSelectedCodes] = React.useState(() => [...new Set((Array.isArray(initialCode) ? initialCode : []).map(code => String(code ?? '').trim().toLowerCase()).filter(Boolean))]);\n  React.useEffect(() => {\n    State.api?.live?.updateCountryViewers?.();\n  }, []);\n  const styles = React.useMemo(() => {\n    const colors = theme.theme;\n    const surface = colors.semantic?.surface?.regular?.surface1 ?? '#FFFFFF';\n    const page = surface;\n    const primary = colors.semantic?.content?.regular?.primary ?? '#04060F';\n    const secondary = colors.semantic?.content?.regular?.secondary ?? '#898993';\n    const tertiary = colors.component?.textField?.contentTertiary ?? '#9A9AA3';\n    const stroke = colors.semantic?.stroke?.regular?.stroke2 ?? '#ECECEF';\n    const brand = colors.semantic?.content?.brand?.content1 ?? '#FE375B';\n    const buttonContent = colors.component?.button?.brand?.content ?? '#FFFFFF';\n    const paragraph = colors.typography?.family?.paragraph;\n    return {\n      sheet: {\n        width: '100%',\n        maxWidth: 800,\n        overflow: 'hidden',\n        borderTopLeftRadius: 16,\n        borderTopRightRadius: 16,\n        backgroundColor: surface\n      },\n      listContent: {\n        minHeight: windowHeight,\n        paddingTop: Math.max(68, (safeArea.top ?? 0) + 52),\n        paddingBottom: Math.max(196, (safeArea.bottom ?? 0) + 184)\n      },\n      header: {\n        width: '100%',\n        minHeight: Math.max(60, (safeArea.top ?? 0) + 48),\n        paddingTop: safeArea.top ?? 0,\n        paddingHorizontal: 16,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: surface,\n        borderBottomWidth: 1,\n        borderBottomColor: stroke\n      },\n      title: {\n        color: primary,\n        fontFamily: paragraph,\n        fontSize: 16,\n        lineHeight: 22,\n        fontWeight: '600',\n        textAlign: 'center'\n      },\n      closeButton: {\n        position: 'absolute',\n        right: 12,\n        bottom: 12,\n        width: 32,\n        height: 32,\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      close: {\n        color: primary\n      },\n      section: {\n        minHeight: 36,\n        paddingHorizontal: 16,\n        paddingTop: 14,\n        paddingBottom: 8,\n        justifyContent: 'flex-end',\n        backgroundColor: page\n      },\n      sectionText: {\n        color: secondary,\n        fontFamily: paragraph,\n        fontSize: 13,\n        lineHeight: 18,\n        fontWeight: '500'\n      },\n      row: {\n        width: '100%',\n        minHeight: 44,\n        paddingHorizontal: 16,\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 12,\n        backgroundColor: page\n      },\n      flag: {\n        width: 22,\n        height: 22,\n        borderRadius: 11,\n        overflow: 'hidden',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      rowName: {\n        flex: 1,\n        color: primary,\n        fontFamily: paragraph,\n        fontSize: 15,\n        lineHeight: 20,\n        fontWeight: '500'\n      },\n      countWrap: {\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'flex-end',\n        gap: 4\n      },\n      count: {\n        color: secondary,\n        fontFamily: paragraph,\n        fontSize: 12,\n        lineHeight: 16,\n        fontWeight: '400',\n        fontVariant: ['tabular-nums']\n      },\n      checkbox: {\n        width: 20,\n        height: 20,\n        borderRadius: 4,\n        borderWidth: 1.5,\n        borderColor: '#B9B9C0',\n        backgroundColor: surface,\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      checkboxSelected: {\n        borderColor: brand,\n        backgroundColor: brand\n      },\n      separator: {\n        height: 1,\n        marginLeft: 50,\n        backgroundColor: stroke\n      },\n      footer: {\n        paddingTop: 12,\n        paddingHorizontal: 16,\n        paddingBottom: Math.max(12, safeArea.bottom ?? 0),\n        gap: 10,\n        backgroundColor: surface,\n        borderTopWidth: 1,\n        borderTopColor: stroke\n      },\n      searchWrap: {\n        height: 44,\n        borderWidth: 1,\n        borderColor: stroke,\n        borderRadius: 10,\n        flexDirection: 'row',\n        alignItems: 'center',\n        paddingHorizontal: 12,\n        gap: 10,\n        backgroundColor: surface\n      },\n      searchInput: {\n        flex: 1,\n        height: 42,\n        padding: 0,\n        color: primary,\n        fontFamily: paragraph,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '400',\n        outlineStyle: 'none'\n      },\n      applyButton: {\n        width: '100%',\n        height: 48,\n        borderRadius: 8,\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: brand\n      },\n      applyText: {\n        color: buttonContent,\n        fontFamily: paragraph,\n        fontSize: 16,\n        lineHeight: 22,\n        fontWeight: '600'\n      },\n      clearButton: {\n        width: '100%',\n        height: 48,\n        borderRadius: 8,\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: '#F0F0F2'\n      },\n      clearText: {\n        color: primary,\n        fontFamily: paragraph,\n        fontSize: 16,\n        lineHeight: 22,\n        fontWeight: '600'\n      },\n      viewerIcon: secondary,\n      searchIcon: tertiary\n    };\n  }, [safeArea.bottom, safeArea.top, theme, windowHeight]);\n  const allCountries = React.useMemo(() => (Utils.buildCountryList(locale) ?? []).map(item => ({\n    ...item,\n    code: String(item?.code ?? '').toLowerCase(),\n    name: Utils.shortenCountryName(item?.name ?? '')\n  })).filter(item => item.code && item.name).sort((a, b) => a.name.localeCompare(b.name)), [locale]);\n  const countriesByCode = React.useMemo(() => new Map(allCountries.map(item => [item.code, item])), [allCountries]);\n  const visibleCountries = React.useMemo(() => {\n    const normalizedQuery = query.trim().toLocaleLowerCase(locale);\n    if (!normalizedQuery) return allCountries;\n    return allCountries.filter(item => item.name.toLocaleLowerCase(locale).includes(normalizedQuery));\n  }, [allCountries, locale, query]);\n  const selectedRows = React.useMemo(() => selectedCodes.map(code => countriesByCode.get(code)).filter(Boolean).filter(item => visibleCountries.includes(item)), [countriesByCode, selectedCodes, visibleCountries]);\n  const selectedSet = React.useMemo(() => new Set(selectedCodes), [selectedCodes]);\n  const countryRows = React.useMemo(() => visibleCountries.filter(item => !selectedSet.has(item.code)), [selectedSet, visibleCountries]);\n  const data = React.useMemo(() => {\n    const rows = [{\n      type: 'all',\n      key: 'all'\n    }];\n    if (selectedRows.length > 0) {\n      rows.push({\n        type: 'section',\n        key: 'selected',\n        title: t('liveCountryModalSelected')\n      });\n      rows.push(...selectedRows.map(item => ({\n        type: 'country',\n        key: `country-${item.code}`,\n        item\n      })));\n    }\n    if (countryRows.length > 0) {\n      rows.push({\n        type: 'section',\n        key: 'countries',\n        title: t('liveCountryModalCountries')\n      });\n      rows.push(...countryRows.map(item => ({\n        type: 'country',\n        key: `country-${item.code}`,\n        item\n      })));\n    }\n    return rows;\n  }, [countryRows, selectedRows, t]);\n  const close = React.useCallback(result => {\n    if (id && Sheet.scrollSheetDict[id]) {\n      Sheet.scrollSheetDict[id].close(result);\n    }\n  }, [id]);\n  const toggleCountry = React.useCallback(code => {\n    setSelectedCodes(current => current.includes(code) ? current.filter(item => item !== code) : [...current, code]);\n    requestAnimationFrame(() => {\n      requestAnimationFrame(() => {\n        listRef.current?.scrollToOffset?.({\n          offset: 0,\n          animated: false\n        });\n      });\n    });\n  }, []);\n  const apply = React.useCallback(() => {\n    onSave?.(selectedCodes);\n    close(selectedCodes);\n  }, [close, onSave, selectedCodes]);\n  const clearAll = React.useCallback(() => {\n    setSelectedCodes([]);\n    onReset?.();\n    close([]);\n  }, [close, onReset]);\n  const renderRow = React.useCallback(({\n    item: row\n  }) => {\n    if (row.type === 'section') {\n      return /*#__PURE__*/React.createElement(ReactNative.View, {\n        style: styles.section\n      }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n        style: styles.sectionText\n      }, row.title));\n    }\n    const isAll = row.type === 'all';\n    const country = row.item;\n    const code = country?.code;\n    const selected = isAll ? selectedCodes.length === 0 : selectedSet.has(code);\n    const viewerCount = isAll ? countryViewers?.totalViewers : countryViewers?.countries?.[code];\n    return /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      noloading: true,\n      scale: 0.99,\n      style: styles.row,\n      onPress: () => {\n        if (isAll) {\n          setSelectedCodes([]);\n        } else {\n          toggleCountry(code);\n        }\n      }\n    }, !isAll && /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n      code: code,\n      size: 22,\n      style: styles.flag\n    }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.rowName,\n      numberOfLines: 1\n    }, isAll ? t('liveCountryModalAllCountries') : country.name), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.countWrap\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.count\n    }, formatViewerCount(viewerCount)), /*#__PURE__*/React.createElement(ViewerIcon, {\n      color: styles.viewerIcon\n    })), /*#__PURE__*/React.createElement(Checkbox, {\n      selected: selected,\n      styles: styles\n    }));\n  }, [countryViewers?.countries, countryViewers?.totalViewers, selectedCodes.length, selectedSet, styles, t, toggleCountry]);\n  return /*#__PURE__*/React.createElement(Sheet.ScrollSheet, {\n    listRef: listRef,\n    data: data,\n    keyExtractor: item => item.key,\n    renderItem: renderRow,\n    autoScrollToEndOnContentChange: false,\n    ItemSeparatorComponent: () => /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.separator\n    }),\n    listProps: {\n      keyboardShouldPersistTaps: 'handled',\n      contentContainerStyle: styles.listContent,\n      maintainVisibleContentPosition: {\n        disabled: true\n      }\n    },\n    style: styles.sheet,\n    OverlayBuilder: /*#__PURE__*/React.createElement(ReactNative.View, {\n      pointerEvents: \"box-none\",\n      style: {\n        flex: 1,\n        justifyContent: 'space-between'\n      }\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.header\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.title,\n      numberOfLines: 1\n    }, t('liveCountryModalTitle')), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      noloading: true,\n      styleContainer: styles.closeButton,\n      onPress: () => close(false)\n    }, /*#__PURE__*/React.createElement(Assets.Close, {\n      size: 20,\n      style: styles.close\n    }))), /*#__PURE__*/React.createElement(Reanimated.View, {\n      style: [keyboardSafeArea, styles.footer]\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.searchWrap\n    }, /*#__PURE__*/React.createElement(SearchIcon, {\n      color: styles.searchIcon\n    }), /*#__PURE__*/React.createElement(ReactNative.TextInput, {\n      value: query,\n      onChangeText: setQuery,\n      placeholder: t('countryPickerSearchHint'),\n      placeholderTextColor: styles.searchIcon,\n      style: styles.searchInput\n    })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      noloading: true,\n      style: styles.applyButton,\n      onPress: apply\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.applyText\n    }, t('filterApply'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      noloading: true,\n      style: styles.clearButton,\n      onPress: clearAll\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.clearText\n    }, t('liveCountryModalClearAll')))))\n  });\n};"},"StreamingVerificationRequiredSheet":{"name":"StreamingVerificationRequiredSheet","key":"ffeb995f38d19237ca6964cd0a1ca002bc7ee5439c1f93b2e9293eb2366e0985","code":"const ArrowRightIcon = ({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8.5 4.5L15 12L8.5 19.5\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\nconst CloseIcon = ({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6.5 6.5L17.5 17.5M17.5 6.5L6.5 17.5\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\"\n}));\nreturn () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const navigation = ReactNavigation.useNavigation();\n  const sheet = Sheet.useSheet();\n  const th = theme.theme;\n  const backgroundColor = th.semantic.surface.regular.surface1 ?? '#FFFFFF';\n  const contentPrimary = th.semantic.content.regular.primary ?? '#04060F';\n  const contentSecondary = th.semantic.content.regular.secondary ?? 'rgba(4,6,15,0.5)';\n  const brandColor = th.component.button.brand.bgDefault ?? '#FE375B';\n  const brandContent = th.component.button.brand.content ?? '#FFFFFF';\n  const ghostContent = th.component.button.ghost?.content ?? contentPrimary;\n  const close = React.useCallback(() => sheet.close(false), [sheet]);\n  const verifyNow = React.useCallback(() => {\n    sheet.close(true);\n    navigation.dispatch(ReactNavigation.StackActions.push('ProfileEdit'));\n  }, [navigation, sheet]);\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      maxWidth: 600,\n      alignSelf: 'center',\n      overflow: 'hidden',\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      backgroundColor,\n      paddingBottom: Math.max(safeArea.bottom, 24)\n    },\n    header: {\n      width: '100%',\n      height: 56,\n      paddingTop: 12,\n      paddingBottom: 4,\n      paddingHorizontal: 16,\n      alignItems: 'flex-end',\n      justifyContent: 'center'\n    },\n    closeButton: {\n      width: 40,\n      height: 40,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    content: {\n      width: '100%',\n      alignItems: 'center',\n      gap: 4,\n      paddingHorizontal: 16,\n      paddingVertical: 16\n    },\n    title: {\n      width: '100%',\n      color: contentPrimary,\n      fontFamily: th.typography.family.heading,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'center'\n    },\n    description: {\n      width: '100%',\n      color: contentSecondary,\n      fontFamily: th.typography.family.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    actions: {\n      width: '100%',\n      gap: 8,\n      paddingTop: 4,\n      paddingHorizontal: 16\n    },\n    button: {\n      width: '100%',\n      height: 48,\n      borderRadius: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    primaryButton: {\n      backgroundColor: brandColor\n    },\n    primaryText: {\n      color: brandContent,\n      fontFamily: th.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.16\n    },\n    cancelText: {\n      color: ghostContent,\n      fontFamily: th.typography.family.heading,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.16\n    }\n  }), [backgroundColor, brandColor, brandContent, contentPrimary, contentSecondary, ghostContent, safeArea.bottom, th]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.closeButton,\n    onPress: close\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    color: contentPrimary\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('streamingVerificationRequiredTitle') || 'Verification Required'), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('streamingVerificationRequiredDescription') || 'Complete verification to start live streaming')), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actions\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: [styles.button, styles.primaryButton],\n    onPress: verifyNow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.primaryText\n  }, t('streamingVerifyNow') || 'Verify Now'), /*#__PURE__*/React.createElement(ArrowRightIcon, {\n    color: brandContent\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.button,\n    onPress: close\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.cancelText\n  }, t('cancel') || 'Cancel'))));\n};"},"RoomWatch":{"name":"RoomWatch","key":"7d7b2fa6b9954554603f7ea685d988d79cfc92da312a6d914a355142507c3b04","code":"deps: StreamPausedOverlay\nconst ROOM_WATCH_VIDEO_BACKDROP_OPACITY = 0.2;\nconst ROOM_WATCH_HANDOFF_GRACE_MS = 20000;\nconst ROOM_WATCH_HLS_TARGET_LATENCY_SECONDS = 5;\nconst styles = StyleSheet.create({\n  root: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    backgroundColor: 'transparent',\n    overflow: 'hidden'\n  },\n  cover: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    zIndex: 0\n  },\n  coverPhoto: {\n    zIndex: 0\n  },\n  coverHash: {\n    zIndex: 1\n  },\n  hlsCoverPhoto: {\n    zIndex: 0\n  },\n  hlsCoverHash: {\n    zIndex: 1\n  },\n  hlsVideo: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    backgroundColor: 'transparent',\n    zIndex: 2\n  },\n  hlsVideoHidden: {\n    opacity: 0\n  },\n  hlsVideoHost: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    backgroundColor: 'transparent',\n    overflow: 'hidden',\n    zIndex: 2\n  },\n  hlsPeers: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    flexDirection: 'column',\n    zIndex: 2\n  },\n  hlsPeer: {\n    flex: 1,\n    minHeight: 0,\n    width: '100%',\n    position: 'relative',\n    overflow: 'hidden'\n  },\n  offline: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: '#04060F',\n    zIndex: 4\n  }\n});\nconst isAbsoluteSource = value => /^https?:\\/\\//i.test(value) || /^data:/i.test(value) || /^file:/i.test(value) || /^blob:/i.test(value);\nconst resolveRoomWatchImageSource = value => {\n  if (!value) return null;\n  if (typeof value !== 'string') return value;\n  const source = value.trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source)) return source;\n  if (source.startsWith('/')) return State.getUrl(source);\n  return State.getUrl(`/api/component/assets/live/${source}`);\n};\nconst resolveRoomWatchMediaSource = value => {\n  if (!value) return null;\n  if (typeof value === 'object') {\n    return resolveRoomWatchMediaSource(value?.uri ?? value?.url ?? value?.src ?? null);\n  }\n  const source = String(value).trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source)) return source;\n  if (source.startsWith('/')) return State.getUrl(source);\n  return State.getUrl(source);\n};\nconst getRoomWatchPeerProfile = peer => peer?.meta ?? peer?.public ?? {};\nconst getRoomWatchPeerCard = peer => {\n  const profile = getRoomWatchPeerProfile(peer);\n  return profile?.card ?? profile?.userCard ?? {};\n};\nconst getRoomWatchPeerPhoto = peer => {\n  const profile = getRoomWatchPeerProfile(peer);\n  return profile?.photos?.[0] ?? getRoomWatchPeerCard(peer)?.mainPhoto ?? null;\n};\nconst getRoomWatchPeerPreview = (peer, fallback = null) => {\n  const photo = getRoomWatchPeerPhoto(peer);\n  const preview = peer?.preview ?? peer?.meta?.preview ?? (photo?.path ? `/file/photo/${photo.path}` : null) ?? fallback;\n  if (!preview || typeof preview !== 'string') return preview ?? null;\n  const source = preview.trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source) || source.startsWith('/')) return resolveRoomWatchMediaSource(source);\n  if (/^[a-z0-9+/]+=*$/i.test(source) && source.length > 80) {\n    return `data:image/jpeg;base64,${source}`;\n  }\n  return resolveRoomWatchMediaSource(source);\n};\nconst getRoomWatchPeerHash = (peer, fallback = null) => peer?.thumbhash ?? peer?.hash ?? peer?.meta?.thumbhash ?? peer?.meta?.hash ?? getRoomWatchPeerPhoto(peer)?.hash ?? fallback;\nconst getRoomWatchPeerBlurhash = (peer, fallback = null) => peer?.blurhash ?? peer?.meta?.blurhash ?? getRoomWatchPeerPhoto(peer)?.blurhash ?? fallback;\nconst makeRoomWatchHashSource = (thumbhash, blurhash) => thumbhash ? {\n  thumbhash\n} : blurhash ? {\n  blurhash\n} : null;\nconst getBehaviorSubjectValue = store => typeof store?.getValue === 'function' ? store.getValue() : store?.value;\nconst makeRoomWatchHlsDomId = uri => `room_watch_hls_${String(uri ?? 'empty').replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 120)}`;\nconst roomWatchSoundAttempts = new Map();\nconst setRoomWatchMuted = muted => {\n  const store = State.store.mutedStream;\n  const next = !!muted;\n  if (!!getBehaviorSubjectValue(store) !== next) store?.next?.(next);\n};\nconst applyRoomWatchWebMute = (domId, shouldMute, wantsSound) => {\n  if (ReactNative.Platform.OS !== 'web' || typeof document === 'undefined') return;\n  const attempt = (roomWatchSoundAttempts.get(domId) ?? 0) + 1;\n  roomWatchSoundAttempts.set(domId, attempt);\n  const isCurrentSoundAttempt = () => roomWatchSoundAttempts.get(domId) === attempt && !!wantsSound && !shouldMute && !getBehaviorSubjectValue(State.store.mutedStream);\n  const apply = () => {\n    const host = document.getElementById(domId);\n    const videos = host?.querySelectorAll?.('video');\n    if (!videos?.length) return false;\n    const shouldTrySound = !!wantsSound && !shouldMute;\n    videos.forEach(video => {\n      try {\n        video.muted = !!shouldMute;\n        video.defaultMuted = !!shouldMute;\n        video.volume = shouldMute ? 0 : 1;\n        if (!shouldTrySound) return;\n        const playPromise = video.play?.();\n        playPromise?.then?.(() => {\n          if (!isCurrentSoundAttempt()) return;\n          if (!!video.muted || Number(video.volume ?? 0) <= 0) setRoomWatchMuted(true);\n        })?.catch?.(() => {\n          if (!isCurrentSoundAttempt()) return;\n          setRoomWatchMuted(true);\n          try {\n            video.muted = true;\n            video.defaultMuted = true;\n            video.volume = 0;\n            video.play?.()?.catch?.(() => {});\n          } catch {\n            //\n          }\n        });\n      } catch {\n        //\n      }\n    });\n    return true;\n  };\n  if (apply()) return;\n  if (typeof requestAnimationFrame === 'function') requestAnimationFrame(apply);\n  setTimeout(apply, 60);\n  setTimeout(apply, 180);\n};\nconst startRoomWatchLiveWhenReady = roomId => {\n  if (!roomId) return () => {};\n  let stopped = false;\n  let timer = null;\n  let attempt = 0;\n  const run = () => {\n    if (stopped) return;\n    const result = State.api?.live?.startWatching?.(String(roomId), 'room-watch-active');\n    if (result != null || attempt >= 20) return;\n    attempt += 1;\n    timer = setTimeout(run, 150);\n  };\n  run();\n  return () => {\n    stopped = true;\n    if (timer) clearTimeout(timer);\n  };\n};\nconst RoomWatchHls = React.memo(({\n  uri,\n  active,\n  ready = false,\n  forceMuted = false,\n  backgroundPlayback = false,\n  showNowPlayingNotification = false,\n  previewSource,\n  thumbhash,\n  blurhash,\n  syncKey,\n  onFirstFrameRender,\n  onError\n}) => {\n  const hashSource = React.useMemo(() => makeRoomWatchHashSource(thumbhash, blurhash), [thumbhash, blurhash]);\n  const domId = React.useMemo(() => makeRoomWatchHlsDomId(uri), [uri]);\n  const [mutedStream] = Hooks.useBehaviorSubject(State.store.mutedStream);\n  const onFirstFrameRenderRef = React.useRef(onFirstFrameRender);\n  React.useEffect(() => {\n    onFirstFrameRenderRef.current = onFirstFrameRender;\n  }, [onFirstFrameRender]);\n  const applyMute = React.useCallback(nextMuted => {\n    const shouldMute = active === false || !!forceMuted || !!nextMuted;\n    const wantsSound = active !== false && !forceMuted && !nextMuted;\n    applyRoomWatchWebMute(domId, shouldMute, wantsSound);\n  }, [active, domId, forceMuted]);\n  React.useEffect(() => {\n    applyMute(mutedStream);\n  }, [applyMute, mutedStream]);\n  const handleFirstFrameRender = React.useCallback(() => {\n    onFirstFrameRenderRef.current?.();\n  }, []);\n  const videoSource = React.useMemo(() => ({\n    uri\n  }), [uri]);\n  const effectiveMuted = active === false || !!forceMuted || !!mutedStream;\n  const effectiveVolume = effectiveMuted ? 0 : 1;\n  if (!uri || !Components.DSHLSVideo) return null;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    nativeID: domId,\n    style: [styles.hlsVideoHost, {\n      opacity: ready ? 1 : 0\n    }],\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(Components.DSHLSVideo, {\n    source: videoSource,\n    style: styles.hlsVideo,\n    contentFit: \"cover\",\n    active: active !== false,\n    autoPlay: active !== false,\n    muted: effectiveMuted,\n    volume: effectiveVolume,\n    loop: false,\n    nativeControls: false,\n    pointerEvents: \"none\",\n    syncKey: syncKey,\n    syncLatencySeconds: ROOM_WATCH_HLS_TARGET_LATENCY_SECONDS,\n    staysActiveInBackground: backgroundPlayback && active !== false && !forceMuted,\n    showNowPlayingNotification: showNowPlayingNotification && ready && !effectiveMuted,\n    onFirstFrameRender: handleFirstFrameRender,\n    onError: onError\n  }));\n});\nconst RoomWatchHlsTransition = React.memo(({\n  uri,\n  active,\n  previewSource,\n  thumbhash,\n  blurhash,\n  syncKey,\n  backgroundPlayback = false,\n  showNowPlayingNotification = false,\n  onFirstFrameRender,\n  onError\n}) => {\n  const targetUriRef = React.useRef(uri);\n  const visibleUriRef = React.useRef(uri);\n  const [visibleUri, setVisibleUri] = React.useState(uri);\n  const [layerUris, setLayerUris] = React.useState(() => uri ? [uri] : []);\n  React.useEffect(() => {\n    targetUriRef.current = uri;\n    if (!uri) return;\n    setLayerUris(current => {\n      const next = [visibleUriRef.current, uri].filter(Boolean);\n      const unique = [...new Set(next)];\n      if (current.length === unique.length && current.every((value, index) => value === unique[index])) {\n        return current;\n      }\n      return unique;\n    });\n  }, [uri]);\n  const handleLayerReady = React.useCallback(layerUri => {\n    if (!layerUri || layerUri !== targetUriRef.current) return;\n    visibleUriRef.current = layerUri;\n    setVisibleUri(layerUri);\n    setLayerUris(current => current.length === 1 && current[0] === layerUri ? current : [layerUri]);\n    onFirstFrameRender?.(layerUri);\n  }, [onFirstFrameRender]);\n  if (!layerUris.length) return null;\n  return /*#__PURE__*/React.createElement(React.Fragment, null, layerUris.map(layerUri => /*#__PURE__*/React.createElement(RoomWatchHls, {\n    key: layerUri,\n    uri: layerUri,\n    active: active !== false,\n    ready: visibleUri === layerUri,\n    forceMuted: !!visibleUri && visibleUri !== layerUri,\n    previewSource: previewSource,\n    thumbhash: thumbhash,\n    blurhash: blurhash,\n    syncKey: syncKey,\n    backgroundPlayback: backgroundPlayback,\n    showNowPlayingNotification: showNowPlayingNotification,\n    onFirstFrameRender: () => handleLayerReady(layerUri),\n    onError: onError\n  })));\n});\nconst RoomWatchFallback = React.memo(({\n  source,\n  thumbhash,\n  blurhash,\n  overlay = false\n}) => {\n  const hashSource = React.useMemo(() => makeRoomWatchHashSource(thumbhash, blurhash), [thumbhash, blurhash]);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, !!source && /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory-disk\",\n    style: [styles.cover, styles.coverPhoto, overlay ? styles.hlsCoverPhoto : null, {\n      opacity: ROOM_WATCH_VIDEO_BACKDROP_OPACITY\n    }],\n    source: source,\n    placeholder: hashSource ?? source,\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\",\n    thumbhash: thumbhash,\n    blurhash: blurhash\n  }), !!hashSource && /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory-disk\",\n    source: null,\n    placeholder: hashSource,\n    style: [styles.cover, styles.coverHash, overlay ? styles.hlsCoverHash : null],\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\",\n    thumbhash: thumbhash,\n    blurhash: blurhash\n  }));\n});\nconst getRoomWatchRoomId = (item, roomId) => {\n  const id = roomId ?? item?.roomId ?? item?.room?.roomId ?? item?.id ?? null;\n  return id != null ? String(id) : null;\n};\nconst getRoomWatchPeerId = peer => peer?.meta?.sessionId ?? peer?.sessionId ?? peer?.id ?? null;\nconst getRoomWatchPeerKey = peer => String(getRoomWatchPeerId(peer));\nconst compareRoomWatchPeers = (left, right) => getRoomWatchPeerKey(left).localeCompare(getRoomWatchPeerKey(right));\nconst getRoomWatchPlaybackPeers = playback => playback?.peers && typeof playback.peers === 'object' ? playback.peers : {};\nconst getRoomWatchPlaybackOnlyParticipants = item => Object.values(getRoomWatchPlaybackPeers(item?.playback)).map(playback => ({\n  id: playback?.sessionId,\n  sessionId: playback?.sessionId,\n  playback,\n  hlsUrl: playback?.hlsUrl ?? null,\n  hlsStatus: playback?.status ?? null,\n  hasAudio: playback?.producers?.audio ?? false,\n  hasVideo: playback?.producers?.video ?? false,\n  streamPaused: playback?.streamPaused === true,\n  meta: {}\n})).filter(peer => !!peer.sessionId).sort(compareRoomWatchPeers);\nconst getRoomWatchItemParticipants = item => {\n  const candidates = [item?.room?.meta?.participants, item?.streamStatus?.room?.meta?.participants, item?.meta?.participants, item?.room?.participants, item?.room?.meta?.members, item?.meta?.members];\n  for (const candidate of candidates) {\n    if (Array.isArray(candidate) && candidate.length > 0) return candidate;\n  }\n  return getRoomWatchPlaybackOnlyParticipants(item);\n};\nconst isRoomWatchParticipantPaused = participant => participant?.streamPaused === true || Array.isArray(participant?.producers) && participant.producers.length > 0 && participant.producers.every(producer => producer?.paused === true);\nconst getRoomWatchPeerPlayback = (item, peer) => {\n  const peerId = getRoomWatchPeerId(peer);\n  if (!peerId) return peer?.playback ?? null;\n  return peer?.playback ?? getRoomWatchPlaybackPeers(item?.playback)[String(peerId)] ?? null;\n};\nconst getRoomWatchHlsPeer = (item, participant) => {\n  const peerId = getRoomWatchPeerId(participant);\n  if (!peerId) return null;\n  const playback = getRoomWatchPeerPlayback(item, participant);\n  const hlsStatus = participant?.hlsStatus ?? playback?.status ?? null;\n  const hasVideo = playback?.producers?.video ?? participant?.hasVideo ?? false;\n  const hlsUrl = hlsStatus === 'ready' && hasVideo ? resolveRoomWatchMediaSource(participant?.hlsUrl ?? playback?.hlsUrl) : null;\n  return {\n    ...participant,\n    id: participant?.id ?? peerId,\n    sessionId: participant?.meta?.sessionId ?? participant?.sessionId ?? peerId,\n    playback,\n    hlsUrl,\n    hlsStatus,\n    hasAudio: playback?.producers?.audio ?? participant?.hasAudio ?? false,\n    hasVideo,\n    streamPaused: isRoomWatchParticipantPaused(participant)\n  };\n};\nconst getRoomWatchHlsPeers = item => {\n  const byId = new Map();\n  const playbackPeers = getRoomWatchPlaybackPeers(item?.playback);\n  const participantsById = new Map();\n  getRoomWatchItemParticipants(item).forEach(participant => {\n    const peerId = getRoomWatchPeerId(participant);\n    if (!participant || !peerId || participant?.role === 'viewer') return;\n    participantsById.set(String(peerId), participant);\n  });\n  const addPeer = participant => {\n    const peer = getRoomWatchHlsPeer(item, participant);\n    const peerId = getRoomWatchPeerId(peer);\n    if (!peer || !peerId) return;\n    byId.set(String(peerId), {\n      ...(byId.get(String(peerId)) ?? {}),\n      ...peer,\n      meta: {\n        ...(byId.get(String(peerId))?.meta ?? {}),\n        ...(peer?.meta ?? {})\n      }\n    });\n  };\n  const sourcePeers = participantsById.size > 0 ? [...participantsById.values()] : getRoomWatchPlaybackOnlyParticipants(item);\n  sourcePeers.forEach(participant => {\n    const peerId = getRoomWatchPeerId(participant);\n    const playback = playbackPeers[String(peerId)] ?? participant?.playback ?? null;\n    addPeer({\n      ...participant,\n      playback,\n      hlsUrl: playback?.hlsUrl ?? participant?.hlsUrl ?? null,\n      hlsStatus: playback?.status ?? participant?.hlsStatus ?? null\n    });\n  });\n  return [...byId.values()].sort(compareRoomWatchPeers);\n};\nconst getRoomWatchHlsPeersSignature = peers => (peers ?? []).map(peer => `${getRoomWatchPeerKey(peer)}:${peer?.hlsUrl ?? ''}:${isRoomWatchParticipantPaused(peer) ? 1 : 0}`).join('|');\nconst getRoomWatchHlsErrorStatus = error => {\n  const status = Number(error?.status ?? error?.statusCode ?? error?.response?.code ?? error?.response?.status ?? error?.networkDetails?.status ?? error?.networkDetails?.statusCode ?? 0);\n  return Number.isFinite(status) && status > 0 ? status : null;\n};\nreturn ({\n  item: sourceItem,\n  roomId,\n  active = true,\n  cover,\n  coverThumbhash,\n  coverBlurhash\n}) => {\n  const targetRoomId = getRoomWatchRoomId(sourceItem, roomId);\n  const [liveStreams] = Hooks.useBehaviorSubject(State.store.liveStreams);\n  const storeItem = React.useMemo(() => {\n    if (!targetRoomId) return null;\n    const items = liveStreams?.items ?? [];\n    return items.find(nextItem => String(getRoomWatchRoomId(nextItem)) === String(targetRoomId)) ?? null;\n  }, [liveStreams?.items, targetRoomId]);\n  const item = storeItem ? {\n    ...(sourceItem ?? {}),\n    ...storeItem\n  } : sourceItem;\n  const hlsUrl = resolveRoomWatchMediaSource(item?.playback?.hlsUrl);\n  const hlsStatus = item?.playback?.status ?? null;\n  const isStreamEnded = item?.ended === true;\n  const hlsPeers = React.useMemo(() => getRoomWatchHlsPeers(item), [item]);\n  const hlsPeersSignature = getRoomWatchHlsPeersSignature(hlsPeers);\n  const [retainedHls, setRetainedHls] = React.useState(() => ({\n    roomId: targetRoomId,\n    peers: hlsPeers\n  }));\n  const handoffTimerRef = React.useRef(null);\n  const [readyHlsPeers, setReadyHlsPeers] = React.useState({});\n  const handleHlsError = React.useCallback(error => {\n    if (getRoomWatchHlsErrorStatus(error) !== 403 || !targetRoomId || isStreamEnded) return;\n    State.api?.live?.markViewerKicked?.(targetRoomId, Date.now());\n    State.api?.live?.stopWatching?.(targetRoomId);\n  }, [isStreamEnded, targetRoomId]);\n  React.useEffect(() => {\n    if (isStreamEnded) {\n      if (handoffTimerRef.current) {\n        clearTimeout(handoffTimerRef.current);\n        handoffTimerRef.current = null;\n      }\n      setRetainedHls(current => current.roomId === targetRoomId && current.peers.length === 0 ? current : {\n        roomId: targetRoomId,\n        peers: []\n      });\n      setReadyHlsPeers(current => Object.keys(current).length === 0 ? current : {});\n      return;\n    }\n    if (hlsPeers.length > 0) {\n      if (handoffTimerRef.current) {\n        clearTimeout(handoffTimerRef.current);\n        handoffTimerRef.current = null;\n      }\n      setRetainedHls(current => current.roomId === targetRoomId && getRoomWatchHlsPeersSignature(current.peers) === hlsPeersSignature ? current : {\n        roomId: targetRoomId,\n        peers: hlsPeers\n      });\n      return;\n    }\n    setRetainedHls(current => {\n      if (current.roomId === targetRoomId) return current;\n      return {\n        roomId: targetRoomId,\n        peers: []\n      };\n    });\n    if (retainedHls.roomId !== targetRoomId || retainedHls.peers.length === 0 || handoffTimerRef.current) {\n      return;\n    }\n    handoffTimerRef.current = setTimeout(() => {\n      handoffTimerRef.current = null;\n      setRetainedHls(current => current.roomId === targetRoomId ? {\n        ...current,\n        peers: []\n      } : current);\n    }, ROOM_WATCH_HANDOFF_GRACE_MS);\n  }, [hlsPeersSignature, isStreamEnded, targetRoomId]);\n  React.useEffect(() => () => {\n    if (handoffTimerRef.current) clearTimeout(handoffTimerRef.current);\n  }, []);\n  const retainedPeers = retainedHls.roomId === targetRoomId ? retainedHls.peers : [];\n  const displayHlsPeers = isStreamEnded ? [] : hlsPeers.length > 0 ? hlsPeers : retainedPeers;\n  const shouldRenderHls = displayHlsPeers.length === 0 && !!hlsUrl && hlsStatus === 'ready';\n  React.useEffect(() => {\n    if (!active || !targetRoomId) return;\n    return startRoomWatchLiveWhenReady(targetRoomId);\n  }, [active, targetRoomId]);\n  const itemParticipants = getRoomWatchItemParticipants(item);\n  const firstItemPeer = itemParticipants.find(participant => participant?.role !== 'viewer') ?? itemParticipants[0] ?? null;\n  const rootStreamPaused = isRoomWatchParticipantPaused(firstItemPeer);\n  const source = resolveRoomWatchImageSource(cover ?? getRoomWatchPeerPreview(firstItemPeer) ?? item?.preview ?? null);\n  const thumbhash = coverThumbhash ?? getRoomWatchPeerHash(firstItemPeer, item?.hash ?? null);\n  const blurhash = coverBlurhash ?? null;\n  const hashSource = React.useMemo(() => makeRoomWatchHashSource(thumbhash, blurhash), [thumbhash, blurhash]);\n  const fallbackPhotoOpacity = ROOM_WATCH_VIDEO_BACKDROP_OPACITY;\n  const roomHlsSyncKey = targetRoomId ? `live-room:${targetRoomId}` : null;\n  const rootHlsReady = readyHlsPeers.root === hlsUrl;\n  const markHlsPeerReady = React.useCallback((key, uri) => {\n    if (!key || !uri) return;\n    const readyKey = String(key);\n    setReadyHlsPeers(current => current?.[readyKey] === uri ? current : {\n      ...current,\n      [readyKey]: uri\n    });\n  }, []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root,\n    pointerEvents: \"none\"\n  }, !isStreamEnded && !!source && !rootHlsReady && /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory-disk\",\n    style: [styles.cover, styles.coverPhoto, styles.hlsCoverPhoto, {\n      opacity: fallbackPhotoOpacity\n    }],\n    source: source,\n    placeholder: hashSource ?? source,\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\",\n    thumbhash: thumbhash,\n    blurhash: blurhash\n  }), !isStreamEnded && !!hashSource && !rootHlsReady && /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory-disk\",\n    source: null,\n    placeholder: hashSource,\n    style: [styles.cover, styles.coverHash, styles.hlsCoverHash],\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\",\n    thumbhash: thumbhash,\n    blurhash: blurhash\n  }), !isStreamEnded && shouldRenderHls ? /*#__PURE__*/React.createElement(RoomWatchHlsTransition, {\n    uri: hlsUrl,\n    active: active !== false && !rootStreamPaused,\n    previewSource: source,\n    thumbhash: thumbhash,\n    blurhash: blurhash,\n    syncKey: roomHlsSyncKey,\n    backgroundPlayback: true,\n    showNowPlayingNotification: true,\n    onFirstFrameRender: readyUri => markHlsPeerReady('root', readyUri),\n    onError: handleHlsError\n  }) : null, !isStreamEnded && shouldRenderHls && rootStreamPaused ? /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StreamPausedOverlay\",\n    zIndex: 3\n  }) : null, !isStreamEnded && displayHlsPeers.length > 0 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.hlsPeers,\n    pointerEvents: \"none\"\n  }, displayHlsPeers.map((peer, peerIndex) => {\n    const peerKey = getRoomWatchPeerKey(peer);\n    const peerHlsReady = readyHlsPeers[peerKey] === peer.hlsUrl;\n    const peerPreviewSource = getRoomWatchPeerPreview(peer, source);\n    const peerThumbhash = getRoomWatchPeerHash(peer, thumbhash);\n    const peerBlurhash = getRoomWatchPeerBlurhash(peer, blurhash);\n    const peerPaused = isRoomWatchParticipantPaused(peer);\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: peerKey,\n      style: styles.hlsPeer,\n      pointerEvents: \"none\"\n    }, !peerHlsReady || peerPaused ? /*#__PURE__*/React.createElement(RoomWatchFallback, {\n      source: peerPreviewSource,\n      thumbhash: peerThumbhash,\n      blurhash: peerBlurhash,\n      overlay: true\n    }) : null, peer.hlsUrl ? /*#__PURE__*/React.createElement(RoomWatchHlsTransition, {\n      uri: peer.hlsUrl,\n      active: active !== false && !peerPaused,\n      previewSource: peerPreviewSource,\n      thumbhash: peerThumbhash,\n      blurhash: peerBlurhash,\n      syncKey: roomHlsSyncKey,\n      backgroundPlayback: true,\n      showNowPlayingNotification: peerIndex === 0,\n      onFirstFrameRender: readyUri => markHlsPeerReady(peerKey, readyUri),\n      onError: handleHlsError\n    }) : null, peerPaused ? /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"StreamPausedOverlay\",\n      zIndex: 3\n    }) : null);\n  })) : null, isStreamEnded ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.offline,\n    pointerEvents: \"none\"\n  }) : null);\n};"},"StreamChatOverlay":{"name":"StreamChatOverlay","key":"a3890000a23324caa5cbf183420fae34188b59cc1868f5555026f18fd29f374d","code":"deps: Avatar, StreamChatUserMenu, StreamViewerRemoveConfirmModal, StreamViewerRemovedToast\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nlet rulesShownSessionId = null;\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst StreamChatMessage = React.memo(({\n  message,\n  currentUserId,\n  styles,\n  t,\n  onSenderPress\n}) => {\n  const user = State.api.users.useUser(message.senderId);\n  const senderAnchorRef = React.useRef(null);\n  const photo = user?.photos?.[0] ?? user?.card?.mainPhoto;\n  const senderName = message.senderId === currentUserId ? t('you') : message.senderName;\n  const giftImageUrl = message.gift?.imageUrl;\n  const canOpenUserMenu = onSenderPress != null && message.senderId !== currentUserId;\n  const handleSenderPress = React.useCallback(() => {\n    if (!canOpenUserMenu) return;\n    const ref = senderAnchorRef.current;\n    if (typeof ref?.measureInWindow !== 'function') return;\n    ref.measureInWindow((x, y, width, height) => {\n      onSenderPress({\n        ...message,\n        user\n      }, {\n        x,\n        y,\n        width,\n        height\n      });\n    });\n  }, [canOpenUserMenu, message, onSenderPress, user]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.message\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    ref: senderAnchorRef,\n    collapsable: false\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: photo,\n    size: 28,\n    placeholderBackgroundColor: \"#FFFFFF\",\n    onPress: canOpenUserMenu ? handleSenderPress : undefined\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.messageContent\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    disabled: !canOpenUserMenu,\n    onPress: handleSenderPress\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.senderName,\n    numberOfLines: 1\n  }, senderName)), message.gift ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.gift\n  }, !!giftImageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: State.getUrl(giftImageUrl)\n    },\n    style: styles.giftImage,\n    contentFit: \"contain\",\n    cachePolicy: \"memory-disk\"\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftPrice\n  }, /*#__PURE__*/React.createElement(Assets.Diamond, {\n    size: 12,\n    style: styles.giftPriceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftPriceText,\n    numberOfLines: 1\n  }, message.gift.priceGems.toLocaleString('ru-RU')))) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.messageText\n  }, message.text)));\n});\nfunction _empty() {}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  roomId,\n  showRules = true,\n  enableUserMenu = false\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const session = State.api.session.useSession();\n  const {\n    messages\n  } = State.api.streamChat.useRoom(roomId);\n  const listRef = React.useRef(null);\n  const [rulesRoomId, setRulesRoomId] = React.useState(null);\n  const [userMenu, setUserMenu] = React.useState({\n    visible: false,\n    message: null,\n    layout: null\n  });\n  State.api?.audit?.useLifecycleAudit?.({\n    kind: 'modal',\n    name: 'StreamChatOverlay',\n    active: roomId != null,\n    presentation: 'inline-overlay',\n    source: 'stream',\n    params: {\n      roomId\n    }\n  });\n  const handleSenderPress = React.useCallback((message, layout) => {\n    if (!enableUserMenu) return;\n    setUserMenu({\n      visible: true,\n      message,\n      layout\n    });\n  }, [enableUserMenu]);\n  const closeUserMenu = React.useCallback(() => {\n    setUserMenu({\n      visible: false,\n      message: null,\n      layout: null\n    });\n  }, []);\n  const openUserChat = React.useCallback(() => {\n    const senderId = userMenu.message?.senderId;\n    if (senderId == null) return;\n    State.api?.chat?.openModal?.(senderId, 'stream_chat', {\n      showLiveNotification: true\n    });\n  }, [userMenu.message]);\n  const removeUser = React.useCallback(_async(function () {\n    const userId = userMenu.message?.senderId;\n    if (roomId == null || userId == null) return;\n    return _await(Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"StreamViewerRemoveConfirmModal\",\n      user: userMenu.message?.user\n    }), {\n      theme: 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden',\n          backgroundColor: 'transparent'\n        }\n      }\n    }), function (confirmed) {\n      if (confirmed !== true) return;\n      return _continueIgnored(_catch(function () {\n        return _await(State.post('/api/stream-chat/moderation/kick', {\n          roomId: String(roomId),\n          userId: String(userId)\n        }, 'json'), function () {\n          const notificationKey = `stream-viewer-removed-${String(userId)}`;\n          Notification.showNotification({\n            key: notificationKey,\n            children: /*#__PURE__*/React.createElement(LazyComponent, {\n              name: \"StreamViewerRemovedToast\",\n              notificationKey: notificationKey\n            }),\n            duration: 5000\n          });\n        });\n      }, function (error) {\n        Notification.showNotification({\n          text: error?.message ?? t('unknownError'),\n          type: 'error',\n          duration: 5000\n        });\n      }));\n    });\n  }), [roomId, t, userMenu.message]);\n  const styles = React.useMemo(() => {\n    const paragraphFont = theme.theme.typography?.family?.paragraph;\n    return {\n      root: {\n        width: '100%',\n        height: 200,\n        overflow: 'hidden'\n      },\n      list: {\n        flex: 1\n      },\n      content: {\n        flexGrow: 1,\n        justifyContent: 'flex-end',\n        gap: 6,\n        paddingVertical: 4,\n        paddingRight: 10\n      },\n      rules: {\n        width: '100%',\n        maxWidth: 300,\n        color: '#FFFFFF',\n        fontFamily: paragraphFont,\n        fontSize: 12,\n        lineHeight: 18,\n        fontWeight: '700',\n        textShadowColor: 'rgba(4,6,15,0.5)',\n        textShadowOffset: {\n          width: 0,\n          height: 2\n        },\n        textShadowRadius: 8\n      },\n      message: {\n        width: '100%',\n        maxWidth: 300,\n        flexDirection: 'row',\n        alignItems: 'flex-start',\n        gap: 6\n      },\n      messageContent: {\n        flex: 1,\n        minWidth: 0,\n        flexDirection: 'row',\n        flexWrap: 'wrap',\n        alignItems: 'center'\n      },\n      senderName: {\n        height: 28,\n        maxWidth: 232,\n        flexShrink: 1,\n        paddingVertical: 5,\n        paddingRight: 8,\n        color: 'rgba(255,255,255,0.6)',\n        fontFamily: paragraphFont,\n        fontSize: 12,\n        lineHeight: 18,\n        fontWeight: '700',\n        textShadowColor: 'rgba(4,6,15,0.5)',\n        textShadowOffset: {\n          width: 0,\n          height: 2\n        },\n        textShadowRadius: 8\n      },\n      messageText: {\n        maxWidth: 232,\n        flexShrink: 1,\n        color: '#FFFFFF',\n        fontFamily: paragraphFont,\n        fontSize: 12,\n        lineHeight: 18,\n        fontWeight: '500',\n        textShadowColor: 'rgba(4,6,15,0.5)',\n        textShadowOffset: {\n          width: 0,\n          height: 2\n        },\n        textShadowRadius: 8\n      },\n      gift: {\n        height: 28,\n        flexDirection: 'row',\n        alignItems: 'center',\n        gap: 4\n      },\n      giftImage: {\n        width: 28,\n        height: 28,\n        borderRadius: 4\n      },\n      giftPrice: {\n        height: 28,\n        paddingHorizontal: 8,\n        gap: 4,\n        flexDirection: 'row',\n        alignItems: 'center',\n        borderRadius: 999,\n        backgroundColor: 'rgba(4,6,15,0.5)'\n      },\n      giftPriceIcon: {\n        color: '#FE375B'\n      },\n      giftPriceText: {\n        flexShrink: 0,\n        color: '#FFFFFF',\n        fontFamily: paragraphFont,\n        fontSize: 10,\n        lineHeight: 14,\n        fontWeight: '500',\n        letterSpacing: 0\n      }\n    };\n  }, [theme]);\n  React.useEffect(() => {\n    listRef.current?.scrollToEnd?.({\n      animated: messages.length > 0\n    });\n  }, [messages.length]);\n  React.useEffect(() => {\n    closeUserMenu();\n  }, [closeUserMenu, roomId]);\n  React.useEffect(() => {\n    const sessionId = session?.sessionId;\n    if (!showRules || !sessionId || rulesShownSessionId === sessionId) return;\n    rulesShownSessionId = sessionId;\n    setRulesRoomId(roomId);\n  }, [roomId, session?.sessionId, showRules]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n    ref: listRef,\n    style: styles.list,\n    contentContainerStyle: styles.content,\n    showsVerticalScrollIndicator: true,\n    nestedScrollEnabled: true,\n    onContentSizeChange: () => listRef.current?.scrollToEnd?.({\n      animated: false\n    })\n  }, showRules && rulesRoomId === roomId ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rules\n  }, t('watchLegalDisclaimer')) : null, messages.map(message => /*#__PURE__*/React.createElement(StreamChatMessage, {\n    key: message.id,\n    message: message,\n    currentUserId: session?.user?.id,\n    styles: styles,\n    t: t,\n    onSenderPress: enableUserMenu ? handleSenderPress : undefined\n  }))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StreamChatUserMenu\",\n    visible: userMenu.visible,\n    layout: userMenu.layout,\n    onClose: closeUserMenu,\n    onMessage: openUserChat,\n    onRemoveUser: removeUser\n  }));\n};"},"VideoChatInputField":{"name":"VideoChatInputField","key":"f0c79a7e47fa7abe42230e08f478e2badc1f6f70b952e1b6cd0d918096203856","code":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst SendIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M13.4793 3.64754C17.9774 2.14817 20.2266 1.3988 21.4139 2.58602C22.6011 3.77325 21.8517 6.02246 20.3524 10.5206L18.6356 15.67C17.4254 19.3006 16.8198 21.1161 15.9324 21.6319C15.0883 22.1225 14.046 22.1226 13.202 21.6319C12.3147 21.116 11.71 19.3005 10.4998 15.67C10.3345 15.1741 10.4517 14.6112 10.8231 14.2432L16.2401 8.87704C16.5498 8.57016 16.5518 8.06958 16.2449 7.75985C15.9381 7.45034 15.4384 7.44835 15.1287 7.75497L9.62287 13.21C9.28602 13.5437 8.7797 13.6509 8.3299 13.5011C4.69933 12.2909 2.88388 11.6853 2.36798 10.7979C1.87729 9.95388 1.87739 8.91156 2.36798 8.06747C2.88384 7.18012 4.69927 6.57455 8.3299 5.36434L13.4793 3.64754Z\",\n  fill: color\n})));\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  value,\n  onChangeText,\n  onSend,\n  placeholder,\n  canSend,\n  disabled,\n  autoFocus,\n  onBlur,\n  maxLength = 100,\n  cooldownSeconds = 0\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const inputRef = React.useRef(null);\n  const isCooldown = cooldownSeconds > 0;\n  const preventWebMouseDownBlur = React.useCallback(event => {\n    if (ReactNative.Platform.OS === 'web') event?.preventDefault?.();\n  }, []);\n  const triggerSend = React.useCallback(_async(function () {\n    if (!canSend || disabled || !onSend) return;\n    return _await(Promise.resolve(onSend()), function () {\n      if (ReactNative.Platform.OS === 'web') {\n        requestAnimationFrame(() => inputRef.current?.focus?.());\n      }\n    });\n  }), [canSend, disabled, onSend]);\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      height: 56,\n      padding: 4,\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center',\n      borderRadius: 999,\n      backgroundColor: 'rgba(4,6,15,0.5)'\n    },\n    input: {\n      flex: 1,\n      minWidth: 0,\n      height: 48,\n      paddingLeft: 16,\n      paddingRight: 12,\n      paddingVertical: 10,\n      color: '#FFFFFF',\n      fontFamily: theme.theme.typography?.family?.paragraph,\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 20,\n      letterSpacing: 0,\n      textAlignVertical: 'center',\n      ...(ReactNative.Platform.OS === 'android' && {\n        includeFontPadding: false\n      }),\n      ...(ReactNative.Platform.OS === 'web' && {\n        outlineStyle: 'none'\n      })\n    },\n    sendButton: {\n      width: 60,\n      minWidth: 60,\n      height: 48,\n      padding: 12,\n      borderRadius: 999,\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B'\n    },\n    cooldownContent: {\n      flex: 1,\n      height: 48,\n      paddingHorizontal: 16,\n      paddingVertical: 10,\n      gap: 8,\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    cooldownText: {\n      color: 'rgba(255,255,255,0.35)',\n      fontFamily: theme.theme.typography?.family?.paragraph,\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 20,\n      letterSpacing: 0\n    },\n    cooldownMessage: {\n      flex: 1,\n      minWidth: 0\n    },\n    cooldownTimer: {\n      flexShrink: 0,\n      textAlign: 'right'\n    }\n  }), [theme]);\n  if (isCooldown) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.root,\n      pointerEvents: \"none\"\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.cooldownContent\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      numberOfLines: 1,\n      style: [styles.cooldownText, styles.cooldownMessage]\n    }, t('streamChatTooManyMessages')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      numberOfLines: 1,\n      style: [styles.cooldownText, styles.cooldownTimer]\n    }, t('streamChatCooldownSeconds', cooldownSeconds))));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.TextInput, {\n    ref: inputRef,\n    autoFocus: autoFocus,\n    value: value,\n    onChangeText: onChangeText,\n    onBlur: onBlur,\n    onSubmitEditing: triggerSend,\n    placeholder: placeholder || t('chatInputPlaceholder'),\n    placeholderTextColor: \"rgba(255,255,255,0.7)\",\n    selectionColor: \"#FE375B\",\n    returnKeyType: \"send\",\n    blurOnSubmit: false,\n    maxLength: maxLength,\n    style: styles.input\n  }), canSend ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    disabled: disabled,\n    style: styles.sendButton,\n    onMouseDown: preventWebMouseDownBlur,\n    onPress: triggerSend\n  }, /*#__PURE__*/React.createElement(SendIcon, null)) : null);\n};"},"UserPanelOverlay":{"name":"UserPanelOverlay","key":"a4994ff684ee105c2a2ae10b48ef3c512986a7d0bf14b160924feae494a0e7d6","code":"deps: Avatar, PeerCountry, Status, WithAppear, VideoChatSkipButton, VideoChatGiftButton\nfunction _empty() {}\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst majorVersionIOS = parseInt(ReactNative.Platform.Version, 10);\nconst isAndroidNative = ReactNative.Platform.OS === 'android';\nconst Blur = ReactNative.Platform.OS === 'web' ? ExpoBlur.BlurView : isAndroidNative ? ReactNative.View : (ReactNative.Platform.OS === 'ios' && majorVersionIOS >= 26 ? ReactBlur?.LiquidGlassView : ReactBlur?.BlurView) ?? ReactNative.View;\nconst blurSurfaceProps = isAndroidNative ? {} : {\n  tint: 'dark',\n  blurType: 'dark',\n  blurAmount: 20,\n  overlayColor: '#00000066',\n  glassType: 'clear',\n  glassTintColor: '#000000',\n  glassOpacity: 0.05\n};\nconst SubIcon = React.memo(({\n  size = 24\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M19.0711 11.2506C19.4853 11.2506 19.821 11.5863 19.821 12.0005C19.8209 12.4146 19.4852 12.7504 19.0711 12.7505L12.7499 12.7505V19.0716C12.7498 19.4857 12.4141 19.8215 12 19.8215C11.5859 19.8215 11.2502 19.4857 11.2501 19.0716V12.7505L4.92894 12.7505C4.51481 12.7505 4.17915 12.4146 4.17902 12.0005C4.17902 11.5863 4.51472 11.2506 4.92894 11.2506L11.2501 11.2506L11.2501 4.92947C11.2501 4.51526 11.5858 4.17955 12 4.17955C12.4142 4.17956 12.7499 4.51526 12.7499 4.92947L12.7499 11.2506L19.0711 11.2506Z\",\n  fill: \"#04060F\"\n})));\nconst CheckIcon = React.memo(({\n  size = 24\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M17.4343 7.00677C17.7066 6.69489 18.1809 6.66251 18.4929 6.93451C18.8049 7.20684 18.8373 7.68107 18.5652 7.9931L10.7078 16.9931C10.5653 17.1562 10.3589 17.2499 10.1423 17.2499C9.92599 17.2498 9.72019 17.1561 9.57788 16.9931L6.43433 13.3935C6.16213 13.0815 6.19472 12.6073 6.50659 12.3349C6.81857 12.0626 7.29277 12.0953 7.56519 12.4072L10.1423 15.3593L17.4343 7.00677Z\",\n  fill: \"#04060F\"\n})));\nconst DotsIcon = React.memo(({\n  size = 24\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M5 10C6.10457 10 7 10.8954 7 12C7 13.1046 6.10457 14 5 14C3.89543 14 3 13.1046 3 12C3 10.8954 3.89543 10 5 10ZM12 10C13.1046 10 14 10.8954 14 12C14 13.1046 13.1046 14 12 14C10.8954 14 10 13.1046 10 12C10 10.8954 10.8954 10 12 10ZM19 10C20.1046 10 21 10.8954 21 12C21 13.1046 20.1046 14 19 14C17.8954 14 17 13.1046 17 12C17 10.8954 17.8954 10 19 10Z\",\n  fill: \"white\",\n  fillOpacity: 0.6\n})));\nconst ICON_SWAP_MS = 260;\nconst CHECK_DELAY_MS = 110;\nconst HOLD_MS = 2000;\nconst FINAL_FADE_MS = 420;\nconst DOTS_DELAY_MS = 180;\nconst HIDDEN_SCALE = 0.42;\nconst DOTS_HIDDEN_SCALE = 0.96;\nconst PeerSubscribeButton = React.memo(({\n  userId,\n  source = 'videochat'\n}) => {\n  const theme = Theme.useTheme();\n  const session = State.api?.session?.useSession?.();\n  const [isSubscribed, setIsSubscribedApi,, isSubscribing] = State.api?.sub?.useSubscription(userId) ?? [];\n  const timerRef = React.useRef(null);\n  const animatingRef = React.useRef(false);\n  const easing = React.useMemo(() => ReactNative.Easing.bezier(0.2, 0.9, 0.18, 1), []);\n  const circleOpacity = React.useRef(new ReactNative.Animated.Value(isSubscribed ? 0 : 1)).current;\n  const plusOpacity = React.useRef(new ReactNative.Animated.Value(isSubscribed ? 0 : 1)).current;\n  const plusScale = React.useRef(new ReactNative.Animated.Value(isSubscribed ? HIDDEN_SCALE : 1)).current;\n  const checkOpacity = React.useRef(new ReactNative.Animated.Value(0)).current;\n  const checkScale = React.useRef(new ReactNative.Animated.Value(HIDDEN_SCALE)).current;\n  const dotsOpacity = React.useRef(new ReactNative.Animated.Value(isSubscribed ? 1 : 0)).current;\n  const dotsScale = React.useRef(new ReactNative.Animated.Value(isSubscribed ? 1 : DOTS_HIDDEN_SCALE)).current;\n  const isOwnUser = userId != null && session?.user?.id != null && String(userId) === String(session?.user?.id);\n  const isGuest = State.api?.guest?.useIsGuestSession?.();\n  const styles = React.useMemo(() => ({\n    button: {\n      position: 'relative',\n      width: 48,\n      height: 48,\n      flexShrink: 0,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: 'transparent',\n      overflow: 'visible'\n    },\n    circle: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      borderRadius: 999,\n      backgroundColor: theme.theme.semantic.content.inversion.static.stPrimary\n    },\n    iconLayer: {\n      position: 'absolute',\n      left: 12,\n      top: 12,\n      width: 24,\n      height: 24,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    iconSubscribed: {\n      color: theme.theme.component.buttonVideochat.brand.contentDefault\n    }\n  }), [theme]);\n  const timing = React.useCallback((value, toValue, duration, delay = 0) => ReactNative.Animated.timing(value, {\n    toValue,\n    duration,\n    delay,\n    easing,\n    useNativeDriver: true\n  }), [easing]);\n  const clearTimer = React.useCallback(() => {\n    if (timerRef.current != null) {\n      clearTimeout(timerRef.current);\n      timerRef.current = null;\n    }\n  }, []);\n  const setIdle = React.useCallback(() => {\n    clearTimer();\n    animatingRef.current = false;\n    circleOpacity.setValue(1);\n    plusOpacity.setValue(1);\n    plusScale.setValue(1);\n    checkOpacity.setValue(0);\n    checkScale.setValue(HIDDEN_SCALE);\n    dotsOpacity.setValue(0);\n    dotsScale.setValue(DOTS_HIDDEN_SCALE);\n  }, [clearTimer, circleOpacity, plusOpacity, plusScale, checkOpacity, checkScale, dotsOpacity, dotsScale]);\n  const setFinal = React.useCallback((animated = false) => {\n    clearTimer();\n    animatingRef.current = false;\n    plusOpacity.setValue(0);\n    plusScale.setValue(HIDDEN_SCALE);\n    if (!animated) {\n      circleOpacity.setValue(0);\n      checkOpacity.setValue(0);\n      checkScale.setValue(HIDDEN_SCALE);\n      dotsOpacity.setValue(1);\n      dotsScale.setValue(1);\n      return;\n    }\n    ReactNative.Animated.parallel([timing(circleOpacity, 0, FINAL_FADE_MS), timing(checkOpacity, 0, ICON_SWAP_MS), timing(checkScale, HIDDEN_SCALE, ICON_SWAP_MS), timing(dotsOpacity, 1, FINAL_FADE_MS, DOTS_DELAY_MS), timing(dotsScale, 1, FINAL_FADE_MS, DOTS_DELAY_MS)]).start();\n  }, [clearTimer, circleOpacity, plusOpacity, plusScale, checkOpacity, checkScale, dotsOpacity, dotsScale, timing]);\n  const runConfirmAnimation = React.useCallback(() => {\n    clearTimer();\n    animatingRef.current = true;\n    circleOpacity.setValue(1);\n    dotsOpacity.setValue(0);\n    dotsScale.setValue(DOTS_HIDDEN_SCALE);\n    ReactNative.Animated.parallel([timing(plusOpacity, 0, ICON_SWAP_MS), timing(plusScale, HIDDEN_SCALE, ICON_SWAP_MS), timing(checkOpacity, 1, ICON_SWAP_MS, CHECK_DELAY_MS), timing(checkScale, 1, ICON_SWAP_MS, CHECK_DELAY_MS)]).start();\n    timerRef.current = setTimeout(() => {\n      setFinal(true);\n    }, HOLD_MS);\n  }, [clearTimer, circleOpacity, plusOpacity, plusScale, checkOpacity, checkScale, dotsOpacity, dotsScale, timing, setFinal]);\n  React.useEffect(() => () => clearTimer(), [clearTimer]);\n  React.useEffect(() => {\n    if (isSubscribed === true) {\n      if (!animatingRef.current) setFinal(false);\n      return;\n    }\n    if (isSubscribed === false) {\n      setIdle();\n    }\n  }, [isSubscribed, setFinal, setIdle]);\n  if (!userId || isOwnUser || isGuest) return null;\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: !isSubscribed && !isSubscribing,\n    scale: 1,\n    noloading: true,\n    pointerEvents: isSubscribed || isSubscribing ? 'none' : 'auto',\n    style: styles.button,\n    onPress: _async(function () {\n      if (!setIsSubscribedApi || isSubscribing || isSubscribed) return;\n      runConfirmAnimation();\n      return _awaitIgnored(setIsSubscribedApi(true, source));\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    pointerEvents: \"none\",\n    style: [styles.circle, {\n      opacity: circleOpacity\n    }]\n  }), /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    pointerEvents: \"none\",\n    style: [styles.iconLayer, {\n      opacity: plusOpacity,\n      transform: [{\n        scale: plusScale\n      }]\n    }]\n  }, /*#__PURE__*/React.createElement(SubIcon, {\n    size: 24,\n    style: styles.iconSubscribed\n  })), /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    pointerEvents: \"none\",\n    style: [styles.iconLayer, {\n      opacity: checkOpacity,\n      transform: [{\n        scale: checkScale\n      }]\n    }]\n  }, /*#__PURE__*/React.createElement(CheckIcon, {\n    size: 24\n  })), /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    pointerEvents: \"none\",\n    style: [styles.iconLayer, {\n      opacity: dotsOpacity,\n      transform: [{\n        scale: dotsScale\n      }]\n    }]\n  }, /*#__PURE__*/React.createElement(DotsIcon, {\n    size: 24\n  })));\n});\nreturn ({\n  peer,\n  activeCall,\n  embedded = false,\n  source = 'videochat',\n  centered = false,\n  showInlineGift = false\n}) => {\n  const theme = Theme.useTheme();\n  const [isSearching] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const effectiveCall = activeCall ?? call;\n  const {\n    bottom\n  } = SafeArea.useSafeAreaInsets();\n  const t = Locale.useTranslation();\n  const isCurrentUserGuest = State.api?.guest?.useIsGuestSession?.();\n  const styles = React.useMemo(() => ({\n    bottomSafeArea: {\n      padding: 12,\n      width: '100%',\n      position: 'absolute',\n      bottom: 0\n    },\n    bottomRow: {\n      width: '100%',\n      minHeight: 88,\n      flexDirection: 'row',\n      alignItems: 'flex-end',\n      justifyContent: 'space-between',\n      gap: 12,\n      paddingHorizontal: 12,\n      paddingBottom: bottom + 12\n    },\n    bottomRowContainer: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: 6\n    },\n    bottomRowContainerCentered: {\n      justifyContent: 'center'\n    },\n    profilePanelPlaceholder: {\n      flex: 1,\n      maxWidth: 530,\n      height: 56\n    },\n    inlineGiftSlot: {\n      width: 56,\n      height: 56,\n      flexShrink: 0\n    },\n    profilePanelContainer: {\n      flex: 1,\n      minWidth: 0,\n      height: 56,\n      maxHeight: 56\n    },\n    profilePanel: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    avatarWrap: {\n      paddingBottom: 1\n    },\n    titleCol: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center',\n      gap: 4\n    },\n    statusRow: {\n      gap: 4,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      flexWrap: 'wrap'\n    },\n    title: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: 600\n    },\n    profileBlurPanel: {\n      flex: 1,\n      maxWidth: 530,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      borderRadius: 999,\n      backgroundColor: theme.theme.semantic.surface.alfa.static.stSurface4,\n      gap: 6,\n      padding: 4,\n      height: 56,\n      maxHeight: 56\n    }\n  }), [bottom, theme]);\n  const meta = State.api?.users?.sanitizeMeta?.(peer?.meta) ?? peer?.meta;\n  const user = meta?.user;\n  const card = meta?.card;\n  const status = meta?.status;\n  const hasSubscription = meta?.subscription?.hasSubscription;\n  const photos = meta?.photos;\n  const photo = photos?.[0];\n  const userId = meta?.user?.id ?? meta?.userId ?? meta?.id ?? null;\n  const isPeerGuest = meta?.card?.isGuest === true;\n  const showPeerDetails = !isCurrentUserGuest && !isPeerGuest;\n  const displayUsername = showPeerDetails ? user?.username || t('profilePlaceholderUser') : t('profilePlaceholderUser');\n  const displayPhoto = showPeerDetails ? photo : null;\n  const hasCountry = showPeerDetails && !!card?.country;\n  const hasStatus = showPeerDetails && status?.status != null;\n  const [peerData, setPeerData] = manifest().peer.usePeerData(peer?.sessionId);\n  const setVolume = React.useCallback(value => {\n    setPeerData({\n      volume: value\n    });\n  }, [setPeerData]);\n  const openCard = React.useCallback(_async(function () {\n    if (!showPeerDetails || meta == null) return;\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: meta,\n      source: source\n    }), {\n      theme: theme.isDark ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n    return _awaitIgnored(new Promise(r => setTimeout(r, 3000)));\n  }), [meta, showPeerDetails, source, theme.isDark]);\n  if (!peer) {\n    if (embedded) return null;\n    return /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n      style: styles.bottomSafeArea,\n      pointerEvents: \"box-none\"\n    }, /*#__PURE__*/React.createElement(LazyComponent, {\n      key: \"searching\",\n      name: \"WithAppear\",\n      scale: 1,\n      duration: 250,\n      style: styles.bottomRow,\n      pointerEvents: \"box-none\"\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.bottomRowContainer, centered && styles.bottomRowContainerCentered],\n      pointerEvents: \"box-none\"\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      pointerEvents: \"none\",\n      style: styles.profilePanelPlaceholder\n    }), /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"VideoChatSkipButton\",\n      disabled: true\n    }), showInlineGift && /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.inlineGiftSlot\n    }))));\n  }\n  ;\n  const userPanel = /*#__PURE__*/React.createElement(Blur, _extends({}, blurSurfaceProps, {\n    style: styles.profileBlurPanel\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    noloading: true,\n    scale: 0.98,\n    styleContainer: styles.profilePanelContainer,\n    style: styles.profilePanel,\n    onPress: openCard\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: displayPhoto,\n    isPro: showPeerDetails && hasSubscription,\n    size: 48\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.titleCol\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title,\n    numberOfLines: 1\n  }, displayUsername), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.statusRow\n  }, hasCountry && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PeerCountry\",\n    country: card?.country,\n    simple: true\n  }), hasStatus && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Status\",\n    status: status?.status,\n    simple: true\n  })))), showPeerDetails && !!userId && /*#__PURE__*/React.createElement(PeerSubscribeButton, {\n    userId: userId,\n    source: source\n  }));\n  if (embedded) return userPanel;\n  return /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.bottomSafeArea,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    key: `peer-${peer.sessionId ?? peer.id ?? 'active'}`,\n    name: \"WithAppear\",\n    scale: 1,\n    duration: 250,\n    style: styles.bottomRow,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.bottomRowContainer, centered && styles.bottomRowContainerCentered],\n    pointerEvents: \"box-none\"\n  }, userPanel, !!effectiveCall && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatSkipButton\"\n  }), showInlineGift && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.inlineGiftSlot\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatGiftButton\",\n    peer: peer\n  })))));\n};"},"StreamEndedOverlay":{"name":"StreamEndedOverlay","key":"7a95098009f47f1a77ecdb20ed15daf4c577944884eb5ab8c1301bff99380390","code":"deps: Avatar\nfunction _empty() {}\nconst NextIcon = React.memo(() => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 16,\n  height: 16,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M5.99088 4.15771C6.73003 3.75441 7.67536 4.00822 8.11393 4.72705L9.49284 6.98877L10.904 6.21924C12.1483 5.53987 13.7468 5.96796 14.485 7.17822C15.8319 9.38756 15.0801 12.194 12.8092 13.4341C10.5544 14.665 7.65132 13.8873 6.31412 11.6938L5.77116 10.8042C5.32354 10.0693 5.57561 9.12898 6.33073 8.71631C6.49054 8.62905 6.66079 8.5732 6.83268 8.54541L5.43131 6.24658C4.98354 5.51151 5.23541 4.57027 5.99088 4.15771ZM3.01823 2.646L4.35221 3.979C4.54736 4.17416 4.54715 4.49075 4.35221 4.68604C4.15695 4.88127 3.84043 4.88129 3.64518 4.68604L3.16471 4.20557L3.16569 11.1255L3.64616 10.646C3.84129 10.4509 4.15789 10.4511 4.35319 10.646C4.54845 10.8413 4.54845 11.1578 4.35319 11.353L2.66666 13.0396L2.31315 12.686L0.979163 11.353C0.784518 11.1578 0.784278 10.8411 0.979163 10.646C1.17424 10.4509 1.49089 10.4513 1.68619 10.646L2.16569 11.1255L2.16471 4.20557L1.68522 4.68604C1.48995 4.88127 1.17344 4.88129 0.978187 4.68604C0.783487 4.49074 0.783139 4.17408 0.978187 3.979L2.66471 2.29248L3.01823 2.646ZM7.26041 5.24756C7.09962 4.98436 6.74018 4.88782 6.4694 5.03564C6.21537 5.17463 6.13432 5.47865 6.28483 5.72607L8.99674 10.1743C9.14042 10.41 9.06628 10.718 8.83073 10.8618C8.59496 11.0054 8.28693 10.9306 8.14323 10.6948L7.60221 9.80811L7.60026 9.80518C7.43937 9.54228 7.0808 9.44562 6.81022 9.59326C6.55594 9.7322 6.47509 10.0362 6.62565 10.2837L7.16764 11.1733C8.22701 12.9111 10.5434 13.5313 12.3297 12.5562C14.0995 11.5897 14.6811 9.42055 13.6315 7.69873C13.1711 6.94409 12.1594 6.67354 11.3835 7.09717L9.55436 8.09521L9.13541 8.32373L8.88737 7.9165L7.26041 5.24756Z\",\n  fill: \"#FFFFFF\"\n})));\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst SubscribedIcon = React.memo(() => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 16,\n  height: 16,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.6237 4.67091C11.8053 4.46334 12.1209 4.44177 12.3288 4.62306C12.5368 4.80465 12.5582 5.12109 12.3767 5.32912L7.13839 11.3291C7.04355 11.4376 6.90649 11.4999 6.76241 11.5C6.61814 11.5 6.4804 11.4377 6.38546 11.3291L4.28975 8.92873C4.10847 8.7208 4.12994 8.40522 4.3376 8.22365C4.54561 8.04212 4.86206 8.06354 5.04366 8.2715L6.76143 10.2393L11.6237 4.67091Z\",\n  fill: \"#FFFFFF\"\n})));\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst StreamEndedSubscribeButton = React.memo(({\n  userId,\n  isGuest,\n  onRequireAuth,\n  onInteractionChange,\n  styles,\n  t\n}) => {\n  const session = State.api.session.useSession();\n  const [isSubscribed, setIsSubscribedApi,, isSubscribing] = State.api.sub.useSubscription(userId);\n  const isOwnUser = String(userId) === String(session?.user?.id);\n  if (isOwnUser || isSubscribed == null) return null;\n  const subscribe = _async(function (event) {\n    event?.stopPropagation?.();\n    if (isSubscribed) return;\n    if (isGuest) {\n      onRequireAuth?.('stream_ended_subscribe');\n      return;\n    }\n    onInteractionChange(true);\n    return _continueIgnored(_finallyRethrows(function () {\n      return _awaitIgnored(setIsSubscribedApi(true, 'watch_stream'));\n    }, function (_wasThrown, _result) {\n      onInteractionChange(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  });\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: !isSubscribed,\n    noloading: true,\n    disabled: isSubscribing,\n    style: [styles.button, isSubscribed ? styles.subscribedButton : styles.subscribeButton],\n    onPress: subscribe\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.buttonText, isSubscribed ? styles.subscribedButtonText : styles.subscribeButtonText],\n    numberOfLines: 1\n  }, t(isSubscribed ? 'cardModalSubscribed' : 'cardModalSubscribe')), isSubscribed ? /*#__PURE__*/React.createElement(SubscribedIcon, null) : /*#__PURE__*/React.createElement(Assets.Close, {\n    size: 16,\n    style: styles.plusIcon\n  }));\n});\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  peer,\n  active = true,\n  isGuest = false,\n  onNext,\n  onRequireAuth\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [profileOpen, setProfileOpen] = React.useState(false);\n  const [interactionActive, setInteractionActive] = React.useState(false);\n  const nextLockedRef = React.useRef(false);\n  const meta = State.api.users.sanitizeMeta(peer?.meta) ?? peer?.meta;\n  const userId = meta?.user?.id ?? meta?.userId ?? meta?.id ?? null;\n  const username = meta?.user?.username || meta?.card?.username || t('profilePlaceholderUser');\n  const photo = meta?.photos?.[0] ?? meta?.card?.mainPhoto ?? null;\n  const next = React.useCallback(event => {\n    event?.stopPropagation?.();\n    if (nextLockedRef.current) return;\n    nextLockedRef.current = true;\n    onNext?.();\n    setTimeout(() => {\n      nextLockedRef.current = false;\n    }, 600);\n  }, [onNext]);\n  React.useEffect(() => {\n    if (!active || profileOpen || interactionActive) return;\n    const timer = setTimeout(next, 10000);\n    return () => clearTimeout(timer);\n  }, [active, interactionActive, next, profileOpen]);\n  const openProfile = React.useCallback(_async(function (event) {\n    event?.stopPropagation?.();\n    if (isGuest) {\n      onRequireAuth?.('stream_ended_profile');\n      return;\n    }\n    if (!meta) return;\n    setProfileOpen(true);\n    return _continueIgnored(_finallyRethrows(function () {\n      return _awaitIgnored(Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n        name: \"cardModal\",\n        meta: meta,\n        source: \"watch_stream\"\n      }), {\n        theme: 'dark',\n        props: {\n          swipeUp: true,\n          swipeDismissibleUp: true,\n          style: {\n            maxWidth: 600,\n            overflow: 'hidden'\n          }\n        }\n      }));\n    }, function (_wasThrown2, _result2) {\n      setProfileOpen(false);\n      return _rethrow(_wasThrown2, _result2);\n    }));\n  }), [isGuest, meta, onRequireAuth]);\n  const styles = React.useMemo(() => {\n    const headingFont = theme.theme.typography?.family?.heading;\n    return {\n      root: {\n        position: 'absolute',\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0,\n        zIndex: 10,\n        alignItems: 'center',\n        justifyContent: 'center',\n        paddingHorizontal: 12,\n        backgroundColor: 'rgba(4,6,15,0.8)'\n      },\n      dismissArea: {\n        position: 'absolute',\n        top: 0,\n        right: 0,\n        bottom: 0,\n        left: 0\n      },\n      content: {\n        width: '100%',\n        alignItems: 'center',\n        gap: 24\n      },\n      copy: {\n        width: '100%',\n        alignItems: 'center',\n        gap: 8\n      },\n      profile: {\n        width: '100%',\n        alignItems: 'center',\n        gap: 4\n      },\n      username: {\n        width: '100%',\n        color: '#FFFFFF',\n        fontFamily: headingFont,\n        fontSize: 20,\n        lineHeight: 28,\n        fontWeight: '600',\n        letterSpacing: 0,\n        textAlign: 'center'\n      },\n      title: {\n        width: '100%',\n        color: '#FFFFFF',\n        fontFamily: headingFont,\n        fontSize: 28,\n        lineHeight: 36,\n        fontWeight: '600',\n        letterSpacing: 0,\n        textAlign: 'center'\n      },\n      actions: {\n        width: '100%',\n        maxWidth: 200,\n        alignItems: 'center',\n        gap: 8\n      },\n      button: {\n        width: '100%',\n        height: 40,\n        paddingHorizontal: 16,\n        paddingVertical: 10,\n        borderRadius: 999,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        gap: 6\n      },\n      subscribeButton: {\n        backgroundColor: '#FFFFFF'\n      },\n      subscribedButton: {\n        backgroundColor: 'rgba(255,255,255,0.1)'\n      },\n      nextButton: {\n        backgroundColor: 'rgba(255,255,255,0.1)'\n      },\n      buttonText: {\n        fontFamily: headingFont,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '600',\n        letterSpacing: 0\n      },\n      subscribeButtonText: {\n        color: '#04060F'\n      },\n      subscribedButtonText: {\n        color: '#FFFFFF'\n      },\n      nextButtonText: {\n        color: '#FFFFFF'\n      },\n      plusIcon: {\n        color: '#04060F',\n        transform: [{\n          rotate: '45deg'\n        }]\n      }\n    };\n  }, [theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root,\n    pointerEvents: active ? 'box-none' : 'none'\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.dismissArea,\n    onPress: next\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.copy,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.profile,\n    onPress: openProfile\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: photo,\n    size: 80\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.username,\n    numberOfLines: 1\n  }, username)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('streamEnded'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actions\n  }, userId ? /*#__PURE__*/React.createElement(StreamEndedSubscribeButton, {\n    userId: userId,\n    isGuest: isGuest,\n    onRequireAuth: onRequireAuth,\n    onInteractionChange: setInteractionActive,\n    styles: styles,\n    t: t\n  }) : null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: [styles.button, styles.nextButton],\n    onPress: next\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.buttonText, styles.nextButtonText],\n    numberOfLines: 1\n  }, t('feedNext')), /*#__PURE__*/React.createElement(NextIcon, null)))));\n};"},"SwipeHintOverlay":{"name":"SwipeHintOverlay","key":"99ac0e126d53d460e49cd1a7a622c53e25d64fea5204efe6b94c42343564c882","code":"const HAND_PATH_D = 'M12.8975 4.66309C14.7457 3.65459 17.1099 4.28808 18.2061 6.08594L21.6533 11.7422L25.1816 9.81641C28.2929 8.11805 32.2877 9.18834 34.1328 12.2148C37.4999 17.7384 35.6201 24.7544 29.9424 27.8545C24.3053 30.932 17.0481 28.9876 13.7051 23.5039L12.3496 21.2793C11.2292 19.4413 11.8588 17.0902 13.748 16.0586C14.1471 15.8407 14.5708 15.6994 15 15.6299L11.498 9.88477C10.3776 8.04677 11.0081 5.69456 12.8975 4.66309ZM5.4668 0.883789L8.80078 4.2168C9.2886 4.70479 9.28835 5.49623 8.80078 5.98438C8.31268 6.47248 7.52137 6.47237 7.0332 5.98438L5.83301 4.78418L5.83594 22.083L7.03613 20.8838C7.5243 20.3958 8.31562 20.3957 8.80371 20.8838C9.29163 21.3719 9.29161 22.1632 8.80371 22.6514L5.4707 25.9844L4.58691 26.8691L3.70312 25.9844L0.369141 22.6514C-0.118797 22.1633 -0.118798 21.3719 0.369141 20.8838C0.857258 20.3959 1.64862 20.3959 2.13672 20.8838L3.33594 22.083L3.33301 4.78418L2.13379 5.98438C1.64569 6.47248 0.854379 6.47237 0.366211 5.98438C-0.121782 5.49621 -0.12189 4.7049 0.366211 4.2168L4.58301 0L5.4668 0.883789ZM16.0713 7.3877C15.6697 6.72894 14.772 6.48788 14.0947 6.85742C13.4585 7.20484 13.2554 7.96392 13.6328 8.58301L19.0449 17.4629C19.0487 17.469 19.0538 17.4753 19.0576 17.4814C19.0591 17.4839 19.0601 17.4868 19.0615 17.4893L20.4131 19.7061C20.772 20.2953 20.5861 21.0644 19.9971 21.4238C19.4077 21.7831 18.6377 21.5962 18.2783 21.0068L16.916 18.7725C16.5114 18.1213 15.62 17.8853 14.9463 18.2529C14.3099 18.6004 14.107 19.3585 14.4844 19.9775L15.8398 22.2021C18.4884 26.5466 24.2792 28.0984 28.7451 25.6602C33.1694 23.2441 34.6226 17.8211 31.999 13.5166C30.8485 11.6293 28.32 10.9519 26.3799 12.0107L21.8057 14.5078L20.7598 15.0781L20.1396 14.0605L16.0713 7.3877Z';\nconst BOUNCE_RANGE_PX = 6;\nconst BOUNCE_DURATION_MS = 600;\nconst AnimatedHandIcon = React.memo(({\n  translateY\n}) => /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n  pointerEvents: \"none\",\n  style: {\n    width: 40,\n    height: 40,\n    alignItems: 'center',\n    justifyContent: 'center',\n    transform: [{\n      translateY\n    }]\n  }\n}, /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 40,\n  height: 40,\n  viewBox: \"0 0 40 40\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  transform: \"translate(3.33088 7.49943)\",\n  d: HAND_PATH_D,\n  fill: \"white\"\n}))));\nreturn ({\n  visible,\n  onDismiss,\n  zIndex = 4\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const headingFont = theme.theme.typography?.family?.heading;\n  const translateY = React.useRef(new ReactNative.Animated.Value(-BOUNCE_RANGE_PX)).current;\n  React.useEffect(() => {\n    if (!visible) return;\n    const animation = ReactNative.Animated.loop(ReactNative.Animated.sequence([ReactNative.Animated.timing(translateY, {\n      toValue: BOUNCE_RANGE_PX,\n      duration: BOUNCE_DURATION_MS,\n      easing: ReactNative.Easing.inOut(ReactNative.Easing.ease),\n      useNativeDriver: true\n    }), ReactNative.Animated.timing(translateY, {\n      toValue: -BOUNCE_RANGE_PX,\n      duration: BOUNCE_DURATION_MS,\n      easing: ReactNative.Easing.inOut(ReactNative.Easing.ease),\n      useNativeDriver: true\n    })]));\n    animation.start();\n    return () => animation.stop();\n  }, [visible, translateY]);\n  const styles = React.useMemo(() => ({\n    root: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      zIndex,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    shade: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      backgroundColor: 'rgba(4,6,15,0.32)'\n    },\n    content: {\n      width: '100%',\n      alignItems: 'center',\n      gap: 22,\n      zIndex: 1\n    },\n    circle: {\n      width: 80,\n      height: 80,\n      borderRadius: 40,\n      backgroundColor: 'rgba(4,6,15,0.5)',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    text: {\n      width: '100%',\n      color: '#FFFFFF',\n      fontFamily: headingFont,\n      fontSize: 24,\n      lineHeight: 32,\n      fontWeight: '700',\n      textAlign: 'center'\n    }\n  }), [headingFont, zIndex]);\n  if (!visible) return null;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    hideAnimation: true,\n    style: styles.shade,\n    onPress: onDismiss\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.circle\n  }, /*#__PURE__*/React.createElement(AnimatedHandIcon, {\n    translateY: translateY\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, t('watchSwipeHint') || 'Swipe up or down\\nto discover new streams')));\n};"},"BadgeSpins":{"name":"BadgeSpins","key":"d12765ca791942f3bdefcbd9a0cad6cc30e7ddeb09648a1c1e15c5581d893d6b","code":"/**\n * BadgeSpins — SSUI component for displaying free filters or paid filter cost badge.\n * Shows free filters first, otherwise shows price when selected filters cost coins.\n * Positioned at left-top with slight rotation per design.\n *\n * Usage in SSUI manifest:\n * {\n *   \"name\": \"BadgeSpins\"\n * }\n */\n\nconst PremiumIcon = ({\n  size = 16,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nconst MainCurrencyIcon = ({\n  size = 16,\n  color = '#FE375B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: color\n}));\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => ({\n    badge: {\n      container: {\n        zIndex: 1,\n        position: 'absolute',\n        left: -9,\n        top: -14,\n        transform: [{\n          rotate: '-5deg'\n        }],\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        height: 24,\n        paddingHorizontal: 10,\n        paddingTop: 4,\n        paddingBottom: 3,\n        borderRadius: 999,\n        gap: 4,\n        backgroundColor: theme.theme.component.badge.brand.bg\n      },\n      text: {\n        fontFamily: theme.theme.typography.family.heading,\n        fontWeight: 600,\n        fontSize: 12,\n        lineHeight: 12,\n        letterSpacing: -0.3,\n        color: theme.theme.component.badge.brand.content\n      },\n      icon: {\n        color: theme.theme.component.badge.brand.content,\n        width: 16,\n        height: 16\n      },\n      costContainer: {\n        backgroundColor: theme.theme.component.badge.accent.bg\n      },\n      costText: {\n        color: theme.theme.component.badge.accent.content\n      },\n      costIcon: {\n        color: theme.theme.component.badge.accent.content\n      }\n    }\n  }), [theme]);\n  const hasSubscription = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.subscription?.hasSubscription === true, []));\n  const priceCoins = Hooks.useBehaviorSubjectMap(State.state.storage.price, React.useCallback(price => Number(price?.coins ?? 0), []));\n  const limits = State.api.limits.useLimits();\n  const freeSpins = 30;\n  const remainingSpins = Math.max(0, limits?.freeFilters ?? 0);\n  const isFreeFilter = priceCoins > 0 && hasSubscription && remainingSpins > 0;\n  const shouldShowFree = hasSubscription && remainingSpins > 0;\n  const shouldShowCost = priceCoins > 0 && !isFreeFilter;\n  if (!shouldShowFree && !shouldShowCost) {\n    return null;\n  }\n  const freeLabel = String(t('filterFree') || 'free').toLowerCase();\n  if (shouldShowCost) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: [styles.badge.container, styles.badge.costContainer]\n    }, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n      size: 16,\n      color: styles.badge.costIcon.color\n    }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      numberOfLines: 1,\n      style: [styles.badge.text, styles.badge.costText]\n    }, priceCoins));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badge.container\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    numberOfLines: 1,\n    style: styles.badge.text\n  }, remainingSpins, \"/\", freeSpins, \" \", freeLabel), /*#__PURE__*/React.createElement(PremiumIcon, {\n    size: 16,\n    color: styles.badge.icon.color\n  }));\n};"},"WelcomeSection":{"name":"WelcomeSection","key":"8c63284f0803df58e551977d9a5568693197959c3bdca897c215cccc64278d60","code":"deps: WithAppear\nreturn ({\n  isSearching,\n  appearDelay = 0\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: '100%',\n      height: '100%',\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      gap: 24\n      // backgroundColor: \"red\",\n    },\n    welcome: {\n      width: '100%',\n      height: '100%',\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    header: {\n      fontWeight: 600,\n      fontSize: theme.theme.font?.heading?.size.large ?? 24,\n      lineHeight: theme.theme.font?.heading?.lineHeight.large ?? 32,\n      letterSpacing: -0.3,\n      textAlign: 'center',\n      color: theme.theme.semantic.content.inversion.static.stPrimary,\n      fontFamily: theme.theme.typography?.family?.paragraph ?? 'Geologica'\n    }\n  }), [theme.theme]);\n  const image = !isSearching ? '/api/component/assets/hand.json' : '/api/component/assets/search.json';\n  const source = React.useMemo(() => ({\n    uri: State.getUrl(image)\n  }), [image]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.welcome,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.container\n  }, Lottie && (!isSearching || isSearching) && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LazyComponent, {\n    key: image,\n    name: \"WithAppear\",\n    delay: appearDelay,\n    duration: 500,\n    scale: 0.8,\n    translateY: 0,\n    style: {\n      position: 'relative',\n      width: 80,\n      height: 80\n      // backgroundColor: \"green\",\n    },\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(Lottie, {\n    style: {\n      width: 360,\n      height: 360\n    },\n    source: source,\n    autoPlay: true,\n    loop: true,\n    resizeMode: \"cover\"\n  })))), !isSearching && /*#__PURE__*/React.createElement(LazyComponent, {\n    key: image,\n    name: \"WithAppear\",\n    delay: appearDelay,\n    duration: 500,\n    scale: 0.9,\n    translateY: 0,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header\n  }, t(\"randomStart\"))), isSearching && /*#__PURE__*/React.createElement(LazyComponent, {\n    key: image,\n    name: \"WithAppear\",\n    delay: appearDelay,\n    duration: 500,\n    scale: 0.9,\n    translateY: 0,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.header\n  }, t(\"randomSearching\")))));\n};"},"WelcomeBackdrop":{"name":"WelcomeBackdrop","key":"ac034b4508aee24c55e6c29398a854b62256950b948b65e55e770e06c4dc3259","code":"deps: WithAppear\nconst ORBIT_DURATION = 3000;\nconst ORBIT_RADIUS = 0.82;\nconst ORBIT_ORIGIN = 0.5;\nconst INITIAL_GRADIENT_CENTER = {\n  x: ORBIT_ORIGIN + ORBIT_RADIUS,\n  y: ORBIT_ORIGIN\n};\nconst SvgGradientBackdrop = React.memo(({\n  brandColor,\n  backgroundColor,\n  styles\n}) => {\n  const gradientId = React.useMemo(() => 'welcome-backdrop-radial', []);\n  const gradientRef = React.useRef(null);\n  const frameRef = React.useRef(null);\n  const startTimeRef = React.useRef(0);\n  const setGradientPosition = React.useCallback((x, y) => {\n    gradientRef.current?.setNativeProps?.({\n      cx: x,\n      cy: y,\n      fx: x,\n      fy: y\n    });\n  }, []);\n  React.useEffect(() => {\n    let active = true;\n    const runFrame = timestamp => {\n      if (!active) return;\n      if (!startTimeRef.current) startTimeRef.current = timestamp;\n      const progress = (timestamp - startTimeRef.current) % ORBIT_DURATION / ORBIT_DURATION;\n      const angle = progress * Math.PI * 2;\n      setGradientPosition(ORBIT_ORIGIN + Math.cos(angle) * ORBIT_RADIUS, ORBIT_ORIGIN + Math.sin(angle) * ORBIT_RADIUS);\n      frameRef.current = requestAnimationFrame(runFrame);\n    };\n    startTimeRef.current = 0;\n    frameRef.current = requestAnimationFrame(runFrame);\n    return () => {\n      active = false;\n      if (frameRef.current != null) {\n        cancelAnimationFrame(frameRef.current);\n        frameRef.current = null;\n      }\n      startTimeRef.current = 0;\n    };\n  }, [setGradientPosition]);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"100%\",\n    height: \"100%\",\n    style: styles.svg,\n    preserveAspectRatio: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"0\",\n    y: \"0\",\n    width: \"100%\",\n    height: \"100%\",\n    fill: backgroundColor\n  })), /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: \"100%\",\n    height: \"100%\",\n    style: styles.svg,\n    preserveAspectRatio: \"none\"\n  }, /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.RadialGradient, {\n    ref: gradientRef,\n    id: gradientId,\n    cx: INITIAL_GRADIENT_CENTER.x,\n    cy: INITIAL_GRADIENT_CENTER.y,\n    r: \"1.5\",\n    fx: INITIAL_GRADIENT_CENTER.x,\n    fy: INITIAL_GRADIENT_CENTER.y\n  }, /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"0\",\n    stopColor: brandColor,\n    stopOpacity: \"0.6\"\n  }), /*#__PURE__*/React.createElement(SVG.Stop, {\n    offset: \"1\",\n    stopColor: brandColor,\n    stopOpacity: \"0\"\n  }))), /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: \"0\",\n    y: \"0\",\n    width: \"100%\",\n    height: \"100%\",\n    fill: `url(#${gradientId})`\n  })));\n});\nreturn ({\n  visible\n}) => {\n  const theme = Theme.useTheme();\n  const [focused, setFocused] = React.useState(false);\n  ReactNavigation.useFocusEffect(React.useCallback(() => {\n    setFocused(true);\n    return () => {\n      setFocused(false);\n    };\n  }, []));\n  const styles = React.useMemo(() => ({\n    container: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      pointerEvents: 'none'\n    },\n    svg: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0\n    }\n  }), [theme.theme]);\n  const brandColor = theme.theme.semantic.surface.brand.surface4;\n  const backgroundColor = theme.theme.semantic.surface.inversion.static.stPageBackground;\n  const active = visible && focused;\n  return /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, {\n    visible: active,\n    unmountOnHide: true,\n    duration: 500,\n    scale: 1,\n    translateY: 0,\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(SvgGradientBackdrop, {\n    brandColor: brandColor,\n    backgroundColor: backgroundColor,\n    styles: styles\n  }));\n};"},"Camera":{"name":"Camera","key":"31581a638d511d2ab0a685d244f1f32d864c33913743ca7dd6009d36e6a3e9b3","code":"function _empty() {}\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    position: 'relative',\n    minWidth: 0,\n    minHeight: 0,\n    overflow: 'hidden'\n  },\n  fill: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    minWidth: 0,\n    minHeight: 0\n  },\n  video: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    minWidth: 0,\n    minHeight: 0\n  },\n  absolute: {\n    position: 'absolute',\n    top: 0,\n    bottom: 0,\n    left: 0,\n    right: 0\n  }\n});\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst updateVideoFrame = fn => {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(() => {\n      fn?.();\n    });\n  });\n};\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nlet mountedCameraInstances = 0;\nfunction _invoke(body, then) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(then);\n  }\n  return then(result);\n}\nlet stopStreamTimer = null;\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst hasLiveStream = (stream = State.state.stream.value) => {\n  const tracks = stream?.getTracks?.() ?? [];\n  return tracks.length > 0 && tracks.every(track => track.readyState !== 'ended');\n};\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst cancelScheduledStreamStop = () => {\n  if (stopStreamTimer == null) return;\n  clearTimeout(stopStreamTimer);\n  stopStreamTimer = null;\n};\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst scheduleStreamStopIfUnused = () => {\n  cancelScheduledStreamStop();\n  stopStreamTimer = setTimeout(() => {\n    stopStreamTimer = null;\n    if (mountedCameraInstances === 0 && !State.store.needStream.value && State.state.call.value == null) {\n      State.stopStream();\n    }\n  }, 1200);\n};\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nreturn ({\n  zOrder,\n  style\n}) => {\n  const [isRequestingStream] = Hooks.useBehaviorSubject(State.state.isRequestingStream);\n  const [stream, setStream] = Hooks.useBehaviorSubject(State.state.stream);\n  const [appState] = Hooks.useBehaviorSubject(State.state.appState);\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const requestStream = React.useCallback(_async(function () {\n    if (!State.store.needStream.value) {\n      State.store.needStream.next(true);\n    }\n    if (hasLiveStream()) {\n      return;\n    }\n    if (State.store.requestedStream.value) {\n      return;\n    }\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        State.store.requestedStream.next(true);\n        return _invoke(function () {\n          if (ReactNative.Platform.OS === 'android') {\n            return _awaitIgnored(new Promise(r => setTimeout(r, 500)));\n          }\n        }, function () {\n          return _invokeIgnored(function () {\n            if (State.store.needStream.value && !hasLiveStream()) {\n              return _awaitIgnored(State.requestStream(true));\n            }\n          });\n        });\n      }, function (error) {\n        console.error(error);\n      });\n    }, function (_wasThrown, _result) {\n      State.store.requestedStream.next(false);\n      return _rethrow(_wasThrown, _result);\n    }));\n  }), []);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'web' && ReactNative.Platform.OS !== 'ios') {\n      // iOS: после background WebRTC-треки часто \"замирают\" (enabled=true, но кадров нет).\n      // Поэтому при возврате из background/inactive форсим пересоздание стрима.\n      const prev = State.state.prevAppState.value;\n      const resumed = appState === 'active' && (prev === 'background' || prev === 'inactive');\n      if (resumed) {\n        requestStream();\n      }\n    }\n  }, [appState, requestStream]);\n  React.useEffect(() => {\n    cancelScheduledStreamStop();\n    mountedCameraInstances += 1;\n    requestStream();\n    return () => {\n      mountedCameraInstances = Math.max(0, mountedCameraInstances - 1);\n      if (mountedCameraInstances === 0) {\n        State.store.needStream.next(false);\n        scheduleStreamStopIfUnused();\n      }\n    };\n  }, [requestStream]);\n  React.useEffect(() => {\n    if (!stream && !isRequestingStream) {\n      requestStream();\n    }\n  }, [isRequestingStream, requestStream, stream]);\n\n  // if (isPip) return null;\n\n  const videoOpacity = isRequestingStream && !hasLiveStream(stream) ? 0 : 1;\n  const nativeVideoStyle = ReactNative.Platform.OS === 'android' ? [styles.video, style] : [styles.video, style, {\n    opacity: videoOpacity\n  }];\n  const content = /*#__PURE__*/React.createElement(Components.DSViewHorizontalLimited, {\n    style: styles.fill,\n    aspect: 2\n  }, stream && (ReactNative.Platform.OS !== 'web' ? /*#__PURE__*/React.createElement(WebRTC.RTCView, {\n    // renderToHardwareTextureAndroid\n    // useTextureView\n    zOrder: zOrder\n    // key={streamKey + \"_\" + (stream?.id ?? \"\")}\n    ,\n    streamURL: stream.toURL(),\n    style: nativeVideoStyle,\n    objectFit: \"cover\"\n  }) : /*#__PURE__*/React.createElement(WebRTC.RTCView, {\n    // key={streamKey + \"_\" + (stream?.id ?? \"\")}\n    stream: stream,\n    muted: true,\n    style: [styles.video, {\n      opacity: videoOpacity\n    }],\n    objectFit: \"cover\"\n  })));\n\n  // if (ReactNative.Platform.OS === 'web') {\n  //   return <Components.DSAnimatedOpacity style={styles.container} pointerEvents='none' visible={!isRequestingStream}>\n  //     {content}\n  //   </Components.DSAnimatedOpacity>\n  // }\n\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container,\n    pointerEvents: \"none\"\n  }, content);\n};"},"CameraOverlay":{"name":"CameraOverlay","key":"be321d8f44a2ad7e2f9da15e6cdbe85fedd31843154e9f2b37d4ae4a72cd87d7","code":"deps: CameraBottomPanel, CameraSidePanel, UserPanelOverlay\nreturn ({\n  peer,\n  activeCall,\n  isSearching: isSearchingProp,\n  pointerEvents,\n  showUserPanel = true,\n  showSideGift = true\n}) => {\n  const [stateIsSearching] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const [stateCall] = Hooks.useBehaviorSubject(State.state.call);\n  const isSearching = isSearchingProp ?? stateIsSearching;\n  const call = activeCall ?? stateCall;\n  const hasBottomPanel = !isSearching && !call;\n  const styles = React.useMemo(() => ({\n    container: {\n      flex: 1,\n      width: '100%',\n      height: '100%',\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    safeArea: {\n      position: 'absolute',\n      bottom: 0,\n      left: 0,\n      right: 0,\n      alignItems: 'flex-end',\n      justifyContent: 'flex-end'\n    },\n    panelWrapper: {\n      width: '100%',\n      alignItems: 'flex-end',\n      justifyContent: 'flex-end'\n    },\n    bottomPanel: {\n      position: 'absolute',\n      bottom: 0,\n      left: 0,\n      right: 0,\n      alignItems: 'flex-end',\n      justifyContent: 'flex-end'\n    }\n  }), []);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container,\n    collapsableChildren: true,\n    pointerEvents: pointerEvents ?? \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.safeArea,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.panelWrapper,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, {\n    unmountOnHide: true,\n    visible: hasBottomPanel,\n    style: styles.bottomPanel\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CameraBottomPanel\"\n  })), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"CameraSidePanel\",\n    hasBottomPanel: hasBottomPanel,\n    showGift: showSideGift\n  })), showUserPanel && !hasBottomPanel && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"UserPanelOverlay\",\n    peer: peer,\n    activeCall: call\n  })));\n};"},"PipLocalCamera":{"name":"PipLocalCamera","key":"b17099e097c8fe0bc09b056c6f37b71f1777d81e8f797c9190d5d4b5966704dd","code":"deps: Camera\nconst styles = StyleSheet.create({\n  videoPipSafeZoneContainer: {\n    position: 'absolute',\n    flex: 1,\n    width: '100%',\n    height: '100%'\n  },\n  videoPipContainer: {\n    alignItems: 'flex-end',\n    justifyContent: 'flex-end',\n    paddingVertical: 12,\n    paddingHorizontal: 12\n  },\n  videoPip: {\n    overflow: 'hidden',\n    borderRadius: 24\n  },\n  videoUser: {\n    width: 128,\n    height: 216\n  },\n  videoEnvironment: {\n    width: 128,\n    height: 128\n  }\n});\nreturn () => {\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const [userCamera] = Hooks.useBehaviorSubject(State.state.userCamera);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.videoPipSafeZoneContainer, {\n      paddingLeft: Math.max(safeArea.left, 0),\n      paddingRight: Math.max(safeArea.right, 0),\n      paddingTop: Math.max(safeArea.top, 0)\n    }],\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.videoPipContainer,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.videoPip, userCamera ? styles.videoUser : styles.videoEnvironment],\n    pointerEvents: \"auto\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Camera\",\n    zOrder: ReactNative.Platform.OS === 'android' ? 1 : undefined\n  }))));\n};"},"Peer":{"name":"Peer","key":"6ca35f43f9b707aa4aef1eac481ecd1a892ff590f3b1e67c1a8b3d98dc913b15","code":"deps: PeerOverlay, StreamPausedOverlay\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    minWidth: 0,\n    minHeight: 0,\n    overflow: 'hidden'\n  },\n  fill: {\n    flex: 1,\n    width: '100%',\n    height: '100%',\n    minWidth: 0,\n    minHeight: 0\n  },\n  video: {\n    flex: 1,\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    backgroundColor: 'transparent',\n    minWidth: 0,\n    minHeight: 0,\n    zIndex: 2\n  },\n  hlsVideo: {\n    flex: 1,\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    backgroundColor: 'transparent',\n    minWidth: 0,\n    minHeight: 0,\n    zIndex: 2\n  },\n  mediaPaused: {\n    opacity: 0\n  },\n  absolute: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    zIndex: 0\n  },\n  fallbackPhoto: {\n    zIndex: 0,\n    opacity: 0.2\n  },\n  fallbackHash: {\n    zIndex: 1\n  },\n  fallbackVisible: {\n    zIndex: 3\n  }\n});\nconst getPeerVideoTrackKey = stream => {\n  const tracks = stream?.getVideoTracks?.() ?? [];\n  if (tracks.length === 0) return 'no-video';\n  return tracks.map(track => track.id).sort().join('|');\n};\nconst hasLiveVideoTrack = stream => (stream?.getVideoTracks?.() ?? []).some(track => track.readyState !== 'ended' && track.enabled !== false && track.muted !== true);\nconst hasMountedVideoTrack = stream => (stream?.getVideoTracks?.() ?? []).some(track => track.readyState !== 'ended');\nconst isPeerStreamPaused = peer => peer?.streamPaused === true || Array.isArray(peer?.producers) && peer.producers.length > 0 && peer.producers.every(producer => producer?.paused === true);\nconst isAbsoluteSource = value => /^https?:\\/\\//i.test(value) || /^data:/i.test(value) || /^file:/i.test(value) || /^blob:/i.test(value);\nconst resolvePeerMediaSource = value => {\n  if (!value) return null;\n  if (typeof value === 'object') {\n    return resolvePeerMediaSource(value?.uri ?? value?.url ?? value?.src ?? null);\n  }\n  const source = String(value).trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source)) return source;\n  if (source.startsWith('/')) return State.getUrl(source);\n  return State.getUrl(source);\n};\nconst getPeerFallbackHash = peer => peer?.meta?.hash ?? peer?.meta?.thumbhash ?? peer?.meta?.photos?.[0]?.hash ?? peer?.meta?.pending?.photos?.[0]?.hash ?? peer?.meta?.card?.mainPhoto?.hash ?? null;\nreturn ({\n  peer,\n  onPress,\n  streamSoundControl = false,\n  showReport = true,\n  hideControl = false,\n  videoGridSafeArea = true\n}) => {\n  const [isPip] = Hooks.useBehaviorSubject(State.state.isPip);\n  const [peerData] = manifest().peer.usePeerData(peer?.sessionId);\n  const peerVolume = peerData?.volume ?? 1;\n  const [mutedStream] = Hooks.useBehaviorSubject(State.store.mutedStream);\n  const [audioUnlocked, setAudioUnlocked] = React.useState(false);\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const [submitted] = Hooks.useBehaviorSubject(State.state.submitted);\n  const [callSubmitted] = Hooks.useBehaviorSubject(State.state.callSubmitted);\n  const isRoomCall = call?.room != null;\n  const isSubmitted = isRoomCall || !!submitted && !!callSubmitted && call != null || call == null;\n  const peerDomId = React.useMemo(() => {\n    const key = `${peer?.sessionId ?? peer?.id ?? 'unknown'}`.replace(/[^a-zA-Z0-9_-]/g, '_');\n    return `peer_video_${key}`;\n  }, [peer?.id, peer?.sessionId]);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'web' || audioUnlocked || !peerDomId || typeof window === 'undefined') return;\n    const unlockAudio = () => {\n      if (mutedStream) {\n        setAudioUnlocked(true);\n        return;\n      }\n      const videos = [...(document.getElementById?.(peerDomId)?.querySelectorAll?.('video') ?? [])];\n      const attempts = videos.map(video => {\n        try {\n          video.muted = false;\n          return Promise.resolve(video.play?.()).then(() => true).catch(() => {\n            video.muted = true;\n            video.play?.()?.catch?.(() => {});\n            return false;\n          });\n        } catch (error) {\n          video.muted = true;\n          video.play?.()?.catch?.(() => {});\n          return Promise.resolve(false);\n        }\n      });\n      Promise.all(attempts).then(results => {\n        if (results.length > 0 && results.every(Boolean)) {\n          setAudioUnlocked(true);\n        }\n      }).catch(() => {});\n    };\n    window.addEventListener('pointerdown', unlockAudio, true);\n    window.addEventListener('keydown', unlockAudio, true);\n    return () => {\n      window.removeEventListener('pointerdown', unlockAudio, true);\n      window.removeEventListener('keydown', unlockAudio, true);\n    };\n  }, [audioUnlocked, mutedStream, peerDomId]);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'web' || !peerDomId || typeof window === 'undefined') return;\n    if (!streamSoundControl && !mutedStream) return;\n    const videos = [...(document.getElementById?.(peerDomId)?.querySelectorAll?.('video') ?? [])];\n    videos.forEach(video => {\n      try {\n        video.muted = !!mutedStream;\n        video.volume = mutedStream ? 0 : 1;\n        if (!mutedStream) {\n          video.play?.()?.catch?.(() => {});\n        }\n      } catch (error) {}\n    });\n  }, [mutedStream, peerDomId, streamSoundControl]);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS === 'web') return;\n    peer?.stream?.getAudioTracks()?.forEach(track => {\n      track?._setVolume?.(peerVolume);\n    });\n  }, [peer?.stream, peerVolume]);\n  const streamObject = peer?.stream ?? null;\n  const stream = streamObject?.toURL?.() ?? streamObject;\n  const nativeRtcViewProps = ReactNative.Platform.OS === 'web' ? {\n    stream: streamObject\n  } : {\n    streamURL: stream,\n    stream\n  };\n  const videoTrackKey = React.useMemo(() => getPeerVideoTrackKey(streamObject), [streamObject, peer?.mediaVersion]);\n  const hlsUrl = React.useMemo(() => resolvePeerMediaSource(peer?.hlsUrl ?? peer?.playback?.hlsUrl), [peer?.hlsUrl, peer?.playback?.hlsUrl]);\n  const hlsStatus = peer?.hlsStatus ?? peer?.playback?.status ?? null;\n  const hlsReady = !!hlsUrl && (hlsStatus == null || hlsStatus === 'ready');\n  const streamPaused = isPeerStreamPaused(peer);\n  const hasRenderableVideo = peer?.hasVideo === true && hasLiveVideoTrack(streamObject);\n  const hasMountedVideo = hasMountedVideoTrack(streamObject);\n  const rtcViewKey = `${peer?.sessionId ?? peer?.id ?? 'peer'}:${videoTrackKey}`;\n  const muted = streamSoundControl ? !!mutedStream : !!mutedStream || peerData?.volume == null && !audioUnlocked;\n  const volume = muted ? 0 : streamSoundControl ? 1 : peerVolume;\n  const canMountRtcView = !hlsUrl && !!stream && (hasRenderableVideo || streamPaused && hasMountedVideo) && !!peer?.ready;\n  const activeMediaKey = hlsReady ? `hls:${hlsUrl}` : canMountRtcView ? `rtc:${rtcViewKey}` : null;\n  const [readyMediaKey, setReadyMediaKey] = React.useState(null);\n  const mediaHasFirstFrame = !streamPaused && activeMediaKey != null && readyMediaKey === activeMediaKey;\n  const handleFirstFrameRendered = React.useCallback(() => {\n    if (!streamPaused && activeMediaKey != null) {\n      setReadyMediaKey(activeMediaKey);\n    }\n  }, [activeMediaKey, streamPaused]);\n  React.useEffect(() => {\n    if (streamPaused) setReadyMediaKey(null);\n  }, [streamPaused]);\n  const previewSource = React.useMemo(() => {\n    const preview = peer?.meta?.preview;\n    if (!preview) return null;\n    if (String(preview).startsWith('data:image/')) return {\n      uri: preview\n    };\n    return {\n      uri: \"data:image/jpeg;base64,\" + preview\n    };\n  }, [peer?.meta?.preview]);\n  const peerFallbackHash = getPeerFallbackHash(peer);\n  const shouldRenderOverlay = !!onPress || showReport || !hideControl;\n  if (isPip) return null;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    nativeID: peerDomId,\n    style: styles.container,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSViewHorizontalLimited, {\n    style: styles.fill,\n    aspect: 2\n  }, !!previewSource && /*#__PURE__*/React.createElement(ReactNative.Image, {\n    source: previewSource,\n    style: [styles.absolute, styles.fallbackPhoto, !mediaHasFirstFrame ? styles.fallbackVisible : null],\n    blurRadius: 1\n  }), !!peerFallbackHash && /*#__PURE__*/React.createElement(Image, {\n    source: null,\n    placeholder: {\n      thumbhash: peerFallbackHash\n    },\n    style: [styles.absolute, styles.fallbackHash, !mediaHasFirstFrame ? styles.fallbackVisible : null],\n    contentFit: \"cover\",\n    placeholderContentFit: \"cover\",\n    blurRadius: 1\n  }), isSubmitted && hlsReady && !!Components.DSHLSVideo && /*#__PURE__*/React.createElement(Components.DSHLSVideo, {\n    source: {\n      uri: hlsUrl\n    },\n    style: [styles.hlsVideo, streamPaused ? styles.mediaPaused : null],\n    contentFit: \"cover\",\n    active: !streamPaused,\n    autoPlay: !streamPaused,\n    muted: streamPaused || muted,\n    volume: streamPaused ? 0 : volume,\n    loop: false,\n    nativeControls: false,\n    pointerEvents: \"none\",\n    onFirstFrameRender: handleFirstFrameRendered\n  }), isSubmitted && canMountRtcView && /*#__PURE__*/React.createElement(WebRTC.RTCView, _extends({\n    key: rtcViewKey\n  }, nativeRtcViewProps, {\n    muted: streamPaused || muted,\n    volume: streamPaused ? 0 : volume,\n    style: [styles.video, streamPaused ? styles.mediaPaused : null],\n    objectFit: \"cover\",\n    onFirstFrameRendered: handleFirstFrameRendered\n  }))), streamPaused ? /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"StreamPausedOverlay\",\n    zIndex: 3,\n    videoGridSafeArea: videoGridSafeArea\n  }) : null, shouldRenderOverlay && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PeerOverlay\",\n    peer: peer,\n    onPress: onPress,\n    streamSoundControl: streamSoundControl,\n    showReport: showReport,\n    hideControl: hideControl\n  }));\n};"},"PeerOverlay":{"name":"PeerOverlay","key":"c5b705538b32ef86d3e597c9a3a6d2a0e8a75089c68a391fbb3c4da221f994e1","code":"deps: WithAppear, VerticalVolumeSlider\nfunction _empty() {}\nconst StreamSoundOnIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.4844 3.56041C12.3104 3.15915 13.1242 2.93551 13.9424 3.21471C14.2143 3.30749 14.4759 3.44114 14.7109 3.60631C15.4169 4.10252 15.716 4.88661 15.8779 5.786C16.0392 6.68186 16.093 7.87284 16.1621 9.35924C16.2139 10.4742 16.25 11.4479 16.25 11.9999C16.25 12.5518 16.2139 13.5248 16.1621 14.6395C16.093 16.1262 16.0392 17.3178 15.8779 18.2137C15.716 19.1131 15.417 19.8972 14.7109 20.3934C14.476 20.5585 14.2142 20.6913 13.9424 20.784C13.1242 21.0633 12.3104 20.8406 11.4844 20.4393C10.6604 20.039 9.6583 19.3758 8.40527 18.5497L8.18652 18.4051C7.73874 18.1099 7.58414 18.0116 7.4248 17.9413C7.25436 17.8661 7.0753 17.8122 6.8916 17.7811C6.71985 17.7521 6.53651 17.7499 6 17.7499C4.69612 17.7499 3.80962 17.7659 3.02539 17.4032C2.33059 17.0817 1.66098 16.4521 1.29785 15.7782C0.889898 15.0208 0.85641 14.2272 0.786133 13.0741C0.763693 12.7059 0.750006 12.3414 0.75 11.9999C0.750001 11.6583 0.763689 11.2939 0.786133 10.9256C0.856437 9.77216 0.889664 8.97815 1.29785 8.22057C1.661 7.54665 2.33062 6.91799 3.02539 6.59655C3.80966 6.23379 4.69603 6.24987 6 6.24987C6.53652 6.24987 6.71985 6.24762 6.8916 6.21862C7.07527 6.18758 7.25438 6.13363 7.4248 6.05846C7.58416 5.98813 7.73862 5.88894 8.18652 5.59362L8.40527 5.44909C9.6582 4.62298 10.6604 3.96075 11.4844 3.56041ZM13.458 4.63463C13.2089 4.54962 12.8526 4.56326 12.1406 4.90905C11.4264 5.256 10.5212 5.85163 9.23145 6.70202L9.01172 6.84557C8.60484 7.11384 8.33194 7.29777 8.03125 7.43053C7.7469 7.55603 7.4471 7.64538 7.14062 7.69713C6.81649 7.75182 6.48741 7.74987 6 7.74987C4.55674 7.74987 4.06951 7.76632 3.65527 7.95787C3.25495 8.14309 2.8284 8.54417 2.61914 8.93248C2.40089 9.33755 2.36024 9.75264 2.2832 11.0165C2.26206 11.3634 2.25 11.6967 2.25 11.9999C2.25001 12.303 2.26207 12.6355 2.2832 12.9823C2.36025 14.2464 2.40087 14.6621 2.61914 15.0672C2.82846 15.4555 3.25506 15.8567 3.65527 16.0419C4.06948 16.2333 4.55691 16.2499 6 16.2499C6.48737 16.2499 6.81652 16.247 7.14062 16.3016C7.4471 16.3534 7.7469 16.4437 8.03125 16.5692C8.33182 16.7019 8.60505 16.8851 9.01172 17.1532L9.23145 17.2977C10.5211 18.148 11.4264 18.7428 12.1406 19.0897C12.8528 19.4356 13.2089 19.4501 13.458 19.3651C13.5954 19.3182 13.7299 19.2493 13.8486 19.1659C14.0652 19.0136 14.2625 18.719 14.4014 17.9481C14.5409 17.1732 14.592 16.1009 14.6631 14.5702C14.7151 13.4508 14.75 12.5117 14.75 11.9999C14.75 11.4882 14.7151 10.5489 14.6631 9.42955C14.592 7.89888 14.5408 6.8265 14.4014 6.05162C14.2625 5.28028 14.0653 4.98512 13.8486 4.83287C13.7299 4.74947 13.5953 4.6815 13.458 4.63463ZM19.5195 5.4237C19.8377 5.15859 20.311 5.20139 20.5762 5.5194L20.082 5.93151C20.5696 5.52525 20.5768 5.52013 20.5771 5.52037V5.52135L20.582 5.52623C20.5841 5.52881 20.5861 5.53255 20.5889 5.536C20.5945 5.54306 20.6021 5.55168 20.6104 5.56237C20.627 5.58391 20.6488 5.61283 20.6748 5.64928C20.727 5.72241 20.797 5.82597 20.8779 5.9608C21.0398 6.23061 21.2465 6.62644 21.4502 7.15612C21.8583 8.21748 22.25 9.80865 22.25 11.9999C22.25 14.1911 21.8583 15.7822 21.4502 16.8436C21.2465 17.3733 21.0398 17.7691 20.8779 18.0389C20.797 18.1738 20.727 18.2773 20.6748 18.3505C20.6488 18.3869 20.627 18.4158 20.6104 18.4374C20.6021 18.4481 20.5945 18.4567 20.5889 18.4637C20.5861 18.4672 20.5841 18.4709 20.582 18.4735L20.5771 18.4784V18.4794C20.5769 18.4797 20.5762 18.48 20 17.9999L20.5762 18.4803C20.311 18.7984 19.8377 18.8412 19.5195 18.576C19.2213 18.3274 19.1652 17.896 19.3779 17.5809L19.4199 17.5253C19.42 17.5251 19.4202 17.5241 19.4209 17.5233L19.4229 17.5214V17.5204L19.4238 17.5194C19.4292 17.5124 19.4395 17.4988 19.4541 17.4784C19.4839 17.4367 19.5312 17.3667 19.5908 17.2674C19.7102 17.0685 19.8786 16.7507 20.0498 16.3055C20.3916 15.4169 20.75 14.0083 20.75 11.9999C20.75 9.99147 20.3916 8.58283 20.0498 7.6942C19.8786 7.249 19.7102 6.93122 19.5908 6.73229C19.5312 6.633 19.4838 6.563 19.4541 6.52135L19.4238 6.48034L19.3779 6.41881C19.1652 6.10374 19.2213 5.67238 19.5195 5.4237ZM17.6357 8.34459C17.9978 8.14348 18.4541 8.27367 18.6553 8.63561L18.1162 8.93541L18.6562 8.63659L18.6572 8.63854C18.6577 8.63943 18.6586 8.64048 18.6592 8.64147C18.6603 8.64355 18.6617 8.64581 18.6631 8.6483C18.6658 8.65345 18.6683 8.65991 18.6719 8.66686C18.6791 8.68093 18.688 8.69907 18.6982 8.72057C18.7187 8.76351 18.7451 8.82112 18.7744 8.8944C18.8333 9.04156 18.906 9.25103 18.9766 9.52623C19.1178 10.0772 19.25 10.8899 19.25 11.9999C19.25 13.1099 19.1178 13.9226 18.9766 14.4735C18.906 14.7487 18.8333 14.9582 18.7744 15.1053C18.7451 15.1786 18.7187 15.2362 18.6982 15.2792C18.688 15.3007 18.6791 15.3188 18.6719 15.3329C18.6683 15.3398 18.6658 15.3463 18.6631 15.3514C18.6617 15.3539 18.6603 15.3562 18.6592 15.3583C18.6586 15.3593 18.6577 15.3603 18.6572 15.3612L18.6562 15.3631L18.6553 15.3641C18.4541 15.7261 17.9978 15.8563 17.6357 15.6551C17.274 15.454 17.1441 14.9985 17.3447 14.6366H17.3438L17.3447 14.6346C17.3516 14.6202 17.3645 14.5912 17.3818 14.5477C17.4167 14.4605 17.4691 14.3134 17.5234 14.1014C17.6322 13.6774 17.75 12.9897 17.75 11.9999C17.75 11.01 17.6322 10.3224 17.5234 9.8983C17.4691 9.68636 17.4167 9.5392 17.3818 9.45202C17.3644 9.40855 17.3516 9.37955 17.3447 9.3651L17.3438 9.36315L17.3447 9.36217C17.1447 9.00036 17.2742 8.54555 17.6357 8.34459Z\",\n  fill: color\n})));\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst StreamSoundOffIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M21.4697 1.47016C21.7626 1.17726 22.2374 1.17727 22.5303 1.47016C22.823 1.76307 22.8231 2.23788 22.5303 2.5307L2.53027 22.5307C2.23743 22.8233 1.76257 22.8233 1.46973 22.5307C1.1769 22.2379 1.17703 21.7631 1.46973 21.4702L5.19238 17.7465C4.30891 17.737 3.63605 17.6861 3.02539 17.4038C2.3307 17.0823 1.66102 16.4526 1.29785 15.7788C0.889933 15.0214 0.856395 14.2275 0.786133 13.0746C0.763701 12.7066 0.750016 12.3418 0.75 12.0004C0.75 11.659 0.763703 11.2943 0.786133 10.9262C0.856429 9.77287 0.889819 8.97863 1.29785 8.22113C1.66097 7.54725 2.33067 6.91858 3.02539 6.59711C3.80966 6.23435 4.69603 6.25043 6 6.25043C6.53645 6.25043 6.71987 6.24817 6.8916 6.21918C7.07521 6.18816 7.25442 6.13417 7.4248 6.05903C7.58414 5.98871 7.73875 5.88942 8.18652 5.59418L8.40527 5.44965C9.65812 4.6236 10.6604 3.96132 11.4844 3.56098C12.3104 3.15971 13.1242 2.93607 13.9424 3.21528C14.2142 3.30805 14.4759 3.44173 14.7109 3.60688C15.3501 4.0562 15.6554 4.7415 15.8271 5.52973C15.9148 5.93199 15.9737 6.39563 16.0195 6.91938L21.4697 1.47016ZM15.5 11.2504C15.9142 11.2504 16.25 11.5862 16.25 12.0004C16.25 12.5525 16.2139 13.5257 16.1621 14.6401C16.093 16.1266 16.0392 17.3184 15.8779 18.2143C15.716 19.1135 15.4169 19.8979 14.7109 20.394C14.476 20.559 14.2141 20.6919 13.9424 20.7846C13.2005 21.0377 12.4628 20.8775 11.7207 20.5493C10.9878 20.2251 10.1276 19.6811 9.08887 19.0004C8.74256 18.7735 8.64638 18.3088 8.87305 17.9623C9.10007 17.6159 9.56468 17.5185 9.91113 17.7455C10.9697 18.4392 11.7264 18.9114 12.3271 19.1772C12.9184 19.4387 13.2326 19.4425 13.458 19.3657C13.5953 19.3188 13.7299 19.2499 13.8486 19.1664C14.0651 19.0142 14.2625 18.7193 14.4014 17.9487C14.5408 17.1739 14.592 16.1013 14.6631 14.5707C14.7151 13.4516 14.75 12.5123 14.75 12.0004C14.75 11.5862 15.0858 11.2504 15.5 11.2504ZM20.2646 6.31684C20.6422 6.1466 21.0865 6.31433 21.2568 6.69184C21.7238 7.72702 22.25 9.46028 22.25 12.0004C22.2499 14.1915 21.8583 15.7829 21.4502 16.8442C21.2465 17.3737 21.0398 17.7697 20.8779 18.0395C20.7971 18.1742 20.727 18.2779 20.6748 18.351C20.6488 18.3874 20.627 18.4164 20.6104 18.4379C20.6021 18.4485 20.5945 18.4573 20.5889 18.4643C20.5862 18.4677 20.5841 18.4715 20.582 18.4741L20.5771 18.4789V18.4799C20.5765 18.48 20.5619 18.4687 20 18.0004L20.5762 18.4809C20.311 18.7986 19.8376 18.8415 19.5195 18.5766C19.2214 18.328 19.1654 17.8965 19.3779 17.5815L19.4199 17.5258L19.4209 17.5239L19.4229 17.5219V17.5209L19.4238 17.52C19.4292 17.513 19.4396 17.4992 19.4541 17.4789C19.4838 17.4373 19.5313 17.3671 19.5908 17.268C19.7101 17.0691 19.8786 16.7511 20.0498 16.3061C20.3916 15.4175 20.7499 14.0086 20.75 12.0004C20.75 9.67465 20.2697 8.15165 19.8896 7.30903C19.7193 6.93151 19.8872 6.48724 20.2646 6.31684ZM13.458 4.6352C13.2089 4.55018 12.8526 4.56381 12.1406 4.90961C11.4264 5.25658 10.5211 5.85225 9.23145 6.70258L9.01172 6.84613C8.60494 7.11435 8.3319 7.29836 8.03125 7.4311C7.74694 7.55656 7.44705 7.64595 7.14062 7.6977C6.81651 7.75237 6.48738 7.75043 6 7.75043C4.55672 7.75043 4.06951 7.76688 3.65527 7.95844C3.25499 8.14369 2.82837 8.54477 2.61914 8.93305C2.40103 9.33802 2.36022 9.7535 2.2832 11.017C2.26207 11.3639 2.25 11.6973 2.25 12.0004C2.25002 12.3034 2.26208 12.6362 2.2832 12.9829C2.36024 14.2467 2.40089 14.6627 2.61914 15.0678C2.82852 15.4559 3.25516 15.8573 3.65527 16.0424C4.06945 16.2338 4.55709 16.2504 6 16.2504C6.26564 16.2504 6.48423 16.2502 6.68066 16.2582L14.6094 8.32953C14.5517 7.22856 14.4889 6.43462 14.3613 5.84906C14.2255 5.22563 14.0444 4.97111 13.8486 4.83344C13.73 4.75006 13.5953 4.68207 13.458 4.6352ZM18.1641 9.26606C18.5696 9.1819 18.9666 9.44254 19.0508 9.84809C19.1609 10.3785 19.25 11.0896 19.25 12.0004C19.25 13.1102 19.1178 13.9232 18.9766 14.4741C18.906 14.7491 18.8333 14.9588 18.7744 15.1059C18.7451 15.179 18.7187 15.2369 18.6982 15.2797C18.6881 15.3011 18.6791 15.3194 18.6719 15.3334C18.6684 15.3403 18.6658 15.3469 18.6631 15.352C18.6618 15.3544 18.6603 15.3568 18.6592 15.3588C18.6586 15.3597 18.6577 15.3609 18.6572 15.3618L18.6562 15.3637L18.6553 15.3647C18.454 15.7264 17.9976 15.8566 17.6357 15.6557C17.2741 15.4547 17.1443 14.999 17.3447 14.6371H17.3438L17.3447 14.6352C17.3516 14.6208 17.3645 14.5916 17.3818 14.5483C17.4167 14.4611 17.4691 14.3138 17.5234 14.102C17.6322 13.678 17.75 12.9901 17.75 12.0004C17.75 11.188 17.6705 10.579 17.582 10.1528C17.4979 9.74728 17.7586 9.35028 18.1641 9.26606Z\",\n  fill: color\n})));\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nreturn ({\n  peer,\n  onPress,\n  streamSoundControl = false,\n  showReport = true,\n  hideControl = false\n}) => {\n  const theme = Theme.useTheme();\n  const {\n    isHorizontal\n  } = Components.useVideoGrid();\n  const [isPipLocal] = Hooks.useBehaviorSubject(State.state.isPipLocal);\n  const [userCamera] = Hooks.useBehaviorSubject(State.state.userCamera);\n  const [mutedStream, setMutedStream] = Hooks.useBehaviorSubject(State.store.mutedStream);\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const [peers] = Hooks.useBehaviorSubject(State.state.peers);\n  const t = Locale.useTranslation();\n  const isGuest = State.api?.guest?.useIsGuestSession?.();\n  const guestCallsRemaining = State.api?.guestVideoChatCounter?.useGuestCallsRemaining?.() ?? 0;\n  const topPipCameraPadding = (isPipLocal && !isHorizontal ? (userCamera ? 216 : 128) + 12 : 0) + 18;\n  const isActivePeer = React.useMemo(() => {\n    if (!peer?.sessionId) return false;\n    if (call?.sessionId) return peer.sessionId === call.sessionId;\n    const first = peers?.[0];\n    return first ? first.sessionId === peer.sessionId : true;\n  }, [peer?.sessionId, call?.sessionId, peers]);\n  const showCallsLeft = isGuest && isActivePeer && !!guestCallsRemaining;\n  const callsLeftLabel = React.useMemo(() => {\n    if (!showCallsLeft) return '';\n    return t('guestCallsLeft', guestCallsRemaining);\n  }, [showCallsLeft, t, guestCallsRemaining]);\n  const styles = React.useMemo(() => {\n    const stPrimary = theme.theme.semantic.content.inversion.static.stPrimary;\n    const surface4 = theme.theme.semantic.surface.alfa.static.stSurface4;\n    return {\n      layer: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0\n      },\n      pressable: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        backgroundColor: 'transparent'\n      },\n      bottomGradient: {\n        position: 'absolute',\n        left: 0,\n        right: 0,\n        bottom: 0,\n        height: 128\n      },\n      rightRailSafeArea: {\n        position: 'absolute',\n        top: 0,\n        left: 0,\n        right: 0,\n        alignItems: 'flex-end'\n      },\n      rightRailColumn: {\n        paddingRight: 12,\n        alignItems: 'flex-end',\n        justifyContent: 'flex-start',\n        gap: 6\n      },\n      rightRail: {\n        flexDirection: 'row',\n        alignItems: 'flex-start',\n        justifyContent: 'flex-end',\n        gap: 6\n      },\n      rightButton: {\n        width: 44,\n        height: 44,\n        borderRadius: 999,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: surface4\n      },\n      callsBadge: {\n        minWidth: 44,\n        paddingHorizontal: 10,\n        height: 28,\n        borderRadius: 14,\n        alignItems: 'center',\n        justifyContent: 'center',\n        backgroundColor: surface4\n      },\n      callsText: {\n        color: stPrimary,\n        fontFamily: 'Inter',\n        fontSize: 12,\n        fontWeight: '500',\n        lineHeight: 18,\n        textAlign: 'center'\n      },\n      icon: {\n        color: stPrimary\n      }\n    };\n  }, [theme]);\n  const [peerData, setPeerData] = manifest().peer.usePeerData(peer?.sessionId);\n  const setVolume = React.useCallback(value => {\n    setPeerData({\n      volume: value\n    });\n  }, [setPeerData]);\n  const toggleMuteStream = React.useCallback(() => {\n    setMutedStream(!mutedStream);\n  }, [mutedStream, setMutedStream]);\n  const onReport = React.useCallback(_async(function () {\n    return _invokeIgnored(function () {\n      if (peer?.stream != null || peer?.meta != null) {\n        Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n          name: \"report\",\n          peer: peer,\n          meta: peer?.meta,\n          source: 'videochat'\n        }), {\n          theme: Theme.isDark.value ? 'dark' : 'light',\n          props: {\n            style: {\n              maxWidth: 600\n            }\n          }\n        });\n        return _awaitIgnored(new Promise(r => setTimeout(r, 3000)));\n      }\n    });\n  }), [peer]);\n  const onPressPeer = React.useCallback(function () {\n    onPress?.(peer);\n    return _await();\n  }, [peer]);\n  if (!peer) return null;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.layer,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSTopBarGradient, {\n    visible: true,\n    initial: true,\n    duration: 1000,\n    height: 100,\n    colors: ['rgba(0,0,0,0.5)', 'rgba(0,0,0,0)']\n  }), /*#__PURE__*/React.createElement(LinearGradient, {\n    pointerEvents: \"none\",\n    colors: ['rgba(0,0,0,0)', 'rgba(0,0,0,0.68)'],\n    locations: [0, 1],\n    start: {\n      x: 0.5,\n      y: 0\n    },\n    end: {\n      x: 0.5,\n      y: 1\n    },\n    style: styles.bottomGradient\n  }), onPress && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    styleContainer: styles.pressable,\n    noloading: true,\n    onPress: onPressPeer,\n    scale: 1,\n    pointerEvents: \"auto\"\n  }), /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.rightRailSafeArea,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    duration: 250,\n    style: [styles.rightRailColumn, {\n      paddingTop: topPipCameraPadding\n    }].filter(Boolean),\n    pointerEvents: \"auto\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rightRail\n  }, showReport ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.rightButton,\n    noloading: true,\n    onPress: onReport\n  }, /*#__PURE__*/React.createElement(Assets.Flag, {\n    size: 20,\n    style: styles.icon\n  })) : null, !hideControl && (streamSoundControl ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    style: styles.rightButton,\n    noloading: true,\n    onPress: toggleMuteStream\n  }, mutedStream ? /*#__PURE__*/React.createElement(StreamSoundOffIcon, null) : /*#__PURE__*/React.createElement(StreamSoundOnIcon, null)) : !!peer?.sessionId && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VerticalVolumeSlider\",\n    value: peerData?.volume ?? 1,\n    onChange: setVolume\n  }))), showCallsLeft && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.callsBadge,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.callsText,\n    numberOfLines: 1\n  }, callsLeftLabel)))));\n};"},"NotEnoughGemsModal":{"name":"NotEnoughGemsModal","key":"3b177114b79666e05d0c9578c27295b74ac2204ee53216e4c0ee1564d14bc322","code":"return () => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const onOpenStore = React.useCallback(() => {\n    sheet.close();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"store\",\n      isModal: true,\n      purchaseSource: \"paywall_video_chat\"\n    }), {\n      theme: Theme?.isDark?.value ? \"dark\" : \"light\",\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: \"hidden\"\n        }\n      }\n    });\n  }, [sheet]);\n  const onResetFilters = React.useCallback(() => {\n    State.store.callFilterStore.next({});\n    State.state.storage.price.next(null);\n    sheet.close();\n  }, [sheet]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: \"column\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      paddingBottom: safeArea.bottom,\n      width: \"100%\",\n      gap: 4\n    },\n    header: {\n      width: \"100%\",\n      flexDirection: \"row\",\n      justifyContent: \"flex-end\",\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    content: {\n      flexDirection: \"column\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      gap: 8,\n      paddingHorizontal: 24,\n      paddingBottom: 8,\n      width: \"100%\"\n    },\n    icon: {\n      width: 98,\n      height: 98,\n      marginBottom: 6\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: \"600\",\n      textAlign: \"center\"\n    },\n    description: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: \"500\",\n      textAlign: \"center\"\n    },\n    actions: {\n      flexDirection: \"column\",\n      alignItems: \"stretch\",\n      justifyContent: \"center\",\n      gap: 10,\n      width: \"100%\",\n      paddingHorizontal: 16,\n      paddingVertical: 8\n    },\n    buttonWrapper: {\n      width: \"100%\"\n    },\n    button: {\n      width: \"100%\"\n    },\n    brandPrimaryButton: {\n      width: \"100%\",\n      height: 48,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? \"#FE375B\",\n      borderRadius: 12,\n      flexDirection: \"row\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      paddingHorizontal: 20,\n      paddingVertical: 12\n    },\n    brandPrimaryContent: {\n      flexDirection: \"row\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      gap: 8\n    },\n    brandPrimaryLabel: {\n      fontSize: 16,\n      fontWeight: \"600\",\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: \"#FFFFFF\",\n      textAlign: \"center\",\n      flexShrink: 1\n    },\n    resetText: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: \"500\",\n      textAlign: \"center\"\n    },\n    closeIcon: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: \"500\"\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory\",\n    style: styles.icon,\n    source: State.getUrl(\"/api/component/assets/store/diamond-big.webp\")\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t(\"notEnoughGems\")), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t(\"chatTopUp\"))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actions\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonWrapper\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: [styles.button, styles.brandPrimaryButton],\n    onPress: onOpenStore\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.brandPrimaryContent\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.brandPrimaryLabel,\n    numberOfLines: 1,\n    ellipsizeMode: \"tail\"\n  }, t(\"getMoreGems\")), /*#__PURE__*/React.createElement(Assets.StoreFill, {\n    color: \"#FFFFFF\"\n  })))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonWrapper\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"ghost\",\n    style: styles.button,\n    textStyle: styles.resetText,\n    onPress: onResetFilters\n  }, t(\"searchNogemsReset\")))));\n};"},"EmptySearchModal":{"name":"EmptySearchModal","key":"a06577a848babbe1b700ce7c91ce43e3be416287bb13e62c07ca2599301e7561","code":"return ({\n  onKeepSearching: onKeepSearchingProp,\n  onStop: onStopProp\n} = {}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const onKeepSearching = React.useCallback(() => {\n    sheet.close();\n    if (onKeepSearchingProp) {\n      onKeepSearchingProp();\n      return;\n    }\n    manifest().call.onTryStart();\n  }, [onKeepSearchingProp, sheet]);\n  const onStop = React.useCallback(() => {\n    sheet.close();\n    if (onStopProp) {\n      onStopProp();\n      return;\n    }\n    manifest().call.onStop();\n  }, [onStopProp, sheet]);\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingBottom: safeArea.bottom,\n      width: '100%',\n      gap: 4\n    },\n    header: {\n      width: '100%',\n      flexDirection: 'row',\n      justifyContent: 'flex-end',\n      paddingHorizontal: 16,\n      paddingTop: 20,\n      paddingBottom: 12\n    },\n    content: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6,\n      paddingHorizontal: 24,\n      paddingBottom: 8,\n      width: '100%'\n    },\n    icon: {\n      width: 88,\n      height: 88,\n      marginBottom: 6\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: 600,\n      textAlign: 'center'\n    },\n    description: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      textAlign: 'center'\n    },\n    actions: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 10,\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingVertical: 8\n    },\n    button: {\n      width: '100%'\n    },\n    stopText: {\n      fontFamily: theme.theme.typography.family.heading,\n      fontWeight: 600,\n      fontSize: 16,\n      letterSpacing: -0.16,\n      textAlign: 'center',\n      textAlignVertical: 'center',\n      color: theme.theme.component.button.ghost.content\n    }\n  }), [theme, safeArea]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: 500\n    }\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    cachePolicy: \"memory\",\n    style: styles.icon,\n    source: Assets.search\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('emptySearchHeader')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('emptySearchDescription'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actions\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"brand\",\n    size: \"L\",\n    style: styles.button,\n    onPress: onKeepSearching\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      fontSize: 16,\n      fontWeight: '600',\n      color: theme.theme.component.button.brand.content\n    }\n  }, t('emptySearchContinue'))), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"ghost\",\n    style: styles.button,\n    onPress: onStop\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.stopText\n  }, t('emptySearchStop')))));\n};"},"VideoChatPaywall":{"name":"VideoChatPaywall","key":"b0dd8d487c9646df0baa93a9a2d68b2743502b0107c9f70e03d0dc4e3a471dc3","code":"/**\n * VideoChatPaywall — пейволл для видеочата с градиентным фоном и SVG таймером.\n *\n * Props:\n * - timeout: number (мс) — время до закрытия\n * - onPress: () => void — обработчик клика по кнопке\n * - onTimeout: () => void — callback по истечении таймера\n * - onCancel: () => void — callback при нажатии крестика (отмена поиска)\n */\n\nconst PREMIUM_LOGO_ASSET = '/api/component/assets/store/premium-logo-3d-silver.webp';\nconst CameraIcon = ({\n  fill,\n  size = 20,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10 3.333c-1.38 0-2.5.15-2.5.15L6.167 5.5H3.833C2.821 5.5 2 6.321 2 7.333v7.334C2 15.679 2.821 16.5 3.833 16.5h12.334c1.012 0 1.833-.821 1.833-1.833V7.333c0-1.012-.821-1.833-1.833-1.833h-2.334L12.5 3.483S11.38 3.333 10 3.333zm0 3.584a3.75 3.75 0 110 7.5 3.75 3.75 0 010-7.5zm0 1.666a2.084 2.084 0 100 4.167 2.084 2.084 0 000-4.167z\",\n  fill: fill\n}));\nconst ChatsIcon = ({\n  fill,\n  size = 20,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M3.333 2.5C2.413 2.5 1.667 3.246 1.667 4.167v8.333c0 .92.746 1.667 1.666 1.667H5v3.333l3.333-3.333h5c.92 0 1.667-.747 1.667-1.667V4.167c0-.92-.746-1.667-1.667-1.667H3.333z\",\n  fill: fill\n}));\nconst SearchIcon = ({\n  fill,\n  size = 20,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8.333 2.5a5.833 5.833 0 014.53 9.512l4.137 4.138-1.178 1.178-4.138-4.137A5.833 5.833 0 118.333 2.5zm0 1.667a4.167 4.167 0 100 8.333 4.167 4.167 0 000-8.333z\",\n  fill: fill\n}));\nconst HeartIcon = ({\n  fill,\n  size = 20,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10 4.167S8.333 1.667 5.417 1.667A4.583 4.583 0 00.833 6.25c0 5 9.167 11.25 9.167 11.25S19.167 11.25 19.167 6.25a4.583 4.583 0 00-4.584-4.583C11.667 1.667 10 4.167 10 4.167z\",\n  fill: fill\n}));\nconst CrownIcon = ({\n  size = 20,\n  color,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nconst getFeatures = t => [{\n  key: 'noWait',\n  Icon: CameraIcon,\n  title: t('subPayNoWaitingTitle', 'No waiting'),\n  description: t('subPayNoWaitingDesc', 'Skip the queue and get matched instantly')\n}, {\n  key: 'freeMsg',\n  Icon: ChatsIcon,\n  title: t('subPayFreeMessagesTitle', 'Free messages'),\n  description: t('subPayFreeMessagesDesc', 'Send messages without spending crystals')\n}, {\n  key: 'filters',\n  Icon: SearchIcon,\n  title: t('subPayFiltersTitle', 'Advanced filters'),\n  // Age wording disabled fallback: t('subPayFiltersDesc', 'Unlimited age & location filters')\n  description: t('subPayFiltersDesc', 'Unlimited location and gender filters')\n}, {\n  key: 'followers',\n  Icon: HeartIcon,\n  title: t('subPayFollowersTitle', 'See your followers'),\n  description: t('subPayFollowersDesc', \"Discover who's following you\")\n}];\nconst PremiumBottomBlock = React.memo(({\n  title,\n  features,\n  buttonLabel,\n  badgeLabel,\n  logoSource,\n  brandColor,\n  textPrimary,\n  styles,\n  onPress\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallCard\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallHeader\n}, /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.paywallTitle,\n  numberOfLines: 2\n}, title)), /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallLogoContainer,\n  pointerEvents: \"none\"\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallLogoRotator\n}, /*#__PURE__*/React.createElement(ReactNative.Image, {\n  source: logoSource,\n  style: styles.paywallLogo,\n  resizeMode: \"contain\"\n}))), /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallFeatures\n}, features.map(feature => {\n  const FeatureIcon = feature.Icon;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: feature.key,\n    style: styles.paywallFeatureRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.paywallFeatureIcon\n  }, /*#__PURE__*/React.createElement(FeatureIcon, {\n    fill: brandColor,\n    size: 16\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.paywallFeatureText,\n    numberOfLines: 1\n  }, feature.title));\n})), /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallButtonWrap\n}, /*#__PURE__*/React.createElement(Components.DSPressable, {\n  feedback: true,\n  style: styles.paywallButton,\n  onPress: onPress\n}, /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.paywallButtonText,\n  numberOfLines: 1\n}, buttonLabel), /*#__PURE__*/React.createElement(CrownIcon, {\n  size: 16,\n  color: textPrimary\n})), !!badgeLabel && /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallBadgeContainer,\n  pointerEvents: \"none\"\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.paywallBadge\n}, /*#__PURE__*/React.createElement(ReactNative.Text, {\n  style: styles.paywallBadgeText,\n  numberOfLines: 1\n}, badgeLabel))))));\nreturn ({\n  timeout: timeoutMs = 3000,\n  onPress,\n  onTimeout,\n  onCancel\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const totalMs = React.useMemo(() => Math.max(1000, Number(timeoutMs) || 0), [timeoutMs]);\n  const [initMs] = React.useState(() => +new Date());\n  const [finishMs] = React.useState(() => initMs + totalMs);\n  const [remainingMs, setRemainingMs] = React.useState(totalMs);\n  const timeoutFiredRef = React.useRef(false);\n  React.useEffect(() => {\n    const stepMs = 16;\n    const id = setInterval(() => {\n      setRemainingMs(() => {\n        const value = Math.max(finishMs - +new Date(), 0);\n        if (value <= 0) {\n          if (!timeoutFiredRef.current) {\n            timeoutFiredRef.current = true;\n            try {\n              onTimeout?.();\n            } catch (error) {\n              console.error(error);\n            }\n          }\n        }\n        return value;\n      });\n    }, stepMs);\n    return () => clearInterval(id);\n  }, [onTimeout, finishMs]);\n  const brandColor = theme.theme?.semantic?.surface?.brand?.surface4 ?? '#fe375b';\n  const textPrimary = theme.theme?.semantic?.content?.inversion?.static?.stPrimary ?? '#ffffff';\n  const textSecondary = theme.theme?.semantic?.content?.inversion?.static?.stSecondary ?? 'rgba(255,255,255,0.6)';\n  const {\n    width: windowWidth,\n    height: windowHeight\n  } = ReactNative.useWindowDimensions();\n  const isWide = isTablet && windowHeight > 500 && windowWidth > 500;\n  const features = React.useMemo(() => getFeatures(t), [t]);\n  const premiumLogoSource = React.useMemo(() => ({\n    uri: State.getUrl(PREMIUM_LOGO_ASSET)\n  }), []);\n  const styles = React.useMemo(() => ({\n    overlay: {\n      flex: 1,\n      width: '100%',\n      height: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    },\n    gradient: {\n      ...ReactNative.StyleSheet.absoluteFillObject\n    },\n    full: {\n      flex: 1,\n      width: '100%',\n      height: '100%'\n    },\n    container: {\n      position: 'relative',\n      flex: 1,\n      width: '100%',\n      height: '100%',\n      justifyContent: 'flex-end',\n      alignItems: 'center',\n      paddingTop: 24,\n      paddingHorizontal: 24,\n      paddingBottom: 32\n    },\n    closeButtonContainer: {\n      position: 'absolute',\n      top: 12,\n      left: 16\n    },\n    closeButton: {\n      width: 56,\n      height: 56,\n      borderRadius: 56,\n      backgroundColor: Utils.withOpacity?.(textPrimary, 0.15) ?? 'rgba(255,255,255,0.15)',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    closeIcon: {\n      color: textPrimary,\n      width: 28,\n      height: 28\n    },\n    topSection: {\n      flex: 1,\n      justifyContent: 'center',\n      alignItems: 'center',\n      width: '100%'\n    },\n    timerContainer: {\n      width: 96,\n      height: 96,\n      justifyContent: 'center',\n      alignItems: 'center',\n      position: 'relative'\n    },\n    timerSvg: {\n      position: 'absolute',\n      width: 96,\n      height: 96,\n      left: 0,\n      top: 0,\n      right: 0,\n      bottom: 0\n    },\n    timerTextWrap: {\n      width: 96,\n      height: 96,\n      justifyContent: 'center',\n      alignItems: 'center',\n      position: 'absolute',\n      left: 0,\n      top: 0\n    },\n    timerText: {\n      fontFamily: 'Inter',\n      fontWeight: '700',\n      fontSize: 36,\n      lineHeight: 40,\n      letterSpacing: -0.5,\n      color: textPrimary,\n      textAlign: 'center'\n    },\n    textBlock: {\n      alignItems: 'center',\n      gap: 4,\n      marginTop: 20\n    },\n    title: {\n      fontFamily: 'Inter',\n      fontWeight: '700',\n      fontSize: 22,\n      lineHeight: 28,\n      letterSpacing: -0.5,\n      color: textPrimary,\n      textAlign: 'center'\n    },\n    subtitle: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 15,\n      lineHeight: 22,\n      letterSpacing: -0.2,\n      color: textSecondary,\n      textAlign: 'center'\n    },\n    bottomSection: {\n      width: '100%',\n      alignItems: 'center',\n      paddingHorizontal: isWide ? 0 : 24\n    },\n    paywallCard: {\n      position: 'relative',\n      width: '100%',\n      maxWidth: isWide ? 360 : undefined,\n      alignSelf: 'center',\n      backgroundColor: Utils.withOpacity?.(textPrimary, 0.05) ?? 'rgba(255,255,255,0.05)',\n      borderRadius: 24,\n      padding: 20,\n      gap: 12,\n      overflow: 'visible'\n    },\n    paywallHeader: {\n      width: '100%',\n      paddingRight: 20\n    },\n    paywallTitle: {\n      fontFamily: theme.theme?.typography?.family?.heading ?? 'Geologica',\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: 0,\n      color: textPrimary\n    },\n    paywallLogoContainer: {\n      position: 'absolute',\n      top: '50%',\n      right: -38.18,\n      width: 83.283,\n      height: 83.283,\n      marginTop: -55,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    paywallLogoRotator: {\n      width: 68,\n      height: 68,\n      transform: [{\n        rotate: '15deg'\n      }]\n    },\n    paywallLogo: {\n      width: 68,\n      height: 68\n    },\n    paywallFeatures: {\n      width: '100%',\n      gap: 2,\n      alignItems: 'stretch'\n    },\n    paywallFeatureRow: {\n      height: 24,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      borderRadius: 24\n    },\n    paywallFeatureIcon: {\n      width: 16,\n      height: 16,\n      alignItems: 'center',\n      justifyContent: 'center',\n      flexShrink: 0\n    },\n    paywallFeatureText: {\n      flex: 1,\n      minWidth: 0,\n      color: textPrimary,\n      fontFamily: theme.theme?.typography?.family?.paragraph ?? 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: 0\n    },\n    paywallButtonWrap: {\n      position: 'relative',\n      width: '100%',\n      gap: 8\n    },\n    paywallButton: {\n      height: 32,\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingVertical: 6,\n      paddingHorizontal: 12,\n      backgroundColor: brandColor,\n      borderRadius: 12,\n      gap: 6\n    },\n    paywallButtonText: {\n      fontFamily: theme.theme?.typography?.family?.heading ?? 'Geologica',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: 0,\n      color: theme.theme?.component?.button?.brand?.content ?? textPrimary\n    },\n    paywallBadgeContainer: {\n      position: 'absolute',\n      top: -12.89,\n      right: -32.57,\n      width: 114.139,\n      height: 27.78,\n      alignItems: 'center',\n      justifyContent: 'center',\n      transform: [{\n        rotate: '5deg'\n      }]\n    },\n    paywallBadge: {\n      height: 18,\n      borderRadius: 999,\n      paddingHorizontal: 4,\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: '#ffffff',\n      shadowColor: '#04060F',\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      shadowOpacity: 0.15,\n      shadowRadius: 14,\n      elevation: 4\n    },\n    paywallBadgeText: {\n      color: '#04060F',\n      fontFamily: theme.theme?.typography?.family?.heading ?? 'Geologica',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 12,\n      letterSpacing: 0,\n      textAlign: 'center'\n    }\n  }), [theme, isWide, textPrimary, textSecondary, brandColor]);\n  const timerRadius = 42;\n  const timerCircumference = 2 * Math.PI * timerRadius;\n  const elapsedFraction = Math.min(1, (totalMs - remainingMs) / totalMs);\n  const timerStrokeOffset = timerCircumference * (1 - elapsedFraction);\n  const timerDisplay = remainingMs > 0 ? String(Math.max(Math.ceil(remainingMs / 1000), 1)) : '1';\n  const titleText = t(\"videoChatPaywallTitle\");\n  const subtitleText = t(\"videoChatPaywallSubtitle\");\n  const buttonLabelText = t(\"videoChatPaywallButton\");\n  const paywallTitleText = t(\"videoChatPaywallFeaturesTitle\");\n  const discountBadgeText = t(\"videoChatPaywallDiscountBadge\");\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.overlay\n  }, /*#__PURE__*/React.createElement(LinearGradient, {\n    colors: ['rgba(0,0,0,0.85)', Utils.withOpacity?.(brandColor, 0.25) ?? 'rgba(254,55,91,0.25)', Utils.withOpacity?.(brandColor, 0.65) ?? 'rgba(254,55,91,0.65)'],\n    locations: [0, 0.45, 1],\n    start: {\n      x: 0.5,\n      y: 0\n    },\n    end: {\n      x: 0.5,\n      y: 1\n    },\n    style: styles.gradient\n  }), /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.full\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topSection\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.timerContainer\n  }, /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 96,\n    height: 96,\n    viewBox: \"0 0 96 96\",\n    style: styles.timerSvg\n  }, /*#__PURE__*/React.createElement(SVG.Circle, {\n    cx: 48,\n    cy: 48,\n    r: timerRadius + 4,\n    fill: Utils.withOpacity?.(textPrimary, 0.15) ?? 'rgba(255,255,255,0.15)'\n  }), /*#__PURE__*/React.createElement(SVG.Circle, {\n    cx: 48,\n    cy: 48,\n    r: timerRadius,\n    fill: \"none\",\n    stroke: brandColor,\n    strokeWidth: 8,\n    strokeDasharray: timerCircumference,\n    strokeDashoffset: timerStrokeOffset,\n    strokeLinecap: \"round\",\n    transform: \"rotate(-90 48 48)\"\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.timerTextWrap,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.timerText\n  }, timerDisplay))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.textBlock\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, titleText), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, subtitleText))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomSection\n  }, /*#__PURE__*/React.createElement(PremiumBottomBlock, {\n    title: paywallTitleText,\n    features: features,\n    buttonLabel: buttonLabelText,\n    badgeLabel: discountBadgeText,\n    logoSource: premiumLogoSource,\n    brandColor: brandColor,\n    textPrimary: textPrimary,\n    styles: styles,\n    onPress: onPress\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.closeButtonContainer,\n    style: styles.closeButton,\n    onPress: onCancel\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.closeIcon\n  })))));\n};"},"GuestRegisterSheet":{"name":"GuestRegisterSheet","key":"69da7f73850b8f5cded2c49e5d6911300ee041474f1d9615212d79945136f804","code":"function _call(body, then, direct) {\n  if (direct) {\n    return then ? then(body()) : body();\n  }\n  try {\n    var result = Promise.resolve(body());\n    return then ? result.then(then) : result;\n  } catch (e) {\n    return Promise.reject(e);\n  }\n}\n/* === Inlined module: authIcons.jsx === */\n// Shared auth-provider icons (Apple / Google / VK).\n// Source of truth: LoginLayout.jsx. Extracted here so GuestRegisterSheet\n// (and any future auth surface) reuses the exact same artwork.\n// Email uses the global Assets.Email icon (see caller), no inline SVG here.\n\nconst AppleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M19.6647 17.7233C19.3774 18.3871 19.0374 18.9981 18.6434 19.5599C18.1064 20.3257 17.6667 20.8558 17.3279 21.1502C16.8026 21.6334 16.2398 21.8809 15.6371 21.8949C15.2045 21.8949 14.6827 21.7718 14.0753 21.522C13.466 21.2733 12.906 21.1502 12.394 21.1502C11.857 21.1502 11.281 21.2733 10.665 21.522C10.048 21.7718 9.55099 21.902 9.17098 21.9149C8.59305 21.9395 8.017 21.685 7.442 21.1502C7.07501 20.83 6.61598 20.2812 6.06607 19.5036C5.47607 18.6732 4.991 17.7104 4.61099 16.6126C4.20402 15.4269 4 14.2787 4 13.1672C4 11.8939 4.27507 10.7956 4.82603 9.87534C5.25904 9.13612 5.83509 8.553 6.55606 8.12493C7.27703 7.69686 8.05605 7.47871 8.89497 7.46476C9.35401 7.46476 9.95597 7.60678 10.704 7.88591C11.45 8.16598 11.9289 8.308 12.1389 8.308C12.2959 8.308 12.828 8.14193 13.73 7.81085C14.583 7.50381 15.3029 7.37668 15.8927 7.42676C17.4908 7.55577 18.6915 8.18591 19.49 9.32119C18.0607 10.1874 17.3537 11.4007 17.3677 12.9571C17.3806 14.1694 17.8203 15.1783 18.6845 15.9793C19.0761 16.3511 19.5134 16.6384 20 16.8425C19.8945 17.1486 19.7831 17.4418 19.6647 17.7233ZM15.9994 3.29661C15.9994 4.24683 15.6524 5.13404 14.9606 5.95524C14.1258 6.93148 13.116 7.4956 12.021 7.40659C12.007 7.29259 11.9989 7.17261 11.9989 7.04654C11.9989 6.13433 12.396 5.15809 13.101 4.35988C13.453 3.95573 13.9006 3.61968 14.4435 3.35162C14.9852 3.08755 15.4976 2.94151 15.9795 2.9165C15.9936 3.04353 15.9994 3.17057 15.9994 3.2966Z\",\n    fill: \"currentColor\"\n  }));\n};\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst GoogleIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12.454 10.1818V14.0545H17.9457C17.7046 15.3 16.9809 16.3546 15.8956 17.0636L19.2073 19.5818C21.1368 17.8364 22.25 15.2728 22.25 12.2273C22.25 11.5183 22.1851 10.8364 22.0645 10.1819L12.454 10.1818Z\",\n    fill: \"#4285F4\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M6.73532 13.9033L5.9884 14.4637L3.34454 16.4818C5.02359 19.7454 8.46493 22 12.4538 22C15.2089 22 17.5189 21.1091 19.2073 19.5818L15.8956 17.0636C14.9865 17.6636 13.8267 18.0273 12.4538 18.0273C9.80074 18.0273 7.5466 16.2728 6.73949 13.9091L6.73532 13.9033Z\",\n    fill: \"#34A853\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M3.34455 7.51818C2.64885 8.86358 2.25 10.3818 2.25 11.9999C2.25 13.6181 2.64884 15.1364 3.34454 16.4818C3.34454 16.4908 6.73982 13.8999 6.73982 13.8999C6.53574 13.2999 6.41511 12.6636 6.41511 11.9998C6.41511 11.3361 6.53574 10.6998 6.73982 10.0998L3.34455 7.51818Z\",\n    fill: \"#FBBC05\"\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M12.454 5.98181C13.9568 5.98181 15.2926 6.49089 16.3594 7.47272L19.2815 4.60912C17.5097 2.99097 15.2092 2 12.454 2C8.46514 2 5.0236 4.24544 3.34455 7.51818L6.73982 10.0998C7.54683 7.73613 9.80095 5.98181 12.454 5.98181Z\",\n    fill: \"#EA4335\"\n  }));\n};\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst VkIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 24,\n    height: 24,\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Rect, {\n    x: 2,\n    y: 2,\n    width: 20,\n    height: 20,\n    rx: 6,\n    fill: \"#0077FF\"\n  }), /*#__PURE__*/React.createElement(SVG.Text, {\n    x: 12,\n    y: 16,\n    textAnchor: \"middle\",\n    fontSize: 10,\n    fontWeight: 700,\n    fill: \"#FFFFFF\"\n  }, \"VK\"));\n};\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst REGISTER_IMAGE = '/api/component/assets/guest/box-with-gems.webp';\nfunction _empty() {}\nconst getLegalLinks = (localeValue, ipCountryValue) => {\n  const normalizedLocale = String(localeValue ?? '').toLowerCase();\n  const isRuLocale = normalizedLocale === 'ru' || normalizedLocale.startsWith('ru-');\n  const isRuGeo = String(ipCountryValue ?? '').toUpperCase() === 'RU';\n  const useRuDocs = isRuLocale || isRuGeo;\n  if (useRuDocs) {\n    return {\n      eula: 'https://www.modern-com.ru/eula.html',\n      privacy: 'https://www.modern-com.ru/privacy.html',\n      terms: 'https://www.modern-com.ru/terms.html'\n    };\n  }\n  return {\n    eula: 'https://welcome.camble.online/legal/docs/eula.html',\n    privacy: 'https://welcome.camble.online/legal/docs/privacy.html',\n    terms: 'https://welcome.camble.online/legal/docs/terms.html'\n  };\n};\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nreturn ({\n  loginSurface = 'restricted_action'\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const navigation = ReactNavigation.useNavigation();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const sheet = Sheet.useSheet();\n  const {\n    locale: currentLocale\n  } = Locale.useLocale();\n  const [loadingMethod, setLoadingMethod] = React.useState(null);\n  const country = State.state?.session?.value?.ip?.country;\n  const isRuWeb = country === 'RU' && ReactNative.Platform.OS === 'web';\n  const th = theme.theme;\n  const surfaceBackground = th.semantic?.surface?.regular?.pageBackground ?? '#FFFFFF';\n  const contentPrimary = th.semantic?.content?.regular?.primary ?? '#04060F';\n  const contentSecondary = Utils.withOpacity(contentPrimary, 0.6);\n  const buttonSecondaryBg = Utils.withOpacity(contentPrimary, 0.10);\n  const legalLinks = React.useMemo(() => getLegalLinks(currentLocale, country), [currentLocale, country]);\n  const wrap = _async(function (key, fn) {\n    if (loadingMethod) return;\n    setLoadingMethod(key);\n    console.log('[GuestRegisterSheet] login start', {\n      provider: key,\n      loginSurface\n    });\n    return _continueIgnored(_finallyRethrows(function () {\n      return _catch(function () {\n        return _call(fn, function (ok) {\n          console.log('[GuestRegisterSheet] login result', {\n            provider: key,\n            ok,\n            sessionUserId: State.state?.session?.value?.user?.id,\n            isGuest: State.api?.guest?.isGuestSession?.(State.state?.session?.value)\n          });\n          if (ok) {\n            console.log('[GuestRegisterSheet] close after login', {\n              provider: key\n            });\n            sheet.close();\n          } else {\n            console.warn('[GuestRegisterSheet] keep open: login not completed', {\n              provider: key,\n              ok\n            });\n          }\n        });\n      }, function (e) {\n        console.error('[GuestRegisterSheet] login error', key, e);\n      });\n    }, function (_wasThrown, _result) {\n      setLoadingMethod(null);\n      return _rethrow(_wasThrown, _result);\n    }));\n  });\n  const onEmail = React.useCallback(() => {\n    if (loadingMethod) return;\n    sheet.close();\n    navigation.dispatch(ReactNavigation.StackActions.push('LoginEmail', {\n      loginSurface\n    }));\n  }, [loadingMethod, sheet, navigation, loginSurface]);\n  const onApple = React.useCallback(() => wrap('apple', _async(function () {\n    const _State = State,\n      _loginApple = _State.loginApple;\n    return _await(State.api?.guest?.getGuestStarts?.(), function (_State$api$guest$getG) {\n      return _loginApple.call(_State, {\n        loginSurface,\n        analytics: {\n          ...Analytics.getGlobalParams(),\n          trial_calls: _State$api$guest$getG ?? 0\n        }\n      });\n    });\n  })), [loadingMethod, sheet, loginSurface]);\n  const onGoogle = React.useCallback(() => wrap('google', _async(function () {\n    const _State2 = State,\n      _loginGoogle = _State2.loginGoogle;\n    return _await(State.api?.guest?.getGuestStarts?.(), function (_State$api$guest$getG2) {\n      return _loginGoogle.call(_State2, {\n        loginSurface,\n        analytics: {\n          ...Analytics.getGlobalParams(),\n          trial_calls: _State$api$guest$getG2 ?? 0\n        }\n      });\n    });\n  })), [loadingMethod, sheet, loginSurface]);\n  const onVk = React.useCallback(() => wrap('vk', _async(function () {\n    const _State3 = State,\n      _loginVk = _State3.loginVk;\n    return _await(State.api?.guest?.getGuestStarts?.(), function (_State$api$guest$getG3) {\n      return _loginVk.call(_State3, {\n        loginSurface,\n        analytics: {\n          ...Analytics.getGlobalParams(),\n          trial_calls: _State$api$guest$getG3 ?? 0\n        }\n      });\n    });\n  })), [loadingMethod, sheet, loginSurface]);\n  const isDisabled = !!loadingMethod;\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      backgroundColor: surfaceBackground,\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      paddingHorizontal: 24,\n      paddingBottom: Math.max(24, safeArea?.bottom ?? 24)\n    },\n    header: {\n      width: '100%',\n      height: 56,\n      paddingTop: 12,\n      paddingBottom: 4,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end'\n    },\n    closeButton: {\n      width: 40,\n      height: 40,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    closeIcon: {\n      color: contentPrimary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '500'\n    },\n    content: {\n      width: '100%',\n      alignItems: 'center',\n      gap: 16\n    },\n    title: {\n      fontFamily: 'Inter',\n      fontWeight: '700',\n      fontSize: 22,\n      lineHeight: 28,\n      letterSpacing: -0.5,\n      color: contentPrimary,\n      textAlign: 'center'\n    },\n    subtitle: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 10,\n      lineHeight: 14,\n      color: contentSecondary,\n      textAlign: 'center'\n    },\n    imageWrap: {\n      width: '100%',\n      maxWidth: 360,\n      alignSelf: 'center',\n      position: 'relative'\n    },\n    image: {\n      width: '100%',\n      maxWidth: 360,\n      height: 200,\n      alignSelf: 'center'\n    },\n    buttons: {\n      width: '100%',\n      gap: 10,\n      paddingTop: 6\n    },\n    buttonBase: {\n      width: '100%',\n      height: 52,\n      borderRadius: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8\n    },\n    buttonPrimary: {\n      backgroundColor: contentPrimary\n    },\n    buttonSecondary: {\n      backgroundColor: buttonSecondaryBg\n    },\n    buttonTextPrimary: {\n      color: surfaceBackground,\n      fontSize: 15,\n      fontWeight: '600'\n    },\n    buttonTextSecondary: {\n      color: contentPrimary,\n      fontSize: 15,\n      fontWeight: '600'\n    },\n    footer: {\n      width: '100%',\n      alignItems: 'center',\n      paddingTop: 16\n    },\n    footerText: {\n      fontSize: 10,\n      lineHeight: 14,\n      fontWeight: '500',\n      textAlign: 'center',\n      color: contentSecondary\n    },\n    footerLink: {\n      textDecorationLine: 'underline',\n      color: contentPrimary\n    }\n  }), [safeArea, surfaceBackground, contentPrimary, contentSecondary, buttonSecondaryBg]);\n  const isRestrictedSurface = loginSurface === 'restricted_action';\n  const titleText = isRestrictedSurface ? t('guestRegisterTitle') : t('guestRegisterTitleSelf');\n  const subtitleText = t('guestRegisterSubtitle');\n  const freeGemsText = t('guestRegisterFreeGems', '25');\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.closeButton,\n    onPress: () => sheet.close()\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, titleText), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.imageWrap\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    showLoader: false,\n    source: State.getUrl(REGISTER_IMAGE),\n    style: styles.image,\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      bottom: '5%',\n      alignItems: 'center'\n    },\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      transform: [{\n        rotate: '-3deg'\n      }],\n      backgroundColor: '#FE375B',\n      borderRadius: 999,\n      paddingHorizontal: 16,\n      paddingVertical: 6,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    }\n  }, /*#__PURE__*/React.createElement(Assets.Diamond, {\n    size: 21,\n    style: {\n      color: '#FFFFFF'\n    }\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      color: '#FFFFFF',\n      fontSize: 18,\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      lineHeight: 26\n    },\n    numberOfLines: 1\n  }, freeGemsText)))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle\n  }, subtitleText)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttons\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    disabled: isDisabled,\n    onPress: onGoogle,\n    style: [styles.buttonBase, styles.buttonPrimary, isDisabled ? {\n      opacity: 0.6\n    } : null]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextPrimary\n  }, t('continueWithGmail')), /*#__PURE__*/React.createElement(GoogleIcon, null)), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    disabled: isDisabled,\n    onPress: onEmail,\n    style: [styles.buttonBase, styles.buttonSecondary, isDisabled ? {\n      opacity: 0.6\n    } : null]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t('continueWithEmail')), /*#__PURE__*/React.createElement(Assets.Email, {\n    style: {\n      color: contentPrimary\n    }\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    disabled: isDisabled,\n    onPress: onApple,\n    style: [styles.buttonBase, styles.buttonSecondary, isDisabled ? {\n      opacity: 0.6\n    } : null]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t('continueWithApple')), /*#__PURE__*/React.createElement(AppleIcon, {\n    style: {\n      color: contentPrimary\n    }\n  })), isRuWeb && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    disabled: isDisabled,\n    onPress: onVk,\n    style: [styles.buttonBase, styles.buttonSecondary, isDisabled ? {\n      opacity: 0.6\n    } : null]\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonTextSecondary\n  }, t('continueWithVk')), /*#__PURE__*/React.createElement(VkIcon, null))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.footer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.footerText\n  }, t('authLegal'), ' ', /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.footerLink,\n    onPress: () => Linking.openURL(State.getUrl(legalLinks.terms))\n  }, t('authToS')), ' ', t('authAnd'), ' ', /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.footerLink,\n    onPress: () => Linking.openURL(State.getUrl(legalLinks.eula))\n  }, t('autheula')), '.\\n', t('authLearnHowWeUse'), ' ', /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.footerLink,\n    onPress: () => Linking.openURL(State.getUrl(legalLinks.privacy))\n  }, t('authPrivacy')), '.')));\n};"},"VideoChatGuestBar":{"name":"VideoChatGuestBar","key":"a3235799f48c561f426f29254413ab91ea005d48231cb31a555c2cdb462213e7","code":"deps: WithAppear\n/* === Inlined module: guestIcons.jsx === */\n// Shared guest UI icons.\n// Block-body arrow form (the concise `=> (<SVG/>)` form breaks babel on this content).\n\nconst GuestAvatarIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 20,\n    height: 20,\n    viewBox: \"0 0 20 20\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M5.2002 10.4004C6.7465 10.4005 8 11.6539 8 13.2002C7.9999 14.7464 6.74644 15.9999 5.2002 16C3.65386 16 2.4005 14.7465 2.40039 13.2002C2.40039 11.6538 3.6538 10.4004 5.2002 10.4004ZM14 10.4004C15.5464 10.4004 16.7998 11.6538 16.7998 13.2002C16.7997 14.7465 15.5463 16 14 16C12.4537 16 11.2003 14.7465 11.2002 13.2002C11.2002 11.6538 12.4536 10.4004 14 10.4004ZM17.5996 7.40039C17.931 7.40039 18.2002 7.66863 18.2002 8C18.2002 8.33137 17.931 8.59961 17.5996 8.59961H1.59961C1.26842 8.5994 1 8.33124 1 8C1 7.66876 1.26842 7.4006 1.59961 7.40039H17.5996Z\",\n    fill: \"#04060F\",\n    fillOpacity: 0.5\n  }), /*#__PURE__*/React.createElement(SVG.Path, {\n    opacity: 0.5,\n    d: \"M8.25879 12.4004C9.10337 11.9781 10.0978 11.9781 10.9424 12.4004L11.2725 12.5654C11.2252 12.7693 11.2002 12.9819 11.2002 13.2002C11.2002 13.4479 11.2326 13.6882 11.293 13.917L10.4053 13.4736C9.89859 13.2203 9.3026 13.2204 8.7959 13.4736L7.90723 13.917C7.96767 13.6882 7.99998 13.448 8 13.2002C8 12.9819 7.97498 12.7693 7.92773 12.5654L8.25879 12.4004ZM10.8525 2.40039C12.6522 2.40039 13.5521 2.39996 14.2031 2.9082C14.8542 3.41651 15.0723 4.28999 15.5088 6.03613L15.8496 7.40039H3.34961L3.69141 6.03613C4.12794 4.28999 4.34604 3.41651 4.99707 2.9082C5.64808 2.40004 6.54798 2.40039 8.34766 2.40039H10.8525Z\",\n    fill: \"#04060F\",\n    fillOpacity: 0.5\n  }));\n};\nconst DoorIcon = ({\n  style\n}) => {\n  return /*#__PURE__*/React.createElement(SVG.Svg, {\n    width: 13,\n    height: 15,\n    viewBox: \"0 0 13 15\",\n    fill: \"none\",\n    style: style\n  }, /*#__PURE__*/React.createElement(SVG.Path, {\n    d: \"M8.49902 0C9.42767 0 10.1751 -0.000612849 10.7607 0.078125C11.3607 0.158799 11.8664 0.331293 12.2676 0.732422C12.6686 1.13359 12.8412 1.63945 12.9219 2.23926C13.0006 2.82481 12.999 3.5717 12.999 4.5V9.83301C12.999 10.7615 13.0006 11.5091 12.9219 12.0947C12.8412 12.6946 12.6687 13.2004 12.2676 13.6016C11.8663 14.0028 11.3607 14.1752 10.7607 14.2559C10.1751 14.3346 9.4277 14.333 8.49902 14.333H7.83301C6.90433 14.333 6.15698 14.3346 5.57129 14.2559C4.97159 14.1752 4.46656 14.0025 4.06543 13.6016C3.71559 13.2516 3.53812 12.8207 3.44531 12.3154C3.35523 11.8245 3.338 11.2236 3.33398 10.5029C3.33263 10.227 3.55509 10.0016 3.83105 10C4.10703 9.99847 4.33219 10.2212 4.33398 10.4971C4.33804 11.2256 4.35678 11.7427 4.42871 12.1348C4.49809 12.5125 4.61029 12.7313 4.77246 12.8936C4.95696 13.0781 5.21592 13.1989 5.70508 13.2646C6.20862 13.3323 6.87618 13.333 7.83301 13.333H8.49902C9.45568 13.333 10.1234 13.3323 10.627 13.2646C11.1161 13.1989 11.376 13.0781 11.5605 12.8936C11.7447 12.7091 11.865 12.4496 11.9307 11.9609C11.9983 11.4574 11.999 10.7896 11.999 9.83301V4.5C11.999 3.54323 11.9984 2.87558 11.9307 2.37207C11.8649 1.88333 11.7449 1.6239 11.5605 1.43945C11.376 1.25504 11.116 1.13411 10.627 1.06836C10.1234 1.00073 9.45562 1 8.49902 1H7.83301C6.87623 1 6.20861 1.00069 5.70508 1.06836C5.21612 1.1341 4.95695 1.25509 4.77246 1.43945C4.6102 1.60171 4.49813 1.82057 4.42871 2.19824C4.3567 2.59031 4.33805 3.10725 4.33398 3.83594C4.33245 4.11208 4.10719 4.33454 3.83105 4.33301C3.55499 4.33139 3.33245 4.10617 3.33398 3.83008C3.33801 3.10943 3.35515 2.50843 3.44531 2.01758C3.53815 1.51238 3.71555 1.0823 4.06543 0.732422C4.46657 0.331421 4.97153 0.15881 5.57129 0.078125C6.15697 -0.000612849 6.90436 0 7.83301 0H8.49902ZM6.8125 4.14648C7.00773 3.95161 7.32437 3.9515 7.51953 4.14648L10.1865 6.81348C10.3815 7.00864 10.3814 7.32527 10.1865 7.52051L7.51953 10.1865C7.32427 10.3818 7.00776 10.3818 6.8125 10.1865C6.61757 9.99123 6.61735 9.67464 6.8125 9.47949L8.62598 7.66699H0.5C0.223966 7.66699 0.000175525 7.44299 0 7.16699C0.000178874 6.891 0.223968 6.66699 0.5 6.66699H8.62598L6.8125 4.85352C6.61746 4.65829 6.61746 4.3417 6.8125 4.14648Z\",\n    fill: \"white\"\n  }));\n};\nreturn () => {\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const [isSearching] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const shouldShowPaywall = State.api?.call?.usePayWall?.() ?? false;\n  const isGuest = State.api?.guest?.useIsGuestSession?.();\n  const visible = !!isGuest && call == null && !isSearching && !shouldShowPaywall;\n  const th = theme.theme;\n  const contentPrimary = th.semantic?.content?.regular?.primary ?? '#04060F';\n  const fontFamily = th.typography?.family?.paragraph ?? 'Geologica';\n  const onVideoBg = '#FFFFFF';\n  const brandBg = '#FE375B';\n  const styles = {\n    layer: {\n      position: 'absolute',\n      top: Math.max(12, safeArea?.top ?? 12),\n      left: 12,\n      right: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between'\n    },\n    leftGroup: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    avatarWrap: {\n      width: 28,\n      height: 28,\n      borderRadius: 14,\n      backgroundColor: '#FFFFFF',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    guestLabel: {\n      color: contentPrimary,\n      fontFamily,\n      fontSize: 16,\n      fontWeight: '500',\n      fontStyle: 'normal',\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      opacity: 0.7\n    },\n    button: {\n      height: 36,\n      paddingHorizontal: 14,\n      borderRadius: 18,\n      backgroundColor: brandBg,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6\n    },\n    buttonText: {\n      color: '#FFFFFF',\n      fontFamily,\n      fontSize: 14,\n      fontStyle: 'normal',\n      fontWeight: '600',\n      lineHeight: 20,\n      letterSpacing: -0.14\n    }\n  };\n  const onOpenRegister = React.useCallback(() => State.api?.guest?.openRegisterSheet('videochat_button'), []);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: visible,\n    scale: 1,\n    duration: 250,\n    style: styles.layer,\n    pointerEvents: visible ? 'box-none' : 'none'\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.leftGroup\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatarWrap\n  }, /*#__PURE__*/React.createElement(GuestAvatarIcon, null)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.guestLabel,\n    numberOfLines: 1\n  }, t('guestBadge'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.button,\n    onPress: onOpenRegister\n  }, /*#__PURE__*/React.createElement(DoorIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText,\n    numberOfLines: 1\n  }, t('guestSignInCta'))));\n};"},"CallTopControls":{"name":"CallTopControls","key":"0ca369eed84ec1b8b2813f446a43e6073eaaa54f9f456a352a068e1d08862137","code":"deps: WithAppear\nreturn ({\n  visible,\n  activeCall,\n  onPress\n}) => {\n  const theme = Theme.useTheme();\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const shouldShowPaywall = State.api?.call?.usePayWall?.() ?? false;\n  const isVisible = !shouldShowPaywall && (visible ?? !!(activeCall ?? call));\n  const handleStop = React.useCallback(() => {\n    if (onPress) {\n      onPress();\n      return;\n    }\n    manifest().call.onStop();\n  }, [onPress]);\n  const styles = React.useMemo(() => ({\n    layer: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0\n    },\n    row: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingHorizontal: 12,\n      paddingTop: 12\n    },\n    controls: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      gap: 12\n    },\n    button: {\n      width: 56,\n      height: 56,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component.button.dangerous.bgDefault\n    },\n    icon: {\n      color: theme.theme.component.buttonVideochat.brand.contentDefault\n    },\n    watermark: {\n      width: 33,\n      height: 112,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    watermarkLogo: {\n      width: 112,\n      height: 33,\n      opacity: 0.4,\n      transform: [{\n        rotate: '-90deg'\n      }]\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.layer,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: isVisible,\n    scale: 1,\n    duration: 250,\n    style: styles.row,\n    pointerEvents: isVisible ? \"box-none\" : \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.controls,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.button,\n    onPress: handleStop\n  }, /*#__PURE__*/React.createElement(Assets.PhoneDown, {\n    size: 24,\n    style: styles.icon\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.watermark,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.watermarkLogo\n  }, /*#__PURE__*/React.createElement(Components.DSLogo, {\n    variant: \"full\",\n    colorScheme: \"white\",\n    width: 112,\n    height: 33\n  }))))));\n};"},"SearchCancelButton":{"name":"SearchCancelButton","key":"6cbf4fa8314cc2379632ec588f48c62d0520d7f1ee27ae4fd325c6890f73e2ba","code":"deps: WithAppear\nconst CloseIcon = React.memo(({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: \"24\",\n  height: \"24\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n  fill: \"currentColor\"\n})));\nreturn ({\n  onPress,\n  visible: visibleProp\n}) => {\n  const theme = Theme.useTheme();\n  const [isSearching] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const shouldShowPaywall = State.api?.call?.usePayWall?.() ?? false;\n  const visible = visibleProp ?? (isSearching && !call && !shouldShowPaywall);\n  const handleStop = React.useCallback(() => {\n    if (onPress) {\n      onPress();\n      return;\n    }\n    manifest().call.onStop();\n  }, [onPress]);\n  const stopTouchEnd = React.useCallback(event => {\n    event.preventDefault?.();\n    event.stopPropagation?.();\n  }, []);\n  const styles = React.useMemo(() => ({\n    layer: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0\n    },\n    row: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      paddingHorizontal: 12,\n      paddingTop: 12\n    },\n    button: {\n      width: 56,\n      height: 56,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.surface1, 0.1)\n    },\n    icon: {\n      color: theme.theme.component.buttonVideochat.brand.contentDefault\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(Components.VideoGridSafeArea, {\n    style: styles.layer,\n    pointerEvents: \"box-none\"\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: visible,\n    scale: 1,\n    duration: 250,\n    style: styles.row,\n    pointerEvents: visible ? \"box-none\" : \"none\"\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.button,\n    onTouchEnd: stopTouchEnd,\n    onPress: handleStop\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.icon\n  }))));\n};"},"GiftNotEnoughGemsSheet":{"name":"GiftNotEnoughGemsSheet","key":"fad35a6245df9ef42d784080b5005b050f5b1d56a59ae0ad5a374b0461bb3557","code":"const StoreBagIcon = ({\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M14.0206 4C16.402 4 17.5928 4.00003 18.4259 4.69141C19.2591 5.38288 19.4782 6.55365 19.9171 8.89453L20.6671 12.8945C21.2843 16.1861 21.5932 17.8319 20.6935 18.916C19.7938 19.9999 18.1194 20 14.7706 20H9.22963C5.88057 20 4.20552 20.0001 3.3058 18.916C2.40621 17.8319 2.71503 16.186 3.33217 12.8945L4.08217 8.89453C4.52105 6.55382 4.74036 5.3829 5.57338 4.69141C6.40655 3.99993 7.59795 4 9.97963 4H14.0206ZM15.0792 7.29297C14.6888 7.15507 14.2602 7.35953 14.1222 7.75C13.813 8.6249 12.9786 9.25 12.0001 9.25C11.0217 9.24994 10.1873 8.62487 9.87807 7.75C9.74001 7.35951 9.31155 7.15494 8.92104 7.29297C8.53052 7.43102 8.32597 7.85947 8.464 8.25C8.97846 9.70538 10.3663 10.7499 12.0001 10.75C13.634 10.75 15.0218 9.70538 15.5363 8.25C15.6743 7.85946 15.4698 7.431 15.0792 7.29297Z\",\n  fill: color\n}));\nreturn () => {\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const colors = theme.theme;\n  const surfaceColor = colors.semantic?.surface?.regular?.surface1 ?? '#FFFFFF';\n  const primaryColor = colors.semantic?.content?.regular?.primary ?? '#04060F';\n  const secondaryColor = colors.semantic?.content?.regular?.secondary ?? 'rgba(4,6,15,0.5)';\n  const brandColor = colors.component?.button?.brand?.bgDefault ?? '#FE375B';\n  const brandContentColor = colors.component?.button?.brand?.content ?? '#FFFFFF';\n  const ghostContentColor = colors.component?.button?.ghost?.content ?? primaryColor;\n  const headingFontFamily = colors.typography?.family?.heading ?? colors.font?.heading ?? 'Geologica';\n  const paragraphFontFamily = colors.typography?.family?.paragraph ?? colors.font?.paragraph ?? 'Inter';\n  const openStore = React.useCallback(() => {\n    sheet.close('store');\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"store\",\n      isModal: true,\n      purchaseSource: \"gifts\"\n    }), {\n      theme: Theme?.isDark?.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet]);\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      backgroundColor: surfaceColor,\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      overflow: 'hidden',\n      paddingBottom: Math.max(safeArea.bottom, 24)\n    },\n    header: {\n      height: 56,\n      paddingTop: 12,\n      paddingBottom: 4,\n      paddingHorizontal: 16,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end'\n    },\n    closeButton: {\n      width: 40,\n      height: 40,\n      borderRadius: 20,\n      alignItems: 'flex-end',\n      justifyContent: 'center'\n    },\n    closeIcon: {\n      color: primaryColor,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '500'\n    },\n    content: {\n      paddingHorizontal: 16,\n      paddingTop: 16,\n      paddingBottom: 16,\n      alignItems: 'center',\n      gap: 4,\n      width: '100%'\n    },\n    icon: {\n      width: 88,\n      height: 88,\n      marginBottom: 4\n    },\n    title: {\n      fontFamily: headingFontFamily,\n      fontWeight: '600',\n      fontSize: 20,\n      lineHeight: 28,\n      letterSpacing: -0.7,\n      color: primaryColor,\n      textAlign: 'center'\n    },\n    description: {\n      fontFamily: paragraphFontFamily,\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: secondaryColor,\n      textAlign: 'center'\n    },\n    actions: {\n      paddingHorizontal: 16,\n      paddingTop: 4,\n      gap: 8,\n      width: '100%'\n    },\n    brandButton: {\n      width: '100%',\n      height: 48,\n      borderRadius: 12,\n      backgroundColor: brandColor,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingHorizontal: 20,\n      paddingVertical: 12\n    },\n    brandButtonText: {\n      fontFamily: headingFontFamily,\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 20,\n      letterSpacing: -0.16,\n      color: brandContentColor,\n      textAlign: 'center'\n    },\n    ghostButton: {\n      width: '100%'\n    },\n    ghostText: {\n      fontFamily: headingFontFamily,\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 20,\n      letterSpacing: -0.16,\n      color: ghostContentColor,\n      textAlign: 'center'\n    }\n  }), [brandColor, brandContentColor, ghostContentColor, headingFontFamily, paragraphFontFamily, primaryColor, safeArea.bottom, secondaryColor, surfaceColor]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.closeButton,\n    onPress: () => sheet.close('closed')\n  }, /*#__PURE__*/React.createElement(Assets.Close, {\n    style: styles.closeIcon\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(Image, {\n    cachePolicy: \"memory\",\n    source: State.getUrl('/api/component/assets/store/diamond-big.webp'),\n    style: styles.icon,\n    contentFit: \"contain\"\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('giftNotEnoughGemsTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('giftNotEnoughGemsDescription'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.actions\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.brandButton,\n    onPress: openStore\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.brandButtonText,\n    numberOfLines: 1\n  }, t('giftNotEnoughGemsTopUpButton')), /*#__PURE__*/React.createElement(StoreBagIcon, {\n    color: brandContentColor\n  })), /*#__PURE__*/React.createElement(Components.DSButton, {\n    feedback: true,\n    type: \"ghost\",\n    size: \"L\",\n    style: styles.ghostButton,\n    onPress: () => sheet.close('back')\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.ghostText\n  }, t('giftNotEnoughGemsBackButton')))));\n};"},"ChatItem":{"name":"ChatItem","key":"e80bd2374b75c441dba1fc5681ad2aa91f161be6c0bbb775b79714a3f27963ea","code":"deps: Avatar, ChatListContextMenu, LongPressMenu\nconst Skeleton = Components.DSSkeleton ?? ReactNative.View;\n\n// Иконки для свайп-кнопок\nconst PinIcon = React.memo(({\n  size = 24,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10.0758 1.69509C10.9825 1.49548 11.827 2.34104 13.5153 4.03103L15.986 6.50466C17.6626 8.18287 18.5009 9.022 18.3053 9.92653C18.1095 10.8308 16.9995 11.2479 14.7799 12.0818L13.2438 12.659C12.6494 12.8823 12.3521 12.9945 12.1227 13.1931C12.0223 13.2801 11.9316 13.3781 11.8542 13.4861C11.6772 13.7327 11.5931 14.0394 11.4245 14.6521C11.041 16.0457 10.8496 16.743 10.3932 17.0037C10.2009 17.1134 9.98279 17.171 9.76138 17.1707C9.23585 17.1699 8.72492 16.6587 7.70377 15.6365L6.48209 14.4138L2.75162 18.1472C2.50341 18.3954 2.10138 18.3954 1.85318 18.1472C1.6049 17.8987 1.6049 17.4954 1.85318 17.2468L5.58267 13.5134L4.40396 12.3338C3.38915 11.318 2.88187 10.8094 2.87857 10.2869C2.87719 10.0611 2.93583 9.83894 3.04849 9.64333C3.30923 9.19078 4.00102 9.00031 5.38443 8.61892C5.99832 8.44968 6.30568 8.3649 6.5524 8.18728C6.66306 8.1076 6.76373 8.01472 6.8522 7.91091C7.04942 7.67949 7.15934 7.38032 7.37857 6.782L7.93521 5.26247C8.75758 3.01803 9.16889 1.89518 10.0758 1.69509Z\",\n  fill: color\n})));\n\n/** Иконка «открепить» (пин с перечёркиванием) */\nconst UnpinIcon = React.memo(({\n  size = 24,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M13.8904 16.9496C13.8366 17.1262 13.7785 17.3337 13.7097 17.5834C13.2498 19.2551 13.0191 20.0919 12.4715 20.4047C12.2409 20.5362 11.9791 20.6052 11.7137 20.6049C11.0832 20.6038 10.4698 19.9902 9.2449 18.7641L7.77908 17.2963L3.30252 21.7768C3.00484 22.0745 2.52232 22.0741 2.2244 21.7768C1.92648 21.4785 1.92652 20.9949 2.2244 20.6967L6.69998 16.2162L5.28494 14.8002C4.06779 13.5819 3.45925 12.9718 3.45486 12.3451C3.45315 12.0742 3.5238 11.8074 3.65897 11.5727C3.97186 11.0296 4.80175 10.8008 6.4617 10.3432C6.71327 10.2738 6.92094 10.2119 7.09842 10.1576L13.8904 16.9496ZM12.0906 2.03555C13.1788 1.7959 14.1932 2.80997 16.2195 4.83828L19.1844 7.80605C21.1953 9.819 22.2019 10.8264 21.9676 11.9115C21.7326 12.9966 20.4001 13.4979 17.7371 14.4984L16.1541 15.0922L19.531 18.4691C19.8238 18.7619 19.8235 19.2368 19.531 19.5297C19.2381 19.8226 18.7634 19.8226 18.4705 19.5297L4.47049 5.52969C4.1776 5.23679 4.1776 4.76203 4.47049 4.46914C4.76341 4.17663 5.23827 4.17637 5.53104 4.46914L8.94608 7.88418L9.52225 6.31582C10.509 3.6227 11.0025 2.27592 12.0906 2.03555Z\",\n  fill: color\n})));\n\n/** Иконка «заглушить» (динамик с перечёркиванием), fill */\nconst MuteIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M13.8135 1.64649C14.0088 1.45139 14.3253 1.45128 14.5205 1.64649C14.7156 1.84171 14.7156 2.1583 14.5205 2.35352L2.52051 14.3535C2.3253 14.5487 2.00875 14.5486 1.81348 14.3535C1.61821 14.1583 1.61821 13.8418 1.81348 13.6465L3.62793 11.832C3.0393 11.8257 2.59054 11.7907 2.18359 11.6025C1.72049 11.3883 1.27435 10.9687 1.03223 10.5195C0.770481 10.0337 0.73996 9.5251 0.696289 8.80274L0.69043 8.71582C0.675475 8.4704 0.666992 8.22765 0.666992 8C0.666993 7.77235 0.675474 7.52961 0.69043 7.28418L0.696289 7.19727C0.73996 6.47491 0.770481 5.96626 1.03223 5.48047C1.27435 5.03128 1.7205 4.61172 2.18359 4.39746C2.68459 4.16579 3.24849 4.16657 4.05957 4.167H4.16699C4.52436 4.16699 4.6463 4.16483 4.76074 4.14551C4.88333 4.12481 5.00345 4.08926 5.11719 4.03907C5.22328 3.9922 5.32592 3.92605 5.62402 3.7295L5.80176 3.61231C6.62229 3.07128 7.28088 2.63751 7.82324 2.37403C8.37393 2.10651 8.91647 1.95742 9.46191 2.14356C9.64296 2.20538 9.8171 2.29432 9.97363 2.4043C10.3999 2.70387 10.6032 3.16092 10.7178 3.68653C10.7762 3.95458 10.8161 4.2634 10.8467 4.61231L13.8135 1.64649ZM10.5 7.5C10.7761 7.5 11 7.72386 11 8C11 8.36794 10.9759 9.01661 10.9414 9.75977L10.9395 9.79883C10.8943 10.7719 10.8581 11.5531 10.752 12.1426C10.644 12.7422 10.4443 13.2649 9.97363 13.5957C9.8171 13.7057 9.64296 13.7946 9.46191 13.8564C8.96728 14.0252 8.47529 13.9181 7.98047 13.6992C7.49182 13.4831 6.91811 13.1208 6.22559 12.667C5.93944 12.4963 5.88594 12.1031 6.11621 11.8623L10.1152 7.68067L10.1631 7.63086C10.252 7.54981 10.3702 7.5 10.5 7.5ZM13.6768 4.21094C13.9284 4.09766 14.2244 4.20938 14.3379 4.46094C14.6492 5.15103 15 6.30639 15 8C15 9.46102 14.7389 10.5219 14.4668 11.2295C14.331 11.5827 14.1929 11.8465 14.085 12.0264C14.0312 12.1159 13.985 12.1847 13.9502 12.2334C13.9328 12.2578 13.9183 12.2776 13.9072 12.292L13.8877 12.3154L13.8857 12.3184L13.8848 12.3193C13.8844 12.3191 13.8735 12.3112 13.5 12L13.8838 12.3203C13.707 12.5322 13.3917 12.5605 13.1797 12.3838C12.9688 12.2078 12.9394 11.8946 13.1133 11.6826C13.1136 11.6822 13.1143 11.6808 13.1152 11.6797C13.1187 11.6751 13.1259 11.6662 13.1357 11.6523C13.1556 11.6246 13.1878 11.578 13.2275 11.5117C13.3071 11.3791 13.419 11.1669 13.5332 10.8701C13.761 10.2777 14 9.33873 14 8C14 6.44911 13.6792 5.43374 13.4258 4.87207C13.3125 4.62044 13.4252 4.32445 13.6768 4.21094ZM12.2764 6.17676C12.5466 6.12089 12.8111 6.2952 12.8672 6.56543C12.9406 6.91904 13 7.39285 13 8C13 8.74008 12.9116 9.28212 12.8174 9.64942C12.7704 9.83276 12.7218 9.97226 12.6826 10.0703C12.6631 10.1191 12.6464 10.1579 12.6328 10.1865C12.6261 10.2007 12.62 10.2124 12.6152 10.2217L12.6084 10.2344L12.6055 10.2393L12.6045 10.2412V10.2422C12.6045 10.2422 12.6034 10.2425 12.167 10L12.6035 10.2432C12.4693 10.4842 12.1651 10.5714 11.9238 10.4375C11.6845 10.3046 11.5974 10.004 11.7266 9.76367L11.7295 9.75684C11.7341 9.74724 11.7432 9.72734 11.7549 9.69825C11.7781 9.64004 11.8125 9.5415 11.8486 9.40039C11.9211 9.11766 12 8.65969 12 8C12 7.45829 11.9467 7.05271 11.8877 6.76856C11.8316 6.49818 12.006 6.23289 12.2764 6.17676Z\",\n  fill: color\n})));\nconst TrashIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M15.876 8.31643C17.4086 8.31643 18.1751 8.31591 18.6289 8.81545C19.0827 9.3151 19.0321 10.1037 18.9316 11.6807L18.665 15.8692C18.48 18.7751 18.3879 20.2284 17.4834 21.1143C16.5788 22.0002 15.187 22 12.4043 22H11.5957C8.81299 22 7.42124 22.0002 6.5166 21.1143C5.61213 20.2284 5.52003 18.7751 5.33496 15.8692L5.06836 11.6807C4.96793 10.1037 4.91727 9.3151 5.37109 8.81545C5.82493 8.31591 6.59138 8.31643 8.12402 8.31643H15.876ZM9.42578 11.4815C9.01363 11.5248 8.7127 11.9119 8.75391 12.3457L9.25391 17.6094C9.29534 18.0429 9.66236 18.3586 10.0742 18.3154C10.4863 18.2721 10.7871 17.8859 10.7461 17.4522L10.2461 12.1885C10.2048 11.7549 9.83771 11.4383 9.42578 11.4815ZM14.5742 11.4815C14.1623 11.4383 13.7952 11.7549 13.7539 12.1885L13.2539 17.4522C13.2129 17.8859 13.5137 18.2721 13.9258 18.3154C14.3376 18.3586 14.7047 18.0429 14.7461 17.6094L15.2461 12.3457C15.2873 11.9119 14.9864 11.5248 14.5742 11.4815ZM13.7393 2.00002C13.9618 1.99986 14.1558 1.99998 14.3389 2.03322C15.0621 2.16462 15.688 2.67738 16.0264 3.41603C16.112 3.60305 16.1729 3.8126 16.2432 4.05275L16.3584 4.44435C16.3778 4.5105 16.383 4.52913 16.3877 4.54396C16.5678 5.11018 17.1279 5.49355 17.6572 5.50881H20.2285C20.6545 5.50881 20.9999 5.90142 21 6.38576C21 6.87022 20.6546 7.26369 20.2285 7.26369H3.77148C3.34544 7.26369 3 6.87022 3 6.38576C3.00012 5.90142 3.34551 5.50881 3.77148 5.50881H6.43555C6.9649 5.49355 7.43218 5.11018 7.6123 4.54396C7.61702 4.52913 7.6222 4.51054 7.6416 4.44435L7.75684 4.05275C7.82709 3.8126 7.88799 3.60305 7.97363 3.41603C8.31193 2.6774 8.93793 2.16467 9.66113 2.03322C9.84415 1.99999 10.0383 1.99986 10.2607 2.00002H13.7393Z\",\n  fill: color\n})));\nconst CrownIcon = React.memo(({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n})));\nfunction normalizeTimestamp(value) {\n  if (value == null || value === '') return value;\n  if (typeof value !== 'string') return value;\n  const s = String(value).trim();\n  if (!s) return s;\n  const hasNoTz = !/Z|[+-]\\d{2}:?\\d{2}$/.test(s);\n\n  // Бэкенд часто отдает \"YYYY-MM-DD HH:mm:ss\" (или ISO без TZ).\n  // Парсим вручную как локальное время, чтобы избежать скачка из-за принудительного UTC.\n  if (hasNoTz) {\n    const match = s.match(/^(\\d{4})-(\\d{2})-(\\d{2})[T\\s](\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.\\d+)?$/);\n    if (match) {\n      const [, y, mo, d, h, mi, sec] = match;\n      return new Date(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(sec ?? '0'));\n    }\n  }\n  return s;\n}\nconst getDeviceTimeOptions = () => {\n  const options = {\n    hour: 'numeric',\n    minute: '2-digit'\n  };\n  try {\n    const calendars = ExpoLocalization?.getCalendars?.();\n    const calendar = Array.isArray(calendars) ? calendars[0] : null;\n    const uses24hourClock = calendar?.uses24hourClock ?? calendar?.uses24HourClock;\n    if (typeof uses24hourClock === 'boolean') {\n      options.hour12 = !uses24hourClock;\n    }\n  } catch (_) {}\n  return options;\n};\nconst formatTime = (locale, timestamp) => {\n  if (!timestamp) return '';\n  const iso = normalizeTimestamp(timestamp);\n  const date = new Date(iso);\n  if (Number.isNaN(date.getTime())) return '';\n  const now = new Date();\n  const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n  const messageDayStart = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n  const diffDays = Math.floor((todayStart.getTime() - messageDayStart.getTime()) / (1000 * 60 * 60 * 24));\n  if (diffDays <= 0) {\n    return date.toLocaleTimeString(locale, getDeviceTimeOptions());\n  }\n  if (diffDays < 7) {\n    return date.toLocaleDateString(locale, {\n      weekday: 'short'\n    });\n  }\n  return date.toLocaleDateString(locale, {\n    month: 'short',\n    day: 'numeric'\n  });\n};\nreturn ({\n  chat,\n  isSelected = false,\n  isSplitHighlighted = false,\n  onPress,\n  onPin,\n  onMute,\n  onDelete,\n  onProfile,\n  onReport\n}) => {\n  const theme = Theme.useTheme();\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const t = Locale.useTranslation();\n  const swipeableRef = React.useRef(null);\n  const userId = chat?.userId ?? null;\n  const userRaw = State.api?.users?.useUser?.(userId);\n  const user = State.api?.users?.sanitizeMeta?.(userRaw) ?? userRaw;\n  const [isOnline] = State.api?.online?.useOnline?.(userId) ?? [];\n  const pinned = State.api?.chat?.useChatPinned?.(chat?.id);\n  const unreadCount = State.api?.unread?.useCounter?.(chat?.id);\n  const styles = React.useMemo(() => ({\n    // Основной контейнер тайла\n    container: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      height: 68,\n      backgroundColor: isSplitHighlighted ? theme.theme.semantic.surface.regular.surface1 : theme.theme.semantic.surface.regular.pageBackground\n    },\n    containerSelected: {\n      backgroundColor: theme.theme.semantic.surface.brand.surface2,\n      borderRadius: 12\n    },\n    rowInnerWrap: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    // Аватар с онлайн индикатором\n    avatarContainer: {\n      position: 'relative',\n      width: 52,\n      height: 52\n    },\n    onlineIndicatorContainer: {\n      position: 'absolute',\n      width: 20,\n      height: 20,\n      right: 0,\n      bottom: 0,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    onlineIndicator: {\n      width: 12,\n      height: 12,\n      backgroundColor: '#24BC75',\n      borderRadius: 999,\n      borderWidth: 2,\n      borderColor: theme.theme.semantic?.stroke?.regular?.stroke1 || '#E5E8EC'\n    },\n    // Контент справа от аватара (бордер только снизу, под именем/текстом/датой, не под аватаркой)\n    contentContainer: {\n      flex: 1,\n      marginLeft: 10,\n      height: 68,\n      justifyContent: 'center',\n      borderBottomWidth: 1,\n      borderBottomColor: theme.theme.semantic.stroke?.regular?.stroke2 || '#04060F'\n    },\n    // Верхняя строка (имя + время)\n    topRow: {\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    nameContainer: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 6,\n      flex: 1,\n      minWidth: 0\n    },\n    name: {\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography?.family?.heading || 'Geologica'\n    },\n    pro: {\n      width: 16,\n      height: 16,\n      borderRadius: 16,\n      backgroundColor: theme.theme.component.button.brand.bgDefault,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    timeContainer: {\n      flexDirection: 'row',\n      justifyContent: 'flex-end',\n      alignItems: 'center',\n      gap: 4,\n      marginLeft: 8,\n      flexShrink: 0,\n      minWidth: 56\n    },\n    pinnedIcon: {\n      width: 16,\n      height: 16\n    },\n    time: {\n      minWidth: 40,\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.primary, 0.3),\n      fontFamily: theme.theme.typography?.family?.paragraph || 'Inter',\n      textAlign: 'right'\n    },\n    // Нижняя строка (сообщение + счётчик)\n    bottomRow: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'flex-start'\n    },\n    message: {\n      flex: 1,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.primary, 0.5),\n      fontFamily: theme.theme.typography?.family?.paragraph || 'Inter'\n    },\n    counter: {\n      minWidth: 18,\n      height: 18,\n      borderRadius: 99,\n      backgroundColor: '#FE375B',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 4,\n      marginLeft: 4\n    },\n    counterText: {\n      fontSize: 10,\n      lineHeight: 18,\n      fontWeight: '600',\n      letterSpacing: -0.5,\n      textAlign: 'center',\n      color: '#FFFFFF',\n      fontFamily: theme.theme.typography?.family?.heading || 'Geologica'\n    },\n    // Свайп-кнопки\n    swipeActions: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      height: 68\n    },\n    swipeButton: {\n      width: 92,\n      height: 68,\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      gap: 4\n    },\n    pinButton: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface3\n    },\n    muteButton: {\n      backgroundColor: theme.theme.semantic.surface.information.surface4\n    },\n    deleteButton: {\n      backgroundColor: theme.theme.semantic.surface.dangerous.surface4\n    },\n    swipeButtonText: {\n      fontSize: 12,\n      lineHeight: 18,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography?.family?.paragraph || 'Inter'\n    },\n    swipeButtonTextDark: {\n      color: theme.theme.semantic.content.regular.primary\n    },\n    swipeButtonTextLight: {\n      color: '#FFFFFF'\n    }\n  }), [isSplitHighlighted, theme]);\n  const closeSwipeable = React.useCallback(() => {\n    swipeableRef.current?.close();\n  }, []);\n  const handlePin = React.useCallback(() => {\n    closeSwipeable();\n    onPin?.(chat, user);\n  }, [chat, user, onPin, closeSwipeable]);\n  const handleMute = React.useCallback(() => {\n    closeSwipeable();\n    onMute?.(chat, user);\n  }, [chat, user, onMute, closeSwipeable]);\n  const handleDelete = React.useCallback(() => {\n    closeSwipeable();\n    onDelete?.(chat, user);\n  }, [chat, user, onDelete, closeSwipeable]);\n  const handlePress = React.useCallback(() => {\n    onPress?.(chat, user);\n  }, [chat, user, onPress]);\n\n  // Рендер свайп-кнопок справа\n  const renderRightActions = React.useCallback(() => {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.swipeActions\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      style: [styles.swipeButton, styles.pinButton],\n      onPress: handlePin\n    }, pinned ? /*#__PURE__*/React.createElement(UnpinIcon, {\n      size: 24,\n      color: theme.theme.semantic.content.regular.primary\n    }) : /*#__PURE__*/React.createElement(PinIcon, {\n      size: 24,\n      color: theme.theme.semantic.content.regular.primary\n    }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.swipeButtonText, styles.swipeButtonTextDark]\n    }, pinned ? t('chatActionUnpin') : t('chatActionPin'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      style: [styles.swipeButton, styles.deleteButton],\n      onPress: handleDelete\n    }, /*#__PURE__*/React.createElement(TrashIcon, {\n      size: 24,\n      color: \"#FFFFFF\"\n    }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: [styles.swipeButtonText, styles.swipeButtonTextLight]\n    }, t('chatActionDelete'))));\n  }, [styles, handlePin, handleMute, handleDelete, t]);\n  const photo = user?.photos?.[0] ?? chat?.photo;\n  return /*#__PURE__*/React.createElement(GestureHandler.Swipeable, {\n    ref: swipeableRef,\n    renderRightActions: renderRightActions,\n    rightThreshold: 40,\n    overshootRight: false\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"LongPressMenu\",\n    menu: \"ChatListContextMenu\",\n    menuProps: {\n      chat,\n      user,\n      onPin,\n      onMute,\n      onProfile,\n      onReport,\n      onDelete\n    },\n    onPress: handlePress,\n    pressableStyle: [styles.container, isSelected && styles.containerSelected]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowInnerWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\",\n    style: styles.avatarContainer\n  }, !user && userId != null ? /*#__PURE__*/React.createElement(Skeleton, {\n    height: 52,\n    width: 52,\n    borderRadius: 52\n  }) : /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    photo: photo\n  }), isOnline && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.onlineIndicatorContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.onlineIndicator\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameContainer\n  }, !user && userId != null && !chat.title ? /*#__PURE__*/React.createElement(Skeleton, {\n    height: 20,\n    width: 96,\n    borderRadius: 4\n  }) : /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.name,\n    numberOfLines: 1\n  }, user?.user?.username || chat.title || t('profilePlaceholderUser') || 'User'), user?.subscription?.hasSubscription && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: theme.theme.semantic.content.inversion.static.stPrimary\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.timeContainer\n  }, pinned && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pinnedIcon\n  }, /*#__PURE__*/React.createElement(PinIcon, {\n    size: 16,\n    color: Utils.withOpacity(theme.theme.semantic.content.regular.primary, 0.3)\n  })), chat.isMuted && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pinnedIcon\n  }, /*#__PURE__*/React.createElement(MuteIcon, {\n    size: 16,\n    color: Utils.withOpacity(theme.theme.semantic.content.regular.primary, 0.3)\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.time,\n    numberOfLines: 1\n  }, formatTime(locale, chat.lastMessageTime)))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.message,\n    numberOfLines: 1\n  }, chat.lastMessageText || ''), unreadCount > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.counter\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.counterText\n  }, unreadCount > 99 ? '99+' : unreadCount)))))));\n};"},"ChatBubble":{"name":"ChatBubble","key":"3a979ef854d56b21d1bb251353b57a574b09b5c6eda8d3ec9e44b7737290587e","code":"deps: PhotoViewer\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nconst getCachedWebVideoUrl = _async(function (url) {\n  if (!shouldUseWebVideoCache(url) || typeof fetch !== 'function' || !globalThis.URL?.createObjectURL) {\n    return url;\n  }\n  const existingObjectUrl = webVideoObjectUrls.get(url);\n  if (existingObjectUrl) return existingObjectUrl;\n  const existingPromise = webVideoCachePromises.get(url);\n  if (existingPromise) return existingPromise;\n  const promise = _async(function () {\n    return _catch(function () {\n      const _globalThis$caches$op = globalThis.caches?.open;\n      return _await(_globalThis$caches$op ? globalThis.caches.open(WEB_VIDEO_CACHE_NAME) : null, function (cache) {\n        return _await(cache ? cache.match(url) : null, function (response) {\n          let _exit = false;\n          return _invoke(function () {\n            if (!response) {\n              return _await(fetch(url, {\n                cache: 'force-cache'\n              }), function (_fetch) {\n                response = _fetch;\n                if (!response?.ok) {\n                  _exit = true;\n                  return url;\n                }\n                return _continueIgnored(_catch(function () {\n                  return _awaitIgnored(cache?.put(url, response.clone()));\n                }, _empty));\n              });\n            }\n          }, function (_result2) {\n            return _exit ? _result2 : _await(response.blob(), function (blob) {\n              return blob?.size ? rememberWebVideoObjectUrl(url, globalThis.URL.createObjectURL(blob)) : url;\n            });\n          });\n        }, !cache);\n      }, !_globalThis$caches$op);\n    }, function (error) {\n      console.error('Chat video cache failed:', error);\n      return url;\n    });\n  })();\n  webVideoCachePromises.set(url, promise);\n  return _finallyRethrows(function () {\n    return _await(promise);\n  }, function (_wasThrown, _result) {\n    webVideoCachePromises.delete(url);\n    return _rethrow(_wasThrown, _result);\n  });\n});\nfunction _rethrow(thrown, value) {\n  if (thrown) throw value;\n  return value;\n}\nconst Img = Components.DSImage ?? Image;\n\n// Иконка галочки (доставлено)\n\nfunction _finallyRethrows(body, finalizer) {\n  try {\n    var result = body();\n  } catch (e) {\n    return finalizer(true, e);\n  }\n  if (result && result.then) {\n    return result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n  }\n  return finalizer(false, result);\n}\nconst CheckIcon = React.memo(({\n  size = 12,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 12 12\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M2 6L5 9L10 3\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n})));\n\n// Двойная галочка (прочитано), цвет semantic/content/accent/content-2\n\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nconst ReadCheckIcon = React.memo(({\n  size = 16,\n  color = '#085D9E'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M12.9717 4.69728C13.1621 4.49741 13.4788 4.48944 13.6787 4.6797C13.8784 4.87011 13.8865 5.18685 13.6963 5.38673L7.98147 11.3867C7.88055 11.4927 7.73792 11.549 7.59182 11.541C7.44581 11.5329 7.31038 11.461 7.22171 11.3447L6.93655 10.9697C6.76927 10.7501 6.81162 10.4368 7.03128 10.2695C7.21993 10.126 7.47733 10.1372 7.65237 10.2822L12.9717 4.69728ZM9.62405 4.67091C9.80564 4.46332 10.1212 4.44178 10.3291 4.62306C10.5371 4.80465 10.5585 5.12109 10.377 5.32911L5.1387 11.3291C5.04386 11.4376 4.90681 11.4999 4.76272 11.5C4.61846 11.5 4.48071 11.4377 4.38577 11.3291L2.29007 8.92872C2.1088 8.7208 2.13026 8.40521 2.33792 8.22365C2.54592 8.04209 2.86237 8.06355 3.04397 8.2715L4.76174 10.2393L9.62405 4.67091Z\",\n  fill: color\n})));\n\n// Иконка ошибки отправки (Danger circle) 24x24\n\nfunction _empty() {}\nconst NotSentIcon = React.memo(({\n  size = 24,\n  color = '#E83B3B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M12 1.25C17.9371 1.25 22.75 6.06294 22.75 12C22.75 17.9371 17.9371 22.75 12 22.75C6.06294 22.75 1.25 17.9371 1.25 12C1.25 6.06294 6.06294 1.25 12 1.25ZM12 2.75C6.89137 2.75 2.75 6.89137 2.75 12C2.75 17.1086 6.89137 21.25 12 21.25C17.1086 21.25 21.25 17.1086 21.25 12C21.25 6.89137 17.1086 2.75 12 2.75ZM12 15C12.5523 15 13 15.4477 13 16C13 16.5523 12.5523 17 12 17C11.4477 17 11 16.5523 11 16C11 15.4477 11.4477 15 12 15ZM12 6.25C12.4142 6.25 12.75 6.58579 12.75 7V13C12.75 13.4142 12.4142 13.75 12 13.75C11.5858 13.75 11.25 13.4142 11.25 13V7C11.25 6.58579 11.5858 6.25 12 6.25Z\",\n  fill: color\n})));\n\n// Иконка воспроизведения для видео\n\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nconst PlayIcon = React.memo(({\n  size = 48,\n  color = 'rgba(255,255,255,0.9)'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8 5v14l11-7L8 5z\",\n  fill: color\n})));\n\n// Форматирование времени в локальном часовом поясе устройства (не GMT)\n\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nconst getDeviceTimeOptions = () => {\n  const options = {\n    hour: 'numeric',\n    minute: '2-digit'\n  };\n  try {\n    const calendars = ExpoLocalization?.getCalendars?.();\n    const calendar = Array.isArray(calendars) ? calendars[0] : null;\n    const uses24hourClock = calendar?.uses24hourClock ?? calendar?.uses24HourClock;\n    if (typeof uses24hourClock === 'boolean') {\n      options.hour12 = !uses24hourClock;\n    }\n  } catch (_) {}\n  return options;\n};\nfunction _continueIgnored(value) {\n  if (value && value.then) {\n    return value.then(_empty);\n  }\n}\nconst formatTime = (locale, timestamp) => {\n  const date = new Date(timestamp);\n  if (Number.isNaN(date.getTime())) return '';\n  return date.toLocaleTimeString(locale, getDeviceTimeOptions());\n};\nfunction _invoke(body, then) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(then);\n  }\n  return then(result);\n}\nconst formatUploadSize = bytes => {\n  const value = Number(bytes);\n  if (!Number.isFinite(value) || value < 0) return null;\n  if (value >= 1024 * 1024) {\n    const mb = value / (1024 * 1024);\n    const rounded = mb >= 10 ? Math.round(mb) : Math.round(mb * 10) / 10;\n    return `${rounded % 1 === 0 ? Math.round(rounded) : rounded}Mb`;\n  }\n  return `${value === 0 ? 0 : Math.max(1, Math.round(value / 1024))}kb`;\n};\nconst formatUploadProgressLabel = uploadProgress => {\n  if (!uploadProgress || uploadProgress.isDone || uploadProgress.failed) return null;\n  const loaded = formatUploadSize(uploadProgress.loaded);\n  const total = formatUploadSize(uploadProgress.total);\n  if (loaded && total) return `${loaded} / ${total}`;\n  if (loaded) return loaded;\n  const progress = Number(uploadProgress.progress);\n  if (Number.isFinite(progress)) {\n    return `${Math.max(0, Math.min(100, Math.round(progress)))}%`;\n  }\n  return null;\n};\nconst Skeleton = Components.DSSkeleton ?? ReactNative.View;\nconst MEDIA_WIDTH = 350;\nconst GIFT_CARD_WIDTH = 148;\nconst IMAGE_RETRY_DELAYS_MS = [400, 1200, 2500, 5000];\nconst formatWithSpaces = number => String(number ?? 0).replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\nconst MainCurrencyIcon = ({\n  size = 16,\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"currentColor\"\n}));\nconst GiftBubblePattern = React.memo(({\n  style,\n  colors\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 150,\n  height: 125,\n  viewBox: \"0 0 148 126\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.G, {\n  fill: \"url(#giftBubblePatternGradient)\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M18.996 87.2192L16.1087 88.8862C15.5346 89.2176 14.8521 89.3073 14.2118 89.1357C13.5715 88.964 13.0251 88.5452 12.6937 87.9711L11.0272 85.0846C10.9167 84.8934 10.8871 84.6659 10.9442 84.4526C11.0014 84.2391 11.1415 84.0568 11.3329 83.9463L15.663 81.4463L18.996 87.2192Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M21.436 78.1132C21.6274 78.0027 21.8554 77.9725 22.0689 78.0297C22.2822 78.087 22.4643 78.2264 22.5747 78.4177L24.2412 81.3041C24.5727 81.8782 24.6622 82.5608 24.4907 83.2011C24.3192 83.8414 23.9002 84.3876 23.3262 84.7192L20.4389 86.3862L17.1059 80.6132L21.436 78.1132Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M14.632 70.4945C15.0581 70.2484 15.5394 70.1138 16.0314 70.1038C16.5234 70.0938 17.0105 70.2085 17.4462 70.4371C17.8818 70.6657 18.2528 71.0012 18.5241 71.4115C18.7953 71.8219 18.958 72.2942 18.9977 72.7845L19.2412 72.6439C19.6239 72.4231 20.0786 72.3636 20.5053 72.4779C20.9323 72.5923 21.2965 72.8717 21.5175 73.2545L21.9341 73.9759C22.1551 74.3587 22.2149 74.8139 22.1005 75.2409C21.9861 75.6676 21.7073 76.0316 21.3247 76.2526L16.2724 79.1696L14.1889 75.5609L12.7461 76.3939L14.8295 80.0026L9.77717 82.9196C9.39449 83.1404 8.93987 83.1999 8.51308 83.0856C8.08611 82.9712 7.72187 82.6917 7.50086 82.3089L7.08436 81.5875C6.86334 81.2047 6.80346 80.7496 6.91786 80.3226C7.03231 79.8959 7.31113 79.5318 7.69367 79.3109L7.93724 79.1702C7.58167 78.9244 7.28464 78.6028 7.06867 78.2283C6.26354 76.8335 6.74182 75.0502 8.12417 74.2518C9.37817 73.4989 10.9696 73.6592 12.5085 74.543L12.7082 74.6623C12.6562 72.8505 13.2582 71.3475 14.482 70.5823L14.632 70.4945ZM8.96986 75.6873C8.68281 75.853 8.47342 76.1262 8.38758 76.4463C8.3018 76.7665 8.34669 77.1078 8.51233 77.3948C8.67806 77.6819 8.95123 77.8913 9.27137 77.9771C9.5916 78.0629 9.93276 78.0181 10.2199 77.8524L12.4881 76.5428C11.1597 75.4769 9.82318 75.1754 8.96986 75.6873ZM15.4524 71.9446C14.5928 72.422 14.1884 73.7295 14.4468 75.4119L16.7151 74.1024C17.0012 73.935 17.2092 73.6608 17.2932 73.3401C17.3771 73.0194 17.3306 72.6784 17.1632 72.3923C16.9959 72.1062 16.7216 71.8982 16.401 71.8142C16.0802 71.7302 15.7385 71.7772 15.4524 71.9446Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M15.5504 79.5859L14.8295 80.0026L14.4125 79.281L15.1339 78.8645L15.5504 79.5859Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M16.2724 79.1696L15.5504 79.5859L15.1339 78.8645L15.8556 78.4478L16.2724 79.1696Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M16.9938 78.7525L16.2724 79.1696L15.8556 78.4478L16.5773 78.0311L16.9938 78.7525Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M77.2775 22.0625L73.9562 21.7719C73.2958 21.7141 72.6853 21.3961 72.2591 20.8882C71.8331 20.3804 71.6258 19.7239 71.6836 19.0636L71.974 15.7432C71.9933 15.5232 72.0995 15.3199 72.2686 15.1779C72.4379 15.0358 72.6573 14.9668 72.8775 14.9861L77.8584 15.4219L77.2775 22.0625Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M84.4991 16.0028C84.7192 16.0221 84.9233 16.1282 85.0654 16.2975C85.2073 16.4667 85.2765 16.6854 85.2573 16.9054L84.9668 20.2257C84.909 20.8861 84.5908 21.4965 84.0831 21.9227C83.5753 22.3488 82.9188 22.556 82.2584 22.4983L78.9371 22.2077L79.5181 15.5671L84.4991 16.0028Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M83.2956 5.85935C83.7858 5.90214 84.2572 6.06796 84.6659 6.34195C85.0747 6.61596 85.4079 6.9893 85.6337 7.42652C85.8594 7.86361 85.9709 8.35122 85.9578 8.84297C85.9445 9.33464 85.8069 9.81488 85.5582 10.2392L85.8384 10.2637C86.2784 10.3023 86.685 10.5145 86.9691 10.8528C87.2532 11.1914 87.3913 11.6293 87.3527 12.0696L87.2801 12.8994C87.2416 13.3398 87.0296 13.747 86.691 14.0311C86.3525 14.3151 85.9153 14.4533 85.4752 14.4149L79.6634 13.9064L80.0266 9.75528L78.3669 9.61008L78.0037 13.7612L72.1919 13.2527C71.7518 13.2142 71.3453 13.0021 71.0612 12.6637C70.7771 12.3251 70.639 11.8872 70.6775 11.4469L70.7501 10.6171C70.7887 10.1767 71.0007 9.76952 71.3393 9.48539C71.6778 9.20152 72.115 9.0632 72.5551 9.10161L72.8353 9.12613C72.685 8.72084 72.6262 8.28697 72.6641 7.85637C72.8046 6.25197 74.2192 5.06554 75.8095 5.20441C77.2686 5.30696 78.4803 6.351 79.2339 7.95768L79.3291 8.1699C80.3257 6.656 81.6809 5.77009 83.1223 5.84517L83.2956 5.85935ZM75.6789 6.86536C75.3487 6.83647 75.0205 6.94014 74.7665 7.15315C74.5127 7.36619 74.3537 7.67151 74.3247 8.00166C74.2958 8.33185 74.3995 8.66006 74.6125 8.914C74.8256 9.16796 75.1307 9.32695 75.461 9.35585L78.0702 9.58412C77.5934 7.949 76.6715 6.93548 75.6789 6.86536ZM83.1358 7.51775C82.1578 7.41578 81.0766 8.25484 80.3233 9.78124L82.9325 10.0095C83.2629 10.0365 83.5905 9.93123 83.8433 9.71669C84.0959 9.50216 84.2534 9.19617 84.2804 8.86581C84.3074 8.53545 84.2021 8.20771 83.9876 7.95499C83.7731 7.70223 83.4662 7.54477 83.1358 7.51775Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M78.8333 13.8333L78.0037 13.7612L78.076 12.9309L78.9059 13.0035L78.8333 13.8333Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M79.6634 13.9064L78.8333 13.8333L78.9059 13.0035L79.736 13.0761L79.6634 13.9064Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M80.4936 13.9786L79.6634 13.9064L79.736 13.0761L80.5662 13.1488L80.4936 13.9786Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M128.624 102.384L125.404 101.521C124.764 101.35 124.218 100.931 123.886 100.356C123.555 99.7823 123.465 99.0999 123.636 98.4596L124.499 95.2401C124.556 95.0268 124.696 94.845 124.887 94.7345C125.078 94.624 125.307 94.5941 125.52 94.6514L130.35 95.9454L128.624 102.384Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M136.788 97.6707C137.002 97.7279 137.185 97.8678 137.295 98.0592C137.405 98.2505 137.436 98.4779 137.378 98.6912L136.516 101.911C136.344 102.551 135.925 103.097 135.351 103.428C134.777 103.76 134.094 103.85 133.454 103.678L130.234 102.816L131.959 96.3766L136.788 97.6707Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M137.365 87.4724C137.84 87.5996 138.275 87.8448 138.63 88.1856C138.985 88.5264 139.249 88.9519 139.395 89.4217C139.541 89.8914 139.567 90.3909 139.468 90.8729C139.37 91.3548 139.151 91.8039 138.832 92.1786L139.104 92.2514C139.531 92.3658 139.894 92.6453 140.115 93.0279C140.336 93.4107 140.396 93.8658 140.282 94.2928L140.066 95.0974C139.952 95.5244 139.672 95.8886 139.289 96.1096C138.907 96.3304 138.452 96.3907 138.026 96.2764L132.39 94.7665L133.469 90.7414L131.86 90.3103L130.781 94.3353L125.146 92.8253C124.719 92.7109 124.356 92.4314 124.135 92.0489C123.914 91.666 123.854 91.2109 123.968 90.7839L124.184 89.9793C124.298 89.5523 124.578 89.1881 124.96 88.9671C125.343 88.7464 125.798 88.6861 126.224 88.8003L126.496 88.8731C126.418 88.4479 126.436 88.0104 126.548 87.5929C126.965 86.0373 128.564 85.1145 130.106 85.5274C131.525 85.8818 132.537 87.1204 133 88.8335L133.057 89.059C134.302 87.7412 135.79 87.1041 137.197 87.4283L137.365 87.4724ZM129.689 87.1405C129.369 87.0547 129.028 87.0998 128.741 87.2655C128.454 87.4312 128.244 87.7042 128.158 88.0243C128.072 88.3445 128.117 88.6857 128.283 88.9728C128.449 89.2599 128.722 89.4695 129.042 89.5553L131.572 90.2332C131.386 88.5401 130.654 87.3819 129.689 87.1405ZM136.919 89.0778C135.974 88.8076 134.763 89.4461 133.757 90.8185L136.286 91.4964C136.607 91.5804 136.948 91.5336 137.234 91.3662C137.52 91.1988 137.729 90.9248 137.813 90.6042C137.896 90.2835 137.85 89.9425 137.682 89.6563C137.515 89.3702 137.24 89.1618 136.919 89.0778Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M131.585 94.5503L130.781 94.3353L130.996 93.5301L131.801 93.7457L131.585 94.5503Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M132.39 94.7665L131.585 94.5503L131.801 93.7457L132.606 93.9614L132.39 94.7665Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M133.195 94.9817L132.39 94.7665L132.606 93.9614L133.411 94.1771L133.195 94.9817Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M26 28.0002H25.5V27.5002H26V28.0002Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M26.5 28.0002H26V27.5002H26.5V28.0002Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M27 28.0002H26.5V27.5002H27V28.0002Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M25.5633 23.2558C25.7529 22.9093 26.2504 22.9095 26.4402 23.2558L27.3992 25.0087C27.7662 25.6797 28.3182 26.2315 28.9891 26.5986L30.742 27.5576C31.0884 27.7473 31.0884 28.2448 30.742 28.4345L28.9891 29.3935C28.3182 29.7606 27.7662 30.3124 27.3992 30.9833L26.4402 32.7363C26.2504 33.0826 25.7529 33.0828 25.5633 32.7363L24.6053 30.9833C24.2382 30.3122 23.6856 29.7606 23.0145 29.3935L21.2625 28.4345C20.916 28.2448 20.916 27.7473 21.2625 27.5576L23.0145 26.5986C23.6856 26.2315 24.2382 25.6799 24.6053 25.0087L25.5633 23.2558Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M27.9997 115H27.6667V114.667H27.9997V115Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M28.333 115H27.9997V114.667H28.333V115Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M28.6664 115H28.333V114.667H28.6664V115Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M27.7094 111.837C27.8359 111.607 28.1669 111.607 28.2934 111.837L28.9331 113.006C29.1777 113.453 29.5455 113.821 29.9926 114.066L31.1616 114.706C31.3923 114.832 31.3925 115.164 31.1616 115.291L29.9926 115.929C29.5455 116.174 29.1777 116.542 28.9331 116.989L28.2934 118.158C28.1669 118.389 27.8359 118.389 27.7094 118.158L27.0698 116.989C26.8251 116.542 26.4574 116.174 26.0102 115.929L24.8413 115.291C24.6105 115.164 24.6108 114.832 24.8413 114.706L26.0102 114.066C26.4574 113.821 26.8251 113.454 27.0698 113.006L27.7094 111.837Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M107 122H106.667V121.667H107V122Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M107.333 122H107V121.667H107.333V122Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M107.666 122H107.333V121.667H107.666V122Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M106.709 118.837C106.836 118.607 107.167 118.607 107.293 118.837L107.933 120.006C108.178 120.453 108.546 120.821 108.993 121.066L110.162 121.706C110.392 121.832 110.393 122.164 110.162 122.291L108.993 122.929C108.546 123.174 108.178 123.542 107.933 123.989L107.293 125.158C107.167 125.389 106.836 125.389 106.709 125.158L106.07 123.989C105.825 123.542 105.457 123.174 105.01 122.929L103.841 122.291C103.611 122.164 103.611 121.832 103.841 121.706L105.01 121.066C105.457 120.821 105.825 120.454 106.07 120.006L106.709 118.837Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M123 52.0002H122.5V51.5002H123V52.0002Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M123.5 52.0002H123V51.5002H123.5V52.0002Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M124 52.0002H123.5V51.5002H124V52.0002Z\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M122.563 47.2558C122.753 46.9093 123.25 46.9095 123.44 47.2558L124.399 49.0087C124.766 49.6797 125.318 50.2315 125.989 50.5986L127.742 51.5576C128.088 51.7473 128.088 52.2448 127.742 52.4345L125.989 53.3935C125.318 53.7606 124.766 54.3124 124.399 54.9833L123.44 56.7363C123.25 57.0826 122.753 57.0828 122.563 56.7363L121.605 54.9833C121.238 54.3122 120.686 53.7606 120.014 53.3935L118.263 52.4345C117.916 52.2448 117.916 51.7473 118.263 51.5576L120.014 50.5986C120.686 50.2315 121.238 49.6799 121.605 49.0087L122.563 47.2558Z\"\n})), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.LinearGradient, {\n  id: \"giftBubblePatternGradient\",\n  x1: \"73.5079\",\n  y1: \"-116.5\",\n  x2: \"73.5079\",\n  y2: \"132\",\n  gradientUnits: \"userSpaceOnUse\"\n}, /*#__PURE__*/React.createElement(SVG.Stop, {\n  stopColor: colors[0]\n}), /*#__PURE__*/React.createElement(SVG.Stop, {\n  offset: \"1\",\n  stopColor: colors[1]\n})))));\nconst resolveGiftImageUrl = url => {\n  if (!url) return null;\n  if (/^https?:\\/\\//i.test(url)) return url;\n  return State.getUrl(url);\n};\nconst absoluteFill = {\n  position: 'absolute',\n  top: 0,\n  left: 0,\n  right: 0,\n  bottom: 0,\n  width: '100%',\n  height: '100%'\n};\nconst absoluteFillCentered = {\n  ...absoluteFill,\n  alignItems: 'center',\n  justifyContent: 'center',\n  backgroundColor: 'transparent'\n};\nconst isHlsVideoUrl = url => /\\.m3u8(?:$|[?#])/i.test(url ?? '');\nconst isRemoteVideoUrl = url => /^https?:\\/\\//i.test(url ?? '');\nconst shouldUseVideoCache = url => {\n  if (ReactNative.Platform.OS === 'web' || !url) return false;\n  if (!isRemoteVideoUrl(url)) return false;\n  return !isHlsVideoUrl(url);\n};\nconst shouldUseWebVideoCache = url => {\n  if (ReactNative.Platform.OS !== 'web' || !url) return false;\n  if (!isRemoteVideoUrl(url)) return false;\n  return !isHlsVideoUrl(url);\n};\nconst WEB_VIDEO_CACHE_NAME = 'camee-chat-videos-v1';\nconst MAX_WEB_VIDEO_OBJECT_URLS = 40;\nconst CHAT_VIDEO_BACKGROUND = '#0B0D12';\nconst webVideoObjectUrls = new Map();\nconst webVideoCachePromises = new Map();\nfunction rememberWebVideoObjectUrl(url, objectUrl) {\n  const oldObjectUrl = webVideoObjectUrls.get(url);\n  if (oldObjectUrl) {\n    globalThis.URL?.revokeObjectURL?.(objectUrl);\n    return oldObjectUrl;\n  }\n  webVideoObjectUrls.set(url, objectUrl);\n  while (webVideoObjectUrls.size > MAX_WEB_VIDEO_OBJECT_URLS) {\n    const oldestUrl = webVideoObjectUrls.keys().next().value;\n    const oldestObjectUrl = webVideoObjectUrls.get(oldestUrl);\n    webVideoObjectUrls.delete(oldestUrl);\n    globalThis.URL?.revokeObjectURL?.(oldestObjectUrl);\n  }\n  return objectUrl;\n}\nfunction useCachedWebVideoUrl(url) {\n  const [cachedUrl, setCachedUrl] = React.useState(() => {\n    if (!shouldUseWebVideoCache(url)) return url;\n    return webVideoObjectUrls.get(url) ?? null;\n  });\n  React.useEffect(() => {\n    let isMounted = true;\n    if (!shouldUseWebVideoCache(url)) {\n      setCachedUrl(url);\n      return () => {\n        isMounted = false;\n      };\n    }\n    const existingObjectUrl = webVideoObjectUrls.get(url);\n    if (existingObjectUrl) {\n      setCachedUrl(existingObjectUrl);\n      return () => {\n        isMounted = false;\n      };\n    }\n    setCachedUrl(null);\n    getCachedWebVideoUrl(url).then(nextUrl => {\n      if (isMounted) {\n        setCachedUrl(nextUrl || url);\n      }\n    });\n    return () => {\n      isMounted = false;\n    };\n  }, [url]);\n  return cachedUrl;\n}\nconst Video = Components.DSVideo ?? React.Fragment;\nconst ChatVideoAttachment = React.memo(({\n  video,\n  url,\n  hasText,\n  isVisible,\n  isLast\n}) => {\n  const containerStyle = React.useMemo(() => ({\n    width: MEDIA_WIDTH,\n    maxWidth: '100%',\n    maxHeight: 600,\n    aspectRatio: 16 / 9,\n    borderRadius: hasText && isLast ? 0 : 16,\n    overflow: 'hidden',\n    backgroundColor: CHAT_VIDEO_BACKGROUND\n  }), [hasText, isLast]);\n  const videoStyle = React.useMemo(() => ({\n    width: '100%',\n    height: '100%',\n    backgroundColor: CHAT_VIDEO_BACKGROUND\n  }), []);\n  const shouldDeferVideoLoad = ReactNative.Platform.OS !== 'web';\n  const cachedWebUrl = useCachedWebVideoUrl(shouldDeferVideoLoad ? null : url);\n  const sourceUrl = shouldDeferVideoLoad ? url : cachedWebUrl ?? (shouldUseWebVideoCache(url) ? null : url);\n  const source = React.useMemo(() => sourceUrl ? {\n    uri: sourceUrl,\n    ...(shouldUseVideoCache(url) ? {\n      useCaching: true\n    } : {})\n  } : null, [sourceUrl, url]);\n  const preview = React.useMemo(() => {\n    const previewUrl = video?.previewUrl || video?.posterUrl;\n    return previewUrl ? {\n      uri: previewUrl\n    } : null;\n  }, [video?.posterUrl, video?.previewUrl]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: containerStyle\n  }, /*#__PURE__*/React.createElement(Video, {\n    source: source,\n    deferPlayerLoad: shouldDeferVideoLoad,\n    preview: preview,\n    style: videoStyle,\n    previewBackgroundColor: CHAT_VIDEO_BACKGROUND\n  }));\n});\nconst getAttachmentBorderRadius = (index, total, hasText, isOwner) => {\n  const R = 16;\n  const isFirst = index === 0;\n  const isLast = index === total - 1;\n  const isTopRow = total <= 2 ? true : index < 2;\n  const isBottomRow = total <= 2 ? true : index >= total - 2;\n  const topLeft = isFirst && isTopRow ? R : 0;\n  const topRight = isLast && isTopRow ? R : 0;\n  const bottomLeft = hasText ? 0 : isFirst && isBottomRow ? isOwner ? R : 0 : 0;\n  const bottomRight = hasText ? 0 : isLast && isBottomRow ? isOwner ? 0 : R : 0;\n  return {\n    borderTopLeftRadius: topLeft,\n    borderTopRightRadius: topRight,\n    borderBottomLeftRadius: bottomLeft,\n    borderBottomRightRadius: bottomRight,\n    overflow: 'hidden'\n  };\n};\nconst GridBlock = ({\n  children,\n  style,\n  height = 300,\n  cols = 2\n}) => {\n  const items = React.Children.toArray(children).filter(Boolean);\n  const count = items.length;\n  if (count === 0) return null;\n  const rows = Math.ceil(count / cols);\n  const itemHeight = height / rows;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [style, {\n      height,\n      flexDirection: 'row',\n      flexWrap: 'wrap'\n    }]\n  }, items.map((child, index) => {\n    const isLast = index === count - 1;\n    const isOddLast = isLast && count % 2 !== 0;\n    const width = isOddLast ? '100%' : `${100 / cols}%`;\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: index,\n      style: {\n        width,\n        height: itemHeight\n      }\n    }, child);\n  }));\n};\nconst ImageBlock = React.memo(({\n  imageAttachments,\n  videoAttachments,\n  hasText,\n  isOwner,\n  isVisible\n}) => {\n  const openImageViewer = React.useCallback(index => {\n    if (!imageAttachments.length) return;\n    const images = imageAttachments.map(img => ({\n      source: img.url,\n      cachePolicy: 'memory-disk'\n    }));\n    Modals.pushModal(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"PhotoViewer\",\n      images: images,\n      index: Math.max(0, Math.min(index, images.length - 1))\n    }));\n  }, [imageAttachments]);\n  const count = imageAttachments.length;\n  const autoRetryDelays = !isOwner ? IMAGE_RETRY_DELAYS_MS : undefined;\n  if (count === 0) return null;\n  if (count === 1) {\n    const img = imageAttachments[0];\n    const aspectRatio = img.width && img.height ? img.width / img.height : 1;\n    const radiusStyle = getAttachmentBorderRadius(0, 1, hasText && videoAttachments.length === 0, isOwner);\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: radiusStyle\n    }, /*#__PURE__*/React.createElement(Img, {\n      source: isVisible ? img?.url : null,\n      placeholder: img?.hash ? {\n        thumbhash: img.hash\n      } : undefined,\n      autoRetryDelays: autoRetryDelays,\n      onPress: () => openImageViewer(0),\n      feedback: true,\n      cachePolicy: \"memory-disk\",\n      style: {\n        width: MEDIA_WIDTH,\n        maxWidth: '100%',\n        maxHeight: 600,\n        aspectRatio\n      },\n      contentFit: \"cover\"\n    }));\n  }\n  const cols = 2;\n  const rows = Math.ceil(count / 2);\n  return /*#__PURE__*/React.createElement(GridBlock, {\n    cols: cols,\n    style: {\n      width: MEDIA_WIDTH,\n      borderRadius: 16,\n      maxWidth: '100%',\n      overflow: 'hidden'\n    }\n  }, imageAttachments.map((img, index) => {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: 'img-' + (img?.id ?? img?.url ?? index),\n      style: {\n        width: '100%',\n        height: '100%'\n      }\n    }, /*#__PURE__*/React.createElement(Img, {\n      source: isVisible ? img?.url : null,\n      placeholder: img?.hash ? {\n        thumbhash: img.hash\n      } : undefined,\n      autoRetryDelays: autoRetryDelays,\n      onPress: () => openImageViewer(index),\n      feedback: true,\n      cachePolicy: \"memory-disk\",\n      style: {\n        width: '100%',\n        height: '100%',\n        maxWidth: '100%',\n        maxHeight: '100%'\n      },\n      contentFit: \"cover\"\n    }));\n  }));\n});\nconst Attachments = React.memo(({\n  attachments,\n  hasText,\n  isOwner,\n  isVisible\n}) => {\n  if (!attachments?.length) return null;\n  const imageAttachments = React.useMemo(() => attachments?.filter(a => a.type === 'image'), [attachments]);\n  const videoAttachments = React.useMemo(() => attachments?.filter(a => a.type === 'video'), [attachments]);\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ImageBlock, {\n    imageAttachments: imageAttachments,\n    videoAttachments: videoAttachments,\n    hasText: hasText,\n    isOwner: isOwner,\n    isVisible: isVisible\n  }), videoAttachments.length > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      marginTop: !!imageAttachments?.length ? 4 : 0\n    }\n  }, videoAttachments.map((vid, index) => /*#__PURE__*/React.createElement(ChatVideoAttachment, {\n    key: 'vid-' + index,\n    video: vid,\n    url: vid.url,\n    hasText: hasText,\n    isOwner: isOwner,\n    isLast: index === videoAttachments.length - 1,\n    isVisible: isVisible\n  }))));\n});\nconst GiftCard = React.memo(({\n  gift,\n  styles,\n  gradientColors,\n  patternColors\n}) => {\n  if (!gift) return null;\n  const imageUrl = resolveGiftImageUrl(gift.giftImageUrl);\n  return /*#__PURE__*/React.createElement(LinearGradient, {\n    colors: gradientColors,\n    locations: [0, 1],\n    start: {\n      x: 0.5,\n      y: 0\n    },\n    end: {\n      x: 0.5,\n      y: 1\n    },\n    style: styles.giftCard\n  }, /*#__PURE__*/React.createElement(GiftBubblePattern, {\n    style: styles.giftPattern,\n    colors: patternColors\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftContent\n  }, !!imageUrl && /*#__PURE__*/React.createElement(Image, {\n    source: {\n      uri: imageUrl\n    },\n    style: styles.giftImage,\n    contentFit: \"contain\",\n    cachePolicy: \"memory-disk\"\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftMeta\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.giftPriceRow\n  }, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n    size: 16,\n    style: styles.giftPriceIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftPrice,\n    numberOfLines: 1\n  }, formatWithSpaces(gift.giftPriceGems))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.giftTitle,\n    numberOfLines: 1\n  }, gift.giftTitle || gift.giftCode || ''))));\n});\nreturn ({\n  messageId,\n  text,\n  timestamp,\n  isOwner,\n  isRead = false,\n  isVisible,\n  sendStatus,\n  attachments,\n  gift,\n  replyTo,\n  onReplyTilePress,\n  onRetry\n}) => {\n  const theme = Theme.useTheme();\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const t = Locale.useTranslation();\n  const uploadProgressId = messageId != null ? String(messageId) : null;\n  const uploadProgress = Hooks.useBehaviorSubjectMap(State.progressUploads, React.useCallback(uploads => uploadProgressId ? uploads?.get?.(uploadProgressId) ?? null : null, [uploadProgressId]));\n  const uploadProgressLabel = formatUploadProgressLabel(uploadProgress);\n  const hasText = text && text.trim().length > 0;\n  const hasGift = !!gift;\n  const hasReplyTo = replyTo && (replyTo.messageId || replyTo.text || replyTo.authorName);\n\n  // Цвета по макету: собеседник — surface-1 regular, свои — surface-2 accent\n  const bubbleBg = isOwner ? theme.theme.semantic?.surface?.accent?.surface2 : theme.theme.semantic?.surface?.regular?.surface1;\n  const bubbleBgFallback = isOwner ? '#131721' : '#131721';\n  const textColor = theme.theme.semantic?.content?.regular?.primary || '#FAFBFB';\n  const tertiaryColor = theme.theme.semantic?.content?.regular?.tertiary || 'rgba(255, 255, 255, 0.3)';\n  const timeColor = isOwner ? Utils.withOpacity(theme.theme.semantic?.content?.regular?.tertiary, 0.3) || 'rgba(255, 255, 255, 0.3)' : tertiaryColor;\n  const readCheckColor = theme.theme.semantic?.content?.accent?.content2 || '#085D9E';\n  const dangerColor = theme.theme.semantic?.content?.dangerous?.content1 || '#E83B3B';\n  const giftSurfaceBrand = theme.theme.semantic?.surface?.brand?.surface2 || '#FFD7DE';\n  const giftPatternBrand = theme.theme.semantic?.surface?.brand?.surface3 || '#FFAFBD';\n  const giftSurfaceRegular = theme.theme.semantic?.surface?.regular?.surface1 || '#FFFFFF';\n  const giftStrokeBrand = theme.theme.semantic?.stroke?.brand?.stroke1 || '#FFD7DE';\n  const giftContentPrimary = theme.theme.semantic?.content?.regular?.primary || '#04060F';\n  const giftContentSecondary = theme.theme.semantic?.content?.regular?.secondary || 'rgba(4, 6, 15, 0.5)';\n  const giftContentBrand = theme.theme.semantic?.content?.brand?.content1 || '#FE375B';\n  const bodyLarge = theme.theme.typography?.fonts?.body?.l ?? {};\n  const bodyExtraSmall = theme.theme.typography?.fonts?.body?.xs ?? {};\n  const paragraphFontFamily = theme.theme.typography?.family?.paragraph || 'Inter';\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'column',\n      alignItems: isOwner ? 'flex-end' : 'flex-start',\n      paddingHorizontal: 12,\n      paddingVertical: 2,\n      gap: 6\n    },\n    bubbleRow: {\n      flexDirection: 'row',\n      alignItems: 'flex-end',\n      justifyContent: isOwner ? 'flex-end' : 'flex-start',\n      gap: 6,\n      alignSelf: 'stretch'\n    },\n    notSentIconWrap: {\n      marginBottom: 2\n    },\n    bubble: {\n      maxWidth: '78%',\n      backgroundColor: hasGift ? 'transparent' : bubbleBg || bubbleBgFallback,\n      borderTopLeftRadius: hasGift ? 0 : 16,\n      borderTopRightRadius: hasGift ? 0 : 16,\n      borderBottomLeftRadius: hasGift ? 0 : isOwner ? 16 : 0,\n      borderBottomRightRadius: hasGift ? 0 : isOwner ? 0 : 16,\n      flexDirection: 'column',\n      justifyContent: 'flex-end',\n      alignItems: 'flex-end',\n      overflow: hasGift ? 'visible' : 'hidden',\n      paddingHorizontal: 0,\n      gap: hasGift ? 4 : !!attachments?.length ? 0 : 4\n    },\n    contentWrapper: {\n      alignSelf: 'stretch',\n      flexDirection: 'column',\n      gap: 4,\n      paddingVertical: hasGift ? 0 : 4,\n      paddingHorizontal: 10\n    },\n    giftCard: {\n      width: GIFT_CARD_WIDTH,\n      height: 180,\n      borderRadius: 24,\n      borderWidth: 2,\n      borderColor: giftStrokeBrand,\n      overflow: 'hidden',\n      paddingHorizontal: 24,\n      paddingVertical: 20,\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      gap: 4,\n      backgroundColor: giftSurfaceBrand\n    },\n    giftPattern: {\n      position: 'absolute',\n      top: -2,\n      left: -1,\n      width: 150,\n      height: 125\n    },\n    giftContent: {\n      width: 100,\n      alignItems: 'center',\n      justifyContent: 'flex-start',\n      gap: 4,\n      zIndex: 1\n    },\n    giftImage: {\n      width: 100,\n      height: 100\n    },\n    giftMeta: {\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'flex-end'\n    },\n    giftPriceRow: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 2\n    },\n    giftPriceIcon: {\n      color: giftContentBrand\n    },\n    giftPrice: {\n      fontFamily: paragraphFontFamily,\n      fontWeight: bodyLarge.fontWeight ?? '500',\n      fontSize: bodyLarge.fontSize ?? 16,\n      lineHeight: bodyLarge.lineHeight ?? 22,\n      letterSpacing: bodyLarge.letterSpacing ?? -0.3,\n      color: giftContentPrimary,\n      textAlign: 'center'\n    },\n    giftTitle: {\n      fontFamily: paragraphFontFamily,\n      fontWeight: bodyExtraSmall.fontWeight ?? '500',\n      fontSize: bodyExtraSmall.fontSize ?? 10,\n      lineHeight: bodyExtraSmall.lineHeight ?? 14,\n      letterSpacing: bodyExtraSmall.letterSpacing ?? -0.2,\n      color: giftContentSecondary,\n      textAlign: 'center',\n      alignSelf: 'stretch'\n    },\n    /** Тайл «ответ на сообщение» внутри баббла (как в доке) */\n    replyTile: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingVertical: 8,\n      paddingHorizontal: 12,\n      gap: 8,\n      alignSelf: 'stretch',\n      borderLeftWidth: 4,\n      borderLeftColor: '#FE375B',\n      marginBottom: 4\n    },\n    replyTileContent: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      minWidth: 0\n    },\n    replyTileName: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      color: textColor\n    },\n    replyTileText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: tertiaryColor\n    },\n    text: {\n      fontFamily: 'Inter',\n      fontWeight: '400',\n      fontSize: 16,\n      lineHeight: 22,\n      letterSpacing: -0.3,\n      color: textColor,\n      alignSelf: 'stretch'\n    },\n    footer: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      gap: 4,\n      height: 16,\n      alignSelf: 'stretch'\n    },\n    time: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 10,\n      lineHeight: 14,\n      letterSpacing: -0.2,\n      color: timeColor\n    },\n    uploadProgress: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 10,\n      lineHeight: 14,\n      letterSpacing: -0.2,\n      color: timeColor\n    },\n    notSentRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'flex-end',\n      gap: 8,\n      width: '100%'\n    },\n    notSentText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: dangerColor,\n      textAlign: 'right',\n      flex: 1\n    },\n    attachmentsContainer: {\n      gap: 0,\n      alignSelf: 'stretch'\n    }\n  }), [theme, isOwner, bubbleBg, bubbleBgFallback, textColor, timeColor, dangerColor, attachments, hasText, hasGift, giftStrokeBrand, giftSurfaceBrand, giftContentBrand, giftContentPrimary, giftContentSecondary, bodyLarge, bodyExtraSmall, paragraphFontFamily]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bubbleRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bubble\n  }, hasGift && /*#__PURE__*/React.createElement(GiftCard, {\n    gift: gift,\n    styles: styles,\n    gradientColors: [giftSurfaceBrand, giftSurfaceRegular],\n    patternColors: [giftPatternBrand, giftSurfaceBrand]\n  }), !hasGift && !!attachments?.length && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.attachmentsContainer\n  }, /*#__PURE__*/React.createElement(Attachments, {\n    attachments: attachments,\n    hasText: hasText,\n    isOwner: isOwner,\n    isVisible: isVisible\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.contentWrapper\n  }, hasReplyTo && replyTo && /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.replyTile,\n    onPress: () => replyTo.messageId && onReplyTilePress?.(replyTo.messageId)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.replyTileContent\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.replyTileName,\n    numberOfLines: 1\n  }, replyTo.authorName || ''), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.replyTileText,\n    numberOfLines: 1\n  }, replyTo.text || ''))), !hasGift && hasText && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.text\n  }, text), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.footer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.time\n  }, formatTime(locale, timestamp)), !!uploadProgressLabel && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.uploadProgress,\n    numberOfLines: 1\n  }, uploadProgressLabel), isOwner && (sendStatus === 'sending' ? /*#__PURE__*/React.createElement(Skeleton, {\n    height: 10,\n    width: 10,\n    borderRadius: 4\n  }) : isRead ? /*#__PURE__*/React.createElement(ReadCheckIcon, {\n    size: 16,\n    color: readCheckColor\n  }) : /*#__PURE__*/React.createElement(CheckIcon, {\n    size: 10,\n    color: timeColor\n  }))))), isOwner && sendStatus === 'failed' && /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.notSentIconWrap,\n    onPress: () => onRetry?.()\n  }, /*#__PURE__*/React.createElement(NotSentIcon, {\n    size: 24,\n    color: dangerColor\n  }))), isOwner && sendStatus === 'failed' && /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    onPress: () => onRetry?.()\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.notSentRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.notSentText\n  }, t('chatNotSentTapToRetry')))));\n};"},"ChatEmoji":{"name":"ChatEmoji","key":"abfaf56d2181d64a3f302fc067ff1a4a237120a4c4cf7b2556f5a82dda21f2c4","code":"deps:\n/**\n * ChatEmoji - увеличенный одиночный эмодзи без баббла\n * Отображается когда сообщение содержит только один эмодзи\n * \n * @param {Object} props\n * @param {string} props.emoji - Эмодзи символ\n * @param {string} props.timestamp - ISO дата\n * @param {boolean} props.isOwner - Сообщение владельца (справа) или собеседника (слева)\n */\n\n// Форматирование времени в локальном часовом поясе устройства\nconst formatTime = timestamp => {\n  const date = new Date(timestamp);\n  if (Number.isNaN(date.getTime())) return '';\n  const hours = date.getHours().toString().padStart(2, '0');\n  const minutes = date.getMinutes().toString().padStart(2, '0');\n  return `${hours}:${minutes}`;\n};\nreturn ({\n  emoji,\n  timestamp,\n  isOwner\n}) => {\n  const theme = Theme.useTheme();\n  const timeColor = theme.theme.semantic.content.regular.tertiary;\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'row',\n      justifyContent: isOwner ? 'flex-end' : 'flex-start',\n      alignItems: 'flex-end',\n      paddingHorizontal: 12,\n      paddingVertical: 2,\n      gap: 6\n    },\n    emoji: {\n      fontSize: 48,\n      lineHeight: 56\n    },\n    time: {\n      fontFamily: 'Inter',\n      fontWeight: '400',\n      fontSize: 11,\n      lineHeight: 14,\n      color: timeColor,\n      marginBottom: 4\n    }\n  }), [theme, isOwner, timeColor]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, isOwner && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.time\n  }, formatTime(timestamp)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emoji\n  }, emoji), !isOwner && /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.time\n  }, formatTime(timestamp)));\n};"},"ChatCallEvent":{"name":"ChatCallEvent","key":"297ae62fc931254ab2f8e887fce46b38f22708a74c1e393fa75f47557bbd0f34","code":"deps:\n/**\n * ChatCallEvent - событие звонка в чате\n * Совершённый: слева/справа по isOwner, \"Outgoing call\" / \"Incoming call\"\n * Пропущенный: слева/справа по isOwner, везде \"Missed call\"\n * Фон тайла всегда semantic/surface/regular/surface-1\n */\n\n// Стрелка исходящего (completed — зелёная, missed — красная)\nconst OutgoingArrowIcon = ({\n  size = 16,\n  color = '#24BC75'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M12 3.5C12.276 3.50008 12.5 3.72391 12.5 4V10C12.5 10.2761 12.276 10.4999 12 10.5C11.7238 10.5 11.5 10.2761 11.5 10V5.20703L4.35348 12.3535C4.15824 12.5488 3.84171 12.5487 3.64645 12.3535C3.45118 12.1583 3.45118 11.8417 3.64645 11.6465L10.7929 4.5H5.99996C5.72382 4.5 5.49996 4.27614 5.49996 4C5.49996 3.72386 5.72382 3.5 5.99996 3.5H12Z\",\n  fill: color\n}));\n\n// Стрелка входящего (completed — зелёная, missed — красная)\nconst IncomingArrowIcon = ({\n  size = 16,\n  color = '#24BC75'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M11.6465 3.64645C11.8417 3.45118 12.1583 3.45118 12.3535 3.64645C12.5487 3.84171 12.5488 4.15824 12.3535 4.35348L5.20703 11.5H10C10.2761 11.5 10.5 11.7238 10.5 12C10.4999 12.276 10.2761 12.5 10 12.5H4C3.72391 12.5 3.50008 12.276 3.5 12V5.99996C3.5 5.72382 3.72386 5.49996 4 5.49996C4.27614 5.49996 4.5 5.72382 4.5 5.99996V10.7929L11.6465 3.64645Z\",\n  fill: color\n}));\n\n// Иконка телефонной трубки 20x20\nconst PhoneIcon = ({\n  size = 20,\n  color = '#24BC75'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M4.38424 3.81174C5.113 3.0873 6.34124 3.19986 6.97701 4.04904L8.0278 5.45236C8.54147 6.13852 8.48662 7.07882 7.89791 7.66427L7.65866 7.90158C7.65866 7.90158 6.7567 8.79876 9.2192 11.2473C11.6621 13.6762 12.5692 12.8129 12.5835 12.799L12.9633 12.4211C13.488 11.8997 14.3058 11.7926 14.977 12.1574L16.5688 13.0227C17.5912 13.5784 17.817 14.941 17.018 15.7356L15.8335 16.9123C15.5325 17.2115 15.1594 17.4309 14.7299 17.4709C13.3721 17.5975 10.0512 17.4576 6.51217 13.9387C3.175 10.6205 2.57753 7.77616 2.50241 6.45431C2.47304 5.93764 2.71527 5.47182 3.07662 5.11252L4.38424 3.81174Z\",\n  fill: color\n}));\n\n// Время в локальном часовом поясе устройства (уважаем системный 12/24h формат)\nconst formatTime = timestamp => {\n  const date = new Date(timestamp);\n  if (Number.isNaN(date.getTime())) return '';\n  return date.toLocaleTimeString(undefined, {\n    hour: 'numeric',\n    minute: '2-digit'\n  });\n};\n\n// Длительность: \"50 s\" или \"2 min 30 s\"\nconst formatDuration = seconds => {\n  if (!seconds || seconds === 0) return null;\n  const mins = Math.floor(seconds / 60);\n  const secs = seconds % 60;\n  if (mins === 0) return `${secs} s`;\n  if (secs === 0) return `${mins} min`;\n  return `${mins} min ${secs} s`;\n};\nreturn ({\n  callType,\n  callDuration,\n  timestamp,\n  isOwner\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const isMissed = callType === 'missed';\n  const bgTile = theme.theme.semantic?.surface?.regular?.surface1 || '#131721';\n  const textColor = theme.theme.semantic?.content?.regular?.primary || '#FAFBFB';\n  const timeColor = theme.theme.semantic?.content?.regular?.tertiary || 'rgba(255, 255, 255, 0.3)';\n  const phoneColor = isMissed ? theme.theme.semantic?.content?.dangerous?.content1 || '#E83B3B' : theme.theme.semantic?.content?.positive?.content1 || '#24BC75';\n  const circleBg = isMissed ? theme.theme.semantic?.surface?.dangerous?.surface1 || '#281B24' : theme.theme.semantic?.surface?.positive?.surface1 || '#15282A';\n  const arrowColor = isMissed ? theme.theme.semantic?.content?.dangerous?.content1 || '#E83B3B' : theme.theme.semantic?.content?.positive?.content1 || '#24BC75';\n  const getCallLabel = () => {\n    if (isMissed) return t('chatCallMissed', 'Missed call');\n    if (callType === 'outgoing') return t('chatCallOutgoing', 'Outgoing call');\n    return t('chatCallIncoming', 'Incoming call');\n  };\n  const durationStr = formatDuration(callDuration);\n  const timeStr = formatTime(timestamp);\n  const timeAndDuration = durationStr ? `${timeStr}, ${durationStr}` : timeStr;\n  const styles = React.useMemo(() => ({\n    outer: {\n      flexDirection: 'row',\n      justifyContent: isOwner ? 'flex-end' : 'flex-start',\n      paddingHorizontal: 12,\n      paddingVertical: 2\n    },\n    tile: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingVertical: 4,\n      paddingHorizontal: 10,\n      gap: 12,\n      backgroundColor: bgTile,\n      borderTopLeftRadius: 12,\n      borderTopRightRadius: 12,\n      borderBottomLeftRadius: isOwner ? 12 : 0,\n      borderBottomRightRadius: isOwner ? 0 : 12\n    },\n    leftCol: {\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      gap: 4\n    },\n    label: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 22,\n      letterSpacing: -0.3,\n      color: textColor\n    },\n    timeRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    time: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 10,\n      lineHeight: 14,\n      letterSpacing: -0.2,\n      color: timeColor\n    },\n    circle: {\n      width: 36,\n      height: 36,\n      borderRadius: 18,\n      backgroundColor: circleBg,\n      justifyContent: 'center',\n      alignItems: 'center'\n    }\n  }), [theme, isOwner, bgTile, textColor, timeColor, circleBg]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.outer\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.tile\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.leftCol\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.label\n  }, getCallLabel()), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.timeRow\n  }, callType === 'outgoing' ? /*#__PURE__*/React.createElement(OutgoingArrowIcon, {\n    size: 16,\n    color: arrowColor\n  }) : /*#__PURE__*/React.createElement(IncomingArrowIcon, {\n    size: 16,\n    color: arrowColor\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.time\n  }, timeAndDuration))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.circle\n  }, /*#__PURE__*/React.createElement(PhoneIcon, {\n    size: 20,\n    color: phoneColor\n  }))));\n};"},"ChatSubscriptionEvent":{"name":"ChatSubscriptionEvent","key":"f541930a948dbcc0c79c09cac03e1c085a9316a2c1d8784b6343e964c37e5b8e","code":"deps:\n/**\n * ChatSubscriptionEvent - событие подписки в чате\n * Отображает факт подписки (кто-то подписался на вас / вы подписались)\n * \n * @param {Object} props\n * @param {string} props.subscriptionType - Тип: 'subscribed' (вы подписались) | 'subscriber' (на вас подписались)\n * @param {string} props.timestamp - ISO дата\n */\n\n// Иконка подписки/звезды\nconst SubscriptionIcon = ({\n  size = 18,\n  color = '#FE375B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 18 18\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9 1.5L11.085 5.725L15.75 6.4L12.375 9.675L13.17 14.3L9 12.113L4.83 14.3L5.625 9.675L2.25 6.4L6.915 5.725L9 1.5Z\",\n  fill: color,\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\n\n// Иконка сердца (для подписчика)\nconst HeartIcon = ({\n  size = 18,\n  color = '#FE375B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 18 18\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M15.63 3.4575C15.247 3.07425 14.7905 2.77217 14.2874 2.56908C13.7843 2.36599 13.2449 2.26587 12.7012 2.27451C12.1576 2.28315 11.6216 2.40037 11.125 2.61925C10.6284 2.83813 10.1812 3.15421 9.81 3.54975L9 4.40925L8.19 3.54975C7.43867 2.75008 6.41342 2.28108 5.33044 2.23768C4.24745 2.19428 3.18815 2.57994 2.37603 3.31706C1.56391 4.05418 1.06188 5.08262 0.975679 6.18307C0.889474 7.28352 1.22581 8.37353 1.92 9.2325L8.445 16.1925C8.5175 16.2712 8.60508 16.3342 8.70243 16.3777C8.79978 16.4212 8.90497 16.4443 9.0115 16.4455C9.11803 16.4467 9.22372 16.426 9.32203 16.3847C9.42035 16.3434 9.50934 16.2824 9.5835 16.2055L16.08 9.2325C16.4632 8.84962 16.7652 8.39355 16.9683 7.89092C17.1713 7.38829 17.2714 6.84936 17.2627 6.30615C17.254 5.76294 17.1367 5.22739 16.9178 4.73139C16.6989 4.2354 16.3829 3.78907 15.988 3.4185L15.63 3.4575Z\",\n  fill: color\n}));\n\n// Форматирование времени в локальном часовом поясе устройства\nconst formatTime = timestamp => {\n  const date = new Date(timestamp);\n  if (Number.isNaN(date.getTime())) return '';\n  return date.toLocaleTimeString(undefined, {\n    hour: '2-digit',\n    minute: '2-digit'\n  });\n};\nreturn ({\n  subscriptionType,\n  timestamp\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const isSubscriber = subscriptionType === 'subscriber'; // На нас подписались\n\n  const bgColor = theme.theme.semantic.surface.information?.surface4 || 'rgba(254, 55, 91, 0.1)';\n  const iconColor = theme.theme.component?.button?.brand?.bgDefault || '#FE375B';\n  const textColor = theme.theme.semantic.content.regular.primary;\n  const secondaryColor = theme.theme.semantic.content.regular.tertiary;\n\n  // Текст события\n  const getText = () => {\n    if (isSubscriber) {\n      return t('chatSubscriptionNewFollower', 'Новый подписчик');\n    }\n    return t('chatSubscriptionYouFollowed', 'Вы подписались');\n  };\n  const styles = React.useMemo(() => ({\n    container: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      paddingHorizontal: 12,\n      paddingVertical: 6\n    },\n    eventCard: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      backgroundColor: bgColor,\n      paddingHorizontal: 16,\n      paddingVertical: 10,\n      borderRadius: 16,\n      gap: 10\n    },\n    iconContainer: {\n      width: 32,\n      height: 32,\n      borderRadius: 16,\n      backgroundColor: 'rgba(254, 55, 91, 0.15)',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    textContainer: {\n      flexDirection: 'column',\n      gap: 2\n    },\n    mainText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 18,\n      color: textColor\n    },\n    time: {\n      fontFamily: 'Inter',\n      fontWeight: '400',\n      fontSize: 12,\n      lineHeight: 16,\n      color: secondaryColor\n    }\n  }), [theme, bgColor, textColor, secondaryColor]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.eventCard\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.iconContainer\n  }, isSubscriber ? /*#__PURE__*/React.createElement(HeartIcon, {\n    size: 18,\n    color: iconColor\n  }) : /*#__PURE__*/React.createElement(SubscriptionIcon, {\n    size: 18,\n    color: iconColor\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.textContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.mainText\n  }, getText()), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.time\n  }, formatTime(timestamp)))));\n};"},"ChatDateSeparator":{"name":"ChatDateSeparator","key":"ed3d67a53735fabbfd6654fad20975fdb84f10f25bfe320da9144b6ac05e3c54","code":"deps:\n/**\n * ChatDateSeparator - разделитель дат в чате\n * Отображает \"Сегодня\", \"Вчера\" или дату между группами сообщений\n * \n * @param {Object} props\n * @param {string} props.dateLabel - Текст даты (\"Сегодня\", \"Вчера\", \"17 января 2025\")\n */\n\nreturn ({\n  dateLabel\n}) => {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    container: {\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingVertical: 12,\n      paddingHorizontal: 16\n    },\n    labelContainer: {\n      backgroundColor: theme.theme.semantic.surface.regular.surface3,\n      paddingHorizontal: 12,\n      paddingVertical: 4,\n      borderRadius: 12\n    },\n    label: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      lineHeight: 16,\n      color: theme.theme.semantic.content.regular.secondary,\n      textAlign: 'center'\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.labelContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.label\n  }, dateLabel)));\n};"},"ChatInputDock":{"name":"ChatInputDock","key":"e416778241f403d90b2dc75238f32571c6f579a6f9c488bbfe66eb9e840822de","code":"deps: ChatInputField\nfunction _empty() {}\n// Иконка корзины (удалить)\nconst TrashIcon = ({\n  size = 16,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10.584 5.54395C11.6056 5.54395 12.1164 5.5441 12.4189 5.87696C12.7215 6.21006 12.688 6.73583 12.6211 7.78712L12.4434 10.5791C12.32 12.5167 12.2584 13.4856 11.6553 14.0762C11.0522 14.6667 10.1246 14.667 8.26953 14.667H7.73047C5.8754 14.667 4.94782 14.6667 4.34473 14.0762C3.74163 13.4856 3.68004 12.5167 3.55664 10.5791L3.37891 7.78712C3.31195 6.73582 3.27851 6.21006 3.58105 5.87696C3.88363 5.5441 4.39443 5.54395 5.41602 5.54395H10.584ZM6.2832 7.65431C6.00862 7.68342 5.80849 7.94138 5.83594 8.23048L6.16895 11.7393C6.19642 12.0285 6.44202 12.2399 6.7168 12.2109C6.99133 12.1819 7.19141 11.9238 7.16406 11.6348L6.83105 8.12599C6.80358 7.83675 6.55798 7.62538 6.2832 7.65431ZM9.7168 7.65431C9.44203 7.62538 9.19642 7.83675 9.16895 8.12599L8.83594 11.6348C8.80859 11.9238 9.00867 12.1819 9.2832 12.2109C9.55798 12.2399 9.80358 12.0285 9.83105 11.7393L10.1641 8.23048C10.1915 7.94138 9.99138 7.68342 9.7168 7.65431ZM9.15918 1.33302C9.30756 1.33291 9.4375 1.33331 9.55957 1.35548C10.0416 1.44317 10.4591 1.78496 10.6846 2.27735C10.7417 2.40203 10.7823 2.54206 10.8291 2.70216L10.9053 2.9629C10.9183 3.00731 10.9226 3.01938 10.9258 3.02931C11.0459 3.40678 11.4186 3.66269 11.7715 3.67286H13.4854C13.7694 3.67286 14 3.93485 14 4.25782C13.9998 4.58058 13.7692 4.84181 13.4854 4.84181H2.51465C2.23075 4.84181 2.00022 4.58058 2 4.25782C2 3.93485 2.23062 3.67286 2.51465 3.67286L4.29004 3.67188C4.64294 3.66172 4.95511 3.40678 5.0752 3.02931C5.07833 3.01943 5.08182 3.00694 5.09473 2.9629L5.1709 2.70216C5.21773 2.54207 5.25834 2.40202 5.31543 2.27735C5.54099 1.78481 5.95915 1.44305 6.44141 1.35548C6.56336 1.33338 6.6926 1.33291 6.84082 1.33302H9.15918Z\",\n  fill: color\n}));\nfunction _awaitIgnored(value, direct) {\n  if (!direct) {\n    return value && value.then ? value.then(_empty) : Promise.resolve();\n  }\n}\nfunction _catch(body, recover) {\n  try {\n    var result = body();\n  } catch (e) {\n    return recover(e);\n  }\n  if (result && result.then) {\n    return result.then(void 0, recover);\n  }\n  return result;\n}\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _invokeIgnored(body) {\n  var result = body();\n  if (result && result.then) {\n    return result.then(_empty);\n  }\n}\nfunction _continue(value, then) {\n  return value && value.then ? value.then(then) : then(value);\n}\nfunction makeAttachmentId() {\n  return 'att_' + Date.now() + '_' + Math.random().toString(36).slice(2);\n}\nconst MAX_PICKER_FILES = 10;\n\n/** Длительность в мм:сс (durationMs в миллисекундах) */\nfunction formatDuration(durationMs) {\n  if (durationMs == null || Number.isNaN(durationMs)) return '0:00';\n  const sec = Math.floor(durationMs / 1000);\n  const m = Math.floor(sec / 60);\n  const s = sec % 60;\n  return `${m}:${s.toString().padStart(2, '0')}`;\n}\nfunction getWebVideoDuration(uri) {\n  if (ReactNative.Platform.OS !== 'web' || !uri || typeof document === 'undefined') {\n    return Promise.resolve(null);\n  }\n  return new Promise(resolve => {\n    const video = document.createElement('video');\n    let timeoutId;\n    let settled = false;\n    const cleanup = () => {\n      clearTimeout(timeoutId);\n      video.removeEventListener('loadedmetadata', onLoadedMetadata);\n      video.removeEventListener('durationchange', onLoadedMetadata);\n      video.removeEventListener('error', onError);\n      video.removeAttribute('src');\n      video.load?.();\n    };\n    const finish = durationMs => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      resolve(durationMs);\n    };\n    const onLoadedMetadata = () => {\n      if (!Number.isFinite(video.duration) || video.duration <= 0) return;\n      finish(Math.round(video.duration * 1000));\n    };\n    const onError = () => finish(null);\n    timeoutId = setTimeout(() => finish(null), 3000);\n    video.preload = 'metadata';\n    video.muted = true;\n    video.playsInline = true;\n    video.addEventListener('loadedmetadata', onLoadedMetadata);\n    video.addEventListener('durationchange', onLoadedMetadata);\n    video.addEventListener('error', onError);\n    video.src = uri;\n    video.load?.();\n  });\n}\n\n// Иконка закрытия (X) для тайла ответа\nconst CloseIcon = ({\n  size = 16,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M12 4L4 12M4 4l8 8\",\n  stroke: color,\n  strokeWidth: 2,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\nconst showPhotoAccessDeniedModal = _async(function () {\n  return _await(Sheet.showModal(/*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"PhotoAccessDeniedModal\"\n  }), {\n    props: {\n      style: {\n        maxWidth: 600\n      }\n    }\n  }), function (shouldOpenSettings) {\n    if (!shouldOpenSettings) {\n      return;\n    }\n    return _catch(function () {\n      if (ReactNative.Platform.OS === 'web') {\n        return;\n      }\n      return _awaitIgnored(ReactNative.Linking.openSettings());\n    }, function (error) {\n      console.error('Error opening settings:', error);\n    });\n  });\n});\nfunction AttachmentVideoPreview({\n  uri,\n  style\n}) {\n  const [, setReady] = React.useState(false);\n  const source = React.useMemo(() => ({\n    uri\n  }), [uri]);\n  const player = ExpoVideo.useVideoPlayer(source, player => {\n    player.loop = true;\n    player.muted = true;\n  });\n  React.useEffect(() => {\n    setReady(false);\n  }, [uri]);\n  return /*#__PURE__*/React.createElement(ExpoVideo.VideoView, {\n    style: style,\n    contentFit: \"fit\",\n    player: player,\n    nativeControls: false,\n    useExoShutter: false,\n    onFirstFrameRender: () => {\n      setReady(true);\n    },\n    pointerEvents: \"none\"\n  });\n}\nreturn ({\n  value,\n  onChangeText,\n  attachments,\n  onAttachmentsChange,\n  onSend,\n  onAttachment,\n  onGiftPress,\n  onFilesLimitExceeded,\n  forceAttachmentCallback = false,\n  placeholder,\n  showPaidBadge,\n  paidPrice,\n  selectionMode,\n  onCancelSelection,\n  onDeleteSelected,\n  replyTo,\n  onReplyToClose,\n  onReplyTilePress\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [displayAttachments, setDisplayAttachments] = React.useState([]);\n  const EXIT_DURATION = 250;\n  React.useEffect(() => {\n    if (attachments.length > 0) {\n      setDisplayAttachments(attachments);\n      return;\n    }\n    const t = setTimeout(() => setDisplayAttachments([]), EXIT_DURATION);\n    return () => clearTimeout(t);\n  }, [attachments]);\n  const hasText = value && value.trim().length > 0;\n  const canSend = hasText || attachments.length > 0;\n  const hasReplyTo = replyTo && (replyTo.messageId || replyTo.text || replyTo.authorName);\n  const PILL_RADIUS = 999;\n  const SEND_BUTTON_CORNER_RADIUS = 12;\n  const SEND_BUTTON_INSET = 4;\n  const DOCK_PANEL_CORNER_RADIUS = SEND_BUTTON_CORNER_RADIUS + SEND_BUTTON_INSET + 12;\n  const surfaceBg = theme.theme.semantic?.surface?.regular?.surface1 || '#FFFFFF';\n  const contentPrimary = theme.theme.semantic?.content?.regular?.primary || '#04060F';\n  const contentSecondary = theme.theme.semantic?.content?.regular?.secondary || 'rgba(4, 6, 15, 0.5)';\n  const styles = React.useMemo(() => ({\n    dockRootOuter: {\n      width: '100%'\n    },\n    dockWrap: {\n      position: 'relative',\n      overflow: 'visible',\n      maxWidth: '100%'\n    },\n    inputWrap: {\n      overflow: 'visible',\n      maxWidth: '100%'\n    },\n    replyTile: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      marginHorizontal: 12,\n      marginBottom: 8,\n      paddingVertical: 8,\n      paddingHorizontal: 12,\n      gap: 8,\n      minHeight: 60,\n      backgroundColor: surfaceBg,\n      borderLeftWidth: 4,\n      borderLeftColor: '#FE375B',\n      borderRadius: 12\n    },\n    replyTileContentWrap: {\n      flex: 1,\n      minWidth: 0\n    },\n    replyTileContent: {\n      flex: 1,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      minWidth: 0\n    },\n    replyTileName: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      color: contentPrimary\n    },\n    replyTileText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.2,\n      color: contentSecondary\n    },\n    replyTileCloseBtn: {\n      width: 32,\n      height: 32,\n      borderRadius: 999,\n      backgroundColor: 'rgba(4, 6, 15, 0.1)',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    replyTileCloseBtnInner: {\n      flex: 1,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    selectionDock: {\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      gap: 12,\n      marginHorizontal: 12,\n      paddingVertical: 12,\n      paddingHorizontal: 12,\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderRadius: DOCK_PANEL_CORNER_RADIUS\n    },\n    selectionBtnCancel: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      width: '100%',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      height: 40,\n      borderRadius: SEND_BUTTON_CORNER_RADIUS,\n      backgroundColor: Utils.withOpacity(theme.theme.component?.button?.secondary?.bgDefault || '#04060F', 0.1)\n    },\n    selectionBtnCancelText: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: theme.theme.component?.button?.secondary?.content || '#04060F'\n    },\n    selectionBtnDelete: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      width: '100%',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      height: 40,\n      gap: 6,\n      borderRadius: SEND_BUTTON_CORNER_RADIUS,\n      backgroundColor: theme.theme.component?.button?.dangerous?.bgDefault || '#E83B3B'\n    },\n    selectionBtnDeleteText: {\n      fontFamily: 'Geologica',\n      fontWeight: '600',\n      fontSize: 14,\n      lineHeight: 20,\n      letterSpacing: -0.01,\n      color: theme.theme.component?.button?.dangerous?.content || '#FFFFFF'\n    },\n    selectionBtnWrapper: {\n      minWidth: 0,\n      minHeight: 40,\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    selectionBtnFill: {\n      minWidth: 0,\n      minHeight: 40,\n      width: '100%',\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    attachmentsPanel: {\n      height: 76,\n      overflow: 'visible',\n      backgroundColor: 'transparent',\n      maxWidth: '100%'\n    },\n    attachmentRowWrap: {\n      flex: 1,\n      overflow: 'visible'\n    },\n    attachmentScroll: {\n      maxWidth: '100%'\n    },\n    attachmentScrollContent: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingHorizontal: 12,\n      paddingBottom: 8,\n      paddingTop: 24,\n      gap: 8,\n      overflow: 'visible'\n    },\n    attachmentPreviewWrap: {\n      position: 'relative',\n      width: 60,\n      height: 60,\n      flexGrow: 0,\n      overflow: 'visible',\n      backgroundColor: '#FFFFFF',\n      borderRadius: 24\n    },\n    attachmentPreviewImage: {\n      width: 60,\n      height: 60,\n      borderRadius: 24\n    },\n    attachmentPreviewClip: {\n      width: 60,\n      height: 60,\n      borderRadius: 24,\n      overflow: 'hidden',\n      backgroundColor: '#04060F'\n    },\n    attachmentPreviewVideo: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      width: '100%',\n      height: '100%',\n      minWidth: '100%',\n      minHeight: '100%'\n    },\n    attachmentRemove: {\n      position: 'absolute',\n      right: -8,\n      top: -8,\n      width: 32,\n      height: 32,\n      borderRadius: 999,\n      backgroundColor: '#FFFFFF',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    attachmentDurationPill: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      bottom: -4,\n      flexDirection: 'row',\n      justifyContent: 'center'\n    },\n    attachmentDurationPillInner: {\n      minWidth: 32,\n      height: 18,\n      paddingHorizontal: 6,\n      paddingVertical: 2,\n      backgroundColor: 'rgba(4, 6, 15, 0.5)',\n      borderRadius: 999,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    attachmentDurationText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 10,\n      lineHeight: 14,\n      letterSpacing: -0.2,\n      color: '#FFFFFF'\n    }\n  }), [theme, surfaceBg, contentPrimary, contentSecondary]);\n  const [isSendingHello] = Hooks.useBehaviorSubject(State.store.isSendingHello);\n  const handleSend = React.useCallback(_async(function () {\n    if (!canSend || !onSend) return;\n    const prevAttachments = [...attachments];\n    onAttachmentsChange([]);\n    const result = onSend({\n      text: value || '',\n      attachments: [...prevAttachments],\n      replyToMessageId: hasReplyTo && replyTo?.messageId ? replyTo.messageId : undefined\n    });\n    return _await(result, function (_result2) {\n      if (!_result2 && prevAttachments?.length) {\n        onAttachmentsChange(prevAttachments);\n      }\n    });\n  }), [canSend, onSend, value, attachments, onAttachmentsChange, hasReplyTo, replyTo?.messageId]);\n  const handleRemoveAttachment = React.useCallback(id => {\n    onAttachmentsChange(attachments?.filter(a => a.id !== id));\n  }, [attachments, onAttachmentsChange]);\n  const handleAttachmentPress = React.useCallback(_async(function () {\n    let _exit = false;\n    if (forceAttachmentCallback) {\n      // TODO: Replace with onAttachment != null\n      onAttachment?.();\n      return;\n    }\n    return function () {\n      if (typeof ImagePicker?.launchImageLibraryAsync === 'function') {\n        return _continue(_catch(function () {\n          return _await(ImagePicker.requestMediaLibraryPermissionsAsync(), function ({\n            status\n          }) {\n            if (status !== 'granted' && status !== 'undetermined' && status != null) {\n              showPhotoAccessDeniedModal();\n              _exit = true;\n            }\n          });\n        }, function (error) {\n          console.error(error);\n        }), function (_result3) {\n          return _exit ? _result3 : _await(ImagePicker.launchImageLibraryAsync({\n            mediaTypes: ['images', 'videos'],\n            // mediaTypes: (typeof ImagePicker !== 'undefined' && ImagePicker.MediaTypeOptions) ? ImagePicker.MediaTypeOptions.All : ['images', 'videos'],\n            allowsMultipleSelection: true,\n            quality: 0.8,\n            videoMaxDuration: 60,\n            selectionLimit: MAX_PICKER_FILES\n          }), function (result) {\n            return _invokeIgnored(function () {\n              if (result && !result.canceled && result.assets && result.assets.length > 0) {\n                if (ReactNative.Platform.OS === 'web' && result.assets.length > MAX_PICKER_FILES) {\n                  onFilesLimitExceeded?.();\n                }\n                return _await(Promise.all(result.assets.filter(asset => {\n                  const isVideo = asset.type === 'video' || asset.uri && /\\.(mp4|mov|webm|m4v)$/i.test(asset.uri);\n                  const isTooLarge = asset.fileSize != null && asset.fileSize > 10 * 1024 * 1024;\n                  return isVideo || !isTooLarge;\n                }).map(_async(function (asset) {\n                  const isVideo = asset.type === 'video' || asset.uri && /\\.(mp4|mov|webm|m4v)$/i.test(asset.uri);\n                  const _asset$duration = isVideo && asset.duration;\n                  return _await(isVideo ? _asset$duration && getWebVideoDuration(asset.uri) : null, function (duration) {\n                    return {\n                      id: makeAttachmentId(),\n                      uri: asset.uri,\n                      type: isVideo ? 'video' : 'image',\n                      ...(asset.fileSize != null && {\n                        fileSize: asset.fileSize\n                      }),\n                      ...(asset.width != null && {\n                        width: asset.width\n                      }),\n                      ...(asset.height != null && {\n                        height: asset.height\n                      }),\n                      ...(isVideo && duration != null && {\n                        duration\n                      })\n                    };\n                  }, !isVideo || !_asset$duration);\n                }))), function (newItems) {\n                  onAttachmentsChange([...attachments, ...newItems].slice(0, MAX_PICKER_FILES));\n                });\n              }\n            });\n          });\n        });\n      } else {\n        onAttachment?.();\n      }\n    }();\n  }), [attachments, onAttachmentsChange, onAttachment, onFilesLimitExceeded, forceAttachmentCallback]);\n  const dangerousColor = theme.theme.component?.button?.dangerous?.content || '#FFFFFF';\n  if (selectionMode) {\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.dockRootOuter\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.selectionDock\n    }, /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.selectionBtnWrapper\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      styleContainer: styles.selectionBtnFill,\n      style: styles.selectionBtnDelete,\n      onPress: onDeleteSelected\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.selectionBtnDeleteText,\n      numberOfLines: 1\n    }, \"Remove selected\"), /*#__PURE__*/React.createElement(TrashIcon, {\n      size: 16,\n      color: dangerousColor\n    }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.selectionBtnWrapper\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      styleContainer: styles.selectionBtnFill,\n      style: styles.selectionBtnCancel,\n      onPress: onCancelSelection\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.selectionBtnCancelText,\n      numberOfLines: 1\n    }, \"Cancel\")))));\n  }\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.dockRootOuter\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.dockWrap\n  }, displayAttachments.length > 0 && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.attachmentsPanel\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.attachmentRowWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.ScrollView, {\n    horizontal: true,\n    showsHorizontalScrollIndicator: false,\n    style: styles.attachmentScroll,\n    contentContainerStyle: styles.attachmentScrollContent\n  }, displayAttachments.map(attachment => /*#__PURE__*/React.createElement(ReactNative.View, {\n    key: attachment.id,\n    style: styles.attachmentPreviewWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.attachmentPreviewClip\n  }, attachment.type === 'video' ? /*#__PURE__*/React.createElement(AttachmentVideoPreview, {\n    uri: attachment.uri,\n    style: styles.attachmentPreviewVideo\n  }) : /*#__PURE__*/React.createElement(Image, {\n    source: attachment.uri,\n    placeholder: {\n      thumbhash: attachment?.hash\n    },\n    style: styles.attachmentPreviewImage,\n    resizeMode: \"cover\"\n  })), attachment.type === 'video' && !!attachment?.duration && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.attachmentDurationPill\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.attachmentDurationPillInner\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.attachmentDurationText,\n    numberOfLines: 1\n  }, formatDuration(attachment.duration)))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: {\n      position: 'absolute',\n      top: -8,\n      right: -8,\n      width: 32,\n      height: 32\n    },\n    style: styles.attachmentRemove,\n    onPress: () => handleRemoveAttachment(attachment.id)\n  }, /*#__PURE__*/React.createElement(TrashIcon, {\n    size: 16,\n    color: \"#04060F\"\n  }))))))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.inputWrap\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"ChatInputField\",\n    value: value,\n    onChangeText: onChangeText,\n    onSend: handleSend,\n    onAttachmentPress: handleAttachmentPress,\n    onGiftPress: onGiftPress,\n    placeholder: placeholder,\n    showPaidBadge: showPaidBadge,\n    paidPrice: paidPrice,\n    canSend: canSend && !isSendingHello\n  }))));\n};"},"ChatMessageContextMenu":{"name":"ChatMessageContextMenu","key":"50d6b392f280e1ab8eb7655bd141e925c8ade050a236985e22d681bec9d32602","code":"deps: WithAppear\n/**\n * ChatMessageContextMenu - контекстное меню при долгом тапе на сообщение.\n * Рендерится в Portal: блюр экрана + lift баббла (Image) + меню в стиле ChatDropdownMenu.\n *\n * @param {boolean} visible\n * @param {string} messageId\n * @param {{ x, y, width, height } | null} layout - координаты баббла (measureInWindow)\n * @param {string | null} imageUri - uri снимка баббла (captureRef)\n * @param {() => void} onClose\n * @param {(messageId: string) => void} onDeleteForMe\n * @param {(messageId: string) => void} onSelect - закрыть меню и включить мультивыбор с выделением этого сообщения\n */\n\n// Иконка корзины (как в ChatDropdownMenu)\nconst DeleteIcon = ({\n  size = 16,\n  color = '#E83B3B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M2 4H14M12.6667 4V13.3333C12.6667 14 12 14.6667 11.3333 14.6667H4.66667C4 14.6667 3.33333 14 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2 6 1.33334 6.66667 1.33334H9.33333C10 1.33334 10.6667 2 10.6667 2.66667V4M6.66667 7.33334V11.3333M9.33333 7.33334V11.3333\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\n\n// Иконка выбора (галочка в круге / check)\nconst SelectIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M13.3333 4L6 11.3333L2.66667 8\",\n  stroke: color,\n  strokeWidth: 2,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\n\n// Иконка «Ответить» (reply)\nconst ReplyIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M7.84277 2.76904C7.99264 2.6701 8.2502 2.53198 8.5459 2.604L8.67383 2.64795L8.79297 2.71533C9.04289 2.88836 9.11107 3.17237 9.13672 3.3501C9.16764 3.56499 9.16602 3.84879 9.16602 4.15088V5.23291C10.3817 5.32716 11.781 5.77848 12.9287 6.87646C14.2453 8.13628 15.1659 10.1857 15.166 13.3325C15.166 13.5625 15.0093 13.7627 14.7861 13.8179C14.5628 13.8728 14.3305 13.7686 14.2236 13.5649C13.7865 12.7326 12.9808 12.0358 11.9727 11.5444C11.115 11.1266 10.1336 10.8699 9.16602 10.8032V11.8481C9.16602 12.1503 9.16764 12.434 9.13672 12.6489C9.10745 12.852 9.02268 13.1944 8.67383 13.3511C8.32525 13.5072 8.01392 13.343 7.84277 13.23C7.6616 13.1103 7.45041 12.9209 7.22461 12.7202L4.57617 10.3657C4.06484 9.91121 3.64086 9.53575 3.35156 9.1958C3.05308 8.84494 2.83988 8.46691 2.83984 7.99951C2.83996 7.53208 3.05298 7.15411 3.35156 6.80322C3.64099 6.46311 4.06452 6.08713 4.57617 5.63232L7.22461 3.27881C7.45055 3.07797 7.66152 2.88875 7.84277 2.76904ZM5.30078 2.63428C5.50313 2.44645 5.81895 2.45834 6.00684 2.66064C6.19466 2.863 6.1828 3.17882 5.98047 3.3667L2.50391 6.59619C2.0766 6.99313 1.83305 7.55007 1.83301 8.1333C1.83308 8.74818 2.10308 9.33238 2.57129 9.73096L5.96484 12.6196C6.17512 12.7986 6.20047 13.1144 6.02148 13.3247C5.84244 13.5347 5.52656 13.5602 5.31641 13.3813L1.92285 10.4927C1.23145 9.9041 0.833083 9.04129 0.833008 8.1333C0.833047 7.272 1.19217 6.44894 1.82324 5.86279L5.30078 2.63428ZM7.88867 4.02588L5.24023 6.38037C4.70669 6.85463 4.34668 7.17651 4.11328 7.45068C3.88931 7.71389 3.83994 7.86847 3.83984 7.99951C3.83988 8.13054 3.88947 8.28425 4.11328 8.54736C4.34663 8.82159 4.70654 9.14426 5.24023 9.61865L7.88867 11.9731C7.99777 12.0701 8.08808 12.1491 8.16309 12.2134C8.16486 12.1145 8.16602 11.9944 8.16602 11.8481V10.2847C8.16646 10.0091 8.3904 9.78497 8.66602 9.78467C9.94086 9.78467 11.2663 10.0878 12.4102 10.645C13.0225 10.9434 13.5924 11.3207 14.0762 11.771C13.8303 9.73991 13.1046 8.42904 12.2373 7.59912C11.1573 6.56601 9.79227 6.21338 8.66602 6.21338C8.39013 6.21308 8.16602 5.98934 8.16602 5.71338V4.15088C8.16601 4.00423 8.16487 3.88371 8.16309 3.78467C8.08791 3.84911 7.99817 3.92855 7.88867 4.02588Z\",\n  fill: color\n}));\nreturn ({\n  visible,\n  messageId,\n  layout,\n  imageUri,\n  isOwner,\n  onClose,\n  onReply,\n  onDeleteForMe,\n  onSelect\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const safeArea = SafeArea?.useSafeAreaInsets?.() ?? {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0\n  };\n  State.api?.audit?.useLifecycleAudit?.({\n    kind: 'modal',\n    name: 'ChatMessageContextMenu',\n    active: visible === true,\n    presentation: 'context-menu',\n    params: {\n      messageId,\n      isOwner\n    }\n  });\n  const bgColor = theme.theme.component?.dropdown?.bg || '#FFFFFF';\n  const contentDefault = theme.theme.component?.dropdown?.contentDefault || '#38404A';\n  const contentDangerous = theme.theme.component?.dropdown?.contentDangerous || '#E83B3B';\n  const dividerColor = theme.theme.component?.dropdown?.divider || '#E5E8EC';\n  const {\n    width: screenWidth,\n    height: screenHeight\n  } = ReactNative.useWindowDimensions();\n  const menuWidth = 240;\n  const gapBubbleMenu = 8;\n  const menuHeight = 89; // 2 rows * 44 + 1 divider\n\n  // Тайминги: запускаем с небольшими задержками без ожидания завершения предыдущей, вся последовательность ~300–350 мс\n  const STEP_MS_BUBBLE = 0;\n  const STEP_MS_MENU = 80; // меню стартует почти сразу после баббла, не ждём окончания scale\n  const BUBBLE_SCALE_DURATION = 150;\n  const MENU_APPEAR_DURATION = 150;\n  const MENU_SLIDE_DISTANCE = 24;\n\n  // layout от measureInWindow — в координатах окна; Portal host \"page\" у нас в (0,0) окна.\n  // На Android measureInWindow возвращает Y относительно видимой области (под status bar), поэтому добавляем safeArea.top.\n  const overlayLeft = layout?.x ?? 0;\n  const overlayTop = (layout?.y ?? 0) + (safeArea?.top ?? 0);\n\n  // Точка масштабирования: баббл «растёт» к центру экрана\n  const bubbleCenterX = layout != null ? overlayLeft + layout.width / 2 : screenWidth / 2;\n  const bubbleCenterY = layout != null ? overlayTop + layout.height / 2 : screenHeight / 2;\n  const bubbleOnRight = layout != null && bubbleCenterX > screenWidth / 2;\n  const bubbleBelowCenter = layout != null && bubbleCenterY > screenHeight / 2;\n  // Свои: масштаб от правого края (-width/2) → рост влево к центру. Чужие: от левого края (+width/2) → рост вправо к центру (как до правки своих).\n  const isOwnMessage = isOwner === true || isOwner !== false && bubbleOnRight;\n  const anchorTranslateX = layout != null ? isOwnMessage ? -layout.width / 2 : layout.width / 2 : 0;\n  const anchorTranslateY = layout != null ? bubbleBelowCenter ? layout.height / 2 : -layout.height / 2 : 0;\n  // Сообщение ниже центра экрана → меню над сообщением; иначе — под сообщением (используем overlayTop для согласованности с оверлеем)\n  const messageCenterY = layout != null ? overlayTop + layout.height / 2 : screenHeight / 2;\n  const menuAbove = layout != null && messageCenterY > screenHeight / 2;\n  const menuTop = layout != null ? menuAbove ? overlayTop - menuHeight - gapBubbleMenu : overlayTop + layout.height + gapBubbleMenu : screenHeight / 2 - menuHeight / 2;\n  // Отступ от края баббла как у контента (ChatBubble container paddingHorizontal: 12)\n  const bubbleEdgePadding = 12;\n  const menuLeft = layout != null ? isOwnMessage ? screenWidth - menuWidth - bubbleEdgePadding : overlayLeft + bubbleEdgePadding : (screenWidth - menuWidth) / 2;\n\n  // Пошаговое состояние анимации (аналогично visibleCount в Store.jsx Grid)\n  const [animationStep, setAnimationStep] = React.useState(0);\n  const bubbleScale = React.useRef(new ReactNative.Animated.Value(1)).current;\n  React.useEffect(() => {\n    if (!visible) {\n      setAnimationStep(0);\n      bubbleScale.setValue(1);\n      return;\n    }\n    setAnimationStep(0);\n    bubbleScale.setValue(1);\n    const t1 = setTimeout(() => setAnimationStep(1), STEP_MS_BUBBLE);\n    const t2 = setTimeout(() => setAnimationStep(2), STEP_MS_MENU);\n    return () => {\n      clearTimeout(t1);\n      clearTimeout(t2);\n    };\n  }, [visible, bubbleScale]);\n\n  // Баббл: при step 1 запускаем масштаб 5% без ожидания (короткая длительность)\n  React.useEffect(() => {\n    if (animationStep !== 1 || !layout) return;\n    ReactNative.Animated.timing(bubbleScale, {\n      toValue: 1.05,\n      duration: BUBBLE_SCALE_DURATION,\n      useNativeDriver: true\n    }).start();\n  }, [animationStep, layout, bubbleScale]);\n  const styles = React.useMemo(() => ({\n    overlay: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      zIndex: 200\n    },\n    blur: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0\n    },\n    liftImage: {\n      position: 'absolute',\n      width: layout?.width ?? 0,\n      height: layout?.height ?? 0,\n      left: overlayLeft,\n      top: overlayTop,\n      zIndex: 201\n    },\n    menuContainer: {\n      position: 'absolute',\n      left: menuLeft,\n      top: menuTop,\n      width: menuWidth,\n      backgroundColor: bgColor,\n      borderRadius: 16,\n      borderWidth: 1,\n      borderColor: bgColor,\n      overflow: 'hidden',\n      zIndex: 202,\n      shadowColor: '#04060F',\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      elevation: 10\n    },\n    row: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      height: 44,\n      backgroundColor: bgColor,\n      width: '100%'\n    },\n    rowInner: {\n      flexDirection: 'row',\n      flex: 1,\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      minWidth: 0\n    },\n    rowTextWrap: {\n      flex: 1,\n      minWidth: 0\n    },\n    rowText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.3,\n      color: contentDefault\n    },\n    rowTextDanger: {\n      color: contentDangerous\n    },\n    divider: {\n      height: 1,\n      backgroundColor: dividerColor\n    }\n  }), [layout, overlayLeft, overlayTop, menuLeft, menuTop, screenWidth, screenHeight, bgColor, contentDefault, contentDangerous, dividerColor]);\n  const handleDeleteForMe = React.useCallback(() => {\n    if (messageId) onDeleteForMe?.(messageId);\n    onClose?.();\n  }, [messageId, onDeleteForMe, onClose]);\n  const handleSelect = React.useCallback(() => {\n    if (messageId) onSelect?.(messageId);\n    onClose?.();\n  }, [messageId, onSelect, onClose]);\n  if (!visible) return null;\n  const BlurView = ExpoBlur?.BlurView ?? ReactNative.View;\n  const blurIntensity = 80;\n  const content = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.overlay,\n    onPress: onClose\n  }), /*#__PURE__*/React.createElement(BlurView, {\n    style: styles.blur,\n    intensity: blurIntensity,\n    tint: theme.theme.semantic?.surface?.regular?.surface1 ? 'light' : 'dark'\n  }), imageUri && layout && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.liftImage,\n    pointerEvents: \"none\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Animated.View, {\n    style: {\n      width: layout.width,\n      height: layout.height,\n      transform: [{\n        translateX: -anchorTranslateX\n      }, {\n        translateY: -anchorTranslateY\n      }, {\n        scale: bubbleScale\n      }, {\n        translateX: anchorTranslateX\n      }, {\n        translateY: anchorTranslateY\n      }]\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Image, {\n    source: {\n      uri: imageUri\n    },\n    style: {\n      width: layout.width,\n      height: layout.height\n    },\n    resizeMode: \"stretch\"\n  }))), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: animationStep >= 2,\n    scale: 0.95,\n    duration: MENU_APPEAR_DURATION,\n    translateY: menuAbove ? MENU_SLIDE_DISTANCE : -MENU_SLIDE_DISTANCE,\n    unmountOnHide: false,\n    style: styles.menuContainer\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: handleDeleteForMe\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.rowText, styles.rowTextDanger],\n    numberOfLines: 1\n  }, t('chatMessageContextDeleteForMe') || 'Удалить у себя')), /*#__PURE__*/React.createElement(DeleteIcon, {\n    size: 16,\n    color: contentDangerous\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: handleSelect\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, t('chatMessageContextSelect') || 'Выбрать')), /*#__PURE__*/React.createElement(SelectIcon, {\n    size: 16,\n    color: contentDefault\n  }))));\n  return /*#__PURE__*/React.createElement(Portal, {\n    hostName: \"overview\"\n  }, content);\n};"},"FeedCard":{"name":"FeedCard","key":"ff1b0edcaa87a38ce1bf17003cc01d872fa5badce284d72ab5b034d5ef5560ac","code":"deps: CardModal, GiftCircleButton, GiftsCatalogSheet\nconst CARD_ASPECT = 263.85 / 171.5;\nconst COMPACT_CARD_ASPECT = 124 / 100;\nconst CARD_BORDER_RADIUS = 24;\nconst CARD_BG = '#04060F';\nconst PHOTO_OVERLAY_COLORS = ['rgba(0, 0, 0, 0.3)', 'rgba(0, 0, 0, 0.1)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.1)', 'rgba(0, 0, 0, 0.3)'];\nconst PHOTO_OVERLAY_LOCATIONS = [0, 0.1, 0.2056, 0.4, 0.5864, 0.8, 1];\nfunction getStatusTierIcon(status) {\n  const rating = parseInt(status ?? 0, 10);\n  if (rating >= 3450) return 'diamond.webp';\n  if (rating >= 1950) return 'emerald.webp';\n  if (rating >= 1250) return 'gold.webp';\n  if (rating >= 550) return 'silver.webp';\n  return 'bronze.webp';\n}\nconst getFeedCardUserId = item => item?.user?.id ?? item?.userId ?? '';\nconst getFeedCardPhoto = item => item?.photos?.[0] ?? item?.card?.mainPhoto ?? null;\nconst getValidThumbhash = hash => {\n  if (typeof hash !== 'string') return null;\n  const normalizedHash = hash.trim();\n  const isValidBase64 = normalizedHash.length > 0 && normalizedHash.length % 4 === 0 && /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(normalizedHash);\n  return isValidBase64 ? normalizedHash : null;\n};\nconst getFeedCardSignature = item => {\n  const photo = getFeedCardPhoto(item);\n  const tags = item?.card?.tags ?? [];\n  return [getFeedCardUserId(item), photo?.path ?? '', photo?.hash ?? '', item?.user?.username ?? item?.card?.username ?? '', item?.subscription?.hasSubscription ? 'pro' : '', item?.card?.country ?? '', item?.status?.status ?? item?.card?.rating ?? '', tags?.[0] ?? '', tags?.[1] ?? ''].join('|');\n};\nconst areFeedCardPropsEqual = (prev, next) => prev.item === next.item && prev.width === next.width && prev.compact === next.compact && prev.onOpen === next.onOpen && prev.onMessageAttempt === next.onMessageAttempt || prev.width === next.width && prev.compact === next.compact && prev.onOpen === next.onOpen && prev.onMessageAttempt === next.onMessageAttempt && getFeedCardSignature(prev.item) === getFeedCardSignature(next.item);\nconst CrownIcon = React.memo(({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n})));\nconst MessageIcon = React.memo(({\n  size = 24,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6.66699 4C9.61225 4.00018 11.9998 6.38775 12 9.33301C12 12.2784 9.61236 14.6668 6.66699 14.667C5.84332 14.667 5.06264 14.4799 4.36621 14.1465C4.12691 14.032 3.85588 13.992 3.59961 14.0605L2.78223 14.2793C2.13806 14.4516 1.54841 13.8619 1.7207 13.2178L1.93945 12.4004C2.00802 12.1441 1.96802 11.8731 1.85352 11.6338C1.5201 10.9374 1.33301 10.1567 1.33301 9.33301C1.33318 6.38764 3.72158 4 6.66699 4ZM4.33301 8.66699C3.96508 8.66717 3.66717 8.96508 3.66699 9.33301C3.66699 9.70109 3.96497 9.99982 4.33301 10C4.7012 10 5 9.7012 5 9.33301C4.99982 8.96497 4.70109 8.66699 4.33301 8.66699ZM6.66699 8.66699C6.29891 8.66699 6.00018 8.96497 6 9.33301C6 9.7012 6.2988 10 6.66699 10C7.03503 9.99982 7.33301 9.70109 7.33301 9.33301C7.33283 8.96508 7.03492 8.66717 6.66699 8.66699ZM9 8.66699C8.63192 8.66699 8.33318 8.96497 8.33301 9.33301C8.33301 9.7012 8.63181 10 9 10C9.36819 10 9.66699 9.7012 9.66699 9.33301C9.66682 8.96497 9.36808 8.66699 9 8.66699Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.6\",\n  d: \"M10.333 1.33301C12.7262 1.33301 14.667 3.27376 14.667 5.66699C14.6669 6.33598 14.5149 6.96948 14.2441 7.53516C14.1511 7.72949 14.1183 7.95005 14.1738 8.1582L14.3516 8.82324C14.4913 9.34652 14.0126 9.82459 13.4893 9.68457L12.8252 9.50781C12.6169 9.45212 12.3966 9.48405 12.2021 9.57715C12.1322 9.61062 12.0612 9.64211 11.9893 9.67188C11.9963 9.55993 12 9.44673 12 9.33301C11.9998 6.38772 9.6123 4.00013 6.66699 4C6.55324 4 6.4401 4.00373 6.32812 4.01074C6.97855 2.43927 8.52649 1.33318 10.333 1.33301Z\",\n  fill: color\n})));\nconst OnlineBadge = React.memo(({\n  userId,\n  label,\n  style,\n  dotStyle,\n  textStyle\n}) => {\n  const isOnline = Hooks.useBehaviorSubjectMap(State.store.onlineMapStore, React.useCallback(map => map?.[userId], [userId]));\n  if (!isOnline) return null;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: style\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: dotStyle\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: textStyle\n  }, label));\n}, (prev, next) => prev.userId === next.userId && prev.label === next.label && prev.style === next.style && prev.dotStyle === next.dotStyle && prev.textStyle === next.textStyle);\nconst PhotoLayer = React.memo(({\n  photoPath,\n  photoHash,\n  styles,\n  avatarColor\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.photoLayer\n}, photoPath ? /*#__PURE__*/React.createElement(Components.DSImage, {\n  style: styles.photoImage,\n  source: State.getUrl(`/file/photo/${photoPath}`),\n  cachePolicy: \"memory-disk\",\n  thumbhash: photoHash,\n  hideProgress: true\n}) : /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.photoPlaceholder\n}), photoPath && /*#__PURE__*/React.createElement(LinearGradient, {\n  colors: PHOTO_OVERLAY_COLORS,\n  locations: PHOTO_OVERLAY_LOCATIONS,\n  style: styles.gradientOverlay\n}), !photoPath && /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.avatarPlaceholderLayer\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.avatarPlaceholder\n}, /*#__PURE__*/React.createElement(Assets.Avatar, {\n  size: styles.avatarPlaceholderSize,\n  style: {\n    color: avatarColor\n  }\n})))), (prev, next) => prev.photoPath === next.photoPath && prev.photoHash === next.photoHash && prev.styles === next.styles && prev.avatarColor === next.avatarColor);\nconst FeedCardComponent = ({\n  item,\n  width,\n  compact,\n  onOpen,\n  onMessageAttempt\n}) => {\n  item = React.useMemo(() => State.api?.users?.sanitizeMeta?.(item) ?? item, [item]);\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const enableGifts = State.api.ff.useFF('enableGifts');\n  const myUserId = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.user?.id, []));\n  const isGuest = State.api?.guest?.useIsGuestSession?.();\n  State.api?.users?.useSetUser?.(item);\n  const userId = getFeedCardUserId(item);\n  const photo = getFeedCardPhoto(item);\n  const photoThumbhash = getValidThumbhash(photo?.hash);\n  const username = item?.user?.username ?? item?.card?.username ?? '';\n  const displayUsername = username || t('profilePlaceholderUser') || 'User';\n  const isPro = item?.subscription?.hasSubscription;\n  // Age display disabled. To restore card subtitle: const age = item?.card?.age ?? '';\n  const country = item?.card?.country ?? '';\n  const status = item?.status?.status ?? item?.card?.rating;\n  const tags = item?.card?.tags || [];\n  const tag0 = tags?.[0];\n  const tag1 = tags?.[1];\n  const onlineLabel = t('feedCardOnline');\n  const isOwnCard = userId != null && myUserId != null && String(userId) === String(myUserId);\n  const handleCardPress = React.useCallback(() => {\n    if (isGuest) {\n      State.api?.guest?.openRegisterSheet?.('restricted_action', 'feed_card');\n      return;\n    }\n    onOpen?.();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: item,\n      source: \"feed_tab\"\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [item, onOpen, isGuest]);\n  const handleMessagePress = React.useCallback(() => {\n    if (isGuest) {\n      State.api?.guest?.openRegisterSheet?.('restricted_action', 'feed_message');\n      return;\n    }\n    if (!userId) return;\n    onMessageAttempt?.();\n    // const shouldSyncSplitChatTarget = isWeb\n    //   && State.api?.ff?.getFF?.('enableWebUI')\n    //   && (ReactNative.Dimensions?.get?.('window')?.width ?? 0) >= 960;\n    // if (shouldSyncSplitChatTarget) {\n    //   State.store.chat_chatId?.next?.(null);\n    //   State.store.user_userId?.next?.(userId);\n    // }\n    // Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('Chat', { userId, source: 'feed_tab' }));\n\n    State.api.chat.openModal(userId, 'feed_tab');\n  }, [isGuest, onMessageAttempt, userId]);\n  const handleGiftPress = React.useCallback(() => {\n    if (!userId) return;\n    if (isGuest) {\n      State.api?.guest?.openRegisterSheet?.('restricted_action', 'gift');\n      return;\n    }\n    State.api?.gifts?.startGiftFlow?.({\n      receiverId: userId,\n      entrySource: 'feed_tab'\n    });\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsCatalogSheet\"\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [isGuest, userId]);\n  const cardHeight = compact ? width * COMPACT_CARD_ASPECT : width * CARD_ASPECT;\n  const statusIcon = status != null ? getStatusTierIcon(status) : null;\n  const placeholderBg = theme.theme.semantic?.surface?.inversion?.static?.stSurface1;\n  const placeholderIconBg = theme.theme.semantic?.surface?.inversion?.static?.stSurface2;\n  const avatarColor = theme.theme.semantic?.content?.inversion?.static?.stPrimary;\n  const messageBg = theme.theme.component?.button?.primaryPermanent?.bgDefault ?? '#FAFBFB';\n  const messageContent = theme.theme.component?.button?.primaryPermanent?.content ?? '#04060F';\n  const headingFont = theme.theme.typography?.family?.heading;\n  const paragraphFont = theme.theme.typography?.family?.paragraph;\n  const brandBg = theme.theme.component.button.brand.bgDefault;\n  const avatarPlaceholderSize = compact ? 40 : 60;\n  const styles = React.useMemo(() => ({\n    card: {\n      width,\n      height: cardHeight,\n      borderRadius: CARD_BORDER_RADIUS,\n      backgroundColor: CARD_BG,\n      overflow: 'hidden',\n      flexDirection: 'column',\n      justifyContent: 'space-between',\n      alignItems: 'flex-start',\n      gap: compact ? 4 : 8\n    },\n    photoLayer: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      backgroundColor: CARD_BG\n    },\n    photoImage: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      width: '100%',\n      height: '100%'\n    },\n    photoPlaceholder: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      width: '100%',\n      height: '100%',\n      backgroundColor: placeholderBg\n    },\n    gradientOverlay: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    },\n    avatarPlaceholderLayer: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      justifyContent: 'center',\n      alignItems: 'center',\n      backgroundColor: 'transparent',\n      pointerEvents: 'none'\n    },\n    avatarPlaceholder: {\n      width: avatarPlaceholderSize,\n      height: avatarPlaceholderSize,\n      borderRadius: avatarPlaceholderSize / 2,\n      backgroundColor: placeholderIconBg,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    avatarPlaceholderSize: compact ? 24 : 32,\n    topSection: {\n      paddingHorizontal: 16,\n      paddingTop: 12,\n      paddingBottom: 4,\n      gap: 2,\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'flex-start',\n      alignSelf: 'stretch'\n    },\n    compactTopSection: {\n      padding: 8,\n      gap: 2,\n      paddingBottom: 0,\n      alignSelf: 'stretch',\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'flex-start'\n    },\n    nameRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      paddingRight: 16\n    },\n    nameText: {\n      fontFamily: headingFont,\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      color: '#FFFFFF'\n    },\n    compactNameText: {\n      fontFamily: headingFont,\n      fontWeight: '700',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: '#FFFFFF'\n    },\n    nameTextTruncate: {\n      fontFamily: headingFont,\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      color: '#FFFFFF',\n      flexShrink: 1\n    },\n    flagWrap: {\n      width: 16,\n      height: 16,\n      borderRadius: 14,\n      overflow: 'hidden',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    statusIcon: {\n      width: 16,\n      height: 16\n    },\n    onlineDot: {\n      width: 6,\n      height: 6,\n      borderRadius: 3,\n      backgroundColor: '#24BC75'\n    },\n    onlineText: {\n      fontFamily: paragraphFont,\n      fontWeight: '700',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: '#FFFFFF'\n    },\n    bottomSection: {\n      paddingHorizontal: 12,\n      paddingTop: 4,\n      paddingBottom: 12,\n      gap: 8,\n      flexDirection: 'column',\n      justifyContent: 'flex-end',\n      alignItems: 'flex-start',\n      alignSelf: 'stretch'\n    },\n    compactBottomSection: {\n      padding: 8,\n      gap: 2,\n      paddingTop: 0,\n      alignSelf: 'stretch',\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    secondRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 12,\n      paddingTop: 4\n    },\n    secondRowLeft: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    secondRowRight: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    badgesRow: {\n      flexDirection: 'row',\n      flexWrap: 'wrap',\n      alignItems: 'center',\n      gap: 4\n    },\n    badge: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 4,\n      paddingVertical: 2,\n      gap: 2,\n      backgroundColor: 'rgba(255, 255, 255, 0.2)',\n      borderRadius: 999\n    },\n    badgeText: {\n      fontFamily: paragraphFont,\n      fontWeight: '500',\n      fontSize: 10,\n      lineHeight: 12,\n      letterSpacing: -0.3,\n      color: '#FFFFFF'\n    },\n    buttonsRow: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      alignSelf: 'stretch',\n      height: 48\n    },\n    btnMessage: {\n      width: 48,\n      height: 48,\n      borderRadius: 999,\n      backgroundColor: messageBg,\n      justifyContent: 'center',\n      alignItems: 'center',\n      padding: 12\n    },\n    pro: {\n      width: 16,\n      height: 16,\n      borderRadius: 16,\n      backgroundColor: brandBg,\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }), [avatarPlaceholderSize, brandBg, cardHeight, compact, headingFont, messageBg, messageContent, paragraphFont, placeholderBg, placeholderIconBg, width]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    onPress: handleCardPress,\n    style: styles.card,\n    noloading: true,\n    feedback: true,\n    scale: 0.98\n  }, /*#__PURE__*/React.createElement(PhotoLayer, {\n    photoPath: photo?.path,\n    photoHash: photoThumbhash,\n    styles: styles,\n    avatarColor: avatarColor\n  }), compact ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.compactTopSection\n  }, displayUsername ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.compactNameText,\n    numberOfLines: 1\n  }, displayUsername) : null), /*#__PURE__*/React.createElement(OnlineBadge, {\n    userId: userId,\n    label: onlineLabel,\n    style: styles.compactBottomSection,\n    dotStyle: styles.onlineDot,\n    textStyle: styles.onlineText\n  })) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topSection\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameRow\n  }, displayUsername ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.nameTextTruncate,\n    numberOfLines: 1\n  }, String(displayUsername)) : null, isPro && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: avatarColor\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.secondRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.secondRowLeft\n  }, country ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.flagWrap\n  }, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: country,\n    size: 16\n  })) : null, statusIcon ? /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.statusIcon,\n    source: State.getUrl(`/api/component/assets/status/${statusIcon}`)\n  }) : null), /*#__PURE__*/React.createElement(OnlineBadge, {\n    userId: userId,\n    label: onlineLabel,\n    style: styles.secondRowRight,\n    dotStyle: styles.onlineDot,\n    textStyle: styles.onlineText\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomSection\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badgesRow\n  }, tag0 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.badgeText,\n    numberOfLines: 1\n  }, t(tag0))) : null, tag1 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.badgeText,\n    numberOfLines: 1\n  }, t(tag1))) : null), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonsRow\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: handleMessagePress,\n    style: styles.btnMessage\n  }, /*#__PURE__*/React.createElement(MessageIcon, {\n    size: 24,\n    color: messageContent\n  })), enableGifts && !isOwnCard && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"GiftCircleButton\",\n    onPress: handleGiftPress\n  })))));\n};\nconst MemoizedFeedCardComponent = React.memo(FeedCardComponent, areFeedCardPropsEqual);\nreturn function FeedCard(props) {\n  return /*#__PURE__*/React.createElement(MemoizedFeedCardComponent, props);\n};"},"SubscriptionsCard":{"name":"SubscriptionsCard","key":"81b4b0a517051e1b062eeeddfd9ea550cf0b81e66606b70f67e534d31e576dd9","code":"deps: CardModal, GiftCircleButton, GiftsCatalogSheet\nconst CARD_ASPECT = 263.85 / 171.5;\nconst COMPACT_CARD_ASPECT = 124 / 100;\nconst CARD_BORDER_RADIUS = 24;\nconst CARD_BG = '#04060F';\nconst PHOTO_OVERLAY_COLORS = ['rgba(0, 0, 0, 0.3)', 'rgba(0, 0, 0, 0.1)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.1)', 'rgba(0, 0, 0, 0.3)'];\nconst PHOTO_OVERLAY_LOCATIONS = [0, 0.1, 0.2056, 0.4, 0.5864, 0.8, 1];\nfunction getStatusTierIcon(status) {\n  const rating = parseInt(status ?? 0, 10);\n  if (rating >= 3450) return 'diamond.webp';\n  if (rating >= 1950) return 'emerald.webp';\n  if (rating >= 1250) return 'gold.webp';\n  if (rating >= 550) return 'silver.webp';\n  return 'bronze.webp';\n}\nconst getSubscriptionsCardUserId = item => item?.user?.id ?? item?.userId ?? item?.id ?? '';\nconst getSubscriptionsCardPhoto = item => item?.photos?.[0] ?? item?.card?.mainPhoto ?? null;\nconst getValidThumbhash = hash => {\n  if (typeof hash !== 'string') return null;\n  const normalizedHash = hash.trim();\n  const isValidBase64 = normalizedHash.length > 0 && normalizedHash.length % 4 === 0 && /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(normalizedHash);\n  return isValidBase64 ? normalizedHash : null;\n};\nconst getSubscriptionsCardSignature = item => {\n  const photo = getSubscriptionsCardPhoto(item);\n  const tags = item?.card?.tags ?? [];\n  return [getSubscriptionsCardUserId(item), photo?.path ?? '', photo?.hash ?? '', item?.user?.username ?? item?.card?.username ?? '', item?.subscription?.hasSubscription ? 'pro' : '', item?.card?.country ?? '', item?.status?.status ?? item?.card?.rating ?? '', tags?.[0] ?? '', tags?.[1] ?? ''].join('|');\n};\nconst areSubscriptionsCardPropsEqual = (prev, next) => prev.item === next.item && prev.width === next.width && prev.compact === next.compact && prev.paywall === next.paywall && prev.onOpen === next.onOpen && prev.onMessageAttempt === next.onMessageAttempt || prev.width === next.width && prev.compact === next.compact && prev.paywall === next.paywall && prev.onOpen === next.onOpen && prev.onMessageAttempt === next.onMessageAttempt && getSubscriptionsCardSignature(prev.item) === getSubscriptionsCardSignature(next.item);\nconst CrownIcon = React.memo(({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n})));\nconst MessageIcon = React.memo(({\n  size = 24,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6.66699 4C9.61225 4.00018 11.9998 6.38775 12 9.33301C12 12.2784 9.61236 14.6668 6.66699 14.667C5.84332 14.667 5.06264 14.4799 4.36621 14.1465C4.12691 14.032 3.85588 13.992 3.59961 14.0605L2.78223 14.2793C2.13806 14.4516 1.54841 13.8619 1.7207 13.2178L1.93945 12.4004C2.00802 12.1441 1.96802 11.8731 1.85352 11.6338C1.5201 10.9374 1.33301 10.1567 1.33301 9.33301C1.33318 6.38764 3.72158 4 6.66699 4ZM4.33301 8.66699C3.96508 8.66717 3.66717 8.96508 3.66699 9.33301C3.66699 9.70109 3.96497 9.99982 4.33301 10C4.7012 10 5 9.7012 5 9.33301C4.99982 8.96497 4.70109 8.66699 4.33301 8.66699ZM6.66699 8.66699C6.29891 8.66699 6.00018 8.96497 6 9.33301C6 9.7012 6.2988 10 6.66699 10C7.03503 9.99982 7.33301 9.70109 7.33301 9.33301C7.33283 8.96508 7.03492 8.66717 6.66699 8.66699ZM9 8.66699C8.63192 8.66699 8.33318 8.96497 8.33301 9.33301C8.33301 9.7012 8.63181 10 9 10C9.36819 10 9.66699 9.7012 9.66699 9.33301C9.66682 8.96497 9.36808 8.66699 9 8.66699Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.6\",\n  d: \"M10.333 1.33301C12.7262 1.33301 14.667 3.27376 14.667 5.66699C14.6669 6.33598 14.5149 6.96948 14.2441 7.53516C14.1511 7.72949 14.1183 7.95005 14.1738 8.1582L14.3516 8.82324C14.4913 9.34652 14.0126 9.82459 13.4893 9.68457L12.8252 9.50781C12.6169 9.45212 12.3966 9.48405 12.2021 9.57715C12.1322 9.61062 12.0612 9.64211 11.9893 9.67188C11.9963 9.55993 12 9.44673 12 9.33301C11.9998 6.38772 9.6123 4.00013 6.66699 4C6.55324 4 6.4401 4.00373 6.32812 4.01074C6.97855 2.43927 8.52649 1.33318 10.333 1.33301Z\",\n  fill: color\n})));\nconst OnlineBadge = React.memo(({\n  userId,\n  label,\n  style,\n  dotStyle,\n  textStyle\n}) => {\n  const isOnline = Hooks.useBehaviorSubjectMap(State.store.onlineMapStore, React.useCallback(map => map?.[userId], [userId]));\n  if (!isOnline) return null;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: style\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: dotStyle\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: textStyle\n  }, label));\n}, (prev, next) => prev.userId === next.userId && prev.label === next.label && prev.style === next.style && prev.dotStyle === next.dotStyle && prev.textStyle === next.textStyle);\nconst PhotoLayer = React.memo(({\n  photoPath,\n  photoHash,\n  paywall,\n  styles,\n  avatarColor\n}) => /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.photoLayer\n}, photoPath && !paywall ? /*#__PURE__*/React.createElement(Components.DSImage, {\n  style: styles.photoImage,\n  source: State.getUrl(`/file/photo/${photoPath}`),\n  cachePolicy: \"memory-disk\",\n  thumbhash: photoHash,\n  hideProgress: true\n}) : !photoPath ? /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.photoPlaceholder\n}) : null, !paywall && photoPath && /*#__PURE__*/React.createElement(LinearGradient, {\n  colors: PHOTO_OVERLAY_COLORS,\n  locations: PHOTO_OVERLAY_LOCATIONS,\n  style: styles.gradientOverlay\n}), !photoPath && /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.avatarPlaceholderLayer\n}, /*#__PURE__*/React.createElement(ReactNative.View, {\n  style: styles.avatarPlaceholder\n}, /*#__PURE__*/React.createElement(Assets.Avatar, {\n  size: styles.avatarPlaceholderSize,\n  style: {\n    color: avatarColor\n  }\n})))), (prev, next) => prev.photoPath === next.photoPath && prev.photoHash === next.photoHash && prev.paywall === next.paywall && prev.styles === next.styles && prev.avatarColor === next.avatarColor);\nconst SubscriptionsCardComponent = ({\n  item,\n  width,\n  compact,\n  paywall,\n  onOpen,\n  onMessageAttempt\n}) => {\n  item = React.useMemo(() => State.api?.users?.sanitizeMeta?.(item) ?? item, [item]);\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const enableGifts = State.api.ff.useFF('enableGifts');\n  const myUserId = Hooks.useBehaviorSubjectMap(State.state.session, React.useCallback(s => s?.user?.id, []));\n  State.api?.users?.useSetUser?.(item);\n  const userId = getSubscriptionsCardUserId(item);\n  const photo = getSubscriptionsCardPhoto(item);\n  const photoThumbhash = getValidThumbhash(photo?.hash);\n  const username = item?.user?.username ?? item?.card?.username ?? '';\n  const displayUsername = username || t('profilePlaceholderUser') || 'User';\n  const isPro = item?.subscription?.hasSubscription;\n  // Age display disabled. To restore card subtitle: const age = item?.card?.age ?? '';\n  const country = item?.card?.country ?? '';\n  const status = item?.status?.status ?? item?.card?.rating;\n  const tags = item?.card?.tags || [];\n  const tag0 = tags?.[0];\n  const tag1 = tags?.[1];\n  const onlineLabel = t('feedCardOnline');\n  const handleCardPress = React.useCallback(() => {\n    if (paywall) {\n      Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('SubPay', {\n        top: 3\n      }));\n      return;\n    }\n    onOpen?.();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: item,\n      source: \"subscriptions_list\"\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [item, onOpen, paywall]);\n  const handleMessagePress = React.useCallback(() => {\n    if (!userId) return;\n    onMessageAttempt?.();\n\n    // const shouldSyncSplitChatTarget = isWeb\n    //   && State.api?.ff?.getFF?.('enableWebUI')\n    //   && (ReactNative.Dimensions?.get?.('window')?.width ?? 0) >= 960;\n    // if (shouldSyncSplitChatTarget) {\n    //   State.store.chat_chatId?.next?.(null);\n    //   State.store.user_userId?.next?.(userId);\n    // }\n    // Navigation.navigationRef.dispatch(ReactNavigation.StackActions.push('Chat', { userId, source: 'subscriptions' }));\n\n    State.api.chat.openModal(userId, 'subscriptions');\n  }, [onMessageAttempt, userId]);\n  const handleGiftPress = React.useCallback(() => {\n    if (!userId) return;\n    if (State.api?.guest?.isGuestSession?.()) {\n      State.api?.guest?.openRegisterSheet?.('restricted_action', 'gift');\n      return;\n    }\n    State.api?.gifts?.startGiftFlow?.({\n      receiverId: userId,\n      entrySource: 'subscriptions'\n    });\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsCatalogSheet\"\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [userId]);\n  const cardHeight = compact ? width * COMPACT_CARD_ASPECT : width * CARD_ASPECT;\n  const statusIcon = status != null ? getStatusTierIcon(status) : null;\n  const placeholderBg = theme.theme.semantic?.surface?.inversion?.static?.stSurface1;\n  const placeholderIconBg = theme.theme.semantic?.surface?.inversion?.static?.stSurface2;\n  const avatarColor = theme.theme.semantic?.content?.inversion?.static?.stPrimary;\n  const messageBg = theme.theme.component?.button?.primaryPermanent?.bgDefault ?? '#FAFBFB';\n  const messageContent = theme.theme.component?.button?.primaryPermanent?.content ?? '#04060F';\n  const headingFont = theme.theme.typography?.family?.heading;\n  const paragraphFont = theme.theme.typography?.family?.paragraph;\n  const brandBg = theme.theme.component.button.brand.bgDefault;\n  const avatarPlaceholderSize = compact ? 40 : 60;\n  const styles = React.useMemo(() => ({\n    card: {\n      width,\n      height: cardHeight,\n      borderRadius: CARD_BORDER_RADIUS,\n      backgroundColor: CARD_BG,\n      overflow: 'hidden',\n      flexDirection: 'column',\n      justifyContent: 'space-between',\n      alignItems: 'flex-start',\n      gap: compact ? 4 : 8\n    },\n    photoLayer: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      backgroundColor: CARD_BG\n    },\n    photoImage: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      width: '100%',\n      height: '100%'\n    },\n    photoPlaceholder: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      width: '100%',\n      height: '100%',\n      backgroundColor: placeholderBg\n    },\n    gradientOverlay: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    },\n    avatarPlaceholderLayer: {\n      position: 'absolute',\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0,\n      justifyContent: 'center',\n      alignItems: 'center',\n      backgroundColor: 'transparent',\n      pointerEvents: 'none'\n    },\n    avatarPlaceholder: {\n      width: avatarPlaceholderSize,\n      height: avatarPlaceholderSize,\n      borderRadius: avatarPlaceholderSize / 2,\n      backgroundColor: placeholderIconBg,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    avatarPlaceholderSize: compact ? 24 : 32,\n    topSection: {\n      paddingHorizontal: 16,\n      paddingTop: 12,\n      paddingBottom: 4,\n      gap: 2,\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'flex-start',\n      alignSelf: 'stretch'\n    },\n    compactTopSection: {\n      padding: 8,\n      gap: 4,\n      paddingBottom: 0,\n      alignSelf: 'stretch',\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'flex-start'\n    },\n    nameRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8,\n      paddingRight: 16\n    },\n    nameText: {\n      fontFamily: headingFont,\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      color: '#FFFFFF'\n    },\n    compactNameText: {\n      fontFamily: headingFont,\n      fontWeight: '700',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: '#FFFFFF',\n      flexShrink: 1\n    },\n    nameTextTruncate: {\n      fontFamily: headingFont,\n      fontWeight: '600',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.7,\n      color: '#FFFFFF',\n      flexShrink: 1\n    },\n    flagWrap: {\n      width: 16,\n      height: 16,\n      borderRadius: 14,\n      overflow: 'hidden',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    statusIcon: {\n      width: 16,\n      height: 16\n    },\n    onlineDot: {\n      width: 6,\n      height: 6,\n      borderRadius: 3,\n      backgroundColor: '#24BC75'\n    },\n    onlineText: {\n      fontFamily: paragraphFont,\n      fontWeight: '700',\n      fontSize: 12,\n      lineHeight: 18,\n      letterSpacing: -0.2,\n      color: '#FFFFFF'\n    },\n    bottomSection: {\n      paddingHorizontal: 12,\n      paddingTop: 4,\n      paddingBottom: 12,\n      gap: 8,\n      flexDirection: 'column',\n      justifyContent: 'flex-end',\n      alignItems: 'flex-start',\n      alignSelf: 'stretch'\n    },\n    compactBottomSection: {\n      padding: 8,\n      gap: 2,\n      paddingTop: 0,\n      alignSelf: 'stretch',\n      flexDirection: 'row',\n      alignItems: 'center'\n    },\n    secondRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 12,\n      paddingTop: 4\n    },\n    secondRowLeft: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    secondRowRight: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    badgesRow: {\n      flexDirection: 'row',\n      flexWrap: 'wrap',\n      alignItems: 'center',\n      gap: 4\n    },\n    badge: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 4,\n      paddingVertical: 2,\n      gap: 2,\n      backgroundColor: 'rgba(255, 255, 255, 0.2)',\n      borderRadius: 999\n    },\n    badgeText: {\n      fontFamily: paragraphFont,\n      fontWeight: '500',\n      fontSize: 10,\n      lineHeight: 12,\n      letterSpacing: -0.3,\n      color: '#FFFFFF'\n    },\n    buttonsRow: {\n      flexDirection: 'row',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      alignSelf: 'stretch',\n      height: 48\n    },\n    btnMessage: {\n      width: 48,\n      height: 48,\n      borderRadius: 999,\n      backgroundColor: messageBg,\n      justifyContent: 'center',\n      alignItems: 'center',\n      padding: 12\n    },\n    pro: {\n      width: 16,\n      height: 16,\n      borderRadius: 16,\n      backgroundColor: brandBg,\n      alignItems: 'center',\n      justifyContent: 'center'\n    }\n  }), [avatarPlaceholderSize, brandBg, cardHeight, compact, headingFont, messageBg, messageContent, paragraphFont, placeholderBg, placeholderIconBg, width]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    onPress: handleCardPress,\n    style: styles.card,\n    noloading: true,\n    feedback: true,\n    scale: 0.98\n  }, /*#__PURE__*/React.createElement(PhotoLayer, {\n    photoPath: photo?.path,\n    photoHash: photoThumbhash,\n    paywall: paywall,\n    styles: styles,\n    avatarColor: avatarColor\n  }), !paywall && /*#__PURE__*/React.createElement(React.Fragment, null, compact ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.compactTopSection\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameRow\n  }, displayUsername ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.compactNameText,\n    numberOfLines: 1\n  }, displayUsername) : null, isPro && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: avatarColor\n  })))), /*#__PURE__*/React.createElement(OnlineBadge, {\n    userId: userId,\n    label: onlineLabel,\n    style: styles.compactBottomSection,\n    dotStyle: styles.onlineDot,\n    textStyle: styles.onlineText\n  })) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.topSection\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameRow\n  }, displayUsername ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.nameTextTruncate,\n    numberOfLines: 1\n  }, String(displayUsername)) : null, isPro && /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.pro\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 10,\n    color: avatarColor\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.secondRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.secondRowLeft\n  }, country ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.flagWrap\n  }, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: country,\n    size: 16\n  })) : null, statusIcon ? /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.statusIcon,\n    source: State.getUrl(`/api/component/assets/status/${statusIcon}`)\n  }) : null), /*#__PURE__*/React.createElement(OnlineBadge, {\n    userId: userId,\n    label: onlineLabel,\n    style: styles.secondRowRight,\n    dotStyle: styles.onlineDot,\n    textStyle: styles.onlineText\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottomSection\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badgesRow\n  }, tag0 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.badgeText,\n    numberOfLines: 1\n  }, t(tag0))) : null, tag1 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.badge\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.badgeText,\n    numberOfLines: 1\n  }, t(tag1))) : null), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.buttonsRow\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    onPress: handleMessagePress,\n    style: styles.btnMessage\n  }, /*#__PURE__*/React.createElement(MessageIcon, {\n    size: 24,\n    color: messageContent\n  })), enableGifts && String(userId) !== String(myUserId ?? '') && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"GiftCircleButton\",\n    onPress: handleGiftPress\n  }))))));\n};\nconst MemoizedSubscriptionsCardComponent = React.memo(SubscriptionsCardComponent, areSubscriptionsCardPropsEqual);\nreturn function SubscriptionsCard(props) {\n  return /*#__PURE__*/React.createElement(MemoizedSubscriptionsCardComponent, props);\n};"},"LiveCard":{"name":"LiveCard","key":"d93fd2664e1d48a9557c0dbf00fa71c77f0f7681f16292993c7581ddcd8ec2a5","code":"const CARD_ASPECT = 263.8461608886719 / 171.5;\nconst CARD_RADIUS = 22;\nconst CARD_BG = '#04060F';\nconst PHOTO_OVERLAY_COLORS = ['rgba(0, 0, 0, 0.26)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0)', 'rgba(0, 0, 0, 0.62)'];\nconst PHOTO_OVERLAY_LOCATIONS = [0, 0.32, 0.58, 1];\nconst isAbsoluteSource = value => /^https?:\\/\\//i.test(value) || /^data:/i.test(value) || /^file:/i.test(value) || /^blob:/i.test(value);\nconst resolveLiveImageSource = value => {\n  if (!value) return null;\n  if (typeof value !== 'string') return value;\n  const source = value.trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source)) return source;\n  if (source.startsWith('/')) return State.getUrl(source);\n  return State.getUrl(`/api/component/assets/live/${source}`);\n};\nconst resolveStreamPreviewSource = value => {\n  if (!value || typeof value !== 'string') return value ?? null;\n  const source = value.trim();\n  if (!source) return null;\n  if (isAbsoluteSource(source) || source.startsWith('/')) return resolveLiveImageSource(source);\n  if (/^[a-z0-9+/]+=*$/i.test(source) && source.length > 80) {\n    return `data:image/jpeg;base64,${source}`;\n  }\n  return resolveLiveImageSource(source);\n};\nconst getFirstMember = item => {\n  const members = item?.meta?.members ?? item?.room?.meta?.members;\n  return Array.isArray(members) && members.length > 0 ? members[0] : null;\n};\nconst getMemberProfile = member => member?.meta ?? member?.public ?? {};\nconst getProfileCard = profile => profile?.card ?? profile?.userCard ?? {};\nconst getProfilePhoto = profile => profile?.photos?.[0] ?? getProfileCard(profile)?.mainPhoto ?? null;\nconst getPhotoSource = photo => photo?.path ? State.getUrl(`/file/photo/${photo.path}`) : null;\nconst getValidThumbhash = hash => {\n  if (typeof hash !== 'string') return null;\n  const normalizedHash = hash.trim();\n  const isValidBase64 = normalizedHash.length > 0 && normalizedHash.length % 4 === 0 && /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(normalizedHash);\n  return isValidBase64 ? normalizedHash : null;\n};\nconst getStatusLabel = profile => {\n  const status = profile?.status;\n  const card = getProfileCard(profile);\n  const label = status?.title ?? status?.name ?? null;\n  if (label) return label;\n  const rating = Number.parseInt(String(status?.status ?? card?.rating ?? ''), 10);\n  if (!Number.isFinite(rating)) return 'Diamond';\n  if (rating >= 3450) return 'Diamond';\n  if (rating >= 1950) return 'Emerald';\n  if (rating >= 1250) return 'Gold';\n  if (rating >= 550) return 'Silver';\n  return 'Bronze';\n};\nconst EyeIcon = React.memo(({\n  size = 16,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M12 3.25C16.5141 3.25 19.5546 5.95441 21.3193 8.24707C21.7307 8.78144 22.1112 9.26921 22.3672 9.84863C22.6342 10.4531 22.75 11.1118 22.75 12C22.75 12.8882 22.6342 13.5469 22.3672 14.1514C22.1112 14.7308 21.7307 15.2186 21.3193 15.7529C19.5546 18.0456 16.5141 20.75 12 20.75C7.48587 20.75 4.44539 18.0456 2.68066 15.7529C2.26934 15.2186 1.88879 14.7308 1.63281 14.1514C1.36582 13.5469 1.25 12.8882 1.25 12C1.25 11.1118 1.36582 10.4531 1.63281 9.84863C1.88879 9.26921 2.26934 8.78144 2.68066 8.24707C4.44539 5.95441 7.48587 3.25 12 3.25ZM12 4.75C8.15036 4.75 5.49856 7.04523 3.86914 9.16211C3.43083 9.73155 3.17384 10.0718 3.00488 10.4541C2.84696 10.8116 2.75 11.2489 2.75 12C2.75 12.7511 2.84696 13.1884 3.00488 13.5459C3.17384 13.9282 3.43083 14.2684 3.86914 14.8379C5.49856 16.9548 8.15036 19.25 12 19.25C15.8496 19.25 18.5014 16.9548 20.1309 14.8379C20.5692 14.2684 20.8262 13.9282 20.9951 13.5459C21.153 13.1884 21.25 12.7511 21.25 12C21.25 11.2489 21.153 10.8116 20.9951 10.4541C20.8262 10.0718 20.5692 9.73155 20.1309 9.16211C18.5014 7.04523 15.8496 4.75 12 4.75ZM12 8.25C14.0711 8.25 15.75 9.92893 15.75 12C15.75 14.0711 14.0711 15.75 12 15.75C9.92893 15.75 8.25 14.0711 8.25 12C8.25 9.92893 9.92893 8.25 12 8.25ZM12 9.75C10.7574 9.75 9.75 10.7574 9.75 12C9.75 13.2426 10.7574 14.25 12 14.25C13.2426 14.25 14.25 13.2426 14.25 12C14.25 10.7574 13.2426 9.75 12 9.75Z\",\n  fill: color\n})));\nconst CrownIcon = React.memo(({\n  size = 10,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M7.465 7.5c.172 0 .312.14.312.313A.938.938 0 0 1 6.84 8.75H3.16a.938.938 0 0 1-.938-.938c0-.172.14-.312.313-.312h4.93ZM4.363 1.625c.245-.5 1.028-.5 1.273 0l.737 1.501c.246.502.949.66 1.426.32l.613-.439c.363-.26.877.069.728.466L8.111 6.209c-.193.512-.724.857-1.32.857H3.209c-.597 0-1.128-.345-1.32-.857L.859 3.473c-.149-.397.365-.726.729-.466l.613.438c.476.341 1.18.183 1.426-.32l.736-1.5Z\",\n  fill: color\n})));\nconst LiveCard = React.memo(({\n  item,\n  width,\n  onOpen\n}) => {\n  const theme = Theme.useTheme();\n  const roomId = item?.roomId ?? item?.id ?? item?._id ?? null;\n  const [liveViewerCount] = State.api.liveViewer.useCount(roomId);\n  const height = width * CARD_ASPECT;\n  const member = getFirstMember(item);\n  const profile = getMemberProfile(member);\n  const card = getProfileCard(profile);\n  const photo = getProfilePhoto(profile);\n  const photoSource = getPhotoSource(photo);\n  const streamPreview = resolveStreamPreviewSource(member?.preview ?? member?.meta?.preview ?? item?.preview);\n  const cover = photoSource ?? streamPreview;\n  const coverThumbhash = getValidThumbhash(photo?.hash ?? (photoSource ? null : member?.hash ?? member?.meta?.hash ?? item?.hash ?? null));\n  const username = profile?.user?.username ?? card?.username ?? member?.username ?? 'Stream';\n  const country = member?.country ?? card?.country ?? profile?.country ?? 'unknown';\n  const status = getStatusLabel(profile);\n  const viewers = liveViewerCount ?? item?.online?.viewerCounts?.total ?? item?.online?.viewers ?? 0;\n  const isPro = profile?.subscription?.hasSubscription;\n  const statusIcon = State.getUrl('/api/component/assets/status/diamond.webp');\n  const paragraphFont = theme.theme.typography?.family?.paragraph;\n  const headingFont = theme.theme.typography?.family?.heading;\n  const brandBg = theme.theme.component?.badge?.brand?.bg ?? '#FE375B';\n  const brandContent = theme.theme.component?.badge?.brand?.content ?? '#FFFFFF';\n  const styles = React.useMemo(() => ({\n    card: {\n      width,\n      height,\n      borderRadius: CARD_RADIUS,\n      overflow: 'hidden',\n      backgroundColor: CARD_BG\n    },\n    photo: {\n      position: 'absolute',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      width: '100%',\n      height: '100%'\n    },\n    overlay: {\n      position: 'absolute',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0\n    },\n    viewerRow: {\n      position: 'absolute',\n      top: 12,\n      left: 12,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4\n    },\n    viewerText: {\n      fontFamily: paragraphFont,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      color: '#FFFFFF'\n    },\n    bottom: {\n      position: 'absolute',\n      left: 12,\n      right: 12,\n      bottom: 12,\n      gap: 4\n    },\n    nameRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 6,\n      minWidth: 0\n    },\n    name: {\n      fontFamily: headingFont,\n      fontSize: 16,\n      lineHeight: 21,\n      fontWeight: '700',\n      letterSpacing: -0.2,\n      color: '#FFFFFF',\n      flexShrink: 1\n    },\n    crown: {\n      width: 16,\n      height: 16,\n      borderRadius: 8,\n      backgroundColor: brandBg,\n      justifyContent: 'center',\n      alignItems: 'center',\n      flexShrink: 0\n    },\n    metaRow: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 4,\n      minWidth: 0\n    },\n    flagWrap: {\n      width: 16,\n      height: 16,\n      borderRadius: 8,\n      overflow: 'hidden',\n      justifyContent: 'center',\n      alignItems: 'center',\n      flexShrink: 0\n    },\n    statusIcon: {\n      width: 16,\n      height: 16,\n      flexShrink: 0\n    },\n    statusText: {\n      fontFamily: paragraphFont,\n      fontSize: 12,\n      lineHeight: 16,\n      fontWeight: '500',\n      color: '#FFFFFF',\n      flexShrink: 1\n    }\n  }), [brandBg, headingFont, height, paragraphFont, width]);\n  const handlePress = React.useCallback(() => {\n    onOpen?.(item);\n  }, [item, onOpen]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    scale: 0.98,\n    noloading: true,\n    style: styles.card,\n    onPress: handlePress\n  }, cover ? /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.photo,\n    source: cover,\n    cachePolicy: \"memory-disk\",\n    contentFit: \"cover\",\n    thumbhash: coverThumbhash\n  }) : null, /*#__PURE__*/React.createElement(LinearGradient, {\n    colors: PHOTO_OVERLAY_COLORS,\n    locations: PHOTO_OVERLAY_LOCATIONS,\n    style: styles.overlay\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.viewerRow\n  }, /*#__PURE__*/React.createElement(EyeIcon, {\n    size: 16\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.viewerText,\n    numberOfLines: 1\n  }, viewers)), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.bottom\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.nameRow\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.name,\n    numberOfLines: 1\n  }, username), isPro ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.crown\n  }, /*#__PURE__*/React.createElement(CrownIcon, {\n    color: brandContent\n  })) : null), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.metaRow\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.flagWrap\n  }, /*#__PURE__*/React.createElement(Components.DSCountryFlag, {\n    code: country,\n    size: 16\n  })), /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.statusIcon,\n    source: statusIcon\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.statusText,\n    numberOfLines: 1\n  }, status))));\n});\nreturn function LiveCardComponent(props) {\n  return /*#__PURE__*/React.createElement(LiveCard, props);\n};"},"EmptyList":{"name":"EmptyList","key":"9591e06a7b74225e6b9ee839471e459b343d1c32ff9ba926c0c613fdacea1757","code":"deps: WithAppear\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const styles = React.useMemo(() => {\n    return {\n      root: {\n        flex: 1,\n        width: '100%'\n      },\n      empty: {\n        flex: 1,\n        flexDirection: 'column',\n        justifyContent: 'center',\n        alignItems: 'center',\n        paddingHorizontal: 24\n      },\n      emptyIcon: {\n        width: 68,\n        height: 68,\n        marginBottom: 16\n      },\n      emptyTextContainer: {\n        flexDirection: 'column',\n        alignItems: 'center',\n        padding: 0,\n        gap: 8,\n        width: '100%'\n      },\n      emptyTitle: {\n        fontSize: 18,\n        lineHeight: 24,\n        fontWeight: '600',\n        letterSpacing: -0.7,\n        textAlign: 'center',\n        color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F'\n      },\n      emptySubtitle: {\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '500',\n        letterSpacing: -0.2,\n        textAlign: 'center',\n        color: Utils.withOpacity(theme.theme.semantic?.content?.regular?.secondary ?? '#666', 0.5)\n      }\n    };\n  }, [theme]);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    duration: 250,\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.empty\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.emptyIcon,\n    source: Assets.banana\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.emptyTextContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t('noOnlineTip')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptySubtitle\n  }, t('tryAgainTip')))));\n};"},"SubscriptionsEmptyList":{"name":"SubscriptionsEmptyList","key":"ea30260cfde84a9b7418f9b9caab6b4b3fb89cb219809a9d12cee03ebb86613d","code":"deps: WithAppear\n/** Иконка «Смотреть ленту» для кнопки пустого состояния подписок */\nconst FeedExploreIcon = ({\n  color,\n  size = 16\n}) => typeof SVG !== 'undefined' && SVG.Svg && SVG.Path ? /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.7037 1.34618C12.3319 1.1997 12.9722 1.23459 13.7056 1.36571C14.4299 1.49522 15.3116 1.73205 16.4263 2.03075C17.5412 2.32948 18.4237 2.56495 19.1158 2.81493C19.8167 3.06813 20.3881 3.35828 20.859 3.7993C21.5446 4.44145 22.0245 5.27218 22.2379 6.187C22.3843 6.8152 22.3495 7.45545 22.2183 8.18895C22.0888 8.91321 21.852 9.79502 21.5533 10.9097L21.0357 12.8423C20.7371 13.9568 20.5015 14.8388 20.2515 15.5307C19.9984 16.2313 19.708 16.8032 19.2672 17.2739C18.6451 17.9379 17.8454 18.4067 16.9644 18.6294C16.7071 19.2195 16.3332 19.7555 15.859 20.1997C15.3882 20.6404 14.8164 20.931 14.1158 21.1841C13.4238 21.434 12.541 21.6696 11.4263 21.9682C10.3117 22.2669 9.42984 22.5038 8.70563 22.6333C7.97226 22.7644 7.33181 22.7993 6.70368 22.6528C5.78904 22.4394 4.95804 21.9594 4.31598 21.2739C3.87501 20.8031 3.58479 20.2316 3.33161 19.5307C3.0816 18.8387 2.84617 17.9562 2.54743 16.8413L2.02985 14.9097C1.73116 13.7949 1.49438 12.9132 1.36481 12.189C1.23366 11.4555 1.19893 10.8151 1.34528 10.187C1.55856 9.2723 2.03877 8.44047 2.72419 7.79833C3.19487 7.35762 3.76687 7.06801 4.46735 6.81493C5.15926 6.56499 6.04132 6.32938 7.15583 6.03075C7.42014 5.95993 7.67154 5.89357 7.90876 5.83055C8.30038 4.43136 8.64457 3.44229 9.31598 2.72508C9.95798 2.03963 10.7891 1.55961 11.7037 1.34618ZM7.45368 7.5034C6.36187 7.79602 5.57862 8.00783 4.97712 8.22508C4.36838 8.44503 4.00986 8.64942 3.74958 8.89305C3.28069 9.3324 2.95115 9.90204 2.80524 10.5278C2.72446 10.875 2.72747 11.2872 2.84137 11.9243C2.95709 12.5713 3.17366 13.3822 3.47907 14.522L3.99665 16.4536C4.30202 17.5933 4.51946 18.4029 4.74274 19.021C4.96285 19.6302 5.16686 19.9882 5.41071 20.2485C5.85 20.7175 6.4187 21.0459 7.0445 21.1919C7.39186 21.2729 7.80442 21.2707 8.44196 21.1567C9.08886 21.041 9.89909 20.8244 11.0386 20.519C12.1781 20.2137 12.9879 19.9962 13.606 19.7729C14.2149 19.553 14.5732 19.3486 14.8336 19.105C14.9711 18.9761 15.0952 18.8343 15.2076 18.685C15.0291 18.6598 14.8448 18.6291 14.6549 18.5913C13.9778 18.4566 13.1626 18.238 12.1558 17.9682C11.0412 17.6696 10.1593 17.434 9.46735 17.1841C8.76657 16.9309 8.195 16.6406 7.72419 16.1997C7.03867 15.5576 6.55868 14.7267 6.34528 13.812C6.19881 13.1838 6.23371 12.5435 6.36481 11.81C6.49432 11.0858 6.73118 10.204 7.02985 9.08934L7.45368 7.5034ZM13.442 2.84227C12.8044 2.72829 12.3919 2.72515 12.0445 2.80614C11.4187 2.95217 10.85 3.28147 10.4107 3.75047C9.97494 4.21612 9.70535 4.93608 9.23883 6.64403C9.16305 6.9215 9.08355 7.22107 8.99665 7.5454L8.47907 9.47704C8.17374 10.6165 7.95708 11.4268 7.84137 12.0737C7.72742 12.7112 7.72427 13.1238 7.80524 13.4712C7.95124 14.097 8.28053 14.6656 8.74958 15.105C9.00993 15.3488 9.36794 15.5529 9.97712 15.7729C10.5952 15.9962 11.4048 16.2137 12.5445 16.519C13.5697 16.7937 14.3299 16.9977 14.9478 17.1206C15.5627 17.2429 15.9807 17.2731 16.3228 17.2309C16.3971 17.2218 16.4691 17.209 16.5386 17.1929C17.1644 17.0469 17.7331 16.7174 18.1724 16.2485C18.4162 15.9882 18.6204 15.6299 18.8404 15.021C19.0636 14.4029 19.2812 13.5931 19.5865 12.4536L20.1041 10.522C20.4094 9.38247 20.626 8.57219 20.7418 7.92528C20.8558 7.28764 20.8579 6.87521 20.7769 6.52782C20.6309 5.90185 20.3027 5.33342 19.8336 4.89403C19.5732 4.65015 19.2154 4.4462 18.606 4.22606C17.9879 4.0028 17.1783 3.78534 16.0386 3.47997C14.899 3.1746 14.0889 2.95798 13.442 2.84227Z\",\n  fill: color\n})) : null;\nreturn ({\n  forFollowers = false\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const emptyTitleKey = forFollowers ? 'subscriptionsFollowersEmptyTitle' : 'subscriptionsEmptyTitle';\n  const emptySubtitleKey = forFollowers ? 'subscriptionsFollowersEmptySubtitle' : 'subscriptionsEmptySubtitle';\n  const brandContent = theme.theme.component?.button?.brand?.content ?? '#FFFFFF';\n  const styles = React.useMemo(() => ({\n    root: {\n      flex: 1,\n      width: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.pageBackground\n    },\n    loadingContainer: {\n      flex: 1,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    empty: {\n      flex: 1,\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 40,\n      paddingHorizontal: 0,\n      gap: 12,\n      width: '100%',\n      minHeight: 232\n    },\n    emptyIcon: {\n      width: 68,\n      height: 68\n    },\n    emptyTextContainer: {\n      flexDirection: 'column',\n      alignItems: 'center',\n      padding: 0,\n      gap: 8,\n      width: '100%'\n    },\n    emptyTitle: {\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: 600,\n      letterSpacing: -0.7,\n      textAlign: 'center',\n      color: theme.theme.semantic.content.regular.primary,\n      fontFamily: theme.theme.typography.family.heading\n    },\n    emptySubtitle: {\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: 500,\n      letterSpacing: -0.2,\n      textAlign: 'center',\n      color: Utils.withOpacity(theme.theme.semantic.content.regular.secondary, 0.5),\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    emptyExploreButton: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      gap: 6,\n      height: 40,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B',\n      borderRadius: 12\n    },\n    emptyExploreButtonText: {\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.14,\n      color: theme.theme.component?.button?.brand?.content ?? '#FFFFFF',\n      fontFamily: theme.theme.typography?.family?.heading ?? 'Geologica'\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    duration: 250,\n    style: [styles.root, styles.loadingContainer]\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.empty\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    style: styles.emptyIcon,\n    source: Assets.banana\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.emptyTextContainer\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t(emptyTitleKey)), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptySubtitle\n  }, t(emptySubtitleKey))), /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.emptyExploreButton,\n    onPress: () => Navigation.goto({\n      name: 'Feed'\n    })\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyExploreButtonText\n  }, t('subscriptionsExploreFeed')), /*#__PURE__*/React.createElement(FeedExploreIcon, {\n    color: brandContent,\n    size: 16\n  }))));\n};"},"LiveEmptyState":{"name":"LiveEmptyState","key":"8d55ca2f9a33cd1cfae2fa76e2964ba7260fb6be8c15390600b11d04b63b4616","code":"deps: WithAppear\nreturn ({\n  topPadding = 0,\n  bottomPadding = 0\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const colors = theme?.theme;\n  const imageSource = React.useMemo(() => ({\n    uri: State.getUrl('/api/component/assets/live-empty/tv-no-signal.png')\n  }), []);\n  const styles = React.useMemo(() => {\n    const pageBg = colors.semantic?.surface?.regular?.pageBackground ?? '#FFFFFF';\n    const primary = colors.semantic?.content?.regular?.primary ?? '#04060F';\n    const secondary = colors.semantic?.content?.regular?.secondary ?? '#7B7B86';\n    const headingFont = colors.typography?.family?.heading;\n    const paragraphFont = colors.typography?.family?.paragraph;\n    return {\n      root: {\n        flex: 1,\n        width: '100%',\n        backgroundColor: pageBg,\n        paddingTop: topPadding,\n        paddingBottom: bottomPadding\n      },\n      content: {\n        flex: 1,\n        minHeight: 300,\n        alignItems: 'center',\n        justifyContent: 'center',\n        paddingHorizontal: 24,\n        transform: [{\n          translateY: -18\n        }]\n      },\n      image: {\n        width: 144,\n        height: 144,\n        marginBottom: 8\n      },\n      texts: {\n        width: '100%',\n        alignItems: 'center',\n        gap: 8\n      },\n      title: {\n        fontFamily: headingFont,\n        fontSize: 18,\n        lineHeight: 24,\n        fontWeight: '700',\n        letterSpacing: -0.7,\n        color: primary,\n        textAlign: 'center'\n      },\n      subtitle: {\n        fontFamily: paragraphFont,\n        fontSize: 14,\n        lineHeight: 20,\n        fontWeight: '500',\n        letterSpacing: -0.2,\n        color: secondary,\n        textAlign: 'center'\n      }\n    };\n  }, [bottomPadding, colors, topPadding]);\n  return /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    scale: 1,\n    duration: 250,\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(Components.DSImage, {\n    hideProgress: true,\n    source: imageSource,\n    style: styles.image,\n    resizeMode: \"contain\",\n    accessibilityIgnoresInvertColors: true\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.texts\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title,\n    numberOfLines: 2\n  }, t('liveEmptyTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.subtitle,\n    numberOfLines: 2\n  }, t('liveEmptySubtitle')))));\n};"},"StreamPausedOverlay":{"name":"StreamPausedOverlay","key":"1daff76da6fe0d166ebfc679cc9d64f959ad20ea461e27b438ec97e05663c59f","code":"const PauseIcon = React.memo(({\n  size = 40,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 40 40\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9.99999 2.083C11.5357 2.083 12.814 2.08003 13.8242 2.21581C14.8702 2.35649 15.8152 2.66699 16.5742 3.42577C17.333 4.18475 17.6425 5.12975 17.7832 6.17577C17.919 7.18603 17.916 8.46425 17.916 9.99999V30C17.916 31.5357 17.919 32.814 17.7832 33.8242C17.6425 34.8704 17.3332 35.8152 16.5742 36.5742C15.8152 37.3332 14.8704 37.6425 13.8242 37.7832C12.814 37.919 11.5357 37.916 9.99999 37.916C8.46425 37.916 7.18603 37.919 6.17577 37.7832C5.12975 37.6425 4.18475 37.333 3.42577 36.5742C2.66699 35.8152 2.35649 34.8702 2.21581 33.8242C2.08003 32.814 2.083 31.5357 2.083 30V9.99999C2.083 8.46427 2.08002 7.18602 2.21581 6.17577C2.35651 5.12956 2.66673 4.18482 3.42577 3.42577C4.18482 2.66673 5.12956 2.35651 6.17577 2.21581C7.18602 2.08002 8.46427 2.083 9.99999 2.083ZM9.99999 4.583C8.39354 4.583 7.31378 4.58611 6.50878 4.69433C5.73988 4.79774 5.41052 4.97618 5.19335 5.19335C4.97618 5.41052 4.79774 5.73988 4.69433 6.50878C4.58611 7.31378 4.583 8.39354 4.583 9.99999V30C4.583 31.606 4.5862 32.6853 4.69433 33.4902C4.79765 34.2587 4.97638 34.5885 5.19335 34.8057C5.41051 35.0228 5.73994 35.2022 6.50878 35.3057C7.31377 35.4139 8.39359 35.416 9.99999 35.416C11.606 35.416 12.6853 35.4138 13.4902 35.3057C14.2593 35.2023 14.5885 35.0229 14.8057 34.8057C15.0229 34.5885 15.2023 34.2593 15.3057 33.4902C15.4138 32.6853 15.416 31.606 15.416 30V9.99999C15.416 8.39359 15.4139 7.31377 15.3057 6.50878C15.2022 5.73994 15.0228 5.41051 14.8057 5.19335C14.5885 4.97638 14.2587 4.79765 13.4902 4.69433C12.6853 4.5862 11.606 4.583 9.99999 4.583Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: 0.5,\n  d: \"M30 2.083C31.5357 2.083 32.814 2.08003 33.8242 2.21581C34.8702 2.35649 35.8152 2.66699 36.5742 3.42577C37.333 4.18475 37.6425 5.12975 37.7832 6.17577C37.919 7.18603 37.916 8.46425 37.916 9.99999V30C37.916 31.5357 37.919 32.814 37.7832 33.8242C37.6425 34.8704 37.3332 35.8152 36.5742 36.5742C35.8152 37.3332 34.8704 37.6425 33.8242 37.7832C32.814 37.919 31.5357 37.916 30 37.916C28.4643 37.916 27.186 37.919 26.1758 37.7832C25.1297 37.6425 24.1847 37.333 23.4258 36.5742C22.667 35.8152 22.3565 34.8702 22.2158 33.8242C22.08 32.814 22.083 31.5357 22.083 30V9.99999C22.083 8.46427 22.08 7.18602 22.2158 6.17577C22.3565 5.12956 22.6667 4.18482 23.4258 3.42577C24.1848 2.66673 25.1296 2.35651 26.1758 2.21581C27.186 2.08002 28.4643 2.083 30 2.083ZM30 4.583C28.3935 4.583 27.3138 4.58611 26.5088 4.69433C25.7399 4.79774 25.4105 4.97618 25.1934 5.19335C24.9762 5.41052 24.7977 5.73988 24.6943 6.50878C24.5861 7.31378 24.583 8.39354 24.583 9.99999V30C24.583 31.606 24.5862 32.6853 24.6943 33.4902C24.7977 34.2587 24.9764 34.5885 25.1934 34.8057C25.4105 35.0228 25.7399 35.2022 26.5088 35.3057C27.3138 35.4139 28.3936 35.416 30 35.416C31.606 35.416 32.6853 35.4138 33.4902 35.3057C34.2593 35.2023 34.5885 35.0229 34.8057 34.8057C35.0229 34.5885 35.2023 34.2593 35.3057 33.4902C35.4138 32.6853 35.416 31.606 35.416 30V9.99999C35.416 8.39359 35.4139 7.31377 35.3057 6.50878C35.2022 5.73994 35.0228 5.41051 34.8057 5.19335C34.5885 4.97638 34.2587 4.79765 33.4902 4.69433C32.6853 4.5862 31.606 4.583 30 4.583Z\",\n  fill: color\n})));\nconst PlayIcon = React.memo(({\n  size = 16,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M1.5 3.35518C1.50032 1.41877 3.61173 0.230977 5.30371 1.15107L13.8447 5.79658C15.6071 6.75535 15.6073 9.24626 13.8447 10.2048L5.30371 14.8493C3.61176 15.7693 1.50035 14.5815 1.5 12.6452V3.35518ZM4.8252 2.02998C3.76781 1.4552 2.50033 2.21324 2.5 3.35518V12.6452C2.50035 13.7871 3.76783 14.5452 4.8252 13.9704L13.3672 9.32588C14.4332 8.74589 14.4332 7.25451 13.3672 6.67451L4.8252 2.02998Z\",\n  fill: color\n})));\nconst PauseBlurView = ExpoBlur?.BlurView ?? null;\nreturn ({\n  owner = false,\n  onResume,\n  zIndex = 5,\n  videoGridSafeArea = false\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const headingFont = theme.theme.typography?.family?.heading;\n  const paragraphFont = theme.theme.typography?.family?.paragraph;\n  const styles = React.useMemo(() => ({\n    root: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      zIndex,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    blur: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0\n    },\n    shade: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      backgroundColor: owner ? 'rgba(4,6,15,0.5)' : 'rgba(4,6,15,0.32)'\n    },\n    content: {\n      width: '100%',\n      alignItems: 'center',\n      gap: 12,\n      zIndex: 1,\n      paddingHorizontal: 12\n    },\n    copy: {\n      width: '100%',\n      alignItems: 'center',\n      gap: 2\n    },\n    title: {\n      width: '100%',\n      color: '#FFFFFF',\n      fontFamily: headingFont,\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'center'\n    },\n    description: {\n      width: '100%',\n      color: 'rgba(255,255,255,0.6)',\n      fontFamily: paragraphFont,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    button: {\n      height: 40,\n      borderRadius: 999,\n      paddingHorizontal: 16,\n      paddingVertical: 10,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 6,\n      backgroundColor: theme.theme.component.button.brand.bgDefault ?? '#FE375B'\n    },\n    buttonText: {\n      color: theme.theme.component.button.brand.content ?? '#FFFFFF',\n      fontFamily: headingFont,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.14\n    }\n  }), [headingFont, owner, paragraphFont, theme, zIndex]);\n  const Root = videoGridSafeArea ? Components.VideoGridSafeArea : ReactNative.View;\n  return /*#__PURE__*/React.createElement(Root, {\n    pointerEvents: owner ? 'box-none' : 'none',\n    style: styles.root\n  }, PauseBlurView ? /*#__PURE__*/React.createElement(PauseBlurView, {\n    pointerEvents: \"none\",\n    style: styles.blur,\n    intensity: 65,\n    tint: \"dark\",\n    blurReductionFactor: 2,\n    experimentalBlurMethod: ReactNative.Platform.OS === 'android' ? 'dimezisBlurView' : undefined\n  }) : null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    pointerEvents: \"none\",\n    style: styles.shade\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content,\n    pointerEvents: owner ? 'box-none' : 'none'\n  }, /*#__PURE__*/React.createElement(PauseIcon, null), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.copy\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('streamingPausedTitle') || 'Stream is paused'), owner ? /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('streamingPausedDescription') || 'Your camera and microphone\\nare temporarily turned off') : null), owner ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.button,\n    onPress: onResume\n  }, /*#__PURE__*/React.createElement(PlayIcon, null), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.buttonText,\n    numberOfLines: 1\n  }, t('streamingResumeStream') || 'Resume stream')) : null));\n};"},"StreamChatUserMenu":{"name":"StreamChatUserMenu","key":"0d9c47dbc9a27b0c12ebcaed859ad2cb34948e8d4366a94344dfc349102d9fa7","code":"deps: WithAppear\nconst MENU_WIDTH = 160;\nconst MENU_HEIGHT = 132;\nconst MENU_GAP = 6;\nreturn ({\n  visible,\n  layout,\n  onClose,\n  onMessage,\n  onRemoveUser\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const safeArea = SafeArea?.useSafeAreaInsets?.() ?? {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0\n  };\n  const {\n    width: screenWidth,\n    height: screenHeight\n  } = ReactNative.useWindowDimensions();\n  const bgColor = theme.theme.component?.dropdown?.bg || '#FFFFFF';\n  const contentDefault = theme.theme.component?.dropdown?.contentDefault || '#38404A';\n  const contentDangerous = theme.theme.component?.dropdown?.contentDangerous || '#E83B3B';\n  const dividerColor = theme.theme.component?.dropdown?.divider || '#E5E8EC';\n  const paragraphFont = theme.theme.typography?.family?.paragraph || 'Inter';\n  const safeTop = safeArea.top ?? 0;\n  const safeBottom = safeArea.bottom ?? 0;\n  const safeLeft = safeArea.left ?? 0;\n  const safeRight = safeArea.right ?? 0;\n  const androidWindowOffset = ReactNative.Platform.OS === 'android' ? safeTop : 0;\n  const anchorTop = (layout?.y ?? 0) + androidWindowOffset;\n  const anchorBottom = anchorTop + (layout?.height ?? 0);\n  const spaceBelow = screenHeight - safeBottom - anchorBottom - MENU_GAP;\n  const spaceAbove = anchorTop - safeTop - MENU_GAP;\n  const showAbove = layout != null && spaceBelow < MENU_HEIGHT && spaceAbove >= MENU_HEIGHT;\n  const rawTop = showAbove ? anchorTop - MENU_HEIGHT - MENU_GAP : anchorBottom + MENU_GAP;\n  const maxTop = Math.max(safeTop, screenHeight - safeBottom - MENU_HEIGHT);\n  const menuTop = Math.max(safeTop, Math.min(rawTop, maxTop));\n  const rawLeft = layout?.x ?? safeLeft;\n  const maxLeft = Math.max(safeLeft, screenWidth - safeRight - MENU_WIDTH);\n  const menuLeft = Math.max(safeLeft, Math.min(rawLeft, maxLeft));\n  const styles = React.useMemo(() => ({\n    overlay: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      zIndex: 200\n    },\n    menu: {\n      position: 'absolute',\n      top: menuTop,\n      left: menuLeft,\n      width: MENU_WIDTH,\n      height: MENU_HEIGHT,\n      overflow: 'hidden',\n      backgroundColor: bgColor,\n      borderRadius: 16,\n      zIndex: 201,\n      shadowColor: '#04060F',\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      elevation: 10\n    },\n    row: {\n      width: '100%',\n      height: 44,\n      paddingHorizontal: 16,\n      justifyContent: 'center',\n      backgroundColor: bgColor\n    },\n    rowWithDivider: {\n      borderBottomWidth: 1,\n      borderBottomColor: dividerColor\n    },\n    rowText: {\n      color: contentDefault,\n      fontFamily: paragraphFont,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '500',\n      letterSpacing: -0.3\n    },\n    dangerousText: {\n      color: contentDangerous\n    }\n  }), [bgColor, contentDangerous, contentDefault, dividerColor, menuLeft, menuTop, paragraphFont]);\n  const handleAction = React.useCallback(action => {\n    action?.();\n    onClose?.();\n  }, [onClose]);\n  if (!visible || layout == null) return null;\n  return /*#__PURE__*/React.createElement(Portal, {\n    hostName: \"overview\"\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.overlay,\n    onPress: onClose\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: true,\n    scale: 0.95,\n    duration: 120,\n    translateY: showAbove ? 16 : -16,\n    style: styles.menu\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: [styles.row, styles.rowWithDivider],\n    onPress: () => handleAction(onMessage)\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, t('chatInputPlaceholder'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: [styles.row, styles.rowWithDivider],\n    onPress: () => handleAction(onRemoveUser)\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, t('streamChatMenuRemoveUser'))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.row,\n    accessibilityState: {\n      disabled: true\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.rowText, styles.dangerousText],\n    numberOfLines: 1\n  }, t('chatMenuBlock')))));\n};"},"StreamViewerRemoveConfirmModal":{"name":"StreamViewerRemoveConfirmModal","key":"b43e28eab8c8f0f1088913f78e339526bcd3cbc06383666a71dc5d5b45ec0fe1","code":"deps: Avatar\nconst CloseIcon = ({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6.47 6.47C6.763 6.177 7.237 6.177 7.53 6.47L12 10.94L16.47 6.47C16.763 6.177 17.237 6.177 17.53 6.47C17.823 6.763 17.823 7.237 17.53 7.53L13.06 12L17.53 16.47C17.823 16.763 17.823 17.237 17.53 17.53C17.237 17.823 16.763 17.823 16.47 17.53L12 13.06L7.53 17.53C7.237 17.823 6.763 17.823 6.47 17.53C6.177 17.237 6.177 16.763 6.47 16.47L10.94 12L6.47 7.53Z\",\n  fill: color\n}));\nreturn ({\n  user\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const sheet = Sheet.useSheet();\n  const meta = State.api?.users?.sanitizeMeta?.(user) ?? user;\n  const photo = meta?.photos?.[0] ?? meta?.card?.mainPhoto ?? null;\n  const th = theme.theme;\n  const surface = th.semantic?.surface?.regular?.surface1 ?? '#FFFFFF';\n  const primary = th.semantic?.content?.regular?.primary ?? '#04060F';\n  const secondary = th.semantic?.content?.regular?.secondary ?? 'rgba(4,6,15,0.5)';\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      maxWidth: 600,\n      alignSelf: 'center',\n      overflow: 'hidden',\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24,\n      backgroundColor: surface,\n      paddingBottom: Math.max(safeArea.bottom, 24)\n    },\n    header: {\n      width: '100%',\n      height: 56,\n      paddingTop: 12,\n      paddingBottom: 4,\n      paddingHorizontal: 16,\n      alignItems: 'flex-end',\n      justifyContent: 'center'\n    },\n    closeButton: {\n      width: 40,\n      height: 40,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    content: {\n      width: '100%',\n      alignItems: 'center',\n      gap: 4,\n      paddingHorizontal: 16,\n      paddingVertical: 16\n    },\n    avatar: {\n      marginBottom: 12\n    },\n    title: {\n      width: '100%',\n      color: primary,\n      fontFamily: th.typography?.family?.heading,\n      fontSize: 20,\n      lineHeight: 28,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      textAlign: 'center'\n    },\n    description: {\n      width: '100%',\n      color: secondary,\n      fontFamily: th.typography?.family?.paragraph,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      textAlign: 'center'\n    },\n    actions: {\n      width: '100%',\n      gap: 8,\n      paddingTop: 4,\n      paddingHorizontal: 16\n    },\n    cancelButton: {\n      width: '100%',\n      height: 48,\n      borderRadius: 12,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    cancelText: {\n      color: th.component?.button?.ghost?.content ?? primary,\n      fontFamily: th.typography?.family?.heading,\n      fontSize: 16,\n      lineHeight: 20,\n      fontWeight: '600',\n      letterSpacing: -0.16\n    }\n  }), [primary, safeArea.bottom, secondary, surface, th]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.closeButton,\n    onPress: () => sheet.close(false)\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    color: primary\n  }))), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.avatar\n  }, /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"Avatar\",\n    size: 60,\n    photo: photo\n  })), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('streamViewerRemoveConfirmTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.description\n  }, t('streamViewerRemoveConfirmDescription'))), /*#__PURE__*/React.createElement(Reanimated.View, {\n    style: [styles.actions, sheet.stickyBottomStyle]\n  }, /*#__PURE__*/React.createElement(Components.DSButton, {\n    type: \"brand\",\n    size: \"L\",\n    style: {\n      width: '100%'\n    },\n    onPress: () => sheet.close(true)\n  }, t('streamViewerRemoveButton')), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: styles.cancelButton,\n    onPress: () => sheet.close(false)\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.cancelText\n  }, t('cancel')))));\n};"},"StreamViewerRemovedToast":{"name":"StreamViewerRemovedToast","key":"4ea6d2a4a1db6351009a470b51a9409dff43a4b7638ced4e90b8ed838f2c58a0","code":"const TrashIcon = ({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M15.876 8.31643C17.4086 8.31643 18.1751 8.31591 18.6289 8.81545C19.0827 9.3151 19.0321 10.1037 18.9316 11.6807L18.665 15.8692C18.48 18.7751 18.3879 20.2284 17.4834 21.1143C16.5788 22.0002 15.187 22 12.4043 22H11.5957C8.81299 22 7.42124 22.0002 6.5166 21.1143C5.61213 20.2284 5.52003 18.7751 5.33496 15.8692L5.06836 11.6807C4.96793 10.1037 4.91727 9.3151 5.37109 8.81545C5.82493 8.31591 6.59138 8.31643 8.12402 8.31643H15.876ZM9.42578 11.4815C9.01363 11.5248 8.7127 11.9119 8.75391 12.3457L9.25391 17.6094C9.29534 18.0429 9.66236 18.3586 10.0742 18.3154C10.4863 18.2721 10.7871 17.8859 10.7461 17.4522L10.2461 12.1885C10.2048 11.7549 9.83771 11.4383 9.42578 11.4815ZM14.5742 11.4815C14.1623 11.4383 13.7952 11.7549 13.7539 12.1885L13.2539 17.4522C13.2129 17.8859 13.5137 18.2721 13.9258 18.3154C14.3376 18.3586 14.7047 18.0429 14.7461 17.6094L15.2461 12.3457C15.2873 11.9119 14.9864 11.5248 14.5742 11.4815ZM13.7393 2.00002C13.9618 1.99986 14.1558 1.99998 14.3389 2.03322C15.0621 2.16462 15.688 2.67738 16.0264 3.41603C16.112 3.60305 16.1729 3.8126 16.2432 4.05275L16.3584 4.44435C16.3778 4.5105 16.383 4.52913 16.3877 4.54396C16.5678 5.11018 17.1279 5.49355 17.6572 5.50881H20.2285C20.6545 5.50881 20.9999 5.90142 21 6.38576C21 6.87022 20.6546 7.26369 20.2285 7.26369H3.77148C3.34544 7.26369 3 6.87022 3 6.38576C3.00012 5.90142 3.34551 5.50881 3.77148 5.50881H6.43555C6.9649 5.49355 7.43218 5.11018 7.6123 4.54396C7.61702 4.52913 7.6222 4.51054 7.6416 4.44435L7.75684 4.05275C7.82709 3.8126 7.88799 3.60305 7.97363 3.41603C8.31193 2.6774 8.93793 2.16467 9.66113 2.03322C9.84415 1.99999 10.0383 1.99986 10.2607 2.00002H13.7393Z\",\n  fill: color\n}));\nconst CloseIcon = ({\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M6.47 6.47C6.763 6.177 7.237 6.177 7.53 6.47L12 10.94L16.47 6.47C16.763 6.177 17.237 6.177 17.53 6.47C17.823 6.763 17.823 7.237 17.53 7.53L13.06 12L17.53 16.47C17.823 16.763 17.823 17.237 17.53 17.53C17.237 17.823 16.763 17.823 16.47 17.53L12 13.06L7.53 17.53C7.237 17.823 6.763 17.823 6.47 17.53C6.177 17.237 6.177 16.763 6.47 16.47L10.94 12L6.47 7.53Z\",\n  fill: color\n}));\nreturn ({\n  notificationKey\n}) => {\n  const t = Locale.useTranslation();\n  const theme = Theme.useTheme();\n  const primary = theme.theme.component?.toast?.contentPrimary ?? '#04060F';\n  const secondary = theme.theme.component?.toast?.contentSecondary ?? 'rgba(4,6,15,0.5)';\n  const paragraph = theme.theme.typography?.family?.paragraph;\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: 280,\n      maxWidth: '100%',\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      gap: 4\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      gap: 4\n    }\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'flex-start',\n      gap: 8\n    }\n  }, /*#__PURE__*/React.createElement(TrashIcon, {\n    color: primary\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      flex: 1,\n      color: primary,\n      fontFamily: paragraph,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '700',\n      letterSpacing: -0.2\n    }\n  }, t('streamViewerRemovedToastTitle'))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    style: {\n      width: 24,\n      height: 24,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    onPress: () => Notification.hideNotificationByKey(notificationKey)\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    color: primary\n  }))), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: {\n      paddingLeft: 32,\n      color: secondary,\n      fontFamily: paragraph,\n      fontSize: 14,\n      lineHeight: 24,\n      fontWeight: '500',\n      letterSpacing: -0.2\n    }\n  }, t('streamViewerRemovedToastDescription')));\n};"},"VideoChatSkipButton":{"name":"VideoChatSkipButton","key":"9f5d40e3df161671c4f3fb8e54fea196a7e8618e5b4851931f371a456a5cf54e","code":"deps:\nreturn ({\n  disabled = false\n}) => {\n  const theme = Theme.useTheme();\n  const {\n    bottom\n  } = SafeArea.useSafeAreaInsets();\n  const handlePress = React.useCallback(() => {\n    Components.nextAnimation();\n  }, []);\n  const styles = React.useMemo(() => ({\n    button: {\n      width: 56,\n      height: 56,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component.buttonVideochat.brand.bgDefault\n    },\n    icon: {\n      color: theme.theme.component.buttonVideochat.brand.contentDefault\n    }\n  }), [theme]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    disabled: disabled,\n    style: styles.button,\n    onPress: disabled ? undefined : handlePress\n  }, /*#__PURE__*/React.createElement(Assets.Skip, {\n    size: 32,\n    style: styles.icon\n  }));\n};"},"VideoChatGiftButton":{"name":"VideoChatGiftButton","key":"2061dfa6b2e185bc0e8ad6931059f7e523cf82e214b2968c0a07adc9a3ff503f","code":"deps: GiftsCatalogSheet\nconst GiftIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11 22.0001H7C6.20435 22.0001 5.44152 21.6838 4.87891 21.1212C4.31632 20.5586 4 19.7957 4 19.0001V15.0001C4.00002 14.7349 4.10545 14.4806 4.29297 14.2931C4.4805 14.1055 4.7348 14.0001 5 14.0001H11V22.0001ZM19 14.0001C19.2652 14.0001 19.5195 14.1055 19.707 14.2931C19.8946 14.4806 20 14.7349 20 15.0001V19.0001C20 19.7957 19.6837 20.5586 19.1211 21.1212C18.5585 21.6838 17.7956 22.0001 17 22.0001H13V14.0001H19ZM16.5 2.00009C17.0904 1.99997 17.6713 2.14903 18.1885 2.43369C18.7058 2.71849 19.1433 3.12996 19.459 3.629C19.7746 4.12796 19.9584 4.69886 19.9941 5.28818C20.0299 5.87758 19.9161 6.46658 19.6631 7.00009H20C20.5304 7.00009 21.039 7.21098 21.4141 7.58603C21.7891 7.96109 22 8.46968 22 9.00009V10.0001C22 10.5305 21.7891 11.0391 21.4141 11.4142C21.039 11.7892 20.5304 12.0001 20 12.0001H13V7.00009H11V12.0001H4C3.46957 12.0001 2.96101 11.7892 2.58594 11.4142C2.21088 11.0391 2 10.5305 2 10.0001V9.00009C2.00002 8.46968 2.21088 7.96109 2.58594 7.58603C2.96101 7.21098 3.46958 7.00009 4 7.00009H4.33691C4.11482 6.53127 3.99977 6.01886 4 5.50009C4.00003 3.56712 5.56742 2.00009 7.4834 2.00009C9.23816 1.97027 10.7953 3.09197 11.8643 4.93369L12 5.17685C13.033 3.26299 14.5601 2.06304 16.291 2.00205L16.5 2.00009ZM7.5 4.00009C7.10219 4.00009 6.72075 4.15826 6.43945 4.43955C6.15816 4.72083 6.00002 5.10229 6 5.50009C6 5.8979 6.15817 6.27934 6.43945 6.56064C6.72076 6.84194 7.10218 7.00009 7.5 7.00009H10.6426C9.90157 5.09521 8.69396 3.98009 7.5 4.00009ZM16.4834 4.00009C15.3034 3.98009 14.0984 5.09621 13.3574 7.00009H16.5C16.8978 6.99784 17.2789 6.83768 17.5586 6.55478C17.8382 6.2719 17.9935 5.88902 17.9912 5.4913C17.9889 5.09361 17.8287 4.71331 17.5459 4.43369C17.2631 4.15409 16.8811 3.99794 16.4834 4.00009Z\",\n  fill: color\n})));\nreturn ({\n  peer,\n  visible = true\n}) => {\n  const theme = Theme.useTheme();\n  const [call] = Hooks.useBehaviorSubject(State.state.call);\n  const [peers] = Hooks.useBehaviorSubject(State.state.peers);\n  const session = State.api?.session?.useSession?.();\n  const enableGifts = State.api.ff.useFF('enableGifts');\n  const peerMeta = React.useMemo(() => {\n    const currentUserId = session?.user?.id;\n    const providedMeta = peer?.meta;\n    const providedUserId = providedMeta?.user?.id ?? providedMeta?.userId ?? providedMeta?.id;\n    if (providedUserId != null && String(providedUserId) !== String(currentUserId ?? '')) {\n      return providedMeta;\n    }\n    return peers?.find(item => {\n      const id = item?.meta?.user?.id ?? item?.meta?.userId ?? item?.meta?.id;\n      return id != null && String(id) !== String(currentUserId ?? '');\n    })?.meta ?? null;\n  }, [peer?.meta, peers, session?.user?.id]);\n  const peerUserId = peerMeta?.user?.id ?? peerMeta?.userId ?? peerMeta?.id ?? null;\n  const canSendGift = visible && enableGifts && !!call && peerUserId != null;\n  const openGiftsSheet = React.useCallback(() => {\n    if (!canSendGift) return;\n    if (State.api?.guest?.isGuestSession?.()) {\n      State.api?.guest?.openRegisterSheet('restricted_action', 'gift');\n      return;\n    }\n    State.api?.gifts?.startGiftFlow?.({\n      receiverId: peerUserId,\n      entrySource: 'video_chat',\n      returnPoint: 'video_chat'\n    });\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"GiftsCatalogSheet\"\n    }), {\n      theme: 'dark',\n      props: {\n        holderMode: true,\n        backdropColor: 'transparent',\n        sheetStyle: {\n          backgroundColor: 'transparent'\n        },\n        contentStyle: {\n          backgroundColor: 'transparent'\n        },\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [canSendGift, peerUserId]);\n  const styles = React.useMemo(() => ({\n    button: {\n      minHeight: 56,\n      minWidth: 56,\n      padding: 12,\n      borderRadius: 999,\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B'\n    },\n    icon: {\n      color: theme.theme.component?.button?.brand?.content ?? '#FFFFFF'\n    }\n  }), [theme]);\n  if (!canSendGift) return null;\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.button,\n    scale: 0.7,\n    noloading: true,\n    onPress: openGiftsSheet\n  }, /*#__PURE__*/React.createElement(GiftIcon, {\n    size: 28,\n    color: styles.icon.color\n  }));\n};"},"CameraSidePanel":{"name":"CameraSidePanel","key":"6503c2fe6958225e15cbf51915ca33b318ba9ab701bbc84ffd8b9d9008da6426","code":"deps: CallHistoryModal, VideoChatGiftButton\nfunction _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst majorVersionIOS = parseInt(ReactNative.Platform.Version, 10);\nconst isAndroidNative = ReactNative.Platform.OS === \"android\";\nconst Blur = ReactNative.Platform.OS === \"web\" ? ExpoBlur.BlurView : isAndroidNative ? ReactNative.View : (ReactNative.Platform.OS === \"ios\" && majorVersionIOS >= 26 ? ReactBlur?.LiquidGlassView : ReactBlur?.BlurView) ?? ReactNative.View;\n// const Blur = ReactNative.Platform.OS === 'web' ? ExpoBlur.BlurView : (ReactBlur?.BlurView ?? ReactNative.View);\nconst blurSurfaceProps = isAndroidNative ? {} : {\n  tint: \"dark\",\n  blurType: \"dark\",\n  blurAmount: 20,\n  overlayColor: \"#00000066\",\n  glassType: \"clear\",\n  glassTintColor: \"#000000\",\n  glassOpacity: 0.05\n};\nconst MicIcon = React.memo(({\n  size\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 28 28\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M23.333 9.33301C23.8161 9.33301 24.2078 9.72491 24.208 10.208V12.542C24.2078 17.885 20.1032 22.2691 14.875 22.7129V25.958C14.875 26.4413 14.4832 26.833 14 26.833C13.5168 26.833 13.125 26.4413 13.125 25.958V22.7129C7.89681 22.2691 3.79216 17.885 3.79199 12.542V10.208C3.79217 9.72491 4.18385 9.33301 4.66699 9.33301C5.14998 9.33318 5.54182 9.72502 5.54199 10.208V12.542C5.54217 17.2133 9.3287 21 14 21C18.6713 21 22.4578 17.2133 22.458 12.542V10.208C22.4582 9.72502 22.85 9.33318 23.333 9.33301Z\",\n  fill: \"#FAFBFB\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.5\",\n  d: \"M14 1.16699C17.7049 1.16699 20.708 4.17009 20.708 7.875V12.542C20.7078 16.2468 17.7048 19.25 14 19.25C10.2952 19.25 7.29217 16.2468 7.29199 12.542V7.875C7.29199 4.17009 10.2951 1.16699 14 1.16699Z\",\n  fill: \"#FAFBFB\"\n})));\nconst MicOffIcon = React.memo(({\n  size\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 28 28\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.5\",\n  d: \"M23.333 9.33301C23.8161 9.33301 24.2078 9.72491 24.208 10.208V12.542C24.2078 17.885 20.1032 22.27 14.875 22.7139V25.958C14.875 26.4413 14.4832 26.833 14 26.833C13.5168 26.833 13.125 26.4413 13.125 25.958V22.7139C11.3288 22.5614 9.66599 21.9423 8.25586 20.9805L9.52051 19.7158C10.8197 20.5287 12.3545 21 14 21C18.6713 21 22.4578 17.2133 22.458 12.542V10.208C22.4582 9.72502 22.85 9.33318 23.333 9.33301Z\",\n  fill: \"#ED6262\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.5\",\n  d: \"M20.708 12.542C20.7078 16.2468 17.7048 19.25 14 19.25C12.8406 19.25 11.7503 18.9552 10.7988 18.4375L20.708 8.5293V12.542Z\",\n  fill: \"#ED6262\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M13.9997 1.16699C17.145 1.16699 19.7828 3.33214 20.5085 6.25293L23.8805 2.88086C24.2221 2.53927 24.7771 2.53951 25.1188 2.88086C25.4603 3.22259 25.4604 3.77751 25.1188 4.11914L4.11881 25.1191C3.77716 25.4606 3.22219 25.4605 2.88052 25.1191C2.53923 24.7775 2.53912 24.2225 2.88052 23.8809L6.89224 19.8691C4.98017 18.0138 3.79175 15.4166 3.79166 12.542V10.208C3.79183 9.72503 4.18368 9.33321 4.66666 9.33301C5.14965 9.33318 5.54148 9.72502 5.54166 10.208V12.542C5.54175 14.9334 6.53594 17.0915 8.1315 18.6299L9.36978 17.3916C8.09078 16.1701 7.29175 14.4502 7.29166 12.542V7.875C7.29166 4.17021 10.2949 1.16719 13.9997 1.16699Z\",\n  fill: \"#ED6262\"\n})));\nconst HistoryIcon = React.memo(({\n  size = 20\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.5\",\n  d: \"M10 1.66699C14.6024 1.66699 18.333 5.39763 18.333 10C18.333 14.6024 14.6024 18.333 10 18.333C5.39763 18.333 1.66699 14.6024 1.66699 10C1.66699 5.39763 5.39763 1.66699 10 1.66699Z\",\n  fill: \"#FAFBFB\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M10 6.04199C10.3452 6.04199 10.625 6.32181 10.625 6.66699V9.74121L12.5254 11.6416C12.7693 11.8857 12.7694 12.2814 12.5254 12.5254C12.2814 12.7694 11.8857 12.7693 11.6416 12.5254L9.55762 10.4424C9.44041 10.3252 9.375 10.1658 9.375 10V6.66699C9.375 6.32181 9.65482 6.04199 10 6.04199Z\",\n  fill: \"#FAFBFB\"\n})));\nconst PipInactiveIcon = React.memo(({\n  size = 20\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.5\",\n  d: \"M17.5 13.4473C17.5 15.3572 17.5 16.3128 16.502 16.9063C15.5035 17.4997 13.8958 17.5 10.6816 17.5H9.31836C6.10424 17.5 4.49655 17.4997 3.49805 16.9062C2.50002 16.3128 2.5 15.3572 2.5 13.4473V13.333C3.64932 13.4474 5.176 13.4473 7.27246 13.4473L12.7275 13.4473C14.824 13.4473 16.3507 13.4474 17.5 13.333V13.4473Z\",\n  fill: \"white\"\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M13.333 3.33301C15.69 3.33301 16.8693 3.3332 17.6016 4.06543C18.3336 4.79764 18.333 5.97638 18.333 8.33301V9.16699C18.333 11.5236 18.3336 12.7024 17.6016 13.4346C16.8693 14.1668 15.69 14.167 13.333 14.167L6.66699 14.167C4.30997 14.167 3.13067 14.1668 2.39844 13.4346C1.6664 12.7024 1.66699 11.5236 1.66699 9.16699V8.33301C1.66699 5.97638 1.6664 4.79764 2.39844 4.06543C3.13067 3.3332 4.30997 3.33301 6.66699 3.33301L13.333 3.33301Z\",\n  fill: \"white\"\n})));\nreturn ({\n  hasBottomPanel,\n  showGift = true\n}) => {\n  const theme = Theme.useTheme();\n  const [isPipLocal, setIsPipLocal] = Hooks.useBehaviorSubject(State.state.isPipLocal);\n  const [isTablet] = Hooks.useBehaviorSubject(State.store.isTablet);\n  const [mute, setMute] = Hooks.useBehaviorSubject(State.state.mute);\n  const [isSearching] = Hooks.useBehaviorSubject(State.state.isSearching);\n  const {\n    bottom\n  } = SafeArea.useSafeAreaInsets();\n  const toggleMute = React.useCallback(() => {\n    setMute(!mute);\n  }, [mute]);\n  const openCallHistory = React.useCallback(() => {\n    if (State.api?.guest?.isGuestSession?.()) {\n      State.api?.guest?.openRegisterSheet('restricted_action', 'profile');\n      return;\n    }\n    Sheet.showSheet(/*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"CallHistoryModal\"\n    }), {\n      theme: Theme.isDark.value ? \"dark\" : \"light\",\n      props: {\n        style: {\n          maxWidth: 600,\n          overflow: \"visible\"\n        }\n      }\n    });\n  }, []);\n  const bottomPadding = Hooks.useAnimatedNumber(hasBottomPanel ? 80 : ReactNative.Platform.OS === 'android' ? 130 : 80);\n  const styles = React.useMemo(() => ({\n    container: {\n      width: \"100%\",\n      alignItems: \"flex-end\",\n      justifyContent: \"flex-end\"\n    },\n    panelWrapperRight: {\n      position: \"absolute\",\n      right: 12,\n      bottom: bottomPadding,\n      flexDirection: \"column\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      gap: 8\n    },\n    sidePanel: {\n      flexDirection: \"column\",\n      alignItems: \"center\",\n      justifyContent: \"center\",\n      borderRadius: 999,\n      backgroundColor: theme.theme.semantic.surface.alfa.static.stSurface4\n    },\n    button: {\n      minHeight: 40,\n      minWidth: 40,\n      padding: 12,\n      borderRadius: 999,\n      flexDirection: \"column\",\n      alignItems: \"center\",\n      justifyContent: \"center\"\n    },\n    icon: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary\n    }\n  }), [theme, bottomPadding]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.container\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.panelWrapperRight,\n    pointerEvents: \"auto\"\n  }, /*#__PURE__*/React.createElement(Blur, _extends({}, blurSurfaceProps, {\n    style: [styles.sidePanel, {\n      paddingVertical: 4\n    }]\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.button,\n    scale: 0.7,\n    noloading: true,\n    onPress: State.switchCamera\n  }, /*#__PURE__*/React.createElement(Assets.Update, {\n    size: 22,\n    style: styles.icon\n  })), !isTablet && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.button,\n    scale: 0.7,\n    noloading: true,\n    onPress: _async(function () {\n      setIsPipLocal(!isPipLocal);\n      return _await();\n    })\n  }, isPipLocal ? /*#__PURE__*/React.createElement(Assets.Pip, {\n    size: 22,\n    style: styles.icon\n  }) : /*#__PURE__*/React.createElement(PipInactiveIcon, {\n    size: 22,\n    style: styles.icon\n  })), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.button,\n    scale: 0.7,\n    noloading: true,\n    onPress: openCallHistory\n  }, /*#__PURE__*/React.createElement(HistoryIcon, {\n    size: 20\n  }))), /*#__PURE__*/React.createElement(Blur, _extends({}, blurSurfaceProps, {\n    style: [styles.sidePanel, {\n      padding: 2\n    }]\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.button,\n    scale: 0.7,\n    noloading: true,\n    onPress: toggleMute\n  }, mute ? /*#__PURE__*/React.createElement(MicOffIcon, {\n    size: 28,\n    style: styles.icon\n  }) : /*#__PURE__*/React.createElement(MicIcon, {\n    size: 28,\n    style: styles.icon\n  }))), showGift && /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"VideoChatGiftButton\"\n  })));\n};"},"VerticalVolumeSlider":{"name":"VerticalVolumeSlider","key":"e99215e966539ec2d72f34756b5f3c300931699982a7b79ffa2df1bc5ab6faa7","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nconst majorVersionIOS = parseInt(ReactNative.Platform.Version, 10);\nconst isAndroidNative = ReactNative.Platform.OS === \"android\";\nconst Blur = ReactNative.Platform.OS === \"web\" ? ExpoBlur.BlurView : isAndroidNative ? ReactNative.View : (ReactNative.Platform.OS === \"ios\" && majorVersionIOS >= 26 ? ReactBlur?.LiquidGlassView : ReactBlur?.BlurView) ?? ReactNative.View;\nconst blurSurfaceProps = isAndroidNative ? {} : {\n  tint: \"dark\",\n  blurType: \"dark\",\n  blurAmount: 20,\n  overlayColor: \"#00000066\",\n  glassType: \"clear\",\n  glassTintColor: \"#000000\",\n  glassOpacity: 0.05\n};\nconst BUTTON_SIZE = 44;\nconst TRACK_HEIGHT = 107;\nconst TRACK_WIDTH = 4;\nconst MARKER_SIZE = 16;\nconst EXPANDED_HEIGHT = 159;\nconst AUTO_COLLAPSE_MS = 4000;\nconst clampVolume = value => {\n  const numberValue = Number(value);\n  const clamped = Math.max(0, Math.min(1, Number.isFinite(numberValue) ? numberValue : 1));\n  if (clamped <= 0.015) return 0;\n  if (clamped >= 0.985) return 1;\n  return Math.round(clamped * 100) / 100;\n};\nconst VolumeMutedIcon = React.memo(({\n  size = 20,\n  color = \"#FAFBFB\"\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 20 20\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M17.2666 2.05757C17.5107 1.81387 17.9064 1.81376 18.1504 2.05757C18.3945 2.30165 18.3945 2.69826 18.1504 2.94234L3.15039 17.9423C2.90641 18.1861 2.51065 18.186 2.2666 17.9423C2.02252 17.6983 2.02252 17.3016 2.2666 17.0576L4.53418 14.79C3.79843 14.7821 3.23816 14.7381 2.72949 14.5029C2.15058 14.235 1.59268 13.7109 1.29004 13.1494C0.962874 12.5422 0.924701 11.9067 0.870117 11.0039L0.863281 10.8955C0.844577 10.5886 0.833008 10.2846 0.833008 9.99995C0.833009 9.71546 0.844594 9.41213 0.863281 9.10542L0.870117 8.99605C0.924699 8.0932 0.96288 7.45773 1.29004 6.85054C1.59268 6.28902 2.15059 5.76486 2.72949 5.49702C3.35577 5.20739 4.06031 5.20743 5.07422 5.20796H5.20801C5.6551 5.20796 5.80804 5.20674 5.95117 5.18257C6.10427 5.15672 6.25345 5.11144 6.39551 5.04878C6.52827 4.99019 6.6572 4.90804 7.03027 4.66206L7.25293 4.51558C8.27866 3.83925 9.10133 3.29609 9.7793 2.96675C10.4675 2.63247 11.1455 2.44701 11.8271 2.67964C12.0536 2.75695 12.272 2.86822 12.4678 3.00581C13.0003 3.38028 13.2543 3.95151 13.3975 4.60835C13.4705 4.94343 13.5204 5.32944 13.5586 5.76558L17.2666 2.05757Z\",\n  fill: color\n}), /*#__PURE__*/React.createElement(SVG.Path, {\n  opacity: \"0.4\",\n  d: \"M13.5322 7.56057C13.7602 7.88683 13.7523 9.43641 13.75 9.9092C13.7498 9.9464 13.75 9.97733 13.75 10C13.75 10.46 13.7199 11.2711 13.6768 12.2002L13.6738 12.2481C13.6173 13.4646 13.5721 14.4418 13.4395 15.1787C13.3045 15.9281 13.0551 16.5817 12.4668 16.9951C12.2712 17.1325 12.0533 17.2431 11.8271 17.3203C11.2089 17.5313 10.5941 17.3976 9.97559 17.124C9.36478 16.8539 8.64788 16.4003 7.78223 15.833C7.5213 15.6775 6.67407 15.1427 6.34473 14.7471L13.5322 7.56057ZM17.0947 5.2637C17.4093 5.12177 17.7798 5.26172 17.9219 5.5762C18.3111 6.4388 18.75 7.88305 18.75 10C18.75 11.8263 18.4232 13.1527 18.083 14.0371C17.9133 14.4782 17.7413 14.8074 17.6064 15.0323C17.5391 15.1445 17.481 15.2311 17.4375 15.292C17.4158 15.3225 17.3967 15.3463 17.3828 15.3643C17.3759 15.3733 17.37 15.3808 17.3652 15.3867L17.3594 15.3946L17.3574 15.3975L17.3555 15.3994C17.3537 15.3982 17.326 15.376 16.876 15.001L17.3545 15.4004C17.1335 15.6653 16.7397 15.7013 16.4746 15.4805C16.2107 15.2606 16.1742 14.8687 16.3916 14.6035L16.3945 14.5996L16.4023 14.5889C16.4068 14.5829 16.4131 14.5751 16.4199 14.5655C16.4447 14.5307 16.4845 14.4725 16.5342 14.3897C16.6336 14.2239 16.7733 13.9589 16.916 13.5879C17.2008 12.8474 17.5 11.6736 17.5 10C17.5 8.06161 17.099 6.79295 16.7822 6.09085C16.6403 5.77632 16.7803 5.40577 17.0947 5.2637ZM15.3447 7.7217C15.6826 7.65156 16.0137 7.86826 16.084 8.20608C16.1758 8.64813 16.25 9.24085 16.25 10C16.25 10.9251 16.1392 11.6024 16.0215 12.0615C15.9627 12.2909 15.9026 12.4653 15.8535 12.5879C15.829 12.6491 15.8071 12.6976 15.79 12.7334C15.7816 12.7511 15.7745 12.7658 15.7686 12.7774L15.7607 12.793L15.7568 12.7989L15.7559 12.8018L15.7549 12.8028C15.7533 12.802 15.7251 12.7878 15.209 12.501L15.7549 12.8037C15.5872 13.1055 15.206 13.2145 14.9043 13.0469C14.6052 12.8807 14.4957 12.5046 14.6572 12.2041L14.6621 12.1953C14.6679 12.1832 14.679 12.159 14.6934 12.1231C14.7224 12.0503 14.7663 11.9275 14.8115 11.751C14.9021 11.3976 15 10.8247 15 10C15 9.32314 14.934 8.81612 14.8604 8.46096C14.7902 8.12303 15.0068 7.79192 15.3447 7.7217Z\",\n  fill: color\n})));\nreturn ({\n  value = 1,\n  onChange,\n  style\n}) => {\n  const theme = Theme.useTheme();\n  const [expanded, setExpanded] = React.useState(false);\n  const autoCollapseRef = React.useRef(null);\n  const trackLayoutRef = React.useRef(null);\n  const trackRef = React.useRef(null);\n  const lastVolumeRef = React.useRef(1);\n  const blockerIdRef = React.useRef(`vertical-volume-${Math.random().toString(36).slice(2)}`);\n  const volume = clampVolume(value);\n  const activeHeight = Math.max(0, Math.min(TRACK_HEIGHT, TRACK_HEIGHT * volume));\n  const markerBottom = Math.max(0, Math.min(TRACK_HEIGHT - MARKER_SIZE, activeHeight - MARKER_SIZE / 2));\n  const clearAutoCollapse = React.useCallback(() => {\n    if (autoCollapseRef.current != null) {\n      clearTimeout(autoCollapseRef.current);\n      autoCollapseRef.current = null;\n    }\n  }, []);\n  const scheduleAutoCollapse = React.useCallback(() => {\n    clearAutoCollapse();\n    autoCollapseRef.current = setTimeout(() => {\n      setExpanded(false);\n      autoCollapseRef.current = null;\n    }, AUTO_COLLAPSE_MS);\n  }, [clearAutoCollapse]);\n  React.useEffect(() => () => clearAutoCollapse(), [clearAutoCollapse]);\n  React.useEffect(() => {\n    if (expanded) {\n      scheduleAutoCollapse();\n    } else {\n      clearAutoCollapse();\n    }\n  }, [expanded, scheduleAutoCollapse, clearAutoCollapse]);\n  const setVideoGridSwipeBlocked = React.useCallback(blocked => {\n    const storage = State.state.storage.videoGridSwipeBlockers;\n    const current = storage.value ?? {};\n    const id = blockerIdRef.current;\n    if (blocked) {\n      if (current[id]) return;\n      storage.next({\n        ...current,\n        [id]: true\n      });\n      return;\n    }\n    if (!current[id]) return;\n    const next = {\n      ...current\n    };\n    delete next[id];\n    storage.next(next);\n  }, []);\n  React.useEffect(() => {\n    setVideoGridSwipeBlocked(expanded);\n    return () => setVideoGridSwipeBlocked(false);\n  }, [expanded, setVideoGridSwipeBlocked]);\n  const emitChange = React.useCallback(nextValue => {\n    onChange?.(clampVolume(nextValue));\n  }, [onChange]);\n  React.useEffect(() => {\n    if (volume > 0) {\n      lastVolumeRef.current = volume;\n    }\n  }, [volume]);\n  const measureTrack = React.useCallback(() => {\n    trackRef.current?.measureInWindow?.((x, y, width, height) => {\n      trackLayoutRef.current = {\n        y,\n        height: height || TRACK_HEIGHT\n      };\n    });\n  }, []);\n  React.useEffect(() => {\n    if (expanded) {\n      if (typeof requestAnimationFrame === \"function\") {\n        requestAnimationFrame(measureTrack);\n      } else {\n        setTimeout(measureTrack, 0);\n      }\n    }\n  }, [expanded, measureTrack]);\n  const getEventLocationY = React.useCallback(event => {\n    const nativeEvent = event?.nativeEvent ?? {};\n    if (nativeEvent.locationY != null) {\n      const locationY = Number(nativeEvent.locationY);\n      if (Number.isFinite(locationY)) return locationY;\n    }\n    const trackLayout = trackLayoutRef.current;\n    if (trackLayout && nativeEvent.pageY != null) {\n      const pageY = Number(nativeEvent.pageY);\n      if (Number.isFinite(pageY)) {\n        return pageY - trackLayout.y;\n      }\n    }\n    return TRACK_HEIGHT;\n  }, []);\n  const updateFromLocation = React.useCallback(locationY => {\n    const trackHeight = trackLayoutRef.current?.height || TRACK_HEIGHT;\n    scheduleAutoCollapse();\n    emitChange(1 - locationY / trackHeight);\n  }, [emitChange, scheduleAutoCollapse]);\n  const getGesturePageY = React.useCallback(event => {\n    const touchY = event?.allTouches?.[0]?.absoluteY ?? event?.absoluteY;\n    const pageY = Number(touchY);\n    return Number.isFinite(pageY) ? pageY : null;\n  }, []);\n  const updateFromPageY = React.useCallback(pageY => {\n    const trackLayout = trackLayoutRef.current;\n    if (!trackLayout) return;\n    updateFromLocation(pageY - trackLayout.y);\n  }, [updateFromLocation]);\n  const handleToggle = React.useCallback(() => {\n    if (!expanded) {\n      setExpanded(true);\n      return;\n    }\n    scheduleAutoCollapse();\n    if (volume <= 0) {\n      emitChange(lastVolumeRef.current || 1);\n      return;\n    }\n    lastVolumeRef.current = volume;\n    emitChange(0);\n  }, [expanded, volume, emitChange, scheduleAutoCollapse]);\n  const stopGesturePropagation = React.useCallback(event => {\n    event?.stopPropagation?.();\n  }, []);\n  const handleGestureTouchesDown = React.useCallback(() => {\n    if (expanded) measureTrack();\n  }, [expanded, measureTrack]);\n  const handleGestureMove = React.useCallback(event => {\n    if (!expanded) return;\n    const pageY = getGesturePageY(event);\n    if (pageY == null) return;\n    updateFromPageY(pageY);\n  }, [expanded, getGesturePageY, updateFromPageY]);\n  const handleGestureEnd = React.useCallback(() => {\n    if (expanded) scheduleAutoCollapse();\n  }, [expanded, scheduleAutoCollapse]);\n  const swipeBlockGesture = React.useMemo(() => {\n    const gestureApi = GestureHandler?.Gesture;\n    if (!GestureHandler?.GestureDetector || !gestureApi?.Pan) return null;\n    return gestureApi.Pan().runOnJS(true).minDistance(1).shouldCancelWhenOutside(false).cancelsTouchesInView(false).onTouchesDown(handleGestureTouchesDown).onStart(handleGestureMove).onUpdate(handleGestureMove).onEnd(handleGestureEnd).onFinalize(handleGestureEnd);\n  }, [handleGestureEnd, handleGestureMove, handleGestureTouchesDown]);\n  const handleResponderGrant = React.useCallback(event => {\n    stopGesturePropagation(event);\n    measureTrack();\n    updateFromLocation(getEventLocationY(event));\n  }, [getEventLocationY, measureTrack, stopGesturePropagation, updateFromLocation]);\n  const handleResponderMove = React.useCallback(event => {\n    stopGesturePropagation(event);\n    updateFromLocation(getEventLocationY(event));\n  }, [getEventLocationY, stopGesturePropagation, updateFromLocation]);\n  const styles = React.useMemo(() => {\n    const stPrimary = theme.theme.semantic.content.inversion.static.stPrimary;\n    const brand = theme.theme.semantic.content.brand.content1;\n    return {\n      container: {\n        width: BUTTON_SIZE,\n        height: expanded ? EXPANDED_HEIGHT : BUTTON_SIZE,\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        position: 'relative',\n        overflow: 'visible',\n        zIndex: expanded ? 20 : 1\n      },\n      gestureBox: {\n        position: 'absolute',\n        top: 0,\n        right: 0,\n        width: BUTTON_SIZE,\n        height: expanded ? EXPANDED_HEIGHT : BUTTON_SIZE,\n        overflow: 'visible'\n      },\n      shell: {\n        position: 'absolute',\n        top: 0,\n        right: 0,\n        width: BUTTON_SIZE,\n        height: expanded ? EXPANDED_HEIGHT : BUTTON_SIZE,\n        borderRadius: 999,\n        overflow: 'hidden',\n        // Добиваемся одного цвета с кнопкой репорта, из-за блюра фон выглядит темнее\n        opacity: ReactNative.Platform.OS === 'android' ? 0.6 : 1\n      },\n      content: {\n        width: BUTTON_SIZE,\n        height: expanded ? EXPANDED_HEIGHT : BUTTON_SIZE,\n        padding: 12,\n        borderRadius: 999,\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-start',\n        gap: 8,\n        backgroundColor: Utils.withOpacity(theme.theme.semantic.surface.alfa.static.stSurface4, 0.3)\n      },\n      iconButton: {\n        width: 20,\n        height: 20,\n        flexDirection: 'row',\n        alignItems: 'center',\n        justifyContent: 'center'\n      },\n      icon: {\n        color: stPrimary\n      },\n      barTouchArea: {\n        width: 20,\n        height: TRACK_HEIGHT,\n        flexDirection: 'row',\n        alignItems: 'flex-end',\n        justifyContent: 'center'\n      },\n      slot: {\n        width: TRACK_WIDTH,\n        height: TRACK_HEIGHT,\n        borderRadius: 999,\n        backgroundColor: Utils.withOpacity ? Utils.withOpacity(stPrimary, 0.4) : 'rgba(255,255,255,0.4)',\n        position: 'relative',\n        flexDirection: 'column',\n        alignItems: 'center',\n        justifyContent: 'flex-end'\n      },\n      volume: {\n        position: 'absolute',\n        bottom: 0,\n        width: TRACK_WIDTH,\n        borderRadius: 999,\n        backgroundColor: brand\n      },\n      marker: {\n        position: 'absolute',\n        left: -(MARKER_SIZE - TRACK_WIDTH) / 2,\n        width: MARKER_SIZE,\n        height: MARKER_SIZE,\n        borderRadius: MARKER_SIZE / 2,\n        backgroundColor: brand\n      }\n    };\n  }, [theme, expanded]);\n  const iconNode = React.useMemo(() => {\n    if (volume <= 0) return /*#__PURE__*/React.createElement(VolumeMutedIcon, {\n      size: 20,\n      color: styles.icon.color\n    });\n    return /*#__PURE__*/React.createElement(Assets.Speaker, {\n      size: 20,\n      style: styles.icon\n    });\n  }, [styles.icon, volume]);\n  const slider = /*#__PURE__*/React.createElement(ReactNative.View, {\n    collapsable: false,\n    style: styles.gestureBox\n  }, /*#__PURE__*/React.createElement(Blur, _extends({}, blurSurfaceProps, {\n    style: styles.shell\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content\n  }, /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    hitSlop: {\n      top: 12,\n      bottom: 12,\n      left: 12,\n      right: 12\n    },\n    style: styles.iconButton,\n    onPress: handleToggle\n  }, iconNode), /*#__PURE__*/React.createElement(Components.DSAnimatedOpacityTranslate, {\n    visible: expanded,\n    duration: expanded ? 300 : 0,\n    translateY: 10,\n    scale: 1,\n    disableOpacity: true,\n    unmountOnHide: true,\n    style: styles.barTouchArea,\n    onTouchStart: stopGesturePropagation,\n    onTouchMove: stopGesturePropagation,\n    onStartShouldSetResponderCapture: () => true,\n    onMoveShouldSetResponderCapture: () => true,\n    onStartShouldSetResponder: () => true,\n    onMoveShouldSetResponder: () => true,\n    onResponderTerminationRequest: () => false,\n    onResponderGrant: handleResponderGrant,\n    onResponderMove: handleResponderMove,\n    onResponderRelease: scheduleAutoCollapse,\n    onResponderTerminate: scheduleAutoCollapse\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    ref: trackRef,\n    pointerEvents: \"none\",\n    style: styles.slot,\n    onLayout: measureTrack\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.volume, {\n      height: activeHeight\n    }]\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.marker, {\n      bottom: markerBottom\n    }]\n  }))))));\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: [styles.container, style],\n    pointerEvents: \"box-none\"\n  }, expanded && swipeBlockGesture ? /*#__PURE__*/React.createElement(GestureHandler.GestureDetector, {\n    gesture: swipeBlockGesture,\n    touchAction: \"none\",\n    userSelect: \"none\"\n  }, slider) : slider);\n};"},"ChatListContextMenu":{"name":"ChatListContextMenu","key":"822f41d3a9232dc85842b3a2a20206632660fc82d75d7d4c8dae3c1acb9b7e8c","code":"/**\n * ChatListContextMenu — контекстное меню по долгому тапу на элемент списка чатов.\n * Оверлей с блюром + меню под позицией строки (как у сообщений). Стили и переводы как в ChatDropdownMenu.\n *\n * @param {boolean} visible\n * @param {Object} chat - ChatItemData (id, title, isMuted, ...)\n * @param {{ x, y, width, height } | null} layout - координаты строки (measureInWindow)\n * @param {string | null} tileImageUri - uri снимка строки (captureRef) для оверлея\n * @param {() => void} onClose\n * @param {(chat) => void} onPin\n * @param {(chat) => void} onProfile\n * @param {(chat) => void} onReport\n * @param {(chat) => void} onDelete - Удалить и блокировать\n */\n\nconst BlurView = ExpoBlur?.BlurView ?? ReactNative.View;\nconst blurIntensity = 80;\nconst PinIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8.06059 1.35683C8.78608 1.19694 9.46158 1.87271 10.8125 3.22499L12.7891 5.20351C14.1302 6.54592 14.8009 7.21726 14.6446 7.94081C14.4881 8.66443 13.6001 8.99824 11.8243 9.66542L10.5948 10.1273C10.1195 10.3059 9.88177 10.3954 9.69828 10.5541C9.61793 10.6237 9.54542 10.7031 9.48344 10.7894C9.34203 10.9867 9.2745 11.2321 9.13969 11.7221C8.83298 12.8368 8.67963 13.3944 8.31449 13.6029C8.16056 13.6908 7.98583 13.737 7.80863 13.7367C7.38831 13.7359 6.97986 13.3267 6.16313 12.5092L5.18559 11.5307L2.20121 14.518C2.00265 14.7163 1.68099 14.7164 1.48246 14.518C1.28384 14.3191 1.28384 13.9961 1.48246 13.7973L4.46586 10.8109L3.52348 9.86659C2.71172 9.05404 2.30551 8.6478 2.30278 8.22987C2.30164 8.04934 2.34852 7.87166 2.43852 7.71522C2.64708 7.3531 3.20074 7.20008 4.30766 6.89491C4.79833 6.75964 5.04396 6.69203 5.24125 6.55019C5.32982 6.48643 5.41068 6.41158 5.48149 6.32851C5.63926 6.14336 5.72699 5.90387 5.90238 5.42519L6.3477 4.21034C7.00564 2.41467 7.33501 1.5169 8.06059 1.35683Z\",\n  fill: color\n}));\n\n/** Иконка «открепить» (пин с перечёркиванием) */\nconst UnpinIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M13.8904 16.9496C13.8366 17.1262 13.7785 17.3337 13.7097 17.5834C13.2498 19.2551 13.0191 20.0919 12.4715 20.4047C12.2409 20.5362 11.9791 20.6052 11.7137 20.6049C11.0832 20.6038 10.4698 19.9902 9.2449 18.7641L7.77908 17.2963L3.30252 21.7768C3.00484 22.0745 2.52232 22.0741 2.2244 21.7768C1.92648 21.4785 1.92652 20.9949 2.2244 20.6967L6.69998 16.2162L5.28494 14.8002C4.06779 13.5819 3.45925 12.9718 3.45486 12.3451C3.45315 12.0742 3.5238 11.8074 3.65897 11.5727C3.97186 11.0296 4.80175 10.8008 6.4617 10.3432C6.71327 10.2738 6.92094 10.2119 7.09842 10.1576L13.8904 16.9496ZM12.0906 2.03555C13.1788 1.7959 14.1932 2.80997 16.2195 4.83828L19.1844 7.80605C21.1953 9.819 22.2019 10.8264 21.9676 11.9115C21.7326 12.9966 20.4001 13.4979 17.7371 14.4984L16.1541 15.0922L19.531 18.4691C19.8238 18.7619 19.8235 19.2368 19.531 19.5297C19.2381 19.8226 18.7634 19.8226 18.4705 19.5297L4.47049 5.52969C4.1776 5.23679 4.1776 4.76203 4.47049 4.46914C4.76341 4.17663 5.23827 4.17637 5.53104 4.46914L8.94608 7.88418L9.52225 6.31582C10.509 3.6227 11.0025 2.27592 12.0906 2.03555Z\",\n  fill: color\n}));\n\n/** Иконка «заглушить» (динамик с перечёркиванием) */\nconst MuteIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M13.8135 1.64649C14.0088 1.45139 14.3253 1.45128 14.5205 1.64649C14.7156 1.84171 14.7156 2.1583 14.5205 2.35352L2.52051 14.3535C2.3253 14.5487 2.00875 14.5486 1.81348 14.3535C1.61821 14.1583 1.61821 13.8418 1.81348 13.6465L3.62793 11.832C3.0393 11.8257 2.59054 11.7907 2.18359 11.6025C1.72049 11.3883 1.27435 10.9687 1.03223 10.5195C0.770481 10.0337 0.73996 9.5251 0.696289 8.80274L0.69043 8.71582C0.675475 8.4704 0.666992 8.22765 0.666992 8C0.666993 7.77235 0.675474 7.52961 0.69043 7.28418L0.696289 7.19727C0.73996 6.47491 0.770481 5.96626 1.03223 5.48047C1.27435 5.03128 1.7205 4.61172 2.18359 4.39746C2.68459 4.16579 3.24849 4.16657 4.05957 4.167H4.16699C4.52436 4.16699 4.6463 4.16483 4.76074 4.14551C4.88333 4.12481 5.00345 4.08926 5.11719 4.03907C5.22328 3.9922 5.32592 3.92605 5.62402 3.7295L5.80176 3.61231C6.62229 3.07128 7.28088 2.63751 7.82324 2.37403C8.37393 2.10651 8.91647 1.95742 9.46191 2.14356C9.64296 2.20538 9.8171 2.29432 9.97363 2.4043C10.3999 2.70387 10.6032 3.16092 10.7178 3.68653C10.7762 3.95458 10.8161 4.2634 10.8467 4.61231L13.8135 1.64649ZM10.5 7.5C10.7761 7.5 11 7.72386 11 8C11 8.36794 10.9759 9.01661 10.9414 9.75977L10.9395 9.79883C10.8943 10.7719 10.8581 11.5531 10.752 12.1426C10.644 12.7422 10.4443 13.2649 9.97363 13.5957C9.8171 13.7057 9.64296 13.7946 9.46191 13.8564C8.96728 14.0252 8.47529 13.9181 7.98047 13.6992C7.49182 13.4831 6.91811 13.1208 6.22559 12.667C5.93944 12.4963 5.88594 12.1031 6.11621 11.8623L10.1152 7.68067L10.1631 7.63086C10.252 7.54981 10.3702 7.5 10.5 7.5ZM13.6768 4.21094C13.9284 4.09766 14.2244 4.20938 14.3379 4.46094C14.6492 5.15103 15 6.30639 15 8C15 9.46102 14.7389 10.5219 14.4668 11.2295C14.331 11.5827 14.1929 11.8465 14.085 12.0264C14.0312 12.1159 13.985 12.1847 13.9502 12.2334C13.9328 12.2578 13.9183 12.2776 13.9072 12.292L13.8877 12.3154L13.8857 12.3184L13.8848 12.3193C13.8844 12.3191 13.8735 12.3112 13.5 12L13.8838 12.3203C13.707 12.5322 13.3917 12.5605 13.1797 12.3838C12.9688 12.2078 12.9394 11.8946 13.1133 11.6826C13.1136 11.6822 13.1143 11.6808 13.1152 11.6797C13.1187 11.6751 13.1259 11.6662 13.1357 11.6523C13.1556 11.6246 13.1878 11.578 13.2275 11.5117C13.3071 11.3791 13.419 11.1669 13.5332 10.8701C13.761 10.2777 14 9.33873 14 8C14 6.44911 13.6792 5.43374 13.4258 4.87207C13.3125 4.62044 13.4252 4.32445 13.6768 4.21094ZM12.2764 6.17676C12.5466 6.12089 12.8111 6.2952 12.8672 6.56543C12.9406 6.91904 13 7.39285 13 8C13 8.74008 12.9116 9.28212 12.8174 9.64942C12.7704 9.83276 12.7218 9.97226 12.6826 10.0703C12.6631 10.1191 12.6464 10.1579 12.6328 10.1865C12.6261 10.2007 12.62 10.2124 12.6152 10.2217L12.6084 10.2344L12.6055 10.2393L12.6045 10.2412V10.2422C12.6045 10.2422 12.6034 10.2425 12.167 10L12.6035 10.2432C12.4693 10.4842 12.1651 10.5714 11.9238 10.4375C11.6845 10.3046 11.5974 10.004 11.7266 9.76367L11.7295 9.75684C11.7341 9.74724 11.7432 9.72734 11.7549 9.69825C11.7781 9.64004 11.8125 9.5415 11.8486 9.40039C11.9211 9.11766 12 8.65969 12 8C12 7.45829 11.9467 7.05271 11.8877 6.76856C11.8316 6.49818 12.006 6.23289 12.2764 6.17676Z\",\n  fill: color\n}));\n\n/** Иконка «включить звук» (динамик с волнами) */\nconst UnmuteIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M9.64844 6.19141C11.9868 4.5474 13.1563 3.72523 14.1377 4.08203C14.3259 4.1505 14.5082 4.25017 14.6709 4.37207C15.5192 5.00796 15.584 6.48693 15.7129 9.44531C15.7606 10.5408 15.793 11.4785 15.793 12C15.793 12.5215 15.7606 13.4592 15.7129 14.5547C15.584 17.5131 15.5192 18.992 14.6709 19.6279C14.5082 19.7498 14.3259 19.8495 14.1377 19.918C13.1563 20.2748 11.9868 19.4526 9.64844 17.8086C9.05567 17.3918 8.75916 17.1836 8.42871 17.0625C8.36014 17.0374 8.29091 17.0144 8.2207 16.9951C7.88238 16.9022 7.52711 16.9023 6.81738 16.9023C4.83047 16.9023 3.83649 16.9027 3.08398 16.2676C2.94663 16.1516 2.78259 15.9799 2.6709 15.8359C2.05918 15.0475 2.04026 14.1262 2.00293 12.2842C2.00097 12.1875 2 12.0927 2 12C2 11.9073 2.00097 11.8125 2.00293 11.7158C2.04026 9.87383 2.05918 8.95252 2.6709 8.16406C2.78259 8.02014 2.94663 7.84838 3.08398 7.73242C3.83649 7.0973 4.83047 7.09766 6.81738 7.09766C7.52711 7.09766 7.88238 7.09776 8.2207 7.00488C8.29091 6.9856 8.36014 6.96262 8.42871 6.9375C8.75916 6.81644 9.05567 6.60816 9.64844 6.19141ZM19.6055 5.46875C19.888 5.30702 20.2476 5.37353 20.4609 5.64648L20.4619 5.64746L20.4629 5.64941L20.4658 5.65234L20.4727 5.66211C20.4779 5.66904 20.4846 5.67797 20.4922 5.68848C20.5075 5.70961 20.5278 5.73773 20.5518 5.77344C20.5998 5.84515 20.6639 5.94689 20.7383 6.0791C20.8871 6.34361 21.0774 6.73087 21.2646 7.25C21.64 8.29065 22 9.85125 22 12C22 14.1488 21.64 15.7093 21.2646 16.75C21.0773 17.2695 20.8871 17.6573 20.7383 17.9219C20.664 18.0538 20.5998 18.1549 20.5518 18.2266C20.5277 18.2624 20.5075 18.2913 20.4922 18.3125C20.4845 18.323 20.4779 18.3319 20.4727 18.3389L20.4658 18.3477L20.4629 18.3516L20.4619 18.3525C20.4617 18.3529 20.4605 18.3546 19.9307 17.8838L20.4609 18.3545C20.2171 18.6663 19.7818 18.7082 19.4893 18.4482C19.1982 18.1895 19.1576 17.7289 19.3975 17.417C19.398 17.4162 19.3998 17.4152 19.4014 17.4131C19.4062 17.4064 19.4151 17.3924 19.4287 17.3721C19.4561 17.3312 19.5008 17.2626 19.5557 17.165C19.6654 16.97 19.8191 16.6582 19.9766 16.2217C20.2908 15.3503 20.6211 13.9691 20.6211 12C20.6211 10.0308 20.2908 8.64961 19.9766 7.77832C19.8192 7.34221 19.6654 7.031 19.5557 6.83594C19.5008 6.73846 19.4561 6.66982 19.4287 6.62891C19.4152 6.60873 19.4063 6.59469 19.4014 6.58789C19.3998 6.58572 19.398 6.58376 19.3975 6.58301L19.6055 5.46875ZM17.7568 8.41602C18.0898 8.21877 18.5103 8.34712 18.6953 8.70215V8.70312L18.6963 8.7041L18.6982 8.70703L18.7012 8.71387L18.71 8.73242C18.7166 8.74614 18.725 8.76326 18.7344 8.78418C18.7532 8.82637 18.7776 8.88394 18.8047 8.95605C18.8588 9.10033 18.9254 9.3056 18.9902 9.5752C19.1201 10.1153 19.2412 10.912 19.2412 12C19.2412 13.0884 19.1201 13.8856 18.9902 14.4258C18.9254 14.6955 18.8588 14.9006 18.8047 15.0449C18.7777 15.1169 18.7532 15.1737 18.7344 15.2158C18.725 15.2369 18.7166 15.2548 18.71 15.2686L18.7012 15.2861L18.6982 15.293L18.6963 15.2959L18.6953 15.2979C18.6925 15.2967 18.6535 15.2752 18.0918 14.9424L18.6953 15.2988C18.5103 15.6539 18.0898 15.7822 17.7568 15.585C17.4268 15.3894 17.3061 14.9473 17.4844 14.5938L17.4893 14.584C17.4955 14.5699 17.5074 14.5416 17.5234 14.499C17.5555 14.4135 17.6042 14.2687 17.6543 14.0605C17.7543 13.6447 17.8623 12.9705 17.8623 12C17.8623 11.0299 17.7542 10.3562 17.6543 9.94043C17.6042 9.73229 17.5555 9.58747 17.5234 9.50195C17.5074 9.45931 17.4956 9.43114 17.4893 9.41699L17.4844 9.40723C17.3061 9.05376 17.4269 8.61166 17.7568 8.41602Z\",\n  fill: color\n}));\nconst ProfileIcon = ({\n  size = 16,\n  color = '#38404A'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8 8C10.2091 8 12 6.20914 12 4C12 1.79086 10.2091 0 8 0C5.79086 0 4 1.79086 4 4C4 6.20914 5.79086 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\",\n  fill: color\n}));\nconst ReportIcon = ({\n  size = 16,\n  color = '#E83B3B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M2.66667 14.6667V2.00001M2.66667 10.6667C2.66667 10.6667 3.33334 10 5.33334 10C7.33334 10 8.66667 11.3333 10.6667 11.3333C12.6667 11.3333 13.3333 10.6667 13.3333 10.6667V2.00001C13.3333 2.00001 12.6667 2.66667 10.6667 2.66667C8.66667 2.66667 7.33334 1.33334 5.33334 1.33334C3.33334 1.33334 2.66667 2.00001 2.66667 2.00001\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\nconst DeleteIcon = ({\n  size = 16,\n  color = '#E83B3B'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M2 4H14M12.6667 4V13.3333C12.6667 14 12 14.6667 11.3333 14.6667H4.66667C4 14.6667 3.33333 14 3.33333 13.3333V4M5.33333 4V2.66667C5.33333 2 6 1.33334 6.66667 1.33334H9.33333C10 1.33334 10.6667 2 10.6667 2.66667V4M6.66667 7.33334V11.3333M9.33333 7.33334V11.3333\",\n  stroke: color,\n  strokeWidth: 1.5,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n}));\nreturn ({\n  visible,\n  chat,\n  user,\n  layout,\n  tileImageUri,\n  onClose,\n  onPin,\n  onProfile,\n  onReport,\n  onDelete\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const safeArea = SafeArea?.useSafeAreaInsets();\n  State.api?.audit?.useLifecycleAudit?.({\n    kind: 'modal',\n    name: 'ChatListContextMenu',\n    active: visible === true,\n    presentation: 'context-menu',\n    params: {\n      chatId: chat?.id,\n      userId: user?.id ?? user?.user?.id ?? chat?.userId,\n      pinned: chat?.pinned,\n      muted: chat?.muted\n    }\n  });\n  const pinned = State.api?.chat?.useChatPinned?.(chat?.id);\n  const bgColor = theme.theme.component?.dropdown?.bg || '#FFFFFF';\n  const contentDefault = theme.theme.component?.dropdown?.contentDefault || '#38404A';\n  const contentDangerous = theme.theme.component?.dropdown?.contentDangerous || '#E83B3B';\n  const dividerColor = theme.theme.component?.dropdown?.divider || '#E5E8EC';\n  const {\n    width: screenWidth,\n    height: screenHeight\n  } = ReactNative.useWindowDimensions();\n  const menuWidth = 240;\n  const menuHeight = 200; // approximate menu height for flip calculation\n  const gapBelowRow = 6;\n  const tileHorizontalInset = 0;\n\n  // Safe window bounds (screen minus safe areas)\n  const safeLeft = safeArea?.left ?? 0;\n  const safeRight = safeArea?.right ?? 0;\n  const safeTop = safeArea?.top ?? 0;\n  const safeBottom = safeArea?.bottom ?? 0;\n  const safeWindowWidth = screenWidth - safeLeft - safeRight;\n  const safeWindowHeight = screenHeight - safeTop - safeBottom;\n  const overlayTop = (layout?.y ?? 0) + safeTop;\n\n  // Calculate available space below the row\n  const spaceBelow = safeWindowHeight - (overlayTop - safeTop) - (layout?.height ?? 0) - gapBelowRow;\n  const showAbove = layout != null && spaceBelow < menuHeight + gapBelowRow;\n\n  // Calculate menu position relative to row's right edge\n  const rawLeft = layout != null ? layout.x + layout.width - menuWidth - 8 : screenWidth - menuWidth - 8;\n  const rawTop = showAbove ? overlayTop - (layout?.height ?? 0) - gapBelowRow : overlayTop + (layout?.height ?? 0) + gapBelowRow;\n\n  // Constrain menu within safe window bounds (top and bottom edges)\n  // Ensure bottom edge doesn't overflow below safe window and top edge doesn't overflow above\n  const constrainedLeft = Math.max(safeLeft, Math.min(rawLeft, screenWidth - menuWidth - safeRight));\n  const maxTop = safeTop + safeWindowHeight - menuHeight;\n  const constrainedTop = Math.max(safeTop, Math.min(rawTop, maxTop));\n  const styles = React.useMemo(() => ({\n    overlay: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0\n    },\n    blur: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0\n    },\n    liftImage: {\n      position: 'absolute',\n      width: layout != null ? Math.max(0, layout.width - tileHorizontalInset * 2) : 0,\n      height: layout?.height ?? 0,\n      left: (layout?.x ?? 0) + tileHorizontalInset,\n      top: overlayTop,\n      borderRadius: 12,\n      overflow: 'hidden',\n      zIndex: 201\n    },\n    menuContainer: {\n      position: 'absolute',\n      left: constrainedLeft,\n      top: constrainedTop,\n      width: menuWidth,\n      backgroundColor: bgColor,\n      borderRadius: 16,\n      borderWidth: 1,\n      borderColor: bgColor,\n      overflow: 'hidden',\n      zIndex: 202,\n      shadowColor: '#04060F',\n      shadowOffset: {\n        width: 0,\n        height: 16\n      },\n      shadowOpacity: 0.15,\n      shadowRadius: 28,\n      elevation: 10\n    },\n    row: {\n      flexDirection: 'row',\n      alignItems: 'center',\n      paddingVertical: 10,\n      paddingHorizontal: 16,\n      height: 44,\n      backgroundColor: bgColor,\n      width: '100%'\n    },\n    rowInner: {\n      flexDirection: 'row',\n      flex: 1,\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      minWidth: 0\n    },\n    rowTextWrap: {\n      flex: 1,\n      minWidth: 0\n    },\n    rowText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 16,\n      lineHeight: 24,\n      letterSpacing: -0.3,\n      color: contentDefault\n    },\n    rowTextDanger: {\n      color: contentDangerous\n    },\n    divider: {\n      height: 1,\n      backgroundColor: dividerColor\n    }\n  }), [layout, screenWidth, screenHeight, bgColor, contentDefault, contentDangerous, dividerColor, safeArea, constrainedLeft, constrainedTop]);\n  const handleAction = React.useCallback(fn => {\n    fn?.(chat, user);\n    onClose?.();\n  }, [chat, user, onClose]);\n  const [pressedInOverlay, setPressedInOverlay] = React.useState(false);\n  const handleOverlayPressIn = React.useCallback(() => {\n    setPressedInOverlay(true);\n  }, []);\n  const handleOverlayPressOut = React.useCallback(() => {\n    if (pressedInOverlay) {\n      onClose?.();\n    }\n    setPressedInOverlay(false);\n  }, [pressedInOverlay, onClose]);\n  if (!visible) return null;\n  const content = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(BlurView, {\n    style: styles.blur,\n    intensity: blurIntensity,\n    tint: 'dark'\n  }), tileImageUri && layout && /*#__PURE__*/React.createElement(ReactNative.Image, {\n    source: {\n      uri: tileImageUri\n    },\n    style: styles.liftImage,\n    resizeMode: \"stretch\"\n  }), /*#__PURE__*/React.createElement(ReactNative.Pressable, {\n    style: styles.overlay,\n    onPressIn: handleOverlayPressIn,\n    onPress: handleOverlayPressOut\n  }), /*#__PURE__*/React.createElement(LazyComponent, {\n    name: \"WithAppear\",\n    visible: visible,\n    scale: 0.8,\n    duration: 100,\n    translateY: -25,\n    style: styles.menuContainer\n  }, onPin && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handleAction(onPin)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, pinned ? t('chatActionUnpin') : t('chatActionPin'))), pinned ? /*#__PURE__*/React.createElement(UnpinIcon, {\n    size: 16,\n    color: contentDefault\n  }) : /*#__PURE__*/React.createElement(PinIcon, {\n    size: 16,\n    color: contentDefault\n  }))), onProfile && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handleAction(onProfile)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.rowText,\n    numberOfLines: 1\n  }, t('chatActionProfile'))), /*#__PURE__*/React.createElement(ProfileIcon, {\n    size: 16,\n    color: contentDefault\n  }))), onReport && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handleAction(onReport)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.rowText, styles.rowTextDanger],\n    numberOfLines: 1\n  }, t('chatMenuReport'))), /*#__PURE__*/React.createElement(ReportIcon, {\n    size: 16,\n    color: contentDangerous\n  }))), onDelete && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.divider\n  }), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.row,\n    style: styles.rowInner,\n    onPress: () => handleAction(onDelete)\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowTextWrap\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: [styles.rowText, styles.rowTextDanger],\n    numberOfLines: 1\n  }, t('chatMenuDelete'))), /*#__PURE__*/React.createElement(DeleteIcon, {\n    size: 16,\n    color: contentDangerous\n  })))));\n  return /*#__PURE__*/React.createElement(Portal, {\n    hostName: \"overview\"\n  }, content);\n};"},"LongPressMenu":{"name":"LongPressMenu","key":"9ba4fbabc37a28a96753ed340aa9f41c1e5ffad0bc66fd810cd7d4a7c3e331ef","code":"function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nreturn props => {\n  const menuName = props.menu;\n  const mProps = props.menuProps || {};\n  const cap = React.useRef(null);\n  const [st, setSt] = React.useState({\n    visible: false,\n    layout: null,\n    tileImageUri: null\n  });\n  const suppressNextPressRef = React.useRef(false);\n  const isWeb = ReactNative.Platform.OS === 'web';\n\n  // Subscribe to window dimension changes to re-measure layout\n  const windowDims = ReactNative.useWindowDimensions();\n  const measureLayout = React.useCallback(() => {\n    if (!cap.current) return null;\n    return new Promise(resolve => {\n      cap.current.measureInWindow((x, y, w, h) => {\n        resolve({\n          x,\n          y,\n          width: w,\n          height: h\n        });\n      });\n    });\n  }, [cap]);\n\n  // Re-measure when window dimensions change\n  React.useEffect(() => {\n    if (!st.visible) return;\n    measureLayout().then(layout => {\n      if (layout) {\n        setSt(prev => ({\n          ...(prev ?? {}),\n          layout\n        }));\n      }\n    });\n  }, [windowDims, st.visible, measureLayout]);\n  const onClose = React.useCallback(() => {\n    suppressNextPressRef.current = false;\n    setSt({\n      visible: false,\n      layout: null,\n      tileImageUri: null\n    });\n  }, []);\n  const preventNativeContextMenu = React.useCallback(e => {\n    if (!isWeb) return;\n    e?.preventDefault?.();\n    e?.stopPropagation?.();\n    e?.nativeEvent?.preventDefault?.();\n    e?.nativeEvent?.stopPropagation?.();\n  }, [isWeb]);\n  const onLong = React.useCallback(e => {\n    preventNativeContextMenu(e);\n    suppressNextPressRef.current = true;\n    if (!cap.current) return;\n    cap.current.measureInWindow((x, y, w, h) => {\n      const layout = {\n        x,\n        y,\n        width: w,\n        height: h\n      };\n      if (typeof ViewShot?.captureRef !== 'function') {\n        setSt(prev => ({\n          ...(prev ?? {}),\n          visible: true,\n          layout,\n          tileImageUri: null\n        }));\n      } else {\n        ViewShot.captureRef?.(cap.current, {\n          format: 'png',\n          result: 'tmpfile',\n          quality: 1\n        })?.then(uri => {\n          setSt(prev => ({\n            ...(prev ?? {}),\n            visible: true,\n            layout,\n            tileImageUri: uri\n          }));\n        })?.catch(error => {\n          setSt(prev => ({\n            ...(prev ?? {}),\n            visible: true,\n            layout,\n            tileImageUri: null\n          }));\n        });\n      }\n    });\n  }, [cap, preventNativeContextMenu]);\n  const onPress = React.useCallback((...args) => {\n    if (suppressNextPressRef.current) {\n      suppressNextPressRef.current = false;\n      return;\n    }\n    props.onPress?.(...args);\n  }, [props.onPress]);\n  const handleLayout = React.useCallback(() => {\n    if (!st.visible) return;\n    measureLayout().then(layout => {\n      if (layout) {\n        setSt(prev => ({\n          ...(prev ?? {}),\n          layout\n        }));\n      }\n    });\n  }, [st.visible, measureLayout]);\n  const wrapStyle = props.style ? [{\n    flex: 1\n  }, props.style] : {\n    flex: 1\n  };\n  const pressStyle = props.pressableStyle ? [{\n    flex: 1\n  }, props.pressableStyle] : {\n    flex: 1\n  };\n  const menuProps = {\n    visible: st.visible,\n    layout: st.layout,\n    tileImageUri: st.tileImageUri,\n    onClose,\n    ...mProps\n  };\n  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: wrapStyle,\n    onLayout: handleLayout\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    ref: cap,\n    style: pressStyle,\n    onPress: onPress,\n    onLongPress: onLong,\n    scale: 0.99,\n    feedback: true,\n    onContextMenu: onLong\n  }, props.children)), menuName && st.visible && typeof menuName === 'string' && /*#__PURE__*/React.createElement(LazyComponent, _extends({\n    name: menuName\n  }, menuProps)), menuName && st.visible && typeof menuName !== 'string' && React.createElement(menuName, menuProps));\n};"},"ChatInputField":{"name":"ChatInputField","key":"91af1af0670b3347fd77ebd390002f30d597366086081b3e94196b6d1ff27c07","code":"function _await(value, then, direct) {\n  if (direct) {\n    return then ? then(value) : value;\n  }\n  if (!value || !value.then) {\n    value = Promise.resolve(value);\n  }\n  return then ? value.then(then) : value;\n}\nfunction _async(f) {\n  return function () {\n    for (var args = [], i = 0; i < arguments.length; i++) {\n      args[i] = arguments[i];\n    }\n    try {\n      return Promise.resolve(f.apply(this, args));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  };\n}\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n// Иконка галереи/вложений\nconst GalleryIcon = ({\n  size = 16,\n  color = '#04060F'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.G, {\n  clipPath: \"url(#clip0_chat_input_gallery)\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M8.03809 0.833008C9.57701 0.833 10.7836 0.833448 11.7246 0.959961C12.6876 1.08948 13.4475 1.3596 14.0439 1.95605C14.6404 2.55251 14.9105 3.31243 15.04 4.27539C15.1666 5.21638 15.167 6.42298 15.167 7.96191V8.02051C15.167 9.29282 15.1667 10.3345 15.0977 11.1826C15.0282 12.0348 14.8858 12.7474 14.5674 13.3389C14.4269 13.5998 14.2541 13.8337 14.0439 14.0439C13.4475 14.6404 12.6876 14.9105 11.7246 15.04C10.7836 15.1666 9.57702 15.167 8.03809 15.167H7.96191C6.42298 15.167 5.21638 15.1666 4.27539 15.04C3.31243 14.9105 2.55251 14.6404 1.95605 14.0439C1.4272 13.5151 1.15402 12.8566 1.00879 12.04C0.866162 11.238 0.840382 10.2401 0.834961 9.00098C0.833582 8.68586 0.833008 8.35258 0.833008 8.00098V7.96191C0.833 6.42299 0.833448 5.21638 0.959961 4.27539C1.08948 3.31243 1.3596 2.55251 1.95605 1.95605C2.55251 1.3596 3.31243 1.08948 4.27539 0.959961C5.21638 0.833448 6.42299 0.833 7.96191 0.833008H8.03809ZM8 1.83301C6.41457 1.83301 5.27582 1.83467 4.40918 1.95117C3.55691 2.06576 3.04286 2.28332 2.66309 2.66309C2.28332 3.04286 2.06576 3.55691 1.95117 4.40918C1.83467 5.27582 1.83301 6.41457 1.83301 8C1.83301 8.19368 1.83376 8.38115 1.83398 8.5625L2.50098 7.97852C3.10842 7.44701 4.02391 7.47724 4.59473 8.04785L7.45508 10.9082C7.91325 11.3661 8.63408 11.4281 9.16406 11.0557L9.36328 10.916C10.1261 10.3801 11.1577 10.4428 11.8506 11.0664L13.7383 12.7646C13.9282 12.3657 14.0403 11.841 14.1006 11.1016C14.166 10.2986 14.167 9.29712 14.167 8C14.167 6.41457 14.1653 5.27582 14.0488 4.40918C13.9342 3.55691 13.7167 3.04286 13.3369 2.66309C12.9571 2.28332 12.4431 2.06576 11.5908 1.95117C10.7242 1.83467 9.58543 1.83301 8 1.83301ZM10.667 4C11.4031 4.00018 11.9998 4.59689 12 5.33301C12 6.06928 11.4032 6.66682 10.667 6.66699C9.93061 6.66699 9.33301 6.06939 9.33301 5.33301C9.33318 4.59678 9.93072 4 10.667 4Z\",\n  fill: color\n})), /*#__PURE__*/React.createElement(SVG.Defs, null, /*#__PURE__*/React.createElement(SVG.ClipPath, {\n  id: \"clip0_chat_input_gallery\"\n}, /*#__PURE__*/React.createElement(SVG.Rect, {\n  width: size,\n  height: size,\n  fill: \"white\"\n}))));\nconst GiftIcon = ({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11 22.0001H7C6.20435 22.0001 5.44152 21.6838 4.87891 21.1212C4.31632 20.5586 4 19.7957 4 19.0001V15.0001C4.00002 14.7349 4.10545 14.4806 4.29297 14.2931C4.4805 14.1055 4.7348 14.0001 5 14.0001H11V22.0001ZM19 14.0001C19.2652 14.0001 19.5195 14.1055 19.707 14.2931C19.8946 14.4806 20 14.7349 20 15.0001V19.0001C20 19.7957 19.6837 20.5586 19.1211 21.1212C18.5585 21.6838 17.7956 22.0001 17 22.0001H13V14.0001H19ZM16.5 2.00009C17.0904 1.99997 17.6713 2.14903 18.1885 2.43369C18.7058 2.71849 19.1433 3.12996 19.459 3.629C19.7746 4.12796 19.9584 4.69886 19.9941 5.28818C20.0299 5.87758 19.9161 6.46658 19.6631 7.00009H20C20.5304 7.00009 21.039 7.21098 21.4141 7.58603C21.7891 7.96109 22 8.46968 22 9.00009V10.0001C22 10.5305 21.7891 11.0391 21.4141 11.4142C21.039 11.7892 20.5304 12.0001 20 12.0001H13V7.00009H11V12.0001H4C3.46957 12.0001 2.96101 11.7892 2.58594 11.4142C2.21088 11.0391 2 10.5305 2 10.0001V9.00009C2.00002 8.46968 2.21088 7.96109 2.58594 7.58603C2.96101 7.21098 3.46958 7.00009 4 7.00009H4.33691C4.11482 6.53127 3.99977 6.01886 4 5.50009C4.00003 3.56712 5.56742 2.00009 7.4834 2.00009C9.23816 1.97027 10.7953 3.09197 11.8643 4.93369L12 5.17685C13.033 3.26299 14.5601 2.06304 16.291 2.00205L16.5 2.00009ZM7.5 4.00009C7.10219 4.00009 6.72075 4.15826 6.43945 4.43955C6.15816 4.72083 6.00002 5.10229 6 5.50009C6 5.8979 6.15817 6.27934 6.43945 6.56064C6.72076 6.84194 7.10218 7.00009 7.5 7.00009H10.6426C9.90157 5.09521 8.69396 3.98009 7.5 4.00009ZM16.4834 4.00009C15.3034 3.98009 14.0984 5.09621 13.3574 7.00009H16.5C16.8978 6.99784 17.2789 6.83768 17.5586 6.55478C17.8382 6.2719 17.9935 5.88902 17.9912 5.4913C17.9889 5.09361 17.8287 4.71331 17.5459 4.43369C17.2631 4.15409 16.8811 3.99794 16.4834 4.00009Z\",\n  fill: color\n}));\n\n// Иконка отправки (самолётик, по макету 24×24)\nconst SendIcon = ({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  fillRule: \"evenodd\",\n  clipRule: \"evenodd\",\n  d: \"M13.4793 3.64754C17.9774 2.14817 20.2266 1.3988 21.4139 2.58602C22.6011 3.77325 21.8517 6.02246 20.3524 10.5206L18.6356 15.67C17.4254 19.3006 16.8198 21.1161 15.9324 21.6319C15.0883 22.1225 14.046 22.1226 13.202 21.6319C12.3147 21.116 11.71 19.3005 10.4998 15.67C10.3345 15.1741 10.4517 14.6112 10.8231 14.2432L16.2401 8.87704C16.5498 8.57016 16.5518 8.06958 16.2449 7.75985C15.9381 7.45034 15.4384 7.44835 15.1287 7.75497L9.62287 13.21C9.28602 13.5437 8.7797 13.6509 8.3299 13.5011C4.69933 12.2909 2.88388 11.6853 2.36798 10.7979C1.87729 9.95388 1.87739 8.91156 2.36798 8.06747C2.88384 7.18012 4.69927 6.57455 8.3299 5.36434L13.4793 3.64754Z\",\n  fill: color\n}));\n\n// Иконка основной валюты\nconst MainCurrencyIcon = ({\n  size = 16\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 16 16\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11.5 2C11.6442 2 11.781 2.06243 11.876 2.1709L15.376 6.1709C15.382 6.17779 15.386 6.18623 15.3916 6.19336C15.4021 6.20677 15.4128 6.21991 15.4219 6.23438C15.4299 6.24706 15.4366 6.26024 15.4434 6.27344C15.4519 6.29003 15.4602 6.30662 15.4668 6.32422C15.47 6.33284 15.4719 6.34184 15.4746 6.35059C15.4809 6.37046 15.4875 6.39027 15.4912 6.41113C15.4948 6.43118 15.4959 6.45141 15.4971 6.47168C15.4976 6.48109 15.5 6.49046 15.5 6.5L15.499 6.50293C15.4989 6.52258 15.4966 6.542 15.4941 6.56152C15.4915 6.58288 15.4877 6.60358 15.4824 6.62402C15.4771 6.64473 15.4719 6.66553 15.4639 6.68555C15.4437 6.736 15.4135 6.78051 15.3789 6.82129C15.3738 6.82729 15.3707 6.835 15.3652 6.84082L8.36523 14.3408C8.36209 14.3442 8.35772 14.3463 8.35449 14.3496C8.31081 14.394 8.25989 14.4297 8.20312 14.4551C8.19831 14.4572 8.19336 14.4589 8.18848 14.4609C8.16475 14.4707 8.14044 14.4784 8.11523 14.4844C8.10708 14.4863 8.09908 14.4887 8.09082 14.4902C8.06114 14.4957 8.03094 14.5 8 14.5C7.96873 14.5 7.93818 14.4959 7.9082 14.4902C7.89994 14.4887 7.89194 14.4863 7.88379 14.4844C7.85861 14.4783 7.83424 14.4707 7.81055 14.4609C7.80568 14.4589 7.8007 14.4572 7.7959 14.4551C7.73925 14.4296 7.68811 14.394 7.64453 14.3496C7.64147 14.3465 7.63775 14.344 7.63477 14.3408L0.634766 6.84082C0.629193 6.83485 0.625344 6.82746 0.620117 6.82129C0.585695 6.78063 0.556254 6.7358 0.536133 6.68555C0.52812 6.66553 0.522897 6.64473 0.517578 6.62402C0.512339 6.60358 0.508492 6.58288 0.505859 6.56152C0.503633 6.54362 0.500285 6.52583 0.5 6.50781V6.5C0.5 6.49047 0.501427 6.48107 0.501953 6.47168C0.503095 6.45145 0.504212 6.43114 0.507812 6.41113C0.508512 6.40723 0.508976 6.40328 0.509766 6.39941L0.530273 6.33105C0.531073 6.32883 0.531394 6.32643 0.532227 6.32422C0.538833 6.30665 0.547199 6.29001 0.555664 6.27344C0.562393 6.26026 0.569169 6.24705 0.577148 6.23438C0.586243 6.21993 0.59694 6.20676 0.607422 6.19336C0.613126 6.18607 0.617857 6.17795 0.624023 6.1709L4.12402 2.1709L4.20215 2.09863C4.28759 2.03523 4.39176 2 4.5 2H11.5ZM5.73828 7L8 12.6543L10.2607 7H5.73828ZM2.14941 7L6.54492 11.709L4.66211 7H2.14941ZM11.3379 7L9.4541 11.709L13.8496 7H11.3379ZM2.10059 6H4.75L7 3H4.72656L2.10059 6ZM6 6H9.99902L8 3.33301L6 6ZM11.25 6H13.8984L11.2734 3H9L11.25 6Z\",\n  fill: \"#FE375B\"\n}));\nconst CrownIcon = ({\n  size = 20,\n  color\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 10 10\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  \"fill-rule\": \"evenodd\",\n  \"clip-rule\": \"evenodd\",\n  d: \"M7.46461 7.50012C7.6372 7.50012 7.77711 7.64003 7.77711 7.81262C7.77703 8.33031 7.35733 8.75012 6.83961 8.75012H3.15992C2.64221 8.75012 2.22251 8.33031 2.22242 7.81262C2.22242 7.64003 2.36233 7.50012 2.53492 7.50012H7.46461ZM4.36305 1.62512C4.60848 1.12511 5.39103 1.12514 5.63649 1.62512L6.37281 3.12609C6.61918 3.62839 7.32234 3.78588 7.7986 3.44543L8.41188 3.00695C8.7754 2.74709 9.28932 3.0757 9.14039 3.47277L8.1111 6.2091C7.91855 6.7209 7.38751 7.06555 6.79078 7.06555H3.20875C2.61203 7.06554 2.08099 6.72089 1.88844 6.2091L0.859143 3.47277C0.710245 3.07571 1.22414 2.7471 1.58766 3.00695L2.20094 3.44543C2.6772 3.78588 3.38035 3.62839 3.62672 3.12609L4.36305 1.62512Z\",\n  fill: color\n}));\nconst SEND_BUTTON_INSET = 4;\nconst SEND_BUTTON_CORNER_RADIUS = 20;\nconst INPUT_BLOCK_CORNER_RADIUS = SEND_BUTTON_CORNER_RADIUS + SEND_BUTTON_INSET;\nconst DOCK_PANEL_CORNER_RADIUS = SEND_BUTTON_CORNER_RADIUS + SEND_BUTTON_INSET + 12;\nconst ATTACH_BUTTON_SIZE = 48;\nconst LINE_HEIGHT = 20;\nconst PADDING_VERTICAL = 10;\nconst SEND_BUTTON_HEIGHT = 40;\nconst SEND_BUTTON_WIDTH = 60;\nconst MAX_LINES = 5;\nconst inputMinHeight = SEND_BUTTON_HEIGHT;\nconst inputMaxHeight = LINE_HEIGHT * MAX_LINES + PADDING_VERTICAL * 2;\nconst sendButtonRadius = SEND_BUTTON_CORNER_RADIUS;\nconst clampInputHeight = height => Math.min(inputMaxHeight, Math.max(inputMinHeight, height));\nconst normalizeInputHeight = height => {\n  if (height <= inputMinHeight + LINE_HEIGHT / 2) {\n    return inputMinHeight;\n  }\n  return clampInputHeight(height);\n};\nreturn ({\n  value,\n  onChangeText,\n  onSend,\n  onAttachmentPress,\n  onGiftPress,\n  placeholder,\n  showPaidBadge,\n  paidPrice,\n  canSend\n}) => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const [contentHeight, setContentHeight] = React.useState(inputMinHeight);\n  const inputRef = React.useRef(null);\n  const inputBgColor = React.useMemo(() => {\n    const bgColor = theme.theme.component?.textField?.bgMessageInput || '#04060F';\n    if (bgColor.startsWith('#') && bgColor.length === 7) {\n      return bgColor + '0D';\n    }\n    return 'rgba(4, 6, 15, 0.05)';\n  }, [theme]);\n  React.useEffect(() => {\n    if (!value?.length) {\n      setContentHeight(inputMinHeight);\n    }\n  }, [value]);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'web' || typeof document === 'undefined') return;\n    if (document.querySelector('style[data-camble-chat-input-scrollbar]')) return;\n    const style = document.createElement('style');\n    style.setAttribute('data-camble-chat-input-scrollbar', 'true');\n    style.textContent = `\n      [data-camble-chat-input=\"true\"] {\n        white-space: pre-wrap !important;\n        overflow-wrap: break-word !important;\n        word-break: break-word !important;\n        resize: none !important;\n      }\n      [data-camble-chat-input=\"true\"]::-webkit-scrollbar {\n        display: none;\n      }\n    `;\n    document.head.appendChild(style);\n  }, []);\n  const inputHeight = React.useMemo(() => clampInputHeight(contentHeight), [contentHeight]);\n  const isInputScrollable = inputHeight >= inputMaxHeight;\n  const measureWebInputHeight = React.useCallback((node = inputRef.current) => {\n    if (ReactNative.Platform.OS !== 'web') return;\n    if (!node?.style || typeof node.scrollHeight !== 'number') return;\n    const previousHeight = node.style.height;\n    node.style.height = 'auto';\n    const measuredHeight = node.scrollHeight;\n    node.style.height = previousHeight;\n    if (typeof measuredHeight !== 'number' || Number.isNaN(measuredHeight)) return;\n    setContentHeight(normalizeInputHeight(measuredHeight));\n  }, []);\n  const handleContentSizeChange = React.useCallback(event => {\n    const measuredHeight = event?.nativeEvent?.contentSize?.height;\n    if (typeof measuredHeight !== 'number' || Number.isNaN(measuredHeight)) return;\n    setContentHeight(normalizeInputHeight(measuredHeight));\n  }, []);\n  const handleInputChange = React.useCallback(event => {\n    measureWebInputHeight(event?.target);\n  }, [measureWebInputHeight]);\n  React.useEffect(() => {\n    if (ReactNative.Platform.OS !== 'web') return;\n    const frame = requestAnimationFrame(() => measureWebInputHeight());\n    return () => cancelAnimationFrame(frame);\n  }, [value, measureWebInputHeight]);\n  const attachIconColor = theme.theme.component?.button?.secondary?.content || '#04060F';\n  const giftIconColor = theme.theme.component?.button?.brand?.content || '#FFFFFF';\n  const placeholderColor = theme.theme.component?.textField?.contentTertiary || 'rgba(255, 255, 255, 0.3)';\n  const styles = React.useMemo(() => ({\n    rowOuter: {\n      flexDirection: 'row',\n      alignItems: 'flex-end',\n      paddingVertical: 12,\n      paddingHorizontal: 12,\n      backgroundColor: theme.theme.semantic?.surface?.regular?.surface1,\n      overflow: 'hidden'\n    },\n    attachButtonContainer: {\n      width: ATTACH_BUTTON_SIZE,\n      height: ATTACH_BUTTON_SIZE,\n      marginRight: 8\n    },\n    giftButtonContainer: {\n      width: ATTACH_BUTTON_SIZE,\n      height: ATTACH_BUTTON_SIZE,\n      marginLeft: 8\n    },\n    attachButtonInner: {\n      width: ATTACH_BUTTON_SIZE,\n      height: ATTACH_BUTTON_SIZE,\n      borderTopLeftRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderTopRightRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderBottomLeftRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderBottomRightRadius: INPUT_BLOCK_CORNER_RADIUS,\n      backgroundColor: inputBgColor,\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    giftButtonInner: {\n      width: ATTACH_BUTTON_SIZE,\n      height: ATTACH_BUTTON_SIZE,\n      borderTopLeftRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderTopRightRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderBottomLeftRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderBottomRightRadius: INPUT_BLOCK_CORNER_RADIUS,\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault || '#FE375B',\n      justifyContent: 'center',\n      alignItems: 'center'\n    },\n    inputInnerRow: {\n      flex: 1,\n      flexDirection: 'row',\n      alignItems: 'flex-end',\n      minWidth: 0,\n      backgroundColor: inputBgColor,\n      borderTopLeftRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderTopRightRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderBottomLeftRadius: INPUT_BLOCK_CORNER_RADIUS,\n      borderBottomRightRadius: INPUT_BLOCK_CORNER_RADIUS,\n      minHeight: inputMinHeight,\n      paddingLeft: 0\n    },\n    textInput: {\n      flex: 1,\n      minWidth: 0,\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 16,\n      paddingLeft: 18,\n      paddingRight: 8,\n      lineHeight: LINE_HEIGHT,\n      letterSpacing: -0.3,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F',\n      paddingVertical: PADDING_VERTICAL,\n      alignSelf: 'center',\n      minHeight: inputMinHeight,\n      maxHeight: inputMaxHeight,\n      textAlignVertical: 'center',\n      ...(ReactNative.Platform.OS === 'web' && {\n        scrollbarWidth: 'none',\n        msOverflowStyle: 'none',\n        whiteSpace: 'pre-wrap',\n        overflowWrap: 'break-word',\n        wordBreak: 'break-word',\n        resize: 'none'\n      })\n    },\n    sendControlWrap: {\n      flexDirection: 'row',\n      alignItems: 'flex-end',\n      justifyContent: 'flex-end',\n      gap: 10,\n      width: SEND_BUTTON_WIDTH + SEND_BUTTON_INSET * 2,\n      height: SEND_BUTTON_HEIGHT + SEND_BUTTON_INSET * 2,\n      padding: SEND_BUTTON_INSET\n    },\n    paidBadgeContainer: {\n      flexDirection: 'row',\n      justifyContent: 'center',\n      alignItems: 'center',\n      paddingHorizontal: 6,\n      paddingRight: 16,\n      gap: 2,\n      height: SEND_BUTTON_HEIGHT\n    },\n    paidBadgeText: {\n      fontFamily: 'Inter',\n      fontWeight: '500',\n      fontSize: 12,\n      letterSpacing: -0.2,\n      color: theme.theme.semantic?.content?.regular?.primary ?? '#04060F',\n      ...(ReactNative.Platform.OS === 'android' && {\n        includeFontPadding: false\n      })\n    },\n    sendButtonInner: {\n      width: SEND_BUTTON_WIDTH,\n      height: SEND_BUTTON_HEIGHT,\n      padding: 8,\n      borderTopLeftRadius: sendButtonRadius,\n      borderTopRightRadius: sendButtonRadius,\n      borderBottomLeftRadius: sendButtonRadius,\n      borderBottomRightRadius: sendButtonRadius,\n      backgroundColor: '#FE375B',\n      justifyContent: 'center',\n      alignItems: 'center'\n    }\n  }), [theme, inputBgColor, sendButtonRadius]);\n  const textLength = value?.length || 0;\n  const shouldShowSendInPaidMode = !!showPaidBadge && textLength > 0;\n  const session = State.api?.session?.useSession?.();\n  const hasSubscription = !!session?.subscription?.hasSubscription;\n  const limits = State.api.limits.useLimits();\n  const freeSpins = 5;\n  const remainingSpins = Math.max(0, limits?.freeMessages ?? 0);\n  const hasSpins = remainingSpins > 0;\n  const isShiftPressed = React.useRef(false);\n  const preventWebMouseDownBlur = React.useCallback(e => {\n    if (ReactNative.Platform.OS === 'web') {\n      e?.preventDefault?.();\n    }\n  }, []);\n  const triggerSend = React.useCallback(_async(function () {\n    if (!onSend) return;\n    return _await(Promise.resolve(onSend()), function () {\n      if (ReactNative.Platform.OS === 'web') {\n        requestAnimationFrame(() => {\n          inputRef.current?.focus?.();\n        });\n      }\n    }); // On mobile web tapping the send button blurs the input.\n    // Refocus immediately so virtual keyboard remains open.\n  }), [onSend]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.rowOuter\n  }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.attachButtonContainer,\n    style: styles.attachButtonInner,\n    onPress: onAttachmentPress\n  }, /*#__PURE__*/React.createElement(GalleryIcon, {\n    size: 24,\n    color: attachIconColor\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.inputInnerRow\n  }, /*#__PURE__*/React.createElement(ReactNative.TextInput, _extends({\n    ref: inputRef,\n    value: value,\n    onChangeText: onChangeText,\n    placeholder: placeholder || t('chatInputPlaceholder'),\n    placeholderTextColor: placeholderColor,\n    style: [styles.textInput, {\n      height: inputHeight,\n      ...(ReactNative.Platform.OS === 'web' && {\n        overflowY: isInputScrollable ? 'auto' : 'hidden'\n      })\n    }],\n    onContentSizeChange: handleContentSizeChange,\n    onChange: handleInputChange\n  }, ReactNative.Platform.OS === 'web' ? {\n    dataSet: {\n      cambleChatInput: 'true'\n    }\n  } : {}, {\n    onKeyPress: _async(function (e) {\n      if (ReactNative.Platform.OS === 'web') {\n        if (e.nativeEvent.key === 'Shift') {\n          isShiftPressed.current = true;\n        }\n      }\n      return _await();\n    }),\n    onKeyUp: _async(function (e) {\n      if (ReactNative.Platform.OS === 'web') {\n        if (e.nativeEvent.key === 'Shift') {\n          isShiftPressed.current = false;\n        }\n        if (e.nativeEvent.key === 'Enter') {\n          if (!isShiftPressed.current) {\n            triggerSend();\n          }\n        }\n      }\n      return _await();\n    }),\n    multiline: true,\n    maxLength: 1000,\n    numberOfLines: 1,\n    scrollEnabled: isInputScrollable,\n    showsVerticalScrollIndicator: false\n  })), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.sendControlWrap\n  }, showPaidBadge ? shouldShowSendInPaidMode ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.sendButtonInner,\n    onMouseDown: preventWebMouseDownBlur,\n    onPress: triggerSend\n  }, /*#__PURE__*/React.createElement(SendIcon, {\n    size: 24,\n    color: \"#FFFFFF\"\n  })) : hasSpins ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: [styles.paidBadgeContainer, !canSend ? {\n      opacity: 0.6\n    } : null],\n    onMouseDown: preventWebMouseDownBlur,\n    onPress: triggerSend\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.paidBadgeText\n  }, remainingSpins, \"/\", freeSpins), /*#__PURE__*/React.createElement(CrownIcon, {\n    size: 16,\n    color: \"#FE375B\"\n  })) : paidPrice && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: [styles.paidBadgeContainer, !canSend ? {\n      opacity: 0.6\n    } : null],\n    onMouseDown: preventWebMouseDownBlur,\n    onPress: triggerSend\n  }, /*#__PURE__*/React.createElement(MainCurrencyIcon, {\n    size: 16\n  }), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.paidBadgeText\n  }, `${paidPrice}`)) : canSend ? /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    style: styles.sendButtonInner,\n    onMouseDown: preventWebMouseDownBlur,\n    onPress: triggerSend\n  }, /*#__PURE__*/React.createElement(SendIcon, {\n    size: 24,\n    color: \"#FFFFFF\"\n  })) : null)), !!onGiftPress && /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    styleContainer: styles.giftButtonContainer,\n    style: styles.giftButtonInner,\n    onMouseDown: preventWebMouseDownBlur,\n    onPress: onGiftPress\n  }, /*#__PURE__*/React.createElement(GiftIcon, {\n    size: 24,\n    color: giftIconColor\n  })));\n};"},"GiftCircleButton":{"name":"GiftCircleButton","key":"f035c9350cf3afd6fcaee9759b746c8e3cc20d1af5227e5ec15f960e8916fb34","code":"const GiftIcon = React.memo(({\n  size = 24,\n  color = '#FFFFFF'\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: size,\n  height: size,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\"\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M11 22.0001H7C6.20435 22.0001 5.44152 21.6838 4.87891 21.1212C4.31632 20.5586 4 19.7957 4 19.0001V15.0001C4.00002 14.7349 4.10545 14.4806 4.29297 14.2931C4.4805 14.1055 4.7348 14.0001 5 14.0001H11V22.0001ZM19 14.0001C19.2652 14.0001 19.5195 14.1055 19.707 14.2931C19.8946 14.4806 20 14.7349 20 15.0001V19.0001C20 19.7957 19.6837 20.5586 19.1211 21.1212C18.5585 21.6838 17.7956 22.0001 17 22.0001H13V14.0001H19ZM16.5 2.00009C17.0904 1.99997 17.6713 2.14903 18.1885 2.43369C18.7058 2.71849 19.1433 3.12996 19.459 3.629C19.7746 4.12796 19.9584 4.69886 19.9941 5.28818C20.0299 5.87758 19.9161 6.46658 19.6631 7.00009H20C20.5304 7.00009 21.039 7.21098 21.4141 7.58603C21.7891 7.96109 22 8.46968 22 9.00009V10.0001C22 10.5305 21.7891 11.0391 21.4141 11.4142C21.039 11.7892 20.5304 12.0001 20 12.0001H13V7.00009H11V12.0001H4C3.46957 12.0001 2.96101 11.7892 2.58594 11.4142C2.21088 11.0391 2 10.5305 2 10.0001V9.00009C2.00002 8.46968 2.21088 7.96109 2.58594 7.58603C2.96101 7.21098 3.46958 7.00009 4 7.00009H4.33691C4.11482 6.53127 3.99977 6.01886 4 5.50009C4.00003 3.56712 5.56742 2.00009 7.4834 2.00009C9.23816 1.97027 10.7953 3.09197 11.8643 4.93369L12 5.17685C13.033 3.26299 14.5601 2.06304 16.291 2.00205L16.5 2.00009ZM7.5 4.00009C7.10219 4.00009 6.72075 4.15826 6.43945 4.43955C6.15816 4.72083 6.00002 5.10229 6 5.50009C6 5.8979 6.15817 6.27934 6.43945 6.56064C6.72076 6.84194 7.10218 7.00009 7.5 7.00009H10.6426C9.90157 5.09521 8.69396 3.98009 7.5 4.00009ZM16.4834 4.00009C15.3034 3.98009 14.0984 5.09621 13.3574 7.00009H16.5C16.8978 6.99784 17.2789 6.83768 17.5586 6.55478C17.8382 6.2719 17.9935 5.88902 17.9912 5.4913C17.9889 5.09361 17.8287 4.71331 17.5459 4.43369C17.2631 4.15409 16.8811 3.99794 16.4834 4.00009Z\",\n  fill: color\n})));\nreturn ({\n  onPress,\n  size = 48,\n  iconSize = 24,\n  disabled = false,\n  style\n}) => {\n  const theme = Theme.useTheme();\n  const styles = React.useMemo(() => ({\n    button: {\n      width: size,\n      height: size,\n      padding: 12,\n      borderRadius: 999,\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component?.button?.brand?.bgDefault ?? '#FE375B',\n      opacity: disabled ? 0.5 : 1\n    },\n    iconColor: theme.theme.component?.button?.brand?.content ?? '#FFFFFF'\n  }), [disabled, size, theme]);\n  return /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    noloading: true,\n    disabled: disabled,\n    onPress: onPress,\n    style: [styles.button, style]\n  }, /*#__PURE__*/React.createElement(GiftIcon, {\n    size: iconSize,\n    color: styles.iconColor\n  }));\n};"},"CallHistoryModal":{"name":"CallHistoryModal","key":"32f51052ee45e48a83d851cc3b06e9c9ef2636584c8d7c21a122f265a0a85cfb","code":"deps: Avatar, CardModal\nconst CloseIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(SVG.Svg, {\n  width: \"24\",\n  height: \"24\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  style: style\n}, /*#__PURE__*/React.createElement(SVG.Path, {\n  d: \"M16.4695 6.46997C16.7624 6.17709 17.2371 6.17708 17.53 6.46997C17.8227 6.76287 17.8228 7.23768 17.53 7.53052L13.0603 12.0002L17.53 16.47C17.8227 16.7629 17.8228 17.2377 17.53 17.5305C17.2372 17.8234 16.7624 17.8232 16.4695 17.5305L11.9998 13.0608L7.53003 17.5305C7.23719 17.8234 6.76239 17.8232 6.46948 17.5305C6.17659 17.2376 6.17659 16.7629 6.46948 16.47L10.9392 12.0002L6.46948 7.53052C6.17659 7.23762 6.17659 6.76286 6.46948 6.46997C6.76238 6.17709 7.23714 6.17708 7.53003 6.46997L11.9998 10.9397L16.4695 6.46997Z\",\n  fill: \"currentColor\"\n}));\nconst ChatButtonIcon = ({\n  style\n}) => /*#__PURE__*/React.createElement(Assets.ChatFill, {\n  size: 24,\n  style: style\n});\nconst formatCallDate = (locale, value) => {\n  if (value == null || value === '') return '';\n  const timestamp = Number(value);\n  const date = Number.isFinite(timestamp) ? new Date(timestamp) : new Date(value);\n  if (Number.isNaN(date.getTime())) return '';\n  const normalizedLocale = locale || undefined;\n  const dateText = date.toLocaleDateString(normalizedLocale, {\n    month: 'short',\n    day: 'numeric',\n    year: 'numeric'\n  });\n  const timeText = date.toLocaleTimeString(normalizedLocale, {\n    hour: 'numeric',\n    minute: '2-digit',\n    hour12: false\n  });\n  return `${dateText}, ${timeText}`;\n};\nconst getMeta = item => item?.pairData ?? item?.meta ?? item?.pair ?? null;\nconst getUserId = (item, meta) => meta?.user?.id ?? meta?.userId ?? meta?.id ?? item?.pairId ?? null;\nconst getUsername = (item, meta, fallback) => meta?.user?.username ?? meta?.card?.username ?? item?.name ?? fallback;\nreturn () => {\n  const theme = Theme.useTheme();\n  const t = Locale.useTranslation();\n  const sheet = Sheet.useSheet();\n  const safeArea = SafeArea.useSafeAreaInsets();\n  const {\n    height: windowHeight\n  } = ReactNative.useWindowDimensions();\n  const [locale] = Hooks.useBehaviorSubject(State.state.locale);\n  const [items, isLoading] = State.api.history.useCallHistory();\n  const styles = React.useMemo(() => ({\n    root: {\n      width: '100%',\n      backgroundColor: theme.theme.semantic.surface.regular.surface1,\n      borderTopLeftRadius: 24,\n      borderTopRightRadius: 24\n    },\n    dragger: {\n      position: 'absolute',\n      top: -11,\n      left: '50%',\n      marginLeft: -24,\n      width: 48,\n      height: 5,\n      borderRadius: 100,\n      backgroundColor: 'rgba(255,255,255,0.3)'\n    },\n    header: {\n      height: 56,\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      paddingHorizontal: 16,\n      paddingTop: 12,\n      paddingBottom: 4\n    },\n    title: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 16,\n      lineHeight: 24,\n      fontWeight: '500',\n      letterSpacing: -0.3,\n      fontFamily: theme.theme.typography.family.heading,\n      textAlign: 'center'\n    },\n    closeButton: {\n      position: 'absolute',\n      right: 12,\n      top: 12\n    },\n    closeButtonInner: {\n      width: 32,\n      height: 32,\n      alignItems: 'center',\n      justifyContent: 'center'\n    },\n    closeIcon: {\n      color: theme.theme.semantic.content.regular.primary\n    },\n    content: {\n      width: '100%',\n      paddingHorizontal: 16,\n      paddingTop: 16,\n      paddingBottom: Math.max(safeArea.bottom, 24),\n      gap: 16\n    },\n    row: {\n      minHeight: 48,\n      width: '100%',\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'space-between',\n      gap: 8\n    },\n    rowMain: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'row',\n      alignItems: 'center',\n      gap: 8\n    },\n    textWrap: {\n      flex: 1,\n      minWidth: 0,\n      flexDirection: 'column',\n      alignItems: 'flex-start',\n      justifyContent: 'center'\n    },\n    name: {\n      width: '100%',\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      fontFamily: theme.theme.typography.family.heading\n    },\n    date: {\n      width: '100%',\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph\n    },\n    chatButton: {\n      width: 48,\n      height: 48,\n      borderRadius: 999,\n      flexDirection: 'row',\n      alignItems: 'center',\n      justifyContent: 'center',\n      backgroundColor: theme.theme.component.button.brand.bgDefault\n    },\n    chatIcon: {\n      color: theme.theme.semantic.content.inversion.static.stPrimary\n    },\n    empty: {\n      minHeight: 260,\n      width: '100%',\n      flexDirection: 'column',\n      alignItems: 'center',\n      justifyContent: 'center',\n      gap: 8,\n      paddingHorizontal: 16,\n      paddingBottom: Math.max(safeArea.bottom, 24)\n    },\n    emptyTitle: {\n      color: theme.theme.semantic.content.regular.primary,\n      fontSize: 18,\n      lineHeight: 24,\n      fontWeight: '600',\n      letterSpacing: -0.7,\n      fontFamily: theme.theme.typography.family.heading,\n      textAlign: 'center'\n    },\n    emptySubtitle: {\n      color: theme.theme.semantic.content.regular.secondary,\n      fontSize: 14,\n      lineHeight: 20,\n      fontWeight: '500',\n      letterSpacing: -0.2,\n      fontFamily: theme.theme.typography.family.paragraph,\n      textAlign: 'center'\n    }\n  }), [theme, safeArea, windowHeight]);\n  const openProfile = React.useCallback(meta => {\n    if (!meta) return;\n    sheet.close();\n    Sheet.showSheet(/*#__PURE__*/React.createElement(ModuleComponent, {\n      name: \"cardModal\",\n      meta: meta,\n      source: \"call_history\"\n    }), {\n      theme: Theme.isDark.value ? 'dark' : 'light',\n      props: {\n        swipeUp: true,\n        swipeDismissibleUp: true,\n        style: {\n          maxWidth: 600,\n          overflow: 'hidden'\n        }\n      }\n    });\n  }, [sheet]);\n  const openChat = React.useCallback(userId => {\n    if (userId == null) return;\n    sheet.close();\n    // State.store.chat_chatId?.next?.(null);\n    // State.store.user_userId?.next?.(userId);\n    // Navigation.navigationRef.dispatch(\n    //   ReactNavigation.StackActions.push('Chat', { userId, source: 'call_history' }),\n    // );\n    State.api.chat.openModal(userId, 'call_history');\n  }, [sheet]);\n  const renderItem = React.useCallback((item, index) => {\n    const rawMeta = getMeta(item);\n    const meta = State.api?.users?.sanitizeMeta?.(rawMeta) ?? rawMeta;\n    const userId = getUserId(item, meta);\n    const isPlaceholderProfile = !!meta && State.api?.users?.isApprovedProfile?.(meta) === false;\n    const title = isPlaceholderProfile ? t('profilePlaceholderUser') || 'User' : getUsername(item, meta, t('callHistoryUnknownUser'));\n    const date = formatCallDate(locale, item?.timeStarted ?? item?.created);\n    const photo = meta?.photos?.[0] ?? null;\n    const isPro = !!meta?.subscription?.hasSubscription;\n    const key = item?.sessionId ?? `${userId ?? 'unknown'}-${item?.timeStarted ?? index}`;\n    return /*#__PURE__*/React.createElement(ReactNative.View, {\n      key: key,\n      style: styles.row\n    }, /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      noloading: true,\n      styleContainer: {\n        flex: 1,\n        minWidth: 0\n      },\n      style: styles.rowMain,\n      onPress: () => openProfile(meta)\n    }, /*#__PURE__*/React.createElement(LazyComponent, {\n      name: \"Avatar\",\n      size: 48,\n      photo: photo,\n      isPro: isPro\n    }), /*#__PURE__*/React.createElement(ReactNative.View, {\n      style: styles.textWrap\n    }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.name,\n      numberOfLines: 1\n    }, title), /*#__PURE__*/React.createElement(ReactNative.Text, {\n      style: styles.date,\n      numberOfLines: 1\n    }, date))), /*#__PURE__*/React.createElement(Components.DSPressable, {\n      feedback: true,\n      noloading: true,\n      style: styles.chatButton,\n      scale: 0.86,\n      onPress: () => openChat(userId)\n    }, /*#__PURE__*/React.createElement(ChatButtonIcon, {\n      style: styles.chatIcon\n    })));\n  }, [locale, openChat, openProfile, styles, t]);\n  return /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.root\n  }, /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.dragger\n  }), /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.header\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.title\n  }, t('callHistoryTitle')), /*#__PURE__*/React.createElement(Components.DSPressable, {\n    feedback: true,\n    opacity: 0.4,\n    translateY: 4,\n    noloading: true,\n    onPress: () => sheet.close(),\n    styleContainer: styles.closeButton,\n    style: styles.closeButtonInner\n  }, /*#__PURE__*/React.createElement(CloseIcon, {\n    style: styles.closeIcon\n  }))), isLoading ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.empty\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t('loading'))) : items?.length > 0 ? /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.content,\n    contentContainerStyle: styles.listContent\n  }, items.map(renderItem)) : /*#__PURE__*/React.createElement(ReactNative.View, {\n    style: styles.empty\n  }, /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptyTitle\n  }, t('callHistoryEmptyTitle')), /*#__PURE__*/React.createElement(ReactNative.Text, {\n    style: styles.emptySubtitle\n  }, t('callHistoryEmptySubtitle'))));\n};"}},"version":15}