{"version":3,"sources":["../src/index.ts","../src/auth/services/auth.service.ts","../src/auth/services/invite.service.ts","../src/auth/hooks/useAuth.ts","../src/auth/providers/AuthProvider.tsx","../src/auth/hooks/useUser.ts","../src/auth/hooks/useRole.ts","../src/auth/hooks/usePermission.ts","../src/auth/components/SignIn/SignIn.tsx","../src/auth/components/SignUp/SignUp.tsx","../src/auth/components/UserButton/UserButton.tsx","../src/auth/components/UserButton/UserButton.module.css","../src/auth/components/UserProfile/UserProfile.tsx","../src/auth/components/SignedIn/SignedIn.tsx","../src/auth/components/SignedOut/SignedOut.tsx","../src/auth/components/Protect/Protect.tsx","../src/auth/components/RedirectToSignIn/RedirectToSignIn.tsx","../src/email/services/email.service.ts","../src/email/hooks/useEmail.ts","../src/email/hooks/useEmailTemplate.ts","../src/email/components/EmailPreview/EmailPreview.tsx","../src/email/components/EmailTemplateEditor/EmailTemplateEditor.tsx","../src/email/components/EmailComposer/EmailComposer.tsx","../src/email/templates/WelcomeEmail.tsx","../src/email/templates/InviteEmail.tsx","../src/email/templates/ResetPasswordEmail.tsx","../src/notifications/services/notification.service.ts","../src/notifications/hooks/useNotifications.ts","../src/notifications/hooks/useNotificationPreferences.ts","../src/notifications/hooks/useNotificationCenter.ts","../src/notifications/components/NotificationBell/NotificationBell.tsx","../src/notifications/components/NotificationItem/NotificationItem.tsx","../src/notifications/components/NotificationCenter/NotificationCenter.tsx","../src/notifications/components/NotificationPreferences/NotificationPreferences.tsx","../src/notifications/providers/NotificationProvider.tsx","../src/audit/services/audit.service.ts","../src/audit/services/privacyAuditLogger.ts","../src/audit/services/clickhouse.ts","../src/audit/services/hashMapping.ts","../src/audit/utils/crypto.ts","../src/audit/hooks/useAuditLog.ts","../src/audit/hooks/useAuditStream.ts","../src/audit/hooks/useUserActivity.ts","../src/audit/hooks/useAuditSearch.ts","../src/audit/hooks/usePrivacyAuditLog.ts","../src/audit/components/AuditLogViewer/AuditLogViewer.tsx","../src/audit/components/ActivityTimeline/ActivityTimeline.tsx","../src/audit/components/AuditEventDetails/AuditEventDetails.tsx","../src/audit/components/AuditSearchBar/AuditSearchBar.tsx","../src/audit/utils/formatter.ts","../src/audit/utils/exporter.ts","../src/audit/index.ts"],"sourcesContent":["// Main entry point for @catalystlabs/firebase-ecosystem\n\n// Re-export all modules\nexport * from './auth';\nexport * from './email';\nexport * from './notifications';\nexport * from './audit';\n\n// Export types\nexport type { AuthConfig } from './auth/types';\nexport type { EmailConfig } from './email/types';\nexport type { NotificationConfig } from './notifications/types';\nexport type { AuditConfig } from './audit/types';","import { \n  initializeApp, \n  getApps, \n  getApp,\n  FirebaseApp \n} from 'firebase/app';\nimport {\n  getAuth,\n  Auth as FirebaseAuth,\n  createUserWithEmailAndPassword,\n  signInWithEmailAndPassword,\n  signOut as firebaseSignOut,\n  onAuthStateChanged,\n  User as FirebaseUser,\n  GoogleAuthProvider,\n  GithubAuthProvider,\n  signInWithPopup,\n  sendPasswordResetEmail,\n  updateProfile,\n  setPersistence,\n  browserLocalPersistence,\n  browserSessionPersistence,\n} from 'firebase/auth';\nimport { \n  AuthConfig, \n  AuthUser, \n  SignInOptions, \n  SignUpOptions,\n  AuthProvider,\n  AuthError \n} from '../types';\n\nclass AuthService {\n  private app: FirebaseApp;\n  private auth: FirebaseAuth;\n  private config: AuthConfig;\n  private customClaimsCache: Map<string, any> = new Map();\n\n  constructor(config: AuthConfig) {\n    this.config = config;\n    \n    // Initialize Firebase app\n    this.app = getApps().length > 0 \n      ? getApp() \n      : initializeApp(config.firebaseConfig);\n    \n    this.auth = getAuth(this.app);\n  }\n\n  // Initialize auth with configuration\n  async initialize(): Promise<void> {\n    // Set up auth state observer\n    onAuthStateChanged(this.auth, async (user) => {\n      if (user) {\n        await this.enhanceUser(user);\n        if (this.config.onUserCreated && this.isNewUser(user)) {\n          await this.config.onUserCreated(user as AuthUser);\n        }\n      }\n    });\n  }\n\n  // Sign up with email and password\n  async signUp(options: SignUpOptions): Promise<{ user: AuthUser }> {\n    try {\n      const { email, password, displayName, photoURL, metadata } = options;\n      \n      const userCredential = await createUserWithEmailAndPassword(\n        this.auth, \n        email, \n        password\n      );\n\n      // Update profile if display name or photo provided\n      if (displayName || photoURL) {\n        await updateProfile(userCredential.user, {\n          displayName,\n          photoURL,\n        });\n      }\n\n      // Store metadata in custom claims (server-side required)\n      if (metadata) {\n        await this.setUserMetadata(userCredential.user.uid, metadata);\n      }\n\n      const user = await this.enhanceUser(userCredential.user);\n      return { user };\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Sign in with email and password\n  async signIn(options: SignInOptions): Promise<{ user: AuthUser }> {\n    try {\n      const { email, password, rememberMe = false } = options;\n      \n      // Set persistence based on remember me option\n      await setPersistence(\n        this.auth,\n        rememberMe ? browserLocalPersistence : browserSessionPersistence\n      );\n\n      const userCredential = await signInWithEmailAndPassword(\n        this.auth,\n        email,\n        password\n      );\n\n      const user = await this.enhanceUser(userCredential.user);\n      return { user };\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Sign in with social provider\n  async signInWith(provider: AuthProvider): Promise<{ user: AuthUser }> {\n    try {\n      let authProvider;\n      \n      switch (provider) {\n        case 'google':\n          authProvider = new GoogleAuthProvider();\n          break;\n        case 'github':\n          authProvider = new GithubAuthProvider();\n          break;\n        default:\n          throw new Error(`Provider ${provider} not supported yet`);\n      }\n\n      const userCredential = await signInWithPopup(this.auth, authProvider);\n      const user = await this.enhanceUser(userCredential.user);\n      return { user };\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Sign out\n  async signOut(): Promise<void> {\n    try {\n      await firebaseSignOut(this.auth);\n      this.customClaimsCache.clear();\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Send password reset email\n  async sendPasswordResetEmail(email: string): Promise<void> {\n    try {\n      await sendPasswordResetEmail(this.auth, email);\n    } catch (error: any) {\n      throw this.normalizeError(error);\n    }\n  }\n\n  // Get current user\n  getCurrentUser(): AuthUser | null {\n    const user = this.auth.currentUser;\n    if (!user) return null;\n    \n    // Return cached enhanced user\n    return this.getCachedEnhancedUser(user);\n  }\n\n  // Subscribe to auth state changes\n  onAuthStateChange(callback: (user: AuthUser | null) => void): () => void {\n    return onAuthStateChanged(this.auth, async (user) => {\n      if (user) {\n        const enhancedUser = await this.enhanceUser(user);\n        callback(enhancedUser);\n      } else {\n        callback(null);\n      }\n    });\n  }\n\n  // Enhance Firebase user with custom claims and additional data\n  private async enhanceUser(user: FirebaseUser): Promise<AuthUser> {\n    const tokenResult = await user.getIdTokenResult();\n    const customClaims = tokenResult.claims;\n    \n    // Cache custom claims\n    this.customClaimsCache.set(user.uid, customClaims);\n\n    const enhancedUser: AuthUser = {\n      ...user,\n      customClaims,\n      role: customClaims.role as string | undefined,\n      roles: customClaims.roles as string[] | undefined,\n      department: customClaims.department as string | undefined,\n      departments: customClaims.departments as string[] | undefined,\n      isAdmin: customClaims.isAdmin as boolean | undefined,\n      isSuperAdmin: customClaims.isSuperAdmin as boolean | undefined,\n      permissions: customClaims.permissions as string[] | undefined,\n    };\n\n    return enhancedUser;\n  }\n\n  // Get cached enhanced user\n  private getCachedEnhancedUser(user: FirebaseUser): AuthUser {\n    const customClaims = this.customClaimsCache.get(user.uid) || {};\n    \n    return {\n      ...user,\n      customClaims,\n      role: customClaims.role as string | undefined,\n      permissions: customClaims.permissions as string[] | undefined,\n      department: customClaims.department as string | undefined,\n    };\n  }\n\n  // Check if user is new (created within last minute)\n  private isNewUser(user: FirebaseUser): boolean {\n    if (!user.metadata.creationTime) return false;\n    \n    const creationTime = new Date(user.metadata.creationTime).getTime();\n    const now = Date.now();\n    const oneMinute = 60 * 1000;\n    \n    return now - creationTime < oneMinute;\n  }\n\n  // Set user metadata (requires server-side implementation)\n  private async setUserMetadata(_uid: string, _metadata: any): Promise<void> {\n    // This would typically call your backend API to set custom claims\n    console.warn('setUserMetadata requires server-side implementation');\n  }\n\n  // Normalize Firebase errors to consistent format\n  private normalizeError(error: any): AuthError {\n    const errorCode = error.code || 'unknown';\n    let message = error.message || 'An unknown error occurred';\n\n    // Provide user-friendly error messages\n    switch (errorCode) {\n      case 'auth/invalid-email':\n        message = 'The email address is not valid.';\n        break;\n      case 'auth/user-disabled':\n        message = 'This user account has been disabled.';\n        break;\n      case 'auth/user-not-found':\n        message = 'No user found with this email address.';\n        break;\n      case 'auth/wrong-password':\n        message = 'The password is incorrect.';\n        break;\n      case 'auth/email-already-in-use':\n        message = 'An account already exists with this email address.';\n        break;\n      case 'auth/weak-password':\n        message = 'The password must be at least 6 characters long.';\n        break;\n      case 'auth/popup-closed-by-user':\n        message = 'The sign-in popup was closed before completing sign in.';\n        break;\n    }\n\n    return {\n      code: errorCode,\n      message,\n      originalError: error,\n    };\n  }\n\n  // Get Firebase Auth instance (for advanced usage)\n  getAuth(): FirebaseAuth {\n    return this.auth;\n  }\n\n  // Get Firebase App instance\n  getApp(): FirebaseApp {\n    return this.app;\n  }\n}\n\n// Singleton instance\nlet authInstance: AuthService | null = null;\n\n// Initialize auth service\nexport function initAuth(config: AuthConfig): AuthService {\n  if (!authInstance) {\n    authInstance = new AuthService(config);\n    authInstance.initialize();\n  }\n  return authInstance;\n}\n\n// Get auth instance\nexport function getAuthInstance(): AuthService {\n  if (!authInstance) {\n    throw new Error('Auth not initialized. Call initAuth first.');\n  }\n  return authInstance;\n}","import { \n  UserInvite, \n  InviteUserOptions, \n  InviteTemplate,\n  BulkInviteResult,\n  InvitePreview,\n  InviteAssignment\n} from '../types';\nimport { getAuthInstance } from './auth.service';\n\nclass InviteService {\n  private invites: Map<string, UserInvite> = new Map();\n  private templates: Map<string, InviteTemplate> = new Map();\n  private inviteExpirationMs = 7 * 24 * 60 * 60 * 1000; // 7 days default\n\n  // Invite a single user\n  async inviteUser(options: InviteUserOptions | string, role?: string, department?: string): Promise<UserInvite> {\n    let inviteOptions: InviteUserOptions;\n    \n    // Support simple invocation\n    if (typeof options === 'string') {\n      inviteOptions = {\n        email: options,\n        role,\n        department,\n        sendEmail: true,\n        expiresIn: '7d',\n      };\n    } else {\n      inviteOptions = options;\n    }\n\n    // Validate email\n    if (!this.isValidEmail(inviteOptions.email)) {\n      throw new Error('Invalid email address');\n    }\n\n    // Check if user already invited\n    const existingInvite = this.findInviteByEmail(inviteOptions.email);\n    if (existingInvite && existingInvite.status === 'pending') {\n      throw new Error('User already has a pending invitation');\n    }\n\n    // Create invite\n    const invite: UserInvite = {\n      id: this.generateInviteId(),\n      email: inviteOptions.email,\n      status: 'pending',\n      assignments: {\n        immediate: inviteOptions.immediate || {\n          role: inviteOptions.role,\n          department: inviteOptions.department,\n          permissions: inviteOptions.permissions,\n        },\n        conditional: inviteOptions.conditional,\n        deferred: inviteOptions.deferred,\n      },\n      invitedBy: await this.getCurrentUserId(),\n      invitedAt: new Date(),\n      expiresAt: this.calculateExpirationDate(inviteOptions.expiresIn || '7d'),\n      metadata: inviteOptions.metadata,\n    };\n\n    // Store invite\n    this.invites.set(invite.id, invite);\n\n    // Send email if requested\n    if (inviteOptions.sendEmail !== false) {\n      await this.sendInviteEmail(invite);\n    }\n\n    return invite;\n  }\n\n  // Bulk invite users\n  async inviteUsers(invites: InviteUserOptions[]): Promise<BulkInviteResult> {\n    const result: BulkInviteResult = {\n      successful: [],\n      failed: [],\n    };\n\n    for (const inviteOptions of invites) {\n      try {\n        const invite = await this.inviteUser(inviteOptions);\n        result.successful.push(invite.email);\n      } catch (error: any) {\n        result.failed.push({\n          email: inviteOptions.email,\n          error: error.message,\n        });\n      }\n    }\n\n    return result;\n  }\n\n  // Define an invite template\n  async defineInviteTemplate(id: string, template: Omit<InviteTemplate, 'id' | 'createdBy' | 'createdAt'>): Promise<void> {\n    const fullTemplate: InviteTemplate = {\n      ...template,\n      id,\n      createdBy: await this.getCurrentUserId(),\n      createdAt: new Date(),\n    };\n    \n    this.templates.set(id, fullTemplate);\n  }\n\n  // Invite user with template\n  async inviteUserWithTemplate(templateId: string, overrides: Partial<InviteUserOptions>): Promise<UserInvite> {\n    const template = this.templates.get(templateId);\n    if (!template) {\n      throw new Error(`Template ${templateId} not found`);\n    }\n\n    const inviteOptions: InviteUserOptions = {\n      ...template.assignments,\n      ...overrides,\n    };\n\n    return this.inviteUser(inviteOptions);\n  }\n\n  // Preview permissions for an invite\n  previewPermissions(options: { role?: string; department?: string }): InvitePreview {\n    // This would typically fetch from your permission configuration\n    const rolePermissions = this.getPermissionsForRole(options.role);\n    const departmentPermissions = this.getPermissionsForDepartment(options.department);\n    \n    const allPermissions = new Set([\n      ...rolePermissions,\n      ...departmentPermissions,\n    ]);\n\n    return {\n      fromRole: rolePermissions,\n      fromDepartment: departmentPermissions,\n      explicit: [],\n      total: Array.from(allPermissions),\n    };\n  }\n\n  // Accept an invite\n  async acceptInvite(inviteId: string): Promise<void> {\n    const invite = this.invites.get(inviteId);\n    if (!invite) {\n      throw new Error('Invite not found');\n    }\n\n    if (invite.status !== 'pending') {\n      throw new Error(`Invite is ${invite.status}`);\n    }\n\n    if (new Date() > invite.expiresAt) {\n      invite.status = 'expired';\n      throw new Error('Invite has expired');\n    }\n\n    // Apply immediate assignments\n    if (invite.assignments.immediate) {\n      await this.applyAssignments(invite.assignments.immediate);\n    }\n\n    // Check conditional assignments\n    if (invite.assignments.conditional) {\n      const shouldApply = await this.checkConditionalAssignment(invite.assignments.conditional);\n      if (shouldApply && invite.assignments.conditional.thenAssign) {\n        await this.applyAssignments(invite.assignments.conditional.thenAssign);\n      }\n    }\n\n    // Mark invite as accepted\n    invite.status = 'accepted';\n    invite.acceptedAt = new Date();\n\n    // Trigger callback if configured\n    const auth = getAuthInstance();\n    const config = (auth as any).config;\n    if (config.onInviteAccepted) {\n      const user = auth.getCurrentUser();\n      if (user) {\n        await config.onInviteAccepted(user, invite);\n      }\n    }\n  }\n\n  // Cancel an invite\n  async cancelInvite(inviteId: string): Promise<void> {\n    const invite = this.invites.get(inviteId);\n    if (!invite) {\n      throw new Error('Invite not found');\n    }\n\n    if (invite.status !== 'pending') {\n      throw new Error('Can only cancel pending invites');\n    }\n\n    invite.status = 'cancelled';\n  }\n\n  // Get invite by ID\n  getInvite(inviteId: string): UserInvite | null {\n    return this.invites.get(inviteId) || null;\n  }\n\n  // Get invite by email\n  getInviteByEmail(email: string): UserInvite | null {\n    return this.findInviteByEmail(email);\n  }\n\n  // Get all invites\n  getAllInvites(filter?: { status?: string; invitedBy?: string }): UserInvite[] {\n    let invites = Array.from(this.invites.values());\n    \n    if (filter?.status) {\n      invites = invites.filter(i => i.status === filter.status);\n    }\n    \n    if (filter?.invitedBy) {\n      invites = invites.filter(i => i.invitedBy === filter.invitedBy);\n    }\n\n    return invites;\n  }\n\n  // Get invite permissions\n  async getInvitePermissions(inviteId: string): Promise<string[]> {\n    const invite = this.invites.get(inviteId);\n    if (!invite) {\n      throw new Error('Invite not found');\n    }\n\n    const permissions = new Set<string>();\n\n    // Add immediate permissions\n    if (invite.assignments.immediate) {\n      const { role, department, permissions: explicitPerms } = invite.assignments.immediate;\n      \n      if (role) {\n        this.getPermissionsForRole(role).forEach(p => permissions.add(p));\n      }\n      \n      if (department) {\n        this.getPermissionsForDepartment(department).forEach(p => permissions.add(p));\n      }\n      \n      if (explicitPerms) {\n        explicitPerms.forEach(p => permissions.add(p));\n      }\n    }\n\n    return Array.from(permissions);\n  }\n\n  // Private helper methods\n  private isValidEmail(email: string): boolean {\n    return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n  }\n\n  private generateInviteId(): string {\n    return `inv_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n\n  private findInviteByEmail(email: string): UserInvite | null {\n    for (const invite of this.invites.values()) {\n      if (invite.email === email) {\n        return invite;\n      }\n    }\n    return null;\n  }\n\n  private calculateExpirationDate(expiresIn: string): Date {\n    const now = new Date();\n    const match = expiresIn.match(/^(\\d+)([hdwmy])$/);\n    \n    if (!match) {\n      return new Date(now.getTime() + this.inviteExpirationMs);\n    }\n\n    const [, value, unit] = match;\n    const num = parseInt(value, 10);\n\n    switch (unit) {\n      case 'h':\n        return new Date(now.getTime() + num * 60 * 60 * 1000);\n      case 'd':\n        return new Date(now.getTime() + num * 24 * 60 * 60 * 1000);\n      case 'w':\n        return new Date(now.getTime() + num * 7 * 24 * 60 * 60 * 1000);\n      case 'm':\n        return new Date(now.getTime() + num * 30 * 24 * 60 * 60 * 1000);\n      case 'y':\n        return new Date(now.getTime() + num * 365 * 24 * 60 * 60 * 1000);\n      default:\n        return new Date(now.getTime() + this.inviteExpirationMs);\n    }\n  }\n\n  private async getCurrentUserId(): Promise<string> {\n    const auth = getAuthInstance();\n    const user = auth.getCurrentUser();\n    return user?.uid || 'system';\n  }\n\n  private async sendInviteEmail(invite: UserInvite): Promise<void> {\n    // This would integrate with the email service\n    console.log(`Sending invite email to ${invite.email}`);\n  }\n\n  private async applyAssignments(assignments: InviteAssignment): Promise<void> {\n    // This would typically call your backend API to set custom claims\n    console.log('Applying assignments:', assignments);\n  }\n\n  private async checkConditionalAssignment(conditional: any): Promise<boolean> {\n    // Check conditions like email domain\n    if (conditional.ifEmailDomain) {\n      const auth = getAuthInstance();\n      const user = auth.getCurrentUser();\n      if (user?.email?.endsWith(`@${conditional.ifEmailDomain}`)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private getPermissionsForRole(role?: string): string[] {\n    // This would fetch from your role configuration\n    const rolePermissions: Record<string, string[]> = {\n      admin: ['manage:users', 'manage:settings', 'edit:content', 'view:content'],\n      editor: ['edit:content', 'publish:content', 'view:content'],\n      viewer: ['view:content'],\n    };\n    \n    return role ? (rolePermissions[role] || []) : [];\n  }\n\n  private getPermissionsForDepartment(department?: string): string[] {\n    // This would fetch from your department configuration\n    const departmentPermissions: Record<string, string[]> = {\n      marketing: ['edit:campaigns', 'view:analytics'],\n      engineering: ['edit:code', 'deploy:apps'],\n    };\n    \n    return department ? (departmentPermissions[department] || []) : [];\n  }\n}\n\n// Singleton instance\nlet inviteInstance: InviteService | null = null;\n\n// Get invite service instance\nexport function getInviteService(): InviteService {\n  if (!inviteInstance) {\n    inviteInstance = new InviteService();\n  }\n  return inviteInstance;\n}","import { useCallback } from 'react';\nimport { useAuthContext } from '../providers/AuthProvider';\n\nexport function useAuth() {\n  const {\n    user,\n    loading,\n    error,\n    isAuthenticated,\n    signIn,\n    signUp,\n    signOut,\n    signInWithProvider,\n    sendPasswordResetEmail,\n  } = useAuthContext();\n\n  const signInWithGoogle = useCallback(() => signInWithProvider('google'), [signInWithProvider]);\n  const signInWithGithub = useCallback(() => signInWithProvider('github'), [signInWithProvider]);\n\n  return {\n    user,\n    loading,\n    error,\n    isAuthenticated,\n    signIn,\n    signUp,\n    signOut,\n    signInWithGoogle,\n    signInWithGithub,\n    sendPasswordResetEmail,\n  };\n}","'use client';\n\nimport React, { createContext, useContext, useEffect, useState, useCallback } from 'react';\nimport { AuthUser, AuthState, AuthConfig } from '../types';\nimport { getAuthInstance, initAuth } from '../services/auth.service';\n\ninterface AuthContextValue extends AuthState {\n  signIn: (email: string, password: string, rememberMe?: boolean) => Promise<AuthUser>;\n  signUp: (email: string, password: string, displayName?: string) => Promise<AuthUser>;\n  signOut: () => Promise<void>;\n  signInWithProvider: (provider: 'google' | 'github') => Promise<AuthUser>;\n  sendPasswordResetEmail: (email: string) => Promise<void>;\n  refreshUser: () => Promise<void>;\n}\n\nconst AuthContext = createContext<AuthContextValue | undefined>(undefined);\n\ninterface AuthProviderProps {\n  children: React.ReactNode;\n  config?: AuthConfig;\n}\n\nexport function AuthProvider({ children, config }: AuthProviderProps) {\n  const [state, setState] = useState<AuthState>({\n    user: null,\n    loading: true,\n    error: null,\n    isAuthenticated: false,\n  });\n\n  // Initialize auth service if config provided\n  useEffect(() => {\n    if (config) {\n      initAuth(config);\n    }\n  }, [config]);\n\n  // Subscribe to auth state changes\n  useEffect(() => {\n    try {\n      const auth = getAuthInstance();\n      \n      const unsubscribe = auth.onAuthStateChange((user) => {\n        setState({\n          user,\n          loading: false,\n          error: null,\n          isAuthenticated: !!user,\n        });\n      });\n\n      return unsubscribe;\n    } catch (error) {\n      setState({\n        user: null,\n        loading: false,\n        error: {\n          code: 'auth/not-initialized',\n          message: 'Auth not initialized. Provide config to AuthProvider.',\n        },\n        isAuthenticated: false,\n      });\n      return () => {}; // Return empty cleanup function\n    }\n  }, []);\n\n  const signIn = useCallback(async (email: string, password: string, rememberMe = false) => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      const { user } = await auth.signIn({ email, password, rememberMe });\n      \n      setState({\n        user,\n        loading: false,\n        error: null,\n        isAuthenticated: true,\n      });\n      \n      return user;\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const signUp = useCallback(async (email: string, password: string, displayName?: string) => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      const { user } = await auth.signUp({ email, password, displayName });\n      \n      setState({\n        user,\n        loading: false,\n        error: null,\n        isAuthenticated: true,\n      });\n      \n      return user;\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const signOut = useCallback(async () => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      await auth.signOut();\n      \n      setState({\n        user: null,\n        loading: false,\n        error: null,\n        isAuthenticated: false,\n      });\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const signInWithProvider = useCallback(async (provider: 'google' | 'github') => {\n    setState(prev => ({ ...prev, loading: true, error: null }));\n    \n    try {\n      const auth = getAuthInstance();\n      const { user } = await auth.signInWith(provider);\n      \n      setState({\n        user,\n        loading: false,\n        error: null,\n        isAuthenticated: true,\n      });\n      \n      return user;\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const sendPasswordResetEmail = useCallback(async (email: string) => {\n    try {\n      const auth = getAuthInstance();\n      await auth.sendPasswordResetEmail(email);\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        error,\n      }));\n      throw error;\n    }\n  }, []);\n\n  const refreshUser = useCallback(async () => {\n    if (!state.user) return;\n    \n    setState(prev => ({ ...prev, loading: true }));\n    \n    try {\n      // Force token refresh to get latest custom claims\n      await state.user.getIdToken(true);\n      const auth = getAuthInstance();\n      const currentUser = auth.getCurrentUser();\n      \n      setState(prev => ({\n        ...prev,\n        user: currentUser,\n        loading: false,\n      }));\n    } catch (error: any) {\n      setState(prev => ({\n        ...prev,\n        loading: false,\n        error,\n      }));\n    }\n  }, [state.user]);\n\n  const value: AuthContextValue = {\n    ...state,\n    signIn,\n    signUp,\n    signOut,\n    signInWithProvider,\n    sendPasswordResetEmail,\n    refreshUser,\n  };\n\n  return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useAuthContext() {\n  const context = useContext(AuthContext);\n  if (context === undefined) {\n    throw new Error('useAuthContext must be used within an AuthProvider');\n  }\n  return context;\n}","import { useAuthContext } from '../providers/AuthProvider';\n\nexport function useUser() {\n  const { user, loading, error, refreshUser } = useAuthContext();\n\n  return {\n    user,\n    loading,\n    error,\n    refreshUser,\n  };\n}","import { useMemo } from 'react';\nimport { useAuthContext } from '../providers/AuthProvider';\n\nexport function useRole(role: string | string[]) {\n  const { user, loading } = useAuthContext();\n\n  const hasRole = useMemo(() => {\n    if (!user || !user.role) return false;\n\n    const roles = Array.isArray(role) ? role : [role];\n    return roles.includes(user.role);\n  }, [user, role]);\n\n  return {\n    hasRole,\n    loading,\n    userRole: user?.role,\n  };\n}","import { useMemo } from 'react';\nimport { useAuthContext } from '../providers/AuthProvider';\n\nexport function usePermission(permission: string | string[]) {\n  const { user, loading } = useAuthContext();\n\n  const hasPermission = useMemo(() => {\n    if (!user || !user.permissions) return false;\n\n    const permissions = Array.isArray(permission) ? permission : [permission];\n    return permissions.every(p => user.permissions?.includes(p));\n  }, [user, permission]);\n\n  const hasAnyPermission = useMemo(() => {\n    if (!user || !user.permissions) return false;\n\n    const permissions = Array.isArray(permission) ? permission : [permission];\n    return permissions.some(p => user.permissions?.includes(p));\n  }, [user, permission]);\n\n  return {\n    hasPermission,\n    hasAnyPermission,\n    loading,\n    userPermissions: user?.permissions || [],\n  };\n}","'use client';\n\nimport React, { useState } from 'react';\nimport {\n  Paper,\n  TextInput,\n  PasswordInput,\n  Button,\n  Stack,\n  Text,\n  Divider,\n  Group,\n  Anchor,\n  Checkbox,\n  Alert,\n  Title,\n  Container,\n} from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { IconAlertCircle, IconBrandGoogle, IconBrandGithub } from '@tabler/icons-react';\nimport { SignInProps, SignInFormData } from './SignIn.types';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useRouter } from 'next/navigation';\n\nexport function SignIn({\n  redirectUrl = '/dashboard',\n  afterSignInUrl,\n  providers = ['email', 'google', 'github'],\n  appearance,\n  onSuccess,\n  onError,\n  rememberMe = true,\n  showDivider = true,\n  forgotPasswordUrl = '/forgot-password',\n  signUpUrl = '/sign-up',\n  initialEmail = '',\n  className,\n  style,\n}: SignInProps) {\n  const router = useRouter();\n  const { signIn, signInWithGoogle, signInWithGithub } = useAuth();\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const form = useForm<SignInFormData>({\n    initialValues: {\n      email: initialEmail,\n      password: '',\n      rememberMe: false,\n    },\n    validate: {\n      email: (value) => (!value ? 'Email is required' : !/^\\S+@\\S+$/.test(value) ? 'Invalid email' : null),\n      password: (value) => (!value ? 'Password is required' : value.length < 6 ? 'Password must be at least 6 characters' : null),\n    },\n  });\n\n  const handleSubmit = async (values: SignInFormData) => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const user = await signIn(values.email, values.password, values.rememberMe);\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignInUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || 'Failed to sign in';\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handleSocialSignIn = async (provider: 'google' | 'github') => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      let user;\n      if (provider === 'google') {\n        user = await signInWithGoogle();\n      } else {\n        user = await signInWithGithub();\n      }\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignInUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || `Failed to sign in with ${provider}`;\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const socialButtons = providers.includes('google') || providers.includes('github') ? (\n    <Stack>\n      {providers.includes('google') && (\n        <Button\n          leftSection={<IconBrandGoogle size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('google')}\n          disabled={loading}\n        >\n          Continue with Google\n        </Button>\n      )}\n      {providers.includes('github') && (\n        <Button\n          leftSection={<IconBrandGithub size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('github')}\n          disabled={loading}\n        >\n          Continue with GitHub\n        </Button>\n      )}\n    </Stack>\n  ) : null;\n\n  const showSocialTop = appearance?.layout?.socialButtonsPlacement === 'top';\n\n  return (\n    <Container size={420} className={className} style={style}>\n      <Paper withBorder shadow=\"md\" p={30} radius=\"md\">\n        <Title order={2} ta=\"center\" mb={5}>\n          Welcome back\n        </Title>\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mb={20}>\n          Sign in to your account to continue\n        </Text>\n\n        {error && (\n          <Alert icon={<IconAlertCircle size={16} />} color=\"red\" mb=\"md\">\n            {error}\n          </Alert>\n        )}\n\n        {showSocialTop && socialButtons}\n        {showSocialTop && showDivider && providers.includes('email') && (\n          <Divider label=\"Or continue with email\" labelPosition=\"center\" my=\"lg\" />\n        )}\n\n        {providers.includes('email') && (\n          <form onSubmit={form.onSubmit(handleSubmit)}>\n            <Stack>\n              <TextInput\n                label=\"Email\"\n                placeholder=\"your@email.com\"\n                required\n                {...form.getInputProps('email')}\n                disabled={loading}\n              />\n\n              <PasswordInput\n                label=\"Password\"\n                placeholder=\"Your password\"\n                required\n                {...form.getInputProps('password')}\n                disabled={loading}\n              />\n\n              <Group justify=\"space-between\">\n                {rememberMe && (\n                  <Checkbox\n                    label=\"Remember me\"\n                    {...form.getInputProps('rememberMe', { type: 'checkbox' })}\n                    disabled={loading}\n                  />\n                )}\n                <Anchor size=\"sm\" href={forgotPasswordUrl}>\n                  Forgot password?\n                </Anchor>\n              </Group>\n\n              <Button type=\"submit\" fullWidth loading={loading}>\n                Sign in\n              </Button>\n            </Stack>\n          </form>\n        )}\n\n        {!showSocialTop && showDivider && socialButtons && providers.includes('email') && (\n          <Divider label=\"Or continue with\" labelPosition=\"center\" my=\"lg\" />\n        )}\n        {!showSocialTop && socialButtons}\n\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mt={20}>\n          Don&apos;t have an account?{' '}\n          <Anchor size=\"sm\" href={signUpUrl}>\n            Sign up\n          </Anchor>\n        </Text>\n      </Paper>\n    </Container>\n  );\n}","'use client';\n\nimport React, { useState } from 'react';\nimport {\n  Paper,\n  TextInput,\n  PasswordInput,\n  Button,\n  Stack,\n  Text,\n  Divider,\n  Group,\n  Anchor,\n  Alert,\n  Title,\n  Container,\n  Progress,\n  Box,\n  List,\n} from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { \n  IconAlertCircle, \n  IconBrandGoogle, \n  IconBrandGithub,\n  IconCheck,\n  IconX \n} from '@tabler/icons-react';\nimport { SignUpProps, SignUpFormData, PasswordRequirements } from './SignUp.types';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useRouter } from 'next/navigation';\n\nexport function SignUp({\n  redirectUrl = '/dashboard',\n  afterSignUpUrl,\n  providers = ['email', 'google', 'github'],\n  appearance,\n  onSuccess,\n  onError,\n  initialValues = {},\n  unsafeMetadata,\n  showDivider = true,\n  signInUrl = '/sign-in',\n  requireDisplayName = true,\n  passwordRequirements = {\n    minLength: 8,\n    requireUppercase: true,\n    requireNumbers: true,\n    requireSymbols: true,\n  },\n  customValidation,\n  className,\n  style,\n}: SignUpProps) {\n  const router = useRouter();\n  const { signUp, signInWithGoogle, signInWithGithub } = useAuth();\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n  const [passwordStrength, setPasswordStrength] = useState(0);\n\n  const form = useForm<SignUpFormData>({\n    initialValues: {\n      email: initialValues.email || '',\n      password: '',\n      confirmPassword: '',\n      firstName: initialValues.firstName || '',\n      lastName: initialValues.lastName || '',\n      displayName: '',\n    },\n    validate: {\n      email: (value) => {\n        if (!value) return 'Email is required';\n        if (!/^\\S+@\\S+$/.test(value)) return 'Invalid email';\n        if (customValidation?.email) return customValidation.email(value);\n        return null;\n      },\n      password: (value) => {\n        if (!value) return 'Password is required';\n        if (customValidation?.password) return customValidation.password(value);\n        \n        const errors = [];\n        if (passwordRequirements.minLength && value.length < passwordRequirements.minLength) {\n          errors.push(`at least ${passwordRequirements.minLength} characters`);\n        }\n        if (passwordRequirements.requireUppercase && !/[A-Z]/.test(value)) {\n          errors.push('one uppercase letter');\n        }\n        if (passwordRequirements.requireNumbers && !/[0-9]/.test(value)) {\n          errors.push('one number');\n        }\n        if (passwordRequirements.requireSymbols && !/[^A-Za-z0-9]/.test(value)) {\n          errors.push('one special character');\n        }\n        \n        return errors.length > 0 ? `Password must contain ${errors.join(', ')}` : null;\n      },\n      confirmPassword: (value, values) => \n        value !== values.password ? 'Passwords do not match' : null,\n      displayName: (value) => {\n        if (requireDisplayName && !value) return 'Display name is required';\n        if (customValidation?.displayName) return customValidation.displayName(value);\n        return null;\n      },\n    },\n  });\n\n  const calculatePasswordStrength = (password: string) => {\n    let strength = 0;\n    if (password.length >= (passwordRequirements.minLength || 8)) strength += 25;\n    if (passwordRequirements.requireUppercase && /[A-Z]/.test(password)) strength += 25;\n    if (passwordRequirements.requireNumbers && /[0-9]/.test(password)) strength += 25;\n    if (passwordRequirements.requireSymbols && /[^A-Za-z0-9]/.test(password)) strength += 25;\n    return strength;\n  };\n\n  const handlePasswordChange = (value: string) => {\n    form.setFieldValue('password', value);\n    setPasswordStrength(calculatePasswordStrength(value));\n  };\n\n  const handleSubmit = async (values: SignUpFormData) => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const displayName = values.displayName || `${values.firstName} ${values.lastName}`.trim();\n      const user = await signUp(values.email, values.password, displayName);\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignUpUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || 'Failed to sign up';\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handleSocialSignIn = async (provider: 'google' | 'github') => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      let user;\n      if (provider === 'google') {\n        user = await signInWithGoogle();\n      } else {\n        user = await signInWithGithub();\n      }\n      \n      if (onSuccess) {\n        onSuccess(user);\n      }\n      \n      const redirectTo = afterSignUpUrl || redirectUrl;\n      router.push(redirectTo);\n    } catch (err: any) {\n      const errorMessage = err.message || `Failed to sign up with ${provider}`;\n      setError(errorMessage);\n      \n      if (onError) {\n        onError(err);\n      }\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const socialButtons = providers.includes('google') || providers.includes('github') ? (\n    <Stack>\n      {providers.includes('google') && (\n        <Button\n          leftSection={<IconBrandGoogle size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('google')}\n          disabled={loading}\n        >\n          Continue with Google\n        </Button>\n      )}\n      {providers.includes('github') && (\n        <Button\n          leftSection={<IconBrandGithub size={20} />}\n          variant=\"default\"\n          fullWidth\n          onClick={() => handleSocialSignIn('github')}\n          disabled={loading}\n        >\n          Continue with GitHub\n        </Button>\n      )}\n    </Stack>\n  ) : null;\n\n  const showSocialTop = appearance?.layout?.socialButtonsPlacement === 'top';\n\n  const getStrengthColor = () => {\n    if (passwordStrength <= 25) return 'red';\n    if (passwordStrength <= 50) return 'orange';\n    if (passwordStrength <= 75) return 'yellow';\n    return 'green';\n  };\n\n  return (\n    <Container size={420} className={className} style={style}>\n      <Paper withBorder shadow=\"md\" p={30} radius=\"md\">\n        <Title order={2} ta=\"center\" mb={5}>\n          Create your account\n        </Title>\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mb={20}>\n          Sign up to get started\n        </Text>\n\n        {error && (\n          <Alert icon={<IconAlertCircle size={16} />} color=\"red\" mb=\"md\">\n            {error}\n          </Alert>\n        )}\n\n        {showSocialTop && socialButtons}\n        {showSocialTop && showDivider && providers.includes('email') && (\n          <Divider label=\"Or sign up with email\" labelPosition=\"center\" my=\"lg\" />\n        )}\n\n        {providers.includes('email') && (\n          <form onSubmit={form.onSubmit(handleSubmit)}>\n            <Stack>\n              <TextInput\n                label=\"Email\"\n                placeholder=\"your@email.com\"\n                required\n                {...form.getInputProps('email')}\n                disabled={loading}\n              />\n\n              {requireDisplayName && (\n                <Group grow>\n                  <TextInput\n                    label=\"First name\"\n                    placeholder=\"John\"\n                    {...form.getInputProps('firstName')}\n                    disabled={loading}\n                  />\n                  <TextInput\n                    label=\"Last name\"\n                    placeholder=\"Doe\"\n                    {...form.getInputProps('lastName')}\n                    disabled={loading}\n                  />\n                </Group>\n              )}\n\n              <PasswordInput\n                label=\"Password\"\n                placeholder=\"Create a password\"\n                required\n                value={form.values.password}\n                onChange={(e) => handlePasswordChange(e.currentTarget.value)}\n                error={form.errors.password}\n                disabled={loading}\n              />\n\n              {form.values.password && (\n                <Box>\n                  <Progress \n                    value={passwordStrength} \n                    color={getStrengthColor()} \n                    size=\"xs\" \n                    mb={5}\n                  />\n                  <Text size=\"xs\" c=\"dimmed\">\n                    Password strength: {passwordStrength}%\n                  </Text>\n                </Box>\n              )}\n\n              <PasswordInput\n                label=\"Confirm password\"\n                placeholder=\"Confirm your password\"\n                required\n                {...form.getInputProps('confirmPassword')}\n                disabled={loading}\n              />\n\n              <Button type=\"submit\" fullWidth loading={loading}>\n                Sign up\n              </Button>\n            </Stack>\n          </form>\n        )}\n\n        {!showSocialTop && showDivider && socialButtons && providers.includes('email') && (\n          <Divider label=\"Or sign up with\" labelPosition=\"center\" my=\"lg\" />\n        )}\n        {!showSocialTop && socialButtons}\n\n        <Text c=\"dimmed\" size=\"sm\" ta=\"center\" mt={20}>\n          Already have an account?{' '}\n          <Anchor size=\"sm\" href={signInUrl}>\n            Sign in\n          </Anchor>\n        </Text>\n      </Paper>\n    </Container>\n  );\n}","'use client';\n\nimport React, { ReactElement } from 'react';\nimport {\n  Menu,\n  Avatar,\n  Text,\n  Group,\n  UnstyledButton,\n  rem,\n  Divider,\n  Box,\n} from '@mantine/core';\nimport {\n  IconLogout,\n  IconSettings,\n  IconUser,\n  IconChevronDown,\n} from '@tabler/icons-react';\nimport { UserButtonProps, UserButtonMenuItemProps, UserButtonLinkProps } from './UserButton.types';\nimport { useAuth } from '../../hooks/useAuth';\nimport { useRouter } from 'next/navigation';\nimport classes from './UserButton.module.css';\n\n// Sub-components\nfunction MenuItems({ children }: { children: ReactNode }) {\n  return <>{children}</>;\n}\n\nfunction Link({ children, href, icon, onClick, color, disabled }: UserButtonLinkProps) {\n  const router = useRouter();\n  \n  const handleClick = () => {\n    if (onClick) {\n      onClick();\n    } else {\n      router.push(href);\n    }\n  };\n\n  return (\n    <Menu.Item\n      leftSection={icon}\n      onClick={handleClick}\n      color={color}\n      disabled={disabled}\n    >\n      {children}\n    </Menu.Item>\n  );\n}\n\nfunction Action({ children, onClick, icon, color, disabled }: UserButtonMenuItemProps) {\n  return (\n    <Menu.Item\n      leftSection={icon}\n      onClick={onClick}\n      color={color}\n      disabled={disabled}\n    >\n      {children}\n    </Menu.Item>\n  );\n}\n\n// Main component\nexport function UserButton({\n  afterSignOutUrl = '/',\n  afterMultiSessionSingleSignOutUrl,\n  afterSwitchSessionUrl,\n  appearance,\n  showName = false,\n  children,\n  className,\n  style,\n}: UserButtonProps) {\n  const { user, signOut } = useAuth();\n  const router = useRouter();\n\n  if (!user) {\n    return null;\n  }\n\n  const handleSignOut = async () => {\n    await signOut();\n    router.push(afterSignOutUrl);\n  };\n\n  const displayName = user.displayName || user.email?.split('@')[0] || 'User';\n  const avatarUrl = user.photoURL || undefined;\n  const initials = displayName\n    .split(' ')\n    .map(n => n[0])\n    .join('')\n    .toUpperCase()\n    .slice(0, 2);\n\n  // Extract custom menu items from children\n  let customMenuItems: ReactElement[] = [];\n  if (children) {\n    React.Children.forEach(children, (child) => {\n      if (React.isValidElement(child) && child.type === MenuItems) {\n        React.Children.forEach(child.props.children, (menuItem) => {\n          if (React.isValidElement(menuItem)) {\n            customMenuItems.push(menuItem);\n          }\n        });\n      }\n    });\n  }\n\n  return (\n    <Menu\n      width={260}\n      position=\"bottom-end\"\n      transitionProps={{ transition: 'pop-top-right' }}\n      withinPortal\n    >\n      <Menu.Target>\n        <UnstyledButton\n          className={`${classes.user} ${className || ''}`}\n          style={style}\n        >\n          <Group gap={7}>\n            <Avatar\n              src={avatarUrl}\n              alt={displayName}\n              radius=\"xl\"\n              size={28}\n              className={appearance?.elements?.avatarBox}\n            >\n              {!avatarUrl && initials}\n            </Avatar>\n            {showName && (\n              <>\n                <Text fw={500} size=\"sm\" lh={1} mr={3}>\n                  {displayName}\n                </Text>\n                <IconChevronDown size={rem(12)} stroke={1.5} />\n              </>\n            )}\n          </Group>\n        </UnstyledButton>\n      </Menu.Target>\n\n      <Menu.Dropdown>\n        <Box px=\"xs\" py=\"sm\">\n          <Group>\n            <Avatar\n              src={avatarUrl}\n              alt={displayName}\n              radius=\"xl\"\n              size={40}\n            >\n              {!avatarUrl && initials}\n            </Avatar>\n            <div style={{ flex: 1 }}>\n              <Text size=\"sm\" fw={500}>\n                {displayName}\n              </Text>\n              <Text c=\"dimmed\" size=\"xs\">\n                {user.email}\n              </Text>\n            </div>\n          </Group>\n        </Box>\n\n        <Divider />\n\n        <Menu.Item\n          leftSection={<IconUser size={rem(14)} stroke={1.5} />}\n          onClick={() => router.push('/user-profile')}\n        >\n          Manage account\n        </Menu.Item>\n\n        {customMenuItems.length > 0 && (\n          <>\n            <Divider />\n            {customMenuItems}\n          </>\n        )}\n\n        <Divider />\n\n        <Menu.Item\n          leftSection={<IconLogout size={rem(14)} stroke={1.5} />}\n          onClick={handleSignOut}\n          color=\"red\"\n        >\n          Sign out\n        </Menu.Item>\n      </Menu.Dropdown>\n    </Menu>\n  );\n}\n\n// Attach sub-components\nUserButton.MenuItems = MenuItems;\nUserButton.Link = Link;\nUserButton.Action = Action;",".user {\n  padding: var(--mantine-spacing-xs);\n  border-radius: var(--mantine-radius-sm);\n  transition: background-color 150ms ease;\n  cursor: pointer;\n  \n  &:hover {\n    background-color: light-dark(var(--mantine-color-gray-0), var(--mantine-color-dark-6));\n  }\n  \n  &:active {\n    transform: translateY(1px);\n  }\n}","'use client';\n\nimport React, { useState, ReactElement } from 'react';\nimport {\n  Container,\n  Paper,\n  Tabs,\n  Stack,\n  Title,\n  Text,\n  Avatar,\n  Group,\n  TextInput,\n  Button,\n  PasswordInput,\n  Alert,\n  Box,\n  rem,\n} from '@mantine/core';\nimport {\n  IconUser,\n  IconLock,\n  IconSettings,\n  IconAlertCircle,\n  IconCheck,\n} from '@tabler/icons-react';\nimport { useForm } from '@mantine/form';\nimport { UserProfileProps, UserProfilePageProps } from './UserProfile.types';\nimport { useUser } from '../../hooks/useUser';\nimport { notifications } from '@mantine/notifications';\n\n// Sub-component for custom pages\nfunction Page({ label, labelIcon, children }: UserProfilePageProps) {\n  return <div data-label={label}>{children}</div>;\n}\n\nexport function UserProfile({\n  appearance,\n  children,\n  className,\n  style,\n}: UserProfileProps) {\n  const { user, refreshUser } = useUser();\n  const [activeTab, setActiveTab] = useState<string | null>('profile');\n  const [loading, setLoading] = useState(false);\n\n  // Extract custom pages from children\n  const customPages: Array<{ label: string; icon?: ReactNode; content: ReactNode }> = [];\n  if (children) {\n    React.Children.forEach(children, (child) => {\n      if (React.isValidElement(child) && child.type === Page) {\n        const pageProps = child.props as UserProfilePageProps;\n        customPages.push({\n          label: pageProps.label,\n          icon: pageProps.labelIcon,\n          content: pageProps.children,\n        });\n      }\n    });\n  }\n\n  const profileForm = useForm({\n    initialValues: {\n      displayName: user?.displayName || '',\n      email: user?.email || '',\n    },\n  });\n\n  const passwordForm = useForm({\n    initialValues: {\n      currentPassword: '',\n      newPassword: '',\n      confirmPassword: '',\n    },\n    validate: {\n      newPassword: (value) => {\n        if (!value) return 'New password is required';\n        if (value.length < 8) return 'Password must be at least 8 characters';\n        return null;\n      },\n      confirmPassword: (value, values) =>\n        value !== values.newPassword ? 'Passwords do not match' : null,\n    },\n  });\n\n  const handleProfileUpdate = async (values: any) => {\n    setLoading(true);\n    try {\n      // Update profile logic here\n      await refreshUser();\n      notifications.show({\n        title: 'Profile updated',\n        message: 'Your profile has been updated successfully',\n        color: 'green',\n        icon: <IconCheck size={16} />,\n      });\n    } catch (error: any) {\n      notifications.show({\n        title: 'Update failed',\n        message: error.message || 'Failed to update profile',\n        color: 'red',\n        icon: <IconAlertCircle size={16} />,\n      });\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handlePasswordUpdate = async (values: any) => {\n    setLoading(true);\n    try {\n      // Update password logic here\n      notifications.show({\n        title: 'Password updated',\n        message: 'Your password has been updated successfully',\n        color: 'green',\n        icon: <IconCheck size={16} />,\n      });\n      passwordForm.reset();\n    } catch (error: any) {\n      notifications.show({\n        title: 'Update failed',\n        message: error.message || 'Failed to update password',\n        color: 'red',\n        icon: <IconAlertCircle size={16} />,\n      });\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  if (!user) {\n    return null;\n  }\n\n  const displayName = user.displayName || user.email?.split('@')[0] || 'User';\n  const avatarUrl = user.photoURL || undefined;\n  const initials = displayName\n    .split(' ')\n    .map(n => n[0])\n    .join('')\n    .toUpperCase()\n    .slice(0, 2);\n\n  return (\n    <Container size=\"md\" className={className} style={style}>\n      <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n        <Stack>\n          <Box>\n            <Group mb=\"md\">\n              <Avatar\n                src={avatarUrl}\n                alt={displayName}\n                radius=\"xl\"\n                size=\"xl\"\n              >\n                {!avatarUrl && initials}\n              </Avatar>\n              <div>\n                <Title order={3}>{displayName}</Title>\n                <Text c=\"dimmed\" size=\"sm\">{user.email}</Text>\n              </div>\n            </Group>\n          </Box>\n\n          <Tabs value={activeTab} onChange={setActiveTab}>\n            <Tabs.List>\n              <Tabs.Tab value=\"profile\" leftSection={<IconUser size={rem(16)} />}>\n                Profile\n              </Tabs.Tab>\n              <Tabs.Tab value=\"security\" leftSection={<IconLock size={rem(16)} />}>\n                Security\n              </Tabs.Tab>\n              {customPages.map((page, index) => (\n                <Tabs.Tab\n                  key={index}\n                  value={`custom-${index}`}\n                  leftSection={page.icon}\n                >\n                  {page.label}\n                </Tabs.Tab>\n              ))}\n            </Tabs.List>\n\n            <Tabs.Panel value=\"profile\" pt=\"md\">\n              <form onSubmit={profileForm.onSubmit(handleProfileUpdate)}>\n                <Stack>\n                  <TextInput\n                    label=\"Display name\"\n                    placeholder=\"Your name\"\n                    {...profileForm.getInputProps('displayName')}\n                    disabled={loading}\n                  />\n                  \n                  <TextInput\n                    label=\"Email\"\n                    placeholder=\"your@email.com\"\n                    {...profileForm.getInputProps('email')}\n                    disabled\n                  />\n\n                  <Group>\n                    <Button type=\"submit\" loading={loading}>\n                      Update profile\n                    </Button>\n                  </Group>\n                </Stack>\n              </form>\n            </Tabs.Panel>\n\n            <Tabs.Panel value=\"security\" pt=\"md\">\n              <form onSubmit={passwordForm.onSubmit(handlePasswordUpdate)}>\n                <Stack>\n                  <PasswordInput\n                    label=\"Current password\"\n                    placeholder=\"Enter current password\"\n                    {...passwordForm.getInputProps('currentPassword')}\n                    disabled={loading}\n                  />\n                  \n                  <PasswordInput\n                    label=\"New password\"\n                    placeholder=\"Enter new password\"\n                    {...passwordForm.getInputProps('newPassword')}\n                    disabled={loading}\n                  />\n                  \n                  <PasswordInput\n                    label=\"Confirm new password\"\n                    placeholder=\"Confirm new password\"\n                    {...passwordForm.getInputProps('confirmPassword')}\n                    disabled={loading}\n                  />\n\n                  <Group>\n                    <Button type=\"submit\" loading={loading}>\n                      Update password\n                    </Button>\n                  </Group>\n                </Stack>\n              </form>\n            </Tabs.Panel>\n\n            {customPages.map((page, index) => (\n              <Tabs.Panel key={index} value={`custom-${index}`} pt=\"md\">\n                {page.content}\n              </Tabs.Panel>\n            ))}\n          </Tabs>\n        </Stack>\n      </Paper>\n    </Container>\n  );\n}\n\n// Attach sub-component\nUserProfile.Page = Page;","'use client';\n\nimport { ReactNode } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\ninterface SignedInProps {\n  children: ReactNode;\n}\n\nexport function SignedIn({ children }: SignedInProps) {\n  const { isAuthenticated } = useAuth();\n  \n  if (!isAuthenticated) {\n    return null;\n  }\n\n  return <>{children}</>;\n}","'use client';\n\nimport { ReactNode } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\ninterface SignedOutProps {\n  children: ReactNode;\n}\n\nexport function SignedOut({ children }: SignedOutProps) {\n  const { isAuthenticated } = useAuth();\n  \n  if (isAuthenticated) {\n    return null;\n  }\n\n  return <>{children}</>;\n}","'use client';\n\nimport { ReactNode } from 'react';\nimport { useRole } from '../../hooks/useRole';\nimport { usePermission } from '../../hooks/usePermission';\n\ninterface ProtectProps {\n  children: ReactNode;\n  fallback?: ReactNode;\n  role?: string | string[];\n  permission?: string | string[];\n  condition?: 'and' | 'or';\n}\n\nexport function Protect({ \n  children, \n  fallback = null, \n  role, \n  permission,\n  condition = 'and' \n}: ProtectProps) {\n  const { hasRole } = useRole(role || []);\n  const { hasPermission, hasAnyPermission } = usePermission(permission || []);\n\n  let isAuthorized = true;\n\n  if (role && permission) {\n    if (condition === 'and') {\n      isAuthorized = hasRole && hasPermission;\n    } else {\n      isAuthorized = hasRole || hasAnyPermission;\n    }\n  } else if (role) {\n    isAuthorized = hasRole;\n  } else if (permission) {\n    isAuthorized = hasPermission;\n  }\n\n  if (!isAuthorized) {\n    return <>{fallback}</>;\n  }\n\n  return <>{children}</>;\n}","'use client';\n\nimport { useEffect } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { useAuth } from '../../hooks/useAuth';\n\ninterface RedirectToSignInProps {\n  returnUrl?: string;\n  signInUrl?: string;\n}\n\nexport function RedirectToSignIn({ \n  returnUrl,\n  signInUrl = '/sign-in' \n}: RedirectToSignInProps) {\n  const router = useRouter();\n  const { isAuthenticated, loading } = useAuth();\n\n  useEffect(() => {\n    if (!loading && !isAuthenticated) {\n      const url = new URL(signInUrl, window.location.origin);\n      if (returnUrl) {\n        url.searchParams.set('returnUrl', returnUrl);\n      }\n      router.push(url.toString());\n    }\n  }, [isAuthenticated, loading, router, signInUrl, returnUrl]);\n\n  // Show nothing while checking auth\n  return null;\n}","import {\n  EmailConfig,\n  EmailProvider,\n  SendEmailOptions,\n  EmailResult,\n  EmailError,\n  EmailTemplate,\n  BatchEmailOptions,\n  BatchEmailResult,\n} from '../types';\n\nexport class Email {\n  private config: EmailConfig;\n  private templates: Map<string, EmailTemplate> = new Map();\n  private provider: any; // Provider implementation\n\n  constructor(config: EmailConfig) {\n    this.config = config;\n    this.initializeProvider();\n  }\n\n  // Register an email template\n  registerTemplate<T = Record<string, any>>(template: EmailTemplate<T>): void {\n    this.templates.set(template.id, template);\n  }\n\n  // Send a single email\n  async send<T = Record<string, any>>(options: SendEmailOptions<T>): Promise<EmailResult> {\n    try {\n      // Get template if using template ID\n      let template: EmailTemplate<T> | undefined;\n      if (typeof options.template === 'string') {\n        template = this.templates.get(options.template) as EmailTemplate<T>;\n        if (!template) {\n          throw new Error(`Template '${options.template}' not found`);\n        }\n      } else {\n        template = options.template;\n      }\n\n      // Compile template\n      const compiled = this.compileTemplate(template, options.data);\n\n      // Prepare email data\n      const emailData = {\n        to: Array.isArray(options.to) ? options.to : [options.to],\n        from: options.from || this.config.from,\n        replyTo: options.replyTo || this.config.replyTo,\n        subject: compiled.subject,\n        html: compiled.html,\n        text: compiled.text,\n        cc: options.cc,\n        bcc: options.bcc,\n        attachments: options.attachments,\n        tags: options.tags,\n        metadata: {\n          ...options.metadata,\n          templateId: template?.id,\n        },\n      };\n\n      // Handle scheduling\n      if (options.schedule) {\n        return this.scheduleEmail(emailData, options.schedule);\n      }\n\n      // Send email via provider\n      const result = await this.sendViaProvider(emailData);\n\n      // Call onSent callback if configured\n      if (this.config.onSent) {\n        await this.config.onSent(result);\n      }\n\n      return result;\n    } catch (error: any) {\n      const emailError: EmailError = {\n        code: error.code || 'email/send-failed',\n        message: error.message || 'Failed to send email',\n        provider: this.config.provider,\n        originalError: error,\n      };\n\n      if (this.config.onError) {\n        this.config.onError(emailError);\n      }\n\n      throw emailError;\n    }\n  }\n\n  // Send batch emails\n  async sendBatch<T = Record<string, any>>(\n    options: BatchEmailOptions<T>\n  ): Promise<BatchEmailResult> {\n    const batchId = this.generateBatchId();\n    const results: EmailResult[] = [];\n    let successful = 0;\n    let failed = 0;\n\n    // Process batch\n    for (const recipient of options.recipients) {\n      try {\n        const result = await this.send({\n          ...options,\n          to: recipient.to,\n          data: { ...options.recipients[0].data, ...recipient.data },\n          metadata: {\n            ...recipient.metadata,\n            batchId,\n          },\n        });\n        \n        results.push(result);\n        successful++;\n      } catch (error) {\n        failed++;\n        results.push({\n          id: '',\n          provider: this.config.provider,\n          to: [recipient.to],\n          sentAt: new Date(),\n          status: 'failed',\n          error: error.message,\n        });\n      }\n    }\n\n    return {\n      batchId,\n      total: options.recipients.length,\n      successful,\n      failed,\n      results,\n    };\n  }\n\n  // Get a template by ID\n  getTemplate(id: string): EmailTemplate | undefined {\n    return this.templates.get(id);\n  }\n\n  // List all templates\n  listTemplates(): EmailTemplate[] {\n    return Array.from(this.templates.values());\n  }\n\n  // Private methods\n  private initializeProvider(): void {\n    // Initialize provider based on config\n    switch (this.config.provider) {\n      case 'resend':\n        // this.provider = new ResendProvider(this.config);\n        break;\n      case 'sendgrid':\n        // this.provider = new SendGridProvider(this.config);\n        break;\n      default:\n        console.warn(`Provider ${this.config.provider} not implemented yet`);\n    }\n  }\n\n  private compileTemplate<T>(\n    template: EmailTemplate<T> | undefined,\n    data?: T\n  ): { subject: string; html: string; text?: string } {\n    if (!template) {\n      return {\n        subject: 'No Subject',\n        html: '<p>No content</p>',\n        text: 'No content',\n      };\n    }\n\n    // Compile subject\n    const subject = typeof template.subject === 'function'\n      ? template.subject(data || {} as T)\n      : template.subject;\n\n    // Compile HTML body\n    let html = typeof template.body.html === 'function'\n      ? template.body.html(data || {} as T)\n      : template.body.html;\n\n    // Compile text body\n    let text: string | undefined;\n    if (template.body.text) {\n      text = typeof template.body.text === 'function'\n        ? template.body.text(data || {} as T)\n        : template.body.text;\n    }\n\n    // Add footer if not disabled\n    if (template.includeFooter !== false && this.config.footer) {\n      const footerHtml = this.generateFooterHtml();\n      const footerText = this.generateFooterText();\n\n      if (footerHtml) {\n        html = this.injectFooterHtml(html, footerHtml);\n      }\n\n      if (footerText && text) {\n        text = `${text}\\n\\n${footerText}`;\n      }\n    }\n\n    return { subject, html, text };\n  }\n\n  private generateFooterHtml(): string {\n    const footer = this.config.footer;\n    if (!footer) return '';\n\n    let footerHtml = '<div style=\"margin-top: 40px; padding-top: 20px; border-top: 1px solid #e2e8f0; font-size: 14px; color: #718096;\">';\n\n    // Custom footer HTML\n    if (footer.html) {\n      const customHtml = typeof footer.html === 'function' ? footer.html() : footer.html;\n      footerHtml += customHtml;\n    } else {\n      // Build default footer\n      const parts: string[] = [];\n\n      // Disclaimer\n      if (footer.disclaimer?.enabled && footer.disclaimer.text) {\n        parts.push(`<p style=\"margin: 10px 0; font-style: italic;\">${footer.disclaimer.text}</p>`);\n      }\n\n      // Unsubscribe\n      if (footer.unsubscribe?.enabled) {\n        const unsubUrl = footer.unsubscribe.url || '#unsubscribe';\n        const unsubText = footer.unsubscribe.text || 'Unsubscribe';\n        parts.push(`<p style=\"margin: 10px 0;\"><a href=\"${unsubUrl}\" style=\"color: #3182ce;\">${unsubText}</a></p>`);\n      }\n\n      // Privacy\n      if (footer.privacy?.enabled) {\n        const privacyUrl = footer.privacy.url || '#privacy';\n        const privacyText = footer.privacy.text || 'Privacy Policy';\n        parts.push(`<p style=\"margin: 10px 0;\"><a href=\"${privacyUrl}\" style=\"color: #3182ce;\">${privacyText}</a></p>`);\n      }\n\n      // Company info\n      if (footer.company) {\n        let companyHtml = `<p style=\"margin: 10px 0;\">© ${new Date().getFullYear()} ${footer.company.name}`;\n        if (footer.company.address) {\n          companyHtml += ` | ${footer.company.address}`;\n        }\n        if (footer.company.website) {\n          companyHtml += ` | <a href=\"${footer.company.website}\" style=\"color: #3182ce;\">${footer.company.website}</a>`;\n        }\n        companyHtml += '</p>';\n        parts.push(companyHtml);\n      }\n\n      footerHtml += parts.join('');\n    }\n\n    footerHtml += '</div>';\n    return footerHtml;\n  }\n\n  private generateFooterText(): string {\n    const footer = this.config.footer;\n    if (!footer) return '';\n\n    if (footer.text) {\n      return typeof footer.text === 'function' ? footer.text() : footer.text;\n    }\n\n    // Build default text footer\n    const parts: string[] = [];\n\n    if (footer.disclaimer?.enabled && footer.disclaimer.text) {\n      parts.push(footer.disclaimer.text);\n    }\n\n    if (footer.unsubscribe?.enabled) {\n      const unsubText = footer.unsubscribe.text || 'Unsubscribe';\n      const unsubUrl = footer.unsubscribe.url || '#unsubscribe';\n      parts.push(`${unsubText}: ${unsubUrl}`);\n    }\n\n    if (footer.privacy?.enabled) {\n      const privacyText = footer.privacy.text || 'Privacy Policy';\n      const privacyUrl = footer.privacy.url || '#privacy';\n      parts.push(`${privacyText}: ${privacyUrl}`);\n    }\n\n    if (footer.company) {\n      let companyText = `© ${new Date().getFullYear()} ${footer.company.name}`;\n      if (footer.company.address) {\n        companyText += ` | ${footer.company.address}`;\n      }\n      if (footer.company.website) {\n        companyText += ` | ${footer.company.website}`;\n      }\n      parts.push(companyText);\n    }\n\n    return parts.join('\\n');\n  }\n\n  private injectFooterHtml(html: string, footerHtml: string): string {\n    // Try to inject before closing body tag\n    if (html.includes('</body>')) {\n      return html.replace('</body>', `${footerHtml}</body>`);\n    }\n    \n    // Otherwise append to end\n    return html + footerHtml;\n  }\n\n  private async sendViaProvider(data: any): Promise<EmailResult> {\n    // Simulate sending (replace with actual provider implementation)\n    const result: EmailResult = {\n      id: this.generateEmailId(),\n      provider: this.config.provider,\n      to: data.to,\n      template: data.metadata?.templateId,\n      sentAt: new Date(),\n      status: 'sent',\n    };\n\n    // Simulate async send\n    await new Promise(resolve => setTimeout(resolve, 100));\n\n    return result;\n  }\n\n  private async scheduleEmail(data: any, scheduleDate: Date): Promise<EmailResult> {\n    // Simulate scheduling (replace with actual implementation)\n    const result: EmailResult = {\n      id: this.generateEmailId(),\n      provider: this.config.provider,\n      to: data.to,\n      template: data.metadata?.templateId,\n      sentAt: scheduleDate,\n      status: 'scheduled',\n    };\n\n    return result;\n  }\n\n  private generateEmailId(): string {\n    return `email_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n\n  private generateBatchId(): string {\n    return `batch_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n}","import { useCallback, useState } from 'react';\nimport { Email } from '../services/email.service';\nimport { SendEmailOptions, EmailResult, EmailError, EmailProvider } from '../types';\n\nexport function useEmail(emailService: Email) {\n  const [sending, setSending] = useState(false);\n  const [error, setError] = useState<EmailError | null>(null);\n  const [lastResult, setLastResult] = useState<EmailResult | null>(null);\n\n  const send = useCallback(async <T = Record<string, any>>(\n    options: SendEmailOptions<T>\n  ): Promise<EmailResult> => {\n    setSending(true);\n    setError(null);\n    \n    try {\n      const result = await emailService.send(options);\n      setLastResult(result);\n      return result;\n    } catch (err: any) {\n      const emailError: EmailError = {\n        code: err.code || 'email/send-failed',\n        message: err.message || 'Failed to send email',\n        provider: 'resend' as EmailProvider,\n        originalError: err,\n      };\n      setError(emailError);\n      throw emailError;\n    } finally {\n      setSending(false);\n    }\n  }, [emailService]);\n\n  const sendBatch = useCallback(async <T = Record<string, any>>(\n    options: any\n  ) => {\n    setSending(true);\n    setError(null);\n    \n    try {\n      const result = await emailService.sendBatch(options);\n      return result;\n    } catch (err: any) {\n      const emailError: EmailError = {\n        code: err.code || 'email/batch-failed',\n        message: err.message || 'Failed to send batch emails',\n        provider: 'resend' as EmailProvider,\n        originalError: err,\n      };\n      setError(emailError);\n      throw emailError;\n    } finally {\n      setSending(false);\n    }\n  }, [emailService]);\n\n  return {\n    send,\n    sendBatch,\n    sending,\n    error,\n    lastResult,\n  };\n}","import { useState, useEffect } from 'react';\nimport { Email } from '../services/email.service';\nimport { EmailTemplate } from '../types';\n\nexport function useEmailTemplate(emailService: Email, templateId: string) {\n  const [template, setTemplate] = useState<EmailTemplate | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  useEffect(() => {\n    try {\n      const tmpl = emailService.getTemplate(templateId);\n      if (tmpl) {\n        setTemplate(tmpl);\n      } else {\n        setError(new Error(`Template '${templateId}' not found`));\n      }\n    } catch (err: any) {\n      setError(err);\n    } finally {\n      setLoading(false);\n    }\n  }, [emailService, templateId]);\n\n  const reload = () => {\n    setLoading(true);\n    setError(null);\n    \n    try {\n      const tmpl = emailService.getTemplate(templateId);\n      if (tmpl) {\n        setTemplate(tmpl);\n      } else {\n        setError(new Error(`Template '${templateId}' not found`));\n      }\n    } catch (err: any) {\n      setError(err);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return {\n    template,\n    loading,\n    error,\n    reload,\n  };\n}","'use client';\n\nimport React, { useState, useMemo } from 'react';\nimport {\n  Paper,\n  Stack,\n  Title,\n  Text,\n  SegmentedControl,\n  Box,\n  Group,\n  Badge,\n  ScrollArea,\n  ActionIcon,\n  Tooltip,\n} from '@mantine/core';\nimport { IconDeviceMobile, IconDeviceDesktop, IconCode } from '@tabler/icons-react';\nimport { EmailTemplate } from '../../types';\n\ninterface EmailPreviewProps {\n  template: EmailTemplate | string;\n  data?: any;\n  showDeviceFrames?: boolean;\n  className?: string;\n}\n\nexport function EmailPreview({\n  template,\n  data = {},\n  showDeviceFrames = true,\n  className,\n}: EmailPreviewProps) {\n  const [viewMode, setViewMode] = useState<'desktop' | 'mobile' | 'html'>('desktop');\n  const [format, setFormat] = useState<'html' | 'text'>('html');\n\n  // Compile template\n  const compiled = useMemo(() => {\n    if (typeof template === 'string') {\n      return {\n        subject: 'No subject',\n        html: '<p>Template not found</p>',\n        text: 'Template not found',\n      };\n    }\n\n    const subject = typeof template.subject === 'function'\n      ? template.subject(data)\n      : template.subject;\n\n    const html = typeof template.body.html === 'function'\n      ? template.body.html(data)\n      : template.body.html;\n\n    const text = template.body.text\n      ? typeof template.body.text === 'function'\n        ? template.body.text(data)\n        : template.body.text\n      : 'Text version not available';\n\n    return { subject, html, text };\n  }, [template, data]);\n\n  const renderContent = () => {\n    if (format === 'text') {\n      return (\n        <Box\n          p=\"md\"\n          style={{\n            fontFamily: 'monospace',\n            whiteSpace: 'pre-wrap',\n            backgroundColor: '#f8f9fa',\n          }}\n        >\n          {compiled.text}\n        </Box>\n      );\n    }\n\n    if (viewMode === 'html') {\n      return (\n        <Box\n          p=\"md\"\n          style={{\n            fontFamily: 'monospace',\n            fontSize: '12px',\n            backgroundColor: '#1e1e1e',\n            color: '#d4d4d4',\n            overflow: 'auto',\n          }}\n        >\n          <pre>{compiled.html}</pre>\n        </Box>\n      );\n    }\n\n    const content = (\n      <Box\n        style={{\n          width: '100%',\n          height: '100%',\n          backgroundColor: 'white',\n        }}\n        dangerouslySetInnerHTML={{ __html: compiled.html }}\n      />\n    );\n\n    if (!showDeviceFrames) {\n      return content;\n    }\n\n    if (viewMode === 'mobile') {\n      return (\n        <Box\n          style={{\n            width: 375,\n            height: 667,\n            margin: '0 auto',\n            border: '16px solid #333',\n            borderRadius: 36,\n            overflow: 'hidden',\n            boxShadow: '0 0 0 2px #666',\n          }}\n        >\n          <ScrollArea h={635}>{content}</ScrollArea>\n        </Box>\n      );\n    }\n\n    return (\n      <Box\n        style={{\n          width: '100%',\n          maxWidth: 1200,\n          margin: '0 auto',\n          border: '1px solid #e2e8f0',\n          borderRadius: 8,\n          overflow: 'hidden',\n        }}\n      >\n        <Box\n          style={{\n            backgroundColor: '#f8f9fa',\n            padding: '8px 16px',\n            borderBottom: '1px solid #e2e8f0',\n          }}\n        >\n          <Group gap=\"xs\">\n            <Box\n              style={{\n                width: 12,\n                height: 12,\n                borderRadius: '50%',\n                backgroundColor: '#ff5f57',\n              }}\n            />\n            <Box\n              style={{\n                width: 12,\n                height: 12,\n                borderRadius: '50%',\n                backgroundColor: '#ffbd2e',\n              }}\n            />\n            <Box\n              style={{\n                width: 12,\n                height: 12,\n                borderRadius: '50%',\n                backgroundColor: '#28ca42',\n              }}\n            />\n          </Group>\n        </Box>\n        <ScrollArea h={600}>{content}</ScrollArea>\n      </Box>\n    );\n  };\n\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\" className={className}>\n      <Stack>\n        <Group justify=\"space-between\" align=\"center\">\n          <div>\n            <Title order={4}>Email Preview</Title>\n            <Text size=\"sm\" c=\"dimmed\">\n              Subject: {compiled.subject}\n            </Text>\n          </div>\n          \n          <Group>\n            <SegmentedControl\n              value={format}\n              onChange={(value) => setFormat(value as 'html' | 'text')}\n              data={[\n                { label: 'HTML', value: 'html' },\n                { label: 'Text', value: 'text' },\n              ]}\n            />\n            \n            {format === 'html' && (\n              <Group gap=\"xs\">\n                <Tooltip label=\"Desktop view\">\n                  <ActionIcon\n                    variant={viewMode === 'desktop' ? 'filled' : 'default'}\n                    onClick={() => setViewMode('desktop')}\n                  >\n                    <IconDeviceDesktop size={18} />\n                  </ActionIcon>\n                </Tooltip>\n                \n                <Tooltip label=\"Mobile view\">\n                  <ActionIcon\n                    variant={viewMode === 'mobile' ? 'filled' : 'default'}\n                    onClick={() => setViewMode('mobile')}\n                  >\n                    <IconDeviceMobile size={18} />\n                  </ActionIcon>\n                </Tooltip>\n                \n                <Tooltip label=\"HTML source\">\n                  <ActionIcon\n                    variant={viewMode === 'html' ? 'filled' : 'default'}\n                    onClick={() => setViewMode('html')}\n                  >\n                    <IconCode size={18} />\n                  </ActionIcon>\n                </Tooltip>\n              </Group>\n            )}\n          </Group>\n        </Group>\n\n        <Box>{renderContent()}</Box>\n      </Stack>\n    </Paper>\n  );\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\n\ninterface EmailTemplateEditorProps {\n  template: any;\n  onChange: (template: any) => void;\n  testData?: any;\n}\n\nexport function EmailTemplateEditor({ template, onChange, testData }: EmailTemplateEditorProps) {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Email Template Editor</Title>\n      <Text c=\"dimmed\" size=\"sm\">Template editor coming soon</Text>\n    </Paper>\n  );\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\n\ninterface EmailComposerProps {\n  templates: string[];\n  onSend: (email: any) => Promise<void>;\n}\n\nexport function EmailComposer({ templates, onSend }: EmailComposerProps) {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Email Composer</Title>\n      <Text c=\"dimmed\" size=\"sm\">Email composer coming soon</Text>\n    </Paper>\n  );\n}","import React from 'react';\nimport { EmailTemplate } from '../types';\n\ninterface WelcomeEmailData {\n  name: string;\n  email: string;\n  confirmationUrl?: string;\n}\n\nexport const WelcomeEmailTemplate: EmailTemplate<WelcomeEmailData> = {\n  id: 'welcome',\n  name: 'Welcome Email',\n  subject: ({ name }) => `Welcome to our app, ${name}!`,\n  preview: 'Welcome to our community',\n  body: {\n    html: (data) => `\n      <!DOCTYPE html>\n      <html>\n        <head>\n          <meta charset=\"utf-8\">\n          <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n          <title>Welcome</title>\n          <style>\n            body {\n              font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n              line-height: 1.6;\n              color: #333;\n              max-width: 600px;\n              margin: 0 auto;\n              padding: 20px;\n            }\n            .header {\n              background-color: #007bff;\n              color: white;\n              padding: 30px;\n              text-align: center;\n              border-radius: 8px 8px 0 0;\n            }\n            .content {\n              background-color: #f8f9fa;\n              padding: 30px;\n              border-radius: 0 0 8px 8px;\n            }\n            .button {\n              display: inline-block;\n              padding: 12px 24px;\n              background-color: #007bff;\n              color: white;\n              text-decoration: none;\n              border-radius: 5px;\n              margin-top: 20px;\n            }\n            .footer {\n              text-align: center;\n              margin-top: 30px;\n              color: #6c757d;\n              font-size: 14px;\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"header\">\n            <h1>Welcome to Our App!</h1>\n          </div>\n          <div class=\"content\">\n            <h2>Hi ${data.name},</h2>\n            <p>We're excited to have you join our community! Your account has been successfully created.</p>\n            <p>Here are your account details:</p>\n            <ul>\n              <li><strong>Email:</strong> ${data.email}</li>\n            </ul>\n            ${data.confirmationUrl ? `\n              <p>Please confirm your email address by clicking the button below:</p>\n              <a href=\"${data.confirmationUrl}\" class=\"button\">Confirm Email</a>\n            ` : ''}\n            <p>If you have any questions, feel free to reach out to our support team.</p>\n            <p>Best regards,<br>The Team</p>\n          </div>\n          <div class=\"footer\">\n            <p>© 2024 Your Company. All rights reserved.</p>\n          </div>\n        </body>\n      </html>\n    `,\n    text: (data) => `\nWelcome to Our App!\n\nHi ${data.name},\n\nWe're excited to have you join our community! Your account has been successfully created.\n\nHere are your account details:\n- Email: ${data.email}\n\n${data.confirmationUrl ? `Please confirm your email address by visiting: ${data.confirmationUrl}` : ''}\n\nIf you have any questions, feel free to reach out to our support team.\n\nBest regards,\nThe Team\n\n© 2024 Your Company. All rights reserved.\n    `.trim(),\n  },\n};\n\nexport function WelcomeEmail(props: WelcomeEmailData) {\n  return (\n    <div style={{ fontFamily: 'Arial, sans-serif', maxWidth: 600, margin: '0 auto' }}>\n      <div style={{ backgroundColor: '#007bff', color: 'white', padding: 30, textAlign: 'center' }}>\n        <h1>Welcome to Our App!</h1>\n      </div>\n      <div style={{ backgroundColor: '#f8f9fa', padding: 30 }}>\n        <h2>Hi {props.name},</h2>\n        <p>We're excited to have you join our community! Your account has been successfully created.</p>\n        <p>Here are your account details:</p>\n        <ul>\n          <li><strong>Email:</strong> {props.email}</li>\n        </ul>\n        {props.confirmationUrl && (\n          <>\n            <p>Please confirm your email address by clicking the button below:</p>\n            <a \n              href={props.confirmationUrl} \n              style={{\n                display: 'inline-block',\n                padding: '12px 24px',\n                backgroundColor: '#007bff',\n                color: 'white',\n                textDecoration: 'none',\n                borderRadius: 5,\n                marginTop: 20,\n              }}\n            >\n              Confirm Email\n            </a>\n          </>\n        )}\n        <p>If you have any questions, feel free to reach out to our support team.</p>\n        <p>Best regards,<br />The Team</p>\n      </div>\n      <div style={{ textAlign: 'center', marginTop: 30, color: '#6c757d', fontSize: 14 }}>\n        <p>© 2024 Your Company. All rights reserved.</p>\n      </div>\n    </div>\n  );\n}","import React from 'react';\nimport { EmailTemplate } from '../types';\n\ninterface InviteEmailData {\n  inviteeName?: string;\n  inviterName: string;\n  inviteLink: string;\n  role?: string;\n  department?: string;\n  expiresIn?: string;\n  organizationName?: string;\n}\n\nexport const InviteEmailTemplate: EmailTemplate<InviteEmailData> = {\n  id: 'invite',\n  name: 'User Invitation Email',\n  subject: ({ inviterName, organizationName }) => \n    `${inviterName} invited you to join ${organizationName || 'our app'}`,\n  preview: 'You have been invited to join our platform',\n  body: {\n    html: (data) => `\n      <!DOCTYPE html>\n      <html>\n        <head>\n          <meta charset=\"utf-8\">\n          <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n          <title>Invitation</title>\n          <style>\n            body {\n              font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n              line-height: 1.6;\n              color: #333;\n              max-width: 600px;\n              margin: 0 auto;\n              padding: 20px;\n            }\n            .header {\n              background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n              color: white;\n              padding: 40px 30px;\n              text-align: center;\n              border-radius: 8px 8px 0 0;\n            }\n            .content {\n              background-color: #ffffff;\n              padding: 40px 30px;\n              border: 1px solid #e2e8f0;\n              border-radius: 0 0 8px 8px;\n            }\n            .role-badge {\n              display: inline-block;\n              padding: 6px 12px;\n              background-color: #e2e8f0;\n              color: #4a5568;\n              border-radius: 4px;\n              font-weight: 500;\n              margin: 5px 0;\n            }\n            .button {\n              display: inline-block;\n              padding: 14px 28px;\n              background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n              color: white;\n              text-decoration: none;\n              border-radius: 6px;\n              font-weight: 500;\n              margin: 20px 0;\n            }\n            .expiry-notice {\n              background-color: #fff5f5;\n              border-left: 4px solid #fc8181;\n              padding: 12px;\n              margin: 20px 0;\n              font-size: 14px;\n            }\n            .footer {\n              text-align: center;\n              margin-top: 40px;\n              color: #718096;\n              font-size: 14px;\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"header\">\n            <h1>You're Invited!</h1>\n          </div>\n          <div class=\"content\">\n            <p>Hi${data.inviteeName ? ` ${data.inviteeName}` : ''},</p>\n            <p><strong>${data.inviterName}</strong> has invited you to join <strong>${data.organizationName || 'our platform'}</strong>.</p>\n            \n            ${data.role || data.department ? `\n              <p>You've been invited with the following access:</p>\n              ${data.role ? `<span class=\"role-badge\">Role: ${data.role}</span><br>` : ''}\n              ${data.department ? `<span class=\"role-badge\">Department: ${data.department}</span>` : ''}\n            ` : ''}\n            \n            <p>Click the button below to accept the invitation and create your account:</p>\n            \n            <div style=\"text-align: center;\">\n              <a href=\"${data.inviteLink}\" class=\"button\">Accept Invitation</a>\n            </div>\n            \n            <div class=\"expiry-notice\">\n              <strong>⏰ Note:</strong> This invitation will expire ${data.expiresIn || 'in 7 days'}. \n              Please accept it before then.\n            </div>\n            \n            <p>If you have any questions about this invitation, please contact ${data.inviterName} or our support team.</p>\n            \n            <p>Best regards,<br>The ${data.organizationName || 'Team'}</p>\n          </div>\n          <div class=\"footer\">\n            <p>If you didn't expect this invitation, you can safely ignore this email.</p>\n            <p>© 2024 ${data.organizationName || 'Your Company'}. All rights reserved.</p>\n          </div>\n        </body>\n      </html>\n    `,\n    text: (data) => `\nYou're Invited!\n\nHi${data.inviteeName ? ` ${data.inviteeName}` : ''},\n\n${data.inviterName} has invited you to join ${data.organizationName || 'our platform'}.\n\n${data.role || data.department ? `You've been invited with the following access:\n${data.role ? `- Role: ${data.role}` : ''}\n${data.department ? `- Department: ${data.department}` : ''}` : ''}\n\nAccept the invitation: ${data.inviteLink}\n\n⏰ Note: This invitation will expire ${data.expiresIn || 'in 7 days'}. Please accept it before then.\n\nIf you have any questions about this invitation, please contact ${data.inviterName} or our support team.\n\nBest regards,\nThe ${data.organizationName || 'Team'}\n\nIf you didn't expect this invitation, you can safely ignore this email.\n© 2024 ${data.organizationName || 'Your Company'}. All rights reserved.\n    `.trim(),\n  },\n};\n\nexport function InviteEmail(props: InviteEmailData) {\n  return (\n    <div style={{ fontFamily: 'Arial, sans-serif', maxWidth: 600, margin: '0 auto' }}>\n      <div style={{\n        background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n        color: 'white',\n        padding: '40px 30px',\n        textAlign: 'center',\n        borderRadius: '8px 8px 0 0',\n      }}>\n        <h1>You're Invited!</h1>\n      </div>\n      <div style={{\n        backgroundColor: '#ffffff',\n        padding: '40px 30px',\n        border: '1px solid #e2e8f0',\n        borderRadius: '0 0 8px 8px',\n      }}>\n        <p>Hi{props.inviteeName ? ` ${props.inviteeName}` : ''},</p>\n        <p><strong>{props.inviterName}</strong> has invited you to join <strong>{props.organizationName || 'our platform'}</strong>.</p>\n        \n        {(props.role || props.department) && (\n          <>\n            <p>You've been invited with the following access:</p>\n            {props.role && (\n              <span style={{\n                display: 'inline-block',\n                padding: '6px 12px',\n                backgroundColor: '#e2e8f0',\n                color: '#4a5568',\n                borderRadius: 4,\n                fontWeight: 500,\n                margin: '5px 0',\n              }}>\n                Role: {props.role}\n              </span>\n            )}\n            {props.role && props.department && <br />}\n            {props.department && (\n              <span style={{\n                display: 'inline-block',\n                padding: '6px 12px',\n                backgroundColor: '#e2e8f0',\n                color: '#4a5568',\n                borderRadius: 4,\n                fontWeight: 500,\n                margin: '5px 0',\n              }}>\n                Department: {props.department}\n              </span>\n            )}\n          </>\n        )}\n        \n        <p>Click the button below to accept the invitation and create your account:</p>\n        \n        <div style={{ textAlign: 'center' }}>\n          <a \n            href={props.inviteLink} \n            style={{\n              display: 'inline-block',\n              padding: '14px 28px',\n              background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n              color: 'white',\n              textDecoration: 'none',\n              borderRadius: 6,\n              fontWeight: 500,\n              margin: '20px 0',\n            }}\n          >\n            Accept Invitation\n          </a>\n        </div>\n        \n        <div style={{\n          backgroundColor: '#fff5f5',\n          borderLeft: '4px solid #fc8181',\n          padding: 12,\n          margin: '20px 0',\n          fontSize: 14,\n        }}>\n          <strong>⏰ Note:</strong> This invitation will expire {props.expiresIn || 'in 7 days'}. \n          Please accept it before then.\n        </div>\n        \n        <p>If you have any questions about this invitation, please contact {props.inviterName} or our support team.</p>\n        \n        <p>Best regards,<br />The {props.organizationName || 'Team'}</p>\n      </div>\n      <div style={{ textAlign: 'center', marginTop: 40, color: '#718096', fontSize: 14 }}>\n        <p>If you didn't expect this invitation, you can safely ignore this email.</p>\n        <p>© 2024 {props.organizationName || 'Your Company'}. All rights reserved.</p>\n      </div>\n    </div>\n  );\n}","import React from 'react';\nimport { EmailTemplate } from '../types';\n\ninterface ResetPasswordEmailData {\n  name?: string;\n  email: string;\n  resetLink: string;\n  expiresIn?: string;\n  ipAddress?: string;\n  userAgent?: string;\n}\n\nexport const ResetPasswordEmailTemplate: EmailTemplate<ResetPasswordEmailData> = {\n  id: 'reset-password',\n  name: 'Password Reset Email',\n  subject: 'Reset your password',\n  preview: 'Reset your password for your account',\n  body: {\n    html: (data) => `\n      <!DOCTYPE html>\n      <html>\n        <head>\n          <meta charset=\"utf-8\">\n          <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n          <title>Reset Password</title>\n          <style>\n            body {\n              font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n              line-height: 1.6;\n              color: #333;\n              max-width: 600px;\n              margin: 0 auto;\n              padding: 20px;\n            }\n            .header {\n              background-color: #dc3545;\n              color: white;\n              padding: 30px;\n              text-align: center;\n              border-radius: 8px 8px 0 0;\n            }\n            .content {\n              background-color: #ffffff;\n              padding: 40px 30px;\n              border: 1px solid #e2e8f0;\n              border-radius: 0 0 8px 8px;\n            }\n            .button {\n              display: inline-block;\n              padding: 14px 28px;\n              background-color: #dc3545;\n              color: white;\n              text-decoration: none;\n              border-radius: 6px;\n              font-weight: 500;\n              margin: 20px 0;\n            }\n            .security-notice {\n              background-color: #f0f9ff;\n              border-left: 4px solid #3182ce;\n              padding: 12px;\n              margin: 20px 0;\n              font-size: 14px;\n            }\n            .details {\n              background-color: #f7fafc;\n              padding: 15px;\n              border-radius: 6px;\n              margin: 20px 0;\n              font-size: 14px;\n            }\n            .footer {\n              text-align: center;\n              margin-top: 40px;\n              color: #718096;\n              font-size: 14px;\n            }\n            code {\n              background-color: #f7fafc;\n              padding: 2px 6px;\n              border-radius: 3px;\n              font-family: monospace;\n            }\n          </style>\n        </head>\n        <body>\n          <div class=\"header\">\n            <h1>Password Reset Request</h1>\n          </div>\n          <div class=\"content\">\n            <p>Hi${data.name ? ` ${data.name}` : ''},</p>\n            \n            <p>We received a request to reset the password for your account associated with <strong>${data.email}</strong>.</p>\n            \n            <p>Click the button below to reset your password:</p>\n            \n            <div style=\"text-align: center;\">\n              <a href=\"${data.resetLink}\" class=\"button\">Reset Password</a>\n            </div>\n            \n            <p>Or copy and paste this link into your browser:</p>\n            <p><code style=\"word-break: break-all;\">${data.resetLink}</code></p>\n            \n            <div class=\"security-notice\">\n              <strong>🔒 Security Notice:</strong> This link will expire ${data.expiresIn || 'in 1 hour'} for your security. \n              If you need to reset your password after this time, please request a new reset link.\n            </div>\n            \n            ${data.ipAddress || data.userAgent ? `\n              <div class=\"details\">\n                <strong>Request Details:</strong><br>\n                ${data.ipAddress ? `IP Address: ${data.ipAddress}<br>` : ''}\n                ${data.userAgent ? `Device: ${data.userAgent}` : ''}\n              </div>\n            ` : ''}\n            \n            <p><strong>Didn't request this?</strong></p>\n            <p>If you didn't request a password reset, please ignore this email. Your password won't be changed unless you click the link above and create a new one.</p>\n            \n            <p>For security reasons, we recommend:</p>\n            <ul>\n              <li>Using a strong, unique password</li>\n              <li>Enabling two-factor authentication if available</li>\n              <li>Not sharing your password with anyone</li>\n            </ul>\n            \n            <p>Best regards,<br>The Security Team</p>\n          </div>\n          <div class=\"footer\">\n            <p>This is an automated message, please do not reply to this email.</p>\n            <p>© 2024 Your Company. All rights reserved.</p>\n          </div>\n        </body>\n      </html>\n    `,\n    text: (data) => `\nPassword Reset Request\n\nHi${data.name ? ` ${data.name}` : ''},\n\nWe received a request to reset the password for your account associated with ${data.email}.\n\nReset your password: ${data.resetLink}\n\n🔒 Security Notice: This link will expire ${data.expiresIn || 'in 1 hour'} for your security. If you need to reset your password after this time, please request a new reset link.\n\n${data.ipAddress || data.userAgent ? `Request Details:\n${data.ipAddress ? `IP Address: ${data.ipAddress}` : ''}\n${data.userAgent ? `Device: ${data.userAgent}` : ''}` : ''}\n\nDidn't request this?\nIf you didn't request a password reset, please ignore this email. Your password won't be changed unless you click the link above and create a new one.\n\nFor security reasons, we recommend:\n- Using a strong, unique password\n- Enabling two-factor authentication if available\n- Not sharing your password with anyone\n\nBest regards,\nThe Security Team\n\nThis is an automated message, please do not reply to this email.\n© 2024 Your Company. All rights reserved.\n    `.trim(),\n  },\n};\n\nexport function ResetPasswordEmail(props: ResetPasswordEmailData) {\n  return (\n    <div style={{ fontFamily: 'Arial, sans-serif', maxWidth: 600, margin: '0 auto' }}>\n      <div style={{\n        backgroundColor: '#dc3545',\n        color: 'white',\n        padding: 30,\n        textAlign: 'center',\n        borderRadius: '8px 8px 0 0',\n      }}>\n        <h1>Password Reset Request</h1>\n      </div>\n      <div style={{\n        backgroundColor: '#ffffff',\n        padding: '40px 30px',\n        border: '1px solid #e2e8f0',\n        borderRadius: '0 0 8px 8px',\n      }}>\n        <p>Hi{props.name ? ` ${props.name}` : ''},</p>\n        \n        <p>We received a request to reset the password for your account associated with <strong>{props.email}</strong>.</p>\n        \n        <p>Click the button below to reset your password:</p>\n        \n        <div style={{ textAlign: 'center' }}>\n          <a \n            href={props.resetLink} \n            style={{\n              display: 'inline-block',\n              padding: '14px 28px',\n              backgroundColor: '#dc3545',\n              color: 'white',\n              textDecoration: 'none',\n              borderRadius: 6,\n              fontWeight: 500,\n              margin: '20px 0',\n            }}\n          >\n            Reset Password\n          </a>\n        </div>\n        \n        <p>Or copy and paste this link into your browser:</p>\n        <p>\n          <code style={{\n            backgroundColor: '#f7fafc',\n            padding: '2px 6px',\n            borderRadius: 3,\n            fontFamily: 'monospace',\n            wordBreak: 'break-all',\n          }}>\n            {props.resetLink}\n          </code>\n        </p>\n        \n        <div style={{\n          backgroundColor: '#f0f9ff',\n          borderLeft: '4px solid #3182ce',\n          padding: 12,\n          margin: '20px 0',\n          fontSize: 14,\n        }}>\n          <strong>🔒 Security Notice:</strong> This link will expire {props.expiresIn || 'in 1 hour'} for your security. \n          If you need to reset your password after this time, please request a new reset link.\n        </div>\n        \n        {(props.ipAddress || props.userAgent) && (\n          <div style={{\n            backgroundColor: '#f7fafc',\n            padding: 15,\n            borderRadius: 6,\n            margin: '20px 0',\n            fontSize: 14,\n          }}>\n            <strong>Request Details:</strong><br />\n            {props.ipAddress && <>IP Address: {props.ipAddress}<br /></>}\n            {props.userAgent && <>Device: {props.userAgent}</>}\n          </div>\n        )}\n        \n        <p><strong>Didn't request this?</strong></p>\n        <p>If you didn't request a password reset, please ignore this email. Your password won't be changed unless you click the link above and create a new one.</p>\n        \n        <p>For security reasons, we recommend:</p>\n        <ul>\n          <li>Using a strong, unique password</li>\n          <li>Enabling two-factor authentication if available</li>\n          <li>Not sharing your password with anyone</li>\n        </ul>\n        \n        <p>Best regards,<br />The Security Team</p>\n      </div>\n      <div style={{ textAlign: 'center', marginTop: 40, color: '#718096', fontSize: 14 }}>\n        <p>This is an automated message, please do not reply to this email.</p>\n        <p>© 2024 Your Company. All rights reserved.</p>\n      </div>\n    </div>\n  );\n}","import {\n  NotificationConfig,\n  NotificationOptions,\n  Notification,\n  NotificationUpdate,\n  NotificationChannels,\n  NotificationType,\n} from '../types';\n\nclass NotificationService {\n  private config: NotificationConfig = {\n    channels: {},\n    defaultDuration: 5000,\n    position: 'top-right',\n    maxStack: 5,\n  };\n  \n  private notifications: Map<string, Notification> = new Map();\n  private listeners: Map<string, Set<(notification: Notification) => void>> = new Map();\n  private idCounter = 0;\n\n  // Configure the notification service\n  configure(config: NotificationConfig): NotificationService {\n    this.config = { ...this.config, ...config };\n    return this;\n  }\n\n  // Show a notification\n  show(options: NotificationOptions): string {\n    const id = options.id || this.generateId();\n    \n    const notification: Notification = {\n      id,\n      title: options.title,\n      message: options.message,\n      type: options.type || 'info',\n      createdAt: new Date(),\n      actions: options.actions,\n      data: options.data,\n      link: options.link,\n      avatar: options.avatar,\n      progress: options.progress,\n      status: options.status,\n      badge: options.badge,\n    };\n\n    // Store notification\n    this.notifications.set(id, notification);\n\n    // Send to channels\n    const channels = options.channels || this.getDefaultChannels(options.type);\n    this.sendToChannels(notification, channels, options);\n\n    // Auto-dismiss if duration specified\n    if (options.duration && options.duration !== 'persistent') {\n      setTimeout(() => {\n        this.dismiss(id);\n      }, options.duration);\n    }\n\n    return id;\n  }\n\n  // Send notification through multiple channels\n  async send(options: NotificationOptions): Promise<void> {\n    const notification: Notification = {\n      id: options.id || this.generateId(),\n      title: options.title,\n      message: options.message,\n      type: options.type || 'info',\n      createdAt: new Date(),\n      actions: options.actions,\n      data: options.data,\n      link: options.link,\n      avatar: options.avatar,\n      progress: options.progress,\n      status: options.status,\n      badge: options.badge,\n    };\n\n    // Determine channels\n    const channels = options.channels || {\n      toast: true,\n      bell: true,\n      push: false,\n      email: false,\n    };\n\n    // Send to each channel\n    const promises: Promise<void>[] = [];\n\n    if (channels.toast) {\n      promises.push(this.sendToToast(notification, options));\n    }\n\n    if (channels.bell) {\n      promises.push(this.sendToBell(notification, options));\n    }\n\n    if (channels.push) {\n      promises.push(this.sendToPush(notification, options));\n    }\n\n    if (channels.email && options.audience) {\n      promises.push(this.sendToEmail(notification, options));\n    }\n\n    await Promise.all(promises);\n  }\n\n  // Update an existing notification\n  update(id: string, updates: NotificationUpdate): void {\n    const notification = this.notifications.get(id);\n    if (!notification) return;\n\n    // Update notification\n    Object.assign(notification, {\n      title: updates.title ?? notification.title,\n      message: updates.message ?? notification.message,\n      type: updates.type ?? notification.type,\n      loading: updates.loading,\n      progress: updates.progress !== undefined ? updates.progress : notification.progress,\n      actions: updates.actions ?? notification.actions,\n      link: updates.link !== undefined ? updates.link : notification.link,\n      avatar: updates.avatar !== undefined ? updates.avatar : notification.avatar,\n      status: updates.status !== undefined ? updates.status : notification.status,\n      badge: updates.badge !== undefined ? updates.badge : notification.badge,\n    });\n    \n    // Notify listeners\n    this.notifyListeners('update', notification);\n  }\n\n  // Dismiss a notification\n  dismiss(id: string): void {\n    const notification = this.notifications.get(id);\n    if (!notification) return;\n\n    notification.dismissedAt = new Date();\n    \n    // Notify listeners\n    this.notifyListeners('dismiss', notification);\n    \n    // Remove from memory after a delay\n    setTimeout(() => {\n      this.notifications.delete(id);\n    }, 1000);\n  }\n\n  // Mark notification as read\n  markAsRead(id: string): void {\n    const notification = this.notifications.get(id);\n    if (!notification) return;\n\n    notification.readAt = new Date();\n    \n    // Notify listeners\n    this.notifyListeners('read', notification);\n  }\n\n  // Get all notifications\n  getAll(filter?: { unread?: boolean; type?: NotificationType }): Notification[] {\n    let notifications = Array.from(this.notifications.values());\n\n    if (filter?.unread) {\n      notifications = notifications.filter(n => !n.readAt);\n    }\n\n    if (filter?.type) {\n      notifications = notifications.filter(n => n.type === filter.type);\n    }\n\n    return notifications.sort((a, b) => \n      b.createdAt.getTime() - a.createdAt.getTime()\n    );\n  }\n\n  // Get unread count\n  getUnreadCount(): number {\n    return Array.from(this.notifications.values())\n      .filter(n => !n.readAt && !n.dismissedAt)\n      .length;\n  }\n\n  // Clear all notifications\n  clear(): void {\n    this.notifications.clear();\n    this.notifyListeners('clear', null);\n  }\n\n  // Subscribe to notification events\n  subscribe(event: string, callback: (notification: Notification | null) => void): () => void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    \n    this.listeners.get(event)!.add(callback);\n    \n    // Return unsubscribe function\n    return () => {\n      this.listeners.get(event)?.delete(callback);\n    };\n  }\n\n  // Private methods\n  private generateId(): string {\n    return `notification_${Date.now()}_${++this.idCounter}`;\n  }\n\n  private getDefaultChannels(type?: NotificationType): NotificationChannels {\n    // Default channels based on notification type\n    switch (type) {\n      case 'error':\n        return { toast: true, bell: true, push: false, email: false };\n      case 'warning':\n        return { toast: true, bell: true, push: false, email: false };\n      case 'success':\n        return { toast: true, bell: false, push: false, email: false };\n      case 'loading':\n        return { toast: true, bell: false, push: false, email: false };\n      default:\n        return { toast: true, bell: true, push: false, email: false };\n    }\n  }\n\n  private sendToChannels(\n    notification: Notification,\n    channels: NotificationChannels,\n    options: NotificationOptions\n  ): void {\n    if (channels.toast) {\n      this.sendToToast(notification, options);\n    }\n\n    if (channels.bell) {\n      this.sendToBell(notification, options);\n    }\n\n    if (channels.push) {\n      this.sendToPush(notification, options);\n    }\n\n    if (channels.email && options.audience) {\n      this.sendToEmail(notification, options);\n    }\n  }\n\n  private async sendToToast(notification: Notification, options: NotificationOptions): Promise<void> {\n    // Toast implementation would go here\n    this.notifyListeners('toast', notification);\n  }\n\n  private async sendToBell(notification: Notification, options: NotificationOptions): Promise<void> {\n    // Bell notification implementation would go here\n    this.notifyListeners('bell', notification);\n  }\n\n  private async sendToPush(notification: Notification, options: NotificationOptions): Promise<void> {\n    // Push notification implementation would go here\n    console.log('Push notifications not implemented yet');\n  }\n\n  private async sendToEmail(notification: Notification, options: NotificationOptions): Promise<void> {\n    // Email notification implementation would go here\n    console.log('Email notifications would integrate with email service');\n  }\n\n  private notifyListeners(event: string, notification: Notification | null): void {\n    const listeners = this.listeners.get(event);\n    if (listeners) {\n      listeners.forEach(callback => callback(notification));\n    }\n  }\n}\n\n// Singleton instance\nexport const notifications = new NotificationService();","import { useState, useEffect, useCallback } from 'react';\nimport { notifications as notificationService } from '../services/notification.service';\nimport { Notification } from '../types';\n\nexport function useNotifications() {\n  const [notifications, setNotifications] = useState<Notification[]>([]);\n  const [unreadCount, setUnreadCount] = useState(0);\n\n  // Load initial notifications\n  useEffect(() => {\n    const loadNotifications = () => {\n      setNotifications(notificationService.getAll());\n      setUnreadCount(notificationService.getUnreadCount());\n    };\n\n    loadNotifications();\n\n    // Subscribe to notification events\n    const unsubscribers = [\n      notificationService.subscribe('bell', loadNotifications),\n      notificationService.subscribe('update', loadNotifications),\n      notificationService.subscribe('dismiss', loadNotifications),\n      notificationService.subscribe('read', loadNotifications),\n      notificationService.subscribe('clear', loadNotifications),\n    ];\n\n    return () => {\n      unsubscribers.forEach(unsub => unsub());\n    };\n  }, []);\n\n  const markAsRead = useCallback((id: string) => {\n    notificationService.markAsRead(id);\n  }, []);\n\n  const markAllAsRead = useCallback(() => {\n    notifications\n      .filter(n => !n.readAt)\n      .forEach(n => notificationService.markAsRead(n.id));\n  }, [notifications]);\n\n  const deleteNotification = useCallback((id: string) => {\n    notificationService.dismiss(id);\n  }, []);\n\n  const clearAll = useCallback(() => {\n    notificationService.clear();\n  }, []);\n\n  return {\n    notifications,\n    unreadCount,\n    markAsRead,\n    markAllAsRead,\n    deleteNotification,\n    clearAll,\n  };\n}","import { useState, useEffect, useCallback } from 'react';\nimport { NotificationPreferences } from '../types';\n\nconst DEFAULT_PREFERENCES: NotificationPreferences = {\n  channels: {\n    toast: {\n      enabled: true,\n      types: [],\n      sound: false,\n      vibrate: false,\n      priority: 'all',\n    },\n    bell: {\n      enabled: true,\n      types: [],\n      sound: true,\n      vibrate: false,\n      priority: 'all',\n    },\n    push: {\n      enabled: false,\n      types: [],\n      sound: true,\n      vibrate: true,\n      priority: 'high',\n    },\n    email: {\n      enabled: true,\n      types: [],\n      sound: false,\n      vibrate: false,\n      priority: 'high',\n    },\n  },\n  categories: {},\n  schedule: {\n    quietHours: {\n      enabled: false,\n      start: '22:00',\n      end: '08:00',\n      allowUrgent: true,\n    },\n  },\n  delivery: {\n    batching: {\n      enabled: false,\n      window: 5,\n      maxSize: 10,\n    },\n  },\n};\n\nexport function useNotificationPreferences() {\n  const [preferences, setPreferences] = useState<NotificationPreferences>(DEFAULT_PREFERENCES);\n  const [loading, setLoading] = useState(true);\n\n  // Load preferences from storage\n  useEffect(() => {\n    const loadPreferences = async () => {\n      try {\n        // Load from localStorage or API\n        const stored = localStorage.getItem('notification_preferences');\n        if (stored) {\n          setPreferences(JSON.parse(stored));\n        }\n      } catch (error) {\n        console.error('Failed to load notification preferences:', error);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    loadPreferences();\n  }, []);\n\n  const updatePreferences = useCallback(async (\n    updates: Partial<NotificationPreferences>\n  ) => {\n    const newPreferences = {\n      ...preferences,\n      ...updates,\n    };\n\n    setPreferences(newPreferences);\n\n    // Save to storage\n    try {\n      localStorage.setItem('notification_preferences', JSON.stringify(newPreferences));\n    } catch (error) {\n      console.error('Failed to save notification preferences:', error);\n    }\n  }, [preferences]);\n\n  const updateChannelPreference = useCallback((\n    channel: keyof NotificationPreferences['channels'],\n    updates: any\n  ) => {\n    updatePreferences({\n      channels: {\n        ...preferences.channels,\n        [channel]: {\n          ...preferences.channels[channel],\n          ...updates,\n        },\n      },\n    });\n  }, [preferences, updatePreferences]);\n\n  const resetToDefaults = useCallback(() => {\n    setPreferences(DEFAULT_PREFERENCES);\n    localStorage.removeItem('notification_preferences');\n  }, []);\n\n  return {\n    preferences,\n    loading,\n    updatePreferences,\n    updateChannelPreference,\n    resetToDefaults,\n  };\n}","import { useState, useCallback } from 'react';\nimport { Notification, NotificationType } from '../types';\nimport { useNotifications } from './useNotifications';\n\nexport function useNotificationCenter() {\n  const [isOpen, setIsOpen] = useState(false);\n  const [filter, setFilter] = useState<NotificationType | 'all'>('all');\n  const [searchQuery, setSearchQuery] = useState('');\n  \n  const {\n    notifications,\n    unreadCount,\n    markAsRead,\n    markAllAsRead,\n    deleteNotification,\n    clearAll,\n  } = useNotifications();\n\n  const open = useCallback(() => setIsOpen(true), []);\n  const close = useCallback(() => setIsOpen(false), []);\n  const toggle = useCallback(() => setIsOpen(prev => !prev), []);\n\n  // Filter notifications\n  const filteredNotifications = notifications.filter(notification => {\n    // Type filter\n    if (filter !== 'all' && notification.type !== filter) {\n      return false;\n    }\n\n    // Search filter\n    if (searchQuery) {\n      const query = searchQuery.toLowerCase();\n      return (\n        notification.title.toLowerCase().includes(query) ||\n        notification.message?.toLowerCase().includes(query)\n      );\n    }\n\n    return true;\n  });\n\n  // Group notifications by date\n  const groupedNotifications = filteredNotifications.reduce((groups, notification) => {\n    const date = new Date(notification.createdAt);\n    const dateKey = date.toDateString();\n    \n    if (!groups[dateKey]) {\n      groups[dateKey] = [];\n    }\n    \n    groups[dateKey].push(notification);\n    return groups;\n  }, {} as Record<string, Notification[]>);\n\n  return {\n    isOpen,\n    open,\n    close,\n    toggle,\n    notifications: filteredNotifications,\n    groupedNotifications,\n    unreadCount,\n    filter,\n    setFilter,\n    searchQuery,\n    setSearchQuery,\n    markAsRead,\n    markAllAsRead,\n    deleteNotification,\n    clearAll,\n  };\n}","'use client';\n\nimport React from 'react';\nimport {\n  Indicator,\n  ActionIcon,\n  Popover,\n  ScrollArea,\n  Stack,\n  Group,\n  Text,\n  Button,\n  Center,\n  Badge,\n} from '@mantine/core';\nimport { IconBell, IconInbox } from '@tabler/icons-react';\nimport { useNotificationCenter } from '../../hooks/useNotificationCenter';\nimport { NotificationItem } from '../NotificationItem';\n\ninterface NotificationBellProps {\n  position?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end';\n  maxHeight?: number;\n  emptyMessage?: string;\n}\n\nexport function NotificationBell({\n  position = 'bottom-end',\n  maxHeight = 400,\n  emptyMessage = \"You're all caught up!\",\n}: NotificationBellProps) {\n  const {\n    isOpen,\n    toggle,\n    close,\n    notifications,\n    unreadCount,\n    markAsRead,\n    markAllAsRead,\n    deleteNotification,\n  } = useNotificationCenter();\n\n  return (\n    <Popover\n      opened={isOpen}\n      onClose={close}\n      position={position}\n      width={380}\n      trapFocus\n      withArrow\n      shadow=\"md\"\n    >\n      <Popover.Target>\n        <Indicator\n          inline\n          label={unreadCount}\n          size={16}\n          disabled={unreadCount === 0}\n          color=\"red\"\n          offset={7}\n        >\n          <ActionIcon\n            variant=\"default\"\n            size=\"lg\"\n            onClick={toggle}\n            aria-label=\"Notifications\"\n          >\n            <IconBell size={20} />\n          </ActionIcon>\n        </Indicator>\n      </Popover.Target>\n\n      <Popover.Dropdown p={0}>\n        <Stack gap={0}>\n          <Group justify=\"space-between\" p=\"md\" pb=\"sm\">\n            <Group gap=\"xs\">\n              <Text fw={600} size=\"lg\">Notifications</Text>\n              {unreadCount > 0 && (\n                <Badge color=\"red\" variant=\"filled\" size=\"sm\">\n                  {unreadCount} new\n                </Badge>\n              )}\n            </Group>\n            {notifications.length > 0 && (\n              <Button\n                variant=\"subtle\"\n                size=\"xs\"\n                onClick={markAllAsRead}\n                disabled={unreadCount === 0}\n              >\n                Mark all as read\n              </Button>\n            )}\n          </Group>\n\n          {notifications.length === 0 ? (\n            <Center p=\"xl\">\n              <Stack align=\"center\" gap=\"xs\">\n                <IconInbox size={48} stroke={1} color=\"gray\" />\n                <Text c=\"dimmed\" size=\"sm\">{emptyMessage}</Text>\n              </Stack>\n            </Center>\n          ) : (\n            <ScrollArea h={maxHeight} offsetScrollbars>\n              <Stack gap={0}>\n                {notifications.map((notification) => (\n                  <NotificationItem\n                    key={notification.id}\n                    notification={notification}\n                    onRead={() => markAsRead(notification.id)}\n                    onDismiss={() => deleteNotification(notification.id)}\n                  />\n                ))}\n              </Stack>\n            </ScrollArea>\n          )}\n        </Stack>\n      </Popover.Dropdown>\n    </Popover>\n  );\n}","'use client';\n\nimport React from 'react';\nimport {\n  Box,\n  Group,\n  Text,\n  ActionIcon,\n  ThemeIcon,\n  Stack,\n  Button,\n  rem,\n  Avatar,\n  Progress,\n  Badge,\n  Anchor,\n} from '@mantine/core';\nimport {\n  IconX,\n  IconCheck,\n  IconAlertCircle,\n  IconInfoCircle,\n  IconExclamationCircle,\n  IconExternalLink,\n  IconClock,\n  IconCircleCheck,\n  IconCircleX,\n  IconCircleDashed,\n  IconCircleOff,\n} from '@tabler/icons-react';\nimport { Notification, NotificationType } from '../../types';\n\ninterface NotificationItemProps {\n  notification: Notification;\n  onRead?: () => void;\n  onDismiss?: () => void;\n  onAction?: (action: any) => void;\n}\n\nexport function NotificationItem({\n  notification,\n  onRead,\n  onDismiss,\n  onAction,\n}: NotificationItemProps) {\n  const getIcon = (type: NotificationType) => {\n    switch (type) {\n      case 'success':\n        return <IconCheck size={16} />;\n      case 'error':\n        return <IconX size={16} />;\n      case 'warning':\n        return <IconExclamationCircle size={16} />;\n      case 'loading':\n        return <IconClock size={16} />;\n      case 'info':\n      default:\n        return <IconInfoCircle size={16} />;\n    }\n  };\n\n  const getStatusIcon = (type: string) => {\n    switch (type) {\n      case 'pending':\n        return <IconCircleDashed size={16} />;\n      case 'processing':\n        return <IconClock size={16} />;\n      case 'completed':\n        return <IconCircleCheck size={16} />;\n      case 'failed':\n        return <IconCircleX size={16} />;\n      case 'cancelled':\n        return <IconCircleOff size={16} />;\n      default:\n        return <IconInfoCircle size={16} />;\n    }\n  };\n\n  const getColor = (type: NotificationType) => {\n    switch (type) {\n      case 'success':\n        return 'green';\n      case 'error':\n        return 'red';\n      case 'warning':\n        return 'yellow';\n      case 'loading':\n        return 'blue';\n      case 'info':\n      default:\n        return 'blue';\n    }\n  };\n\n  const getStatusColor = (type: string) => {\n    switch (type) {\n      case 'pending':\n        return 'gray';\n      case 'processing':\n        return 'blue';\n      case 'completed':\n        return 'green';\n      case 'failed':\n        return 'red';\n      case 'cancelled':\n        return 'orange';\n      default:\n        return 'gray';\n    }\n  };\n\n  const timeAgo = (date: Date) => {\n    const seconds = Math.floor((new Date().getTime() - date.getTime()) / 1000);\n    \n    if (seconds < 60) return 'just now';\n    if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n    if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;\n    return `${Math.floor(seconds / 86400)}d ago`;\n  };\n\n  const handleClick = () => {\n    if (!notification.readAt && onRead) {\n      onRead();\n    }\n  };\n\n  return (\n    <Box\n      p=\"md\"\n      style={{\n        borderBottom: '1px solid var(--mantine-color-gray-2)',\n        backgroundColor: notification.readAt ? 'transparent' : 'var(--mantine-color-blue-0)',\n        cursor: 'pointer',\n        transition: 'background-color 150ms ease',\n      }}\n      onClick={handleClick}\n    >\n      <Group align=\"flex-start\" gap=\"sm\" wrap=\"nowrap\">\n        {notification.avatar ? (\n          <Avatar\n            src={notification.avatar.src}\n            alt={notification.avatar.alt}\n            color={notification.avatar.color}\n            radius=\"xl\"\n            size=\"md\"\n          >\n            {notification.avatar.icon || notification.avatar.name}\n          </Avatar>\n        ) : (\n          <ThemeIcon\n            color={getColor(notification.type)}\n            variant=\"light\"\n            size=\"md\"\n            radius=\"xl\"\n          >\n            {getIcon(notification.type)}\n          </ThemeIcon>\n        )}\n\n        <Stack gap=\"xs\" style={{ flex: 1 }}>\n          <Group justify=\"space-between\" gap=\"xs\" wrap=\"nowrap\">\n            <Group gap=\"xs\" wrap=\"nowrap\">\n              <Text fw={600} size=\"sm\" lineClamp={1}>\n                {notification.title}\n              </Text>\n              {notification.badge && (\n                <Badge\n                  color={notification.badge.color}\n                  variant={notification.badge.variant || 'light'}\n                  size={notification.badge.size || 'sm'}\n                >\n                  {notification.badge.label}\n                </Badge>\n              )}\n            </Group>\n            <Group gap=\"xs\" wrap=\"nowrap\">\n              <Text size=\"xs\" c=\"dimmed\">\n                {timeAgo(notification.createdAt)}\n              </Text>\n              {onDismiss && (\n                <ActionIcon\n                  size=\"sm\"\n                  variant=\"subtle\"\n                  color=\"gray\"\n                  onClick={(e) => {\n                    e.stopPropagation();\n                    onDismiss();\n                  }}\n                >\n                  <IconX size={14} />\n                </ActionIcon>\n              )}\n            </Group>\n          </Group>\n\n          {notification.message && (\n            <Text size=\"sm\" c=\"dimmed\" lineClamp={2}>\n              {notification.message}\n            </Text>\n          )}\n\n          {notification.status && (\n            <Group gap=\"xs\">\n              <ThemeIcon\n                color={notification.status.color || getStatusColor(notification.status.type)}\n                variant=\"light\"\n                size=\"sm\"\n                radius=\"xl\"\n              >\n                {notification.status.icon || getStatusIcon(notification.status.type)}\n              </ThemeIcon>\n              <Text size=\"sm\" c={notification.status.color || getStatusColor(notification.status.type)}>\n                {notification.status.label || notification.status.type}\n              </Text>\n            </Group>\n          )}\n\n          {notification.progress && (\n            <Box>\n              {notification.progress.label && (\n                <Text size=\"xs\" c=\"dimmed\" mb={4}>\n                  {notification.progress.label}\n                </Text>\n              )}\n              <Progress\n                value={notification.progress.value}\n                size=\"sm\"\n                color={notification.progress.color}\n                animated={notification.progress.animated}\n                striped={notification.progress.striped}\n              />\n            </Box>\n          )}\n\n          {notification.link && (\n            <Anchor\n              href={notification.link.href}\n              target={notification.link.target || '_self'}\n              size=\"sm\"\n              onClick={(e) => e.stopPropagation()}\n            >\n              <Group gap={4}>\n                <Text>{notification.link.label || notification.link.href}</Text>\n                {notification.link.external && <IconExternalLink size={14} />}\n              </Group>\n            </Anchor>\n          )}\n\n          {notification.actions && notification.actions.length > 0 && (\n            <Group gap=\"xs\" mt=\"xs\">\n              {notification.actions.map((action, index) => (\n                <Button\n                  key={index}\n                  size=\"xs\"\n                  variant={action.style === 'primary' ? 'filled' : 'light'}\n                  color={action.style === 'danger' ? 'red' : undefined}\n                  leftSection={action.icon}\n                  onClick={(e) => {\n                    e.stopPropagation();\n                    if (action.action === 'dismiss' && onDismiss) {\n                      onDismiss();\n                    } else if (typeof action.action === 'function') {\n                      action.action();\n                    } else if (onAction) {\n                      onAction(action);\n                    }\n                  }}\n                >\n                  {action.label}\n                </Button>\n              ))}\n            </Group>\n          )}\n        </Stack>\n      </Group>\n    </Box>\n  );\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\n\nexport function NotificationCenter() {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Notification Center</Title>\n      <Text c=\"dimmed\" size=\"sm\">Full notification center coming soon</Text>\n    </Paper>\n  );\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\n\ninterface NotificationPreferencesProps {\n  preferences: any;\n  onChange: (preferences: any) => void;\n}\n\nexport function NotificationPreferences({ preferences, onChange }: NotificationPreferencesProps) {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Notification Preferences</Title>\n      <Text c=\"dimmed\" size=\"sm\">Preference management coming soon</Text>\n    </Paper>\n  );\n}","'use client';\n\nimport React, { createContext, useContext, useEffect, ReactNode } from 'react';\nimport { notifications as notificationService } from '../services/notification.service';\nimport { NotificationConfig } from '../types';\n\ninterface NotificationContextValue {\n  service: typeof notificationService;\n}\n\nconst NotificationContext = createContext<NotificationContextValue | undefined>(undefined);\n\ninterface NotificationProviderProps {\n  children: ReactNode;\n  config?: NotificationConfig;\n}\n\nexport function NotificationProvider({ children, config }: NotificationProviderProps) {\n  useEffect(() => {\n    if (config) {\n      notificationService.configure(config);\n    }\n  }, [config]);\n\n  const value: NotificationContextValue = {\n    service: notificationService,\n  };\n\n  return (\n    <NotificationContext.Provider value={value}>\n      {children}\n    </NotificationContext.Provider>\n  );\n}\n\nexport function useNotificationContext() {\n  const context = useContext(NotificationContext);\n  if (context === undefined) {\n    throw new Error('useNotificationContext must be used within a NotificationProvider');\n  }\n  return context;\n}","import {\n  AuditConfig,\n  AuditEvent,\n  AuditEventOptions,\n  AuditError,\n  AuditEventQuery,\n  AuditEventResult,\n  StreamConfig,\n  StreamSubscription,\n} from '../types';\n\nclass AuditService {\n  private config: AuditConfig = {\n    storage: 'firebase',\n    stream: false,\n    retention: '90d',\n  };\n  \n  private events: Map<string, AuditEvent> = new Map();\n  private streamSubscriptions: Map<string, StreamSubscription> = new Map();\n  private decoratedMethods: Map<string, Function> = new Map();\n\n  // Configure the audit service\n  configure(config: AuditConfig): AuditService {\n    this.config = { ...this.config, ...config };\n    return this;\n  }\n\n  // Log an audit event\n  async log(options: AuditEventOptions): Promise<AuditEvent> {\n    try {\n      const event: AuditEvent = {\n        id: this.generateEventId(),\n        timestamp: new Date(),\n        actor: await this.getCurrentActor(),\n        action: options.action,\n        resource: options.resource,\n        result: options.result || 'success',\n        changes: options.changes,\n        metadata: options.metadata,\n        context: await this.captureContext(),\n        tags: options.tags,\n      };\n\n      // Apply filters\n      if (this.config.filters) {\n        for (const filter of this.config.filters) {\n          if (!filter.filter(event)) {\n            return event; // Skip logging if filtered out\n          }\n        }\n      }\n\n      // Apply formatters\n      let formattedEvent = event;\n      if (this.config.formatters) {\n        for (const formatter of this.config.formatters) {\n          formattedEvent = formatter.format(formattedEvent);\n        }\n      }\n\n      // Store event\n      await this.storeEvent(formattedEvent);\n\n      // Stream if enabled\n      if (this.config.stream) {\n        this.streamEvent(formattedEvent);\n      }\n\n      return formattedEvent;\n    } catch (error: any) {\n      const auditError: AuditError = {\n        code: 'audit/log-failed',\n        message: error.message || 'Failed to log audit event',\n        event: options as any,\n        originalError: error,\n      };\n\n      if (this.config.onError) {\n        this.config.onError(auditError);\n      }\n\n      throw auditError;\n    }\n  }\n\n  // Decorator for automatic method tracking\n  track(action: string) {\n    return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {\n      const originalMethod = descriptor.value;\n\n      descriptor.value = async function (...args: any[]) {\n        const startTime = Date.now();\n        let result: any;\n        let error: any;\n\n        try {\n          result = await originalMethod.apply(this, args);\n        } catch (e) {\n          error = e;\n        }\n\n        // Log the audit event\n        const audit = new AuditService();\n        await audit.log({\n          action,\n          resource: {\n            type: target.constructor.name,\n            id: propertyKey,\n            name: `${target.constructor.name}.${propertyKey}`,\n          },\n          result: error ? 'failure' : 'success',\n          metadata: {\n            duration: Date.now() - startTime,\n            arguments: args,\n            error: error?.message,\n          },\n        });\n\n        if (error) {\n          throw error;\n        }\n\n        return result;\n      };\n\n      return descriptor;\n    };\n  }\n\n  // Stream real-time audit events\n  stream(config: StreamConfig): StreamSubscription {\n    const subscriptionId = this.generateSubscriptionId();\n    \n    const subscription: StreamSubscription = {\n      id: subscriptionId,\n      unsubscribe: () => {\n        this.streamSubscriptions.delete(subscriptionId);\n      },\n      pause: () => {\n        // Pause implementation\n      },\n      resume: () => {\n        // Resume implementation\n      },\n      updateFilter: (filter) => {\n        // Update filter implementation\n      },\n    };\n\n    this.streamSubscriptions.set(subscriptionId, subscription);\n\n    // Start streaming\n    if (config.onConnect) {\n      config.onConnect();\n    }\n\n    return subscription;\n  }\n\n  // Query audit events\n  async query(query: AuditEventQuery): Promise<AuditEventResult> {\n    let events = Array.from(this.events.values());\n\n    // Apply filters\n    if (query.filters) {\n      const { filters } = query;\n\n      if (filters.startDate) {\n        events = events.filter(e => e.timestamp >= filters.startDate!);\n      }\n\n      if (filters.endDate) {\n        events = events.filter(e => e.timestamp <= filters.endDate!);\n      }\n\n      if (filters.actors?.length) {\n        events = events.filter(e => filters.actors!.includes(e.actor.id));\n      }\n\n      if (filters.actions?.length) {\n        events = events.filter(e => filters.actions!.includes(e.action));\n      }\n\n      if (filters.resourceTypes?.length) {\n        events = events.filter(e => filters.resourceTypes!.includes(e.resource.type));\n      }\n\n      if (filters.results?.length) {\n        events = events.filter(e => filters.results!.includes(e.result));\n      }\n\n      if (filters.search) {\n        const search = filters.search.toLowerCase();\n        events = events.filter(e => \n          e.action.toLowerCase().includes(search) ||\n          e.resource.name?.toLowerCase().includes(search) ||\n          e.actor.name?.toLowerCase().includes(search)\n        );\n      }\n    }\n\n    // Apply sorting\n    if (query.sort) {\n      events.sort((a, b) => {\n        const aValue = (a as any)[query.sort!.field];\n        const bValue = (b as any)[query.sort!.field];\n        const direction = query.sort!.order === 'asc' ? 1 : -1;\n        \n        if (aValue < bValue) return -direction;\n        if (aValue > bValue) return direction;\n        return 0;\n      });\n    } else {\n      // Default sort by timestamp descending\n      events.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n    }\n\n    // Apply pagination\n    const total = events.length;\n    if (query.pagination) {\n      const { page = 1, limit = 50 } = query.pagination;\n      const start = (page - 1) * limit;\n      events = events.slice(start, start + limit);\n    }\n\n    return {\n      events,\n      total,\n      page: query.pagination?.page || 1,\n      pageSize: query.pagination?.limit || events.length,\n      hasMore: total > (query.pagination?.page || 1) * (query.pagination?.limit || total),\n    };\n  }\n\n  // Get user activity\n  async getUserActivity(userId: string, startDate?: Date, endDate?: Date): Promise<AuditEvent[]> {\n    const query: AuditEventQuery = {\n      filters: {\n        actors: [userId],\n        startDate,\n        endDate,\n      },\n    };\n\n    const result = await this.query(query);\n    return result.events;\n  }\n\n  // Private methods\n  private async getCurrentActor() {\n    // This would typically get the current user from auth service\n    return {\n      id: 'system',\n      type: 'system' as const,\n      name: 'System',\n    };\n  }\n\n  private async captureContext() {\n    // Capture request context\n    return {\n      ip: '127.0.0.1',\n      userAgent: typeof window !== 'undefined' ? window.navigator.userAgent : 'Server',\n      sessionId: this.generateSessionId(),\n    };\n  }\n\n  private async storeEvent(event: AuditEvent) {\n    // Store in memory for now (would use actual storage in production)\n    this.events.set(event.id, event);\n\n    // Clean up old events based on retention\n    if (this.config.retention) {\n      this.cleanupOldEvents();\n    }\n  }\n\n  private streamEvent(event: AuditEvent) {\n    // Send event to all active stream subscriptions\n    this.streamSubscriptions.forEach((subscription, id) => {\n      // Stream implementation would go here\n    });\n  }\n\n  private cleanupOldEvents() {\n    const retentionMs = this.parseRetention(this.config.retention!);\n    const cutoffDate = new Date(Date.now() - retentionMs);\n\n    this.events.forEach((event, id) => {\n      if (event.timestamp < cutoffDate) {\n        this.events.delete(id);\n      }\n    });\n  }\n\n  private parseRetention(retention: string): number {\n    const match = retention.match(/^(\\d+)([hdwmy])$/);\n    if (!match) return 90 * 24 * 60 * 60 * 1000; // Default 90 days\n\n    const [, value, unit] = match;\n    const num = parseInt(value, 10);\n\n    switch (unit) {\n      case 'h': return num * 60 * 60 * 1000;\n      case 'd': return num * 24 * 60 * 60 * 1000;\n      case 'w': return num * 7 * 24 * 60 * 60 * 1000;\n      case 'm': return num * 30 * 24 * 60 * 60 * 1000;\n      case 'y': return num * 365 * 24 * 60 * 60 * 1000;\n      default: return 90 * 24 * 60 * 60 * 1000;\n    }\n  }\n\n  private generateEventId(): string {\n    return `evt_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n\n  private generateSubscriptionId(): string {\n    return `sub_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n\n  private generateSessionId(): string {\n    return `ses_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n}\n\n// Singleton instance\nexport const audit = new AuditService();","import { randomUUID } from 'crypto';\nimport { clickhouseService } from './clickhouse';\nimport { hashMappingService } from './hashMapping';\nimport { createPHIReference, parsePHIReference } from '../utils/crypto';\nimport { doc, getDoc, getFirestore } from 'firebase/firestore';\nimport { getApp } from 'firebase/app';\n\nexport interface PHIFields {\n  patientName?: string;\n  patientEmail?: string;\n  patientPhone?: string;\n  patientDob?: string;\n  patientSsn?: string;\n  patientMrn?: string;\n  diagnosis?: string;\n  treatmentDetails?: string;\n  medications?: string;\n  [key: string]: string | undefined;\n}\n\nexport interface AuditEvent {\n  id?: string;\n  timestamp?: Date;\n  actor: {\n    id: string;\n    email?: string;\n    name?: string;\n    role?: string;\n  };\n  action: string;\n  resource?: {\n    type: string;\n    id: string;\n    name?: string;\n  };\n  severity?: 'low' | 'medium' | 'high' | 'critical';\n  success?: boolean;\n  error?: string;\n  phi?: PHIFields;\n  metadata?: Record<string, any>;\n  ipAddress?: string;\n  userAgent?: string;\n  department?: string;\n  location?: string;\n  sessionId?: string;\n  requestId?: string;\n}\n\nexport interface PHIMapping {\n  collection: string;\n  field: string;\n  value: any;\n}\n\n/**\n * Privacy-aware audit logger that separates PHI from audit events\n */\nexport class PrivacyAuditLogger {\n  private static instance: PrivacyAuditLogger;\n  private db = getFirestore(getApp());\n  \n  private constructor() {}\n  \n  static getInstance(): PrivacyAuditLogger {\n    if (!PrivacyAuditLogger.instance) {\n      PrivacyAuditLogger.instance = new PrivacyAuditLogger();\n    }\n    return PrivacyAuditLogger.instance;\n  }\n  \n  /**\n   * Log an audit event with automatic PHI obfuscation\n   */\n  async logEvent(event: AuditEvent): Promise<string> {\n    const eventId = event.id || randomUUID();\n    const timestamp = event.timestamp || new Date();\n    \n    // Process PHI fields if present\n    const phiReferences: Record<string, string> = {};\n    if (event.phi) {\n      // Get hash for the patient/user\n      const patientUserId = event.resource?.id || event.actor.id;\n      const hashedUserId = await hashMappingService.getOrCreateHashMapping(patientUserId);\n      \n      // Convert PHI fields to references\n      for (const [key, value] of Object.entries(event.phi)) {\n        if (value !== undefined && value !== null) {\n          // Determine collection and field based on PHI field name\n          const { collection, field } = this.getFirestoreLocation(key);\n          phiReferences[this.mapPHIFieldToColumn(key)] = createPHIReference(\n            hashedUserId,\n            collection,\n            field\n          );\n        }\n      }\n    }\n    \n    // Prepare event for ClickHouse\n    const clickhouseEvent = {\n      id: eventId,\n      timestamp: timestamp.toISOString(),\n      actor_id: await hashMappingService.getOrCreateHashMapping(event.actor.id),\n      actor_email: event.actor.email || null,\n      actor_name: event.actor.name || null,\n      actor_role: event.actor.role || null,\n      action: event.action,\n      resource_type: event.resource?.type || null,\n      resource_id: event.resource?.id || null,\n      resource_name: event.resource?.name || null,\n      severity: event.severity || 'low',\n      success: event.success !== false,\n      error_message: event.error || null,\n      ...phiReferences,\n      ip_address: event.ipAddress || null,\n      user_agent: event.userAgent || null,\n      department: event.department || null,\n      location: event.location || null,\n      session_id: event.sessionId || null,\n      request_id: event.requestId || null,\n      metadata: JSON.stringify(event.metadata || {})\n    };\n    \n    // Insert into ClickHouse\n    await clickhouseService.insertEvents([clickhouseEvent]);\n    \n    return eventId;\n  }\n  \n  /**\n   * Log multiple events in batch\n   */\n  async logEvents(events: AuditEvent[]): Promise<string[]> {\n    const processedEvents = await Promise.all(\n      events.map(async (event) => {\n        const eventId = event.id || randomUUID();\n        const timestamp = event.timestamp || new Date();\n        \n        // Process PHI fields\n        const phiReferences: Record<string, string> = {};\n        if (event.phi) {\n          const patientUserId = event.resource?.id || event.actor.id;\n          const hashedUserId = await hashMappingService.getOrCreateHashMapping(patientUserId);\n          \n          for (const [key, value] of Object.entries(event.phi)) {\n            if (value !== undefined && value !== null) {\n              const { collection, field } = this.getFirestoreLocation(key);\n              phiReferences[this.mapPHIFieldToColumn(key)] = createPHIReference(\n                hashedUserId,\n                collection,\n                field\n              );\n            }\n          }\n        }\n        \n        return {\n          id: eventId,\n          timestamp: timestamp.toISOString(),\n          actor_id: await hashMappingService.getOrCreateHashMapping(event.actor.id),\n          actor_email: event.actor.email || null,\n          actor_name: event.actor.name || null,\n          actor_role: event.actor.role || null,\n          action: event.action,\n          resource_type: event.resource?.type || null,\n          resource_id: event.resource?.id || null,\n          resource_name: event.resource?.name || null,\n          severity: event.severity || 'low',\n          success: event.success !== false,\n          error_message: event.error || null,\n          ...phiReferences,\n          ip_address: event.ipAddress || null,\n          user_agent: event.userAgent || null,\n          department: event.department || null,\n          location: event.location || null,\n          session_id: event.sessionId || null,\n          request_id: event.requestId || null,\n          metadata: JSON.stringify(event.metadata || {})\n        };\n      })\n    );\n    \n    await clickhouseService.insertEvents(processedEvents);\n    return processedEvents.map(e => e.id);\n  }\n  \n  /**\n   * Reconstruct an audit event with PHI data\n   */\n  async reconstructWithPHI(eventId: string): Promise<AuditEvent | null> {\n    // Query ClickHouse for the event\n    const query = `\n      SELECT * FROM audit_logs.audit_events \n      WHERE id = {eventId:String}\n      LIMIT 1\n    `;\n    \n    const results = await clickhouseService.queryEvents(query, { eventId });\n    if (results.length === 0) {\n      return null;\n    }\n    \n    const event = results[0];\n    \n    // Resolve actor ID\n    const actorId = await hashMappingService.resolveHash(event.actor_id);\n    if (!actorId) {\n      throw new Error(`Unable to resolve actor hash: ${event.actor_id}`);\n    }\n    \n    // Reconstruct basic event\n    const reconstructed: AuditEvent = {\n      id: event.id,\n      timestamp: new Date(event.timestamp),\n      actor: {\n        id: actorId,\n        email: event.actor_email,\n        name: event.actor_name,\n        role: event.actor_role\n      },\n      action: event.action,\n      resource: event.resource_type ? {\n        type: event.resource_type,\n        id: event.resource_id,\n        name: event.resource_name\n      } : undefined,\n      severity: event.severity,\n      success: event.success,\n      error: event.error_message,\n      metadata: JSON.parse(event.metadata || '{}'),\n      ipAddress: event.ip_address,\n      userAgent: event.user_agent,\n      department: event.department,\n      location: event.location,\n      sessionId: event.session_id,\n      requestId: event.request_id\n    };\n    \n    // Resolve PHI fields\n    const phiFields: PHIFields = {};\n    const phiColumns = [\n      'patient_name', 'patient_email', 'patient_phone', \n      'patient_dob', 'patient_ssn', 'patient_mrn',\n      'diagnosis', 'treatment_details', 'medications'\n    ];\n    \n    for (const column of phiColumns) {\n      if (event[column]) {\n        const parsed = parsePHIReference(event[column]);\n        if (parsed) {\n          const userId = await hashMappingService.resolveHash(parsed.hashedUserId);\n          if (userId) {\n            const value = await this.fetchPHIValue(userId, parsed.collection, parsed.field);\n            if (value !== null) {\n              phiFields[this.mapColumnToPHIField(column)] = value;\n            }\n          }\n        }\n      }\n    }\n    \n    if (Object.keys(phiFields).length > 0) {\n      reconstructed.phi = phiFields;\n    }\n    \n    return reconstructed;\n  }\n  \n  /**\n   * Query audit events with optional PHI reconstruction\n   */\n  async queryEvents(\n    query: string, \n    params?: Record<string, any>,\n    includePHI: boolean = false\n  ): Promise<AuditEvent[]> {\n    const results = await clickhouseService.queryEvents(query, params);\n    \n    if (!includePHI) {\n      // Return events without PHI reconstruction\n      return results.map(event => ({\n        id: event.id,\n        timestamp: new Date(event.timestamp),\n        actor: {\n          id: event.actor_id, // Keep hashed for privacy\n          email: event.actor_email,\n          name: event.actor_name,\n          role: event.actor_role\n        },\n        action: event.action,\n        resource: event.resource_type ? {\n          type: event.resource_type,\n          id: event.resource_id,\n          name: event.resource_name\n        } : undefined,\n        severity: event.severity,\n        success: event.success,\n        error: event.error_message,\n        metadata: JSON.parse(event.metadata || '{}')\n      }));\n    }\n    \n    // Reconstruct with PHI\n    const reconstructed = await Promise.all(\n      results.map(r => this.reconstructWithPHI(r.id))\n    );\n    \n    return reconstructed.filter(e => e !== null) as AuditEvent[];\n  }\n  \n  /**\n   * Generate audit report for compliance\n   */\n  async generateAuditReport(\n    startDate: Date,\n    endDate: Date,\n    options?: {\n      actorId?: string;\n      resourceType?: string;\n      resourceId?: string;\n      includePHI?: boolean;\n    }\n  ): Promise<any> {\n    let query = `\n      SELECT * FROM audit_logs.audit_events \n      WHERE timestamp >= {startDate:DateTime64} \n        AND timestamp <= {endDate:DateTime64}\n    `;\n    \n    const params: Record<string, any> = {\n      startDate: startDate.toISOString(),\n      endDate: endDate.toISOString()\n    };\n    \n    if (options?.actorId) {\n      const hashedActorId = await hashMappingService.getOrCreateHashMapping(options.actorId);\n      query += ` AND actor_id = {actorId:String}`;\n      params.actorId = hashedActorId;\n    }\n    \n    if (options?.resourceType) {\n      query += ` AND resource_type = {resourceType:String}`;\n      params.resourceType = options.resourceType;\n    }\n    \n    if (options?.resourceId) {\n      query += ` AND resource_id = {resourceId:String}`;\n      params.resourceId = options.resourceId;\n    }\n    \n    query += ` ORDER BY timestamp DESC`;\n    \n    const events = await this.queryEvents(query, params, options?.includePHI || false);\n    \n    // Generate summary statistics\n    const summaryQuery = `\n      SELECT \n        count() as total_events,\n        countIf(success = 1) as successful_events,\n        countIf(success = 0) as failed_events,\n        uniqExact(actor_id) as unique_actors,\n        groupArray(DISTINCT action) as actions\n      FROM audit_logs.audit_events \n      WHERE timestamp >= {startDate:DateTime64} \n        AND timestamp <= {endDate:DateTime64}\n    `;\n    \n    const summary = await clickhouseService.queryEvents(summaryQuery, params);\n    \n    return {\n      report: {\n        startDate,\n        endDate,\n        summary: summary[0],\n        events\n      }\n    };\n  }\n  \n  /**\n   * Determine Firestore collection and field for a PHI field\n   */\n  private getFirestoreLocation(phiFieldName: string): { collection: string; field: string } {\n    // Default mappings - can be customized per implementation\n    const mappings: Record<string, { collection: string; field: string }> = {\n      patientName: { collection: 'users', field: 'displayName' },\n      patientEmail: { collection: 'users', field: 'email' },\n      patientPhone: { collection: 'users', field: 'phoneNumber' },\n      patientDob: { collection: 'patient_profiles', field: 'dateOfBirth' },\n      patientSsn: { collection: 'patient_profiles', field: 'ssn' },\n      patientMrn: { collection: 'patient_profiles', field: 'medicalRecordNumber' },\n      diagnosis: { collection: 'medical_records', field: 'diagnosis' },\n      treatmentDetails: { collection: 'medical_records', field: 'treatmentPlan' },\n      medications: { collection: 'medical_records', field: 'medications' }\n    };\n    \n    return mappings[phiFieldName] || { collection: 'users', field: phiFieldName };\n  }\n  \n  /**\n   * Map PHI field names to ClickHouse column names\n   */\n  private mapPHIFieldToColumn(fieldName: string): string {\n    const mappings: Record<string, string> = {\n      patientName: 'patient_name',\n      patientEmail: 'patient_email',\n      patientPhone: 'patient_phone',\n      patientDob: 'patient_dob',\n      patientSsn: 'patient_ssn',\n      patientMrn: 'patient_mrn',\n      diagnosis: 'diagnosis',\n      treatmentDetails: 'treatment_details',\n      medications: 'medications'\n    };\n    \n    return mappings[fieldName] || fieldName.replace(/([A-Z])/g, '_$1').toLowerCase();\n  }\n  \n  /**\n   * Map ClickHouse column names back to PHI field names\n   */\n  private mapColumnToPHIField(columnName: string): string {\n    const mappings: Record<string, string> = {\n      patient_name: 'patientName',\n      patient_email: 'patientEmail',\n      patient_phone: 'patientPhone',\n      patient_dob: 'patientDob',\n      patient_ssn: 'patientSsn',\n      patient_mrn: 'patientMrn',\n      diagnosis: 'diagnosis',\n      treatment_details: 'treatmentDetails',\n      medications: 'medications'\n    };\n    \n    return mappings[columnName] || columnName;\n  }\n  \n  /**\n   * Fetch PHI value from Firestore\n   */\n  private async fetchPHIValue(\n    userId: string, \n    collection: string, \n    field: string\n  ): Promise<any> {\n    try {\n      const docRef = doc(this.db, collection, userId);\n      const snapshot = await getDoc(docRef);\n      \n      if (!snapshot.exists()) {\n        return null;\n      }\n      \n      const data = snapshot.data();\n      return data[field] || null;\n    } catch (error) {\n      console.error(`Failed to fetch PHI value from ${collection}/${userId}/${field}:`, error);\n      return null;\n    }\n  }\n}\n\n// Export singleton instance\nexport const privacyAuditLogger = PrivacyAuditLogger.getInstance();","import { createClient, ClickHouseClient } from '@clickhouse/client';\n\n/**\n * ClickHouse client singleton for audit logging\n */\nexport class ClickHouseService {\n  private static instance: ClickHouseService;\n  private client: ClickHouseClient | null = null;\n  private config = {\n    host: process.env.CLICKHOUSE_HOST || '',\n    username: process.env.CLICKHOUSE_USER || 'default',\n    password: process.env.CLICKHOUSE_PASSWORD || '',\n    database: process.env.CLICKHOUSE_DATABASE || 'audit_logs',\n    request_timeout: 60000,\n    max_open_connections: 10,\n    compression: {\n      request: true,\n      response: true\n    }\n  };\n  \n  private constructor() {}\n  \n  static getInstance(): ClickHouseService {\n    if (!ClickHouseService.instance) {\n      ClickHouseService.instance = new ClickHouseService();\n    }\n    return ClickHouseService.instance;\n  }\n  \n  /**\n   * Initialize the ClickHouse client\n   */\n  async initialize(): Promise<void> {\n    if (!this.client) {\n      this.client = createClient(this.config);\n      await this.ensureDatabase();\n      await this.ensureTable();\n    }\n  }\n  \n  /**\n   * Get the ClickHouse client instance\n   */\n  getClient(): ClickHouseClient {\n    if (!this.client) {\n      throw new Error('ClickHouse client not initialized. Call initialize() first.');\n    }\n    return this.client;\n  }\n  \n  /**\n   * Ensure the audit database exists\n   */\n  private async ensureDatabase(): Promise<void> {\n    try {\n      await this.client!.query({\n        query: `CREATE DATABASE IF NOT EXISTS ${this.config.database}`,\n        format: 'JSONEachRow'\n      });\n    } catch (error) {\n      console.error('Failed to create database:', error);\n      throw error;\n    }\n  }\n  \n  /**\n   * Ensure the audit events table exists\n   */\n  private async ensureTable(): Promise<void> {\n    const createTableQuery = `\n      CREATE TABLE IF NOT EXISTS ${this.config.database}.audit_events (\n        id String,\n        timestamp DateTime64(3),\n        actor_id String,\n        actor_email String,\n        actor_name String,\n        actor_role String,\n        action String,\n        resource_type String,\n        resource_id String,\n        resource_name String,\n        severity LowCardinality(String),\n        success Boolean,\n        error_message Nullable(String),\n        \n        -- PHI reference fields (stored as encrypted references)\n        patient_name Nullable(String),\n        patient_email Nullable(String),\n        patient_phone Nullable(String),\n        patient_dob Nullable(String),\n        patient_ssn Nullable(String),\n        patient_mrn Nullable(String),\n        diagnosis Nullable(String),\n        treatment_details Nullable(String),\n        medications Nullable(String),\n        \n        -- Non-PHI metadata\n        ip_address Nullable(String),\n        user_agent Nullable(String),\n        department Nullable(String),\n        location Nullable(String),\n        session_id Nullable(String),\n        request_id Nullable(String),\n        \n        -- Custom metadata as JSON\n        metadata String,\n        \n        -- Indexing and partitioning\n        date Date DEFAULT toDate(timestamp)\n      )\n      ENGINE = MergeTree()\n      PARTITION BY toYYYYMM(date)\n      ORDER BY (timestamp, actor_id, action)\n      TTL date + INTERVAL 7 YEAR\n      SETTINGS index_granularity = 8192\n    `;\n    \n    try {\n      await this.client!.query({\n        query: createTableQuery,\n        format: 'JSONEachRow'\n      });\n      \n      // Create materialized views for common queries\n      await this.createMaterializedViews();\n    } catch (error) {\n      console.error('Failed to create table:', error);\n      throw error;\n    }\n  }\n  \n  /**\n   * Create materialized views for performance optimization\n   */\n  private async createMaterializedViews(): Promise<void> {\n    // Daily activity summary\n    const dailyActivityView = `\n      CREATE MATERIALIZED VIEW IF NOT EXISTS ${this.config.database}.daily_activity_mv\n      ENGINE = SummingMergeTree()\n      ORDER BY (date, actor_id, action)\n      AS SELECT\n        date,\n        actor_id,\n        action,\n        count() as event_count,\n        countIf(success = 1) as success_count,\n        countIf(success = 0) as failure_count\n      FROM ${this.config.database}.audit_events\n      GROUP BY date, actor_id, action\n    `;\n    \n    // Resource access patterns\n    const resourceAccessView = `\n      CREATE MATERIALIZED VIEW IF NOT EXISTS ${this.config.database}.resource_access_mv\n      ENGINE = AggregatingMergeTree()\n      ORDER BY (resource_type, resource_id, date)\n      AS SELECT\n        resource_type,\n        resource_id,\n        date,\n        uniqExact(actor_id) as unique_actors,\n        count() as access_count,\n        groupArray(action) as actions\n      FROM ${this.config.database}.audit_events\n      GROUP BY resource_type, resource_id, date\n    `;\n    \n    try {\n      await this.client!.query({ query: dailyActivityView, format: 'JSONEachRow' });\n      await this.client!.query({ query: resourceAccessView, format: 'JSONEachRow' });\n    } catch (error) {\n      // Views might already exist, log but don't throw\n      console.warn('Failed to create materialized views:', error);\n    }\n  }\n  \n  /**\n   * Insert audit events into ClickHouse\n   */\n  async insertEvents(events: any[]): Promise<void> {\n    if (!this.client) {\n      await this.initialize();\n    }\n    \n    try {\n      await this.client!.insert({\n        table: `${this.config.database}.audit_events`,\n        values: events,\n        format: 'JSONEachRow'\n      });\n    } catch (error) {\n      console.error('Failed to insert events:', error);\n      throw error;\n    }\n  }\n  \n  /**\n   * Query audit events\n   */\n  async queryEvents(query: string, params?: Record<string, any>): Promise<any[]> {\n    if (!this.client) {\n      await this.initialize();\n    }\n    \n    try {\n      const result = await this.client!.query({\n        query,\n        format: 'JSONEachRow',\n        query_params: params\n      });\n      \n      return await result.json();\n    } catch (error) {\n      console.error('Failed to query events:', error);\n      throw error;\n    }\n  }\n  \n  /**\n   * Close the ClickHouse connection\n   */\n  async close(): Promise<void> {\n    if (this.client) {\n      await this.client.close();\n      this.client = null;\n    }\n  }\n}\n\n// Export singleton instance\nexport const clickhouseService = ClickHouseService.getInstance();","import { \n  collection, \n  doc, \n  setDoc, \n  getDoc, \n  getDocs, \n  query, \n  where, \n  Timestamp,\n  writeBatch\n} from 'firebase/firestore';\nimport { getFirestore } from 'firebase/firestore';\nimport { getApp } from 'firebase/app';\nimport { hashUserId, generateSalt } from '../utils/crypto';\n\nconst HASH_MAPPINGS_COLLECTION = 'user_hash_mappings';\n\nexport interface HashMapping {\n  hash: string;\n  userId: string;\n  salt: string;\n  createdAt: Timestamp;\n  lastAccessed?: Timestamp;\n}\n\n/**\n * Service for managing user ID hash mappings in Firestore\n */\nexport class HashMappingService {\n  private static instance: HashMappingService;\n  private memoryCache: Map<string, HashMapping> = new Map();\n  private db = getFirestore(getApp());\n  \n  private constructor() {}\n  \n  static getInstance(): HashMappingService {\n    if (!HashMappingService.instance) {\n      HashMappingService.instance = new HashMappingService();\n    }\n    return HashMappingService.instance;\n  }\n  \n  /**\n   * Get or create a hash mapping for a user ID\n   */\n  async getOrCreateHashMapping(userId: string): Promise<string> {\n    // Check memory cache first\n    const cached = Array.from(this.memoryCache.values()).find(\n      mapping => mapping.userId === userId\n    );\n    if (cached) {\n      return cached.hash;\n    }\n    \n    // Check Firestore\n    const mappingsRef = collection(this.db, HASH_MAPPINGS_COLLECTION);\n    const q = query(mappingsRef, where('userId', '==', userId));\n    const snapshot = await getDocs(q);\n    \n    if (!snapshot.empty) {\n      const mapping = snapshot.docs[0].data() as HashMapping;\n      this.memoryCache.set(mapping.hash, mapping);\n      return mapping.hash;\n    }\n    \n    // Create new mapping\n    const salt = generateSalt();\n    const hash = hashUserId(userId, salt);\n    const mapping: HashMapping = {\n      hash,\n      userId,\n      salt,\n      createdAt: Timestamp.now()\n    };\n    \n    await setDoc(doc(this.db, HASH_MAPPINGS_COLLECTION, hash), mapping);\n    this.memoryCache.set(hash, mapping);\n    \n    return hash;\n  }\n  \n  /**\n   * Resolve a hash back to a user ID\n   */\n  async resolveHash(hash: string): Promise<string | null> {\n    // Check memory cache first\n    const cached = this.memoryCache.get(hash);\n    if (cached) {\n      // Update last accessed time asynchronously\n      this.updateLastAccessed(hash);\n      return cached.userId;\n    }\n    \n    // Check Firestore\n    const docRef = doc(this.db, HASH_MAPPINGS_COLLECTION, hash);\n    const snapshot = await getDoc(docRef);\n    \n    if (!snapshot.exists()) {\n      return null;\n    }\n    \n    const mapping = snapshot.data() as HashMapping;\n    this.memoryCache.set(hash, mapping);\n    \n    // Update last accessed time asynchronously\n    this.updateLastAccessed(hash);\n    \n    return mapping.userId;\n  }\n  \n  /**\n   * Batch create hash mappings for multiple users\n   */\n  async batchCreateHashMappings(userIds: string[]): Promise<Map<string, string>> {\n    const batch = writeBatch(this.db);\n    const userHashMap = new Map<string, string>();\n    \n    for (const userId of userIds) {\n      // Check if mapping already exists\n      const existingHash = await this.getOrCreateHashMapping(userId);\n      if (existingHash) {\n        userHashMap.set(userId, existingHash);\n        continue;\n      }\n      \n      const salt = generateSalt();\n      const hash = hashUserId(userId, salt);\n      const mapping: HashMapping = {\n        hash,\n        userId,\n        salt,\n        createdAt: Timestamp.now()\n      };\n      \n      batch.set(doc(this.db, HASH_MAPPINGS_COLLECTION, hash), mapping);\n      userHashMap.set(userId, hash);\n      this.memoryCache.set(hash, mapping);\n    }\n    \n    await batch.commit();\n    return userHashMap;\n  }\n  \n  /**\n   * Resolve multiple hashes in batch\n   */\n  async batchResolveHashes(hashes: string[]): Promise<Map<string, string>> {\n    const resolvedMap = new Map<string, string>();\n    const uncachedHashes: string[] = [];\n    \n    // Check cache first\n    for (const hash of hashes) {\n      const cached = this.memoryCache.get(hash);\n      if (cached) {\n        resolvedMap.set(hash, cached.userId);\n      } else {\n        uncachedHashes.push(hash);\n      }\n    }\n    \n    // Fetch uncached from Firestore\n    if (uncachedHashes.length > 0) {\n      const mappingsRef = collection(this.db, HASH_MAPPINGS_COLLECTION);\n      const q = query(mappingsRef, where('hash', 'in', uncachedHashes));\n      const snapshot = await getDocs(q);\n      \n      snapshot.docs.forEach(doc => {\n        const mapping = doc.data() as HashMapping;\n        resolvedMap.set(mapping.hash, mapping.userId);\n        this.memoryCache.set(mapping.hash, mapping);\n      });\n    }\n    \n    // Update last accessed times asynchronously\n    hashes.forEach(hash => this.updateLastAccessed(hash));\n    \n    return resolvedMap;\n  }\n  \n  /**\n   * Clear memory cache (useful for testing or memory management)\n   */\n  clearCache(): void {\n    this.memoryCache.clear();\n  }\n  \n  /**\n   * Update last accessed timestamp for a hash mapping\n   */\n  private async updateLastAccessed(hash: string): Promise<void> {\n    try {\n      await setDoc(\n        doc(this.db, HASH_MAPPINGS_COLLECTION, hash),\n        { lastAccessed: Timestamp.now() },\n        { merge: true }\n      );\n    } catch (error) {\n      // Log error but don't throw - this is a non-critical operation\n      console.error('Failed to update last accessed time:', error);\n    }\n  }\n}\n\n// Export singleton instance\nexport const hashMappingService = HashMappingService.getInstance();","import { createHash, randomBytes } from 'crypto';\n\n/**\n * Cryptographic utilities for privacy-preserving audit logging\n */\n\n/**\n * Generate a deterministic hash for a user ID with an optional salt\n * This creates a one-way hash that can be used to obfuscate user IDs\n */\nexport function hashUserId(userId: string, salt?: string): string {\n  const data = salt ? `${userId}:${salt}` : userId;\n  return createHash('sha256').update(data).digest('hex');\n}\n\n/**\n * Generate a cryptographically secure random salt\n */\nexport function generateSalt(): string {\n  return randomBytes(32).toString('hex');\n}\n\n/**\n * Create a PHI reference string in the format: hash.collection.field\n */\nexport function createPHIReference(\n  hashedUserId: string,\n  collection: string,\n  field: string\n): string {\n  return `${hashedUserId}.${collection}.${field}`;\n}\n\n/**\n * Parse a PHI reference string into its components\n */\nexport function parsePHIReference(reference: string): {\n  hashedUserId: string;\n  collection: string;\n  field: string;\n} | null {\n  const parts = reference.split('.');\n  if (parts.length !== 3) {\n    return null;\n  }\n  \n  return {\n    hashedUserId: parts[0],\n    collection: parts[1],\n    field: parts[2]\n  };\n}\n\n/**\n * Batch hash multiple values for efficiency\n */\nexport function batchHashUserIds(\n  userIds: string[],\n  salt?: string\n): Map<string, string> {\n  const hashMap = new Map<string, string>();\n  \n  for (const userId of userIds) {\n    hashMap.set(userId, hashUserId(userId, salt));\n  }\n  \n  return hashMap;\n}","import { useCallback, useState } from 'react';\nimport { audit } from '../services/audit.service';\nimport { AuditEventOptions, AuditEvent, AuditError } from '../types';\n\nexport function useAuditLog() {\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<AuditError | null>(null);\n  const [lastEvent, setLastEvent] = useState<AuditEvent | null>(null);\n\n  const log = useCallback(async (options: AuditEventOptions): Promise<AuditEvent> => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const event = await audit.log(options);\n      setLastEvent(event);\n      return event;\n    } catch (err: any) {\n      const auditError: AuditError = {\n        code: err.code || 'audit/log-failed',\n        message: err.message || 'Failed to log audit event',\n        originalError: err,\n      };\n      setError(auditError);\n      throw auditError;\n    } finally {\n      setLoading(false);\n    }\n  }, []);\n\n  const logAction = useCallback(async (\n    action: string,\n    resourceType: string,\n    resourceId: string,\n    metadata?: any\n  ): Promise<AuditEvent> => {\n    return log({\n      action,\n      resource: {\n        type: resourceType,\n        id: resourceId,\n      },\n      metadata,\n    });\n  }, [log]);\n\n  const logSuccess = useCallback(async (\n    action: string,\n    resource: any,\n    changes?: any\n  ): Promise<AuditEvent> => {\n    return log({\n      action,\n      resource,\n      result: 'success',\n      changes,\n    });\n  }, [log]);\n\n  const logFailure = useCallback(async (\n    action: string,\n    resource: any,\n    error: any\n  ): Promise<AuditEvent> => {\n    return log({\n      action,\n      resource,\n      result: 'failure',\n      metadata: {\n        error: error.message || error,\n        errorCode: error.code,\n      },\n    });\n  }, [log]);\n\n  return {\n    log,\n    logAction,\n    logSuccess,\n    logFailure,\n    loading,\n    error,\n    lastEvent,\n  };\n}","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { audit } from '../services/audit.service';\nimport { AuditEvent, StreamConfig, StreamFilter } from '../types';\n\ninterface UseAuditStreamOptions {\n  filter?: StreamFilter;\n  limit?: number;\n  autoConnect?: boolean;\n}\n\nexport function useAuditStream(options: UseAuditStreamOptions = {}) {\n  const { filter, limit = 50, autoConnect = true } = options;\n  const [events, setEvents] = useState<AuditEvent[]>([]);\n  const [loading, setLoading] = useState(false);\n  const [connected, setConnected] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const subscriptionRef = useRef<any>(null);\n\n  const connect = useCallback(() => {\n    if (subscriptionRef.current) {\n      return; // Already connected\n    }\n\n    setLoading(true);\n    setError(null);\n\n    try {\n      const config: StreamConfig = {\n        filter,\n        onEvent: (event) => {\n          setEvents(prev => {\n            const newEvents = [event, ...prev];\n            return newEvents.slice(0, limit);\n          });\n        },\n        onError: (streamError) => {\n          setError(new Error(streamError.message));\n        },\n        onConnect: () => {\n          setConnected(true);\n          setLoading(false);\n        },\n        onDisconnect: () => {\n          setConnected(false);\n        },\n      };\n\n      subscriptionRef.current = audit.stream(config);\n    } catch (err: any) {\n      setError(err);\n      setLoading(false);\n    }\n  }, [filter, limit]);\n\n  const disconnect = useCallback(() => {\n    if (subscriptionRef.current) {\n      subscriptionRef.current.unsubscribe();\n      subscriptionRef.current = null;\n      setConnected(false);\n    }\n  }, []);\n\n  const pause = useCallback(() => {\n    if (subscriptionRef.current) {\n      subscriptionRef.current.pause();\n    }\n  }, []);\n\n  const resume = useCallback(() => {\n    if (subscriptionRef.current) {\n      subscriptionRef.current.resume();\n    }\n  }, []);\n\n  const updateFilter = useCallback((newFilter: StreamFilter) => {\n    if (subscriptionRef.current) {\n      subscriptionRef.current.updateFilter(newFilter);\n    }\n  }, []);\n\n  const clear = useCallback(() => {\n    setEvents([]);\n  }, []);\n\n  // Auto-connect on mount if enabled\n  useEffect(() => {\n    if (autoConnect) {\n      connect();\n    }\n\n    return () => {\n      disconnect();\n    };\n  }, [autoConnect, connect, disconnect]);\n\n  return {\n    events,\n    loading,\n    connected,\n    error,\n    connect,\n    disconnect,\n    pause,\n    resume,\n    updateFilter,\n    clear,\n  };\n}","import { useState, useEffect, useCallback } from 'react';\nimport { audit } from '../services/audit.service';\nimport { AuditEvent, AuditEventStats } from '../types';\n\ninterface UseUserActivityOptions {\n  range?: 'today' | 'last7days' | 'last30days' | 'custom';\n  startDate?: Date;\n  endDate?: Date;\n  autoLoad?: boolean;\n}\n\nexport function useUserActivity(userId: string, options: UseUserActivityOptions = {}) {\n  const { range = 'last30days', startDate, endDate, autoLoad = true } = options;\n  const [activity, setActivity] = useState<AuditEvent[]>([]);\n  const [stats, setStats] = useState<AuditEventStats | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  const getDateRange = useCallback(() => {\n    const now = new Date();\n    let start: Date;\n    let end = endDate || now;\n\n    switch (range) {\n      case 'today':\n        start = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n        break;\n      case 'last7days':\n        start = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n        break;\n      case 'last30days':\n        start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n        break;\n      case 'custom':\n        start = startDate || new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n        break;\n      default:\n        start = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n    }\n\n    return { start, end };\n  }, [range, startDate, endDate]);\n\n  const loadActivity = useCallback(async () => {\n    if (!userId) return;\n\n    setLoading(true);\n    setError(null);\n\n    try {\n      const { start, end } = getDateRange();\n      const events = await audit.getUserActivity(userId, start, end);\n      \n      setActivity(events);\n\n      // Calculate stats\n      const calculatedStats: AuditEventStats = {\n        total: events.length,\n        byAction: {},\n        byActor: {},\n        byResource: {},\n        byResult: {},\n        byHour: {},\n        byDay: {},\n      };\n\n      events.forEach(event => {\n        // By action\n        calculatedStats.byAction[event.action] = (calculatedStats.byAction[event.action] || 0) + 1;\n        \n        // By actor\n        const actorKey = `${event.actor.type}:${event.actor.id}`;\n        calculatedStats.byActor[actorKey] = (calculatedStats.byActor[actorKey] || 0) + 1;\n        \n        // By resource\n        calculatedStats.byResource[event.resource.type] = (calculatedStats.byResource[event.resource.type] || 0) + 1;\n        \n        // By result\n        calculatedStats.byResult[event.result] = (calculatedStats.byResult[event.result] || 0) + 1;\n        \n        // By hour\n        const hour = event.timestamp.getHours();\n        calculatedStats.byHour![hour] = (calculatedStats.byHour![hour] || 0) + 1;\n        \n        // By day\n        const day = event.timestamp.toDateString();\n        calculatedStats.byDay![day] = (calculatedStats.byDay![day] || 0) + 1;\n      });\n\n      setStats(calculatedStats);\n    } catch (err: any) {\n      setError(err);\n    } finally {\n      setLoading(false);\n    }\n  }, [userId, getDateRange]);\n\n  const refresh = useCallback(() => {\n    loadActivity();\n  }, [loadActivity]);\n\n  // Auto-load on mount and when dependencies change\n  useEffect(() => {\n    if (autoLoad) {\n      loadActivity();\n    }\n  }, [autoLoad, loadActivity]);\n\n  return {\n    activity,\n    stats,\n    loading,\n    error,\n    refresh,\n  };\n}","import { useState, useCallback } from 'react';\nimport { audit } from '../services/audit.service';\nimport { AuditEventQuery, AuditEventResult, EventFilters } from '../types';\n\nexport function useAuditSearch() {\n  const [result, setResult] = useState<AuditEventResult | null>(null);\n  const [loading, setLoading] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const [filters, setFilters] = useState<EventFilters>({});\n  const [page, setPage] = useState(1);\n  const [pageSize, setPageSize] = useState(50);\n\n  const search = useCallback(async (query?: AuditEventQuery) => {\n    setLoading(true);\n    setError(null);\n\n    try {\n      const searchQuery: AuditEventQuery = query || {\n        filters,\n        pagination: {\n          page,\n          limit: pageSize,\n        },\n      };\n\n      const searchResult = await audit.query(searchQuery);\n      setResult(searchResult);\n    } catch (err: any) {\n      setError(err);\n    } finally {\n      setLoading(false);\n    }\n  }, [filters, page, pageSize]);\n\n  const updateFilters = useCallback((newFilters: Partial<EventFilters>) => {\n    setFilters(prev => ({ ...prev, ...newFilters }));\n    setPage(1); // Reset to first page when filters change\n  }, []);\n\n  const clearFilters = useCallback(() => {\n    setFilters({});\n    setPage(1);\n  }, []);\n\n  const nextPage = useCallback(() => {\n    if (result && result.hasMore) {\n      setPage(prev => prev + 1);\n    }\n  }, [result]);\n\n  const previousPage = useCallback(() => {\n    if (page > 1) {\n      setPage(prev => prev - 1);\n    }\n  }, [page]);\n\n  const goToPage = useCallback((pageNumber: number) => {\n    if (pageNumber >= 1) {\n      setPage(pageNumber);\n    }\n  }, []);\n\n  const changePageSize = useCallback((size: number) => {\n    setPageSize(size);\n    setPage(1); // Reset to first page when page size changes\n  }, []);\n\n  return {\n    result,\n    loading,\n    error,\n    filters,\n    page,\n    pageSize,\n    search,\n    updateFilters,\n    clearFilters,\n    nextPage,\n    previousPage,\n    goToPage,\n    changePageSize,\n  };\n}","import { useCallback } from 'react';\nimport { useAuth } from '../../auth/hooks/useAuth';\nimport { privacyAuditLogger } from '../services/privacyAuditLogger';\nimport type { PHIFields } from '../services/privacyAuditLogger';\n\nexport interface UsePrivacyAuditLogOptions {\n  defaultMetadata?: Record<string, any>;\n  autoIncludeUser?: boolean;\n}\n\nexport interface PrivacyAuditLogFunction {\n  (\n    action: string,\n    options?: {\n      resourceType?: string;\n      resourceId?: string;\n      resourceName?: string;\n      phi?: PHIFields;\n      metadata?: Record<string, any>;\n      severity?: 'low' | 'medium' | 'high' | 'critical';\n      success?: boolean;\n      error?: string;\n    }\n  ): Promise<string>;\n}\n\nexport interface UsePrivacyAuditLogReturn {\n  logEvent: PrivacyAuditLogFunction;\n  logPHIAccess: (\n    patientId: string,\n    accessType: 'view' | 'update' | 'delete',\n    phiData?: PHIFields\n  ) => Promise<string>;\n  logError: (\n    action: string,\n    error: Error | string,\n    options?: {\n      resourceType?: string;\n      resourceId?: string;\n      metadata?: Record<string, any>;\n    }\n  ) => Promise<string>;\n}\n\n/**\n * Hook for privacy-aware audit logging with automatic user context\n */\nexport function usePrivacyAuditLog(\n  options: UsePrivacyAuditLogOptions = {}\n): UsePrivacyAuditLogReturn {\n  const { user } = useAuth();\n  const { defaultMetadata = {}, autoIncludeUser = true } = options;\n  \n  const logEvent: PrivacyAuditLogFunction = useCallback(\n    async (action, eventOptions = {}) => {\n      const actor = autoIncludeUser && user\n        ? {\n            id: user.uid,\n            email: user.email || undefined,\n            name: user.displayName || undefined,\n            role: user.customClaims?.role || undefined,\n          }\n        : { id: 'anonymous' };\n      \n      const metadata = {\n        ...defaultMetadata,\n        ...eventOptions.metadata,\n        userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n        timestamp: new Date().toISOString(),\n      };\n      \n      return privacyAuditLogger.logEvent({\n        actor,\n        action,\n        resource: eventOptions.resourceType\n          ? {\n              type: eventOptions.resourceType,\n              id: eventOptions.resourceId || '',\n              name: eventOptions.resourceName,\n            }\n          : undefined,\n        phi: eventOptions.phi,\n        metadata,\n        severity: eventOptions.severity,\n        success: eventOptions.success,\n        error: eventOptions.error,\n      });\n    },\n    [user, autoIncludeUser, defaultMetadata]\n  );\n  \n  const logPHIAccess = useCallback(\n    async (\n      patientId: string,\n      accessType: 'view' | 'update' | 'delete',\n      phiData?: PHIFields\n    ) => {\n      return logEvent(`phi_${accessType}`, {\n        resourceType: 'patient',\n        resourceId: patientId,\n        phi: phiData,\n        severity: accessType === 'delete' ? 'high' : 'medium',\n      });\n    },\n    [logEvent]\n  );\n  \n  const logError = useCallback(\n    async (\n      action: string,\n      error: Error | string,\n      errorOptions?: {\n        resourceType?: string;\n        resourceId?: string;\n        metadata?: Record<string, any>;\n      }\n    ) => {\n      const errorMessage = error instanceof Error ? error.message : error;\n      const errorStack = error instanceof Error ? error.stack : undefined;\n      \n      return logEvent(action, {\n        ...errorOptions,\n        success: false,\n        error: errorMessage,\n        severity: 'high',\n        metadata: {\n          ...errorOptions?.metadata,\n          errorStack,\n          errorType: error instanceof Error ? error.name : 'Error',\n        },\n      });\n    },\n    [logEvent]\n  );\n  \n  return {\n    logEvent,\n    logPHIAccess,\n    logError,\n  };\n}\n\n/**\n * Hook for tracking PHI field access with automatic logging\n */\nexport function usePHIFieldTracking(patientId: string) {\n  const { logPHIAccess } = usePrivacyAuditLog();\n  \n  const trackFieldAccess = useCallback(\n    (fieldName: string, value: any, accessType: 'view' | 'update' = 'view') => {\n      // Log the access without exposing the actual value\n      logPHIAccess(patientId, accessType, {\n        [fieldName]: '***REDACTED***', // Log that field was accessed without the value\n      });\n      \n      return value;\n    },\n    [patientId, logPHIAccess]\n  );\n  \n  const createTrackedField = useCallback(\n    <T>(fieldName: string) => ({\n      get: (value: T): T => trackFieldAccess(fieldName, value, 'view'),\n      set: (value: T): T => trackFieldAccess(fieldName, value, 'update'),\n    }),\n    [trackFieldAccess]\n  );\n  \n  return {\n    trackFieldAccess,\n    createTrackedField,\n  };\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\n\ninterface AuditLogViewerProps {\n  filters?: any;\n  columns?: string[];\n  exportFormats?: string[];\n}\n\nexport function AuditLogViewer({ filters, columns, exportFormats }: AuditLogViewerProps) {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Audit Log Viewer</Title>\n      <Text c=\"dimmed\" size=\"sm\">Audit log viewer coming soon</Text>\n    </Paper>\n  );\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\n\ninterface ActivityTimelineProps {\n  userId: string;\n  groupBy?: 'hour' | 'day' | 'week';\n  showDetails?: boolean;\n}\n\nexport function ActivityTimeline({ userId, groupBy, showDetails }: ActivityTimelineProps) {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Activity Timeline</Title>\n      <Text c=\"dimmed\" size=\"sm\">Activity timeline coming soon</Text>\n    </Paper>\n  );\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\nimport { AuditEvent } from '../../types';\n\ninterface AuditEventDetailsProps {\n  event: AuditEvent;\n}\n\nexport function AuditEventDetails({ event }: AuditEventDetailsProps) {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Audit Event Details</Title>\n      <Text c=\"dimmed\" size=\"sm\">Event details viewer coming soon</Text>\n    </Paper>\n  );\n}","'use client';\n\nimport React from 'react';\nimport { Paper, Title, Text } from '@mantine/core';\n\ninterface AuditSearchBarProps {\n  onSearch?: (query: string) => void;\n}\n\nexport function AuditSearchBar({ onSearch }: AuditSearchBarProps) {\n  return (\n    <Paper shadow=\"sm\" radius=\"md\" p=\"lg\">\n      <Title order={4}>Audit Search</Title>\n      <Text c=\"dimmed\" size=\"sm\">Search functionality coming soon</Text>\n    </Paper>\n  );\n}","import { AuditEvent, AuditFormatter as IAuditFormatter } from '../types';\n\nexport class AuditFormatter {\n  static defaultFormatter: IAuditFormatter = {\n    name: 'default',\n    format: (event: AuditEvent) => event,\n  };\n\n  static jsonFormatter: IAuditFormatter = {\n    name: 'json',\n    format: (event: AuditEvent) => {\n      return {\n        ...event,\n        timestamp: event.timestamp.toISOString(),\n        formatted: true,\n      } as any;\n    },\n  };\n\n  static humanReadableFormatter: IAuditFormatter = {\n    name: 'human-readable',\n    format: (event: AuditEvent) => {\n      const formatted = { ...event };\n      \n      // Format the action as human readable\n      formatted.action = event.action\n        .split('.')\n        .map(part => part.charAt(0).toUpperCase() + part.slice(1))\n        .join(' ');\n      \n      return formatted;\n    },\n  };\n\n  static privacyFormatter: IAuditFormatter = {\n    name: 'privacy',\n    format: (event: AuditEvent) => {\n      const formatted = { ...event };\n      \n      // Redact sensitive information\n      if (formatted.actor.email) {\n        const [localPart, domain] = formatted.actor.email.split('@');\n        formatted.actor.email = `${localPart.slice(0, 2)}***@${domain}`;\n      }\n      \n      if (formatted.context?.ip) {\n        const parts = formatted.context.ip.split('.');\n        formatted.context.ip = `${parts[0]}.${parts[1]}.xxx.xxx`;\n      }\n      \n      return formatted;\n    },\n  };\n\n  static compactFormatter: AuditFormatter = {\n    name: 'compact',\n    format: (event: AuditEvent) => {\n      return {\n        id: event.id,\n        timestamp: event.timestamp,\n        action: event.action,\n        actor: event.actor.id,\n        resource: `${event.resource.type}:${event.resource.id}`,\n        result: event.result,\n      } as any;\n    },\n  };\n}","import { AuditEvent, AuditEventExport } from '../types';\n\nexport class AuditExporter {\n  static async exportToCSV(events: AuditEvent[], options?: Partial<AuditEventExport>): Promise<string> {\n    const fields = options?.fields || [\n      'id',\n      'timestamp',\n      'actor.id',\n      'actor.type',\n      'action',\n      'resource.type',\n      'resource.id',\n      'result',\n    ];\n\n    // Create header row\n    const header = fields.join(',');\n    \n    // Create data rows\n    const rows = events.map(event => {\n      return fields.map(field => {\n        const value = this.getNestedValue(event, field);\n        // Escape values containing commas or quotes\n        if (typeof value === 'string' && (value.includes(',') || value.includes('\"'))) {\n          return `\"${value.replace(/\"/g, '\"\"')}\"`;\n        }\n        return value?.toString() || '';\n      }).join(',');\n    });\n\n    return [header, ...rows].join('\\n');\n  }\n\n  static async exportToJSON(events: AuditEvent[], options?: Partial<AuditEventExport>): Promise<string> {\n    const fields = options?.fields;\n    \n    if (fields) {\n      // Export only specified fields\n      const filtered = events.map(event => {\n        const result: any = {};\n        fields.forEach(field => {\n          result[field] = this.getNestedValue(event, field);\n        });\n        return result;\n      });\n      return JSON.stringify(filtered, null, 2);\n    }\n\n    return JSON.stringify(events, null, 2);\n  }\n\n  static async export(events: AuditEvent[], options: AuditEventExport): Promise<Blob> {\n    let content: string;\n    let mimeType: string;\n\n    switch (options.format) {\n      case 'csv':\n        content = await this.exportToCSV(events, options);\n        mimeType = 'text/csv';\n        break;\n      case 'json':\n        content = await this.exportToJSON(events, options);\n        mimeType = 'application/json';\n        break;\n      default:\n        throw new Error(`Unsupported export format: ${options.format}`);\n    }\n\n    return new Blob([content], { type: mimeType });\n  }\n\n  static download(blob: Blob, filename: string): void {\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = filename;\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    URL.revokeObjectURL(url);\n  }\n\n  private static getNestedValue(obj: any, path: string): any {\n    return path.split('.').reduce((current, key) => current?.[key], obj);\n  }\n}","// Core exports\nexport { audit } from './services/audit.service';\nexport type { AuditConfig, AuditEvent } from './types';\n\n// Privacy-preserving audit exports\nexport { privacyAuditLogger } from './services/privacyAuditLogger';\nexport type { PHIFields } from './services/privacyAuditLogger';\n\n// Utility exports\nexport { \n  hashUserId, \n  generateSalt, \n  createPHIReference, \n  parsePHIReference \n} from './utils/crypto';\n\n// Service exports for advanced usage\nexport { hashMappingService } from './services/hashMapping';\nexport { clickhouseService } from './services/clickhouse';\n\n// Hooks\nexport { useAuditLog } from './hooks/useAuditLog';\nexport { useAuditStream } from './hooks/useAuditStream';\nexport { useUserActivity } from './hooks/useUserActivity';\nexport { useAuditSearch } from './hooks/useAuditSearch';\nexport { usePrivacyAuditLog, usePHIFieldTracking } from './hooks/usePrivacyAuditLog';\n\n// Components\nexport { AuditLogViewer } from './components/AuditLogViewer';\nexport { ActivityTimeline } from './components/ActivityTimeline';\nexport { AuditEventDetails } from './components/AuditEventDetails';\nexport { AuditSearchBar } from './components/AuditSearchBar';\n\n// Utilities\nexport { AuditFormatter } from './utils/formatter';\nexport { AuditExporter } from './utils/exporter';\n\n// Types\nexport type {\n  Actor,\n  Resource,\n  Changes,\n  Context,\n  AuditEventOptions,\n  AuditEventQuery,\n  AuditEventResult,\n  AuditEventStats,\n  StreamConfig,\n  StreamSubscription,\n} from './types';\n\n// Privacy-aware convenience functions\nimport { privacyAuditLogger } from './services/privacyAuditLogger';\nimport { clickhouseService } from './services/clickhouse';\n\n/**\n * Initialize the audit system with privacy features\n */\nexport async function initializePrivacyAudit(): Promise<void> {\n  await clickhouseService.initialize();\n}\n\n/**\n * Log an audit event with automatic PHI obfuscation\n */\nexport async function logPrivacyAuditEvent(\n  action: string,\n  options?: {\n    userId?: string;\n    resourceType?: string;\n    resourceId?: string;\n    phi?: Record<string, any>;\n    metadata?: Record<string, any>;\n  }\n): Promise<string> {\n  return privacyAuditLogger.logEvent({\n    actor: {\n      id: options?.userId || 'system',\n    },\n    action,\n    resource: options?.resourceType ? {\n      type: options.resourceType,\n      id: options.resourceId || '',\n    } : undefined,\n    phi: options?.phi,\n    metadata: options?.metadata,\n  });\n}\n\n/**\n * Log PHI access for HIPAA compliance\n */\nexport async function logPHIAccess(\n  userId: string,\n  patientId: string,\n  accessType: 'view' | 'update' | 'delete',\n  phiData?: Record<string, any>\n): Promise<string> {\n  return privacyAuditLogger.logEvent({\n    actor: {\n      id: userId,\n    },\n    action: `phi_${accessType}`,\n    resource: {\n      type: 'patient',\n      id: patientId,\n    },\n    phi: phiData,\n    severity: accessType === 'delete' ? 'high' : 'medium',\n  });\n}\n\n/**\n * Generate HIPAA compliance audit report\n */\nexport async function generateHIPAAComplianceReport(\n  startDate: Date,\n  endDate: Date,\n  options?: {\n    includePHI?: boolean;\n    actorId?: string;\n    resourceType?: string;\n  }\n): Promise<any> {\n  return privacyAuditLogger.generateAuditReport(startDate, endDate, options);\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iBAKO;AACP,kBAgBO;AAUP,IAAM,cAAN,MAAkB;AAAA,EAMhB,YAAY,QAAoB;AAFhC,SAAQ,oBAAsC,oBAAI,IAAI;AAGpD,SAAK,SAAS;AAGd,SAAK,UAAM,oBAAQ,EAAE,SAAS,QAC1B,mBAAO,QACP,0BAAc,OAAO,cAAc;AAEvC,SAAK,WAAO,qBAAQ,KAAK,GAAG;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAM,aAA4B;AAEhC,wCAAmB,KAAK,MAAM,OAAO,SAAS;AAC5C,UAAI,MAAM;AACR,cAAM,KAAK,YAAY,IAAI;AAC3B,YAAI,KAAK,OAAO,iBAAiB,KAAK,UAAU,IAAI,GAAG;AACrD,gBAAM,KAAK,OAAO,cAAc,IAAgB;AAAA,QAClD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,SAAqD;AAChE,QAAI;AACF,YAAM,EAAE,OAAO,UAAU,aAAa,UAAU,SAAS,IAAI;AAE7D,YAAM,iBAAiB,UAAM;AAAA,QAC3B,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAGA,UAAI,eAAe,UAAU;AAC3B,kBAAM,2BAAc,eAAe,MAAM;AAAA,UACvC;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAGA,UAAI,UAAU;AACZ,cAAM,KAAK,gBAAgB,eAAe,KAAK,KAAK,QAAQ;AAAA,MAC9D;AAEA,YAAM,OAAO,MAAM,KAAK,YAAY,eAAe,IAAI;AACvD,aAAO,EAAE,KAAK;AAAA,IAChB,SAAS,OAAY;AACnB,YAAM,KAAK,eAAe,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAO,SAAqD;AAChE,QAAI;AACF,YAAM,EAAE,OAAO,UAAU,aAAa,MAAM,IAAI;AAGhD,gBAAM;AAAA,QACJ,KAAK;AAAA,QACL,aAAa,sCAA0B;AAAA,MACzC;AAEA,YAAM,iBAAiB,UAAM;AAAA,QAC3B,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,KAAK,YAAY,eAAe,IAAI;AACvD,aAAO,EAAE,KAAK;AAAA,IAChB,SAAS,OAAY;AACnB,YAAM,KAAK,eAAe,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAW,UAAqD;AACpE,QAAI;AACF,UAAI;AAEJ,cAAQ,UAAU;AAAA,QAChB,KAAK;AACH,yBAAe,IAAI,+BAAmB;AACtC;AAAA,QACF,KAAK;AACH,yBAAe,IAAI,+BAAmB;AACtC;AAAA,QACF;AACE,gBAAM,IAAI,MAAM,YAAY,QAAQ,oBAAoB;AAAA,MAC5D;AAEA,YAAM,iBAAiB,UAAM,6BAAgB,KAAK,MAAM,YAAY;AACpE,YAAM,OAAO,MAAM,KAAK,YAAY,eAAe,IAAI;AACvD,aAAO,EAAE,KAAK;AAAA,IAChB,SAAS,OAAY;AACnB,YAAM,KAAK,eAAe,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAyB;AAC7B,QAAI;AACF,gBAAM,YAAAC,SAAgB,KAAK,IAAI;AAC/B,WAAK,kBAAkB,MAAM;AAAA,IAC/B,SAAS,OAAY;AACnB,YAAM,KAAK,eAAe,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,uBAAuB,OAA8B;AACzD,QAAI;AACF,gBAAM,oCAAuB,KAAK,MAAM,KAAK;AAAA,IAC/C,SAAS,OAAY;AACnB,YAAM,KAAK,eAAe,KAAK;AAAA,IACjC;AAAA,EACF;AAAA;AAAA,EAGA,iBAAkC;AAChC,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,CAAC,KAAM,QAAO;AAGlB,WAAO,KAAK,sBAAsB,IAAI;AAAA,EACxC;AAAA;AAAA,EAGA,kBAAkB,UAAuD;AACvE,eAAO,gCAAmB,KAAK,MAAM,OAAO,SAAS;AACnD,UAAI,MAAM;AACR,cAAM,eAAe,MAAM,KAAK,YAAY,IAAI;AAChD,iBAAS,YAAY;AAAA,MACvB,OAAO;AACL,iBAAS,IAAI;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,MAAc,YAAY,MAAuC;AAC/D,UAAM,cAAc,MAAM,KAAK,iBAAiB;AAChD,UAAM,eAAe,YAAY;AAGjC,SAAK,kBAAkB,IAAI,KAAK,KAAK,YAAY;AAEjD,UAAM,eAAyB;AAAA,MAC7B,GAAG;AAAA,MACH;AAAA,MACA,MAAM,aAAa;AAAA,MACnB,OAAO,aAAa;AAAA,MACpB,YAAY,aAAa;AAAA,MACzB,aAAa,aAAa;AAAA,MAC1B,SAAS,aAAa;AAAA,MACtB,cAAc,aAAa;AAAA,MAC3B,aAAa,aAAa;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,sBAAsB,MAA8B;AAC1D,UAAM,eAAe,KAAK,kBAAkB,IAAI,KAAK,GAAG,KAAK,CAAC;AAE9D,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,MAAM,aAAa;AAAA,MACnB,aAAa,aAAa;AAAA,MAC1B,YAAY,aAAa;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAGQ,UAAU,MAA6B;AAC7C,QAAI,CAAC,KAAK,SAAS,aAAc,QAAO;AAExC,UAAM,eAAe,IAAI,KAAK,KAAK,SAAS,YAAY,EAAE,QAAQ;AAClE,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,YAAY,KAAK;AAEvB,WAAO,MAAM,eAAe;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAc,gBAAgB,MAAc,WAA+B;AAEzE,YAAQ,KAAK,qDAAqD;AAAA,EACpE;AAAA;AAAA,EAGQ,eAAe,OAAuB;AAC5C,UAAM,YAAY,MAAM,QAAQ;AAChC,QAAI,UAAU,MAAM,WAAW;AAG/B,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,IACJ;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAGA,UAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,SAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AACF;AAGA,IAAI,eAAmC;AAGhC,SAAS,SAAS,QAAiC;AACxD,MAAI,CAAC,cAAc;AACjB,mBAAe,IAAI,YAAY,MAAM;AACrC,iBAAa,WAAW;AAAA,EAC1B;AACA,SAAO;AACT;AAGO,SAAS,kBAA+B;AAC7C,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;;;AClSA,IAAM,gBAAN,MAAoB;AAAA,EAApB;AACE,SAAQ,UAAmC,oBAAI,IAAI;AACnD,SAAQ,YAAyC,oBAAI,IAAI;AACzD,SAAQ,qBAAqB,IAAI,KAAK,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA,EAGhD,MAAM,WAAW,SAAqC,MAAe,YAA0C;AAC7G,QAAI;AAGJ,QAAI,OAAO,YAAY,UAAU;AAC/B,sBAAgB;AAAA,QACd,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,IACF,OAAO;AACL,sBAAgB;AAAA,IAClB;AAGA,QAAI,CAAC,KAAK,aAAa,cAAc,KAAK,GAAG;AAC3C,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAGA,UAAM,iBAAiB,KAAK,kBAAkB,cAAc,KAAK;AACjE,QAAI,kBAAkB,eAAe,WAAW,WAAW;AACzD,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAGA,UAAM,SAAqB;AAAA,MACzB,IAAI,KAAK,iBAAiB;AAAA,MAC1B,OAAO,cAAc;AAAA,MACrB,QAAQ;AAAA,MACR,aAAa;AAAA,QACX,WAAW,cAAc,aAAa;AAAA,UACpC,MAAM,cAAc;AAAA,UACpB,YAAY,cAAc;AAAA,UAC1B,aAAa,cAAc;AAAA,QAC7B;AAAA,QACA,aAAa,cAAc;AAAA,QAC3B,UAAU,cAAc;AAAA,MAC1B;AAAA,MACA,WAAW,MAAM,KAAK,iBAAiB;AAAA,MACvC,WAAW,oBAAI,KAAK;AAAA,MACpB,WAAW,KAAK,wBAAwB,cAAc,aAAa,IAAI;AAAA,MACvE,UAAU,cAAc;AAAA,IAC1B;AAGA,SAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;AAGlC,QAAI,cAAc,cAAc,OAAO;AACrC,YAAM,KAAK,gBAAgB,MAAM;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,YAAY,SAAyD;AACzE,UAAM,SAA2B;AAAA,MAC/B,YAAY,CAAC;AAAA,MACb,QAAQ,CAAC;AAAA,IACX;AAEA,eAAW,iBAAiB,SAAS;AACnC,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,WAAW,aAAa;AAClD,eAAO,WAAW,KAAK,OAAO,KAAK;AAAA,MACrC,SAAS,OAAY;AACnB,eAAO,OAAO,KAAK;AAAA,UACjB,OAAO,cAAc;AAAA,UACrB,OAAO,MAAM;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,qBAAqB,IAAY,UAAiF;AACtH,UAAM,eAA+B;AAAA,MACnC,GAAG;AAAA,MACH;AAAA,MACA,WAAW,MAAM,KAAK,iBAAiB;AAAA,MACvC,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,SAAK,UAAU,IAAI,IAAI,YAAY;AAAA,EACrC;AAAA;AAAA,EAGA,MAAM,uBAAuB,YAAoB,WAA4D;AAC3G,UAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,YAAY,UAAU,YAAY;AAAA,IACpD;AAEA,UAAM,gBAAmC;AAAA,MACvC,GAAG,SAAS;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,WAAO,KAAK,WAAW,aAAa;AAAA,EACtC;AAAA;AAAA,EAGA,mBAAmB,SAAgE;AAEjF,UAAM,kBAAkB,KAAK,sBAAsB,QAAQ,IAAI;AAC/D,UAAM,wBAAwB,KAAK,4BAA4B,QAAQ,UAAU;AAEjF,UAAM,iBAAiB,oBAAI,IAAI;AAAA,MAC7B,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAED,WAAO;AAAA,MACL,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAU,CAAC;AAAA,MACX,OAAO,MAAM,KAAK,cAAc;AAAA,IAClC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAa,UAAiC;AAClD,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,QAAI,OAAO,WAAW,WAAW;AAC/B,YAAM,IAAI,MAAM,aAAa,OAAO,MAAM,EAAE;AAAA,IAC9C;AAEA,QAAI,oBAAI,KAAK,IAAI,OAAO,WAAW;AACjC,aAAO,SAAS;AAChB,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAGA,QAAI,OAAO,YAAY,WAAW;AAChC,YAAM,KAAK,iBAAiB,OAAO,YAAY,SAAS;AAAA,IAC1D;AAGA,QAAI,OAAO,YAAY,aAAa;AAClC,YAAM,cAAc,MAAM,KAAK,2BAA2B,OAAO,YAAY,WAAW;AACxF,UAAI,eAAe,OAAO,YAAY,YAAY,YAAY;AAC5D,cAAM,KAAK,iBAAiB,OAAO,YAAY,YAAY,UAAU;AAAA,MACvE;AAAA,IACF;AAGA,WAAO,SAAS;AAChB,WAAO,aAAa,oBAAI,KAAK;AAG7B,UAAM,OAAO,gBAAgB;AAC7B,UAAM,SAAU,KAAa;AAC7B,QAAI,OAAO,kBAAkB;AAC3B,YAAM,OAAO,KAAK,eAAe;AACjC,UAAI,MAAM;AACR,cAAM,OAAO,iBAAiB,MAAM,MAAM;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,aAAa,UAAiC;AAClD,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,QAAI,OAAO,WAAW,WAAW;AAC/B,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA,EAGA,UAAU,UAAqC;AAC7C,WAAO,KAAK,QAAQ,IAAI,QAAQ,KAAK;AAAA,EACvC;AAAA;AAAA,EAGA,iBAAiB,OAAkC;AACjD,WAAO,KAAK,kBAAkB,KAAK;AAAA,EACrC;AAAA;AAAA,EAGA,cAAc,QAAgE;AAC5E,QAAI,UAAU,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC;AAE9C,QAAI,QAAQ,QAAQ;AAClB,gBAAU,QAAQ,OAAO,OAAK,EAAE,WAAW,OAAO,MAAM;AAAA,IAC1D;AAEA,QAAI,QAAQ,WAAW;AACrB,gBAAU,QAAQ,OAAO,OAAK,EAAE,cAAc,OAAO,SAAS;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,qBAAqB,UAAqC;AAC9D,UAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,UAAM,cAAc,oBAAI,IAAY;AAGpC,QAAI,OAAO,YAAY,WAAW;AAChC,YAAM,EAAE,MAAM,YAAY,aAAa,cAAc,IAAI,OAAO,YAAY;AAE5E,UAAI,MAAM;AACR,aAAK,sBAAsB,IAAI,EAAE,QAAQ,OAAK,YAAY,IAAI,CAAC,CAAC;AAAA,MAClE;AAEA,UAAI,YAAY;AACd,aAAK,4BAA4B,UAAU,EAAE,QAAQ,OAAK,YAAY,IAAI,CAAC,CAAC;AAAA,MAC9E;AAEA,UAAI,eAAe;AACjB,sBAAc,QAAQ,OAAK,YAAY,IAAI,CAAC,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,WAAW;AAAA,EAC/B;AAAA;AAAA,EAGQ,aAAa,OAAwB;AAC3C,WAAO,6BAA6B,KAAK,KAAK;AAAA,EAChD;AAAA,EAEQ,mBAA2B;AACjC,WAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EACxE;AAAA,EAEQ,kBAAkB,OAAkC;AAC1D,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,UAAU,OAAO;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,WAAyB;AACvD,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,QAAQ,UAAU,MAAM,kBAAkB;AAEhD,QAAI,CAAC,OAAO;AACV,aAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,kBAAkB;AAAA,IACzD;AAEA,UAAM,CAAC,EAAE,OAAO,IAAI,IAAI;AACxB,UAAM,MAAM,SAAS,OAAO,EAAE;AAE9B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,KAAK,KAAK,GAAI;AAAA,MACtD,KAAK;AACH,eAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,GAAI;AAAA,MAC3D,KAAK;AACH,eAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,IAAI,KAAK,KAAK,KAAK,GAAI;AAAA,MAC/D,KAAK;AACH,eAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,KAAK,KAAK,KAAK,KAAK,GAAI;AAAA,MAChE,KAAK;AACH,eAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,MAAM,KAAK,KAAK,KAAK,GAAI;AAAA,MACjE;AACE,eAAO,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,kBAAkB;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAc,mBAAoC;AAChD,UAAM,OAAO,gBAAgB;AAC7B,UAAM,OAAO,KAAK,eAAe;AACjC,WAAO,MAAM,OAAO;AAAA,EACtB;AAAA,EAEA,MAAc,gBAAgB,QAAmC;AAE/D,YAAQ,IAAI,2BAA2B,OAAO,KAAK,EAAE;AAAA,EACvD;AAAA,EAEA,MAAc,iBAAiB,aAA8C;AAE3E,YAAQ,IAAI,yBAAyB,WAAW;AAAA,EAClD;AAAA,EAEA,MAAc,2BAA2B,aAAoC;AAE3E,QAAI,YAAY,eAAe;AAC7B,YAAM,OAAO,gBAAgB;AAC7B,YAAM,OAAO,KAAK,eAAe;AACjC,UAAI,MAAM,OAAO,SAAS,IAAI,YAAY,aAAa,EAAE,GAAG;AAC1D,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,sBAAsB,MAAyB;AAErD,UAAM,kBAA4C;AAAA,MAChD,OAAO,CAAC,gBAAgB,mBAAmB,gBAAgB,cAAc;AAAA,MACzE,QAAQ,CAAC,gBAAgB,mBAAmB,cAAc;AAAA,MAC1D,QAAQ,CAAC,cAAc;AAAA,IACzB;AAEA,WAAO,OAAQ,gBAAgB,IAAI,KAAK,CAAC,IAAK,CAAC;AAAA,EACjD;AAAA,EAEQ,4BAA4B,YAA+B;AAEjE,UAAM,wBAAkD;AAAA,MACtD,WAAW,CAAC,kBAAkB,gBAAgB;AAAA,MAC9C,aAAa,CAAC,aAAa,aAAa;AAAA,IAC1C;AAEA,WAAO,aAAc,sBAAsB,UAAU,KAAK,CAAC,IAAK,CAAC;AAAA,EACnE;AACF;AAGA,IAAI,iBAAuC;AAGpC,SAAS,mBAAkC;AAChD,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,cAAc;AAAA,EACrC;AACA,SAAO;AACT;;;ACtWA,IAAAC,gBAA4B;;;ACE5B,mBAAmF;AAkN1E;AArMT,IAAM,kBAAc,4BAA4C,MAAS;AAOlE,SAAS,aAAa,EAAE,UAAU,OAAO,GAAsB;AACpE,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAoB;AAAA,IAC5C,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,iBAAiB;AAAA,EACnB,CAAC;AAGD,8BAAU,MAAM;AACd,QAAI,QAAQ;AACV,eAAS,MAAM;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,8BAAU,MAAM;AACd,QAAI;AACF,YAAM,OAAO,gBAAgB;AAE7B,YAAM,cAAc,KAAK,kBAAkB,CAAC,SAAS;AACnD,iBAAS;AAAA,UACP;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,UACP,iBAAiB,CAAC,CAAC;AAAA,QACrB,CAAC;AAAA,MACH,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,eAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA,iBAAiB;AAAA,MACnB,CAAC;AACD,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,0BAAY,OAAO,OAAe,UAAkB,aAAa,UAAU;AACxF,aAAS,WAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE1D,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,OAAO,EAAE,OAAO,UAAU,WAAW,CAAC;AAElE,eAAS;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,iBAAiB;AAAA,MACnB,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAY;AACnB,eAAS,WAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,MACF,EAAE;AACF,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,0BAAY,OAAO,OAAe,UAAkB,gBAAyB;AAC1F,aAAS,WAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE1D,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,OAAO,EAAE,OAAO,UAAU,YAAY,CAAC;AAEnE,eAAS;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,iBAAiB;AAAA,MACnB,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAY;AACnB,eAAS,WAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,MACF,EAAE;AACF,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAU,0BAAY,YAAY;AACtC,aAAS,WAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE1D,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,KAAK,QAAQ;AAEnB,eAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,OAAO;AAAA,QACP,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH,SAAS,OAAY;AACnB,eAAS,WAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,MACF,EAAE;AACF,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,yBAAqB,0BAAY,OAAO,aAAkC;AAC9E,aAAS,WAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,KAAK,EAAE;AAE1D,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,WAAW,QAAQ;AAE/C,eAAS;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,iBAAiB;AAAA,MACnB,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAY;AACnB,eAAS,WAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,MACF,EAAE;AACF,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAMC,8BAAyB,0BAAY,OAAO,UAAkB;AAClE,QAAI;AACF,YAAM,OAAO,gBAAgB;AAC7B,YAAM,KAAK,uBAAuB,KAAK;AAAA,IACzC,SAAS,OAAY;AACnB,eAAS,WAAS;AAAA,QAChB,GAAG;AAAA,QACH;AAAA,MACF,EAAE;AACF,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAc,0BAAY,YAAY;AAC1C,QAAI,CAAC,MAAM,KAAM;AAEjB,aAAS,WAAS,EAAE,GAAG,MAAM,SAAS,KAAK,EAAE;AAE7C,QAAI;AAEF,YAAM,MAAM,KAAK,WAAW,IAAI;AAChC,YAAM,OAAO,gBAAgB;AAC7B,YAAM,cAAc,KAAK,eAAe;AAExC,eAAS,WAAS;AAAA,QAChB,GAAG;AAAA,QACH,MAAM;AAAA,QACN,SAAS;AAAA,MACX,EAAE;AAAA,IACJ,SAAS,OAAY;AACnB,eAAS,WAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,QAAM,QAA0B;AAAA,IAC9B,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAAA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,4CAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAEO,SAAS,iBAAiB;AAC/B,QAAM,cAAU,yBAAW,WAAW;AACtC,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,SAAO;AACT;;;AD1NO,SAAS,UAAU;AACxB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAAC;AAAA,EACF,IAAI,eAAe;AAEnB,QAAM,uBAAmB,2BAAY,MAAM,mBAAmB,QAAQ,GAAG,CAAC,kBAAkB,CAAC;AAC7F,QAAM,uBAAmB,2BAAY,MAAM,mBAAmB,QAAQ,GAAG,CAAC,kBAAkB,CAAC;AAE7F,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAAA;AAAA,EACF;AACF;;;AE7BO,SAAS,UAAU;AACxB,QAAM,EAAE,MAAM,SAAS,OAAO,YAAY,IAAI,eAAe;AAE7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACXA,IAAAC,gBAAwB;AAGjB,SAAS,QAAQ,MAAyB;AAC/C,QAAM,EAAE,MAAM,QAAQ,IAAI,eAAe;AAEzC,QAAM,cAAU,uBAAQ,MAAM;AAC5B,QAAI,CAAC,QAAQ,CAAC,KAAK,KAAM,QAAO;AAEhC,UAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAChD,WAAO,MAAM,SAAS,KAAK,IAAI;AAAA,EACjC,GAAG,CAAC,MAAM,IAAI,CAAC;AAEf,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,MAAM;AAAA,EAClB;AACF;;;AClBA,IAAAC,gBAAwB;AAGjB,SAAS,cAAc,YAA+B;AAC3D,QAAM,EAAE,MAAM,QAAQ,IAAI,eAAe;AAEzC,QAAM,oBAAgB,uBAAQ,MAAM;AAClC,QAAI,CAAC,QAAQ,CAAC,KAAK,YAAa,QAAO;AAEvC,UAAM,cAAc,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AACxE,WAAO,YAAY,MAAM,OAAK,KAAK,aAAa,SAAS,CAAC,CAAC;AAAA,EAC7D,GAAG,CAAC,MAAM,UAAU,CAAC;AAErB,QAAM,uBAAmB,uBAAQ,MAAM;AACrC,QAAI,CAAC,QAAQ,CAAC,KAAK,YAAa,QAAO;AAEvC,UAAM,cAAc,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AACxE,WAAO,YAAY,KAAK,OAAK,KAAK,aAAa,SAAS,CAAC,CAAC;AAAA,EAC5D,GAAG,CAAC,MAAM,UAAU,CAAC;AAErB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,MAAM,eAAe,CAAC;AAAA,EACzC;AACF;;;ACxBA,IAAAC,gBAAgC;AAChC,kBAcO;AACP,kBAAwB;AACxB,yBAAkE;AAGlE,wBAA0B;AA0FtB,IAAAC,sBAAA;AAxFG,SAAS,OAAO;AAAA,EACrB,cAAc;AAAA,EACd;AAAA,EACA,YAAY,CAAC,SAAS,UAAU,QAAQ;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf;AAAA,EACA;AACF,GAAgB;AACd,QAAM,aAAS,6BAAU;AACzB,QAAM,EAAE,QAAQ,kBAAkB,iBAAiB,IAAI,QAAQ;AAC/D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,IAAI;AAEtD,QAAM,WAAO,qBAAwB;AAAA,IACnC,eAAe;AAAA,MACb,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,IACA,UAAU;AAAA,MACR,OAAO,CAAC,UAAW,CAAC,QAAQ,sBAAsB,CAAC,YAAY,KAAK,KAAK,IAAI,kBAAkB;AAAA,MAC/F,UAAU,CAAC,UAAW,CAAC,QAAQ,yBAAyB,MAAM,SAAS,IAAI,2CAA2C;AAAA,IACxH;AAAA,EACF,CAAC;AAED,QAAM,eAAe,OAAO,WAA2B;AACrD,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,UAAU,OAAO,UAAU;AAE1E,UAAI,WAAW;AACb,kBAAU,IAAI;AAAA,MAChB;AAEA,YAAM,aAAa,kBAAkB;AACrC,aAAO,KAAK,UAAU;AAAA,IACxB,SAAS,KAAU;AACjB,YAAM,eAAe,IAAI,WAAW;AACpC,eAAS,YAAY;AAErB,UAAI,SAAS;AACX,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,qBAAqB,OAAO,aAAkC;AAClE,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,UAAI;AACJ,UAAI,aAAa,UAAU;AACzB,eAAO,MAAM,iBAAiB;AAAA,MAChC,OAAO;AACL,eAAO,MAAM,iBAAiB;AAAA,MAChC;AAEA,UAAI,WAAW;AACb,kBAAU,IAAI;AAAA,MAChB;AAEA,YAAM,aAAa,kBAAkB;AACrC,aAAO,KAAK,UAAU;AAAA,IACxB,SAAS,KAAU;AACjB,YAAM,eAAe,IAAI,WAAW,0BAA0B,QAAQ;AACtE,eAAS,YAAY;AAErB,UAAI,SAAS;AACX,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU,SAAS,QAAQ,KAAK,UAAU,SAAS,QAAQ,IAC/E,8CAAC,qBACE;AAAA,cAAU,SAAS,QAAQ,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,6CAAC,sCAAgB,MAAM,IAAI;AAAA,QACxC,SAAQ;AAAA,QACR,WAAS;AAAA,QACT,SAAS,MAAM,mBAAmB,QAAQ;AAAA,QAC1C,UAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,IAED,UAAU,SAAS,QAAQ,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,6CAAC,sCAAgB,MAAM,IAAI;AAAA,QACxC,SAAQ;AAAA,QACR,WAAS;AAAA,QACT,SAAS,MAAM,mBAAmB,QAAQ;AAAA,QAC1C,UAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KAEJ,IACE;AAEJ,QAAM,gBAAgB,YAAY,QAAQ,2BAA2B;AAErE,SACE,6CAAC,yBAAU,MAAM,KAAK,WAAsB,OAC1C,wDAAC,qBAAM,YAAU,MAAC,QAAO,MAAK,GAAG,IAAI,QAAO,MAC1C;AAAA,iDAAC,qBAAM,OAAO,GAAG,IAAG,UAAS,IAAI,GAAG,0BAEpC;AAAA,IACA,6CAAC,oBAAK,GAAE,UAAS,MAAK,MAAK,IAAG,UAAS,IAAI,IAAI,iDAE/C;AAAA,IAEC,SACC,6CAAC,qBAAM,MAAM,6CAAC,sCAAgB,MAAM,IAAI,GAAI,OAAM,OAAM,IAAG,MACxD,iBACH;AAAA,IAGD,iBAAiB;AAAA,IACjB,iBAAiB,eAAe,UAAU,SAAS,OAAO,KACzD,6CAAC,uBAAQ,OAAM,0BAAyB,eAAc,UAAS,IAAG,MAAK;AAAA,IAGxE,UAAU,SAAS,OAAO,KACzB,6CAAC,UAAK,UAAU,KAAK,SAAS,YAAY,GACxC,wDAAC,qBACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,UAAQ;AAAA,UACP,GAAG,KAAK,cAAc,OAAO;AAAA,UAC9B,UAAU;AAAA;AAAA,MACZ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,UAAQ;AAAA,UACP,GAAG,KAAK,cAAc,UAAU;AAAA,UACjC,UAAU;AAAA;AAAA,MACZ;AAAA,MAEA,8CAAC,qBAAM,SAAQ,iBACZ;AAAA,sBACC;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACL,GAAG,KAAK,cAAc,cAAc,EAAE,MAAM,WAAW,CAAC;AAAA,YACzD,UAAU;AAAA;AAAA,QACZ;AAAA,QAEF,6CAAC,sBAAO,MAAK,MAAK,MAAM,mBAAmB,8BAE3C;AAAA,SACF;AAAA,MAEA,6CAAC,sBAAO,MAAK,UAAS,WAAS,MAAC,SAAkB,qBAElD;AAAA,OACF,GACF;AAAA,IAGD,CAAC,iBAAiB,eAAe,iBAAiB,UAAU,SAAS,OAAO,KAC3E,6CAAC,uBAAQ,OAAM,oBAAmB,eAAc,UAAS,IAAG,MAAK;AAAA,IAElE,CAAC,iBAAiB;AAAA,IAEnB,8CAAC,oBAAK,GAAE,UAAS,MAAK,MAAK,IAAG,UAAS,IAAI,IAAI;AAAA;AAAA,MACjB;AAAA,MAC5B,6CAAC,sBAAO,MAAK,MAAK,MAAM,WAAW,qBAEnC;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;ACpNA,IAAAC,gBAAgC;AAChC,IAAAC,eAgBO;AACP,IAAAC,eAAwB;AACxB,IAAAC,sBAMO;AAGP,IAAAC,qBAA0B;AAmJtB,IAAAC,sBAAA;AAjJG,SAAS,OAAO;AAAA,EACrB,cAAc;AAAA,EACd;AAAA,EACA,YAAY,CAAC,SAAS,UAAU,QAAQ;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,CAAC;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,IACrB,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAgB;AACd,QAAM,aAAS,8BAAU;AACzB,QAAM,EAAE,QAAQ,kBAAkB,iBAAiB,IAAI,QAAQ;AAC/D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,IAAI;AACtD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,CAAC;AAE1D,QAAM,WAAO,sBAAwB;AAAA,IACnC,eAAe;AAAA,MACb,OAAO,cAAc,SAAS;AAAA,MAC9B,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,WAAW,cAAc,aAAa;AAAA,MACtC,UAAU,cAAc,YAAY;AAAA,MACpC,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,OAAO,CAAC,UAAU;AAChB,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,CAAC,YAAY,KAAK,KAAK,EAAG,QAAO;AACrC,YAAI,kBAAkB,MAAO,QAAO,iBAAiB,MAAM,KAAK;AAChE,eAAO;AAAA,MACT;AAAA,MACA,UAAU,CAAC,UAAU;AACnB,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,kBAAkB,SAAU,QAAO,iBAAiB,SAAS,KAAK;AAEtE,cAAM,SAAS,CAAC;AAChB,YAAI,qBAAqB,aAAa,MAAM,SAAS,qBAAqB,WAAW;AACnF,iBAAO,KAAK,YAAY,qBAAqB,SAAS,aAAa;AAAA,QACrE;AACA,YAAI,qBAAqB,oBAAoB,CAAC,QAAQ,KAAK,KAAK,GAAG;AACjE,iBAAO,KAAK,sBAAsB;AAAA,QACpC;AACA,YAAI,qBAAqB,kBAAkB,CAAC,QAAQ,KAAK,KAAK,GAAG;AAC/D,iBAAO,KAAK,YAAY;AAAA,QAC1B;AACA,YAAI,qBAAqB,kBAAkB,CAAC,eAAe,KAAK,KAAK,GAAG;AACtE,iBAAO,KAAK,uBAAuB;AAAA,QACrC;AAEA,eAAO,OAAO,SAAS,IAAI,yBAAyB,OAAO,KAAK,IAAI,CAAC,KAAK;AAAA,MAC5E;AAAA,MACA,iBAAiB,CAAC,OAAO,WACvB,UAAU,OAAO,WAAW,2BAA2B;AAAA,MACzD,aAAa,CAAC,UAAU;AACtB,YAAI,sBAAsB,CAAC,MAAO,QAAO;AACzC,YAAI,kBAAkB,YAAa,QAAO,iBAAiB,YAAY,KAAK;AAC5E,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,4BAA4B,CAAC,aAAqB;AACtD,QAAI,WAAW;AACf,QAAI,SAAS,WAAW,qBAAqB,aAAa,GAAI,aAAY;AAC1E,QAAI,qBAAqB,oBAAoB,QAAQ,KAAK,QAAQ,EAAG,aAAY;AACjF,QAAI,qBAAqB,kBAAkB,QAAQ,KAAK,QAAQ,EAAG,aAAY;AAC/E,QAAI,qBAAqB,kBAAkB,eAAe,KAAK,QAAQ,EAAG,aAAY;AACtF,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC,UAAkB;AAC9C,SAAK,cAAc,YAAY,KAAK;AACpC,wBAAoB,0BAA0B,KAAK,CAAC;AAAA,EACtD;AAEA,QAAM,eAAe,OAAO,WAA2B;AACrD,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,cAAc,OAAO,eAAe,GAAG,OAAO,SAAS,IAAI,OAAO,QAAQ,GAAG,KAAK;AACxF,YAAM,OAAO,MAAM,OAAO,OAAO,OAAO,OAAO,UAAU,WAAW;AAEpE,UAAI,WAAW;AACb,kBAAU,IAAI;AAAA,MAChB;AAEA,YAAM,aAAa,kBAAkB;AACrC,aAAO,KAAK,UAAU;AAAA,IACxB,SAAS,KAAU;AACjB,YAAM,eAAe,IAAI,WAAW;AACpC,eAAS,YAAY;AAErB,UAAI,SAAS;AACX,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,qBAAqB,OAAO,aAAkC;AAClE,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,UAAI;AACJ,UAAI,aAAa,UAAU;AACzB,eAAO,MAAM,iBAAiB;AAAA,MAChC,OAAO;AACL,eAAO,MAAM,iBAAiB;AAAA,MAChC;AAEA,UAAI,WAAW;AACb,kBAAU,IAAI;AAAA,MAChB;AAEA,YAAM,aAAa,kBAAkB;AACrC,aAAO,KAAK,UAAU;AAAA,IACxB,SAAS,KAAU;AACjB,YAAM,eAAe,IAAI,WAAW,0BAA0B,QAAQ;AACtE,eAAS,YAAY;AAErB,UAAI,SAAS;AACX,gBAAQ,GAAG;AAAA,MACb;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAU,SAAS,QAAQ,KAAK,UAAU,SAAS,QAAQ,IAC/E,8CAAC,sBACE;AAAA,cAAU,SAAS,QAAQ,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,6CAAC,uCAAgB,MAAM,IAAI;AAAA,QACxC,SAAQ;AAAA,QACR,WAAS;AAAA,QACT,SAAS,MAAM,mBAAmB,QAAQ;AAAA,QAC1C,UAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,IAED,UAAU,SAAS,QAAQ,KAC1B;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,6CAAC,uCAAgB,MAAM,IAAI;AAAA,QACxC,SAAQ;AAAA,QACR,WAAS;AAAA,QACT,SAAS,MAAM,mBAAmB,QAAQ;AAAA,QAC1C,UAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KAEJ,IACE;AAEJ,QAAM,gBAAgB,YAAY,QAAQ,2BAA2B;AAErE,QAAM,mBAAmB,MAAM;AAC7B,QAAI,oBAAoB,GAAI,QAAO;AACnC,QAAI,oBAAoB,GAAI,QAAO;AACnC,QAAI,oBAAoB,GAAI,QAAO;AACnC,WAAO;AAAA,EACT;AAEA,SACE,6CAAC,0BAAU,MAAM,KAAK,WAAsB,OAC1C,wDAAC,sBAAM,YAAU,MAAC,QAAO,MAAK,GAAG,IAAI,QAAO,MAC1C;AAAA,iDAAC,sBAAM,OAAO,GAAG,IAAG,UAAS,IAAI,GAAG,iCAEpC;AAAA,IACA,6CAAC,qBAAK,GAAE,UAAS,MAAK,MAAK,IAAG,UAAS,IAAI,IAAI,oCAE/C;AAAA,IAEC,SACC,6CAAC,sBAAM,MAAM,6CAAC,uCAAgB,MAAM,IAAI,GAAI,OAAM,OAAM,IAAG,MACxD,iBACH;AAAA,IAGD,iBAAiB;AAAA,IACjB,iBAAiB,eAAe,UAAU,SAAS,OAAO,KACzD,6CAAC,wBAAQ,OAAM,yBAAwB,eAAc,UAAS,IAAG,MAAK;AAAA,IAGvE,UAAU,SAAS,OAAO,KACzB,6CAAC,UAAK,UAAU,KAAK,SAAS,YAAY,GACxC,wDAAC,sBACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,UAAQ;AAAA,UACP,GAAG,KAAK,cAAc,OAAO;AAAA,UAC9B,UAAU;AAAA;AAAA,MACZ;AAAA,MAEC,sBACC,8CAAC,sBAAM,MAAI,MACT;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACX,GAAG,KAAK,cAAc,WAAW;AAAA,YAClC,UAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACX,GAAG,KAAK,cAAc,UAAU;AAAA,YACjC,UAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,UAAQ;AAAA,UACR,OAAO,KAAK,OAAO;AAAA,UACnB,UAAU,CAAC,MAAM,qBAAqB,EAAE,cAAc,KAAK;AAAA,UAC3D,OAAO,KAAK,OAAO;AAAA,UACnB,UAAU;AAAA;AAAA,MACZ;AAAA,MAEC,KAAK,OAAO,YACX,8CAAC,oBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,OAAO,iBAAiB;AAAA,YACxB,MAAK;AAAA,YACL,IAAI;AAAA;AAAA,QACN;AAAA,QACA,8CAAC,qBAAK,MAAK,MAAK,GAAE,UAAS;AAAA;AAAA,UACL;AAAA,UAAiB;AAAA,WACvC;AAAA,SACF;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,aAAY;AAAA,UACZ,UAAQ;AAAA,UACP,GAAG,KAAK,cAAc,iBAAiB;AAAA,UACxC,UAAU;AAAA;AAAA,MACZ;AAAA,MAEA,6CAAC,uBAAO,MAAK,UAAS,WAAS,MAAC,SAAkB,qBAElD;AAAA,OACF,GACF;AAAA,IAGD,CAAC,iBAAiB,eAAe,iBAAiB,UAAU,SAAS,OAAO,KAC3E,6CAAC,wBAAQ,OAAM,mBAAkB,eAAc,UAAS,IAAG,MAAK;AAAA,IAEjE,CAAC,iBAAiB;AAAA,IAEnB,8CAAC,qBAAK,GAAE,UAAS,MAAK,MAAK,IAAG,UAAS,IAAI,IAAI;AAAA;AAAA,MACpB;AAAA,MACzB,6CAAC,uBAAO,MAAK,MAAK,MAAM,WAAW,qBAEnC;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;ACxTA,IAAAC,gBAAoC;AACpC,IAAAC,eASO;AACP,IAAAC,sBAKO;AAGP,IAAAC,qBAA0B;;;ACrB1B;;;AD0BS,IAAAC,sBAAA;AADT,SAAS,UAAU,EAAE,SAAS,GAA4B;AACxD,SAAO,6EAAG,UAAS;AACrB;AAEA,SAAS,KAAK,EAAE,UAAU,MAAM,MAAM,SAAS,OAAO,SAAS,GAAwB;AACrF,QAAM,aAAS,8BAAU;AAEzB,QAAM,cAAc,MAAM;AACxB,QAAI,SAAS;AACX,cAAQ;AAAA,IACV,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SACE;AAAA,IAAC,kBAAK;AAAA,IAAL;AAAA,MACC,aAAa;AAAA,MACb,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,OAAO,EAAE,UAAU,SAAS,MAAM,OAAO,SAAS,GAA4B;AACrF,SACE;AAAA,IAAC,kBAAK;AAAA,IAAL;AAAA,MACC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAGO,SAAS,WAAW;AAAA,EACzB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,EAAE,MAAM,QAAQ,IAAI,QAAQ;AAClC,QAAM,aAAS,8BAAU;AAEzB,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,YAAY;AAChC,UAAM,QAAQ;AACd,WAAO,KAAK,eAAe;AAAA,EAC7B;AAEA,QAAM,cAAc,KAAK,eAAe,KAAK,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK;AACrE,QAAM,YAAY,KAAK,YAAY;AACnC,QAAM,WAAW,YACd,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,CAAC,CAAC,EACb,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AAGb,MAAI,kBAAkC,CAAC;AACvC,MAAI,UAAU;AACZ,kBAAAC,QAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,UAAI,cAAAA,QAAM,eAAe,KAAK,KAAK,MAAM,SAAS,WAAW;AAC3D,sBAAAA,QAAM,SAAS,QAAQ,MAAM,MAAM,UAAU,CAAC,aAAa;AACzD,cAAI,cAAAA,QAAM,eAAe,QAAQ,GAAG;AAClC,4BAAgB,KAAK,QAAQ;AAAA,UAC/B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAS;AAAA,MACT,iBAAiB,EAAE,YAAY,gBAAgB;AAAA,MAC/C,cAAY;AAAA,MAEZ;AAAA,qDAAC,kBAAK,QAAL,EACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,mBAAQ,IAAI,IAAI,aAAa,EAAE;AAAA,YAC7C;AAAA,YAEA,wDAAC,sBAAM,KAAK,GACV;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,KAAK;AAAA,kBACL,QAAO;AAAA,kBACP,MAAM;AAAA,kBACN,WAAW,YAAY,UAAU;AAAA,kBAEhC,WAAC,aAAa;AAAA;AAAA,cACjB;AAAA,cACC,YACC,8EACE;AAAA,6DAAC,qBAAK,IAAI,KAAK,MAAK,MAAK,IAAI,GAAG,IAAI,GACjC,uBACH;AAAA,gBACA,6CAAC,uCAAgB,UAAM,kBAAI,EAAE,GAAG,QAAQ,KAAK;AAAA,iBAC/C;AAAA,eAEJ;AAAA;AAAA,QACF,GACF;AAAA,QAEA,8CAAC,kBAAK,UAAL,EACC;AAAA,uDAAC,oBAAI,IAAG,MAAK,IAAG,MACd,wDAAC,sBACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,QAAO;AAAA,gBACP,MAAM;AAAA,gBAEL,WAAC,aAAa;AAAA;AAAA,YACjB;AAAA,YACA,8CAAC,SAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,2DAAC,qBAAK,MAAK,MAAK,IAAI,KACjB,uBACH;AAAA,cACA,6CAAC,qBAAK,GAAE,UAAS,MAAK,MACnB,eAAK,OACR;AAAA,eACF;AAAA,aACF,GACF;AAAA,UAEA,6CAAC,wBAAQ;AAAA,UAET;AAAA,YAAC,kBAAK;AAAA,YAAL;AAAA,cACC,aAAa,6CAAC,gCAAS,UAAM,kBAAI,EAAE,GAAG,QAAQ,KAAK;AAAA,cACnD,SAAS,MAAM,OAAO,KAAK,eAAe;AAAA,cAC3C;AAAA;AAAA,UAED;AAAA,UAEC,gBAAgB,SAAS,KACxB,8EACE;AAAA,yDAAC,wBAAQ;AAAA,YACR;AAAA,aACH;AAAA,UAGF,6CAAC,wBAAQ;AAAA,UAET;AAAA,YAAC,kBAAK;AAAA,YAAL;AAAA,cACC,aAAa,6CAAC,kCAAW,UAAM,kBAAI,EAAE,GAAG,QAAQ,KAAK;AAAA,cACrD,SAAS;AAAA,cACT,OAAM;AAAA,cACP;AAAA;AAAA,UAED;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAGA,WAAW,YAAY;AACvB,WAAW,OAAO;AAClB,WAAW,SAAS;;;AEtMpB,IAAAC,gBAA8C;AAC9C,IAAAC,eAeO;AACP,IAAAC,sBAMO;AACP,IAAAC,eAAwB;AAGxB,2BAA8B;AAIrB,IAAAC,sBAAA;AADT,SAAS,KAAK,EAAE,OAAO,WAAW,SAAS,GAAyB;AAClE,SAAO,6CAAC,SAAI,cAAY,OAAQ,UAAS;AAC3C;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,EAAE,MAAM,YAAY,IAAI,QAAQ;AACtC,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAwB,SAAS;AACnE,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAG5C,QAAM,cAA8E,CAAC;AACrF,MAAI,UAAU;AACZ,kBAAAC,QAAM,SAAS,QAAQ,UAAU,CAAC,UAAU;AAC1C,UAAI,cAAAA,QAAM,eAAe,KAAK,KAAK,MAAM,SAAS,MAAM;AACtD,cAAM,YAAY,MAAM;AACxB,oBAAY,KAAK;AAAA,UACf,OAAO,UAAU;AAAA,UACjB,MAAM,UAAU;AAAA,UAChB,SAAS,UAAU;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,kBAAc,sBAAQ;AAAA,IAC1B,eAAe;AAAA,MACb,aAAa,MAAM,eAAe;AAAA,MAClC,OAAO,MAAM,SAAS;AAAA,IACxB;AAAA,EACF,CAAC;AAED,QAAM,mBAAe,sBAAQ;AAAA,IAC3B,eAAe;AAAA,MACb,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,iBAAiB;AAAA,IACnB;AAAA,IACA,UAAU;AAAA,MACR,aAAa,CAAC,UAAU;AACtB,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,eAAO;AAAA,MACT;AAAA,MACA,iBAAiB,CAAC,OAAO,WACvB,UAAU,OAAO,cAAc,2BAA2B;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,QAAM,sBAAsB,OAAO,WAAgB;AACjD,eAAW,IAAI;AACf,QAAI;AAEF,YAAM,YAAY;AAClB,yCAAc,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM,6CAAC,iCAAU,MAAM,IAAI;AAAA,MAC7B,CAAC;AAAA,IACH,SAAS,OAAY;AACnB,yCAAc,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,SAAS,MAAM,WAAW;AAAA,QAC1B,OAAO;AAAA,QACP,MAAM,6CAAC,uCAAgB,MAAM,IAAI;AAAA,MACnC,CAAC;AAAA,IACH,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,uBAAuB,OAAO,WAAgB;AAClD,eAAW,IAAI;AACf,QAAI;AAEF,yCAAc,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,QACP,MAAM,6CAAC,iCAAU,MAAM,IAAI;AAAA,MAC7B,CAAC;AACD,mBAAa,MAAM;AAAA,IACrB,SAAS,OAAY;AACnB,yCAAc,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,SAAS,MAAM,WAAW;AAAA,QAC1B,OAAO;AAAA,QACP,MAAM,6CAAC,uCAAgB,MAAM,IAAI;AAAA,MACnC,CAAC;AAAA,IACH,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,eAAe,KAAK,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK;AACrE,QAAM,YAAY,KAAK,YAAY;AACnC,QAAM,WAAW,YACd,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,CAAC,CAAC,EACb,KAAK,EAAE,EACP,YAAY,EACZ,MAAM,GAAG,CAAC;AAEb,SACE,6CAAC,0BAAU,MAAK,MAAK,WAAsB,OACzC,uDAAC,sBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B,wDAAC,sBACC;AAAA,iDAAC,oBACC,wDAAC,sBAAM,IAAG,MACR;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK;AAAA,UACL,QAAO;AAAA,UACP,MAAK;AAAA,UAEJ,WAAC,aAAa;AAAA;AAAA,MACjB;AAAA,MACA,8CAAC,SACC;AAAA,qDAAC,sBAAM,OAAO,GAAI,uBAAY;AAAA,QAC9B,6CAAC,qBAAK,GAAE,UAAS,MAAK,MAAM,eAAK,OAAM;AAAA,SACzC;AAAA,OACF,GACF;AAAA,IAEA,8CAAC,qBAAK,OAAO,WAAW,UAAU,cAChC;AAAA,oDAAC,kBAAK,MAAL,EACC;AAAA,qDAAC,kBAAK,KAAL,EAAS,OAAM,WAAU,aAAa,6CAAC,gCAAS,UAAM,kBAAI,EAAE,GAAG,GAAI,qBAEpE;AAAA,QACA,6CAAC,kBAAK,KAAL,EAAS,OAAM,YAAW,aAAa,6CAAC,gCAAS,UAAM,kBAAI,EAAE,GAAG,GAAI,sBAErE;AAAA,QACC,YAAY,IAAI,CAAC,MAAM,UACtB;AAAA,UAAC,kBAAK;AAAA,UAAL;AAAA,YAEC,OAAO,UAAU,KAAK;AAAA,YACtB,aAAa,KAAK;AAAA,YAEjB,eAAK;AAAA;AAAA,UAJD;AAAA,QAKP,CACD;AAAA,SACH;AAAA,MAEA,6CAAC,kBAAK,OAAL,EAAW,OAAM,WAAU,IAAG,MAC7B,uDAAC,UAAK,UAAU,YAAY,SAAS,mBAAmB,GACtD,wDAAC,sBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACX,GAAG,YAAY,cAAc,aAAa;AAAA,YAC3C,UAAU;AAAA;AAAA,QACZ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACX,GAAG,YAAY,cAAc,OAAO;AAAA,YACrC,UAAQ;AAAA;AAAA,QACV;AAAA,QAEA,6CAAC,sBACC,uDAAC,uBAAO,MAAK,UAAS,SAAkB,4BAExC,GACF;AAAA,SACF,GACF,GACF;AAAA,MAEA,6CAAC,kBAAK,OAAL,EAAW,OAAM,YAAW,IAAG,MAC9B,uDAAC,UAAK,UAAU,aAAa,SAAS,oBAAoB,GACxD,wDAAC,sBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACX,GAAG,aAAa,cAAc,iBAAiB;AAAA,YAChD,UAAU;AAAA;AAAA,QACZ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACX,GAAG,aAAa,cAAc,aAAa;AAAA,YAC5C,UAAU;AAAA;AAAA,QACZ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,aAAY;AAAA,YACX,GAAG,aAAa,cAAc,iBAAiB;AAAA,YAChD,UAAU;AAAA;AAAA,QACZ;AAAA,QAEA,6CAAC,sBACC,uDAAC,uBAAO,MAAK,UAAS,SAAkB,6BAExC,GACF;AAAA,SACF,GACF,GACF;AAAA,MAEC,YAAY,IAAI,CAAC,MAAM,UACtB,6CAAC,kBAAK,OAAL,EAAuB,OAAO,UAAU,KAAK,IAAI,IAAG,MAClD,eAAK,WADS,KAEjB,CACD;AAAA,OACH;AAAA,KACF,GACF,GACF;AAEJ;AAGA,YAAY,OAAO;;;AChPV,IAAAC,sBAAA;AAPF,SAAS,SAAS,EAAE,SAAS,GAAkB;AACpD,QAAM,EAAE,gBAAgB,IAAI,QAAQ;AAEpC,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,6EAAG,UAAS;AACrB;;;ACDS,IAAAC,sBAAA;AAPF,SAAS,UAAU,EAAE,SAAS,GAAmB;AACtD,QAAM,EAAE,gBAAgB,IAAI,QAAQ;AAEpC,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,6EAAG,UAAS;AACrB;;;ACsBW,IAAAC,sBAAA;AAzBJ,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAAiB;AACf,QAAM,EAAE,QAAQ,IAAI,QAAQ,QAAQ,CAAC,CAAC;AACtC,QAAM,EAAE,eAAe,iBAAiB,IAAI,cAAc,cAAc,CAAC,CAAC;AAE1E,MAAI,eAAe;AAEnB,MAAI,QAAQ,YAAY;AACtB,QAAI,cAAc,OAAO;AACvB,qBAAe,WAAW;AAAA,IAC5B,OAAO;AACL,qBAAe,WAAW;AAAA,IAC5B;AAAA,EACF,WAAW,MAAM;AACf,mBAAe;AAAA,EACjB,WAAW,YAAY;AACrB,mBAAe;AAAA,EACjB;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO,6EAAG,oBAAS;AAAA,EACrB;AAEA,SAAO,6EAAG,UAAS;AACrB;;;ACzCA,IAAAC,gBAA0B;AAC1B,IAAAC,qBAA0B;AAQnB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,YAAY;AACd,GAA0B;AACxB,QAAM,aAAS,8BAAU;AACzB,QAAM,EAAE,iBAAiB,QAAQ,IAAI,QAAQ;AAE7C,+BAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,iBAAiB;AAChC,YAAM,MAAM,IAAI,IAAI,WAAW,OAAO,SAAS,MAAM;AACrD,UAAI,WAAW;AACb,YAAI,aAAa,IAAI,aAAa,SAAS;AAAA,MAC7C;AACA,aAAO,KAAK,IAAI,SAAS,CAAC;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,iBAAiB,SAAS,QAAQ,WAAW,SAAS,CAAC;AAG3D,SAAO;AACT;;;ACnBO,IAAM,QAAN,MAAY;AAAA;AAAA,EAKjB,YAAY,QAAqB;AAHjC,SAAQ,YAAwC,oBAAI,IAAI;AAItD,SAAK,SAAS;AACd,SAAK,mBAAmB;AAAA,EAC1B;AAAA;AAAA,EAGA,iBAA0C,UAAkC;AAC1E,SAAK,UAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,KAA8B,SAAoD;AACtF,QAAI;AAEF,UAAI;AACJ,UAAI,OAAO,QAAQ,aAAa,UAAU;AACxC,mBAAW,KAAK,UAAU,IAAI,QAAQ,QAAQ;AAC9C,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,aAAa,QAAQ,QAAQ,aAAa;AAAA,QAC5D;AAAA,MACF,OAAO;AACL,mBAAW,QAAQ;AAAA,MACrB;AAGA,YAAM,WAAW,KAAK,gBAAgB,UAAU,QAAQ,IAAI;AAG5D,YAAM,YAAY;AAAA,QAChB,IAAI,MAAM,QAAQ,QAAQ,EAAE,IAAI,QAAQ,KAAK,CAAC,QAAQ,EAAE;AAAA,QACxD,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAAA,QAClC,SAAS,QAAQ,WAAW,KAAK,OAAO;AAAA,QACxC,SAAS,SAAS;AAAA,QAClB,MAAM,SAAS;AAAA,QACf,MAAM,SAAS;AAAA,QACf,IAAI,QAAQ;AAAA,QACZ,KAAK,QAAQ;AAAA,QACb,aAAa,QAAQ;AAAA,QACrB,MAAM,QAAQ;AAAA,QACd,UAAU;AAAA,UACR,GAAG,QAAQ;AAAA,UACX,YAAY,UAAU;AAAA,QACxB;AAAA,MACF;AAGA,UAAI,QAAQ,UAAU;AACpB,eAAO,KAAK,cAAc,WAAW,QAAQ,QAAQ;AAAA,MACvD;AAGA,YAAM,SAAS,MAAM,KAAK,gBAAgB,SAAS;AAGnD,UAAI,KAAK,OAAO,QAAQ;AACtB,cAAM,KAAK,OAAO,OAAO,MAAM;AAAA,MACjC;AAEA,aAAO;AAAA,IACT,SAAS,OAAY;AACnB,YAAM,aAAyB;AAAA,QAC7B,MAAM,MAAM,QAAQ;AAAA,QACpB,SAAS,MAAM,WAAW;AAAA,QAC1B,UAAU,KAAK,OAAO;AAAA,QACtB,eAAe;AAAA,MACjB;AAEA,UAAI,KAAK,OAAO,SAAS;AACvB,aAAK,OAAO,QAAQ,UAAU;AAAA,MAChC;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UACJ,SAC2B;AAC3B,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,UAAyB,CAAC;AAChC,QAAI,aAAa;AACjB,QAAI,SAAS;AAGb,eAAW,aAAa,QAAQ,YAAY;AAC1C,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,KAAK;AAAA,UAC7B,GAAG;AAAA,UACH,IAAI,UAAU;AAAA,UACd,MAAM,EAAE,GAAG,QAAQ,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,KAAK;AAAA,UACzD,UAAU;AAAA,YACR,GAAG,UAAU;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAED,gBAAQ,KAAK,MAAM;AACnB;AAAA,MACF,SAAS,OAAO;AACd;AACA,gBAAQ,KAAK;AAAA,UACX,IAAI;AAAA,UACJ,UAAU,KAAK,OAAO;AAAA,UACtB,IAAI,CAAC,UAAU,EAAE;AAAA,UACjB,QAAQ,oBAAI,KAAK;AAAA,UACjB,QAAQ;AAAA,UACR,OAAO,MAAM;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,QAAQ,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,IAAuC;AACjD,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAC9B;AAAA;AAAA,EAGA,gBAAiC;AAC/B,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3C;AAAA;AAAA,EAGQ,qBAA2B;AAEjC,YAAQ,KAAK,OAAO,UAAU;AAAA,MAC5B,KAAK;AAEH;AAAA,MACF,KAAK;AAEH;AAAA,MACF;AACE,gBAAQ,KAAK,YAAY,KAAK,OAAO,QAAQ,sBAAsB;AAAA,IACvE;AAAA,EACF;AAAA,EAEQ,gBACN,UACA,MACkD;AAClD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAGA,UAAM,UAAU,OAAO,SAAS,YAAY,aACxC,SAAS,QAAQ,QAAQ,CAAC,CAAM,IAChC,SAAS;AAGb,QAAI,OAAO,OAAO,SAAS,KAAK,SAAS,aACrC,SAAS,KAAK,KAAK,QAAQ,CAAC,CAAM,IAClC,SAAS,KAAK;AAGlB,QAAI;AACJ,QAAI,SAAS,KAAK,MAAM;AACtB,aAAO,OAAO,SAAS,KAAK,SAAS,aACjC,SAAS,KAAK,KAAK,QAAQ,CAAC,CAAM,IAClC,SAAS,KAAK;AAAA,IACpB;AAGA,QAAI,SAAS,kBAAkB,SAAS,KAAK,OAAO,QAAQ;AAC1D,YAAM,aAAa,KAAK,mBAAmB;AAC3C,YAAM,aAAa,KAAK,mBAAmB;AAE3C,UAAI,YAAY;AACd,eAAO,KAAK,iBAAiB,MAAM,UAAU;AAAA,MAC/C;AAEA,UAAI,cAAc,MAAM;AACtB,eAAO,GAAG,IAAI;AAAA;AAAA,EAAO,UAAU;AAAA,MACjC;AAAA,IACF;AAEA,WAAO,EAAE,SAAS,MAAM,KAAK;AAAA,EAC/B;AAAA,EAEQ,qBAA6B;AACnC,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,CAAC,OAAQ,QAAO;AAEpB,QAAI,aAAa;AAGjB,QAAI,OAAO,MAAM;AACf,YAAM,aAAa,OAAO,OAAO,SAAS,aAAa,OAAO,KAAK,IAAI,OAAO;AAC9E,oBAAc;AAAA,IAChB,OAAO;AAEL,YAAM,QAAkB,CAAC;AAGzB,UAAI,OAAO,YAAY,WAAW,OAAO,WAAW,MAAM;AACxD,cAAM,KAAK,kDAAkD,OAAO,WAAW,IAAI,MAAM;AAAA,MAC3F;AAGA,UAAI,OAAO,aAAa,SAAS;AAC/B,cAAM,WAAW,OAAO,YAAY,OAAO;AAC3C,cAAM,YAAY,OAAO,YAAY,QAAQ;AAC7C,cAAM,KAAK,uCAAuC,QAAQ,6BAA6B,SAAS,UAAU;AAAA,MAC5G;AAGA,UAAI,OAAO,SAAS,SAAS;AAC3B,cAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,cAAM,cAAc,OAAO,QAAQ,QAAQ;AAC3C,cAAM,KAAK,uCAAuC,UAAU,6BAA6B,WAAW,UAAU;AAAA,MAChH;AAGA,UAAI,OAAO,SAAS;AAClB,YAAI,cAAc,oCAAgC,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,QAAQ,IAAI;AACjG,YAAI,OAAO,QAAQ,SAAS;AAC1B,yBAAe,MAAM,OAAO,QAAQ,OAAO;AAAA,QAC7C;AACA,YAAI,OAAO,QAAQ,SAAS;AAC1B,yBAAe,eAAe,OAAO,QAAQ,OAAO,6BAA6B,OAAO,QAAQ,OAAO;AAAA,QACzG;AACA,uBAAe;AACf,cAAM,KAAK,WAAW;AAAA,MACxB;AAEA,oBAAc,MAAM,KAAK,EAAE;AAAA,IAC7B;AAEA,kBAAc;AACd,WAAO;AAAA,EACT;AAAA,EAEQ,qBAA6B;AACnC,UAAM,SAAS,KAAK,OAAO;AAC3B,QAAI,CAAC,OAAQ,QAAO;AAEpB,QAAI,OAAO,MAAM;AACf,aAAO,OAAO,OAAO,SAAS,aAAa,OAAO,KAAK,IAAI,OAAO;AAAA,IACpE;AAGA,UAAM,QAAkB,CAAC;AAEzB,QAAI,OAAO,YAAY,WAAW,OAAO,WAAW,MAAM;AACxD,YAAM,KAAK,OAAO,WAAW,IAAI;AAAA,IACnC;AAEA,QAAI,OAAO,aAAa,SAAS;AAC/B,YAAM,YAAY,OAAO,YAAY,QAAQ;AAC7C,YAAM,WAAW,OAAO,YAAY,OAAO;AAC3C,YAAM,KAAK,GAAG,SAAS,KAAK,QAAQ,EAAE;AAAA,IACxC;AAEA,QAAI,OAAO,SAAS,SAAS;AAC3B,YAAM,cAAc,OAAO,QAAQ,QAAQ;AAC3C,YAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,YAAM,KAAK,GAAG,WAAW,KAAK,UAAU,EAAE;AAAA,IAC5C;AAEA,QAAI,OAAO,SAAS;AAClB,UAAI,cAAc,SAAK,oBAAI,KAAK,GAAE,YAAY,CAAC,IAAI,OAAO,QAAQ,IAAI;AACtE,UAAI,OAAO,QAAQ,SAAS;AAC1B,uBAAe,MAAM,OAAO,QAAQ,OAAO;AAAA,MAC7C;AACA,UAAI,OAAO,QAAQ,SAAS;AAC1B,uBAAe,MAAM,OAAO,QAAQ,OAAO;AAAA,MAC7C;AACA,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,iBAAiB,MAAc,YAA4B;AAEjE,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,aAAO,KAAK,QAAQ,WAAW,GAAG,UAAU,SAAS;AAAA,IACvD;AAGA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAc,gBAAgB,MAAiC;AAE7D,UAAM,SAAsB;AAAA,MAC1B,IAAI,KAAK,gBAAgB;AAAA,MACzB,UAAU,KAAK,OAAO;AAAA,MACtB,IAAI,KAAK;AAAA,MACT,UAAU,KAAK,UAAU;AAAA,MACzB,QAAQ,oBAAI,KAAK;AAAA,MACjB,QAAQ;AAAA,IACV;AAGA,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAErD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cAAc,MAAW,cAA0C;AAE/E,UAAM,SAAsB;AAAA,MAC1B,IAAI,KAAK,gBAAgB;AAAA,MACzB,UAAU,KAAK,OAAO;AAAA,MACtB,IAAI,KAAK;AAAA,MACT,UAAU,KAAK,UAAU;AAAA,MACzB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAA0B;AAChC,WAAO,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EAC1E;AAAA,EAEQ,kBAA0B;AAChC,WAAO,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EAC1E;AACF;;;AC/VA,IAAAC,iBAAsC;AAI/B,SAAS,SAAS,cAAqB;AAC5C,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAA4B,IAAI;AAC1D,QAAM,CAAC,YAAY,aAAa,QAAI,yBAA6B,IAAI;AAErE,QAAM,WAAO,4BAAY,OACvB,YACyB;AACzB,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,KAAK,OAAO;AAC9C,oBAAc,MAAM;AACpB,aAAO;AAAA,IACT,SAAS,KAAU;AACjB,YAAM,aAAyB;AAAA,QAC7B,MAAM,IAAI,QAAQ;AAAA,QAClB,SAAS,IAAI,WAAW;AAAA,QACxB,UAAU;AAAA,QACV,eAAe;AAAA,MACjB;AACA,eAAS,UAAU;AACnB,YAAM;AAAA,IACR,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,gBAAY,4BAAY,OAC5B,YACG;AACH,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,SAAS,MAAM,aAAa,UAAU,OAAO;AACnD,aAAO;AAAA,IACT,SAAS,KAAU;AACjB,YAAM,aAAyB;AAAA,QAC7B,MAAM,IAAI,QAAQ;AAAA,QAClB,SAAS,IAAI,WAAW;AAAA,QACxB,UAAU;AAAA,QACV,eAAe;AAAA,MACjB;AACA,eAAS,UAAU;AACnB,YAAM;AAAA,IACR,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC/DA,IAAAC,iBAAoC;AAI7B,SAAS,iBAAiB,cAAqB,YAAoB;AACxE,QAAM,CAAC,UAAU,WAAW,QAAI,yBAA+B,IAAI;AACnE,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AAErD,gCAAU,MAAM;AACd,QAAI;AACF,YAAM,OAAO,aAAa,YAAY,UAAU;AAChD,UAAI,MAAM;AACR,oBAAY,IAAI;AAAA,MAClB,OAAO;AACL,iBAAS,IAAI,MAAM,aAAa,UAAU,aAAa,CAAC;AAAA,MAC1D;AAAA,IACF,SAAS,KAAU;AACjB,eAAS,GAAG;AAAA,IACd,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,cAAc,UAAU,CAAC;AAE7B,QAAM,SAAS,MAAM;AACnB,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,OAAO,aAAa,YAAY,UAAU;AAChD,UAAI,MAAM;AACR,oBAAY,IAAI;AAAA,MAClB,OAAO;AACL,iBAAS,IAAI,MAAM,aAAa,UAAU,aAAa,CAAC;AAAA,MAC1D;AAAA,IACF,SAAS,KAAU;AACjB,eAAS,GAAG;AAAA,IACd,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9CA,IAAAC,iBAAyC;AACzC,IAAAC,eAYO;AACP,IAAAC,sBAA8D;AAiDtD,IAAAC,sBAAA;AAvCD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,OAAO,CAAC;AAAA,EACR,mBAAmB;AAAA,EACnB;AACF,GAAsB;AACpB,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwC,SAAS;AACjF,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAA0B,MAAM;AAG5D,QAAM,eAAW,wBAAQ,MAAM;AAC7B,QAAI,OAAO,aAAa,UAAU;AAChC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,SAAS,YAAY,aACxC,SAAS,QAAQ,IAAI,IACrB,SAAS;AAEb,UAAM,OAAO,OAAO,SAAS,KAAK,SAAS,aACvC,SAAS,KAAK,KAAK,IAAI,IACvB,SAAS,KAAK;AAElB,UAAM,OAAO,SAAS,KAAK,OACvB,OAAO,SAAS,KAAK,SAAS,aAC5B,SAAS,KAAK,KAAK,IAAI,IACvB,SAAS,KAAK,OAChB;AAEJ,WAAO,EAAE,SAAS,MAAM,KAAK;AAAA,EAC/B,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,QAAM,gBAAgB,MAAM;AAC1B,QAAI,WAAW,QAAQ;AACrB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,YAAY;AAAA,YACZ,iBAAiB;AAAA,UACnB;AAAA,UAEC,mBAAS;AAAA;AAAA,MACZ;AAAA,IAEJ;AAEA,QAAI,aAAa,QAAQ;AACvB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,UAEA,uDAAC,SAAK,mBAAS,MAAK;AAAA;AAAA,MACtB;AAAA,IAEJ;AAEA,UAAM,UACJ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiB;AAAA,QACnB;AAAA,QACA,yBAAyB,EAAE,QAAQ,SAAS,KAAK;AAAA;AAAA,IACnD;AAGF,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,UAAU;AACzB,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,UACb;AAAA,UAEA,uDAAC,2BAAW,GAAG,KAAM,mBAAQ;AAAA;AAAA,MAC/B;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,QACZ;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,iBAAiB;AAAA,gBACjB,SAAS;AAAA,gBACT,cAAc;AAAA,cAChB;AAAA,cAEA,wDAAC,sBAAM,KAAI,MACT;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,iBAAiB;AAAA,oBACnB;AAAA;AAAA,gBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,iBAAiB;AAAA,oBACnB;AAAA;AAAA,gBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,iBAAiB;AAAA,oBACnB;AAAA;AAAA,gBACF;AAAA,iBACF;AAAA;AAAA,UACF;AAAA,UACA,6CAAC,2BAAW,GAAG,KAAM,mBAAQ;AAAA;AAAA;AAAA,IAC/B;AAAA,EAEJ;AAEA,SACE,6CAAC,sBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAAK,WACpC,wDAAC,sBACC;AAAA,kDAAC,sBAAM,SAAQ,iBAAgB,OAAM,UACnC;AAAA,oDAAC,SACC;AAAA,qDAAC,sBAAM,OAAO,GAAG,2BAAa;AAAA,QAC9B,8CAAC,qBAAK,MAAK,MAAK,GAAE,UAAS;AAAA;AAAA,UACf,SAAS;AAAA,WACrB;AAAA,SACF;AAAA,MAEA,8CAAC,sBACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,UAAU,KAAwB;AAAA,YACvD,MAAM;AAAA,cACJ,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,cAC/B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,YACjC;AAAA;AAAA,QACF;AAAA,QAEC,WAAW,UACV,8CAAC,sBAAM,KAAI,MACT;AAAA,uDAAC,wBAAQ,OAAM,gBACb;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,aAAa,YAAY,WAAW;AAAA,cAC7C,SAAS,MAAM,YAAY,SAAS;AAAA,cAEpC,uDAAC,yCAAkB,MAAM,IAAI;AAAA;AAAA,UAC/B,GACF;AAAA,UAEA,6CAAC,wBAAQ,OAAM,eACb;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,aAAa,WAAW,WAAW;AAAA,cAC5C,SAAS,MAAM,YAAY,QAAQ;AAAA,cAEnC,uDAAC,wCAAiB,MAAM,IAAI;AAAA;AAAA,UAC9B,GACF;AAAA,UAEA,6CAAC,wBAAQ,OAAM,eACb;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,aAAa,SAAS,WAAW;AAAA,cAC1C,SAAS,MAAM,YAAY,MAAM;AAAA,cAEjC,uDAAC,gCAAS,MAAM,IAAI;AAAA;AAAA,UACtB,GACF;AAAA,WACF;AAAA,SAEJ;AAAA,OACF;AAAA,IAEA,6CAAC,oBAAK,wBAAc,GAAE;AAAA,KACxB,GACF;AAEJ;;;ACzOA,IAAAC,eAAmC;AAU/B,IAAAC,uBAAA;AAFG,SAAS,oBAAoB,EAAE,UAAU,UAAU,SAAS,GAA6B;AAC9F,SACE,+CAAC,sBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,sBAAM,OAAO,GAAG,mCAAqB;AAAA,IACtC,8CAAC,qBAAK,GAAE,UAAS,MAAK,MAAK,yCAA2B;AAAA,KACxD;AAEJ;;;ACfA,IAAAC,eAAmC;AAS/B,IAAAC,uBAAA;AAFG,SAAS,cAAc,EAAE,WAAW,OAAO,GAAuB;AACvE,SACE,+CAAC,sBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,sBAAM,OAAO,GAAG,4BAAc;AAAA,IAC/B,8CAAC,qBAAK,GAAE,UAAS,MAAK,MAAK,wCAA0B;AAAA,KACvD;AAEJ;;;AC6FQ,IAAAC,uBAAA;AAJD,SAAS,aAAa,OAAyB;AACpD,SACE,+CAAC,SAAI,OAAO,EAAE,YAAY,qBAAqB,UAAU,KAAK,QAAQ,SAAS,GAC7E;AAAA,kDAAC,SAAI,OAAO,EAAE,iBAAiB,WAAW,OAAO,SAAS,SAAS,IAAI,WAAW,SAAS,GACzF,wDAAC,QAAG,iCAAmB,GACzB;AAAA,IACA,+CAAC,SAAI,OAAO,EAAE,iBAAiB,WAAW,SAAS,GAAG,GACpD;AAAA,qDAAC,QAAG;AAAA;AAAA,QAAI,MAAM;AAAA,QAAK;AAAA,SAAC;AAAA,MACpB,8CAAC,OAAE,uGAAyF;AAAA,MAC5F,8CAAC,OAAE,4CAA8B;AAAA,MACjC,8CAAC,QACC,yDAAC,QAAG;AAAA,sDAAC,YAAO,oBAAM;AAAA,QAAS;AAAA,QAAE,MAAM;AAAA,SAAM,GAC3C;AAAA,MACC,MAAM,mBACL,gFACE;AAAA,sDAAC,OAAE,6EAA+D;AAAA,QAClE;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,MAAM;AAAA,YACZ,OAAO;AAAA,cACL,SAAS;AAAA,cACT,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,OAAO;AAAA,cACP,gBAAgB;AAAA,cAChB,cAAc;AAAA,cACd,WAAW;AAAA,YACb;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MAEF,8CAAC,OAAE,oFAAsE;AAAA,MACzE,+CAAC,OAAE;AAAA;AAAA,QAAa,8CAAC,QAAG;AAAA,QAAE;AAAA,SAAQ;AAAA,OAChC;AAAA,IACA,8CAAC,SAAI,OAAO,EAAE,WAAW,UAAU,WAAW,IAAI,OAAO,WAAW,UAAU,GAAG,GAC/E,wDAAC,OAAE,0DAAyC,GAC9C;AAAA,KACF;AAEJ;;;ACSQ,IAAAC,uBAAA;AAVD,SAAS,YAAY,OAAwB;AAClD,SACE,+CAAC,SAAI,OAAO,EAAE,YAAY,qBAAqB,UAAU,KAAK,QAAQ,SAAS,GAC7E;AAAA,kDAAC,SAAI,OAAO;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,GACE,wDAAC,QAAG,6BAAe,GACrB;AAAA,IACA,+CAAC,SAAI,OAAO;AAAA,MACV,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB,GACE;AAAA,qDAAC,OAAE;AAAA;AAAA,QAAG,MAAM,cAAc,IAAI,MAAM,WAAW,KAAK;AAAA,QAAG;AAAA,SAAC;AAAA,MACxD,+CAAC,OAAE;AAAA,sDAAC,YAAQ,gBAAM,aAAY;AAAA,QAAS;AAAA,QAAyB,8CAAC,YAAQ,gBAAM,oBAAoB,gBAAe;AAAA,QAAS;AAAA,SAAC;AAAA,OAE1H,MAAM,QAAQ,MAAM,eACpB,gFACE;AAAA,sDAAC,OAAE,4DAA8C;AAAA,QAChD,MAAM,QACL,+CAAC,UAAK,OAAO;AAAA,UACX,SAAS;AAAA,UACT,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV,GAAG;AAAA;AAAA,UACM,MAAM;AAAA,WACf;AAAA,QAED,MAAM,QAAQ,MAAM,cAAc,8CAAC,QAAG;AAAA,QACtC,MAAM,cACL,+CAAC,UAAK,OAAO;AAAA,UACX,SAAS;AAAA,UACT,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,OAAO;AAAA,UACP,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV,GAAG;AAAA;AAAA,UACY,MAAM;AAAA,WACrB;AAAA,SAEJ;AAAA,MAGF,8CAAC,OAAE,sFAAwE;AAAA,MAE3E,8CAAC,SAAI,OAAO,EAAE,WAAW,SAAS,GAChC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,OAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,OAAO;AAAA,YACP,gBAAgB;AAAA,YAChB,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,QAAQ;AAAA,UACV;AAAA,UACD;AAAA;AAAA,MAED,GACF;AAAA,MAEA,+CAAC,SAAI,OAAO;AAAA,QACV,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,GACE;AAAA,sDAAC,YAAO,0BAAO;AAAA,QAAS;AAAA,QAA8B,MAAM,aAAa;AAAA,QAAY;AAAA,SAEvF;AAAA,MAEA,+CAAC,OAAE;AAAA;AAAA,QAAiE,MAAM;AAAA,QAAY;AAAA,SAAqB;AAAA,MAE3G,+CAAC,OAAE;AAAA;AAAA,QAAa,8CAAC,QAAG;AAAA,QAAE;AAAA,QAAK,MAAM,oBAAoB;AAAA,SAAO;AAAA,OAC9D;AAAA,IACA,+CAAC,SAAI,OAAO,EAAE,WAAW,UAAU,WAAW,IAAI,OAAO,WAAW,UAAU,GAAG,GAC/E;AAAA,oDAAC,OAAE,qFAAuE;AAAA,MAC1E,+CAAC,OAAE;AAAA;AAAA,QAAQ,MAAM,oBAAoB;AAAA,QAAe;AAAA,SAAsB;AAAA,OAC5E;AAAA,KACF;AAEJ;;;AC/DQ,IAAAC,uBAAA;AAVD,SAAS,mBAAmB,OAA+B;AAChE,SACE,+CAAC,SAAI,OAAO,EAAE,YAAY,qBAAqB,UAAU,KAAK,QAAQ,SAAS,GAC7E;AAAA,kDAAC,SAAI,OAAO;AAAA,MACV,iBAAiB;AAAA,MACjB,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,GACE,wDAAC,QAAG,oCAAsB,GAC5B;AAAA,IACA,+CAAC,SAAI,OAAO;AAAA,MACV,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB,GACE;AAAA,qDAAC,OAAE;AAAA;AAAA,QAAG,MAAM,OAAO,IAAI,MAAM,IAAI,KAAK;AAAA,QAAG;AAAA,SAAC;AAAA,MAE1C,+CAAC,OAAE;AAAA;AAAA,QAA6E,8CAAC,YAAQ,gBAAM,OAAM;AAAA,QAAS;AAAA,SAAC;AAAA,MAE/G,8CAAC,OAAE,4DAA8C;AAAA,MAEjD,8CAAC,SAAI,OAAO,EAAE,WAAW,SAAS,GAChC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,MAAM;AAAA,UACZ,OAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,gBAAgB;AAAA,YAChB,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,QAAQ;AAAA,UACV;AAAA,UACD;AAAA;AAAA,MAED,GACF;AAAA,MAEA,8CAAC,OAAE,4DAA8C;AAAA,MACjD,8CAAC,OACC,wDAAC,UAAK,OAAO;AAAA,QACX,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,WAAW;AAAA,MACb,GACG,gBAAM,WACT,GACF;AAAA,MAEA,+CAAC,SAAI,OAAO;AAAA,QACV,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,GACE;AAAA,sDAAC,YAAO,wCAAmB;AAAA,QAAS;AAAA,QAAwB,MAAM,aAAa;AAAA,QAAY;AAAA,SAE7F;AAAA,OAEE,MAAM,aAAa,MAAM,cACzB,+CAAC,SAAI,OAAO;AAAA,QACV,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,GACE;AAAA,sDAAC,YAAO,8BAAgB;AAAA,QAAS,8CAAC,QAAG;AAAA,QACpC,MAAM,aAAa,gFAAE;AAAA;AAAA,UAAa,MAAM;AAAA,UAAU,8CAAC,QAAG;AAAA,WAAE;AAAA,QACxD,MAAM,aAAa,gFAAE;AAAA;AAAA,UAAS,MAAM;AAAA,WAAU;AAAA,SACjD;AAAA,MAGF,8CAAC,OAAE,wDAAC,YAAO,kCAAoB,GAAS;AAAA,MACxC,8CAAC,OAAE,oKAAsJ;AAAA,MAEzJ,8CAAC,OAAE,iDAAmC;AAAA,MACtC,+CAAC,QACC;AAAA,sDAAC,QAAG,6CAA+B;AAAA,QACnC,8CAAC,QAAG,6DAA+C;AAAA,QACnD,8CAAC,QAAG,mDAAqC;AAAA,SAC3C;AAAA,MAEA,+CAAC,OAAE;AAAA;AAAA,QAAa,8CAAC,QAAG;AAAA,QAAE;AAAA,SAAiB;AAAA,OACzC;AAAA,IACA,+CAAC,SAAI,OAAO,EAAE,WAAW,UAAU,WAAW,IAAI,OAAO,WAAW,UAAU,GAAG,GAC/E;AAAA,oDAAC,OAAE,8EAAgE;AAAA,MACnE,8CAAC,OAAE,0DAAyC;AAAA,OAC9C;AAAA,KACF;AAEJ;;;AChQA,IAAM,sBAAN,MAA0B;AAAA,EAA1B;AACE,SAAQ,SAA6B;AAAA,MACnC,UAAU,CAAC;AAAA,MACX,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAEA,SAAQ,gBAA2C,oBAAI,IAAI;AAC3D,SAAQ,YAAoE,oBAAI,IAAI;AACpF,SAAQ,YAAY;AAAA;AAAA;AAAA,EAGpB,UAAU,QAAiD;AACzD,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,OAAO;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,SAAsC;AACzC,UAAM,KAAK,QAAQ,MAAM,KAAK,WAAW;AAEzC,UAAM,eAA6B;AAAA,MACjC;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ,QAAQ;AAAA,MACtB,WAAW,oBAAI,KAAK;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB;AAGA,SAAK,cAAc,IAAI,IAAI,YAAY;AAGvC,UAAM,WAAW,QAAQ,YAAY,KAAK,mBAAmB,QAAQ,IAAI;AACzE,SAAK,eAAe,cAAc,UAAU,OAAO;AAGnD,QAAI,QAAQ,YAAY,QAAQ,aAAa,cAAc;AACzD,iBAAW,MAAM;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,GAAG,QAAQ,QAAQ;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,KAAK,SAA6C;AACtD,UAAM,eAA6B;AAAA,MACjC,IAAI,QAAQ,MAAM,KAAK,WAAW;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ,QAAQ;AAAA,MACtB,WAAW,oBAAI,KAAK;AAAA,MACpB,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,IACjB;AAGA,UAAM,WAAW,QAAQ,YAAY;AAAA,MACnC,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAGA,UAAM,WAA4B,CAAC;AAEnC,QAAI,SAAS,OAAO;AAClB,eAAS,KAAK,KAAK,YAAY,cAAc,OAAO,CAAC;AAAA,IACvD;AAEA,QAAI,SAAS,MAAM;AACjB,eAAS,KAAK,KAAK,WAAW,cAAc,OAAO,CAAC;AAAA,IACtD;AAEA,QAAI,SAAS,MAAM;AACjB,eAAS,KAAK,KAAK,WAAW,cAAc,OAAO,CAAC;AAAA,IACtD;AAEA,QAAI,SAAS,SAAS,QAAQ,UAAU;AACtC,eAAS,KAAK,KAAK,YAAY,cAAc,OAAO,CAAC;AAAA,IACvD;AAEA,UAAM,QAAQ,IAAI,QAAQ;AAAA,EAC5B;AAAA;AAAA,EAGA,OAAO,IAAY,SAAmC;AACpD,UAAM,eAAe,KAAK,cAAc,IAAI,EAAE;AAC9C,QAAI,CAAC,aAAc;AAGnB,WAAO,OAAO,cAAc;AAAA,MAC1B,OAAO,QAAQ,SAAS,aAAa;AAAA,MACrC,SAAS,QAAQ,WAAW,aAAa;AAAA,MACzC,MAAM,QAAQ,QAAQ,aAAa;AAAA,MACnC,SAAS,QAAQ;AAAA,MACjB,UAAU,QAAQ,aAAa,SAAY,QAAQ,WAAW,aAAa;AAAA,MAC3E,SAAS,QAAQ,WAAW,aAAa;AAAA,MACzC,MAAM,QAAQ,SAAS,SAAY,QAAQ,OAAO,aAAa;AAAA,MAC/D,QAAQ,QAAQ,WAAW,SAAY,QAAQ,SAAS,aAAa;AAAA,MACrE,QAAQ,QAAQ,WAAW,SAAY,QAAQ,SAAS,aAAa;AAAA,MACrE,OAAO,QAAQ,UAAU,SAAY,QAAQ,QAAQ,aAAa;AAAA,IACpE,CAAC;AAGD,SAAK,gBAAgB,UAAU,YAAY;AAAA,EAC7C;AAAA;AAAA,EAGA,QAAQ,IAAkB;AACxB,UAAM,eAAe,KAAK,cAAc,IAAI,EAAE;AAC9C,QAAI,CAAC,aAAc;AAEnB,iBAAa,cAAc,oBAAI,KAAK;AAGpC,SAAK,gBAAgB,WAAW,YAAY;AAG5C,eAAW,MAAM;AACf,WAAK,cAAc,OAAO,EAAE;AAAA,IAC9B,GAAG,GAAI;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,IAAkB;AAC3B,UAAM,eAAe,KAAK,cAAc,IAAI,EAAE;AAC9C,QAAI,CAAC,aAAc;AAEnB,iBAAa,SAAS,oBAAI,KAAK;AAG/B,SAAK,gBAAgB,QAAQ,YAAY;AAAA,EAC3C;AAAA;AAAA,EAGA,OAAO,QAAwE;AAC7E,QAAIC,iBAAgB,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC;AAE1D,QAAI,QAAQ,QAAQ;AAClB,MAAAA,iBAAgBA,eAAc,OAAO,OAAK,CAAC,EAAE,MAAM;AAAA,IACrD;AAEA,QAAI,QAAQ,MAAM;AAChB,MAAAA,iBAAgBA,eAAc,OAAO,OAAK,EAAE,SAAS,OAAO,IAAI;AAAA,IAClE;AAEA,WAAOA,eAAc;AAAA,MAAK,CAAC,GAAG,MAC5B,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA,EAGA,iBAAyB;AACvB,WAAO,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAC1C,OAAO,OAAK,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,EACvC;AAAA,EACL;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,cAAc,MAAM;AACzB,SAAK,gBAAgB,SAAS,IAAI;AAAA,EACpC;AAAA;AAAA,EAGA,UAAU,OAAe,UAAmE;AAC1F,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IACrC;AAEA,SAAK,UAAU,IAAI,KAAK,EAAG,IAAI,QAAQ;AAGvC,WAAO,MAAM;AACX,WAAK,UAAU,IAAI,KAAK,GAAG,OAAO,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA,EAGQ,aAAqB;AAC3B,WAAO,gBAAgB,KAAK,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS;AAAA,EACvD;AAAA,EAEQ,mBAAmB,MAA+C;AAExE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,EAAE,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM;AAAA,MAC9D,KAAK;AACH,eAAO,EAAE,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM;AAAA,MAC9D,KAAK;AACH,eAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,MAC/D,KAAK;AACH,eAAO,EAAE,OAAO,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM;AAAA,MAC/D;AACE,eAAO,EAAE,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,MAAM;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,eACN,cACA,UACA,SACM;AACN,QAAI,SAAS,OAAO;AAClB,WAAK,YAAY,cAAc,OAAO;AAAA,IACxC;AAEA,QAAI,SAAS,MAAM;AACjB,WAAK,WAAW,cAAc,OAAO;AAAA,IACvC;AAEA,QAAI,SAAS,MAAM;AACjB,WAAK,WAAW,cAAc,OAAO;AAAA,IACvC;AAEA,QAAI,SAAS,SAAS,QAAQ,UAAU;AACtC,WAAK,YAAY,cAAc,OAAO;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,cAA4B,SAA6C;AAEjG,SAAK,gBAAgB,SAAS,YAAY;AAAA,EAC5C;AAAA,EAEA,MAAc,WAAW,cAA4B,SAA6C;AAEhG,SAAK,gBAAgB,QAAQ,YAAY;AAAA,EAC3C;AAAA,EAEA,MAAc,WAAW,cAA4B,SAA6C;AAEhG,YAAQ,IAAI,wCAAwC;AAAA,EACtD;AAAA,EAEA,MAAc,YAAY,cAA4B,SAA6C;AAEjG,YAAQ,IAAI,wDAAwD;AAAA,EACtE;AAAA,EAEQ,gBAAgB,OAAe,cAAyC;AAC9E,UAAM,YAAY,KAAK,UAAU,IAAI,KAAK;AAC1C,QAAI,WAAW;AACb,gBAAU,QAAQ,cAAY,SAAS,YAAY,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAGO,IAAMA,iBAAgB,IAAI,oBAAoB;;;ACpRrD,IAAAC,iBAAiD;AAI1C,SAAS,mBAAmB;AACjC,QAAM,CAACC,gBAAe,gBAAgB,QAAI,yBAAyB,CAAC,CAAC;AACrE,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,CAAC;AAGhD,gCAAU,MAAM;AACd,UAAM,oBAAoB,MAAM;AAC9B,uBAAiBA,eAAoB,OAAO,CAAC;AAC7C,qBAAeA,eAAoB,eAAe,CAAC;AAAA,IACrD;AAEA,sBAAkB;AAGlB,UAAM,gBAAgB;AAAA,MACpBA,eAAoB,UAAU,QAAQ,iBAAiB;AAAA,MACvDA,eAAoB,UAAU,UAAU,iBAAiB;AAAA,MACzDA,eAAoB,UAAU,WAAW,iBAAiB;AAAA,MAC1DA,eAAoB,UAAU,QAAQ,iBAAiB;AAAA,MACvDA,eAAoB,UAAU,SAAS,iBAAiB;AAAA,IAC1D;AAEA,WAAO,MAAM;AACX,oBAAc,QAAQ,WAAS,MAAM,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,4BAAY,CAAC,OAAe;AAC7C,IAAAA,eAAoB,WAAW,EAAE;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAgB,4BAAY,MAAM;AACtC,IAAAA,eACG,OAAO,OAAK,CAAC,EAAE,MAAM,EACrB,QAAQ,OAAKA,eAAoB,WAAW,EAAE,EAAE,CAAC;AAAA,EACtD,GAAG,CAACA,cAAa,CAAC;AAElB,QAAM,yBAAqB,4BAAY,CAAC,OAAe;AACrD,IAAAA,eAAoB,QAAQ,EAAE;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW,4BAAY,MAAM;AACjC,IAAAA,eAAoB,MAAM;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,eAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACzDA,IAAAC,iBAAiD;AAGjD,IAAM,sBAA+C;AAAA,EACnD,UAAU;AAAA,IACR,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,YAAY,CAAC;AAAA,EACb,UAAU;AAAA,IACR,YAAY;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA,MACL,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,6BAA6B;AAC3C,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAkC,mBAAmB;AAC3F,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAG3C,gCAAU,MAAM;AACd,UAAM,kBAAkB,YAAY;AAClC,UAAI;AAEF,cAAM,SAAS,aAAa,QAAQ,0BAA0B;AAC9D,YAAI,QAAQ;AACV,yBAAe,KAAK,MAAM,MAAM,CAAC;AAAA,QACnC;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,4CAA4C,KAAK;AAAA,MACjE,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAEA,oBAAgB;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAoB,4BAAY,OACpC,YACG;AACH,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,mBAAe,cAAc;AAG7B,QAAI;AACF,mBAAa,QAAQ,4BAA4B,KAAK,UAAU,cAAc,CAAC;AAAA,IACjF,SAAS,OAAO;AACd,cAAQ,MAAM,4CAA4C,KAAK;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,8BAA0B,4BAAY,CAC1C,SACA,YACG;AACH,sBAAkB;AAAA,MAChB,UAAU;AAAA,QACR,GAAG,YAAY;AAAA,QACf,CAAC,OAAO,GAAG;AAAA,UACT,GAAG,YAAY,SAAS,OAAO;AAAA,UAC/B,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,iBAAiB,CAAC;AAEnC,QAAM,sBAAkB,4BAAY,MAAM;AACxC,mBAAe,mBAAmB;AAClC,iBAAa,WAAW,0BAA0B;AAAA,EACpD,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxHA,IAAAC,iBAAsC;AAI/B,SAAS,wBAAwB;AACtC,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAmC,KAAK;AACpE,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,EAAE;AAEjD,QAAM;AAAA,IACJ,eAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,iBAAiB;AAErB,QAAM,WAAO,4BAAY,MAAM,UAAU,IAAI,GAAG,CAAC,CAAC;AAClD,QAAM,YAAQ,4BAAY,MAAM,UAAU,KAAK,GAAG,CAAC,CAAC;AACpD,QAAM,aAAS,4BAAY,MAAM,UAAU,UAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;AAG7D,QAAM,wBAAwBA,eAAc,OAAO,kBAAgB;AAEjE,QAAI,WAAW,SAAS,aAAa,SAAS,QAAQ;AACpD,aAAO;AAAA,IACT;AAGA,QAAI,aAAa;AACf,YAAMC,SAAQ,YAAY,YAAY;AACtC,aACE,aAAa,MAAM,YAAY,EAAE,SAASA,MAAK,KAC/C,aAAa,SAAS,YAAY,EAAE,SAASA,MAAK;AAAA,IAEtD;AAEA,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,uBAAuB,sBAAsB,OAAO,CAAC,QAAQ,iBAAiB;AAClF,UAAM,OAAO,IAAI,KAAK,aAAa,SAAS;AAC5C,UAAM,UAAU,KAAK,aAAa;AAElC,QAAI,CAAC,OAAO,OAAO,GAAG;AACpB,aAAO,OAAO,IAAI,CAAC;AAAA,IACrB;AAEA,WAAO,OAAO,EAAE,KAAK,YAAY;AACjC,WAAO;AAAA,EACT,GAAG,CAAC,CAAmC;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACpEA,IAAAC,eAWO;AACP,IAAAC,sBAAoC;;;ACZpC,IAAAC,eAaO;AACP,IAAAC,sBAYO;AAmBQ,IAAAC,uBAAA;AATR,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,UAAU,CAAC,SAA2B;AAC1C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,8CAAC,iCAAU,MAAM,IAAI;AAAA,MAC9B,KAAK;AACH,eAAO,8CAAC,6BAAM,MAAM,IAAI;AAAA,MAC1B,KAAK;AACH,eAAO,8CAAC,6CAAsB,MAAM,IAAI;AAAA,MAC1C,KAAK;AACH,eAAO,8CAAC,iCAAU,MAAM,IAAI;AAAA,MAC9B,KAAK;AAAA,MACL;AACE,eAAO,8CAAC,sCAAe,MAAM,IAAI;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,SAAiB;AACtC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,8CAAC,wCAAiB,MAAM,IAAI;AAAA,MACrC,KAAK;AACH,eAAO,8CAAC,iCAAU,MAAM,IAAI;AAAA,MAC9B,KAAK;AACH,eAAO,8CAAC,uCAAgB,MAAM,IAAI;AAAA,MACpC,KAAK;AACH,eAAO,8CAAC,mCAAY,MAAM,IAAI;AAAA,MAChC,KAAK;AACH,eAAO,8CAAC,qCAAc,MAAM,IAAI;AAAA,MAClC;AACE,eAAO,8CAAC,sCAAe,MAAM,IAAI;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,SAA2B;AAC3C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,SAAiB;AACvC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,SAAe;AAC9B,UAAM,UAAU,KAAK,QAAO,oBAAI,KAAK,GAAE,QAAQ,IAAI,KAAK,QAAQ,KAAK,GAAI;AAEzE,QAAI,UAAU,GAAI,QAAO;AACzB,QAAI,UAAU,KAAM,QAAO,GAAG,KAAK,MAAM,UAAU,EAAE,CAAC;AACtD,QAAI,UAAU,MAAO,QAAO,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC;AACzD,WAAO,GAAG,KAAK,MAAM,UAAU,KAAK,CAAC;AAAA,EACvC;AAEA,QAAM,cAAc,MAAM;AACxB,QAAI,CAAC,aAAa,UAAU,QAAQ;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,OAAO;AAAA,QACL,cAAc;AAAA,QACd,iBAAiB,aAAa,SAAS,gBAAgB;AAAA,QACvD,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,MACA,SAAS;AAAA,MAET,yDAAC,sBAAM,OAAM,cAAa,KAAI,MAAK,MAAK,UACrC;AAAA,qBAAa,SACZ;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,aAAa,OAAO;AAAA,YACzB,KAAK,aAAa,OAAO;AAAA,YACzB,OAAO,aAAa,OAAO;AAAA,YAC3B,QAAO;AAAA,YACP,MAAK;AAAA,YAEJ,uBAAa,OAAO,QAAQ,aAAa,OAAO;AAAA;AAAA,QACnD,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,SAAS,aAAa,IAAI;AAAA,YACjC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YAEN,kBAAQ,aAAa,IAAI;AAAA;AAAA,QAC5B;AAAA,QAGF,+CAAC,sBAAM,KAAI,MAAK,OAAO,EAAE,MAAM,EAAE,GAC/B;AAAA,yDAAC,sBAAM,SAAQ,iBAAgB,KAAI,MAAK,MAAK,UAC3C;AAAA,2DAAC,sBAAM,KAAI,MAAK,MAAK,UACnB;AAAA,4DAAC,qBAAK,IAAI,KAAK,MAAK,MAAK,WAAW,GACjC,uBAAa,OAChB;AAAA,cACC,aAAa,SACZ;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,aAAa,MAAM;AAAA,kBAC1B,SAAS,aAAa,MAAM,WAAW;AAAA,kBACvC,MAAM,aAAa,MAAM,QAAQ;AAAA,kBAEhC,uBAAa,MAAM;AAAA;AAAA,cACtB;AAAA,eAEJ;AAAA,YACA,+CAAC,sBAAM,KAAI,MAAK,MAAK,UACnB;AAAA,4DAAC,qBAAK,MAAK,MAAK,GAAE,UACf,kBAAQ,aAAa,SAAS,GACjC;AAAA,cACC,aACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,OAAM;AAAA,kBACN,SAAS,CAAC,MAAM;AACd,sBAAE,gBAAgB;AAClB,8BAAU;AAAA,kBACZ;AAAA,kBAEA,wDAAC,6BAAM,MAAM,IAAI;AAAA;AAAA,cACnB;AAAA,eAEJ;AAAA,aACF;AAAA,UAEC,aAAa,WACZ,8CAAC,qBAAK,MAAK,MAAK,GAAE,UAAS,WAAW,GACnC,uBAAa,SAChB;AAAA,UAGD,aAAa,UACZ,+CAAC,sBAAM,KAAI,MACT;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,aAAa,OAAO,SAAS,eAAe,aAAa,OAAO,IAAI;AAAA,gBAC3E,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,QAAO;AAAA,gBAEN,uBAAa,OAAO,QAAQ,cAAc,aAAa,OAAO,IAAI;AAAA;AAAA,YACrE;AAAA,YACA,8CAAC,qBAAK,MAAK,MAAK,GAAG,aAAa,OAAO,SAAS,eAAe,aAAa,OAAO,IAAI,GACpF,uBAAa,OAAO,SAAS,aAAa,OAAO,MACpD;AAAA,aACF;AAAA,UAGD,aAAa,YACZ,+CAAC,oBACE;AAAA,yBAAa,SAAS,SACrB,8CAAC,qBAAK,MAAK,MAAK,GAAE,UAAS,IAAI,GAC5B,uBAAa,SAAS,OACzB;AAAA,YAEF;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,aAAa,SAAS;AAAA,gBAC7B,MAAK;AAAA,gBACL,OAAO,aAAa,SAAS;AAAA,gBAC7B,UAAU,aAAa,SAAS;AAAA,gBAChC,SAAS,aAAa,SAAS;AAAA;AAAA,YACjC;AAAA,aACF;AAAA,UAGD,aAAa,QACZ;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,aAAa,KAAK;AAAA,cACxB,QAAQ,aAAa,KAAK,UAAU;AAAA,cACpC,MAAK;AAAA,cACL,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,cAElC,yDAAC,sBAAM,KAAK,GACV;AAAA,8DAAC,qBAAM,uBAAa,KAAK,SAAS,aAAa,KAAK,MAAK;AAAA,gBACxD,aAAa,KAAK,YAAY,8CAAC,wCAAiB,MAAM,IAAI;AAAA,iBAC7D;AAAA;AAAA,UACF;AAAA,UAGD,aAAa,WAAW,aAAa,QAAQ,SAAS,KACrD,8CAAC,sBAAM,KAAI,MAAK,IAAG,MAChB,uBAAa,QAAQ,IAAI,CAAC,QAAQ,UACjC;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,OAAO,UAAU,YAAY,WAAW;AAAA,cACjD,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,cAC3C,aAAa,OAAO;AAAA,cACpB,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AAClB,oBAAI,OAAO,WAAW,aAAa,WAAW;AAC5C,4BAAU;AAAA,gBACZ,WAAW,OAAO,OAAO,WAAW,YAAY;AAC9C,yBAAO,OAAO;AAAA,gBAChB,WAAW,UAAU;AACnB,2BAAS,MAAM;AAAA,gBACjB;AAAA,cACF;AAAA,cAEC,iBAAO;AAAA;AAAA,YAhBH;AAAA,UAiBP,CACD,GACH;AAAA,WAEJ;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;ADnNY,IAAAC,uBAAA;AAzCL,SAAS,iBAAiB;AAAA,EAC/B,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AACjB,GAA0B;AACxB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,sBAAsB;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,WAAS;AAAA,MACT,WAAS;AAAA,MACT,QAAO;AAAA,MAEP;AAAA,sDAAC,qBAAQ,QAAR,EACC;AAAA,UAAC;AAAA;AAAA,YACC,QAAM;AAAA,YACN,OAAO;AAAA,YACP,MAAM;AAAA,YACN,UAAU,gBAAgB;AAAA,YAC1B,OAAM;AAAA,YACN,QAAQ;AAAA,YAER;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,cAAW;AAAA,gBAEX,wDAAC,gCAAS,MAAM,IAAI;AAAA;AAAA,YACtB;AAAA;AAAA,QACF,GACF;AAAA,QAEA,8CAAC,qBAAQ,UAAR,EAAiB,GAAG,GACnB,yDAAC,sBAAM,KAAK,GACV;AAAA,yDAAC,sBAAM,SAAQ,iBAAgB,GAAE,MAAK,IAAG,MACvC;AAAA,2DAAC,sBAAM,KAAI,MACT;AAAA,4DAAC,qBAAK,IAAI,KAAK,MAAK,MAAK,2BAAa;AAAA,cACrC,cAAc,KACb,+CAAC,sBAAM,OAAM,OAAM,SAAQ,UAAS,MAAK,MACtC;AAAA;AAAA,gBAAY;AAAA,iBACf;AAAA,eAEJ;AAAA,YACCA,eAAc,SAAS,KACtB;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU,gBAAgB;AAAA,gBAC3B;AAAA;AAAA,YAED;AAAA,aAEJ;AAAA,UAECA,eAAc,WAAW,IACxB,8CAAC,uBAAO,GAAE,MACR,yDAAC,sBAAM,OAAM,UAAS,KAAI,MACxB;AAAA,0DAAC,iCAAU,MAAM,IAAI,QAAQ,GAAG,OAAM,QAAO;AAAA,YAC7C,8CAAC,qBAAK,GAAE,UAAS,MAAK,MAAM,wBAAa;AAAA,aAC3C,GACF,IAEA,8CAAC,2BAAW,GAAG,WAAW,kBAAgB,MACxC,wDAAC,sBAAM,KAAK,GACT,UAAAA,eAAc,IAAI,CAAC,iBAClB;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,QAAQ,MAAM,WAAW,aAAa,EAAE;AAAA,cACxC,WAAW,MAAM,mBAAmB,aAAa,EAAE;AAAA;AAAA,YAH9C,aAAa;AAAA,UAIpB,CACD,GACH,GACF;AAAA,WAEJ,GACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;AEpHA,IAAAC,gBAAmC;AAI/B,IAAAC,uBAAA;AAFG,SAAS,qBAAqB;AACnC,SACE,+CAAC,uBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,uBAAM,OAAO,GAAG,iCAAmB;AAAA,IACpC,8CAAC,sBAAK,GAAE,UAAS,MAAK,MAAK,kDAAoC;AAAA,KACjE;AAEJ;;;ACTA,IAAAC,gBAAmC;AAS/B,IAAAC,uBAAA;AAFG,SAAS,wBAAwB,EAAE,aAAa,SAAS,GAAiC;AAC/F,SACE,+CAAC,uBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,uBAAM,OAAO,GAAG,sCAAwB;AAAA,IACzC,8CAAC,sBAAK,GAAE,UAAS,MAAK,MAAK,+CAAiC;AAAA,KAC9D;AAEJ;;;ACfA,IAAAC,iBAAuE;AA2BnE,IAAAC,uBAAA;AAnBJ,IAAM,0BAAsB,8BAAoD,MAAS;AAOlF,SAAS,qBAAqB,EAAE,UAAU,OAAO,GAA8B;AACpF,gCAAU,MAAM;AACd,QAAI,QAAQ;AACV,MAAAC,eAAoB,UAAU,MAAM;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,QAAkC;AAAA,IACtC,SAASA;AAAA,EACX;AAEA,SACE,8CAAC,oBAAoB,UAApB,EAA6B,OAC3B,UACH;AAEJ;;;ACtBA,IAAM,eAAN,MAAM,cAAa;AAAA,EAAnB;AACE,SAAQ,SAAsB;AAAA,MAC5B,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,IACb;AAEA,SAAQ,SAAkC,oBAAI,IAAI;AAClD,SAAQ,sBAAuD,oBAAI,IAAI;AACvE,SAAQ,mBAA0C,oBAAI,IAAI;AAAA;AAAA;AAAA,EAG1D,UAAU,QAAmC;AAC3C,SAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,OAAO;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,IAAI,SAAiD;AACzD,QAAI;AACF,YAAM,QAAoB;AAAA,QACxB,IAAI,KAAK,gBAAgB;AAAA,QACzB,WAAW,oBAAI,KAAK;AAAA,QACpB,OAAO,MAAM,KAAK,gBAAgB;AAAA,QAClC,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,QAClB,QAAQ,QAAQ,UAAU;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB,SAAS,MAAM,KAAK,eAAe;AAAA,QACnC,MAAM,QAAQ;AAAA,MAChB;AAGA,UAAI,KAAK,OAAO,SAAS;AACvB,mBAAW,UAAU,KAAK,OAAO,SAAS;AACxC,cAAI,CAAC,OAAO,OAAO,KAAK,GAAG;AACzB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAGA,UAAI,iBAAiB;AACrB,UAAI,KAAK,OAAO,YAAY;AAC1B,mBAAW,aAAa,KAAK,OAAO,YAAY;AAC9C,2BAAiB,UAAU,OAAO,cAAc;AAAA,QAClD;AAAA,MACF;AAGA,YAAM,KAAK,WAAW,cAAc;AAGpC,UAAI,KAAK,OAAO,QAAQ;AACtB,aAAK,YAAY,cAAc;AAAA,MACjC;AAEA,aAAO;AAAA,IACT,SAAS,OAAY;AACnB,YAAM,aAAyB;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS,MAAM,WAAW;AAAA,QAC1B,OAAO;AAAA,QACP,eAAe;AAAA,MACjB;AAEA,UAAI,KAAK,OAAO,SAAS;AACvB,aAAK,OAAO,QAAQ,UAAU;AAAA,MAChC;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAgB;AACpB,WAAO,CAAC,QAAa,aAAqB,eAAmC;AAC3E,YAAM,iBAAiB,WAAW;AAElC,iBAAW,QAAQ,kBAAmB,MAAa;AACjD,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI;AACJ,YAAI;AAEJ,YAAI;AACF,mBAAS,MAAM,eAAe,MAAM,MAAM,IAAI;AAAA,QAChD,SAAS,GAAG;AACV,kBAAQ;AAAA,QACV;AAGA,cAAMC,SAAQ,IAAI,cAAa;AAC/B,cAAMA,OAAM,IAAI;AAAA,UACd;AAAA,UACA,UAAU;AAAA,YACR,MAAM,OAAO,YAAY;AAAA,YACzB,IAAI;AAAA,YACJ,MAAM,GAAG,OAAO,YAAY,IAAI,IAAI,WAAW;AAAA,UACjD;AAAA,UACA,QAAQ,QAAQ,YAAY;AAAA,UAC5B,UAAU;AAAA,YACR,UAAU,KAAK,IAAI,IAAI;AAAA,YACvB,WAAW;AAAA,YACX,OAAO,OAAO;AAAA,UAChB;AAAA,QACF,CAAC;AAED,YAAI,OAAO;AACT,gBAAM;AAAA,QACR;AAEA,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,QAA0C;AAC/C,UAAM,iBAAiB,KAAK,uBAAuB;AAEnD,UAAM,eAAmC;AAAA,MACvC,IAAI;AAAA,MACJ,aAAa,MAAM;AACjB,aAAK,oBAAoB,OAAO,cAAc;AAAA,MAChD;AAAA,MACA,OAAO,MAAM;AAAA,MAEb;AAAA,MACA,QAAQ,MAAM;AAAA,MAEd;AAAA,MACA,cAAc,CAAC,WAAW;AAAA,MAE1B;AAAA,IACF;AAEA,SAAK,oBAAoB,IAAI,gBAAgB,YAAY;AAGzD,QAAI,OAAO,WAAW;AACpB,aAAO,UAAU;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,MAAMC,QAAmD;AAC7D,QAAI,SAAS,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAG5C,QAAIA,OAAM,SAAS;AACjB,YAAM,EAAE,QAAQ,IAAIA;AAEpB,UAAI,QAAQ,WAAW;AACrB,iBAAS,OAAO,OAAO,OAAK,EAAE,aAAa,QAAQ,SAAU;AAAA,MAC/D;AAEA,UAAI,QAAQ,SAAS;AACnB,iBAAS,OAAO,OAAO,OAAK,EAAE,aAAa,QAAQ,OAAQ;AAAA,MAC7D;AAEA,UAAI,QAAQ,QAAQ,QAAQ;AAC1B,iBAAS,OAAO,OAAO,OAAK,QAAQ,OAAQ,SAAS,EAAE,MAAM,EAAE,CAAC;AAAA,MAClE;AAEA,UAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAS,OAAO,OAAO,OAAK,QAAQ,QAAS,SAAS,EAAE,MAAM,CAAC;AAAA,MACjE;AAEA,UAAI,QAAQ,eAAe,QAAQ;AACjC,iBAAS,OAAO,OAAO,OAAK,QAAQ,cAAe,SAAS,EAAE,SAAS,IAAI,CAAC;AAAA,MAC9E;AAEA,UAAI,QAAQ,SAAS,QAAQ;AAC3B,iBAAS,OAAO,OAAO,OAAK,QAAQ,QAAS,SAAS,EAAE,MAAM,CAAC;AAAA,MACjE;AAEA,UAAI,QAAQ,QAAQ;AAClB,cAAM,SAAS,QAAQ,OAAO,YAAY;AAC1C,iBAAS,OAAO;AAAA,UAAO,OACrB,EAAE,OAAO,YAAY,EAAE,SAAS,MAAM,KACtC,EAAE,SAAS,MAAM,YAAY,EAAE,SAAS,MAAM,KAC9C,EAAE,MAAM,MAAM,YAAY,EAAE,SAAS,MAAM;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAGA,QAAIA,OAAM,MAAM;AACd,aAAO,KAAK,CAAC,GAAG,MAAM;AACpB,cAAM,SAAU,EAAUA,OAAM,KAAM,KAAK;AAC3C,cAAM,SAAU,EAAUA,OAAM,KAAM,KAAK;AAC3C,cAAM,YAAYA,OAAM,KAAM,UAAU,QAAQ,IAAI;AAEpD,YAAI,SAAS,OAAQ,QAAO,CAAC;AAC7B,YAAI,SAAS,OAAQ,QAAO;AAC5B,eAAO;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AAEL,aAAO,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AAAA,IACrE;AAGA,UAAM,QAAQ,OAAO;AACrB,QAAIA,OAAM,YAAY;AACpB,YAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAIA,OAAM;AACvC,YAAM,SAAS,OAAO,KAAK;AAC3B,eAAS,OAAO,MAAM,OAAO,QAAQ,KAAK;AAAA,IAC5C;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAMA,OAAM,YAAY,QAAQ;AAAA,MAChC,UAAUA,OAAM,YAAY,SAAS,OAAO;AAAA,MAC5C,SAAS,SAASA,OAAM,YAAY,QAAQ,MAAMA,OAAM,YAAY,SAAS;AAAA,IAC/E;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,gBAAgB,QAAgB,WAAkB,SAAuC;AAC7F,UAAMA,SAAyB;AAAA,MAC7B,SAAS;AAAA,QACP,QAAQ,CAAC,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK,MAAMA,MAAK;AACrC,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA,EAGA,MAAc,kBAAkB;AAE9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB;AAE7B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,WAAW,OAAO,WAAW,cAAc,OAAO,UAAU,YAAY;AAAA,MACxE,WAAW,KAAK,kBAAkB;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,OAAmB;AAE1C,SAAK,OAAO,IAAI,MAAM,IAAI,KAAK;AAG/B,QAAI,KAAK,OAAO,WAAW;AACzB,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,YAAY,OAAmB;AAErC,SAAK,oBAAoB,QAAQ,CAAC,cAAc,OAAO;AAAA,IAEvD,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB;AACzB,UAAM,cAAc,KAAK,eAAe,KAAK,OAAO,SAAU;AAC9D,UAAM,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW;AAEpD,SAAK,OAAO,QAAQ,CAAC,OAAO,OAAO;AACjC,UAAI,MAAM,YAAY,YAAY;AAChC,aAAK,OAAO,OAAO,EAAE;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,WAA2B;AAChD,UAAM,QAAQ,UAAU,MAAM,kBAAkB;AAChD,QAAI,CAAC,MAAO,QAAO,KAAK,KAAK,KAAK,KAAK;AAEvC,UAAM,CAAC,EAAE,OAAO,IAAI,IAAI;AACxB,UAAM,MAAM,SAAS,OAAO,EAAE;AAE9B,YAAQ,MAAM;AAAA,MACZ,KAAK;AAAK,eAAO,MAAM,KAAK,KAAK;AAAA,MACjC,KAAK;AAAK,eAAO,MAAM,KAAK,KAAK,KAAK;AAAA,MACtC,KAAK;AAAK,eAAO,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,MAC1C,KAAK;AAAK,eAAO,MAAM,KAAK,KAAK,KAAK,KAAK;AAAA,MAC3C,KAAK;AAAK,eAAO,MAAM,MAAM,KAAK,KAAK,KAAK;AAAA,MAC5C;AAAS,eAAO,KAAK,KAAK,KAAK,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,kBAA0B;AAChC,WAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EACxE;AAAA,EAEQ,yBAAiC;AACvC,WAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EACxE;AAAA,EAEQ,oBAA4B;AAClC,WAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EACxE;AACF;AAGO,IAAM,QAAQ,IAAI,aAAa;;;ACvUtC,IAAAC,iBAA2B;;;ACA3B,oBAA+C;AAKxC,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAgBrB,cAAc;AAdtB,SAAQ,SAAkC;AAC1C,SAAQ,SAAS;AAAA,MACf,MAAM,QAAQ,IAAI,mBAAmB;AAAA,MACrC,UAAU,QAAQ,IAAI,mBAAmB;AAAA,MACzC,UAAU,QAAQ,IAAI,uBAAuB;AAAA,MAC7C,UAAU,QAAQ,IAAI,uBAAuB;AAAA,MAC7C,iBAAiB;AAAA,MACjB,sBAAsB;AAAA,MACtB,aAAa;AAAA,QACX,SAAS;AAAA,QACT,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EAEuB;AAAA,EAEvB,OAAO,cAAiC;AACtC,QAAI,CAAC,mBAAkB,UAAU;AAC/B,yBAAkB,WAAW,IAAI,mBAAkB;AAAA,IACrD;AACA,WAAO,mBAAkB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,aAAS,4BAAa,KAAK,MAAM;AACtC,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,YAAY;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAA8B;AAC5B,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,6DAA6D;AAAA,IAC/E;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAgC;AAC5C,QAAI;AACF,YAAM,KAAK,OAAQ,MAAM;AAAA,QACvB,OAAO,iCAAiC,KAAK,OAAO,QAAQ;AAAA,QAC5D,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAA6B;AACzC,UAAM,mBAAmB;AAAA,mCACM,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CnD,QAAI;AACF,YAAM,KAAK,OAAQ,MAAM;AAAA,QACvB,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAGD,YAAM,KAAK,wBAAwB;AAAA,IACrC,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,0BAAyC;AAErD,UAAM,oBAAoB;AAAA,+CACiB,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAUtD,KAAK,OAAO,QAAQ;AAAA;AAAA;AAK7B,UAAM,qBAAqB;AAAA,+CACgB,KAAK,OAAO,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAUtD,KAAK,OAAO,QAAQ;AAAA;AAAA;AAI7B,QAAI;AACF,YAAM,KAAK,OAAQ,MAAM,EAAE,OAAO,mBAAmB,QAAQ,cAAc,CAAC;AAC5E,YAAM,KAAK,OAAQ,MAAM,EAAE,OAAO,oBAAoB,QAAQ,cAAc,CAAC;AAAA,IAC/E,SAAS,OAAO;AAEd,cAAQ,KAAK,wCAAwC,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAA8B;AAC/C,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,KAAK,OAAQ,OAAO;AAAA,QACxB,OAAO,GAAG,KAAK,OAAO,QAAQ;AAAA,QAC9B,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAC/C,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAYC,QAAe,QAA8C;AAC7E,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,OAAQ,MAAM;AAAA,QACtC,OAAAA;AAAA,QACA,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB,CAAC;AAED,aAAO,MAAM,OAAO,KAAK;AAAA,IAC3B,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,OAAO,MAAM;AACxB,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AACF;AAGO,IAAM,oBAAoB,kBAAkB,YAAY;;;ACvO/D,uBAUO;AACP,IAAAC,oBAA6B;AAC7B,IAAAC,cAAuB;;;ACZvB,oBAAwC;AAUjC,SAAS,WAAW,QAAgB,MAAuB;AAChE,QAAM,OAAO,OAAO,GAAG,MAAM,IAAI,IAAI,KAAK;AAC1C,aAAO,0BAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACvD;AAKO,SAAS,eAAuB;AACrC,aAAO,2BAAY,EAAE,EAAE,SAAS,KAAK;AACvC;AAKO,SAAS,mBACd,cACAC,aACA,OACQ;AACR,SAAO,GAAG,YAAY,IAAIA,WAAU,IAAI,KAAK;AAC/C;AAKO,SAAS,kBAAkB,WAIzB;AACP,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,cAAc,MAAM,CAAC;AAAA,IACrB,YAAY,MAAM,CAAC;AAAA,IACnB,OAAO,MAAM,CAAC;AAAA,EAChB;AACF;;;ADpCA,IAAM,2BAA2B;AAa1B,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EAKtB,cAAc;AAHtB,SAAQ,cAAwC,oBAAI,IAAI;AACxD,SAAQ,SAAK,oCAAa,oBAAO,CAAC;AAAA,EAEX;AAAA,EAEvB,OAAO,cAAkC;AACvC,QAAI,CAAC,oBAAmB,UAAU;AAChC,0BAAmB,WAAW,IAAI,oBAAmB;AAAA,IACvD;AACA,WAAO,oBAAmB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,QAAiC;AAE5D,UAAM,SAAS,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC,EAAE;AAAA,MACnD,CAAAC,aAAWA,SAAQ,WAAW;AAAA,IAChC;AACA,QAAI,QAAQ;AACV,aAAO,OAAO;AAAA,IAChB;AAGA,UAAM,kBAAc,6BAAW,KAAK,IAAI,wBAAwB;AAChE,UAAM,QAAI,wBAAM,iBAAa,wBAAM,UAAU,MAAM,MAAM,CAAC;AAC1D,UAAM,WAAW,UAAM,0BAAQ,CAAC;AAEhC,QAAI,CAAC,SAAS,OAAO;AACnB,YAAMA,WAAU,SAAS,KAAK,CAAC,EAAE,KAAK;AACtC,WAAK,YAAY,IAAIA,SAAQ,MAAMA,QAAO;AAC1C,aAAOA,SAAQ;AAAA,IACjB;AAGA,UAAM,OAAO,aAAa;AAC1B,UAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,UAAM,UAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,2BAAU,IAAI;AAAA,IAC3B;AAEA,cAAM,6BAAO,sBAAI,KAAK,IAAI,0BAA0B,IAAI,GAAG,OAAO;AAClE,SAAK,YAAY,IAAI,MAAM,OAAO;AAElC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAsC;AAEtD,UAAM,SAAS,KAAK,YAAY,IAAI,IAAI;AACxC,QAAI,QAAQ;AAEV,WAAK,mBAAmB,IAAI;AAC5B,aAAO,OAAO;AAAA,IAChB;AAGA,UAAM,aAAS,sBAAI,KAAK,IAAI,0BAA0B,IAAI;AAC1D,UAAM,WAAW,UAAM,yBAAO,MAAM;AAEpC,QAAI,CAAC,SAAS,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,SAAS,KAAK;AAC9B,SAAK,YAAY,IAAI,MAAM,OAAO;AAGlC,SAAK,mBAAmB,IAAI;AAE5B,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,SAAiD;AAC7E,UAAM,YAAQ,6BAAW,KAAK,EAAE;AAChC,UAAM,cAAc,oBAAI,IAAoB;AAE5C,eAAW,UAAU,SAAS;AAE5B,YAAM,eAAe,MAAM,KAAK,uBAAuB,MAAM;AAC7D,UAAI,cAAc;AAChB,oBAAY,IAAI,QAAQ,YAAY;AACpC;AAAA,MACF;AAEA,YAAM,OAAO,aAAa;AAC1B,YAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,YAAM,UAAuB;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,2BAAU,IAAI;AAAA,MAC3B;AAEA,YAAM,QAAI,sBAAI,KAAK,IAAI,0BAA0B,IAAI,GAAG,OAAO;AAC/D,kBAAY,IAAI,QAAQ,IAAI;AAC5B,WAAK,YAAY,IAAI,MAAM,OAAO;AAAA,IACpC;AAEA,UAAM,MAAM,OAAO;AACnB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,QAAgD;AACvE,UAAM,cAAc,oBAAI,IAAoB;AAC5C,UAAM,iBAA2B,CAAC;AAGlC,eAAW,QAAQ,QAAQ;AACzB,YAAM,SAAS,KAAK,YAAY,IAAI,IAAI;AACxC,UAAI,QAAQ;AACV,oBAAY,IAAI,MAAM,OAAO,MAAM;AAAA,MACrC,OAAO;AACL,uBAAe,KAAK,IAAI;AAAA,MAC1B;AAAA,IACF;AAGA,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,kBAAc,6BAAW,KAAK,IAAI,wBAAwB;AAChE,YAAM,QAAI,wBAAM,iBAAa,wBAAM,QAAQ,MAAM,cAAc,CAAC;AAChE,YAAM,WAAW,UAAM,0BAAQ,CAAC;AAEhC,eAAS,KAAK,QAAQ,CAAAC,SAAO;AAC3B,cAAM,UAAUA,KAAI,KAAK;AACzB,oBAAY,IAAI,QAAQ,MAAM,QAAQ,MAAM;AAC5C,aAAK,YAAY,IAAI,QAAQ,MAAM,OAAO;AAAA,MAC5C,CAAC;AAAA,IACH;AAGA,WAAO,QAAQ,UAAQ,KAAK,mBAAmB,IAAI,CAAC;AAEpD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,YAAY,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,MAA6B;AAC5D,QAAI;AACF,gBAAM;AAAA,YACJ,sBAAI,KAAK,IAAI,0BAA0B,IAAI;AAAA,QAC3C,EAAE,cAAc,2BAAU,IAAI,EAAE;AAAA,QAChC,EAAE,OAAO,KAAK;AAAA,MAChB;AAAA,IACF,SAAS,OAAO;AAEd,cAAQ,MAAM,wCAAwC,KAAK;AAAA,IAC7D;AAAA,EACF;AACF;AAGO,IAAM,qBAAqB,mBAAmB,YAAY;;;AFxMjE,IAAAC,oBAA0C;AAC1C,IAAAC,cAAuB;AAoDhB,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EAItB,cAAc;AAFtB,SAAQ,SAAK,oCAAa,oBAAO,CAAC;AAAA,EAEX;AAAA,EAEvB,OAAO,cAAkC;AACvC,QAAI,CAAC,oBAAmB,UAAU;AAChC,0BAAmB,WAAW,IAAI,oBAAmB;AAAA,IACvD;AACA,WAAO,oBAAmB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAAoC;AACjD,UAAM,UAAU,MAAM,UAAM,2BAAW;AACvC,UAAM,YAAY,MAAM,aAAa,oBAAI,KAAK;AAG9C,UAAM,gBAAwC,CAAC;AAC/C,QAAI,MAAM,KAAK;AAEb,YAAM,gBAAgB,MAAM,UAAU,MAAM,MAAM,MAAM;AACxD,YAAM,eAAe,MAAM,mBAAmB,uBAAuB,aAAa;AAGlF,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG,GAAG;AACpD,YAAI,UAAU,UAAa,UAAU,MAAM;AAEzC,gBAAM,EAAE,YAAAC,aAAY,MAAM,IAAI,KAAK,qBAAqB,GAAG;AAC3D,wBAAc,KAAK,oBAAoB,GAAG,CAAC,IAAI;AAAA,YAC7C;AAAA,YACAA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,kBAAkB;AAAA,MACtB,IAAI;AAAA,MACJ,WAAW,UAAU,YAAY;AAAA,MACjC,UAAU,MAAM,mBAAmB,uBAAuB,MAAM,MAAM,EAAE;AAAA,MACxE,aAAa,MAAM,MAAM,SAAS;AAAA,MAClC,YAAY,MAAM,MAAM,QAAQ;AAAA,MAChC,YAAY,MAAM,MAAM,QAAQ;AAAA,MAChC,QAAQ,MAAM;AAAA,MACd,eAAe,MAAM,UAAU,QAAQ;AAAA,MACvC,aAAa,MAAM,UAAU,MAAM;AAAA,MACnC,eAAe,MAAM,UAAU,QAAQ;AAAA,MACvC,UAAU,MAAM,YAAY;AAAA,MAC5B,SAAS,MAAM,YAAY;AAAA,MAC3B,eAAe,MAAM,SAAS;AAAA,MAC9B,GAAG;AAAA,MACH,YAAY,MAAM,aAAa;AAAA,MAC/B,YAAY,MAAM,aAAa;AAAA,MAC/B,YAAY,MAAM,cAAc;AAAA,MAChC,UAAU,MAAM,YAAY;AAAA,MAC5B,YAAY,MAAM,aAAa;AAAA,MAC/B,YAAY,MAAM,aAAa;AAAA,MAC/B,UAAU,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC;AAAA,IAC/C;AAGA,UAAM,kBAAkB,aAAa,CAAC,eAAe,CAAC;AAEtD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAAyC;AACvD,UAAM,kBAAkB,MAAM,QAAQ;AAAA,MACpC,OAAO,IAAI,OAAO,UAAU;AAC1B,cAAM,UAAU,MAAM,UAAM,2BAAW;AACvC,cAAM,YAAY,MAAM,aAAa,oBAAI,KAAK;AAG9C,cAAM,gBAAwC,CAAC;AAC/C,YAAI,MAAM,KAAK;AACb,gBAAM,gBAAgB,MAAM,UAAU,MAAM,MAAM,MAAM;AACxD,gBAAM,eAAe,MAAM,mBAAmB,uBAAuB,aAAa;AAElF,qBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG,GAAG;AACpD,gBAAI,UAAU,UAAa,UAAU,MAAM;AACzC,oBAAM,EAAE,YAAAA,aAAY,MAAM,IAAI,KAAK,qBAAqB,GAAG;AAC3D,4BAAc,KAAK,oBAAoB,GAAG,CAAC,IAAI;AAAA,gBAC7C;AAAA,gBACAA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,WAAW,UAAU,YAAY;AAAA,UACjC,UAAU,MAAM,mBAAmB,uBAAuB,MAAM,MAAM,EAAE;AAAA,UACxE,aAAa,MAAM,MAAM,SAAS;AAAA,UAClC,YAAY,MAAM,MAAM,QAAQ;AAAA,UAChC,YAAY,MAAM,MAAM,QAAQ;AAAA,UAChC,QAAQ,MAAM;AAAA,UACd,eAAe,MAAM,UAAU,QAAQ;AAAA,UACvC,aAAa,MAAM,UAAU,MAAM;AAAA,UACnC,eAAe,MAAM,UAAU,QAAQ;AAAA,UACvC,UAAU,MAAM,YAAY;AAAA,UAC5B,SAAS,MAAM,YAAY;AAAA,UAC3B,eAAe,MAAM,SAAS;AAAA,UAC9B,GAAG;AAAA,UACH,YAAY,MAAM,aAAa;AAAA,UAC/B,YAAY,MAAM,aAAa;AAAA,UAC/B,YAAY,MAAM,cAAc;AAAA,UAChC,UAAU,MAAM,YAAY;AAAA,UAC5B,YAAY,MAAM,aAAa;AAAA,UAC/B,YAAY,MAAM,aAAa;AAAA,UAC/B,UAAU,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,kBAAkB,aAAa,eAAe;AACpD,WAAO,gBAAgB,IAAI,OAAK,EAAE,EAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAA6C;AAEpE,UAAMC,SAAQ;AAAA;AAAA;AAAA;AAAA;AAMd,UAAM,UAAU,MAAM,kBAAkB,YAAYA,QAAO,EAAE,QAAQ,CAAC;AACtE,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,QAAQ,CAAC;AAGvB,UAAM,UAAU,MAAM,mBAAmB,YAAY,MAAM,QAAQ;AACnE,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,iCAAiC,MAAM,QAAQ,EAAE;AAAA,IACnE;AAGA,UAAM,gBAA4B;AAAA,MAChC,IAAI,MAAM;AAAA,MACV,WAAW,IAAI,KAAK,MAAM,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,MACd;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM,gBAAgB;AAAA,QAC9B,MAAM,MAAM;AAAA,QACZ,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,MACd,IAAI;AAAA,MACJ,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,UAAU,KAAK,MAAM,MAAM,YAAY,IAAI;AAAA,MAC3C,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,IACnB;AAGA,UAAM,YAAuB,CAAC;AAC9B,UAAM,aAAa;AAAA,MACjB;AAAA,MAAgB;AAAA,MAAiB;AAAA,MACjC;AAAA,MAAe;AAAA,MAAe;AAAA,MAC9B;AAAA,MAAa;AAAA,MAAqB;AAAA,IACpC;AAEA,eAAW,UAAU,YAAY;AAC/B,UAAI,MAAM,MAAM,GAAG;AACjB,cAAM,SAAS,kBAAkB,MAAM,MAAM,CAAC;AAC9C,YAAI,QAAQ;AACV,gBAAM,SAAS,MAAM,mBAAmB,YAAY,OAAO,YAAY;AACvE,cAAI,QAAQ;AACV,kBAAM,QAAQ,MAAM,KAAK,cAAc,QAAQ,OAAO,YAAY,OAAO,KAAK;AAC9E,gBAAI,UAAU,MAAM;AAClB,wBAAU,KAAK,oBAAoB,MAAM,CAAC,IAAI;AAAA,YAChD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACrC,oBAAc,MAAM;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJA,QACA,QACA,aAAsB,OACC;AACvB,UAAM,UAAU,MAAM,kBAAkB,YAAYA,QAAO,MAAM;AAEjE,QAAI,CAAC,YAAY;AAEf,aAAO,QAAQ,IAAI,YAAU;AAAA,QAC3B,IAAI,MAAM;AAAA,QACV,WAAW,IAAI,KAAK,MAAM,SAAS;AAAA,QACnC,OAAO;AAAA,UACL,IAAI,MAAM;AAAA;AAAA,UACV,OAAO,MAAM;AAAA,UACb,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM;AAAA,QACd;AAAA,QACA,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM,gBAAgB;AAAA,UAC9B,MAAM,MAAM;AAAA,UACZ,IAAI,MAAM;AAAA,UACV,MAAM,MAAM;AAAA,QACd,IAAI;AAAA,QACJ,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,QACf,OAAO,MAAM;AAAA,QACb,UAAU,KAAK,MAAM,MAAM,YAAY,IAAI;AAAA,MAC7C,EAAE;AAAA,IACJ;AAGA,UAAM,gBAAgB,MAAM,QAAQ;AAAA,MAClC,QAAQ,IAAI,OAAK,KAAK,mBAAmB,EAAE,EAAE,CAAC;AAAA,IAChD;AAEA,WAAO,cAAc,OAAO,OAAK,MAAM,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,WACA,SACA,SAMc;AACd,QAAIA,SAAQ;AAAA;AAAA;AAAA;AAAA;AAMZ,UAAM,SAA8B;AAAA,MAClC,WAAW,UAAU,YAAY;AAAA,MACjC,SAAS,QAAQ,YAAY;AAAA,IAC/B;AAEA,QAAI,SAAS,SAAS;AACpB,YAAM,gBAAgB,MAAM,mBAAmB,uBAAuB,QAAQ,OAAO;AACrF,MAAAA,UAAS;AACT,aAAO,UAAU;AAAA,IACnB;AAEA,QAAI,SAAS,cAAc;AACzB,MAAAA,UAAS;AACT,aAAO,eAAe,QAAQ;AAAA,IAChC;AAEA,QAAI,SAAS,YAAY;AACvB,MAAAA,UAAS;AACT,aAAO,aAAa,QAAQ;AAAA,IAC9B;AAEA,IAAAA,UAAS;AAET,UAAM,SAAS,MAAM,KAAK,YAAYA,QAAO,QAAQ,SAAS,cAAc,KAAK;AAGjF,UAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYrB,UAAM,UAAU,MAAM,kBAAkB,YAAY,cAAc,MAAM;AAExE,WAAO;AAAA,MACL,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA,SAAS,QAAQ,CAAC;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,cAA6D;AAExF,UAAM,WAAkE;AAAA,MACtE,aAAa,EAAE,YAAY,SAAS,OAAO,cAAc;AAAA,MACzD,cAAc,EAAE,YAAY,SAAS,OAAO,QAAQ;AAAA,MACpD,cAAc,EAAE,YAAY,SAAS,OAAO,cAAc;AAAA,MAC1D,YAAY,EAAE,YAAY,oBAAoB,OAAO,cAAc;AAAA,MACnE,YAAY,EAAE,YAAY,oBAAoB,OAAO,MAAM;AAAA,MAC3D,YAAY,EAAE,YAAY,oBAAoB,OAAO,sBAAsB;AAAA,MAC3E,WAAW,EAAE,YAAY,mBAAmB,OAAO,YAAY;AAAA,MAC/D,kBAAkB,EAAE,YAAY,mBAAmB,OAAO,gBAAgB;AAAA,MAC1E,aAAa,EAAE,YAAY,mBAAmB,OAAO,cAAc;AAAA,IACrE;AAEA,WAAO,SAAS,YAAY,KAAK,EAAE,YAAY,SAAS,OAAO,aAAa;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,WAA2B;AACrD,UAAM,WAAmC;AAAA,MACvC,aAAa;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AAEA,WAAO,SAAS,SAAS,KAAK,UAAU,QAAQ,YAAY,KAAK,EAAE,YAAY;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,YAA4B;AACtD,UAAM,WAAmC;AAAA,MACvC,cAAc;AAAA,MACd,eAAe;AAAA,MACf,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,MACX,mBAAmB;AAAA,MACnB,aAAa;AAAA,IACf;AAEA,WAAO,SAAS,UAAU,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cACZ,QACAD,aACA,OACc;AACd,QAAI;AACF,YAAM,aAAS,uBAAI,KAAK,IAAIA,aAAY,MAAM;AAC9C,YAAM,WAAW,UAAM,0BAAO,MAAM;AAEpC,UAAI,CAAC,SAAS,OAAO,GAAG;AACtB,eAAO;AAAA,MACT;AAEA,YAAM,OAAO,SAAS,KAAK;AAC3B,aAAO,KAAK,KAAK,KAAK;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkCA,WAAU,IAAI,MAAM,IAAI,KAAK,KAAK,KAAK;AACvF,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGO,IAAM,qBAAqB,mBAAmB,YAAY;;;AI/cjE,IAAAE,iBAAsC;AAI/B,SAAS,cAAc;AAC5B,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAA4B,IAAI;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAA4B,IAAI;AAElE,QAAM,UAAM,4BAAY,OAAO,YAAoD;AACjF,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,QAAQ,MAAM,MAAM,IAAI,OAAO;AACrC,mBAAa,KAAK;AAClB,aAAO;AAAA,IACT,SAAS,KAAU;AACjB,YAAM,aAAyB;AAAA,QAC7B,MAAM,IAAI,QAAQ;AAAA,QAClB,SAAS,IAAI,WAAW;AAAA,QACxB,eAAe;AAAA,MACjB;AACA,eAAS,UAAU;AACnB,YAAM;AAAA,IACR,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAY,4BAAY,OAC5B,QACA,cACA,YACA,aACwB;AACxB,WAAO,IAAI;AAAA,MACT;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,GAAG,CAAC;AAER,QAAM,iBAAa,4BAAY,OAC7B,QACA,UACA,YACwB;AACxB,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,GAAG,CAAC;AAER,QAAM,iBAAa,4BAAY,OAC7B,QACA,UACAC,WACwB;AACxB,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,QACR,OAAOA,OAAM,WAAWA;AAAA,QACxB,WAAWA,OAAM;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,GAAG,CAAC;AAER,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACpFA,IAAAC,iBAAyD;AAUlD,SAAS,eAAe,UAAiC,CAAC,GAAG;AAClE,QAAM,EAAE,QAAQ,QAAQ,IAAI,cAAc,KAAK,IAAI;AACnD,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAuB,CAAC,CAAC;AACrD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AACrD,QAAM,sBAAkB,uBAAY,IAAI;AAExC,QAAM,cAAU,4BAAY,MAAM;AAChC,QAAI,gBAAgB,SAAS;AAC3B;AAAA,IACF;AAEA,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,SAAuB;AAAA,QAC3B;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,oBAAU,UAAQ;AAChB,kBAAM,YAAY,CAAC,OAAO,GAAG,IAAI;AACjC,mBAAO,UAAU,MAAM,GAAG,KAAK;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,QACA,SAAS,CAAC,gBAAgB;AACxB,mBAAS,IAAI,MAAM,YAAY,OAAO,CAAC;AAAA,QACzC;AAAA,QACA,WAAW,MAAM;AACf,uBAAa,IAAI;AACjB,qBAAW,KAAK;AAAA,QAClB;AAAA,QACA,cAAc,MAAM;AAClB,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAEA,sBAAgB,UAAU,MAAM,OAAO,MAAM;AAAA,IAC/C,SAAS,KAAU;AACjB,eAAS,GAAG;AACZ,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,QAAM,iBAAa,4BAAY,MAAM;AACnC,QAAI,gBAAgB,SAAS;AAC3B,sBAAgB,QAAQ,YAAY;AACpC,sBAAgB,UAAU;AAC1B,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,YAAQ,4BAAY,MAAM;AAC9B,QAAI,gBAAgB,SAAS;AAC3B,sBAAgB,QAAQ,MAAM;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,4BAAY,MAAM;AAC/B,QAAI,gBAAgB,SAAS;AAC3B,sBAAgB,QAAQ,OAAO;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,CAAC,cAA4B;AAC5D,QAAI,gBAAgB,SAAS;AAC3B,sBAAgB,QAAQ,aAAa,SAAS;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,YAAQ,4BAAY,MAAM;AAC9B,cAAU,CAAC,CAAC;AAAA,EACd,GAAG,CAAC,CAAC;AAGL,gCAAU,MAAM;AACd,QAAI,aAAa;AACf,cAAQ;AAAA,IACV;AAEA,WAAO,MAAM;AACX,iBAAW;AAAA,IACb;AAAA,EACF,GAAG,CAAC,aAAa,SAAS,UAAU,CAAC;AAErC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3GA,IAAAC,iBAAiD;AAW1C,SAAS,gBAAgB,QAAgB,UAAkC,CAAC,GAAG;AACpF,QAAM,EAAE,QAAQ,cAAc,WAAW,SAAS,WAAW,KAAK,IAAI;AACtE,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAuB,CAAC,CAAC;AACzD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAiC,IAAI;AAC/D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AAErD,QAAM,mBAAe,4BAAY,MAAM;AACrC,UAAM,MAAM,oBAAI,KAAK;AACrB,QAAI;AACJ,QAAI,MAAM,WAAW;AAErB,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,gBAAQ,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAAC;AACjE;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK,KAAK,KAAK,GAAI;AACxD;AAAA,MACF,KAAK;AACH,gBAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI;AACzD;AAAA,MACF,KAAK;AACH,gBAAQ,aAAa,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI;AACtE;AAAA,MACF;AACE,gBAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI;AAAA,IAC7D;AAEA,WAAO,EAAE,OAAO,IAAI;AAAA,EACtB,GAAG,CAAC,OAAO,WAAW,OAAO,CAAC;AAE9B,QAAM,mBAAe,4BAAY,YAAY;AAC3C,QAAI,CAAC,OAAQ;AAEb,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,IAAI,aAAa;AACpC,YAAM,SAAS,MAAM,MAAM,gBAAgB,QAAQ,OAAO,GAAG;AAE7D,kBAAY,MAAM;AAGlB,YAAM,kBAAmC;AAAA,QACvC,OAAO,OAAO;AAAA,QACd,UAAU,CAAC;AAAA,QACX,SAAS,CAAC;AAAA,QACV,YAAY,CAAC;AAAA,QACb,UAAU,CAAC;AAAA,QACX,QAAQ,CAAC;AAAA,QACT,OAAO,CAAC;AAAA,MACV;AAEA,aAAO,QAAQ,WAAS;AAEtB,wBAAgB,SAAS,MAAM,MAAM,KAAK,gBAAgB,SAAS,MAAM,MAAM,KAAK,KAAK;AAGzF,cAAM,WAAW,GAAG,MAAM,MAAM,IAAI,IAAI,MAAM,MAAM,EAAE;AACtD,wBAAgB,QAAQ,QAAQ,KAAK,gBAAgB,QAAQ,QAAQ,KAAK,KAAK;AAG/E,wBAAgB,WAAW,MAAM,SAAS,IAAI,KAAK,gBAAgB,WAAW,MAAM,SAAS,IAAI,KAAK,KAAK;AAG3G,wBAAgB,SAAS,MAAM,MAAM,KAAK,gBAAgB,SAAS,MAAM,MAAM,KAAK,KAAK;AAGzF,cAAM,OAAO,MAAM,UAAU,SAAS;AACtC,wBAAgB,OAAQ,IAAI,KAAK,gBAAgB,OAAQ,IAAI,KAAK,KAAK;AAGvE,cAAM,MAAM,MAAM,UAAU,aAAa;AACzC,wBAAgB,MAAO,GAAG,KAAK,gBAAgB,MAAO,GAAG,KAAK,KAAK;AAAA,MACrE,CAAC;AAED,eAAS,eAAe;AAAA,IAC1B,SAAS,KAAU;AACjB,eAAS,GAAG;AAAA,IACd,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,QAAM,cAAU,4BAAY,MAAM;AAChC,iBAAa;AAAA,EACf,GAAG,CAAC,YAAY,CAAC;AAGjB,gCAAU,MAAM;AACd,QAAI,UAAU;AACZ,mBAAa;AAAA,IACf;AAAA,EACF,GAAG,CAAC,UAAU,YAAY,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACnHA,IAAAC,iBAAsC;AAI/B,SAAS,iBAAiB;AAC/B,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAkC,IAAI;AAClE,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAuB,IAAI;AACrD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAuB,CAAC,CAAC;AACvD,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,CAAC;AAClC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,EAAE;AAE3C,QAAM,aAAS,4BAAY,OAAOC,WAA4B;AAC5D,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,cAA+BA,UAAS;AAAA,QAC5C;AAAA,QACA,YAAY;AAAA,UACV;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,MAAM,MAAM,WAAW;AAClD,gBAAU,YAAY;AAAA,IACxB,SAAS,KAAU;AACjB,eAAS,GAAG;AAAA,IACd,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,QAAQ,CAAC;AAE5B,QAAM,oBAAgB,4BAAY,CAAC,eAAsC;AACvE,eAAW,WAAS,EAAE,GAAG,MAAM,GAAG,WAAW,EAAE;AAC/C,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,MAAM;AACrC,eAAW,CAAC,CAAC;AACb,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW,4BAAY,MAAM;AACjC,QAAI,UAAU,OAAO,SAAS;AAC5B,cAAQ,UAAQ,OAAO,CAAC;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,mBAAe,4BAAY,MAAM;AACrC,QAAI,OAAO,GAAG;AACZ,cAAQ,UAAQ,OAAO,CAAC;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,eAAW,4BAAY,CAAC,eAAuB;AACnD,QAAI,cAAc,GAAG;AACnB,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,4BAAY,CAAC,SAAiB;AACnD,gBAAY,IAAI;AAChB,YAAQ,CAAC;AAAA,EACX,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AClFA,IAAAC,iBAA4B;AA+CrB,SAAS,mBACd,UAAqC,CAAC,GACZ;AAC1B,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,EAAE,kBAAkB,CAAC,GAAG,kBAAkB,KAAK,IAAI;AAEzD,QAAM,eAAoC;AAAA,IACxC,OAAO,QAAQ,eAAe,CAAC,MAAM;AACnC,YAAM,QAAQ,mBAAmB,OAC7B;AAAA,QACE,IAAI,KAAK;AAAA,QACT,OAAO,KAAK,SAAS;AAAA,QACrB,MAAM,KAAK,eAAe;AAAA,QAC1B,MAAM,KAAK,cAAc,QAAQ;AAAA,MACnC,IACA,EAAE,IAAI,YAAY;AAEtB,YAAM,WAAW;AAAA,QACf,GAAG;AAAA,QACH,GAAG,aAAa;AAAA,QAChB,WAAW,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,QACpE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAEA,aAAO,mBAAmB,SAAS;AAAA,QACjC;AAAA,QACA;AAAA,QACA,UAAU,aAAa,eACnB;AAAA,UACE,MAAM,aAAa;AAAA,UACnB,IAAI,aAAa,cAAc;AAAA,UAC/B,MAAM,aAAa;AAAA,QACrB,IACA;AAAA,QACJ,KAAK,aAAa;AAAA,QAClB;AAAA,QACA,UAAU,aAAa;AAAA,QACvB,SAAS,aAAa;AAAA,QACtB,OAAO,aAAa;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,MAAM,iBAAiB,eAAe;AAAA,EACzC;AAEA,QAAMC,oBAAe;AAAA,IACnB,OACE,WACA,YACA,YACG;AACH,aAAO,SAAS,OAAO,UAAU,IAAI;AAAA,QACnC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,UAAU,eAAe,WAAW,SAAS;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,eAAW;AAAA,IACf,OACE,QACA,OACA,iBAKG;AACH,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,YAAM,aAAa,iBAAiB,QAAQ,MAAM,QAAQ;AAE1D,aAAO,SAAS,QAAQ;AAAA,QACtB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,UACR,GAAG,cAAc;AAAA,UACjB;AAAA,UACA,WAAW,iBAAiB,QAAQ,MAAM,OAAO;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,SAAO;AAAA,IACL;AAAA,IACA,cAAAA;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,WAAmB;AACrD,QAAM,EAAE,cAAAA,cAAa,IAAI,mBAAmB;AAE5C,QAAM,uBAAmB;AAAA,IACvB,CAAC,WAAmB,OAAY,aAAgC,WAAW;AAEzE,MAAAA,cAAa,WAAW,YAAY;AAAA,QAClC,CAAC,SAAS,GAAG;AAAA;AAAA,MACf,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,CAAC,WAAWA,aAAY;AAAA,EAC1B;AAEA,QAAM,yBAAqB;AAAA,IACzB,CAAI,eAAuB;AAAA,MACzB,KAAK,CAAC,UAAgB,iBAAiB,WAAW,OAAO,MAAM;AAAA,MAC/D,KAAK,CAAC,UAAgB,iBAAiB,WAAW,OAAO,QAAQ;AAAA,IACnE;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACzKA,IAAAC,gBAAmC;AAU/B,IAAAC,uBAAA;AAFG,SAAS,eAAe,EAAE,SAAS,SAAS,cAAc,GAAwB;AACvF,SACE,+CAAC,uBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,uBAAM,OAAO,GAAG,8BAAgB;AAAA,IACjC,8CAAC,sBAAK,GAAE,UAAS,MAAK,MAAK,0CAA4B;AAAA,KACzD;AAEJ;;;ACfA,IAAAC,gBAAmC;AAU/B,IAAAC,uBAAA;AAFG,SAAS,iBAAiB,EAAE,QAAQ,SAAS,YAAY,GAA0B;AACxF,SACE,+CAAC,uBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,uBAAM,OAAO,GAAG,+BAAiB;AAAA,IAClC,8CAAC,sBAAK,GAAE,UAAS,MAAK,MAAK,2CAA6B;AAAA,KAC1D;AAEJ;;;ACfA,IAAAC,gBAAmC;AAS/B,IAAAC,uBAAA;AAFG,SAAS,kBAAkB,EAAE,MAAM,GAA2B;AACnE,SACE,+CAAC,uBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,uBAAM,OAAO,GAAG,iCAAmB;AAAA,IACpC,8CAAC,sBAAK,GAAE,UAAS,MAAK,MAAK,8CAAgC;AAAA,KAC7D;AAEJ;;;ACdA,IAAAC,gBAAmC;AAQ/B,IAAAC,uBAAA;AAFG,SAAS,eAAe,EAAE,SAAS,GAAwB;AAChE,SACE,+CAAC,uBAAM,QAAO,MAAK,QAAO,MAAK,GAAE,MAC/B;AAAA,kDAAC,uBAAM,OAAO,GAAG,0BAAY;AAAA,IAC7B,8CAAC,sBAAK,GAAE,UAAS,MAAK,MAAK,8CAAgC;AAAA,KAC7D;AAEJ;;;ACdO,IAAM,iBAAN,MAAqB;AAiE5B;AAjEa,eACJ,mBAAoC;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ,CAAC,UAAsB;AACjC;AAJW,eAMJ,gBAAiC;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ,CAAC,UAAsB;AAC7B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,WAAW,MAAM,UAAU,YAAY;AAAA,MACvC,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAfW,eAiBJ,yBAA0C;AAAA,EAC/C,MAAM;AAAA,EACN,QAAQ,CAAC,UAAsB;AAC7B,UAAM,YAAY,EAAE,GAAG,MAAM;AAG7B,cAAU,SAAS,MAAM,OACtB,MAAM,GAAG,EACT,IAAI,UAAQ,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EACxD,KAAK,GAAG;AAEX,WAAO;AAAA,EACT;AACF;AA9BW,eAgCJ,mBAAoC;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ,CAAC,UAAsB;AAC7B,UAAM,YAAY,EAAE,GAAG,MAAM;AAG7B,QAAI,UAAU,MAAM,OAAO;AACzB,YAAM,CAAC,WAAW,MAAM,IAAI,UAAU,MAAM,MAAM,MAAM,GAAG;AAC3D,gBAAU,MAAM,QAAQ,GAAG,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,MAAM;AAAA,IAC/D;AAEA,QAAI,UAAU,SAAS,IAAI;AACzB,YAAM,QAAQ,UAAU,QAAQ,GAAG,MAAM,GAAG;AAC5C,gBAAU,QAAQ,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAAA,IAChD;AAEA,WAAO;AAAA,EACT;AACF;AAlDW,eAoDJ,mBAAmC;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ,CAAC,UAAsB;AAC7B,WAAO;AAAA,MACL,IAAI,MAAM;AAAA,MACV,WAAW,MAAM;AAAA,MACjB,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM,MAAM;AAAA,MACnB,UAAU,GAAG,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,EAAE;AAAA,MACrD,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACF;;;AChEK,IAAM,gBAAN,MAAoB;AAAA,EACzB,aAAa,YAAY,QAAsB,SAAsD;AACnG,UAAM,SAAS,SAAS,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,UAAM,SAAS,OAAO,KAAK,GAAG;AAG9B,UAAM,OAAO,OAAO,IAAI,WAAS;AAC/B,aAAO,OAAO,IAAI,WAAS;AACzB,cAAM,QAAQ,KAAK,eAAe,OAAO,KAAK;AAE9C,YAAI,OAAO,UAAU,aAAa,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,IAAI;AAC7E,iBAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,QACtC;AACA,eAAO,OAAO,SAAS,KAAK;AAAA,MAC9B,CAAC,EAAE,KAAK,GAAG;AAAA,IACb,CAAC;AAED,WAAO,CAAC,QAAQ,GAAG,IAAI,EAAE,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,aAAa,aAAa,QAAsB,SAAsD;AACpG,UAAM,SAAS,SAAS;AAExB,QAAI,QAAQ;AAEV,YAAM,WAAW,OAAO,IAAI,WAAS;AACnC,cAAM,SAAc,CAAC;AACrB,eAAO,QAAQ,WAAS;AACtB,iBAAO,KAAK,IAAI,KAAK,eAAe,OAAO,KAAK;AAAA,QAClD,CAAC;AACD,eAAO;AAAA,MACT,CAAC;AACD,aAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,IACzC;AAEA,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAAA,EAEA,aAAa,OAAO,QAAsB,SAA0C;AAClF,QAAI;AACJ,QAAI;AAEJ,YAAQ,QAAQ,QAAQ;AAAA,MACtB,KAAK;AACH,kBAAU,MAAM,KAAK,YAAY,QAAQ,OAAO;AAChD,mBAAW;AACX;AAAA,MACF,KAAK;AACH,kBAAU,MAAM,KAAK,aAAa,QAAQ,OAAO;AACjD,mBAAW;AACX;AAAA,MACF;AACE,cAAM,IAAI,MAAM,8BAA8B,QAAQ,MAAM,EAAE;AAAA,IAClE;AAEA,WAAO,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,SAAS,CAAC;AAAA,EAC/C;AAAA,EAEA,OAAO,SAAS,MAAY,UAAwB;AAClD,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,WAAW;AACb,aAAS,KAAK,YAAY,CAAC;AAC3B,MAAE,MAAM;AACR,aAAS,KAAK,YAAY,CAAC;AAC3B,QAAI,gBAAgB,GAAG;AAAA,EACzB;AAAA,EAEA,OAAe,eAAe,KAAU,MAAmB;AACzD,WAAO,KAAK,MAAM,GAAG,EAAE,OAAO,CAAC,SAAS,QAAQ,UAAU,GAAG,GAAG,GAAG;AAAA,EACrE;AACF;;;AC3BA,eAAsB,yBAAwC;AAC5D,QAAM,kBAAkB,WAAW;AACrC;AAKA,eAAsB,qBACpB,QACA,SAOiB;AACjB,SAAO,mBAAmB,SAAS;AAAA,IACjC,OAAO;AAAA,MACL,IAAI,SAAS,UAAU;AAAA,IACzB;AAAA,IACA;AAAA,IACA,UAAU,SAAS,eAAe;AAAA,MAChC,MAAM,QAAQ;AAAA,MACd,IAAI,QAAQ,cAAc;AAAA,IAC5B,IAAI;AAAA,IACJ,KAAK,SAAS;AAAA,IACd,UAAU,SAAS;AAAA,EACrB,CAAC;AACH;AAKA,eAAsB,aACpB,QACA,WACA,YACA,SACiB;AACjB,SAAO,mBAAmB,SAAS;AAAA,IACjC,OAAO;AAAA,MACL,IAAI;AAAA,IACN;AAAA,IACA,QAAQ,OAAO,UAAU;AAAA,IACzB,UAAU;AAAA,MACR,MAAM;AAAA,MACN,IAAI;AAAA,IACN;AAAA,IACA,KAAK;AAAA,IACL,UAAU,eAAe,WAAW,SAAS;AAAA,EAC/C,CAAC;AACH;AAKA,eAAsB,8BACpB,WACA,SACA,SAKc;AACd,SAAO,mBAAmB,oBAAoB,WAAW,SAAS,OAAO;AAC3E;","names":["notifications","firebaseSignOut","import_react","sendPasswordResetEmail","sendPasswordResetEmail","import_react","import_react","import_react","import_jsx_runtime","import_react","import_core","import_form","import_icons_react","import_navigation","import_jsx_runtime","import_react","import_core","import_icons_react","import_navigation","import_jsx_runtime","React","import_react","import_core","import_icons_react","import_form","import_jsx_runtime","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_navigation","import_react","import_react","import_react","import_core","import_icons_react","import_jsx_runtime","import_core","import_jsx_runtime","import_core","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","notifications","import_react","notifications","import_react","import_react","notifications","query","import_core","import_icons_react","import_core","import_icons_react","import_jsx_runtime","import_jsx_runtime","notifications","import_core","import_jsx_runtime","import_core","import_jsx_runtime","import_react","import_jsx_runtime","notifications","audit","query","import_crypto","query","import_firestore","import_app","collection","mapping","doc","import_firestore","import_app","collection","query","import_react","error","import_react","import_react","import_react","query","import_react","logPHIAccess","import_core","import_jsx_runtime","import_core","import_jsx_runtime","import_core","import_jsx_runtime","import_core","import_jsx_runtime"]}