@spotsdev/sdk 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/api/client.ts","../src/api/types.ts","../src/api/queries/auth.ts","../src/api/queries/users.ts","../src/api/queries/spots.ts","../src/api/queries/posts.ts","../src/api/queries/conversations.ts","../src/api/queries/clubs.ts","../src/api/queries/templates.ts","../src/api/queries/notifications.ts","../src/api/queries/misc.ts","../src/api/queries/products.ts","../src/api/queries/orders.ts","../src/api/queries/wallet.ts","../src/api/queries/payments.ts","../src/api/mutations/users.ts","../src/api/mutations/posts.ts","../src/api/mutations/spots.ts","../src/api/mutations/conversations.ts","../src/api/mutations/clubs.ts","../src/api/mutations/notifications.ts","../src/api/mutations/products.ts","../src/api/mutations/orders.ts","../src/api/mutations/redemptions.ts"],"names":["axios","types_star","useMutation","useQuery","extractArrayData","useInfiniteQuery","extractObjectData","useQueryClient"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Spots SDK\n *\n * TypeScript SDK for the Spots API with TanStack Query hooks.\n *\n * @example\n * ```tsx\n * import { configureSDK, useCurrentUser, useSpots, useCreatePost } from '@spots/sdk';\n *\n * // Configure SDK with your API base URL and token management\n * configureSDK({\n * baseURL: 'https://spots-api-psi.vercel.app',\n * getAccessToken: () => localStorage.getItem('accessToken'),\n * refreshAccessToken: async () => {\n * // Your token refresh logic\n * return newAccessToken;\n * },\n * onUnauthorized: () => {\n * // Handle unauthorized access\n * window.location.href = '/login';\n * },\n * });\n *\n * // Use hooks in your components\n * function App() {\n * const { data: user } = useCurrentUser();\n * const { data: spots } = useSpots();\n * const { mutate: createPost } = useCreatePost();\n * // ...\n * }\n * ```\n */\n\n// ============================================================================\n// API CLIENT\n// ============================================================================\n\nexport type {SDKConfig} from './api/client'\nexport {configureSDK, getApiClient, getConfig} from './api/client'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport * from './api/types'\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\nexport * from './api/queries'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\nexport * from './api/mutations'\n","import axios, {\n type AxiosError,\n type AxiosInstance,\n type InternalAxiosRequestConfig,\n} from 'axios'\n\nexport interface SDKConfig {\n baseURL: string\n getAccessToken: () => string | null | Promise<string | null>\n refreshAccessToken?: () => Promise<string>\n onUnauthorized?: () => void\n}\n\nlet config: SDKConfig | null = null\nlet apiClient: AxiosInstance | null = null\n\nexport function configureSDK(sdkConfig: SDKConfig): void {\n config = sdkConfig\n apiClient = createApiClient(sdkConfig)\n}\n\nexport function getApiClient(): AxiosInstance {\n if (!apiClient) {\n throw new Error('SDK not configured. Call configureSDK() first.')\n }\n return apiClient\n}\n\nexport function getConfig(): SDKConfig {\n if (!config) {\n throw new Error('SDK not configured. Call configureSDK() first.')\n }\n return config\n}\n\nfunction createApiClient(sdkConfig: SDKConfig): AxiosInstance {\n const client = axios.create({\n baseURL: sdkConfig.baseURL,\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n // Request interceptor - add auth token\n client.interceptors.request.use(\n async (requestConfig: InternalAxiosRequestConfig) => {\n const token = await sdkConfig.getAccessToken()\n if (token) {\n requestConfig.headers.Authorization = `Bearer ${token}`\n }\n\n // Debug logging\n console.log(\n `[SDK] ${requestConfig.method?.toUpperCase()} ${sdkConfig.baseURL}${requestConfig.url}`,\n )\n return requestConfig\n },\n error => Promise.reject(error),\n )\n\n // Response interceptor - handle 401\n client.interceptors.response.use(\n response => response,\n async (error: AxiosError) => {\n console.log(\n `[SDK] Error: ${error.response?.status} ${error.config?.url}`,\n error.message,\n )\n\n // Handle auth token expiration (401)\n if (error.response?.status === 401) {\n if (sdkConfig.refreshAccessToken) {\n try {\n const newToken = await sdkConfig.refreshAccessToken()\n if (newToken && error.config) {\n error.config.headers.Authorization = `Bearer ${newToken}`\n return client.request(error.config)\n }\n } catch {\n sdkConfig.onUnauthorized?.()\n }\n } else {\n sdkConfig.onUnauthorized?.()\n }\n }\n return Promise.reject(error)\n },\n )\n\n return client\n}\n\nexport {apiClient}\n","/**\n * Spots SDK Types\n *\n * Type sources:\n * - Entity types (User, Spot, Post, etc.) → from ./entities (local definitions)\n * - DTO types (CreatePostDto, etc.) → import from @spots/types (OpenAPI generated)\n *\n * This file provides type aliases for SDK convenience.\n */\n\n// ============================================================================\n// RE-EXPORTS FROM SOURCES\n// ============================================================================\n\n// Re-export all DTO types from @spotsdev/types (OpenAPI generated)\nexport * from '@spotsdev/types'\n\n// Re-export entity types from local entities file (Prisma-compatible but no Prisma dep)\nexport * from './entities'\n\n// ============================================================================\n// SDK TYPE ALIASES\n// These provide convenient names that match SDK usage patterns\n// ============================================================================\n\nimport {\n type ClaimSpotDto,\n type CreateConversationDto,\n type CreateMessageDto,\n type CreatePostDto,\n type CreateReplyDto,\n type CreateResponseDto,\n type SendOtpDto,\n type UpdateResponseDto,\n type UpdateUserDto,\n type UpvoteResponseDto,\n type VerifyOtpDto,\n type VerifyOtpWrappedResponseDto,\n} from '@spotsdev/types'\n\nimport {type PostTemplate, type SpotPost} from './entities'\n\n// Request type aliases (map to DTOs)\nexport type SendOtpRequest = SendOtpDto\nexport type VerifyOtpRequest = VerifyOtpDto\nexport type CreatePostRequest = CreatePostDto\nexport type CreateReplyRequest = CreateReplyDto\nexport type RespondToPostRequest = CreateResponseDto\nexport type UpdateResponseRequest = UpdateResponseDto\nexport type UpdateProfileRequest = UpdateUserDto\nexport type CreateConversationRequest = CreateConversationDto\nexport type SendMessageRequest = CreateMessageDto\nexport type ClaimSpotRequest = ClaimSpotDto\n\n// Response type aliases\nexport type UpvoteResponse = UpvoteResponseDto\nexport type AuthResponse = VerifyOtpWrappedResponseDto\n\n// Entity type aliases (for backward compatibility)\nexport type Post = SpotPost\nexport type Template = PostTemplate\n\n// ============================================================================\n// SDK-SPECIFIC TYPES (not from entities or DTOs)\n// ============================================================================\n\n/**\n * Spot summary with activity indicators\n * Returned by /users/me/spots-summary\n */\nexport interface SpotSummary {\n spotId: string\n spotName: string\n spotSlug: string\n spotType: string\n postCount: number\n unreadMessages: number\n pendingResponses: number\n lastActivity: string | null\n hasNewActivity: boolean\n}\n\n/**\n * Response meta for spots summary\n */\nexport interface SpotsSummaryMeta {\n totalSpots: number\n totalUnreadMessages: number\n totalPendingResponses: number\n}\n\n/**\n * Full response from /users/me/spots-summary\n */\nexport interface SpotsSummaryResponse {\n data: SpotSummary[]\n meta: SpotsSummaryMeta\n}\n","/**\n * Auth Mutation Hooks\n *\n * TanStack Query hooks for authentication operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type AuthResponse,\n type SendOtpRequest,\n type VerifyOtpRequest,\n} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Send OTP to phone number\n *\n * @endpoint POST /auth/send-otp\n */\nexport function useSendOtp(\n options?: Omit<\n UseMutationOptions<ApiResponse<{sent: boolean}>, Error, SendOtpRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<ApiResponse<{sent: boolean}>, Error, SendOtpRequest> {\n return useMutation({\n mutationFn: async (data: SendOtpRequest) => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{sent: boolean}>>(\n '/auth/send-otp',\n data,\n )\n return response.data\n },\n ...options,\n })\n}\n\n/**\n * Verify OTP and authenticate\n *\n * @endpoint POST /auth/verify-otp\n */\nexport function useVerifyOtp(\n options?: Omit<\n UseMutationOptions<AuthResponse, Error, VerifyOtpRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<AuthResponse, Error, VerifyOtpRequest> {\n return useMutation({\n mutationFn: async (data: VerifyOtpRequest) => {\n const client = getApiClient()\n const response = await client.post<AuthResponse>('/auth/verify-otp', data)\n return response.data\n },\n ...options,\n })\n}\n\n/**\n * Refresh access token\n *\n * @endpoint POST /auth/refresh\n */\nexport function useRefreshToken(\n options?: Omit<\n UseMutationOptions<{accessToken: string}, Error, {refreshToken: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<{accessToken: string}, Error, {refreshToken: string}> {\n return useMutation({\n mutationFn: async (data: {refreshToken: string}) => {\n const client = getApiClient()\n const response = await client.post<{accessToken: string}>(\n '/auth/refresh',\n data,\n )\n return response.data\n },\n ...options,\n })\n}\n","/**\n * Users Query Hooks\n *\n * TanStack Query hooks for user-related operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type Club,\n type FavoriteSpot,\n type Post,\n type Spot,\n type SpotsSummaryResponse,\n type SpotSubscription,\n type User,\n} from '../types'\n\n// Helper to extract array data from API response\n// API can return either { data: T[] } or { data: { data: T[], meta?: {...} } }\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const userKeys = {\n all: ['users'] as const,\n me: () => [...userKeys.all, 'me'] as const,\n stats: () => [...userKeys.me(), 'stats'] as const,\n spotsSummary: () => [...userKeys.me(), 'spots-summary'] as const,\n activity: (limit?: number) => [...userKeys.me(), 'activity', limit] as const,\n posts: (params?: {page?: number; limit?: number}) =>\n [...userKeys.me(), 'posts', params] as const,\n clubs: () => [...userKeys.me(), 'clubs'] as const,\n subscriptions: () => [...userKeys.me(), 'subscriptions'] as const,\n blocked: () => [...userKeys.me(), 'blocked'] as const,\n ownedSpots: () => [...userKeys.me(), 'owned-spots'] as const,\n favorites: () => [...userKeys.me(), 'favorites'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get current user's profile\n *\n * @endpoint GET /users/me\n */\nexport function useCurrentUser(\n options?: Omit<UseQueryOptions<User>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<User> {\n return useQuery({\n queryKey: userKeys.me(),\n queryFn: async (): Promise<User> => {\n console.log('[SDK-USERS] Fetching /users/me...')\n const client = getApiClient()\n try {\n const response = await client.get<ApiResponse<User>>('/users/me')\n console.log('[SDK-USERS] Success:', response.status)\n return response.data.data\n } catch (error: unknown) {\n const axiosError = error as {\n response?: {status: number}\n config?: {url: string; baseURL?: string}\n }\n console.log(\n '[SDK-USERS] Error:',\n axiosError.response?.status,\n 'URL:',\n axiosError.config?.baseURL,\n axiosError.config?.url,\n )\n throw error\n }\n },\n ...options,\n })\n}\n\n/**\n * Get current user's stats\n *\n * @endpoint GET /users/me/stats\n * @deprecated This endpoint doesn't exist in the API. Use useUserSpotsSummary instead.\n */\nexport function useUserStats(\n options?: Omit<\n UseQueryOptions<{posts: number; responses: number; upvotes: number}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{posts: number; responses: number; upvotes: number}> {\n return useQuery({\n queryKey: userKeys.stats(),\n queryFn: async () => {\n const client = getApiClient()\n const response =\n await client.get<\n ApiResponse<{posts: number; responses: number; upvotes: number}>\n >('/users/me/stats')\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get current user's spots summary with activity indicators\n *\n * Returns list of spots where user has posted, with:\n * - Post count per spot\n * - Unread messages count\n * - Pending responses count\n * - Last activity timestamp\n *\n * @endpoint GET /users/me/spots-summary\n */\nexport function useUserSpotsSummary(\n options?: Omit<UseQueryOptions<SpotsSummaryResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<SpotsSummaryResponse> {\n return useQuery({\n queryKey: userKeys.spotsSummary(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<SpotsSummaryResponse>>(\n '/users/me/spots-summary',\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get current user's activity\n *\n * @endpoint GET /users/me/activity\n */\nexport function useUserActivity(\n limit: number = 10,\n options?: Omit<UseQueryOptions<unknown[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<unknown[]> {\n return useQuery({\n queryKey: userKeys.activity(limit),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/users/me/activity?limit=${limit}`,\n )\n return extractArrayData<unknown>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's posts\n *\n * @endpoint GET /user/me/posts\n */\nexport function useUserPosts(\n params?: {page?: number; limit?: number},\n options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post[]> {\n return useQuery({\n queryKey: userKeys.posts(params),\n queryFn: async () => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<unknown>>(\n `/user/me/posts?${queryParams}`,\n )\n return extractArrayData<Post>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's clubs\n *\n * @endpoint GET /user/me/clubs\n */\nexport function useUserClubs(\n options?: Omit<UseQueryOptions<Club[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club[]> {\n return useQuery({\n queryKey: userKeys.clubs(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/user/me/clubs')\n return extractArrayData<Club>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's spot subscriptions\n *\n * @endpoint GET /user/me/subscriptions\n */\nexport function useUserSubscriptions(\n options?: Omit<UseQueryOptions<SpotSubscription[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<SpotSubscription[]> {\n return useQuery({\n queryKey: userKeys.subscriptions(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n '/user/me/subscriptions',\n )\n return extractArrayData<SpotSubscription>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get blocked users list\n *\n * @endpoint GET /user/me/blocked\n */\nexport function useBlockedUsers(\n options?: Omit<UseQueryOptions<User[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<User[]> {\n return useQuery({\n queryKey: userKeys.blocked(),\n queryFn: async () => {\n const client = getApiClient()\n const response =\n await client.get<ApiResponse<unknown>>('/user/me/blocked')\n return extractArrayData<User>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's owned spots (for business owners)\n *\n * @endpoint GET /users/me/owned-spots\n */\nexport function useOwnedSpots(\n options?: Omit<UseQueryOptions<Spot[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot[]> {\n return useQuery({\n queryKey: userKeys.ownedSpots(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n '/users/me/owned-spots',\n )\n return extractArrayData<Spot>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's favorite spots\n *\n * @endpoint GET /users/me/favorites\n */\nexport function useUserFavorites(\n options?: Omit<UseQueryOptions<FavoriteSpot[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<FavoriteSpot[]> {\n return useQuery({\n queryKey: userKeys.favorites(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n '/users/me/favorites',\n )\n return extractArrayData<FavoriteSpot>(response.data.data)\n },\n ...options,\n })\n}\n","/**\n * Spots Query Hooks\n *\n * TanStack Query hooks for spot-related operations.\n */\n\nimport {\n useQuery,\n useInfiniteQuery,\n type UseQueryOptions,\n type UseQueryResult,\n type UseInfiniteQueryOptions,\n type UseInfiniteQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type PaginatedResponse, type Spot, type SpotImage} from '../types'\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Extract array data from API response\n * API returns { success, data: { data: [...], meta: {...} } } or { success, data: [...] }\n */\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n/**\n * Extract single object data from API response\n */\nfunction extractObjectData<T>(data: unknown): T {\n if (\n data &&\n typeof data === 'object' &&\n 'data' in data &&\n !Array.isArray(data)\n ) {\n const nested = (data as {data: unknown}).data\n if (\n nested &&\n typeof nested === 'object' &&\n 'data' in nested &&\n !Array.isArray(nested)\n ) {\n return (nested as {data: T}).data\n }\n return nested as T\n }\n return data as T\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const spotKeys = {\n all: ['spots'] as const,\n lists: () => [...spotKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...spotKeys.lists(), filters] as const,\n details: () => [...spotKeys.all, 'detail'] as const,\n detail: (id: string) => [...spotKeys.details(), id] as const,\n bySlug: (slug: string) => [...spotKeys.all, 'slug', slug] as const,\n byQR: (qrCode: string) => [...spotKeys.all, 'qr', qrCode] as const,\n images: (spotId: string) => [...spotKeys.detail(spotId), 'images'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all spots\n *\n * @endpoint GET /spots\n */\nexport function useSpots(\n params?: {\n limit?: number\n city?: string\n type?: string\n lat?: number\n lng?: number\n radius?: number\n search?: string\n vibes?: string\n cityId?: string\n page?: number\n },\n options?: Omit<UseQueryOptions<Spot[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot[]> {\n return useQuery({\n queryKey: spotKeys.list(params),\n queryFn: async (): Promise<Spot[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.city) queryParams.set('city', params.city)\n if (params?.type) queryParams.set('type', params.type)\n if (params?.lat) queryParams.set('lat', String(params.lat))\n if (params?.lng) queryParams.set('lng', String(params.lng))\n if (params?.radius) queryParams.set('radius', String(params.radius))\n if (params?.search) queryParams.set('search', params.search)\n if (params?.vibes) queryParams.set('vibeIds', params.vibes)\n if (params?.cityId) queryParams.set('cityId', params.cityId)\n if (params?.page) queryParams.set('page', String(params.page))\n const response = await client.get<ApiResponse<unknown>>(\n `/spots?${queryParams}`,\n )\n return extractArrayData<Spot>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get a spot by ID\n *\n * @endpoint GET /spots/{spotId}\n */\nexport function useSpot(\n spotId: string,\n options?: Omit<UseQueryOptions<Spot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot> {\n return useQuery({\n queryKey: spotKeys.detail(spotId),\n queryFn: async (): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/${spotId}`,\n )\n return extractObjectData<Spot>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a spot by slug\n *\n * @endpoint GET /spots/slug/{slug}\n */\nexport function useSpotBySlug(\n slug: string,\n options?: Omit<UseQueryOptions<Spot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot> {\n return useQuery({\n queryKey: spotKeys.bySlug(slug),\n queryFn: async (): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/slug/${slug}`,\n )\n return extractObjectData<Spot>(response.data.data)\n },\n enabled: !!slug,\n ...options,\n })\n}\n\n/**\n * Get a spot by QR code\n *\n * @endpoint GET /spots/qr/{qrCode}\n */\nexport function useSpotByQR(\n qrCode: string,\n options?: Omit<UseQueryOptions<Spot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot> {\n return useQuery({\n queryKey: spotKeys.byQR(qrCode),\n queryFn: async (): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/qr/${qrCode}`,\n )\n return extractObjectData<Spot>(response.data.data)\n },\n enabled: !!qrCode,\n ...options,\n })\n}\n\n/**\n * Get images for a spot\n *\n * @endpoint GET /spots/{spotId}/images\n */\nexport function useSpotImages(\n spotId: string,\n options?: Omit<UseQueryOptions<SpotImage[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<SpotImage[]> {\n return useQuery({\n queryKey: spotKeys.images(spotId),\n queryFn: async (): Promise<SpotImage[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/${spotId}/images`,\n )\n return extractArrayData<SpotImage>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Check if a spot is favorited by the current user\n *\n * @endpoint GET /spots/{spotId}/favorite\n */\nexport function useSpotFavoriteStatus(\n spotId: string,\n options?: Omit<\n UseQueryOptions<{isFavorite: boolean}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{isFavorite: boolean}> {\n return useQuery({\n queryKey: [...spotKeys.detail(spotId), 'favorite'] as const,\n queryFn: async (): Promise<{isFavorite: boolean}> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<{isFavorite: boolean}>>(\n `/spots/${spotId}/favorite`,\n )\n return extractObjectData<{isFavorite: boolean}>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n// ============================================================================\n// INFINITE QUERY HOOKS\n// ============================================================================\n\n/**\n * Params for infinite spots query\n */\nexport interface InfiniteSpotsParams {\n limit?: number\n city?: string\n cityId?: string\n type?: string\n templateSlugs?: string[]\n vibeIds?: string[]\n search?: string\n}\n\n/**\n * Infinite scroll query for spots\n *\n * @endpoint GET /spots (paginated)\n * @returns Infinite query with pages of spots\n */\nexport function useInfiniteSpots(\n params?: InfiniteSpotsParams,\n options?: Omit<\n UseInfiniteQueryOptions<\n PaginatedResponse<Spot>,\n Error,\n {pages: PaginatedResponse<Spot>[]; pageParams: number[]}\n >,\n 'queryKey' | 'queryFn' | 'getNextPageParam' | 'initialPageParam'\n >,\n): UseInfiniteQueryResult<\n {pages: PaginatedResponse<Spot>[]; pageParams: number[]},\n Error\n> {\n return useInfiniteQuery({\n queryKey: [...spotKeys.lists(), 'infinite', params] as const,\n queryFn: async ({pageParam = 1}): Promise<PaginatedResponse<Spot>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n queryParams.set('page', String(pageParam))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.city) queryParams.set('city', params.city)\n if (params?.cityId) queryParams.set('cityId', params.cityId)\n if (params?.type && params.type !== 'All')\n queryParams.set('type', params.type)\n if (params?.search?.trim())\n queryParams.set('search', params.search.trim())\n if (params?.templateSlugs) {\n params.templateSlugs.forEach((slug) =>\n queryParams.append('templateSlugs', slug),\n )\n }\n if (params?.vibeIds) {\n params.vibeIds.forEach((id) => queryParams.append('vibeIds', id))\n }\n const response = await client.get<ApiResponse<PaginatedResponse<Spot>>>(\n `/spots?${queryParams}`,\n )\n // Handle nested response structure\n const data = response.data.data\n if (data && typeof data === 'object' && 'data' in data) {\n return data as PaginatedResponse<Spot>\n }\n // Fallback for array response\n const page = pageParam as number\n return {\n data: extractArrayData<Spot>(data),\n meta: {\n total: 0,\n page,\n limit: params?.limit || 20,\n totalPages: 1,\n hasNextPage: false,\n hasPreviousPage: page > 1,\n },\n }\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage) => {\n return lastPage.meta.hasNextPage ? lastPage.meta.page + 1 : undefined\n },\n ...options,\n })\n}\n","/**\n * Posts Query Hooks\n *\n * TanStack Query hooks for post/board operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type Post,\n type PostResponse,\n type PostStatusDto,\n type PostUpvotesResponse,\n} from '../types'\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Extract array data from API response\n * API returns { success, data: { data: [...], meta: {...} } } or { success, data: [...] }\n */\nfunction extractArrayData<T>(data: unknown): T[] {\n // If already an array, return it\n if (Array.isArray(data)) {\n return data\n }\n // If it's an object with nested data property, extract it\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n/**\n * Extract single object data from API response\n * API returns { success, data: { data: {...} } } or { success, data: {...} }\n */\nfunction extractObjectData<T>(data: unknown): T {\n // If it's an object with nested data property (not an array), extract it\n if (\n data &&\n typeof data === 'object' &&\n 'data' in data &&\n !Array.isArray(data)\n ) {\n const nested = (data as {data: unknown}).data\n // Check if nested also has a data property (double-wrapped)\n if (\n nested &&\n typeof nested === 'object' &&\n 'data' in nested &&\n !Array.isArray(nested)\n ) {\n return (nested as {data: T}).data\n }\n return nested as T\n }\n return data as T\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const postKeys = {\n all: ['posts'] as const,\n lists: () => [...postKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...postKeys.lists(), filters] as const,\n bySpot: (spotId: string, filters?: Record<string, unknown>) =>\n [...postKeys.all, 'spot', spotId, filters] as const,\n details: () => [...postKeys.all, 'detail'] as const,\n detail: (id: string) => [...postKeys.details(), id] as const,\n responses: (postId: string) =>\n [...postKeys.detail(postId), 'responses'] as const,\n status: (postId: string) => [...postKeys.detail(postId), 'status'] as const,\n upvotes: (postId: string, filters?: {limit?: number; offset?: number}) =>\n [...postKeys.detail(postId), 'upvotes', filters] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get posts for a spot\n *\n * @endpoint GET /spots/{spotId}/posts\n */\nexport function useSpotPosts(\n spotId: string,\n params?: {postType?: string; status?: string; page?: number; limit?: number},\n options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post[]> {\n return useQuery({\n queryKey: postKeys.bySpot(spotId, params),\n queryFn: async (): Promise<Post[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.postType) queryParams.set('postType', params.postType)\n if (params?.status) queryParams.set('status', params.status)\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/${spotId}/posts?${queryParams}`,\n )\n return extractArrayData<Post>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a single post by ID\n *\n * @endpoint GET /posts/{postId}\n */\nexport function usePost(\n postId: string,\n options?: Omit<UseQueryOptions<Post>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post> {\n return useQuery({\n queryKey: postKeys.detail(postId),\n queryFn: async (): Promise<Post> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/posts/${postId}`,\n )\n return extractObjectData<Post>(response.data.data)\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get responses for a post\n *\n * @endpoint GET /posts/{postId}/responses\n */\nexport function usePostResponses(\n postId: string,\n options?: Omit<UseQueryOptions<PostResponse[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PostResponse[]> {\n return useQuery({\n queryKey: postKeys.responses(postId),\n queryFn: async (): Promise<PostResponse[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/posts/${postId}/responses`,\n )\n return extractArrayData<PostResponse>(response.data.data)\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get all posts (with filters)\n *\n * @endpoint GET /posts\n */\nexport function usePosts(\n params?: {postType?: string; limit?: number},\n options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post[]> {\n return useQuery({\n queryKey: postKeys.list(params),\n queryFn: async (): Promise<Post[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.postType) queryParams.set('postType', params.postType)\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<unknown>>(\n `/posts?${queryParams}`,\n )\n return extractArrayData<Post>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get user's status for a post (read/hidden/pinned)\n *\n * @endpoint GET /posts/{postId}/status\n */\nexport function usePostStatus(\n postId: string,\n options?: Omit<UseQueryOptions<PostStatusDto>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PostStatusDto> {\n return useQuery({\n queryKey: postKeys.status(postId),\n queryFn: async (): Promise<PostStatusDto> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/posts/${postId}/status`,\n )\n return extractObjectData<PostStatusDto>(response.data.data)\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get upvotes for a post (list of users who upvoted)\n *\n * @endpoint GET /posts/{postId}/upvotes\n */\nexport function usePostUpvotes(\n postId: string,\n params?: {limit?: number; offset?: number},\n options?: Omit<UseQueryOptions<PostUpvotesResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PostUpvotesResponse> {\n return useQuery({\n queryKey: postKeys.upvotes(postId, params),\n queryFn: async (): Promise<PostUpvotesResponse> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.offset) queryParams.set('offset', String(params.offset))\n const queryString = queryParams.toString()\n const response = await client.get<ApiResponse<PostUpvotesResponse>>(\n `/posts/${postId}/upvotes${queryString ? `?${queryString}` : ''}`,\n )\n // Response structure: { success, data: { data: [...], meta: {...} } }\n return response.data.data\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get nearby posts feed\n *\n * @endpoint GET /posts/feed\n */\nexport function usePostsFeed(\n params: {\n lat: number\n lng: number\n radius?: number\n postType?: string\n cursor?: string\n limit?: number\n },\n options?: Omit<\n UseQueryOptions<{posts: Post[]; hasMore: boolean; nextCursor?: string}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{posts: Post[]; hasMore: boolean; nextCursor?: string}> {\n return useQuery({\n queryKey: [...postKeys.lists(), 'feed', params] as const,\n queryFn: async (): Promise<{\n posts: Post[]\n hasMore: boolean\n nextCursor?: string\n }> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n queryParams.set('lat', String(params.lat))\n queryParams.set('lng', String(params.lng))\n if (params.radius) queryParams.set('radius', String(params.radius))\n if (params.postType) queryParams.set('postType', params.postType)\n if (params.cursor) queryParams.set('cursor', params.cursor)\n if (params.limit) queryParams.set('limit', String(params.limit))\n\n const response = await client.get<\n ApiResponse<{posts: Post[]; hasMore: boolean; nextCursor?: string}>\n >(`/posts/feed?${queryParams}`)\n\n const data = response.data.data\n return {\n posts: data.posts ?? extractArrayData<Post>(data),\n hasMore: data.hasMore ?? false,\n nextCursor: data.nextCursor,\n }\n },\n enabled: params.lat !== 0 && params.lng !== 0,\n ...options,\n })\n}\n","/**\n * Conversations Query Hooks\n *\n * TanStack Query hooks for conversation/messaging operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Conversation, type Message} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const conversationKeys = {\n all: ['conversations'] as const,\n lists: () => [...conversationKeys.all, 'list'] as const,\n list: () => [...conversationKeys.lists()] as const,\n details: () => [...conversationKeys.all, 'detail'] as const,\n detail: (id: string) => [...conversationKeys.details(), id] as const,\n messages: (conversationId: string, params?: {before?: string}) =>\n [...conversationKeys.detail(conversationId), 'messages', params] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all conversations for current user\n *\n * @endpoint GET /conversations\n */\nexport function useConversations(\n options?: Omit<UseQueryOptions<Conversation[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Conversation[]> {\n return useQuery({\n queryKey: conversationKeys.list(),\n queryFn: async (): Promise<Conversation[]> => {\n const client = getApiClient()\n const response =\n await client.get<ApiResponse<Conversation[]>>('/conversations')\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get a single conversation with details\n *\n * @endpoint GET /conversations/{id}\n */\nexport function useConversation(\n conversationId: string,\n options?: Omit<UseQueryOptions<Conversation>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Conversation> {\n return useQuery({\n queryKey: conversationKeys.detail(conversationId),\n queryFn: async (): Promise<Conversation> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Conversation>>(\n `/conversations/${conversationId}`,\n )\n return response.data.data\n },\n enabled: !!conversationId,\n ...options,\n })\n}\n\n/**\n * Get messages for a conversation\n *\n * @endpoint GET /conversations/{id}/messages\n */\nexport function useConversationMessages(\n conversationId: string,\n params?: {limit?: number; before?: string},\n options?: Omit<\n UseQueryOptions<{\n data: Message[]\n meta: {hasMore: boolean; oldestMessageAt: string | null}\n }>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{\n data: Message[]\n meta: {hasMore: boolean; oldestMessageAt: string | null}\n}> {\n return useQuery({\n queryKey: conversationKeys.messages(conversationId, params),\n queryFn: async () => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.before) queryParams.set('before', params.before)\n const response = await client.get<{\n data: Message[]\n meta: {hasMore: boolean; oldestMessageAt: string | null}\n }>(`/conversations/${conversationId}/messages?${queryParams}`)\n return response.data\n },\n enabled: !!conversationId,\n ...options,\n })\n}\n","/**\n * Clubs Query Hooks\n *\n * TanStack Query hooks for club operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Club} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const clubKeys = {\n all: ['clubs'] as const,\n bySpot: (spotId: string) => [...clubKeys.all, 'spot', spotId] as const,\n details: () => [...clubKeys.all, 'detail'] as const,\n detail: (id: string) => [...clubKeys.details(), id] as const,\n bySlug: (slug: string) => [...clubKeys.all, 'slug', slug] as const,\n byUser: (userId: string) => [...clubKeys.all, 'user', userId] as const,\n membership: (clubId: string, userId: string) =>\n [...clubKeys.detail(clubId), 'membership', userId] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get clubs for a spot\n *\n * @endpoint GET /clubs/spot/{spotId}\n */\nexport function useClubsBySpot(\n spotId: string,\n options?: Omit<UseQueryOptions<Club[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club[]> {\n return useQuery({\n queryKey: clubKeys.bySpot(spotId),\n queryFn: async (): Promise<Club[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club[]>>(\n `/clubs/spot/${spotId}`,\n )\n return response.data.data\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a club by ID\n *\n * @endpoint GET /clubs/{id}\n */\nexport function useClub(\n clubId: string,\n options?: Omit<UseQueryOptions<Club>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club> {\n return useQuery({\n queryKey: clubKeys.detail(clubId),\n queryFn: async (): Promise<Club> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club>>(`/clubs/${clubId}`)\n return response.data.data\n },\n enabled: !!clubId,\n ...options,\n })\n}\n\n/**\n * Get a club by slug\n *\n * @endpoint GET /clubs/slug/{slug}\n */\nexport function useClubBySlug(\n slug: string,\n options?: Omit<UseQueryOptions<Club>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club> {\n return useQuery({\n queryKey: clubKeys.bySlug(slug),\n queryFn: async (): Promise<Club> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club>>(\n `/clubs/slug/${slug}`,\n )\n return response.data.data\n },\n enabled: !!slug,\n ...options,\n })\n}\n\n/**\n * Get clubs for a user\n *\n * @endpoint GET /clubs/user/{userId}\n */\nexport function useClubsByUser(\n userId: string,\n options?: Omit<UseQueryOptions<Club[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club[]> {\n return useQuery({\n queryKey: clubKeys.byUser(userId),\n queryFn: async (): Promise<Club[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club[]>>(\n `/clubs/user/${userId}`,\n )\n return response.data.data\n },\n enabled: !!userId,\n ...options,\n })\n}\n\n/**\n * Get membership status for a user in a club\n *\n * @endpoint GET /clubs/{id}/membership/{userId}\n */\nexport function useClubMembership(\n clubId: string,\n userId: string,\n options?: Omit<\n UseQueryOptions<{isMember: boolean; role?: string}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{isMember: boolean; role?: string}> {\n return useQuery({\n queryKey: clubKeys.membership(clubId, userId),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<\n ApiResponse<{isMember: boolean; role?: string}>\n >(`/clubs/${clubId}/membership/${userId}`)\n return response.data.data\n },\n enabled: !!clubId && !!userId,\n ...options,\n })\n}\n","/**\n * Templates Query Hooks\n *\n * TanStack Query hooks for post template operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Template} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const templateKeys = {\n all: ['templates'] as const,\n lists: () => [...templateKeys.all, 'list'] as const,\n list: (filters?: {spotType?: string}) =>\n [...templateKeys.lists(), filters] as const,\n details: () => [...templateKeys.all, 'detail'] as const,\n detail: (id: string) => [...templateKeys.details(), id] as const,\n bySlug: (slug: string) => [...templateKeys.all, 'slug', slug] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all templates\n *\n * @endpoint GET /templates\n */\nexport function useTemplates(\n params?: {spotType?: string},\n options?: Omit<UseQueryOptions<Template[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Template[]> {\n return useQuery({\n queryKey: templateKeys.list(params),\n queryFn: async (): Promise<Template[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.spotType) queryParams.set('spotType', params.spotType)\n const response = await client.get<ApiResponse<Template[]>>(\n `/templates?${queryParams}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get a template by ID\n *\n * @endpoint GET /templates/{templateId}\n */\nexport function useTemplate(\n templateId: string,\n options?: Omit<UseQueryOptions<Template>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Template> {\n return useQuery({\n queryKey: templateKeys.detail(templateId),\n queryFn: async (): Promise<Template> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Template>>(\n `/templates/${templateId}`,\n )\n return response.data.data\n },\n enabled: !!templateId,\n ...options,\n })\n}\n\n/**\n * Get a template by slug\n *\n * @endpoint GET /templates/slug/{slug}\n */\nexport function useTemplateBySlug(\n slug: string,\n options?: Omit<UseQueryOptions<Template>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Template> {\n return useQuery({\n queryKey: templateKeys.bySlug(slug),\n queryFn: async (): Promise<Template> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Template>>(\n `/templates/slug/${slug}`,\n )\n return response.data.data\n },\n enabled: !!slug,\n ...options,\n })\n}\n","/**\n * Notifications Query Hooks\n *\n * TanStack Query hooks for notification operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Notification} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const notificationKeys = {\n all: ['notifications'] as const,\n lists: () => [...notificationKeys.all, 'list'] as const,\n list: (params?: {limit?: number; unreadOnly?: boolean}) =>\n [...notificationKeys.lists(), params] as const,\n unreadCount: () => [...notificationKeys.all, 'unreadCount'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get notifications for current user\n *\n * @endpoint GET /notifications\n */\nexport function useNotifications(\n params?: {limit?: number; unreadOnly?: boolean},\n options?: Omit<UseQueryOptions<Notification[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Notification[]> {\n return useQuery({\n queryKey: notificationKeys.list(params),\n queryFn: async (): Promise<Notification[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.unreadOnly)\n queryParams.set('unreadOnly', String(params.unreadOnly))\n const response = await client.get<ApiResponse<Notification[]>>(\n `/notifications?${queryParams}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get unread notification count\n *\n * @endpoint GET /notifications/unread-count\n */\nexport function useUnreadNotificationCount(\n options?: Omit<UseQueryOptions<number>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<number> {\n return useQuery({\n queryKey: notificationKeys.unreadCount(),\n queryFn: async (): Promise<number> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<{count: number}>>(\n '/notifications/unread-count',\n )\n return response.data.data.count\n },\n ...options,\n })\n}\n","/**\n * Misc Query Hooks\n *\n * TanStack Query hooks for cities, vibes, and other reference data.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type City,\n type LifeSituation,\n type Vibe,\n} from '../types'\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const miscKeys = {\n cities: () => ['cities'] as const,\n vibes: () => ['vibes'] as const,\n lifeSituations: () => ['life-situations'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all cities\n *\n * @endpoint GET /cities\n */\nexport function useCities(\n options?: Omit<UseQueryOptions<City[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<City[]> {\n return useQuery({\n queryKey: miscKeys.cities(),\n queryFn: async (): Promise<City[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/cities')\n return extractArrayData<City>(response.data.data)\n },\n staleTime: 1000 * 60 * 60,\n ...options,\n })\n}\n\n/**\n * Get all vibes\n *\n * @endpoint GET /vibes\n */\nexport function useVibes(\n options?: Omit<UseQueryOptions<Vibe[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Vibe[]> {\n return useQuery({\n queryKey: miscKeys.vibes(),\n queryFn: async (): Promise<Vibe[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/vibes')\n return extractArrayData<Vibe>(response.data.data)\n },\n staleTime: 1000 * 60 * 60,\n ...options,\n })\n}\n\n/**\n * Get all life situations (for onboarding)\n *\n * @endpoint GET /life-situations\n */\nexport function useLifeSituations(\n options?: Omit<UseQueryOptions<LifeSituation[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<LifeSituation[]> {\n return useQuery({\n queryKey: miscKeys.lifeSituations(),\n queryFn: async (): Promise<LifeSituation[]> => {\n const client = getApiClient()\n const response =\n await client.get<ApiResponse<unknown>>('/life-situations')\n return extractArrayData<LifeSituation>(response.data.data)\n },\n staleTime: 1000 * 60 * 60,\n ...options,\n })\n}\n","/**\n * Products Query Hooks\n *\n * TanStack Query hooks for product-related operations.\n */\n\nimport {useQuery, type UseQueryOptions, type UseQueryResult} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport type {\n Product,\n ApiResponse,\n PaginatedResponse,\n ProductType,\n ProductStatus,\n Spot,\n} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const productKeys = {\n all: ['products'] as const,\n lists: () => [...productKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...productKeys.lists(), filters] as const,\n details: () => [...productKeys.all, 'detail'] as const,\n detail: (id: string) => [...productKeys.details(), id] as const,\n bySlug: (spotId: string, slug: string) =>\n [...productKeys.all, 'slug', spotId, slug] as const,\n bySpot: (spotId: string) => [...productKeys.all, 'spot', spotId] as const,\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ProductFilters {\n spotId?: string\n type?: ProductType\n status?: ProductStatus\n limit?: number\n page?: number\n}\n\nexport interface ProductWithSpot extends Product {\n spot: Pick<Spot, 'id' | 'name' | 'slug'>\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get products for a spot (public browse)\n *\n * @endpoint GET /spots/{spotId}/products\n */\nexport function useSpotProducts(\n spotId: string,\n params?: {type?: ProductType; limit?: number; page?: number},\n options?: Omit<\n UseQueryOptions<PaginatedResponse<Product>>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<PaginatedResponse<Product>> {\n return useQuery({\n queryKey: productKeys.bySpot(spotId),\n queryFn: async (): Promise<PaginatedResponse<Product>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.type) queryParams.set('type', params.type)\n const response = await client.get<ApiResponse<PaginatedResponse<Product>>>(\n `/spots/${spotId}/products?${queryParams}`,\n )\n return response.data.data\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a product by ID\n *\n * @endpoint GET /products/{productId}\n */\nexport function useProduct(\n productId: string,\n options?: Omit<UseQueryOptions<ProductWithSpot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<ProductWithSpot> {\n return useQuery({\n queryKey: productKeys.detail(productId),\n queryFn: async (): Promise<ProductWithSpot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<ProductWithSpot>>(\n `/products/${productId}`,\n )\n return response.data.data\n },\n enabled: !!productId,\n ...options,\n })\n}\n\n/**\n * Get a product by slug (within a spot)\n *\n * @endpoint GET /spots/{spotId}/products/slug/{slug}\n */\nexport function useProductBySlug(\n spotId: string,\n slug: string,\n options?: Omit<UseQueryOptions<ProductWithSpot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<ProductWithSpot> {\n return useQuery({\n queryKey: productKeys.bySlug(spotId, slug),\n queryFn: async (): Promise<ProductWithSpot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<ProductWithSpot>>(\n `/spots/${spotId}/products/slug/${slug}`,\n )\n return response.data.data\n },\n enabled: !!spotId && !!slug,\n ...options,\n })\n}\n","/**\n * Orders Query Hooks\n *\n * TanStack Query hooks for order-related operations.\n */\n\nimport {useQuery, type UseQueryOptions, type UseQueryResult} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport type {\n Order,\n OrderItem,\n Product,\n Spot,\n OrderStatus,\n ApiResponse,\n PaginatedResponse,\n} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const orderKeys = {\n all: ['orders'] as const,\n lists: () => [...orderKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...orderKeys.lists(), filters] as const,\n details: () => [...orderKeys.all, 'detail'] as const,\n detail: (id: string) => [...orderKeys.details(), id] as const,\n myOrders: () => [...orderKeys.all, 'my'] as const,\n spotOrders: (spotId: string) => [...orderKeys.all, 'spot', spotId] as const,\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface OrderWithDetails extends Order {\n items: (OrderItem & {\n product: Pick<Product, 'id' | 'name' | 'slug' | 'type' | 'imageUrl'>\n })[]\n spot: Pick<Spot, 'id' | 'name' | 'slug'>\n}\n\nexport interface OrderFilters {\n status?: OrderStatus\n limit?: number\n page?: number\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get current user's orders (purchases)\n *\n * @endpoint GET /users/me/orders\n */\nexport function useMyOrders(\n params?: OrderFilters,\n options?: Omit<\n UseQueryOptions<PaginatedResponse<OrderWithDetails>>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<PaginatedResponse<OrderWithDetails>> {\n return useQuery({\n queryKey: orderKeys.list({...params, my: true}),\n queryFn: async (): Promise<PaginatedResponse<OrderWithDetails>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.status) queryParams.set('status', params.status)\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.page) queryParams.set('page', String(params.page))\n const response = await client.get<\n ApiResponse<PaginatedResponse<OrderWithDetails>>\n >(`/users/me/orders?${queryParams}`)\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get a single order by ID\n *\n * @endpoint GET /orders/{orderId}\n */\nexport function useOrder(\n orderId: string,\n options?: Omit<UseQueryOptions<OrderWithDetails>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<OrderWithDetails> {\n return useQuery({\n queryKey: orderKeys.detail(orderId),\n queryFn: async (): Promise<OrderWithDetails> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<OrderWithDetails>>(\n `/orders/${orderId}`,\n )\n return response.data.data\n },\n enabled: !!orderId,\n ...options,\n })\n}\n\n/**\n * Get orders for a spot (seller view)\n *\n * @endpoint GET /seller/spots/{spotId}/orders\n */\nexport function useSpotOrders(\n spotId: string,\n params?: OrderFilters,\n options?: Omit<\n UseQueryOptions<PaginatedResponse<OrderWithDetails>>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<PaginatedResponse<OrderWithDetails>> {\n return useQuery({\n queryKey: orderKeys.spotOrders(spotId),\n queryFn: async (): Promise<PaginatedResponse<OrderWithDetails>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.status) queryParams.set('status', params.status)\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.page) queryParams.set('page', String(params.page))\n const response = await client.get<\n ApiResponse<PaginatedResponse<OrderWithDetails>>\n >(`/seller/spots/${spotId}/orders?${queryParams}`)\n return response.data.data\n },\n enabled: !!spotId,\n ...options,\n })\n}\n","/**\n * Wallet Query Hooks\n *\n * TanStack Query hooks for wallet and redemption operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse} from '../types'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type RedemptionStatus = 'PENDING' | 'REDEEMED' | 'EXPIRED' | 'CANCELLED' | 'VOID'\n\nexport interface WalletProduct {\n id: string\n name: string\n type: string\n imageUrl: string | null\n}\n\nexport interface WalletOrderItem {\n product: WalletProduct\n quantity: number\n unitPrice: number\n}\n\nexport interface WalletOrder {\n id: string\n orderNumber: string\n spotId: string\n createdAt: string\n spot: {\n id: string\n name: string\n slug: string\n address: string | null\n }\n}\n\nexport interface WalletRedemption {\n id: string\n qrCode: string\n qrCodeUrl: string | null\n status: RedemptionStatus\n validFrom: string\n validUntil: string\n redeemedAt: string | null\n createdAt: string\n orderItem: WalletOrderItem & {\n order: WalletOrder\n }\n}\n\nexport interface RedemptionLookup extends WalletRedemption {\n redeemedBy: {\n id: string\n name: string\n } | null\n spot: {\n id: string\n name: string\n } | null\n orderItem: WalletOrderItem & {\n order: WalletOrder & {\n user: {\n id: string\n name: string | null\n avatarUrl: string | null\n }\n }\n }\n}\n\nexport interface WalletHistoryResponse {\n data: WalletRedemption[]\n meta: {\n total: number\n page: number\n limit: number\n totalPages: number\n }\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\nfunction extractObjectData<T>(data: unknown): T {\n if (\n data &&\n typeof data === 'object' &&\n 'data' in data &&\n !Array.isArray(data)\n ) {\n const nested = (data as {data: unknown}).data\n if (\n nested &&\n typeof nested === 'object' &&\n 'data' in nested &&\n !Array.isArray(nested)\n ) {\n return (nested as {data: T}).data\n }\n return nested as T\n }\n return data as T\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const walletKeys = {\n all: ['wallet'] as const,\n active: () => [...walletKeys.all, 'active'] as const,\n history: (page?: number) => [...walletKeys.all, 'history', page] as const,\n redemptions: () => ['redemptions'] as const,\n lookup: (qrCode: string) => [...walletKeys.redemptions(), 'lookup', qrCode] as const,\n spotRedemptions: (spotId: string, page?: number) =>\n [...walletKeys.redemptions(), 'spot', spotId, page] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get user's active wallet items (pending redemptions)\n *\n * @endpoint GET /wallet\n */\nexport function useWallet(\n options?: Omit<UseQueryOptions<WalletRedemption[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<WalletRedemption[]> {\n return useQuery({\n queryKey: walletKeys.active(),\n queryFn: async (): Promise<WalletRedemption[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/wallet')\n return extractArrayData<WalletRedemption>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get user's wallet history (all redemptions)\n *\n * @endpoint GET /wallet/history\n */\nexport function useWalletHistory(\n params?: {page?: number; limit?: number},\n options?: Omit<UseQueryOptions<WalletHistoryResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<WalletHistoryResponse> {\n return useQuery({\n queryKey: walletKeys.history(params?.page),\n queryFn: async (): Promise<WalletHistoryResponse> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<WalletHistoryResponse>>(\n `/wallet/history?${queryParams}`,\n )\n return extractObjectData<WalletHistoryResponse>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Lookup redemption by QR code (for scanner)\n *\n * @endpoint GET /redemptions/lookup/:qrCode\n */\nexport function useRedemptionLookup(\n qrCode: string,\n options?: Omit<UseQueryOptions<RedemptionLookup>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<RedemptionLookup> {\n return useQuery({\n queryKey: walletKeys.lookup(qrCode),\n queryFn: async (): Promise<RedemptionLookup> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/redemptions/lookup/${qrCode}`,\n )\n return extractObjectData<RedemptionLookup>(response.data.data)\n },\n enabled: !!qrCode && qrCode.length > 0,\n ...options,\n })\n}\n\n/**\n * Get spot's redemption history (for spot owner)\n *\n * @endpoint GET /spots/:spotId/redemptions\n */\nexport function useSpotRedemptions(\n spotId: string,\n params?: {page?: number; limit?: number},\n options?: Omit<UseQueryOptions<WalletHistoryResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<WalletHistoryResponse> {\n return useQuery({\n queryKey: walletKeys.spotRedemptions(spotId, params?.page),\n queryFn: async (): Promise<WalletHistoryResponse> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<WalletHistoryResponse>>(\n `/spots/${spotId}/redemptions?${queryParams}`,\n )\n return extractObjectData<WalletHistoryResponse>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n","/**\n * Payments Query Hooks\n *\n * TanStack Query hooks for payment configuration.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport type {ApiResponse} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const paymentKeys = {\n all: ['payments'] as const,\n config: () => [...paymentKeys.all, 'config'] as const,\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Payment configuration returned by GET /payments/config\n */\nexport interface PaymentConfig {\n stripe: {\n publishableKey: string | null\n enabled: boolean\n }\n coinbase: {\n enabled: boolean\n }\n supportedMethods: Array<'card' | 'apple_pay' | 'google_pay' | 'crypto'>\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get payment configuration\n * Returns publishable keys and enabled payment methods\n *\n * @endpoint GET /payments/config\n */\nexport function usePaymentConfig(\n options?: Omit<UseQueryOptions<PaymentConfig>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PaymentConfig> {\n return useQuery({\n queryKey: paymentKeys.config(),\n queryFn: async (): Promise<PaymentConfig> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<PaymentConfig>>(\n '/payments/config',\n )\n return response.data.data\n },\n staleTime: 1000 * 60 * 60, // 1 hour - config rarely changes\n ...options,\n })\n}\n","/**\n * Users Mutation Hooks\n *\n * TanStack Query hooks for user mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {userKeys} from '../queries/users'\nimport {type ApiResponse, type UpdateProfileRequest, type User} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Update current user's profile\n *\n * @endpoint PUT /users/me\n */\nexport function useUpdateProfile(\n options?: Omit<\n UseMutationOptions<User, Error, UpdateProfileRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<User, Error, UpdateProfileRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: UpdateProfileRequest): Promise<User> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<User>>('/users/me', data)\n return response.data.data\n },\n onSuccess: data => {\n queryClient.setQueryData(userKeys.me(), data)\n },\n ...options,\n })\n}\n\n/**\n * Upload avatar\n *\n * Uploads avatar file and updates user profile in one request.\n *\n * @endpoint POST /users/me/avatar\n */\nexport function useUploadAvatar(\n options?: Omit<\n UseMutationOptions<{avatarUrl: string}, Error, FormData>,\n 'mutationFn'\n >,\n): UseMutationResult<{avatarUrl: string}, Error, FormData> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (formData: FormData): Promise<{avatarUrl: string}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{avatarUrl: string}>>(\n '/users/me/avatar',\n formData,\n {\n headers: {'Content-Type': 'multipart/form-data'},\n },\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Delete current user's account\n *\n * @endpoint DELETE /users/me\n */\nexport function useDeleteAccount(\n options?: Omit<UseMutationOptions<void, Error, void>, 'mutationFn'>,\n): UseMutationResult<void, Error, void> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (): Promise<void> => {\n const client = getApiClient()\n await client.delete('/users/me')\n },\n onSuccess: () => {\n queryClient.clear()\n },\n ...options,\n })\n}\n\n/**\n * Update user vibes\n *\n * @endpoint PUT /users/me/vibes\n */\nexport function useUpdateVibes(\n options?: Omit<\n UseMutationOptions<User, Error, {vibes: string[]}>,\n 'mutationFn'\n >,\n): UseMutationResult<User, Error, {vibes: string[]}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {vibes: string[]}): Promise<User> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<User>>(\n '/users/me/vibes',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Update user interests\n *\n * @endpoint PUT /user/me/interests\n */\nexport function useUpdateInterests(\n options?: Omit<\n UseMutationOptions<User, Error, {interests: string[]}>,\n 'mutationFn'\n >,\n): UseMutationResult<User, Error, {interests: string[]}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {interests: string[]}): Promise<User> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<User>>(\n '/user/me/interests',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Complete onboarding step\n *\n * @endpoint POST /user/me/onboarding-step\n */\nexport function useCompleteOnboardingStep(\n options?: Omit<UseMutationOptions<User, Error, {step: number}>, 'mutationFn'>,\n): UseMutationResult<User, Error, {step: number}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {step: number}): Promise<User> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<User>>(\n '/user/me/onboarding-step',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Block a user\n *\n * @endpoint POST /users/{id}/block\n */\nexport function useBlockUser(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (userId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/users/${userId}/block`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.blocked()})\n },\n ...options,\n })\n}\n\n/**\n * Unblock a user\n *\n * @endpoint DELETE /users/{id}/block\n */\nexport function useUnblockUser(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (userId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/users/${userId}/block`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.blocked()})\n },\n ...options,\n })\n}\n","/**\n * Posts Mutation Hooks\n *\n * TanStack Query hooks for post/board mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {postKeys} from '../queries/posts'\nimport {\n type ApiResponse,\n type CreatePostRequest,\n type CreateReplyRequest,\n type Post,\n type PostResponse,\n type PostStatusDto,\n type RespondToPostRequest,\n type UpdateResponseRequest,\n type UpvoteResponse,\n} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new post\n *\n * @endpoint POST /spots/{spotId}/posts\n */\nexport function useCreatePost(\n options?: Omit<\n UseMutationOptions<Post, Error, {spotId: string} & CreatePostRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<Post, Error, {spotId: string} & CreatePostRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({spotId, ...data}): Promise<Post> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Post>>(\n `/spots/${spotId}/posts`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.bySpot(variables.spotId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Update a post\n *\n * @endpoint PUT /posts/{postId}\n */\nexport function useUpdatePost(\n options?: Omit<\n UseMutationOptions<\n Post,\n Error,\n {postId: string; title?: string; content?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Post,\n Error,\n {postId: string; title?: string; content?: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, title, content}): Promise<Post> => {\n const client = getApiClient()\n // API expects 'description' field, not 'content'\n const response = await client.put<ApiResponse<Post>>(\n `/posts/${postId}`,\n {title, description: content},\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(postKeys.detail(variables.postId), data)\n },\n ...options,\n })\n}\n\n/**\n * Delete a post\n *\n * @endpoint DELETE /posts/{postId}\n */\nexport function useDeletePost(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (postId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/posts/${postId}`)\n },\n onSuccess: (_, postId) => {\n queryClient.invalidateQueries({queryKey: postKeys.detail(postId)})\n queryClient.invalidateQueries({queryKey: postKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Fulfill a post (mark as fulfilled)\n *\n * @endpoint PUT /posts/{postId}/fulfill\n */\nexport function useFulfillPost(\n options?: Omit<UseMutationOptions<Post, Error, string>, 'mutationFn'>,\n): UseMutationResult<Post, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (postId: string): Promise<Post> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Post>>(\n `/posts/${postId}/fulfill`,\n )\n return response.data.data\n },\n onSuccess: (data, postId) => {\n queryClient.setQueryData(postKeys.detail(postId), data)\n },\n ...options,\n })\n}\n\n/**\n * Upvote/unupvote a post\n *\n * @endpoint POST /posts/{postId}/upvote\n */\nexport function useUpvotePost(\n options?: Omit<\n UseMutationOptions<UpvoteResponse, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<UpvoteResponse, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (postId: string): Promise<UpvoteResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<UpvoteResponse>>(\n `/posts/${postId}/upvote`,\n )\n return response.data.data\n },\n onSuccess: (_, postId) => {\n queryClient.invalidateQueries({queryKey: postKeys.detail(postId)})\n },\n ...options,\n })\n}\n\n/**\n * Create a reply to a post\n *\n * @endpoint POST /posts/{postId}/reply\n */\nexport function useCreateReply(\n options?: Omit<\n UseMutationOptions<unknown, Error, {postId: string} & CreateReplyRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<unknown, Error, {postId: string} & CreateReplyRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, ...data}) => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<unknown>>(\n `/posts/${postId}/reply`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.detail(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Delete a reply\n *\n * @endpoint DELETE /replies/{replyId}\n */\nexport function useDeleteReply(\n options?: Omit<\n UseMutationOptions<void, Error, {replyId: string; postId: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<void, Error, {replyId: string; postId: string}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({replyId}): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/replies/${replyId}`)\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.detail(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Respond to a post (express interest)\n *\n * @endpoint POST /posts/{postId}/respond\n */\nexport function useRespondToPost(\n options?: Omit<\n UseMutationOptions<\n PostResponse,\n Error,\n {postId: string} & RespondToPostRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n PostResponse,\n Error,\n {postId: string} & RespondToPostRequest\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, ...data}): Promise<PostResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<PostResponse>>(\n `/posts/${postId}/respond`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.detail(variables.postId),\n })\n queryClient.invalidateQueries({\n queryKey: postKeys.responses(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Accept or decline a response\n *\n * @endpoint PUT /responses/{responseId}\n */\nexport function useUpdateResponse(\n options?: Omit<\n UseMutationOptions<\n PostResponse,\n Error,\n {responseId: string; postId: string} & UpdateResponseRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n PostResponse,\n Error,\n {responseId: string; postId: string} & UpdateResponseRequest\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n responseId,\n postId: _,\n ...data\n }): Promise<PostResponse> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<PostResponse>>(\n `/responses/${responseId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.responses(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Report a post\n *\n * @endpoint POST /posts/{postId}/report\n */\nexport function useReportPost(\n options?: Omit<\n UseMutationOptions<\n void,\n Error,\n {postId: string; reason: string; details?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n void,\n Error,\n {postId: string; reason: string; details?: string}\n> {\n return useMutation({\n mutationFn: async ({postId, ...data}): Promise<void> => {\n const client = getApiClient()\n await client.post(`/posts/${postId}/report`, data)\n },\n ...options,\n })\n}\n\n// PostStatusUpdate matches partial PostStatusDto for updates\ninterface PostStatusUpdate {\n isRead?: boolean\n isHidden?: boolean\n isPinned?: boolean\n}\n\n/**\n * Update user's status for a post (read/hidden/pinned)\n *\n * @endpoint PUT /posts/{postId}/status\n */\nexport function useUpdatePostStatus(\n options?: Omit<\n UseMutationOptions<\n PostStatusDto,\n Error,\n {postId: string} & PostStatusUpdate\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n PostStatusDto,\n Error,\n {postId: string} & PostStatusUpdate\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, ...data}): Promise<PostStatusDto> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<PostStatusDto>>(\n `/posts/${postId}/status`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(postKeys.status(variables.postId), data)\n },\n ...options,\n })\n}\n","/**\n * Spots Mutation Hooks\n *\n * TanStack Query hooks for spot mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {spotKeys} from '../queries/spots'\nimport {userKeys} from '../queries/users'\nimport {type ApiResponse, type ClaimSpotRequest, type Spot} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new spot\n *\n * @endpoint POST /spots\n */\nexport function useCreateSpot(\n options?: Omit<UseMutationOptions<Spot, Error, Partial<Spot>>, 'mutationFn'>,\n): UseMutationResult<Spot, Error, Partial<Spot>> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: Partial<Spot>): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Spot>>('/spots', data)\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: spotKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Update a spot\n *\n * @endpoint PUT /spots/{spotId}\n */\nexport function useUpdateSpot(\n options?: Omit<\n UseMutationOptions<Spot, Error, {spotId: string} & Partial<Spot>>,\n 'mutationFn'\n >,\n): UseMutationResult<Spot, Error, {spotId: string} & Partial<Spot>> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({spotId, ...data}): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Spot>>(\n `/spots/${spotId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(spotKeys.detail(variables.spotId), data)\n },\n ...options,\n })\n}\n\n/**\n * Claim a spot (for business owners)\n *\n * @endpoint POST /spots/{spotId}/claim\n */\nexport function useClaimSpot(\n options?: Omit<\n UseMutationOptions<\n {claimId: string},\n Error,\n {spotId: string} & ClaimSpotRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n {claimId: string},\n Error,\n {spotId: string} & ClaimSpotRequest\n> {\n return useMutation({\n mutationFn: async ({spotId, ...data}): Promise<{claimId: string}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{claimId: string}>>(\n `/spots/${spotId}/claim`,\n data,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Subscribe to a spot\n *\n * @endpoint POST /spots/{spotId}/subscribe\n */\nexport function useSubscribeToSpot(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (spotId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/spots/${spotId}/subscribe`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.subscriptions()})\n },\n ...options,\n })\n}\n\n/**\n * Unsubscribe from a spot\n *\n * @endpoint DELETE /spots/{spotId}/subscribe\n */\nexport function useUnsubscribeFromSpot(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (spotId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/spots/${spotId}/subscribe`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.subscriptions()})\n },\n ...options,\n })\n}\n\n/**\n * Toggle favorite status on a spot\n *\n * @endpoint POST /spots/{spotId}/favorite\n */\nexport function useFavoriteSpot(\n options?: Omit<\n UseMutationOptions<{isFavorite: boolean}, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<{isFavorite: boolean}, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (spotId: string): Promise<{isFavorite: boolean}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{isFavorite: boolean}>>(\n `/spots/${spotId}/favorite`,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.favorites()})\n },\n ...options,\n })\n}\n\n/**\n * Rate a spot\n *\n * @endpoint POST /spots/{spotId}/rate\n */\nexport function useRateSpot(\n options?: Omit<\n UseMutationOptions<\n {rating: number},\n Error,\n {spotId: string; rating: number}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n {rating: number},\n Error,\n {spotId: string; rating: number}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n spotId,\n rating,\n }: {\n spotId: string\n rating: number\n }): Promise<{rating: number}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{rating: number}>>(\n `/spots/${spotId}/rate`,\n {rating},\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: spotKeys.detail(variables.spotId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Report a spot\n *\n * @endpoint POST /spots/{spotId}/report\n */\nexport function useReportSpot(\n options?: Omit<\n UseMutationOptions<\n {success: boolean},\n Error,\n {spotId: string; reason: string; details?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n {success: boolean},\n Error,\n {spotId: string; reason: string; details?: string}\n> {\n return useMutation({\n mutationFn: async ({\n spotId,\n reason,\n details,\n }): Promise<{success: boolean}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{success: boolean}>>(\n `/spots/${spotId}/report`,\n {reason, details},\n )\n return response.data.data\n },\n ...options,\n })\n}\n","/**\n * Conversations Mutation Hooks\n *\n * TanStack Query hooks for conversation/messaging mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {conversationKeys} from '../queries/conversations'\nimport {\n type ApiResponse,\n type Conversation,\n type CreateConversationRequest,\n type Message,\n type SendMessageRequest,\n} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new conversation\n *\n * @endpoint POST /conversations\n */\nexport function useCreateConversation(\n options?: Omit<\n UseMutationOptions<Conversation, Error, CreateConversationRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<Conversation, Error, CreateConversationRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (\n data: CreateConversationRequest,\n ): Promise<Conversation> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Conversation>>(\n '/conversations',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Create or get direct conversation with a user\n *\n * @endpoint POST /conversations/direct\n */\nexport function useCreateDirectConversation(\n options?: Omit<\n UseMutationOptions<Conversation, Error, {userId: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<Conversation, Error, {userId: string}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {userId: string}): Promise<Conversation> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Conversation>>(\n '/conversations/direct',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Send a message in a conversation\n *\n * @endpoint POST /conversations/{id}/messages\n */\nexport function useSendMessage(\n options?: Omit<\n UseMutationOptions<\n Message,\n Error,\n {conversationId: string} & SendMessageRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Message,\n Error,\n {conversationId: string} & SendMessageRequest\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({conversationId, ...data}): Promise<Message> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Message>>(\n `/conversations/${conversationId}/messages`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: conversationKeys.messages(variables.conversationId),\n })\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Mark conversation as read\n *\n * @endpoint PUT /conversations/{id}/read\n */\nexport function useMarkConversationAsRead(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (conversationId: string): Promise<void> => {\n const client = getApiClient()\n await client.put(`/conversations/${conversationId}/read`)\n },\n onSuccess: (_, conversationId) => {\n queryClient.invalidateQueries({\n queryKey: conversationKeys.detail(conversationId),\n })\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Send typing indicator\n *\n * @endpoint POST /conversations/{id}/typing\n */\nexport function useSendTypingIndicator(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n return useMutation({\n mutationFn: async (conversationId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/conversations/${conversationId}/typing`)\n },\n ...options,\n })\n}\n","/**\n * Clubs Mutation Hooks\n *\n * TanStack Query hooks for club mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {clubKeys} from '../queries/clubs'\nimport {userKeys} from '../queries/users'\nimport {type ApiResponse, type Club} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new club\n *\n * @endpoint POST /clubs\n */\nexport function useCreateClub(\n options?: Omit<\n UseMutationOptions<\n Club,\n Error,\n {spotId: string; name: string; description?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Club,\n Error,\n {spotId: string; name: string; description?: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data): Promise<Club> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Club>>('/clubs', data)\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: clubKeys.bySpot(variables.spotId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Update a club\n *\n * @endpoint PUT /clubs/{id}\n */\nexport function useUpdateClub(\n options?: Omit<\n UseMutationOptions<\n Club,\n Error,\n {clubId: string; name?: string; description?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Club,\n Error,\n {clubId: string; name?: string; description?: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({clubId, ...data}): Promise<Club> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Club>>(\n `/clubs/${clubId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(clubKeys.detail(variables.clubId), data)\n },\n ...options,\n })\n}\n\n/**\n * Join a club\n *\n * @endpoint POST /clubs/{id}/join\n */\nexport function useJoinClub(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (clubId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/clubs/${clubId}/join`)\n },\n onSuccess: (_, clubId) => {\n queryClient.invalidateQueries({queryKey: clubKeys.detail(clubId)})\n queryClient.invalidateQueries({queryKey: userKeys.clubs()})\n },\n ...options,\n })\n}\n\n/**\n * Leave a club\n *\n * @endpoint POST /clubs/{id}/leave\n */\nexport function useLeaveClub(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (clubId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/clubs/${clubId}/leave`)\n },\n onSuccess: (_, clubId) => {\n queryClient.invalidateQueries({queryKey: clubKeys.detail(clubId)})\n queryClient.invalidateQueries({queryKey: userKeys.clubs()})\n },\n ...options,\n })\n}\n","/**\n * Notifications Mutation Hooks\n *\n * TanStack Query hooks for notification mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {notificationKeys} from '../queries/notifications'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Mark notifications as read\n *\n * @endpoint PUT /notifications/read\n */\nexport function useMarkNotificationsRead(\n options?: Omit<\n UseMutationOptions<void, Error, {notificationIds?: string[]}>,\n 'mutationFn'\n >,\n): UseMutationResult<void, Error, {notificationIds?: string[]}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {notificationIds?: string[]}): Promise<void> => {\n const client = getApiClient()\n await client.put('/notifications/read', data)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: notificationKeys.lists()})\n queryClient.invalidateQueries({queryKey: notificationKeys.unreadCount()})\n },\n ...options,\n })\n}\n\n/**\n * Register device token for push notifications\n *\n * @endpoint POST /device-tokens\n */\nexport function useRegisterDeviceToken(\n options?: Omit<\n UseMutationOptions<\n void,\n Error,\n {token: string; platform: 'ios' | 'android' | 'web'}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n void,\n Error,\n {token: string; platform: 'ios' | 'android' | 'web'}\n> {\n return useMutation({\n mutationFn: async (data): Promise<void> => {\n const client = getApiClient()\n await client.post('/device-tokens', data)\n },\n ...options,\n })\n}\n\n/**\n * Remove device token\n *\n * @endpoint DELETE /device-tokens\n */\nexport function useRemoveDeviceToken(\n options?: Omit<\n UseMutationOptions<void, Error, {token: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<void, Error, {token: string}> {\n return useMutation({\n mutationFn: async (data): Promise<void> => {\n const client = getApiClient()\n await client.delete('/device-tokens', {data})\n },\n ...options,\n })\n}\n","/**\n * Products Mutation Hooks\n *\n * TanStack Query hooks for product mutation operations.\n */\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport {productKeys} from '../queries/products'\nimport type {Product, ProductType, ApiResponse} from '../types'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface CreateProductRequest {\n spotId: string\n name: string\n slug?: string // Optional - auto-generated from name if not provided\n description?: string\n type: ProductType\n price: number\n currency?: string\n stock?: number // Maps to API's stockQuantity\n validityDays?: number // For PASS type - number of days valid\n eventDate?: string // For EVENT_TICKET type\n imageUrl?: string\n isActive?: boolean // true = ACTIVE, false = DRAFT\n}\n\n/**\n * Generate URL-friendly slug from name\n */\nfunction generateSlug(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 100)\n}\n\nexport interface UpdateProductRequest {\n name?: string\n slug?: string\n description?: string\n price?: number\n type?: ProductType\n stock?: number // Maps to API's stockQuantity\n validityDays?: number // For PASS type - number of days valid\n eventDate?: string // For EVENT_TICKET type\n imageUrl?: string\n isActive?: boolean // true = ACTIVE, false = DRAFT (maps to status field)\n}\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new product\n *\n * @endpoint POST /spots/{spotId}/products\n */\nexport function useCreateProduct(\n options?: Omit<\n UseMutationOptions<Product, Error, CreateProductRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<Product, Error, CreateProductRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: CreateProductRequest): Promise<Product> => {\n const client = getApiClient()\n const {spotId, slug, ...productData} = data\n\n // Auto-generate slug from name if not provided\n const productSlug = slug || generateSlug(productData.name)\n\n const response = await client.post<ApiResponse<Product>>(\n `/spots/${spotId}/products`,\n {...productData, slug: productSlug},\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(variables.spotId)})\n queryClient.invalidateQueries({queryKey: productKeys.list({my: true})})\n },\n ...options,\n })\n}\n\n/**\n * Update a product\n *\n * @endpoint PUT /products/{productId}\n */\nexport function useUpdateProduct(\n options?: Omit<\n UseMutationOptions<\n Product,\n Error,\n {productId: string; data: UpdateProductRequest}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Product,\n Error,\n {productId: string; data: UpdateProductRequest}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({productId, data}): Promise<Product> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Product>>(\n `/products/${productId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(productKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(data.spotId)})\n queryClient.invalidateQueries({queryKey: productKeys.list({my: true})})\n },\n ...options,\n })\n}\n\n/**\n * Delete a product\n *\n * @endpoint DELETE /products/{productId}\n */\nexport function useDeleteProduct(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (productId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/products/${productId}`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: productKeys.all})\n },\n ...options,\n })\n}\n\n/**\n * Adjust product stock\n *\n * @endpoint POST /products/{productId}/stock\n */\nexport function useAdjustStock(\n options?: Omit<\n UseMutationOptions<\n Product,\n Error,\n {\n productId: string\n quantity: number\n reason: 'RESTOCK' | 'ADJUSTMENT'\n notes?: string\n }\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Product,\n Error,\n {\n productId: string\n quantity: number\n reason: 'RESTOCK' | 'ADJUSTMENT'\n notes?: string\n }\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({productId, quantity, reason, notes}): Promise<Product> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Product>>(\n `/products/${productId}/stock`,\n {quantity, reason, notes},\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(productKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(data.spotId)})\n },\n ...options,\n })\n}\n","/**\n * Orders Mutation Hooks\n *\n * TanStack Query hooks for order mutation operations.\n */\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport {orderKeys, type OrderWithDetails} from '../queries/orders'\nimport {productKeys} from '../queries/products'\nimport type {Order, OrderStatus, ApiResponse} from '../types'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface CartItem {\n productId: string\n quantity: number\n}\n\nexport interface CreateOrderRequest {\n spotId: string\n items: CartItem[]\n notes?: string\n deliveryAddress?: string\n}\n\nexport interface CreateOrderResponse extends Order {\n items: Array<{\n id: string\n productId: string\n productName: string\n quantity: number\n unitPrice: number\n totalPrice: number\n }>\n}\n\nexport interface PaymentIntentResponse {\n clientSecret: string\n paymentIntentId: string\n}\n\nexport interface CoinbaseChargeResponse {\n chargeId: string\n chargeCode: string\n hostedUrl: string\n}\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new order\n *\n * @endpoint POST /orders\n */\nexport function useCreateOrder(\n options?: Omit<\n UseMutationOptions<CreateOrderResponse, Error, CreateOrderRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<CreateOrderResponse, Error, CreateOrderRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: CreateOrderRequest): Promise<CreateOrderResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<CreateOrderResponse>>(\n '/orders',\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n // Invalidate products to reflect updated stock\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(variables.spotId)})\n // Invalidate my orders list\n queryClient.invalidateQueries({queryKey: orderKeys.list({my: true})})\n },\n ...options,\n })\n}\n\n/**\n * Create Stripe PaymentIntent for an order\n *\n * @endpoint POST /payments/stripe/intent/{orderId}\n */\nexport function useCreateStripeIntent(\n options?: Omit<\n UseMutationOptions<PaymentIntentResponse, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<PaymentIntentResponse, Error, string> {\n return useMutation({\n mutationFn: async (orderId: string): Promise<PaymentIntentResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<PaymentIntentResponse>>(\n `/payments/stripe/intent/${orderId}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Create Coinbase Commerce charge for an order\n *\n * @endpoint POST /payments/coinbase/charge/{orderId}\n */\nexport function useCreateCoinbaseCharge(\n options?: Omit<\n UseMutationOptions<CoinbaseChargeResponse, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<CoinbaseChargeResponse, Error, string> {\n return useMutation({\n mutationFn: async (orderId: string): Promise<CoinbaseChargeResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<CoinbaseChargeResponse>>(\n `/payments/coinbase/charge/${orderId}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Update order status (seller action)\n *\n * @endpoint PUT /orders/{orderId}/status\n */\nexport function useUpdateOrderStatus(\n options?: Omit<\n UseMutationOptions<\n OrderWithDetails,\n Error,\n {orderId: string; status: OrderStatus}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n OrderWithDetails,\n Error,\n {orderId: string; status: OrderStatus}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({orderId, status}): Promise<OrderWithDetails> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<OrderWithDetails>>(\n `/orders/${orderId}/status`,\n {status},\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(orderKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: orderKeys.spotOrders(data.spotId)})\n },\n ...options,\n })\n}\n\n/**\n * Cancel an order (buyer action, only for pending orders)\n *\n * @endpoint POST /orders/{orderId}/cancel\n */\nexport function useCancelOrder(\n options?: Omit<\n UseMutationOptions<OrderWithDetails, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<OrderWithDetails, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (orderId: string): Promise<OrderWithDetails> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<OrderWithDetails>>(\n `/orders/${orderId}/cancel`,\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(orderKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: orderKeys.list({my: true})})\n // Restore stock\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(data.spotId)})\n },\n ...options,\n })\n}\n","/**\n * Redemption Mutation Hooks\n *\n * TanStack Query mutations for redemption operations.\n */\n\nimport {useMutation, useQueryClient, type UseMutationResult} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport {walletKeys, type WalletRedemption} from '../queries/wallet'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RedeemRequest {\n qrCode: string\n spotId?: string\n deviceInfo?: string\n latitude?: number\n longitude?: number\n notes?: string\n}\n\nexport interface VoidRedemptionRequest {\n reason: string\n}\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Redeem a QR code (spot owner/staff action)\n *\n * @endpoint POST /redemptions/redeem\n */\nexport function useRedeem(): UseMutationResult<WalletRedemption, Error, RedeemRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (request: RedeemRequest): Promise<WalletRedemption> => {\n const client = getApiClient()\n const response = await client.post('/redemptions/redeem', request)\n return response.data.data\n },\n onSuccess: (_data, variables) => {\n // Invalidate redemption lookup for this QR code\n queryClient.invalidateQueries({\n queryKey: walletKeys.lookup(variables.qrCode),\n })\n // Invalidate spot redemptions if spotId provided\n if (variables.spotId) {\n queryClient.invalidateQueries({\n queryKey: walletKeys.spotRedemptions(variables.spotId),\n })\n }\n },\n })\n}\n\n/**\n * Void a redemption (spot owner action)\n *\n * @endpoint PUT /redemptions/:id/void\n */\nexport function useVoidRedemption(): UseMutationResult<\n WalletRedemption,\n Error,\n {redemptionId: string; reason: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n redemptionId,\n reason,\n }: {\n redemptionId: string\n reason: string\n }): Promise<WalletRedemption> => {\n const client = getApiClient()\n const response = await client.put(`/redemptions/${redemptionId}/void`, {reason})\n return response.data.data\n },\n onSuccess: () => {\n // Invalidate wallet queries\n queryClient.invalidateQueries({queryKey: walletKeys.all})\n queryClient.invalidateQueries({queryKey: walletKeys.redemptions()})\n },\n })\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/api/client.ts","../src/api/types.ts","../src/api/queries/auth.ts","../src/api/queries/users.ts","../src/api/queries/spots.ts","../src/api/queries/posts.ts","../src/api/queries/conversations.ts","../src/api/queries/clubs.ts","../src/api/queries/templates.ts","../src/api/queries/notifications.ts","../src/api/queries/misc.ts","../src/api/queries/products.ts","../src/api/queries/orders.ts","../src/api/queries/wallet.ts","../src/api/queries/payments.ts","../src/api/mutations/users.ts","../src/api/mutations/posts.ts","../src/api/mutations/spots.ts","../src/api/mutations/conversations.ts","../src/api/mutations/clubs.ts","../src/api/mutations/notifications.ts","../src/api/mutations/products.ts","../src/api/mutations/orders.ts","../src/api/mutations/redemptions.ts"],"names":["axios","types_star","useMutation","useQuery","extractArrayData","useInfiniteQuery","extractObjectData","useQueryClient"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,2BAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,0BAAA,EAAA,MAAA,0BAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,UAAA,EAAA,MAAA;AAAA,CAAA,CAAA;ACaA,IAAI,MAAA,GAA2B,IAAA;AAC/B,IAAI,SAAA,GAAkC,IAAA;AAE/B,SAAS,aAAa,SAAA,EAA4B;AACvD,EAAA,MAAA,GAAS,SAAA;AACT,EAAA,SAAA,GAAY,gBAAgB,SAAS,CAAA;AACvC;AAEO,SAAS,YAAA,GAA8B;AAC5C,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,SAAA,GAAuB;AACrC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAgB,SAAA,EAAqC;AAC5D,EAAA,MAAM,MAAA,GAASA,uBAAM,MAAA,CAAO;AAAA,IAC1B,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB;AAAA;AAClB,GACD,CAAA;AAGD,EAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,GAAA;AAAA,IAC1B,OAAO,aAAA,KAA8C;AACnD,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,cAAA,EAAe;AAC7C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,aAAA,CAAc,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,MACvD;AAGA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,MAAA,EAAS,aAAA,CAAc,MAAA,EAAQ,WAAA,EAAa,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG,aAAA,CAAc,GAAG,CAAA;AAAA,OACvF;AACA,MAAA,OAAO,aAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAA,KAAA,KAAS,OAAA,CAAQ,MAAA,CAAO,KAAK;AAAA,GAC/B;AAGA,EAAA,MAAA,CAAO,aAAa,QAAA,CAAS,GAAA;AAAA,IAC3B,CAAA,QAAA,KAAY,QAAA;AAAA,IACZ,OAAO,KAAA,KAAsB;AAC3B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,gBAAgB,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,CAAA;AAAA,QAC3D,KAAA,CAAM;AAAA,OACR;AAGA,MAAA,IAAI,KAAA,CAAM,QAAA,EAAU,MAAA,KAAW,GAAA,EAAK;AAClC,QAAA,IAAI,UAAU,kBAAA,EAAoB;AAChC,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,kBAAA,EAAmB;AACpD,YAAA,IAAI,QAAA,IAAY,MAAM,MAAA,EAAQ;AAC5B,cAAA,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA;AACvD,cAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,YACpC;AAAA,UACF,CAAA,CAAA,MAAQ;AACN,YAAA,SAAA,CAAU,cAAA,IAAiB;AAAA,UAC7B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,cAAA,IAAiB;AAAA,QAC7B;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IAC7B;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1FA,IAAA,aAAA,GAAA,EAAA;AAeA,UAAA,CAAA,aAAA,EAAAC,qBAAA,CAAA;;;AF6BA,UAAA,CAAA,aAAA,EAAc,aAAA,CAAA;AGfP,SAAS,WACd,OAAA,EAIwE;AACxE,EAAA,OAAOC,sBAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAyB;AAC1C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,gBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aACd,OAAA,EAI0D;AAC1D,EAAA,OAAOA,sBAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAA2B;AAC5C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAmB,oBAAoB,IAAI,CAAA;AACzE,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,gBACd,OAAA,EAIyE;AACzE,EAAA,OAAOA,sBAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAiC;AAClD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,eAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACjEA,SAAS,iBAAoB,IAAA,EAAoB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AACzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAMO,IAAM,QAAA,GAAW;AAAA,EACtB,GAAA,EAAK,CAAC,OAAO,CAAA;AAAA,EACb,IAAI,MAAM,CAAC,GAAG,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EAChC,OAAO,MAAM,CAAC,GAAG,QAAA,CAAS,EAAA,IAAM,OAAO,CAAA;AAAA,EACvC,cAAc,MAAM,CAAC,GAAG,QAAA,CAAS,EAAA,IAAM,eAAe,CAAA;AAAA,EACtD,QAAA,EAAU,CAAC,KAAA,KAAmB,CAAC,GAAG,QAAA,CAAS,EAAA,EAAG,EAAG,UAAA,EAAY,KAAK,CAAA;AAAA,EAClE,KAAA,EAAO,CAAC,MAAA,KACN,CAAC,GAAG,QAAA,CAAS,EAAA,EAAG,EAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACpC,OAAO,MAAM,CAAC,GAAG,QAAA,CAAS,EAAA,IAAM,OAAO,CAAA;AAAA,EACvC,eAAe,MAAM,CAAC,GAAG,QAAA,CAAS,EAAA,IAAM,eAAe,CAAA;AAAA,EACvD,SAAS,MAAM,CAAC,GAAG,QAAA,CAAS,EAAA,IAAM,SAAS,CAAA;AAAA,EAC3C,YAAY,MAAM,CAAC,GAAG,QAAA,CAAS,EAAA,IAAM,aAAa,CAAA;AAAA,EAClD,WAAW,MAAM,CAAC,GAAG,QAAA,CAAS,EAAA,IAAM,WAAW;AACjD;AAWO,SAAS,eACd,OAAA,EACsB;AACtB,EAAA,OAAOC,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,EAAA,EAAG;AAAA,IACtB,SAAS,YAA2B;AAClC,MAAA,OAAA,CAAQ,IAAI,mCAAmC,CAAA;AAC/C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAuB,WAAW,CAAA;AAChE,QAAA,OAAA,CAAQ,GAAA,CAAI,sBAAA,EAAwB,QAAA,CAAS,MAAM,CAAA;AACnD,QAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,MACvB,SAAS,KAAA,EAAgB;AACvB,QAAA,MAAM,UAAA,GAAa,KAAA;AAInB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,oBAAA;AAAA,UACA,WAAW,QAAA,EAAU,MAAA;AAAA,UACrB,MAAA;AAAA,UACA,WAAW,MAAA,EAAQ,OAAA;AAAA,UACnB,WAAW,MAAA,EAAQ;AAAA,SACrB;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAQO,SAAS,aACd,OAAA,EAIqE;AACrE,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,IACzB,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GACJ,MAAM,MAAA,CAAO,GAAA,CAEX,iBAAiB,CAAA;AACrB,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAaO,SAAS,oBACd,OAAA,EACsC;AACtC,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,YAAA,EAAa;AAAA,IAChC,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eAAA,CACd,KAAA,GAAgB,EAAA,EAChB,OAAA,EAC2B;AAC3B,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AAAA,IACjC,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,4BAA4B,KAAK,CAAA;AAAA,OACnC;AACA,MAAA,OAAO,gBAAA,CAA0B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACrD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,YAAA,CACd,QACA,OAAA,EACwB;AACxB,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAAA,IAC/B,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,kBAAkB,WAAW,CAAA;AAAA,OAC/B;AACA,MAAA,OAAO,gBAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aACd,OAAA,EACwB;AACxB,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,IACzB,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAA0B,gBAAgB,CAAA;AACxE,MAAA,OAAO,gBAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,qBACd,OAAA,EACoC;AACpC,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,aAAA,EAAc;AAAA,IACjC,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B;AAAA,OACF;AACA,MAAA,OAAO,gBAAA,CAAmC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,gBACd,OAAA,EACwB;AACxB,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,OAAA,EAAQ;AAAA,IAC3B,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GACJ,MAAM,MAAA,CAAO,GAAA,CAA0B,kBAAkB,CAAA;AAC3D,MAAA,OAAO,gBAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EACwB;AACxB,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,UAAA,EAAW;AAAA,IAC9B,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B;AAAA,OACF;AACA,MAAA,OAAO,gBAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,iBACd,OAAA,EACgC;AAChC,EAAA,OAAOA,mBAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,SAAA,EAAU;AAAA,IAC7B,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B;AAAA,OACF;AACA,MAAA,OAAO,gBAAA,CAA+B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AChRA,SAASC,kBAAoB,IAAA,EAAoB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AACzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAKA,SAAS,kBAAqB,IAAA,EAAkB;AAC9C,EAAA,IACE,IAAA,IACA,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,IAAU,QACV,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EACnB;AACA,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AACzC,IAAA,IACE,MAAA,IACA,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,IAAU,UACV,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EACrB;AACA,MAAA,OAAQ,MAAA,CAAqB,IAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,QAAA,GAAW;AAAA,EACtB,GAAA,EAAK,CAAC,OAAO,CAAA;AAAA,EACb,OAAO,MAAM,CAAC,GAAG,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EACrC,IAAA,EAAM,CAAC,OAAA,KACL,CAAC,GAAG,QAAA,CAAS,KAAA,IAAS,OAAO,CAAA;AAAA,EAC/B,SAAS,MAAM,CAAC,GAAG,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,EACzC,MAAA,EAAQ,CAAC,EAAA,KAAe,CAAC,GAAG,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AAAA,EAClD,MAAA,EAAQ,CAAC,IAAA,KAAiB,CAAC,GAAG,QAAA,CAAS,GAAA,EAAK,QAAQ,IAAI,CAAA;AAAA,EACxD,IAAA,EAAM,CAAC,MAAA,KAAmB,CAAC,GAAG,QAAA,CAAS,GAAA,EAAK,MAAM,MAAM,CAAA;AAAA,EACxD,MAAA,EAAQ,CAAC,MAAA,KAAmB,CAAC,GAAG,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG,QAAQ;AACnE;AAWO,SAAS,QAAA,CACd,QAYA,OAAA,EACwB;AACxB,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9B,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,QAAQ,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AACrD,MAAA,IAAI,QAAQ,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AACrD,MAAA,IAAI,MAAA,EAAQ,KAAK,WAAA,CAAY,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ,KAAK,WAAA,CAAY,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAC1D,MAAA,IAAI,MAAA,EAAQ,QAAQ,WAAA,CAAY,GAAA,CAAI,UAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACnE,MAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,MAAA,IAAI,QAAQ,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,OAAO,KAAK,CAAA;AAC1D,MAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,WAAW,CAAA;AAAA,OACvB;AACA,MAAA,OAAOC,iBAAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,OAAA,CACd,QACA,OAAA,EACsB;AACtB,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IAChC,SAAS,YAA2B;AAClC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA;AAAA,OAClB;AACA,MAAA,OAAO,iBAAA,CAAwB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aAAA,CACd,MACA,OAAA,EACsB;AACtB,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAAA,IAC9B,SAAS,YAA2B;AAClC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,eAAe,IAAI,CAAA;AAAA,OACrB;AACA,MAAA,OAAO,iBAAA,CAAwB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,IAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,WAAA,CACd,QACA,OAAA,EACsB;AACtB,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9B,SAAS,YAA2B;AAClC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,aAAa,MAAM,CAAA;AAAA,OACrB;AACA,MAAA,OAAO,iBAAA,CAAwB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aAAA,CACd,QACA,OAAA,EAC6B;AAC7B,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IAChC,SAAS,YAAkC;AACzC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,OAAA;AAAA,OAClB;AACA,MAAA,OAAOC,iBAAAA,CAA4B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACvD,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,qBAAA,CACd,QACA,OAAA,EAIuC;AACvC,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,UAAU,CAAC,GAAG,SAAS,MAAA,CAAO,MAAM,GAAG,UAAU,CAAA;AAAA,IACjD,SAAS,YAA4C;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,SAAA;AAAA,OAClB;AACA,MAAA,OAAO,iBAAA,CAAyC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAyBO,SAAS,gBAAA,CACd,QACA,OAAA,EAWA;AACA,EAAA,OAAOE,2BAAA,CAAiB;AAAA,IACtB,UAAU,CAAC,GAAG,SAAS,KAAA,EAAM,EAAG,YAAY,MAAM,CAAA;AAAA,IAClD,OAAA,EAAS,OAAO,EAAC,SAAA,GAAY,GAAC,KAAwC;AACpE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,SAAS,CAAC,CAAA;AACzC,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,QAAQ,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AACrD,MAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,MAAA,IAAI,MAAA,EAAQ,IAAA,IAAQ,MAAA,CAAO,IAAA,KAAS,KAAA;AAClC,QAAA,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AACrC,MAAA,IAAI,MAAA,EAAQ,QAAQ,IAAA,EAAK;AACvB,QAAA,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAChD,MAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,QAAA,MAAA,CAAO,aAAA,CAAc,OAAA;AAAA,UAAQ,CAAC,IAAA,KAC5B,WAAA,CAAY,MAAA,CAAO,iBAAiB,IAAI;AAAA,SAC1C;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,EAAA,KAAO,YAAY,MAAA,CAAO,SAAA,EAAW,EAAE,CAAC,CAAA;AAAA,MAClE;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,WAAW,CAAA;AAAA,OACvB;AAEA,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,IAAA;AAC3B,MAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,SAAA;AACb,MAAA,OAAO;AAAA,QACL,IAAA,EAAMD,kBAAuB,IAAI,CAAA;AAAA,QACjC,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,CAAA;AAAA,UACP,IAAA;AAAA,UACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,UACxB,UAAA,EAAY,CAAA;AAAA,UACZ,WAAA,EAAa,KAAA;AAAA,UACb,iBAAiB,IAAA,GAAO;AAAA;AAC1B,OACF;AAAA,IACF,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAA;AAAA,IAClB,gBAAA,EAAkB,CAAC,QAAA,KAAa;AAC9B,MAAA,OAAO,SAAS,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AAAA,IAC9D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AC9SA,SAASA,kBAAoB,IAAA,EAAoB;AAE/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AACzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAMA,SAASE,mBAAqB,IAAA,EAAkB;AAE9C,EAAA,IACE,IAAA,IACA,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,IAAU,QACV,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EACnB;AACA,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AAEzC,IAAA,IACE,MAAA,IACA,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,IAAU,UACV,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EACrB;AACA,MAAA,OAAQ,MAAA,CAAqB,IAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,QAAA,GAAW;AAAA,EACtB,GAAA,EAAK,CAAC,OAAO,CAAA;AAAA,EACb,OAAO,MAAM,CAAC,GAAG,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,EACrC,IAAA,EAAM,CAAC,OAAA,KACL,CAAC,GAAG,QAAA,CAAS,KAAA,IAAS,OAAO,CAAA;AAAA,EAC/B,MAAA,EAAQ,CAAC,MAAA,EAAgB,OAAA,KACvB,CAAC,GAAG,QAAA,CAAS,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3C,SAAS,MAAM,CAAC,GAAG,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,EACzC,MAAA,EAAQ,CAAC,EAAA,KAAe,CAAC,GAAG,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AAAA,EAClD,SAAA,EAAW,CAAC,MAAA,KACV,CAAC,GAAG,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG,WAAW,CAAA;AAAA,EAC1C,MAAA,EAAQ,CAAC,MAAA,KAAmB,CAAC,GAAG,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,EACjE,OAAA,EAAS,CAAC,MAAA,EAAgB,OAAA,KACxB,CAAC,GAAG,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG,SAAA,EAAW,OAAO;AACnD;AAWO,SAAS,YAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EACwB;AACxB,EAAA,OAAOH,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,IACxC,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,QAAQ,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AACjE,MAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,CAAA,OAAA,EAAU,MAAM,CAAA,OAAA,EAAU,WAAW,CAAA;AAAA,OACvC;AACA,MAAA,OAAOC,iBAAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,OAAA,CACd,QACA,OAAA,EACsB;AACtB,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IAChC,SAAS,YAA2B;AAClC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA;AAAA,OAClB;AACA,MAAA,OAAOG,kBAAAA,CAAwB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,gBAAA,CACd,QACA,OAAA,EACgC;AAChC,EAAA,OAAOH,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,SAAA,CAAU,MAAM,CAAA;AAAA,IACnC,SAAS,YAAqC;AAC5C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,UAAA;AAAA,OAClB;AACA,MAAA,OAAOC,iBAAAA,CAA+B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,QAAA,CACd,QACA,OAAA,EACwB;AACxB,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AAAA,IAC9B,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,QAAQ,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AACjE,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,WAAW,CAAA;AAAA,OACvB;AACA,MAAA,OAAOC,iBAAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aAAA,CACd,QACA,OAAA,EAC+B;AAC/B,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IAChC,SAAS,YAAoC;AAC3C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,OAAA;AAAA,OAClB;AACA,MAAA,OAAOG,kBAAAA,CAAiC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EACqC;AACrC,EAAA,OAAOH,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,IACzC,SAAS,YAA0C;AACjD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,MAAA,EAAQ,QAAQ,WAAA,CAAY,GAAA,CAAI,UAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACnE,MAAA,MAAM,WAAA,GAAc,YAAY,QAAA,EAAS;AACzC,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,QAAA,EAAW,cAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA;AAAA,OACjE;AAEA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,YAAA,CACd,QAQA,OAAA,EAIwE;AACxE,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,UAAU,CAAC,GAAG,SAAS,KAAA,EAAM,EAAG,QAAQ,MAAM,CAAA;AAAA,IAC9C,SAAS,YAIH;AACJ,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AACzC,MAAA,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AACzC,MAAA,IAAI,MAAA,CAAO,QAAQ,WAAA,CAAY,GAAA,CAAI,UAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAClE,MAAA,IAAI,OAAO,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AAChE,MAAA,IAAI,OAAO,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC1D,MAAA,IAAI,MAAA,CAAO,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAE/D,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,GAAA,CAE5B,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,CAAA;AAE9B,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,IAAA;AAC3B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,KAAA,IAASC,iBAAAA,CAAuB,IAAI,CAAA;AAAA,QAChD,OAAA,EAAS,KAAK,OAAA,IAAW,KAAA;AAAA,QACzB,YAAY,IAAA,CAAK;AAAA,OACnB;AAAA,IACF,CAAA;AAAA,IACA,OAAA,EAAS,MAAA,CAAO,GAAA,KAAQ,CAAA,IAAK,OAAO,GAAA,KAAQ,CAAA;AAAA,IAC5C,GAAG;AAAA,GACJ,CAAA;AACH;ACrRO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,GAAA,EAAK,CAAC,eAAe,CAAA;AAAA,EACrB,OAAO,MAAM,CAAC,GAAG,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAAA,EAC7C,MAAM,MAAM,CAAC,GAAG,gBAAA,CAAiB,OAAO,CAAA;AAAA,EACxC,SAAS,MAAM,CAAC,GAAG,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAAA,EACjD,MAAA,EAAQ,CAAC,EAAA,KAAe,CAAC,GAAG,gBAAA,CAAiB,OAAA,IAAW,EAAE,CAAA;AAAA,EAC1D,QAAA,EAAU,CAAC,cAAA,EAAwB,MAAA,KACjC,CAAC,GAAG,gBAAA,CAAiB,MAAA,CAAO,cAAc,CAAA,EAAG,UAAA,EAAY,MAAM;AACnE;AAWO,SAAS,iBACd,OAAA,EACgC;AAChC,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,iBAAiB,IAAA,EAAK;AAAA,IAChC,SAAS,YAAqC;AAC5C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GACJ,MAAM,MAAA,CAAO,GAAA,CAAiC,gBAAgB,CAAA;AAChE,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eAAA,CACd,gBACA,OAAA,EAC8B;AAC9B,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,gBAAA,CAAiB,MAAA,CAAO,cAAc,CAAA;AAAA,IAChD,SAAS,YAAmC;AAC1C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,kBAAkB,cAAc,CAAA;AAAA,OAClC;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,cAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,uBAAA,CACd,cAAA,EACA,MAAA,EACA,OAAA,EAUC;AACD,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,gBAAA,CAAiB,QAAA,CAAS,cAAA,EAAgB,MAAM,CAAA;AAAA,IAC1D,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAG3B,kBAAkB,cAAc,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,CAAA;AAC7D,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,cAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AC5FO,IAAM,QAAA,GAAW;AAAA,EACtB,GAAA,EAAK,CAAC,OAAO,CAAA;AAAA,EACb,MAAA,EAAQ,CAAC,MAAA,KAAmB,CAAC,GAAG,QAAA,CAAS,GAAA,EAAK,QAAQ,MAAM,CAAA;AAAA,EAC5D,SAAS,MAAM,CAAC,GAAG,QAAA,CAAS,KAAK,QAAQ,CAAA;AAAA,EACzC,MAAA,EAAQ,CAAC,EAAA,KAAe,CAAC,GAAG,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AAAA,EAClD,MAAA,EAAQ,CAAC,IAAA,KAAiB,CAAC,GAAG,QAAA,CAAS,GAAA,EAAK,QAAQ,IAAI,CAAA;AAAA,EACxD,MAAA,EAAQ,CAAC,MAAA,KAAmB,CAAC,GAAG,QAAA,CAAS,GAAA,EAAK,QAAQ,MAAM,CAAA;AAAA,EAC5D,UAAA,EAAY,CAAC,MAAA,EAAgB,MAAA,KAC3B,CAAC,GAAG,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG,YAAA,EAAc,MAAM;AACrD;AAWO,SAAS,cAAA,CACd,QACA,OAAA,EACwB;AACxB,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IAChC,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,eAAe,MAAM,CAAA;AAAA,OACvB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,OAAA,CACd,QACA,OAAA,EACsB;AACtB,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IAChC,SAAS,YAA2B;AAClC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,GAAA,CAAuB,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AACvE,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aAAA,CACd,MACA,OAAA,EACsB;AACtB,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAAA,IAC9B,SAAS,YAA2B;AAClC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,eAAe,IAAI,CAAA;AAAA,OACrB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,IAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cAAA,CACd,QACA,OAAA,EACwB;AACxB,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,IAChC,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,eAAe,MAAM,CAAA;AAAA,OACvB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,iBAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EAIoD;AACpD,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,QAAA,CAAS,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC5C,SAAS,YAAY;AACnB,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAE5B,UAAU,MAAM,CAAA,YAAA,EAAe,MAAM,CAAA,CAAE,CAAA;AACzC,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA,IAAU,CAAC,CAAC,MAAA;AAAA,IACvB,GAAG;AAAA,GACJ,CAAA;AACH;AClIO,IAAM,YAAA,GAAe;AAAA,EAC1B,GAAA,EAAK,CAAC,WAAW,CAAA;AAAA,EACjB,OAAO,MAAM,CAAC,GAAG,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EACzC,IAAA,EAAM,CAAC,OAAA,KACL,CAAC,GAAG,YAAA,CAAa,KAAA,IAAS,OAAO,CAAA;AAAA,EACnC,SAAS,MAAM,CAAC,GAAG,YAAA,CAAa,KAAK,QAAQ,CAAA;AAAA,EAC7C,MAAA,EAAQ,CAAC,EAAA,KAAe,CAAC,GAAG,YAAA,CAAa,OAAA,IAAW,EAAE,CAAA;AAAA,EACtD,MAAA,EAAQ,CAAC,IAAA,KAAiB,CAAC,GAAG,YAAA,CAAa,GAAA,EAAK,QAAQ,IAAI;AAC9D;AAWO,SAAS,YAAA,CACd,QACA,OAAA,EAC4B;AAC5B,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAAA,IAClC,SAAS,YAAiC;AACxC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,QAAQ,QAAA,EAAU,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AACjE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,cAAc,WAAW,CAAA;AAAA,OAC3B;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,WAAA,CACd,YACA,OAAA,EAC0B;AAC1B,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,YAAA,CAAa,MAAA,CAAO,UAAU,CAAA;AAAA,IACxC,SAAS,YAA+B;AACtC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,cAAc,UAAU,CAAA;AAAA,OAC1B;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,UAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,iBAAA,CACd,MACA,OAAA,EAC0B;AAC1B,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AAAA,IAClC,SAAS,YAA+B;AACtC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,mBAAmB,IAAI,CAAA;AAAA,OACzB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,IAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AClFO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,GAAA,EAAK,CAAC,eAAe,CAAA;AAAA,EACrB,OAAO,MAAM,CAAC,GAAG,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAAA,EAC7C,IAAA,EAAM,CAAC,MAAA,KACL,CAAC,GAAG,gBAAA,CAAiB,KAAA,IAAS,MAAM,CAAA;AAAA,EACtC,aAAa,MAAM,CAAC,GAAG,gBAAA,CAAiB,KAAK,aAAa;AAC5D;AAWO,SAAS,gBAAA,CACd,QACA,OAAA,EACgC;AAChC,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,gBAAA,CAAiB,IAAA,CAAK,MAAM,CAAA;AAAA,IACtC,SAAS,YAAqC;AAC5C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,MAAA,EAAQ,UAAA;AACV,QAAA,WAAA,CAAY,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,UAAU,CAAC,CAAA;AACzD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,kBAAkB,WAAW,CAAA;AAAA,OAC/B;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,2BACd,OAAA,EACwB;AACxB,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,iBAAiB,WAAA,EAAY;AAAA,IACvC,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B;AAAA,OACF;AACA,MAAA,OAAO,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA;AAAA,IAC5B,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACpDA,SAASC,kBAAoB,IAAA,EAAoB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AACzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAMO,IAAM,QAAA,GAAW;AAAA,EACtB,MAAA,EAAQ,MAAM,CAAC,QAAQ,CAAA;AAAA,EACvB,KAAA,EAAO,MAAM,CAAC,OAAO,CAAA;AAAA,EACrB,cAAA,EAAgB,MAAM,CAAC,iBAAiB;AAC1C;AAWO,SAAS,UACd,OAAA,EACwB;AACxB,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,IAC1B,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAA0B,SAAS,CAAA;AACjE,MAAA,OAAOC,iBAAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA,IACvB,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,SACd,OAAA,EACwB;AACxB,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,IACzB,SAAS,YAA6B;AACpC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAA0B,QAAQ,CAAA;AAChE,MAAA,OAAOC,iBAAAA,CAAuB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA,IACvB,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,kBACd,OAAA,EACiC;AACjC,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAS,cAAA,EAAe;AAAA,IAClC,SAAS,YAAsC;AAC7C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GACJ,MAAM,MAAA,CAAO,GAAA,CAA0B,kBAAkB,CAAA;AAC3D,MAAA,OAAOC,iBAAAA,CAAgC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA,IACvB,GAAG;AAAA,GACJ,CAAA;AACH;ACzFO,IAAM,WAAA,GAAc;AAAA,EACzB,GAAA,EAAK,CAAC,UAAU,CAAA;AAAA,EAChB,OAAO,MAAM,CAAC,GAAG,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,EACxC,IAAA,EAAM,CAAC,OAAA,KACL,CAAC,GAAG,WAAA,CAAY,KAAA,IAAS,OAAO,CAAA;AAAA,EAClC,SAAS,MAAM,CAAC,GAAG,WAAA,CAAY,KAAK,QAAQ,CAAA;AAAA,EAC5C,MAAA,EAAQ,CAAC,EAAA,KAAe,CAAC,GAAG,WAAA,CAAY,OAAA,IAAW,EAAE,CAAA;AAAA,EACrD,MAAA,EAAQ,CAAC,MAAA,EAAgB,IAAA,KACvB,CAAC,GAAG,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC3C,MAAA,EAAQ,CAAC,MAAA,KAAmB,CAAC,GAAG,WAAA,CAAY,GAAA,EAAK,QAAQ,MAAM;AACjE;AA2BO,SAAS,eAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EAI4C;AAC5C,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAAA,IACnC,SAAS,YAAiD;AACxD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,IAAI,QAAQ,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AACrD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,CAAA,OAAA,EAAU,MAAM,CAAA,UAAA,EAAa,WAAW,CAAA;AAAA,OAC1C;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,UAAA,CACd,WACA,OAAA,EACiC;AACjC,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA;AAAA,IACtC,SAAS,YAAsC;AAC7C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,aAAa,SAAS,CAAA;AAAA,OACxB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,SAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,gBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACiC;AACjC,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzC,SAAS,YAAsC;AAC7C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,EAAkB,IAAI,CAAA;AAAA,OACxC;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA,IAAU,CAAC,CAAC,IAAA;AAAA,IACvB,GAAG;AAAA,GACJ,CAAA;AACH;AC3GO,IAAM,SAAA,GAAY;AAAA,EACvB,GAAA,EAAK,CAAC,QAAQ,CAAA;AAAA,EACd,OAAO,MAAM,CAAC,GAAG,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,EACtC,IAAA,EAAM,CAAC,OAAA,KACL,CAAC,GAAG,SAAA,CAAU,KAAA,IAAS,OAAO,CAAA;AAAA,EAChC,SAAS,MAAM,CAAC,GAAG,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,EAC1C,MAAA,EAAQ,CAAC,EAAA,KAAe,CAAC,GAAG,SAAA,CAAU,OAAA,IAAW,EAAE,CAAA;AAAA,EACnD,UAAU,MAAM,CAAC,GAAG,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,EACvC,UAAA,EAAY,CAAC,MAAA,KAAmB,CAAC,GAAG,SAAA,CAAU,GAAA,EAAK,QAAQ,MAAM;AACnE;AA4BO,SAAS,WAAA,CACd,QACA,OAAA,EAIqD;AACrD,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,UAAU,IAAA,CAAK,EAAC,GAAG,MAAA,EAAQ,EAAA,EAAI,MAAK,CAAA;AAAA,IAC9C,SAAS,YAA0D;AACjE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,GAAA,CAE5B,CAAA,iBAAA,EAAoB,WAAW,CAAA,CAAE,CAAA;AACnC,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,QAAA,CACd,SACA,OAAA,EACkC;AAClC,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAAA,IAClC,SAAS,YAAuC;AAC9C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,WAAW,OAAO,CAAA;AAAA,OACpB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,OAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EAIqD;AACrD,EAAA,OAAOA,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA;AAAA,IACrC,SAAS,YAA0D;AACjE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAE5B,iBAAiB,MAAM,CAAA,QAAA,EAAW,WAAW,CAAA,CAAE,CAAA;AACjD,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;ACxCA,SAASC,kBAAoB,IAAA,EAAoB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AACzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAASE,mBAAqB,IAAA,EAAkB;AAC9C,EAAA,IACE,IAAA,IACA,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,IAAU,QACV,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EACnB;AACA,IAAA,MAAM,SAAU,IAAA,CAAyB,IAAA;AACzC,IAAA,IACE,MAAA,IACA,OAAO,MAAA,KAAW,QAAA,IAClB,MAAA,IAAU,UACV,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EACrB;AACA,MAAA,OAAQ,MAAA,CAAqB,IAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,UAAA,GAAa;AAAA,EACxB,GAAA,EAAK,CAAC,QAAQ,CAAA;AAAA,EACd,QAAQ,MAAM,CAAC,GAAG,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,EAC1C,OAAA,EAAS,CAAC,IAAA,KAAkB,CAAC,GAAG,UAAA,CAAW,GAAA,EAAK,WAAW,IAAI,CAAA;AAAA,EAC/D,WAAA,EAAa,MAAM,CAAC,aAAa,CAAA;AAAA,EACjC,MAAA,EAAQ,CAAC,MAAA,KAAmB,CAAC,GAAG,UAAA,CAAW,WAAA,EAAY,EAAG,QAAA,EAAU,MAAM,CAAA;AAAA,EAC1E,eAAA,EAAiB,CAAC,MAAA,EAAgB,IAAA,KAChC,CAAC,GAAG,UAAA,CAAW,WAAA,EAAY,EAAG,MAAA,EAAQ,MAAA,EAAQ,IAAI;AACtD;AAWO,SAAS,UACd,OAAA,EACoC;AACpC,EAAA,OAAOH,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,WAAW,MAAA,EAAO;AAAA,IAC5B,SAAS,YAAyC;AAChD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAA0B,SAAS,CAAA;AACjE,MAAA,OAAOC,iBAAAA,CAAmC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,gBAAA,CACd,QACA,OAAA,EACuC;AACvC,EAAA,OAAOD,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzC,SAAS,YAA4C;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,mBAAmB,WAAW,CAAA;AAAA,OAChC;AACA,MAAA,OAAOG,kBAAAA,CAAyC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,mBAAA,CACd,QACA,OAAA,EACkC;AAClC,EAAA,OAAOH,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAAA,IAClC,SAAS,YAAuC;AAC9C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,uBAAuB,MAAM,CAAA;AAAA,OAC/B;AACA,MAAA,OAAOG,kBAAAA,CAAoC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA,IAAU,OAAO,MAAA,GAAS,CAAA;AAAA,IACrC,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,kBAAA,CACd,MAAA,EACA,MAAA,EACA,OAAA,EACuC;AACvC,EAAA,OAAOH,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,UAAA,CAAW,eAAA,CAAgB,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAAA,IACzD,SAAS,YAA4C;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,MAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,MAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,CAAA,OAAA,EAAU,MAAM,CAAA,aAAA,EAAgB,WAAW,CAAA;AAAA,OAC7C;AACA,MAAA,OAAOG,kBAAAA,CAAyC,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,GAAG;AAAA,GACJ,CAAA;AACH;AC7NO,IAAM,WAAA,GAAc;AAAA,EACzB,GAAA,EAAK,CAAC,UAAU,CAAA;AAAA,EAChB,QAAQ,MAAM,CAAC,GAAG,WAAA,CAAY,KAAK,QAAQ;AAC7C;AA8BO,SAAS,iBACd,OAAA,EAC+B;AAC/B,EAAA,OAAOH,mBAAAA,CAAS;AAAA,IACd,QAAA,EAAU,YAAY,MAAA,EAAO;AAAA,IAC7B,SAAS,YAAoC;AAC3C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA;AAAA,IACvB,GAAG;AAAA,GACJ,CAAA;AACH;ACxCO,SAAS,iBACd,OAAA,EAIsD;AACtD,EAAA,MAAM,cAAcI,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAA8C;AAC/D,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAuB,aAAa,IAAI,CAAA;AACtE,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,CAAA,IAAA,KAAQ;AACjB,MAAA,WAAA,CAAY,YAAA,CAAa,QAAA,CAAS,EAAA,EAAG,EAAG,IAAI,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AASO,SAAS,gBACd,OAAA,EAIyD;AACzD,EAAA,MAAM,cAAcK,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,QAAA,KAAqD;AACtE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,kBAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,UACE,OAAA,EAAS,EAAC,cAAA,EAAgB,qBAAA;AAAqB;AACjD,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,EAAA,IAAK,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,iBACd,OAAA,EACsC;AACtC,EAAA,MAAM,cAAcK,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,YAA2B;AACrC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,OAAO,WAAW,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,KAAA,EAAM;AAAA,IACpB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EAImD;AACnD,EAAA,MAAM,cAAcK,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAA2C;AAC5D,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,iBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,EAAA,IAAK,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,mBACd,OAAA,EAIuD;AACvD,EAAA,MAAM,cAAcK,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAA+C;AAChE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,oBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,EAAA,IAAK,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,0BACd,OAAA,EACgD;AAChD,EAAA,MAAM,cAAcK,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAwC;AACzD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,0BAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,EAAA,IAAK,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,OAAA,IAAU,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,OAAA,IAAU,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACjMO,SAAS,cACd,OAAA,EAIsE;AACtE,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAAqB;AACtD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,MAAA,CAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM;AAAA,OAC3C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,KAAA,EAAO,SAAO,KAAqB;AAC7D,MAAA,MAAM,SAAS,YAAA,EAAa;AAE5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,CAAA;AAAA,QAChB,EAAC,KAAA,EAAO,WAAA,EAAa,OAAA;AAAO,OAC9B;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,KAAc;AAC9B,MAAA,WAAA,CAAY,aAAa,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM,GAAG,IAAI,CAAA;AAAA,IAClE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,OAAA,EAAU,MAAM,CAAA,CAAE,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,MAAA,KAAW;AACxB,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,SAAS,MAAA,CAAO,MAAM,GAAE,CAAA;AACjE,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,KAAA,IAAQ,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,QAAA;AAAA,OAClB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,KAAW;AAC3B,MAAA,WAAA,CAAY,YAAA,CAAa,QAAA,CAAS,MAAA,CAAO,MAAM,GAAG,IAAI,CAAA;AAAA,IACxD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EAIkD;AAClD,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAA4C;AAC7D,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,OAAA;AAAA,OAClB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,MAAA,KAAW;AACxB,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,SAAS,MAAA,CAAO,MAAM,GAAE,CAAA;AAAA,IACnE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EAI0E;AAC1E,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAAM;AACvC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,MAAA,CAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM;AAAA,OAC3C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EAImE;AACnE,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,EAAC,OAAA,EAAO,KAAqB;AAC9C,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM;AAAA,OAC3C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,iBACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAA6B;AAC9D,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,QAAA,CAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM;AAAA,OAC3C,CAAA;AACD,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,SAAA,CAAU,SAAA,CAAU,MAAM;AAAA,OAC9C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,kBACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,UAAA;AAAA,MACA,MAAA,EAAQ,CAAA;AAAA,MACR,GAAG;AAAA,KACL,KAA6B;AAC3B,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,cAAc,UAAU,CAAA,CAAA;AAAA,QACxB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,SAAA,CAAU,SAAA,CAAU,MAAM;AAAA,OAC9C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EAYA;AACA,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAAqB;AACtD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,WAAW,IAAI,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAcO,SAAS,oBACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAA8B;AAC/D,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,OAAA,CAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,KAAc;AAC9B,MAAA,WAAA,CAAY,aAAa,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM,GAAG,IAAI,CAAA;AAAA,IAClE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AC1WO,SAAS,cACd,OAAA,EAC+C;AAC/C,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAuC;AACxD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAwB,UAAU,IAAI,CAAA;AACpE,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,KAAA,IAAQ,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EAIkE;AAClE,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAAqB;AACtD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,CAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,KAAc;AAC9B,MAAA,WAAA,CAAY,aAAa,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM,GAAG,IAAI,CAAA;AAAA,IAClE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aACd,OAAA,EAYA;AACA,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAAkC;AACnE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,MAAA,CAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,mBACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,UAAA,CAAY,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,aAAA,IAAgB,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,uBACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,OAAA,EAAU,MAAM,CAAA,UAAA,CAAY,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,aAAA,IAAgB,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,gBACd,OAAA,EAIyD;AACzD,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAmD;AACpE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,SAAA;AAAA,OAClB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,SAAA,IAAY,CAAA;AAAA,IAChE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,YACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,MAAA;AAAA,MACA;AAAA,KACF,KAGiC;AAC/B,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,KAAA,CAAA;AAAA,QAChB,EAAC,MAAA;AAAM,OACT;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM;AAAA,OAC3C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EAYA;AACA,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,KAAmC;AACjC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,OAAA,CAAA;AAAA,QAChB,EAAC,QAAQ,OAAA;AAAO,OAClB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACjOO,SAAS,sBACd,OAAA,EAImE;AACnE,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OACV,IAAA,KAC0B;AAC1B,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,gBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,gBAAA,CAAiB,KAAA,IAAQ,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,4BACd,OAAA,EAI0D;AAC1D,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAkD;AACnE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,uBAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,gBAAA,CAAiB,KAAA,IAAQ,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,cAAA,EAAgB,GAAG,MAAI,KAAwB;AACjE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,kBAAkB,cAAc,CAAA,SAAA,CAAA;AAAA,QAChC;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,gBAAA,CAAiB,QAAA,CAAS,SAAA,CAAU,cAAc;AAAA,OAC7D,CAAA;AACD,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,gBAAA,CAAiB,KAAA,IAAQ,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,0BACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,cAAA,KAA0C;AAC3D,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,CAAA,eAAA,EAAkB,cAAc,CAAA,KAAA,CAAO,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,cAAA,KAAmB;AAChC,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,gBAAA,CAAiB,MAAA,CAAO,cAAc;AAAA,OACjD,CAAA;AACD,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,gBAAA,CAAiB,KAAA,IAAQ,CAAA;AAAA,IACpE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,uBACd,OAAA,EACwC;AACxC,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,cAAA,KAA0C;AAC3D,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,CAAA,eAAA,EAAkB,cAAc,CAAA,OAAA,CAAS,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AC5IO,SAAS,cACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAwB;AACzC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAwB,UAAU,IAAI,CAAA;AACpE,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM;AAAA,OAC3C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,cACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,MAAA,EAAQ,GAAG,MAAI,KAAqB;AACtD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,CAAA;AAAA,QAChB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAM,SAAA,KAAc;AAC9B,MAAA,WAAA,CAAY,aAAa,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,MAAM,GAAG,IAAI,CAAA;AAAA,IAClE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,YACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,KAAA,CAAO,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,MAAA,KAAW;AACxB,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,SAAS,MAAA,CAAO,MAAM,GAAE,CAAA;AACjE,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,KAAA,IAAQ,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,aACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,KAAkC;AACnD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,MAAA,KAAW;AACxB,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,SAAS,MAAA,CAAO,MAAM,GAAE,CAAA;AACjE,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,QAAA,CAAS,KAAA,IAAQ,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AClHO,SAAS,yBACd,OAAA,EAI8D;AAC9D,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAsD;AACvE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,qBAAA,EAAuB,IAAI,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,gBAAA,CAAiB,KAAA,IAAQ,CAAA;AAClE,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,gBAAA,CAAiB,WAAA,IAAc,CAAA;AAAA,IAC1E,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,uBACd,OAAA,EAYA;AACA,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAwB;AACzC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,gBAAA,EAAkB,IAAI,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,qBACd,OAAA,EAIiD;AACjD,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAwB;AACzC,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,gBAAA,EAAkB,EAAC,MAAK,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACtDA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,KAAA,CAAM,GAAG,GAAG,CAAA;AACjB;AAwBO,SAAS,iBACd,OAAA,EAIyD;AACzD,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAAiD;AAClE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,EAAC,MAAA,EAAQ,IAAA,EAAM,GAAG,aAAW,GAAI,IAAA;AAGvC,MAAA,MAAM,WAAA,GAAc,IAAA,IAAQ,YAAA,CAAa,WAAA,CAAY,IAAI,CAAA;AAEzD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,UAAU,MAAM,CAAA,SAAA,CAAA;AAAA,QAChB,EAAC,GAAG,WAAA,EAAa,IAAA,EAAM,WAAA;AAAW,OACpC;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAC3B,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,OAAO,SAAA,CAAU,MAAM,GAAE,CAAA;AAC9E,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,EAAC,EAAA,EAAI,IAAA,EAAK,CAAA,EAAE,CAAA;AAAA,IACxE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,iBACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,EAAC,SAAA,EAAW,MAAI,KAAwB;AACzD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,aAAa,SAAS,CAAA,CAAA;AAAA,QACtB;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,WAAA,CAAY,aAAa,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,IAAI,CAAA;AAC1D,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,OAAO,IAAA,CAAK,MAAM,GAAE,CAAA;AACzE,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,IAAA,CAAK,EAAC,EAAA,EAAI,IAAA,EAAK,CAAA,EAAE,CAAA;AAAA,IACxE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,iBACd,OAAA,EACwC;AACxC,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,SAAA,KAAqC;AACtD,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,KAAI,CAAA;AAAA,IAC3D,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EAsBA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO,EAAC,WAAW,QAAA,EAAU,MAAA,EAAQ,OAAK,KAAwB;AAC5E,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,aAAa,SAAS,CAAA,MAAA,CAAA;AAAA,QACtB,EAAC,QAAA,EAAU,MAAA,EAAQ,KAAA;AAAK,OAC1B;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,WAAA,CAAY,aAAa,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,IAAI,CAAA;AAC1D,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,OAAO,IAAA,CAAK,MAAM,GAAE,CAAA;AAAA,IAC3E,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACpIO,SAAS,eACd,OAAA,EAImE;AACnE,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,IAAA,KAA2D;AAC5E,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,SAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,EAAG,SAAA,KAAc;AAE3B,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,OAAO,SAAA,CAAU,MAAM,GAAE,CAAA;AAE9E,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,SAAA,CAAU,IAAA,CAAK,EAAC,EAAA,EAAI,IAAA,EAAK,CAAA,EAAE,CAAA;AAAA,IACtE,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,sBACd,OAAA,EAIyD;AACzD,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAoD;AACrE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,2BAA2B,OAAO,CAAA;AAAA,OACpC;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,wBACd,OAAA,EAI0D;AAC1D,EAAA,OAAOA,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAqD;AACtE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,6BAA6B,OAAO,CAAA;AAAA,OACtC;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,qBACd,OAAA,EAYA;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,EAAC,OAAA,EAAS,QAAM,KAAiC;AAClE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,WAAW,OAAO,CAAA,OAAA,CAAA;AAAA,QAClB,EAAC,MAAA;AAAM,OACT;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,WAAA,CAAY,aAAa,SAAA,CAAU,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,IAAI,CAAA;AACxD,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,SAAA,CAAU,WAAW,IAAA,CAAK,MAAM,GAAE,CAAA;AAAA,IAC7E,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;AAOO,SAAS,eACd,OAAA,EAIoD;AACpD,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAA+C;AAChE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,WAAW,OAAO,CAAA,OAAA;AAAA,OACpB;AACA,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,MAAA,WAAA,CAAY,aAAa,SAAA,CAAU,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,IAAI,CAAA;AACxD,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,SAAA,CAAU,IAAA,CAAK,EAAC,EAAA,EAAI,IAAA,EAAK,CAAA,EAAE,CAAA;AAEpE,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,WAAA,CAAY,OAAO,IAAA,CAAK,MAAM,GAAE,CAAA;AAAA,IAC3E,CAAA;AAAA,IACA,GAAG;AAAA,GACJ,CAAA;AACH;ACjLO,SAAS,SAAA,GAAuE;AACrF,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,UAAA,EAAY,OAAO,OAAA,KAAsD;AACvE,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,uBAAuB,OAAO,CAAA;AACjE,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,EAAO,SAAA,KAAc;AAE/B,MAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,QAC5B,QAAA,EAAU,UAAA,CAAW,MAAA,CAAO,SAAA,CAAU,MAAM;AAAA,OAC7C,CAAA;AAED,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,UAC5B,QAAA,EAAU,UAAA,CAAW,eAAA,CAAgB,SAAA,CAAU,MAAM;AAAA,SACtD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,GACD,CAAA;AACH;AAOO,SAAS,iBAAA,GAId;AACA,EAAA,MAAM,cAAcK,yBAAAA,EAAe;AAEnC,EAAA,OAAOL,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,YAAA;AAAA,MACA;AAAA,KACF,KAGiC;AAC/B,MAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAI,gBAAgB,YAAY,CAAA,KAAA,CAAA,EAAS,EAAC,MAAA,EAAO,CAAA;AAC/E,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,IACvB,CAAA;AAAA,IACA,WAAW,MAAM;AAEf,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAC,QAAA,EAAU,UAAA,CAAW,KAAI,CAAA;AACxD,MAAA,WAAA,CAAY,kBAAkB,EAAC,QAAA,EAAU,UAAA,CAAW,WAAA,IAAc,CAAA;AAAA,IACpE;AAAA,GACD,CAAA;AACH","file":"index.cjs","sourcesContent":["/**\n * Spots SDK\n *\n * TypeScript SDK for the Spots API with TanStack Query hooks.\n *\n * @example\n * ```tsx\n * import { configureSDK, useCurrentUser, useSpots, useCreatePost } from '@spots/sdk';\n *\n * // Configure SDK with your API base URL and token management\n * configureSDK({\n * baseURL: 'https://spots-api-psi.vercel.app',\n * getAccessToken: () => localStorage.getItem('accessToken'),\n * refreshAccessToken: async () => {\n * // Your token refresh logic\n * return newAccessToken;\n * },\n * onUnauthorized: () => {\n * // Handle unauthorized access\n * window.location.href = '/login';\n * },\n * });\n *\n * // Use hooks in your components\n * function App() {\n * const { data: user } = useCurrentUser();\n * const { data: spots } = useSpots();\n * const { mutate: createPost } = useCreatePost();\n * // ...\n * }\n * ```\n */\n\n// ============================================================================\n// API CLIENT\n// ============================================================================\n\nexport type {SDKConfig} from './api/client'\nexport {configureSDK, getApiClient, getConfig} from './api/client'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport * from './api/types'\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\nexport * from './api/queries'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\nexport * from './api/mutations'\n","import axios, {\n type AxiosError,\n type AxiosInstance,\n type InternalAxiosRequestConfig,\n} from 'axios'\n\nexport interface SDKConfig {\n baseURL: string\n getAccessToken: () => string | null | Promise<string | null>\n refreshAccessToken?: () => Promise<string>\n onUnauthorized?: () => void\n}\n\nlet config: SDKConfig | null = null\nlet apiClient: AxiosInstance | null = null\n\nexport function configureSDK(sdkConfig: SDKConfig): void {\n config = sdkConfig\n apiClient = createApiClient(sdkConfig)\n}\n\nexport function getApiClient(): AxiosInstance {\n if (!apiClient) {\n throw new Error('SDK not configured. Call configureSDK() first.')\n }\n return apiClient\n}\n\nexport function getConfig(): SDKConfig {\n if (!config) {\n throw new Error('SDK not configured. Call configureSDK() first.')\n }\n return config\n}\n\nfunction createApiClient(sdkConfig: SDKConfig): AxiosInstance {\n const client = axios.create({\n baseURL: sdkConfig.baseURL,\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n // Request interceptor - add auth token\n client.interceptors.request.use(\n async (requestConfig: InternalAxiosRequestConfig) => {\n const token = await sdkConfig.getAccessToken()\n if (token) {\n requestConfig.headers.Authorization = `Bearer ${token}`\n }\n\n // Debug logging\n console.log(\n `[SDK] ${requestConfig.method?.toUpperCase()} ${sdkConfig.baseURL}${requestConfig.url}`,\n )\n return requestConfig\n },\n error => Promise.reject(error),\n )\n\n // Response interceptor - handle 401\n client.interceptors.response.use(\n response => response,\n async (error: AxiosError) => {\n console.log(\n `[SDK] Error: ${error.response?.status} ${error.config?.url}`,\n error.message,\n )\n\n // Handle auth token expiration (401)\n if (error.response?.status === 401) {\n if (sdkConfig.refreshAccessToken) {\n try {\n const newToken = await sdkConfig.refreshAccessToken()\n if (newToken && error.config) {\n error.config.headers.Authorization = `Bearer ${newToken}`\n return client.request(error.config)\n }\n } catch {\n sdkConfig.onUnauthorized?.()\n }\n } else {\n sdkConfig.onUnauthorized?.()\n }\n }\n return Promise.reject(error)\n },\n )\n\n return client\n}\n\nexport {apiClient}\n","/**\n * Spots SDK Types\n *\n * Type sources:\n * - Entity types (User, Spot, Post, etc.) → from ./entities (local definitions)\n * - DTO types (CreatePostDto, etc.) → import from @spots/types (OpenAPI generated)\n *\n * This file provides type aliases for SDK convenience.\n */\n\n// ============================================================================\n// RE-EXPORTS FROM SOURCES\n// ============================================================================\n\n// Re-export all DTO types from @spotsdev/types (OpenAPI generated)\nexport * from '@spotsdev/types'\n\n// Re-export entity types from local entities file (Prisma-compatible but no Prisma dep)\nexport * from './entities'\n\n// ============================================================================\n// SDK TYPE ALIASES\n// These provide convenient names that match SDK usage patterns\n// ============================================================================\n\nimport {\n type ClaimSpotDto,\n type CreateConversationDto,\n type CreateMessageDto,\n type CreatePostDto,\n type CreateReplyDto,\n type CreateResponseDto,\n type SendOtpDto,\n type UpdateResponseDto,\n type UpdateUserDto,\n type UpvoteResponseDto,\n type VerifyOtpDto,\n type VerifyOtpWrappedResponseDto,\n type PostUpvotesResponseDto,\n} from '@spotsdev/types'\n\nimport {type PostTemplate, type SpotPost} from './entities'\n\n// Request type aliases (map to DTOs)\nexport type SendOtpRequest = SendOtpDto\nexport type VerifyOtpRequest = VerifyOtpDto\nexport type CreatePostRequest = CreatePostDto\nexport type CreateReplyRequest = CreateReplyDto\nexport type RespondToPostRequest = CreateResponseDto\nexport type UpdateResponseRequest = UpdateResponseDto\nexport type UpdateProfileRequest = UpdateUserDto\nexport type CreateConversationRequest = CreateConversationDto\nexport type SendMessageRequest = CreateMessageDto\nexport type ClaimSpotRequest = ClaimSpotDto\n\n// Response type aliases\nexport type UpvoteResponse = UpvoteResponseDto\nexport type PostUpvotesResponse = PostUpvotesResponseDto\nexport type AuthResponse = VerifyOtpWrappedResponseDto\n\n// Entity type aliases (for backward compatibility)\nexport type Post = SpotPost\nexport type Template = PostTemplate\n\n// ============================================================================\n// SDK-SPECIFIC TYPES (not from entities or DTOs)\n// ============================================================================\n\n/**\n * Spot summary with activity indicators\n * Returned by /users/me/spots-summary\n */\nexport interface SpotSummary {\n spotId: string\n spotName: string\n spotSlug: string\n spotType: string\n postCount: number\n unreadMessages: number\n pendingResponses: number\n lastActivity: string | null\n hasNewActivity: boolean\n}\n\n/**\n * Response meta for spots summary\n */\nexport interface SpotsSummaryMeta {\n totalSpots: number\n totalUnreadMessages: number\n totalPendingResponses: number\n}\n\n/**\n * Full response from /users/me/spots-summary\n */\nexport interface SpotsSummaryResponse {\n data: SpotSummary[]\n meta: SpotsSummaryMeta\n}\n","/**\n * Auth Mutation Hooks\n *\n * TanStack Query hooks for authentication operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type AuthResponse,\n type SendOtpRequest,\n type VerifyOtpRequest,\n} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Send OTP to phone number\n *\n * @endpoint POST /auth/send-otp\n */\nexport function useSendOtp(\n options?: Omit<\n UseMutationOptions<ApiResponse<{sent: boolean}>, Error, SendOtpRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<ApiResponse<{sent: boolean}>, Error, SendOtpRequest> {\n return useMutation({\n mutationFn: async (data: SendOtpRequest) => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{sent: boolean}>>(\n '/auth/send-otp',\n data,\n )\n return response.data\n },\n ...options,\n })\n}\n\n/**\n * Verify OTP and authenticate\n *\n * @endpoint POST /auth/verify-otp\n */\nexport function useVerifyOtp(\n options?: Omit<\n UseMutationOptions<AuthResponse, Error, VerifyOtpRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<AuthResponse, Error, VerifyOtpRequest> {\n return useMutation({\n mutationFn: async (data: VerifyOtpRequest) => {\n const client = getApiClient()\n const response = await client.post<AuthResponse>('/auth/verify-otp', data)\n return response.data\n },\n ...options,\n })\n}\n\n/**\n * Refresh access token\n *\n * @endpoint POST /auth/refresh\n */\nexport function useRefreshToken(\n options?: Omit<\n UseMutationOptions<{accessToken: string}, Error, {refreshToken: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<{accessToken: string}, Error, {refreshToken: string}> {\n return useMutation({\n mutationFn: async (data: {refreshToken: string}) => {\n const client = getApiClient()\n const response = await client.post<{accessToken: string}>(\n '/auth/refresh',\n data,\n )\n return response.data\n },\n ...options,\n })\n}\n","/**\n * Users Query Hooks\n *\n * TanStack Query hooks for user-related operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type Club,\n type FavoriteSpot,\n type Post,\n type Spot,\n type SpotsSummaryResponse,\n type SpotSubscription,\n type User,\n} from '../types'\n\n// Helper to extract array data from API response\n// API can return either { data: T[] } or { data: { data: T[], meta?: {...} } }\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const userKeys = {\n all: ['users'] as const,\n me: () => [...userKeys.all, 'me'] as const,\n stats: () => [...userKeys.me(), 'stats'] as const,\n spotsSummary: () => [...userKeys.me(), 'spots-summary'] as const,\n activity: (limit?: number) => [...userKeys.me(), 'activity', limit] as const,\n posts: (params?: {page?: number; limit?: number}) =>\n [...userKeys.me(), 'posts', params] as const,\n clubs: () => [...userKeys.me(), 'clubs'] as const,\n subscriptions: () => [...userKeys.me(), 'subscriptions'] as const,\n blocked: () => [...userKeys.me(), 'blocked'] as const,\n ownedSpots: () => [...userKeys.me(), 'owned-spots'] as const,\n favorites: () => [...userKeys.me(), 'favorites'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get current user's profile\n *\n * @endpoint GET /users/me\n */\nexport function useCurrentUser(\n options?: Omit<UseQueryOptions<User>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<User> {\n return useQuery({\n queryKey: userKeys.me(),\n queryFn: async (): Promise<User> => {\n console.log('[SDK-USERS] Fetching /users/me...')\n const client = getApiClient()\n try {\n const response = await client.get<ApiResponse<User>>('/users/me')\n console.log('[SDK-USERS] Success:', response.status)\n return response.data.data\n } catch (error: unknown) {\n const axiosError = error as {\n response?: {status: number}\n config?: {url: string; baseURL?: string}\n }\n console.log(\n '[SDK-USERS] Error:',\n axiosError.response?.status,\n 'URL:',\n axiosError.config?.baseURL,\n axiosError.config?.url,\n )\n throw error\n }\n },\n ...options,\n })\n}\n\n/**\n * Get current user's stats\n *\n * @endpoint GET /users/me/stats\n * @deprecated This endpoint doesn't exist in the API. Use useUserSpotsSummary instead.\n */\nexport function useUserStats(\n options?: Omit<\n UseQueryOptions<{posts: number; responses: number; upvotes: number}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{posts: number; responses: number; upvotes: number}> {\n return useQuery({\n queryKey: userKeys.stats(),\n queryFn: async () => {\n const client = getApiClient()\n const response =\n await client.get<\n ApiResponse<{posts: number; responses: number; upvotes: number}>\n >('/users/me/stats')\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get current user's spots summary with activity indicators\n *\n * Returns list of spots where user has posted, with:\n * - Post count per spot\n * - Unread messages count\n * - Pending responses count\n * - Last activity timestamp\n *\n * @endpoint GET /users/me/spots-summary\n */\nexport function useUserSpotsSummary(\n options?: Omit<UseQueryOptions<SpotsSummaryResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<SpotsSummaryResponse> {\n return useQuery({\n queryKey: userKeys.spotsSummary(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<SpotsSummaryResponse>>(\n '/users/me/spots-summary',\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get current user's activity\n *\n * @endpoint GET /users/me/activity\n */\nexport function useUserActivity(\n limit: number = 10,\n options?: Omit<UseQueryOptions<unknown[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<unknown[]> {\n return useQuery({\n queryKey: userKeys.activity(limit),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/users/me/activity?limit=${limit}`,\n )\n return extractArrayData<unknown>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's posts\n *\n * @endpoint GET /user/me/posts\n */\nexport function useUserPosts(\n params?: {page?: number; limit?: number},\n options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post[]> {\n return useQuery({\n queryKey: userKeys.posts(params),\n queryFn: async () => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<unknown>>(\n `/user/me/posts?${queryParams}`,\n )\n return extractArrayData<Post>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's clubs\n *\n * @endpoint GET /user/me/clubs\n */\nexport function useUserClubs(\n options?: Omit<UseQueryOptions<Club[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club[]> {\n return useQuery({\n queryKey: userKeys.clubs(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/user/me/clubs')\n return extractArrayData<Club>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's spot subscriptions\n *\n * @endpoint GET /user/me/subscriptions\n */\nexport function useUserSubscriptions(\n options?: Omit<UseQueryOptions<SpotSubscription[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<SpotSubscription[]> {\n return useQuery({\n queryKey: userKeys.subscriptions(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n '/user/me/subscriptions',\n )\n return extractArrayData<SpotSubscription>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get blocked users list\n *\n * @endpoint GET /user/me/blocked\n */\nexport function useBlockedUsers(\n options?: Omit<UseQueryOptions<User[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<User[]> {\n return useQuery({\n queryKey: userKeys.blocked(),\n queryFn: async () => {\n const client = getApiClient()\n const response =\n await client.get<ApiResponse<unknown>>('/user/me/blocked')\n return extractArrayData<User>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's owned spots (for business owners)\n *\n * @endpoint GET /users/me/owned-spots\n */\nexport function useOwnedSpots(\n options?: Omit<UseQueryOptions<Spot[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot[]> {\n return useQuery({\n queryKey: userKeys.ownedSpots(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n '/users/me/owned-spots',\n )\n return extractArrayData<Spot>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get current user's favorite spots\n *\n * @endpoint GET /users/me/favorites\n */\nexport function useUserFavorites(\n options?: Omit<UseQueryOptions<FavoriteSpot[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<FavoriteSpot[]> {\n return useQuery({\n queryKey: userKeys.favorites(),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n '/users/me/favorites',\n )\n return extractArrayData<FavoriteSpot>(response.data.data)\n },\n ...options,\n })\n}\n","/**\n * Spots Query Hooks\n *\n * TanStack Query hooks for spot-related operations.\n */\n\nimport {\n useQuery,\n useInfiniteQuery,\n type UseQueryOptions,\n type UseQueryResult,\n type UseInfiniteQueryOptions,\n type UseInfiniteQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type PaginatedResponse, type Spot, type SpotImage} from '../types'\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Extract array data from API response\n * API returns { success, data: { data: [...], meta: {...} } } or { success, data: [...] }\n */\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n/**\n * Extract single object data from API response\n */\nfunction extractObjectData<T>(data: unknown): T {\n if (\n data &&\n typeof data === 'object' &&\n 'data' in data &&\n !Array.isArray(data)\n ) {\n const nested = (data as {data: unknown}).data\n if (\n nested &&\n typeof nested === 'object' &&\n 'data' in nested &&\n !Array.isArray(nested)\n ) {\n return (nested as {data: T}).data\n }\n return nested as T\n }\n return data as T\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const spotKeys = {\n all: ['spots'] as const,\n lists: () => [...spotKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...spotKeys.lists(), filters] as const,\n details: () => [...spotKeys.all, 'detail'] as const,\n detail: (id: string) => [...spotKeys.details(), id] as const,\n bySlug: (slug: string) => [...spotKeys.all, 'slug', slug] as const,\n byQR: (qrCode: string) => [...spotKeys.all, 'qr', qrCode] as const,\n images: (spotId: string) => [...spotKeys.detail(spotId), 'images'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all spots\n *\n * @endpoint GET /spots\n */\nexport function useSpots(\n params?: {\n limit?: number\n city?: string\n type?: string\n lat?: number\n lng?: number\n radius?: number\n search?: string\n vibes?: string\n cityId?: string\n page?: number\n },\n options?: Omit<UseQueryOptions<Spot[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot[]> {\n return useQuery({\n queryKey: spotKeys.list(params),\n queryFn: async (): Promise<Spot[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.city) queryParams.set('city', params.city)\n if (params?.type) queryParams.set('type', params.type)\n if (params?.lat) queryParams.set('lat', String(params.lat))\n if (params?.lng) queryParams.set('lng', String(params.lng))\n if (params?.radius) queryParams.set('radius', String(params.radius))\n if (params?.search) queryParams.set('search', params.search)\n if (params?.vibes) queryParams.set('vibeIds', params.vibes)\n if (params?.cityId) queryParams.set('cityId', params.cityId)\n if (params?.page) queryParams.set('page', String(params.page))\n const response = await client.get<ApiResponse<unknown>>(\n `/spots?${queryParams}`,\n )\n return extractArrayData<Spot>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get a spot by ID\n *\n * @endpoint GET /spots/{spotId}\n */\nexport function useSpot(\n spotId: string,\n options?: Omit<UseQueryOptions<Spot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot> {\n return useQuery({\n queryKey: spotKeys.detail(spotId),\n queryFn: async (): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/${spotId}`,\n )\n return extractObjectData<Spot>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a spot by slug\n *\n * @endpoint GET /spots/slug/{slug}\n */\nexport function useSpotBySlug(\n slug: string,\n options?: Omit<UseQueryOptions<Spot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot> {\n return useQuery({\n queryKey: spotKeys.bySlug(slug),\n queryFn: async (): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/slug/${slug}`,\n )\n return extractObjectData<Spot>(response.data.data)\n },\n enabled: !!slug,\n ...options,\n })\n}\n\n/**\n * Get a spot by QR code\n *\n * @endpoint GET /spots/qr/{qrCode}\n */\nexport function useSpotByQR(\n qrCode: string,\n options?: Omit<UseQueryOptions<Spot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Spot> {\n return useQuery({\n queryKey: spotKeys.byQR(qrCode),\n queryFn: async (): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/qr/${qrCode}`,\n )\n return extractObjectData<Spot>(response.data.data)\n },\n enabled: !!qrCode,\n ...options,\n })\n}\n\n/**\n * Get images for a spot\n *\n * @endpoint GET /spots/{spotId}/images\n */\nexport function useSpotImages(\n spotId: string,\n options?: Omit<UseQueryOptions<SpotImage[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<SpotImage[]> {\n return useQuery({\n queryKey: spotKeys.images(spotId),\n queryFn: async (): Promise<SpotImage[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/${spotId}/images`,\n )\n return extractArrayData<SpotImage>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Check if a spot is favorited by the current user\n *\n * @endpoint GET /spots/{spotId}/favorite\n */\nexport function useSpotFavoriteStatus(\n spotId: string,\n options?: Omit<\n UseQueryOptions<{isFavorite: boolean}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{isFavorite: boolean}> {\n return useQuery({\n queryKey: [...spotKeys.detail(spotId), 'favorite'] as const,\n queryFn: async (): Promise<{isFavorite: boolean}> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<{isFavorite: boolean}>>(\n `/spots/${spotId}/favorite`,\n )\n return extractObjectData<{isFavorite: boolean}>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n// ============================================================================\n// INFINITE QUERY HOOKS\n// ============================================================================\n\n/**\n * Params for infinite spots query\n */\nexport interface InfiniteSpotsParams {\n limit?: number\n city?: string\n cityId?: string\n type?: string\n templateSlugs?: string[]\n vibeIds?: string[]\n search?: string\n}\n\n/**\n * Infinite scroll query for spots\n *\n * @endpoint GET /spots (paginated)\n * @returns Infinite query with pages of spots\n */\nexport function useInfiniteSpots(\n params?: InfiniteSpotsParams,\n options?: Omit<\n UseInfiniteQueryOptions<\n PaginatedResponse<Spot>,\n Error,\n {pages: PaginatedResponse<Spot>[]; pageParams: number[]}\n >,\n 'queryKey' | 'queryFn' | 'getNextPageParam' | 'initialPageParam'\n >,\n): UseInfiniteQueryResult<\n {pages: PaginatedResponse<Spot>[]; pageParams: number[]},\n Error\n> {\n return useInfiniteQuery({\n queryKey: [...spotKeys.lists(), 'infinite', params] as const,\n queryFn: async ({pageParam = 1}): Promise<PaginatedResponse<Spot>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n queryParams.set('page', String(pageParam))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.city) queryParams.set('city', params.city)\n if (params?.cityId) queryParams.set('cityId', params.cityId)\n if (params?.type && params.type !== 'All')\n queryParams.set('type', params.type)\n if (params?.search?.trim())\n queryParams.set('search', params.search.trim())\n if (params?.templateSlugs) {\n params.templateSlugs.forEach((slug) =>\n queryParams.append('templateSlugs', slug),\n )\n }\n if (params?.vibeIds) {\n params.vibeIds.forEach((id) => queryParams.append('vibeIds', id))\n }\n const response = await client.get<ApiResponse<PaginatedResponse<Spot>>>(\n `/spots?${queryParams}`,\n )\n // Handle nested response structure\n const data = response.data.data\n if (data && typeof data === 'object' && 'data' in data) {\n return data as PaginatedResponse<Spot>\n }\n // Fallback for array response\n const page = pageParam as number\n return {\n data: extractArrayData<Spot>(data),\n meta: {\n total: 0,\n page,\n limit: params?.limit || 20,\n totalPages: 1,\n hasNextPage: false,\n hasPreviousPage: page > 1,\n },\n }\n },\n initialPageParam: 1,\n getNextPageParam: (lastPage) => {\n return lastPage.meta.hasNextPage ? lastPage.meta.page + 1 : undefined\n },\n ...options,\n })\n}\n","/**\n * Posts Query Hooks\n *\n * TanStack Query hooks for post/board operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type Post,\n type PostResponse,\n type PostStatusDto,\n type PostUpvotesResponse,\n} from '../types'\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Extract array data from API response\n * API returns { success, data: { data: [...], meta: {...} } } or { success, data: [...] }\n */\nfunction extractArrayData<T>(data: unknown): T[] {\n // If already an array, return it\n if (Array.isArray(data)) {\n return data\n }\n // If it's an object with nested data property, extract it\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n/**\n * Extract single object data from API response\n * API returns { success, data: { data: {...} } } or { success, data: {...} }\n */\nfunction extractObjectData<T>(data: unknown): T {\n // If it's an object with nested data property (not an array), extract it\n if (\n data &&\n typeof data === 'object' &&\n 'data' in data &&\n !Array.isArray(data)\n ) {\n const nested = (data as {data: unknown}).data\n // Check if nested also has a data property (double-wrapped)\n if (\n nested &&\n typeof nested === 'object' &&\n 'data' in nested &&\n !Array.isArray(nested)\n ) {\n return (nested as {data: T}).data\n }\n return nested as T\n }\n return data as T\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const postKeys = {\n all: ['posts'] as const,\n lists: () => [...postKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...postKeys.lists(), filters] as const,\n bySpot: (spotId: string, filters?: Record<string, unknown>) =>\n [...postKeys.all, 'spot', spotId, filters] as const,\n details: () => [...postKeys.all, 'detail'] as const,\n detail: (id: string) => [...postKeys.details(), id] as const,\n responses: (postId: string) =>\n [...postKeys.detail(postId), 'responses'] as const,\n status: (postId: string) => [...postKeys.detail(postId), 'status'] as const,\n upvotes: (postId: string, filters?: {limit?: number; offset?: number}) =>\n [...postKeys.detail(postId), 'upvotes', filters] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get posts for a spot\n *\n * @endpoint GET /spots/{spotId}/posts\n */\nexport function useSpotPosts(\n spotId: string,\n params?: {postType?: string; status?: string; page?: number; limit?: number},\n options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post[]> {\n return useQuery({\n queryKey: postKeys.bySpot(spotId, params),\n queryFn: async (): Promise<Post[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.postType) queryParams.set('postType', params.postType)\n if (params?.status) queryParams.set('status', params.status)\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<unknown>>(\n `/spots/${spotId}/posts?${queryParams}`,\n )\n return extractArrayData<Post>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a single post by ID\n *\n * @endpoint GET /posts/{postId}\n */\nexport function usePost(\n postId: string,\n options?: Omit<UseQueryOptions<Post>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post> {\n return useQuery({\n queryKey: postKeys.detail(postId),\n queryFn: async (): Promise<Post> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/posts/${postId}`,\n )\n return extractObjectData<Post>(response.data.data)\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get responses for a post\n *\n * @endpoint GET /posts/{postId}/responses\n */\nexport function usePostResponses(\n postId: string,\n options?: Omit<UseQueryOptions<PostResponse[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PostResponse[]> {\n return useQuery({\n queryKey: postKeys.responses(postId),\n queryFn: async (): Promise<PostResponse[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/posts/${postId}/responses`,\n )\n return extractArrayData<PostResponse>(response.data.data)\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get all posts (with filters)\n *\n * @endpoint GET /posts\n */\nexport function usePosts(\n params?: {postType?: string; limit?: number},\n options?: Omit<UseQueryOptions<Post[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Post[]> {\n return useQuery({\n queryKey: postKeys.list(params),\n queryFn: async (): Promise<Post[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.postType) queryParams.set('postType', params.postType)\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<unknown>>(\n `/posts?${queryParams}`,\n )\n return extractArrayData<Post>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get user's status for a post (read/hidden/pinned)\n *\n * @endpoint GET /posts/{postId}/status\n */\nexport function usePostStatus(\n postId: string,\n options?: Omit<UseQueryOptions<PostStatusDto>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PostStatusDto> {\n return useQuery({\n queryKey: postKeys.status(postId),\n queryFn: async (): Promise<PostStatusDto> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/posts/${postId}/status`,\n )\n return extractObjectData<PostStatusDto>(response.data.data)\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get upvotes for a post (list of users who upvoted)\n *\n * @endpoint GET /posts/{postId}/upvotes\n */\nexport function usePostUpvotes(\n postId: string,\n params?: {limit?: number; offset?: number},\n options?: Omit<UseQueryOptions<PostUpvotesResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PostUpvotesResponse> {\n return useQuery({\n queryKey: postKeys.upvotes(postId, params),\n queryFn: async (): Promise<PostUpvotesResponse> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.offset) queryParams.set('offset', String(params.offset))\n const queryString = queryParams.toString()\n const response = await client.get<ApiResponse<PostUpvotesResponse>>(\n `/posts/${postId}/upvotes${queryString ? `?${queryString}` : ''}`,\n )\n // Response structure: { success, data: { data: [...], meta: {...} } }\n return response.data.data\n },\n enabled: !!postId,\n ...options,\n })\n}\n\n/**\n * Get nearby posts feed\n *\n * @endpoint GET /posts/feed\n */\nexport function usePostsFeed(\n params: {\n lat: number\n lng: number\n radius?: number\n postType?: string\n cursor?: string\n limit?: number\n },\n options?: Omit<\n UseQueryOptions<{posts: Post[]; hasMore: boolean; nextCursor?: string}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{posts: Post[]; hasMore: boolean; nextCursor?: string}> {\n return useQuery({\n queryKey: [...postKeys.lists(), 'feed', params] as const,\n queryFn: async (): Promise<{\n posts: Post[]\n hasMore: boolean\n nextCursor?: string\n }> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n queryParams.set('lat', String(params.lat))\n queryParams.set('lng', String(params.lng))\n if (params.radius) queryParams.set('radius', String(params.radius))\n if (params.postType) queryParams.set('postType', params.postType)\n if (params.cursor) queryParams.set('cursor', params.cursor)\n if (params.limit) queryParams.set('limit', String(params.limit))\n\n const response = await client.get<\n ApiResponse<{posts: Post[]; hasMore: boolean; nextCursor?: string}>\n >(`/posts/feed?${queryParams}`)\n\n const data = response.data.data\n return {\n posts: data.posts ?? extractArrayData<Post>(data),\n hasMore: data.hasMore ?? false,\n nextCursor: data.nextCursor,\n }\n },\n enabled: params.lat !== 0 && params.lng !== 0,\n ...options,\n })\n}\n","/**\n * Conversations Query Hooks\n *\n * TanStack Query hooks for conversation/messaging operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Conversation, type Message} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const conversationKeys = {\n all: ['conversations'] as const,\n lists: () => [...conversationKeys.all, 'list'] as const,\n list: () => [...conversationKeys.lists()] as const,\n details: () => [...conversationKeys.all, 'detail'] as const,\n detail: (id: string) => [...conversationKeys.details(), id] as const,\n messages: (conversationId: string, params?: {before?: string}) =>\n [...conversationKeys.detail(conversationId), 'messages', params] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all conversations for current user\n *\n * @endpoint GET /conversations\n */\nexport function useConversations(\n options?: Omit<UseQueryOptions<Conversation[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Conversation[]> {\n return useQuery({\n queryKey: conversationKeys.list(),\n queryFn: async (): Promise<Conversation[]> => {\n const client = getApiClient()\n const response =\n await client.get<ApiResponse<Conversation[]>>('/conversations')\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get a single conversation with details\n *\n * @endpoint GET /conversations/{id}\n */\nexport function useConversation(\n conversationId: string,\n options?: Omit<UseQueryOptions<Conversation>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Conversation> {\n return useQuery({\n queryKey: conversationKeys.detail(conversationId),\n queryFn: async (): Promise<Conversation> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Conversation>>(\n `/conversations/${conversationId}`,\n )\n return response.data.data\n },\n enabled: !!conversationId,\n ...options,\n })\n}\n\n/**\n * Get messages for a conversation\n *\n * @endpoint GET /conversations/{id}/messages\n */\nexport function useConversationMessages(\n conversationId: string,\n params?: {limit?: number; before?: string},\n options?: Omit<\n UseQueryOptions<{\n data: Message[]\n meta: {hasMore: boolean; oldestMessageAt: string | null}\n }>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{\n data: Message[]\n meta: {hasMore: boolean; oldestMessageAt: string | null}\n}> {\n return useQuery({\n queryKey: conversationKeys.messages(conversationId, params),\n queryFn: async () => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.before) queryParams.set('before', params.before)\n const response = await client.get<{\n data: Message[]\n meta: {hasMore: boolean; oldestMessageAt: string | null}\n }>(`/conversations/${conversationId}/messages?${queryParams}`)\n return response.data\n },\n enabled: !!conversationId,\n ...options,\n })\n}\n","/**\n * Clubs Query Hooks\n *\n * TanStack Query hooks for club operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Club} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const clubKeys = {\n all: ['clubs'] as const,\n bySpot: (spotId: string) => [...clubKeys.all, 'spot', spotId] as const,\n details: () => [...clubKeys.all, 'detail'] as const,\n detail: (id: string) => [...clubKeys.details(), id] as const,\n bySlug: (slug: string) => [...clubKeys.all, 'slug', slug] as const,\n byUser: (userId: string) => [...clubKeys.all, 'user', userId] as const,\n membership: (clubId: string, userId: string) =>\n [...clubKeys.detail(clubId), 'membership', userId] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get clubs for a spot\n *\n * @endpoint GET /clubs/spot/{spotId}\n */\nexport function useClubsBySpot(\n spotId: string,\n options?: Omit<UseQueryOptions<Club[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club[]> {\n return useQuery({\n queryKey: clubKeys.bySpot(spotId),\n queryFn: async (): Promise<Club[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club[]>>(\n `/clubs/spot/${spotId}`,\n )\n return response.data.data\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a club by ID\n *\n * @endpoint GET /clubs/{id}\n */\nexport function useClub(\n clubId: string,\n options?: Omit<UseQueryOptions<Club>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club> {\n return useQuery({\n queryKey: clubKeys.detail(clubId),\n queryFn: async (): Promise<Club> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club>>(`/clubs/${clubId}`)\n return response.data.data\n },\n enabled: !!clubId,\n ...options,\n })\n}\n\n/**\n * Get a club by slug\n *\n * @endpoint GET /clubs/slug/{slug}\n */\nexport function useClubBySlug(\n slug: string,\n options?: Omit<UseQueryOptions<Club>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club> {\n return useQuery({\n queryKey: clubKeys.bySlug(slug),\n queryFn: async (): Promise<Club> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club>>(\n `/clubs/slug/${slug}`,\n )\n return response.data.data\n },\n enabled: !!slug,\n ...options,\n })\n}\n\n/**\n * Get clubs for a user\n *\n * @endpoint GET /clubs/user/{userId}\n */\nexport function useClubsByUser(\n userId: string,\n options?: Omit<UseQueryOptions<Club[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Club[]> {\n return useQuery({\n queryKey: clubKeys.byUser(userId),\n queryFn: async (): Promise<Club[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Club[]>>(\n `/clubs/user/${userId}`,\n )\n return response.data.data\n },\n enabled: !!userId,\n ...options,\n })\n}\n\n/**\n * Get membership status for a user in a club\n *\n * @endpoint GET /clubs/{id}/membership/{userId}\n */\nexport function useClubMembership(\n clubId: string,\n userId: string,\n options?: Omit<\n UseQueryOptions<{isMember: boolean; role?: string}>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<{isMember: boolean; role?: string}> {\n return useQuery({\n queryKey: clubKeys.membership(clubId, userId),\n queryFn: async () => {\n const client = getApiClient()\n const response = await client.get<\n ApiResponse<{isMember: boolean; role?: string}>\n >(`/clubs/${clubId}/membership/${userId}`)\n return response.data.data\n },\n enabled: !!clubId && !!userId,\n ...options,\n })\n}\n","/**\n * Templates Query Hooks\n *\n * TanStack Query hooks for post template operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Template} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const templateKeys = {\n all: ['templates'] as const,\n lists: () => [...templateKeys.all, 'list'] as const,\n list: (filters?: {spotType?: string}) =>\n [...templateKeys.lists(), filters] as const,\n details: () => [...templateKeys.all, 'detail'] as const,\n detail: (id: string) => [...templateKeys.details(), id] as const,\n bySlug: (slug: string) => [...templateKeys.all, 'slug', slug] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all templates\n *\n * @endpoint GET /templates\n */\nexport function useTemplates(\n params?: {spotType?: string},\n options?: Omit<UseQueryOptions<Template[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Template[]> {\n return useQuery({\n queryKey: templateKeys.list(params),\n queryFn: async (): Promise<Template[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.spotType) queryParams.set('spotType', params.spotType)\n const response = await client.get<ApiResponse<Template[]>>(\n `/templates?${queryParams}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get a template by ID\n *\n * @endpoint GET /templates/{templateId}\n */\nexport function useTemplate(\n templateId: string,\n options?: Omit<UseQueryOptions<Template>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Template> {\n return useQuery({\n queryKey: templateKeys.detail(templateId),\n queryFn: async (): Promise<Template> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Template>>(\n `/templates/${templateId}`,\n )\n return response.data.data\n },\n enabled: !!templateId,\n ...options,\n })\n}\n\n/**\n * Get a template by slug\n *\n * @endpoint GET /templates/slug/{slug}\n */\nexport function useTemplateBySlug(\n slug: string,\n options?: Omit<UseQueryOptions<Template>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Template> {\n return useQuery({\n queryKey: templateKeys.bySlug(slug),\n queryFn: async (): Promise<Template> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<Template>>(\n `/templates/slug/${slug}`,\n )\n return response.data.data\n },\n enabled: !!slug,\n ...options,\n })\n}\n","/**\n * Notifications Query Hooks\n *\n * TanStack Query hooks for notification operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse, type Notification} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const notificationKeys = {\n all: ['notifications'] as const,\n lists: () => [...notificationKeys.all, 'list'] as const,\n list: (params?: {limit?: number; unreadOnly?: boolean}) =>\n [...notificationKeys.lists(), params] as const,\n unreadCount: () => [...notificationKeys.all, 'unreadCount'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get notifications for current user\n *\n * @endpoint GET /notifications\n */\nexport function useNotifications(\n params?: {limit?: number; unreadOnly?: boolean},\n options?: Omit<UseQueryOptions<Notification[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Notification[]> {\n return useQuery({\n queryKey: notificationKeys.list(params),\n queryFn: async (): Promise<Notification[]> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.unreadOnly)\n queryParams.set('unreadOnly', String(params.unreadOnly))\n const response = await client.get<ApiResponse<Notification[]>>(\n `/notifications?${queryParams}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get unread notification count\n *\n * @endpoint GET /notifications/unread-count\n */\nexport function useUnreadNotificationCount(\n options?: Omit<UseQueryOptions<number>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<number> {\n return useQuery({\n queryKey: notificationKeys.unreadCount(),\n queryFn: async (): Promise<number> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<{count: number}>>(\n '/notifications/unread-count',\n )\n return response.data.data.count\n },\n ...options,\n })\n}\n","/**\n * Misc Query Hooks\n *\n * TanStack Query hooks for cities, vibes, and other reference data.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {\n type ApiResponse,\n type City,\n type LifeSituation,\n type Vibe,\n} from '../types'\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const miscKeys = {\n cities: () => ['cities'] as const,\n vibes: () => ['vibes'] as const,\n lifeSituations: () => ['life-situations'] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get all cities\n *\n * @endpoint GET /cities\n */\nexport function useCities(\n options?: Omit<UseQueryOptions<City[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<City[]> {\n return useQuery({\n queryKey: miscKeys.cities(),\n queryFn: async (): Promise<City[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/cities')\n return extractArrayData<City>(response.data.data)\n },\n staleTime: 1000 * 60 * 60,\n ...options,\n })\n}\n\n/**\n * Get all vibes\n *\n * @endpoint GET /vibes\n */\nexport function useVibes(\n options?: Omit<UseQueryOptions<Vibe[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<Vibe[]> {\n return useQuery({\n queryKey: miscKeys.vibes(),\n queryFn: async (): Promise<Vibe[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/vibes')\n return extractArrayData<Vibe>(response.data.data)\n },\n staleTime: 1000 * 60 * 60,\n ...options,\n })\n}\n\n/**\n * Get all life situations (for onboarding)\n *\n * @endpoint GET /life-situations\n */\nexport function useLifeSituations(\n options?: Omit<UseQueryOptions<LifeSituation[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<LifeSituation[]> {\n return useQuery({\n queryKey: miscKeys.lifeSituations(),\n queryFn: async (): Promise<LifeSituation[]> => {\n const client = getApiClient()\n const response =\n await client.get<ApiResponse<unknown>>('/life-situations')\n return extractArrayData<LifeSituation>(response.data.data)\n },\n staleTime: 1000 * 60 * 60,\n ...options,\n })\n}\n","/**\n * Products Query Hooks\n *\n * TanStack Query hooks for product-related operations.\n */\n\nimport {useQuery, type UseQueryOptions, type UseQueryResult} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport type {\n Product,\n ApiResponse,\n PaginatedResponse,\n ProductType,\n ProductStatus,\n Spot,\n} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const productKeys = {\n all: ['products'] as const,\n lists: () => [...productKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...productKeys.lists(), filters] as const,\n details: () => [...productKeys.all, 'detail'] as const,\n detail: (id: string) => [...productKeys.details(), id] as const,\n bySlug: (spotId: string, slug: string) =>\n [...productKeys.all, 'slug', spotId, slug] as const,\n bySpot: (spotId: string) => [...productKeys.all, 'spot', spotId] as const,\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ProductFilters {\n spotId?: string\n type?: ProductType\n status?: ProductStatus\n limit?: number\n page?: number\n}\n\nexport interface ProductWithSpot extends Product {\n spot: Pick<Spot, 'id' | 'name' | 'slug'>\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get products for a spot (public browse)\n *\n * @endpoint GET /spots/{spotId}/products\n */\nexport function useSpotProducts(\n spotId: string,\n params?: {type?: ProductType; limit?: number; page?: number},\n options?: Omit<\n UseQueryOptions<PaginatedResponse<Product>>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<PaginatedResponse<Product>> {\n return useQuery({\n queryKey: productKeys.bySpot(spotId),\n queryFn: async (): Promise<PaginatedResponse<Product>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.type) queryParams.set('type', params.type)\n const response = await client.get<ApiResponse<PaginatedResponse<Product>>>(\n `/spots/${spotId}/products?${queryParams}`,\n )\n return response.data.data\n },\n enabled: !!spotId,\n ...options,\n })\n}\n\n/**\n * Get a product by ID\n *\n * @endpoint GET /products/{productId}\n */\nexport function useProduct(\n productId: string,\n options?: Omit<UseQueryOptions<ProductWithSpot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<ProductWithSpot> {\n return useQuery({\n queryKey: productKeys.detail(productId),\n queryFn: async (): Promise<ProductWithSpot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<ProductWithSpot>>(\n `/products/${productId}`,\n )\n return response.data.data\n },\n enabled: !!productId,\n ...options,\n })\n}\n\n/**\n * Get a product by slug (within a spot)\n *\n * @endpoint GET /spots/{spotId}/products/slug/{slug}\n */\nexport function useProductBySlug(\n spotId: string,\n slug: string,\n options?: Omit<UseQueryOptions<ProductWithSpot>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<ProductWithSpot> {\n return useQuery({\n queryKey: productKeys.bySlug(spotId, slug),\n queryFn: async (): Promise<ProductWithSpot> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<ProductWithSpot>>(\n `/spots/${spotId}/products/slug/${slug}`,\n )\n return response.data.data\n },\n enabled: !!spotId && !!slug,\n ...options,\n })\n}\n","/**\n * Orders Query Hooks\n *\n * TanStack Query hooks for order-related operations.\n */\n\nimport {useQuery, type UseQueryOptions, type UseQueryResult} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport type {\n Order,\n OrderItem,\n Product,\n Spot,\n OrderStatus,\n ApiResponse,\n PaginatedResponse,\n} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const orderKeys = {\n all: ['orders'] as const,\n lists: () => [...orderKeys.all, 'list'] as const,\n list: (filters?: Record<string, unknown>) =>\n [...orderKeys.lists(), filters] as const,\n details: () => [...orderKeys.all, 'detail'] as const,\n detail: (id: string) => [...orderKeys.details(), id] as const,\n myOrders: () => [...orderKeys.all, 'my'] as const,\n spotOrders: (spotId: string) => [...orderKeys.all, 'spot', spotId] as const,\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface OrderWithDetails extends Omit<Order, 'items'> {\n items: (OrderItem & {\n product: Pick<Product, 'id' | 'name' | 'slug' | 'type' | 'imageUrl'>\n })[]\n spot: Pick<Spot, 'id' | 'name' | 'slug'>\n}\n\nexport interface OrderFilters {\n status?: OrderStatus\n limit?: number\n page?: number\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get current user's orders (purchases)\n *\n * @endpoint GET /users/me/orders\n */\nexport function useMyOrders(\n params?: OrderFilters,\n options?: Omit<\n UseQueryOptions<PaginatedResponse<OrderWithDetails>>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<PaginatedResponse<OrderWithDetails>> {\n return useQuery({\n queryKey: orderKeys.list({...params, my: true}),\n queryFn: async (): Promise<PaginatedResponse<OrderWithDetails>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.status) queryParams.set('status', params.status)\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.page) queryParams.set('page', String(params.page))\n const response = await client.get<\n ApiResponse<PaginatedResponse<OrderWithDetails>>\n >(`/users/me/orders?${queryParams}`)\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Get a single order by ID\n *\n * @endpoint GET /orders/{orderId}\n */\nexport function useOrder(\n orderId: string,\n options?: Omit<UseQueryOptions<OrderWithDetails>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<OrderWithDetails> {\n return useQuery({\n queryKey: orderKeys.detail(orderId),\n queryFn: async (): Promise<OrderWithDetails> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<OrderWithDetails>>(\n `/orders/${orderId}`,\n )\n return response.data.data\n },\n enabled: !!orderId,\n ...options,\n })\n}\n\n/**\n * Get orders for a spot (seller view)\n *\n * @endpoint GET /seller/spots/{spotId}/orders\n */\nexport function useSpotOrders(\n spotId: string,\n params?: OrderFilters,\n options?: Omit<\n UseQueryOptions<PaginatedResponse<OrderWithDetails>>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryResult<PaginatedResponse<OrderWithDetails>> {\n return useQuery({\n queryKey: orderKeys.spotOrders(spotId),\n queryFn: async (): Promise<PaginatedResponse<OrderWithDetails>> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.status) queryParams.set('status', params.status)\n if (params?.limit) queryParams.set('limit', String(params.limit))\n if (params?.page) queryParams.set('page', String(params.page))\n const response = await client.get<\n ApiResponse<PaginatedResponse<OrderWithDetails>>\n >(`/seller/spots/${spotId}/orders?${queryParams}`)\n return response.data.data\n },\n enabled: !!spotId,\n ...options,\n })\n}\n","/**\n * Wallet Query Hooks\n *\n * TanStack Query hooks for wallet and redemption operations.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {type ApiResponse} from '../types'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport type RedemptionStatus = 'PENDING' | 'REDEEMED' | 'EXPIRED' | 'CANCELLED' | 'VOID'\n\nexport interface WalletProduct {\n id: string\n name: string\n type: string\n imageUrl: string | null\n}\n\nexport interface WalletOrderItem {\n product: WalletProduct\n quantity: number\n unitPrice: number\n}\n\nexport interface WalletOrder {\n id: string\n orderNumber: string\n spotId: string\n createdAt: string\n spot: {\n id: string\n name: string\n slug: string\n address: string | null\n }\n}\n\nexport interface WalletRedemption {\n id: string\n qrCode: string\n qrCodeUrl: string | null\n status: RedemptionStatus\n validFrom: string\n validUntil: string\n redeemedAt: string | null\n createdAt: string\n orderItem: WalletOrderItem & {\n order: WalletOrder\n }\n}\n\nexport interface RedemptionLookup extends WalletRedemption {\n redeemedBy: {\n id: string\n name: string\n } | null\n spot: {\n id: string\n name: string\n } | null\n orderItem: WalletOrderItem & {\n order: WalletOrder & {\n user: {\n id: string\n name: string | null\n avatarUrl: string | null\n }\n }\n }\n}\n\nexport interface WalletHistoryResponse {\n data: WalletRedemption[]\n meta: {\n total: number\n page: number\n limit: number\n totalPages: number\n }\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nfunction extractArrayData<T>(data: unknown): T[] {\n if (Array.isArray(data)) {\n return data\n }\n if (data && typeof data === 'object' && 'data' in data) {\n const nested = (data as {data: unknown}).data\n if (Array.isArray(nested)) {\n return nested\n }\n }\n return []\n}\n\nfunction extractObjectData<T>(data: unknown): T {\n if (\n data &&\n typeof data === 'object' &&\n 'data' in data &&\n !Array.isArray(data)\n ) {\n const nested = (data as {data: unknown}).data\n if (\n nested &&\n typeof nested === 'object' &&\n 'data' in nested &&\n !Array.isArray(nested)\n ) {\n return (nested as {data: T}).data\n }\n return nested as T\n }\n return data as T\n}\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const walletKeys = {\n all: ['wallet'] as const,\n active: () => [...walletKeys.all, 'active'] as const,\n history: (page?: number) => [...walletKeys.all, 'history', page] as const,\n redemptions: () => ['redemptions'] as const,\n lookup: (qrCode: string) => [...walletKeys.redemptions(), 'lookup', qrCode] as const,\n spotRedemptions: (spotId: string, page?: number) =>\n [...walletKeys.redemptions(), 'spot', spotId, page] as const,\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get user's active wallet items (pending redemptions)\n *\n * @endpoint GET /wallet\n */\nexport function useWallet(\n options?: Omit<UseQueryOptions<WalletRedemption[]>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<WalletRedemption[]> {\n return useQuery({\n queryKey: walletKeys.active(),\n queryFn: async (): Promise<WalletRedemption[]> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>('/wallet')\n return extractArrayData<WalletRedemption>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Get user's wallet history (all redemptions)\n *\n * @endpoint GET /wallet/history\n */\nexport function useWalletHistory(\n params?: {page?: number; limit?: number},\n options?: Omit<UseQueryOptions<WalletHistoryResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<WalletHistoryResponse> {\n return useQuery({\n queryKey: walletKeys.history(params?.page),\n queryFn: async (): Promise<WalletHistoryResponse> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<WalletHistoryResponse>>(\n `/wallet/history?${queryParams}`,\n )\n return extractObjectData<WalletHistoryResponse>(response.data.data)\n },\n ...options,\n })\n}\n\n/**\n * Lookup redemption by QR code (for scanner)\n *\n * @endpoint GET /redemptions/lookup/:qrCode\n */\nexport function useRedemptionLookup(\n qrCode: string,\n options?: Omit<UseQueryOptions<RedemptionLookup>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<RedemptionLookup> {\n return useQuery({\n queryKey: walletKeys.lookup(qrCode),\n queryFn: async (): Promise<RedemptionLookup> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<unknown>>(\n `/redemptions/lookup/${qrCode}`,\n )\n return extractObjectData<RedemptionLookup>(response.data.data)\n },\n enabled: !!qrCode && qrCode.length > 0,\n ...options,\n })\n}\n\n/**\n * Get spot's redemption history (for spot owner)\n *\n * @endpoint GET /spots/:spotId/redemptions\n */\nexport function useSpotRedemptions(\n spotId: string,\n params?: {page?: number; limit?: number},\n options?: Omit<UseQueryOptions<WalletHistoryResponse>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<WalletHistoryResponse> {\n return useQuery({\n queryKey: walletKeys.spotRedemptions(spotId, params?.page),\n queryFn: async (): Promise<WalletHistoryResponse> => {\n const client = getApiClient()\n const queryParams = new URLSearchParams()\n if (params?.page) queryParams.set('page', String(params.page))\n if (params?.limit) queryParams.set('limit', String(params.limit))\n const response = await client.get<ApiResponse<WalletHistoryResponse>>(\n `/spots/${spotId}/redemptions?${queryParams}`,\n )\n return extractObjectData<WalletHistoryResponse>(response.data.data)\n },\n enabled: !!spotId,\n ...options,\n })\n}\n","/**\n * Payments Query Hooks\n *\n * TanStack Query hooks for payment configuration.\n */\n\nimport {\n useQuery,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport type {ApiResponse} from '../types'\n\n// ============================================================================\n// QUERY KEYS\n// ============================================================================\n\nexport const paymentKeys = {\n all: ['payments'] as const,\n config: () => [...paymentKeys.all, 'config'] as const,\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\n/**\n * Payment configuration returned by GET /payments/config\n */\nexport interface PaymentConfig {\n stripe: {\n publishableKey: string | null\n enabled: boolean\n }\n coinbase: {\n enabled: boolean\n }\n supportedMethods: Array<'card' | 'apple_pay' | 'google_pay' | 'crypto'>\n}\n\n// ============================================================================\n// QUERY HOOKS\n// ============================================================================\n\n/**\n * Get payment configuration\n * Returns publishable keys and enabled payment methods\n *\n * @endpoint GET /payments/config\n */\nexport function usePaymentConfig(\n options?: Omit<UseQueryOptions<PaymentConfig>, 'queryKey' | 'queryFn'>,\n): UseQueryResult<PaymentConfig> {\n return useQuery({\n queryKey: paymentKeys.config(),\n queryFn: async (): Promise<PaymentConfig> => {\n const client = getApiClient()\n const response = await client.get<ApiResponse<PaymentConfig>>(\n '/payments/config',\n )\n return response.data.data\n },\n staleTime: 1000 * 60 * 60, // 1 hour - config rarely changes\n ...options,\n })\n}\n","/**\n * Users Mutation Hooks\n *\n * TanStack Query hooks for user mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {userKeys} from '../queries/users'\nimport {type ApiResponse, type UpdateProfileRequest, type User} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Update current user's profile\n *\n * @endpoint PUT /users/me\n */\nexport function useUpdateProfile(\n options?: Omit<\n UseMutationOptions<User, Error, UpdateProfileRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<User, Error, UpdateProfileRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: UpdateProfileRequest): Promise<User> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<User>>('/users/me', data)\n return response.data.data\n },\n onSuccess: data => {\n queryClient.setQueryData(userKeys.me(), data)\n },\n ...options,\n })\n}\n\n/**\n * Upload avatar\n *\n * Uploads avatar file and updates user profile in one request.\n *\n * @endpoint POST /users/me/avatar\n */\nexport function useUploadAvatar(\n options?: Omit<\n UseMutationOptions<{avatarUrl: string}, Error, FormData>,\n 'mutationFn'\n >,\n): UseMutationResult<{avatarUrl: string}, Error, FormData> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (formData: FormData): Promise<{avatarUrl: string}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{avatarUrl: string}>>(\n '/users/me/avatar',\n formData,\n {\n headers: {'Content-Type': 'multipart/form-data'},\n },\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Delete current user's account\n *\n * @endpoint DELETE /users/me\n */\nexport function useDeleteAccount(\n options?: Omit<UseMutationOptions<void, Error, void>, 'mutationFn'>,\n): UseMutationResult<void, Error, void> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (): Promise<void> => {\n const client = getApiClient()\n await client.delete('/users/me')\n },\n onSuccess: () => {\n queryClient.clear()\n },\n ...options,\n })\n}\n\n/**\n * Update user vibes\n *\n * @endpoint PUT /users/me/vibes\n */\nexport function useUpdateVibes(\n options?: Omit<\n UseMutationOptions<User, Error, {vibes: string[]}>,\n 'mutationFn'\n >,\n): UseMutationResult<User, Error, {vibes: string[]}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {vibes: string[]}): Promise<User> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<User>>(\n '/users/me/vibes',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Update user interests\n *\n * @endpoint PUT /user/me/interests\n */\nexport function useUpdateInterests(\n options?: Omit<\n UseMutationOptions<User, Error, {interests: string[]}>,\n 'mutationFn'\n >,\n): UseMutationResult<User, Error, {interests: string[]}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {interests: string[]}): Promise<User> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<User>>(\n '/user/me/interests',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Complete onboarding step\n *\n * @endpoint POST /user/me/onboarding-step\n */\nexport function useCompleteOnboardingStep(\n options?: Omit<UseMutationOptions<User, Error, {step: number}>, 'mutationFn'>,\n): UseMutationResult<User, Error, {step: number}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {step: number}): Promise<User> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<User>>(\n '/user/me/onboarding-step',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.me()})\n },\n ...options,\n })\n}\n\n/**\n * Block a user\n *\n * @endpoint POST /users/{id}/block\n */\nexport function useBlockUser(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (userId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/users/${userId}/block`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.blocked()})\n },\n ...options,\n })\n}\n\n/**\n * Unblock a user\n *\n * @endpoint DELETE /users/{id}/block\n */\nexport function useUnblockUser(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (userId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/users/${userId}/block`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.blocked()})\n },\n ...options,\n })\n}\n","/**\n * Posts Mutation Hooks\n *\n * TanStack Query hooks for post/board mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {postKeys} from '../queries/posts'\nimport {\n type ApiResponse,\n type CreatePostRequest,\n type CreateReplyRequest,\n type Post,\n type PostResponse,\n type PostStatusDto,\n type RespondToPostRequest,\n type UpdateResponseRequest,\n type UpvoteResponse,\n} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new post\n *\n * @endpoint POST /spots/{spotId}/posts\n */\nexport function useCreatePost(\n options?: Omit<\n UseMutationOptions<Post, Error, {spotId: string} & CreatePostRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<Post, Error, {spotId: string} & CreatePostRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({spotId, ...data}): Promise<Post> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Post>>(\n `/spots/${spotId}/posts`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.bySpot(variables.spotId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Update a post\n *\n * @endpoint PUT /posts/{postId}\n */\nexport function useUpdatePost(\n options?: Omit<\n UseMutationOptions<\n Post,\n Error,\n {postId: string; title?: string; content?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Post,\n Error,\n {postId: string; title?: string; content?: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, title, content}): Promise<Post> => {\n const client = getApiClient()\n // API expects 'description' field, not 'content'\n const response = await client.put<ApiResponse<Post>>(\n `/posts/${postId}`,\n {title, description: content},\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(postKeys.detail(variables.postId), data)\n },\n ...options,\n })\n}\n\n/**\n * Delete a post\n *\n * @endpoint DELETE /posts/{postId}\n */\nexport function useDeletePost(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (postId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/posts/${postId}`)\n },\n onSuccess: (_, postId) => {\n queryClient.invalidateQueries({queryKey: postKeys.detail(postId)})\n queryClient.invalidateQueries({queryKey: postKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Fulfill a post (mark as fulfilled)\n *\n * @endpoint PUT /posts/{postId}/fulfill\n */\nexport function useFulfillPost(\n options?: Omit<UseMutationOptions<Post, Error, string>, 'mutationFn'>,\n): UseMutationResult<Post, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (postId: string): Promise<Post> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Post>>(\n `/posts/${postId}/fulfill`,\n )\n return response.data.data\n },\n onSuccess: (data, postId) => {\n queryClient.setQueryData(postKeys.detail(postId), data)\n },\n ...options,\n })\n}\n\n/**\n * Upvote/unupvote a post\n *\n * @endpoint POST /posts/{postId}/upvote\n */\nexport function useUpvotePost(\n options?: Omit<\n UseMutationOptions<UpvoteResponse, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<UpvoteResponse, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (postId: string): Promise<UpvoteResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<UpvoteResponse>>(\n `/posts/${postId}/upvote`,\n )\n return response.data.data\n },\n onSuccess: (_, postId) => {\n queryClient.invalidateQueries({queryKey: postKeys.detail(postId)})\n },\n ...options,\n })\n}\n\n/**\n * Create a reply to a post\n *\n * @endpoint POST /posts/{postId}/reply\n */\nexport function useCreateReply(\n options?: Omit<\n UseMutationOptions<unknown, Error, {postId: string} & CreateReplyRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<unknown, Error, {postId: string} & CreateReplyRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, ...data}) => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<unknown>>(\n `/posts/${postId}/reply`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.detail(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Delete a reply\n *\n * @endpoint DELETE /replies/{replyId}\n */\nexport function useDeleteReply(\n options?: Omit<\n UseMutationOptions<void, Error, {replyId: string; postId: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<void, Error, {replyId: string; postId: string}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({replyId}): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/replies/${replyId}`)\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.detail(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Respond to a post (express interest)\n *\n * @endpoint POST /posts/{postId}/respond\n */\nexport function useRespondToPost(\n options?: Omit<\n UseMutationOptions<\n PostResponse,\n Error,\n {postId: string} & RespondToPostRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n PostResponse,\n Error,\n {postId: string} & RespondToPostRequest\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, ...data}): Promise<PostResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<PostResponse>>(\n `/posts/${postId}/respond`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.detail(variables.postId),\n })\n queryClient.invalidateQueries({\n queryKey: postKeys.responses(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Accept or decline a response\n *\n * @endpoint PUT /responses/{responseId}\n */\nexport function useUpdateResponse(\n options?: Omit<\n UseMutationOptions<\n PostResponse,\n Error,\n {responseId: string; postId: string} & UpdateResponseRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n PostResponse,\n Error,\n {responseId: string; postId: string} & UpdateResponseRequest\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n responseId,\n postId: _,\n ...data\n }): Promise<PostResponse> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<PostResponse>>(\n `/responses/${responseId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: postKeys.responses(variables.postId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Report a post\n *\n * @endpoint POST /posts/{postId}/report\n */\nexport function useReportPost(\n options?: Omit<\n UseMutationOptions<\n void,\n Error,\n {postId: string; reason: string; details?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n void,\n Error,\n {postId: string; reason: string; details?: string}\n> {\n return useMutation({\n mutationFn: async ({postId, ...data}): Promise<void> => {\n const client = getApiClient()\n await client.post(`/posts/${postId}/report`, data)\n },\n ...options,\n })\n}\n\n// PostStatusUpdate matches partial PostStatusDto for updates\ninterface PostStatusUpdate {\n isRead?: boolean\n isHidden?: boolean\n isPinned?: boolean\n}\n\n/**\n * Update user's status for a post (read/hidden/pinned)\n *\n * @endpoint PUT /posts/{postId}/status\n */\nexport function useUpdatePostStatus(\n options?: Omit<\n UseMutationOptions<\n PostStatusDto,\n Error,\n {postId: string} & PostStatusUpdate\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n PostStatusDto,\n Error,\n {postId: string} & PostStatusUpdate\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({postId, ...data}): Promise<PostStatusDto> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<PostStatusDto>>(\n `/posts/${postId}/status`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(postKeys.status(variables.postId), data)\n },\n ...options,\n })\n}\n","/**\n * Spots Mutation Hooks\n *\n * TanStack Query hooks for spot mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {spotKeys} from '../queries/spots'\nimport {userKeys} from '../queries/users'\nimport {type ApiResponse, type ClaimSpotRequest, type Spot} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new spot\n *\n * @endpoint POST /spots\n */\nexport function useCreateSpot(\n options?: Omit<UseMutationOptions<Spot, Error, Partial<Spot>>, 'mutationFn'>,\n): UseMutationResult<Spot, Error, Partial<Spot>> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: Partial<Spot>): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Spot>>('/spots', data)\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: spotKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Update a spot\n *\n * @endpoint PUT /spots/{spotId}\n */\nexport function useUpdateSpot(\n options?: Omit<\n UseMutationOptions<Spot, Error, {spotId: string} & Partial<Spot>>,\n 'mutationFn'\n >,\n): UseMutationResult<Spot, Error, {spotId: string} & Partial<Spot>> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({spotId, ...data}): Promise<Spot> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Spot>>(\n `/spots/${spotId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(spotKeys.detail(variables.spotId), data)\n },\n ...options,\n })\n}\n\n/**\n * Claim a spot (for business owners)\n *\n * @endpoint POST /spots/{spotId}/claim\n */\nexport function useClaimSpot(\n options?: Omit<\n UseMutationOptions<\n {claimId: string},\n Error,\n {spotId: string} & ClaimSpotRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n {claimId: string},\n Error,\n {spotId: string} & ClaimSpotRequest\n> {\n return useMutation({\n mutationFn: async ({spotId, ...data}): Promise<{claimId: string}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{claimId: string}>>(\n `/spots/${spotId}/claim`,\n data,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Subscribe to a spot\n *\n * @endpoint POST /spots/{spotId}/subscribe\n */\nexport function useSubscribeToSpot(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (spotId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/spots/${spotId}/subscribe`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.subscriptions()})\n },\n ...options,\n })\n}\n\n/**\n * Unsubscribe from a spot\n *\n * @endpoint DELETE /spots/{spotId}/subscribe\n */\nexport function useUnsubscribeFromSpot(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (spotId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/spots/${spotId}/subscribe`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.subscriptions()})\n },\n ...options,\n })\n}\n\n/**\n * Toggle favorite status on a spot\n *\n * @endpoint POST /spots/{spotId}/favorite\n */\nexport function useFavoriteSpot(\n options?: Omit<\n UseMutationOptions<{isFavorite: boolean}, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<{isFavorite: boolean}, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (spotId: string): Promise<{isFavorite: boolean}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{isFavorite: boolean}>>(\n `/spots/${spotId}/favorite`,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: userKeys.favorites()})\n },\n ...options,\n })\n}\n\n/**\n * Rate a spot\n *\n * @endpoint POST /spots/{spotId}/rate\n */\nexport function useRateSpot(\n options?: Omit<\n UseMutationOptions<\n {rating: number},\n Error,\n {spotId: string; rating: number}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n {rating: number},\n Error,\n {spotId: string; rating: number}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n spotId,\n rating,\n }: {\n spotId: string\n rating: number\n }): Promise<{rating: number}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{rating: number}>>(\n `/spots/${spotId}/rate`,\n {rating},\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: spotKeys.detail(variables.spotId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Report a spot\n *\n * @endpoint POST /spots/{spotId}/report\n */\nexport function useReportSpot(\n options?: Omit<\n UseMutationOptions<\n {success: boolean},\n Error,\n {spotId: string; reason: string; details?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n {success: boolean},\n Error,\n {spotId: string; reason: string; details?: string}\n> {\n return useMutation({\n mutationFn: async ({\n spotId,\n reason,\n details,\n }): Promise<{success: boolean}> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<{success: boolean}>>(\n `/spots/${spotId}/report`,\n {reason, details},\n )\n return response.data.data\n },\n ...options,\n })\n}\n","/**\n * Conversations Mutation Hooks\n *\n * TanStack Query hooks for conversation/messaging mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {conversationKeys} from '../queries/conversations'\nimport {\n type ApiResponse,\n type Conversation,\n type CreateConversationRequest,\n type Message,\n type SendMessageRequest,\n} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new conversation\n *\n * @endpoint POST /conversations\n */\nexport function useCreateConversation(\n options?: Omit<\n UseMutationOptions<Conversation, Error, CreateConversationRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<Conversation, Error, CreateConversationRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (\n data: CreateConversationRequest,\n ): Promise<Conversation> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Conversation>>(\n '/conversations',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Create or get direct conversation with a user\n *\n * @endpoint POST /conversations/direct\n */\nexport function useCreateDirectConversation(\n options?: Omit<\n UseMutationOptions<Conversation, Error, {userId: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<Conversation, Error, {userId: string}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {userId: string}): Promise<Conversation> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Conversation>>(\n '/conversations/direct',\n data,\n )\n return response.data.data\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Send a message in a conversation\n *\n * @endpoint POST /conversations/{id}/messages\n */\nexport function useSendMessage(\n options?: Omit<\n UseMutationOptions<\n Message,\n Error,\n {conversationId: string} & SendMessageRequest\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Message,\n Error,\n {conversationId: string} & SendMessageRequest\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({conversationId, ...data}): Promise<Message> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Message>>(\n `/conversations/${conversationId}/messages`,\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: conversationKeys.messages(variables.conversationId),\n })\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Mark conversation as read\n *\n * @endpoint PUT /conversations/{id}/read\n */\nexport function useMarkConversationAsRead(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (conversationId: string): Promise<void> => {\n const client = getApiClient()\n await client.put(`/conversations/${conversationId}/read`)\n },\n onSuccess: (_, conversationId) => {\n queryClient.invalidateQueries({\n queryKey: conversationKeys.detail(conversationId),\n })\n queryClient.invalidateQueries({queryKey: conversationKeys.lists()})\n },\n ...options,\n })\n}\n\n/**\n * Send typing indicator\n *\n * @endpoint POST /conversations/{id}/typing\n */\nexport function useSendTypingIndicator(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n return useMutation({\n mutationFn: async (conversationId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/conversations/${conversationId}/typing`)\n },\n ...options,\n })\n}\n","/**\n * Clubs Mutation Hooks\n *\n * TanStack Query hooks for club mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {clubKeys} from '../queries/clubs'\nimport {userKeys} from '../queries/users'\nimport {type ApiResponse, type Club} from '../types'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new club\n *\n * @endpoint POST /clubs\n */\nexport function useCreateClub(\n options?: Omit<\n UseMutationOptions<\n Club,\n Error,\n {spotId: string; name: string; description?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Club,\n Error,\n {spotId: string; name: string; description?: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data): Promise<Club> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Club>>('/clubs', data)\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({\n queryKey: clubKeys.bySpot(variables.spotId),\n })\n },\n ...options,\n })\n}\n\n/**\n * Update a club\n *\n * @endpoint PUT /clubs/{id}\n */\nexport function useUpdateClub(\n options?: Omit<\n UseMutationOptions<\n Club,\n Error,\n {clubId: string; name?: string; description?: string}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Club,\n Error,\n {clubId: string; name?: string; description?: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({clubId, ...data}): Promise<Club> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Club>>(\n `/clubs/${clubId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data, variables) => {\n queryClient.setQueryData(clubKeys.detail(variables.clubId), data)\n },\n ...options,\n })\n}\n\n/**\n * Join a club\n *\n * @endpoint POST /clubs/{id}/join\n */\nexport function useJoinClub(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (clubId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/clubs/${clubId}/join`)\n },\n onSuccess: (_, clubId) => {\n queryClient.invalidateQueries({queryKey: clubKeys.detail(clubId)})\n queryClient.invalidateQueries({queryKey: userKeys.clubs()})\n },\n ...options,\n })\n}\n\n/**\n * Leave a club\n *\n * @endpoint POST /clubs/{id}/leave\n */\nexport function useLeaveClub(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (clubId: string): Promise<void> => {\n const client = getApiClient()\n await client.post(`/clubs/${clubId}/leave`)\n },\n onSuccess: (_, clubId) => {\n queryClient.invalidateQueries({queryKey: clubKeys.detail(clubId)})\n queryClient.invalidateQueries({queryKey: userKeys.clubs()})\n },\n ...options,\n })\n}\n","/**\n * Notifications Mutation Hooks\n *\n * TanStack Query hooks for notification mutation operations.\n */\n\nimport {\n useMutation,\n type UseMutationOptions,\n type UseMutationResult,\n useQueryClient,\n} from '@tanstack/react-query'\n\nimport {getApiClient} from '../client'\nimport {notificationKeys} from '../queries/notifications'\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Mark notifications as read\n *\n * @endpoint PUT /notifications/read\n */\nexport function useMarkNotificationsRead(\n options?: Omit<\n UseMutationOptions<void, Error, {notificationIds?: string[]}>,\n 'mutationFn'\n >,\n): UseMutationResult<void, Error, {notificationIds?: string[]}> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: {notificationIds?: string[]}): Promise<void> => {\n const client = getApiClient()\n await client.put('/notifications/read', data)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: notificationKeys.lists()})\n queryClient.invalidateQueries({queryKey: notificationKeys.unreadCount()})\n },\n ...options,\n })\n}\n\n/**\n * Register device token for push notifications\n *\n * @endpoint POST /device-tokens\n */\nexport function useRegisterDeviceToken(\n options?: Omit<\n UseMutationOptions<\n void,\n Error,\n {token: string; platform: 'ios' | 'android' | 'web'}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n void,\n Error,\n {token: string; platform: 'ios' | 'android' | 'web'}\n> {\n return useMutation({\n mutationFn: async (data): Promise<void> => {\n const client = getApiClient()\n await client.post('/device-tokens', data)\n },\n ...options,\n })\n}\n\n/**\n * Remove device token\n *\n * @endpoint DELETE /device-tokens\n */\nexport function useRemoveDeviceToken(\n options?: Omit<\n UseMutationOptions<void, Error, {token: string}>,\n 'mutationFn'\n >,\n): UseMutationResult<void, Error, {token: string}> {\n return useMutation({\n mutationFn: async (data): Promise<void> => {\n const client = getApiClient()\n await client.delete('/device-tokens', {data})\n },\n ...options,\n })\n}\n","/**\n * Products Mutation Hooks\n *\n * TanStack Query hooks for product mutation operations.\n */\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport {productKeys} from '../queries/products'\nimport type {Product, ProductType, ApiResponse} from '../types'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface CreateProductRequest {\n spotId: string\n name: string\n slug?: string // Optional - auto-generated from name if not provided\n description?: string\n type: ProductType\n price: number\n currency?: string\n stock?: number // Maps to API's stockQuantity\n validityDays?: number // For PASS type - number of days valid\n eventDate?: string // For EVENT_TICKET type\n imageUrl?: string\n isActive?: boolean // true = ACTIVE, false = DRAFT\n}\n\n/**\n * Generate URL-friendly slug from name\n */\nfunction generateSlug(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 100)\n}\n\nexport interface UpdateProductRequest {\n name?: string\n slug?: string\n description?: string\n price?: number\n type?: ProductType\n stock?: number // Maps to API's stockQuantity\n validityDays?: number // For PASS type - number of days valid\n eventDate?: string // For EVENT_TICKET type\n imageUrl?: string\n isActive?: boolean // true = ACTIVE, false = DRAFT (maps to status field)\n}\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new product\n *\n * @endpoint POST /spots/{spotId}/products\n */\nexport function useCreateProduct(\n options?: Omit<\n UseMutationOptions<Product, Error, CreateProductRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<Product, Error, CreateProductRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: CreateProductRequest): Promise<Product> => {\n const client = getApiClient()\n const {spotId, slug, ...productData} = data\n\n // Auto-generate slug from name if not provided\n const productSlug = slug || generateSlug(productData.name)\n\n const response = await client.post<ApiResponse<Product>>(\n `/spots/${spotId}/products`,\n {...productData, slug: productSlug},\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(variables.spotId)})\n queryClient.invalidateQueries({queryKey: productKeys.list({my: true})})\n },\n ...options,\n })\n}\n\n/**\n * Update a product\n *\n * @endpoint PUT /products/{productId}\n */\nexport function useUpdateProduct(\n options?: Omit<\n UseMutationOptions<\n Product,\n Error,\n {productId: string; data: UpdateProductRequest}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Product,\n Error,\n {productId: string; data: UpdateProductRequest}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({productId, data}): Promise<Product> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<Product>>(\n `/products/${productId}`,\n data,\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(productKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(data.spotId)})\n queryClient.invalidateQueries({queryKey: productKeys.list({my: true})})\n },\n ...options,\n })\n}\n\n/**\n * Delete a product\n *\n * @endpoint DELETE /products/{productId}\n */\nexport function useDeleteProduct(\n options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>,\n): UseMutationResult<void, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (productId: string): Promise<void> => {\n const client = getApiClient()\n await client.delete(`/products/${productId}`)\n },\n onSuccess: () => {\n queryClient.invalidateQueries({queryKey: productKeys.all})\n },\n ...options,\n })\n}\n\n/**\n * Adjust product stock\n *\n * @endpoint POST /products/{productId}/stock\n */\nexport function useAdjustStock(\n options?: Omit<\n UseMutationOptions<\n Product,\n Error,\n {\n productId: string\n quantity: number\n reason: 'RESTOCK' | 'ADJUSTMENT'\n notes?: string\n }\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n Product,\n Error,\n {\n productId: string\n quantity: number\n reason: 'RESTOCK' | 'ADJUSTMENT'\n notes?: string\n }\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({productId, quantity, reason, notes}): Promise<Product> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<Product>>(\n `/products/${productId}/stock`,\n {quantity, reason, notes},\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(productKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(data.spotId)})\n },\n ...options,\n })\n}\n","/**\n * Orders Mutation Hooks\n *\n * TanStack Query hooks for order mutation operations.\n */\n\nimport {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport {orderKeys, type OrderWithDetails} from '../queries/orders'\nimport {productKeys} from '../queries/products'\nimport type {Order, OrderStatus, ApiResponse} from '../types'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface CartItem {\n productId: string\n quantity: number\n}\n\nexport interface CreateOrderRequest {\n spotId: string\n items: CartItem[]\n notes?: string\n deliveryAddress?: string\n}\n\nexport interface CreateOrderResponse extends Omit<Order, 'items'> {\n items: Array<{\n id: string\n orderId: string\n productId: string\n productName: string\n productType: string\n quantity: number\n unitPrice: number\n totalPrice: number\n status: string\n passCode: string | null\n ticketCode: string | null\n passExpiresAt: string | null\n redeemedAt: string | null\n specialInstructions: string | null\n createdAt: string\n }>\n}\n\nexport interface PaymentIntentResponse {\n clientSecret: string\n paymentIntentId: string\n}\n\nexport interface CoinbaseChargeResponse {\n chargeId: string\n chargeCode: string\n hostedUrl: string\n}\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Create a new order\n *\n * @endpoint POST /orders\n */\nexport function useCreateOrder(\n options?: Omit<\n UseMutationOptions<CreateOrderResponse, Error, CreateOrderRequest>,\n 'mutationFn'\n >,\n): UseMutationResult<CreateOrderResponse, Error, CreateOrderRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (data: CreateOrderRequest): Promise<CreateOrderResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<CreateOrderResponse>>(\n '/orders',\n data,\n )\n return response.data.data\n },\n onSuccess: (_, variables) => {\n // Invalidate products to reflect updated stock\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(variables.spotId)})\n // Invalidate my orders list\n queryClient.invalidateQueries({queryKey: orderKeys.list({my: true})})\n },\n ...options,\n })\n}\n\n/**\n * Create Stripe PaymentIntent for an order\n *\n * @endpoint POST /payments/stripe/intent/{orderId}\n */\nexport function useCreateStripeIntent(\n options?: Omit<\n UseMutationOptions<PaymentIntentResponse, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<PaymentIntentResponse, Error, string> {\n return useMutation({\n mutationFn: async (orderId: string): Promise<PaymentIntentResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<PaymentIntentResponse>>(\n `/payments/stripe/intent/${orderId}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Create Coinbase Commerce charge for an order\n *\n * @endpoint POST /payments/coinbase/charge/{orderId}\n */\nexport function useCreateCoinbaseCharge(\n options?: Omit<\n UseMutationOptions<CoinbaseChargeResponse, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<CoinbaseChargeResponse, Error, string> {\n return useMutation({\n mutationFn: async (orderId: string): Promise<CoinbaseChargeResponse> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<CoinbaseChargeResponse>>(\n `/payments/coinbase/charge/${orderId}`,\n )\n return response.data.data\n },\n ...options,\n })\n}\n\n/**\n * Update order status (seller action)\n *\n * @endpoint PUT /orders/{orderId}/status\n */\nexport function useUpdateOrderStatus(\n options?: Omit<\n UseMutationOptions<\n OrderWithDetails,\n Error,\n {orderId: string; status: OrderStatus}\n >,\n 'mutationFn'\n >,\n): UseMutationResult<\n OrderWithDetails,\n Error,\n {orderId: string; status: OrderStatus}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({orderId, status}): Promise<OrderWithDetails> => {\n const client = getApiClient()\n const response = await client.put<ApiResponse<OrderWithDetails>>(\n `/orders/${orderId}/status`,\n {status},\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(orderKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: orderKeys.spotOrders(data.spotId)})\n },\n ...options,\n })\n}\n\n/**\n * Cancel an order (buyer action, only for pending orders)\n *\n * @endpoint POST /orders/{orderId}/cancel\n */\nexport function useCancelOrder(\n options?: Omit<\n UseMutationOptions<OrderWithDetails, Error, string>,\n 'mutationFn'\n >,\n): UseMutationResult<OrderWithDetails, Error, string> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (orderId: string): Promise<OrderWithDetails> => {\n const client = getApiClient()\n const response = await client.post<ApiResponse<OrderWithDetails>>(\n `/orders/${orderId}/cancel`,\n )\n return response.data.data\n },\n onSuccess: (data) => {\n queryClient.setQueryData(orderKeys.detail(data.id), data)\n queryClient.invalidateQueries({queryKey: orderKeys.list({my: true})})\n // Restore stock\n queryClient.invalidateQueries({queryKey: productKeys.bySpot(data.spotId)})\n },\n ...options,\n })\n}\n","/**\n * Redemption Mutation Hooks\n *\n * TanStack Query mutations for redemption operations.\n */\n\nimport {useMutation, useQueryClient, type UseMutationResult} from '@tanstack/react-query'\nimport {getApiClient} from '../client'\nimport {walletKeys, type WalletRedemption} from '../queries/wallet'\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface RedeemRequest {\n qrCode: string\n spotId?: string\n deviceInfo?: string\n latitude?: number\n longitude?: number\n notes?: string\n}\n\nexport interface VoidRedemptionRequest {\n reason: string\n}\n\n// ============================================================================\n// MUTATION HOOKS\n// ============================================================================\n\n/**\n * Redeem a QR code (spot owner/staff action)\n *\n * @endpoint POST /redemptions/redeem\n */\nexport function useRedeem(): UseMutationResult<WalletRedemption, Error, RedeemRequest> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async (request: RedeemRequest): Promise<WalletRedemption> => {\n const client = getApiClient()\n const response = await client.post('/redemptions/redeem', request)\n return response.data.data\n },\n onSuccess: (_data, variables) => {\n // Invalidate redemption lookup for this QR code\n queryClient.invalidateQueries({\n queryKey: walletKeys.lookup(variables.qrCode),\n })\n // Invalidate spot redemptions if spotId provided\n if (variables.spotId) {\n queryClient.invalidateQueries({\n queryKey: walletKeys.spotRedemptions(variables.spotId),\n })\n }\n },\n })\n}\n\n/**\n * Void a redemption (spot owner action)\n *\n * @endpoint PUT /redemptions/:id/void\n */\nexport function useVoidRedemption(): UseMutationResult<\n WalletRedemption,\n Error,\n {redemptionId: string; reason: string}\n> {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n redemptionId,\n reason,\n }: {\n redemptionId: string\n reason: string\n }): Promise<WalletRedemption> => {\n const client = getApiClient()\n const response = await client.put(`/redemptions/${redemptionId}/void`, {reason})\n return response.data.data\n },\n onSuccess: () => {\n // Invalidate wallet queries\n queryClient.invalidateQueries({queryKey: walletKeys.all})\n queryClient.invalidateQueries({queryKey: walletKeys.redemptions()})\n },\n })\n}\n"]}