{"version":3,"file":"budget-enforcer.mjs","sources":["../../../../src/lib/performance/monitoring/budget-enforcer.ts"],"sourcesContent":["/**\n * @file Performance Budget Enforcer\n * @description Strict performance budget enforcement with configurable alerts,\n * automatic degradation strategies, and compliance reporting.\n *\n * Features:\n * - Multiple budget categories (vitals, bundle, runtime)\n * - Real-time enforcement\n * - Automatic degradation strategies\n * - Compliance reporting\n * - Alert management\n * - Integration with feature flags\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Budget category\n */\nexport type BudgetCategory = 'vitals' | 'bundle' | 'runtime' | 'network' | 'memory' | 'custom';\n\n/**\n * Budget severity level\n */\nexport type BudgetSeverity = 'info' | 'warning' | 'error' | 'critical';\n\n/**\n * Budget enforcement mode\n */\nexport type EnforcementMode = 'monitor' | 'warn' | 'enforce' | 'strict';\n\n/**\n * Degradation action type\n */\nexport type DegradationAction =\n  | 'disable-animations'\n  | 'reduce-image-quality'\n  | 'disable-prefetch'\n  | 'reduce-polling'\n  | 'disable-feature'\n  | 'fallback-ui'\n  | 'custom';\n\n/**\n * Individual budget definition\n */\nexport interface BudgetDefinition {\n  /** Budget name/identifier */\n  name: string;\n  /** Budget category */\n  category: BudgetCategory;\n  /** Warning threshold */\n  warningThreshold: number;\n  /** Error threshold */\n  errorThreshold: number;\n  /** Critical threshold (triggers immediate action) */\n  criticalThreshold?: number;\n  /** Unit for display */\n  unit: string;\n  /** Whether lower is better (default: true for performance metrics) */\n  lowerIsBetter?: boolean;\n  /** Degradation actions when threshold exceeded */\n  degradationActions?: DegradationAction[];\n  /** Feature flag to disable when exceeded */\n  featureFlagToDisable?: string;\n  /** Custom enforcement logic */\n  enforcer?: (value: number, budget: BudgetDefinition) => EnforcementResult;\n  /** Description */\n  description?: string;\n}\n\n/**\n * Enforcement result\n */\nexport interface EnforcementResult {\n  /** Is the budget compliant */\n  compliant: boolean;\n  /** Current severity level */\n  severity: BudgetSeverity;\n  /** Current value */\n  value: number;\n  /** Exceeded threshold */\n  threshold: number;\n  /** Overage amount */\n  overage: number;\n  /** Overage percentage */\n  overagePercent: number;\n  /** Actions triggered */\n  actionsTriggered: DegradationAction[];\n  /** Timestamp */\n  timestamp: number;\n  /** Additional message */\n  message?: string;\n}\n\n/**\n * Budget violation event\n */\nexport interface BudgetViolation {\n  /** Unique violation ID */\n  id: string;\n  /** Budget definition */\n  budget: BudgetDefinition;\n  /** Enforcement result */\n  result: EnforcementResult;\n  /** URL where violation occurred */\n  url: string;\n  /** Number of consecutive violations */\n  consecutiveViolations: number;\n  /** First violation timestamp */\n  firstViolationAt: number;\n  /** Last violation timestamp */\n  lastViolationAt: number;\n}\n\n/**\n * Compliance report for a single budget\n */\nexport interface BudgetComplianceReport {\n  /** Budget name */\n  name: string;\n  /** Category */\n  category: BudgetCategory;\n  /** Is currently compliant */\n  isCompliant: boolean;\n  /** Current value */\n  currentValue: number;\n  /** Warning threshold */\n  warningThreshold: number;\n  /** Error threshold */\n  errorThreshold: number;\n  /** Current utilization percentage */\n  utilizationPercent: number;\n  /** Headroom before warning */\n  headroom: number;\n  /** Samples analyzed */\n  samples: number;\n  /** Average value */\n  average: number;\n  /** Peak value */\n  peak: number;\n  /** Compliance rate (percentage of time compliant) */\n  complianceRate: number;\n  /** Active degradation actions */\n  activeDegradations: DegradationAction[];\n}\n\n/**\n * Full compliance report\n */\nexport interface ComplianceReport {\n  /** Report ID */\n  id: string;\n  /** Report timestamp */\n  timestamp: number;\n  /** Report period start */\n  periodStart: number;\n  /** Report period end */\n  periodEnd: number;\n  /** Overall compliance status */\n  overallCompliant: boolean;\n  /** Overall compliance score (0-100) */\n  complianceScore: number;\n  /** Individual budget reports */\n  budgets: BudgetComplianceReport[];\n  /** Active violations */\n  activeViolations: BudgetViolation[];\n  /** Recommendations */\n  recommendations: string[];\n}\n\n/**\n * Budget enforcer configuration\n */\nexport interface BudgetEnforcerConfig {\n  /** Enable enforcement */\n  enabled: boolean;\n  /** Enforcement mode */\n  mode: EnforcementMode;\n  /** Budget definitions */\n  budgets: BudgetDefinition[];\n  /** Grace period before enforcement (ms) */\n  gracePeriod: number;\n  /** Consecutive violations required */\n  violationThreshold: number;\n  /** Alert cooldown period (ms) */\n  alertCooldown: number;\n  /** Enable automatic degradation */\n  autoDegradation: boolean;\n  /** Callback for violations */\n  onViolation?: (violation: BudgetViolation) => void;\n  /** Callback for compliance restoration */\n  onCompliance?: (budget: BudgetDefinition) => void;\n  /** Callback for degradation activation */\n  onDegradation?: (action: DegradationAction, budget: BudgetDefinition) => void;\n  /** Custom degradation handlers */\n  degradationHandlers?: Partial<Record<DegradationAction, () => void | Promise<void>>>;\n  /** Debug mode */\n  debug: boolean;\n}\n\n/**\n * Sample record for tracking\n */\ninterface BudgetSample {\n  value: number;\n  timestamp: number;\n  compliant: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default Core Web Vitals budgets\n */\nexport const DEFAULT_VITALS_BUDGETS: BudgetDefinition[] = [\n  {\n    name: 'LCP',\n    category: 'vitals',\n    warningThreshold: 2500,\n    errorThreshold: 4000,\n    criticalThreshold: 6000,\n    unit: 'ms',\n    description: 'Largest Contentful Paint',\n    degradationActions: ['disable-animations', 'reduce-image-quality'],\n  },\n  {\n    name: 'INP',\n    category: 'vitals',\n    warningThreshold: 200,\n    errorThreshold: 500,\n    criticalThreshold: 1000,\n    unit: 'ms',\n    description: 'Interaction to Next Paint',\n    degradationActions: ['disable-animations', 'reduce-polling'],\n  },\n  {\n    name: 'CLS',\n    category: 'vitals',\n    warningThreshold: 0.1,\n    errorThreshold: 0.25,\n    criticalThreshold: 0.5,\n    unit: '',\n    description: 'Cumulative Layout Shift',\n  },\n  {\n    name: 'FCP',\n    category: 'vitals',\n    warningThreshold: 1800,\n    errorThreshold: 3000,\n    criticalThreshold: 5000,\n    unit: 'ms',\n    description: 'First Contentful Paint',\n  },\n  {\n    name: 'TTFB',\n    category: 'vitals',\n    warningThreshold: 800,\n    errorThreshold: 1800,\n    criticalThreshold: 3000,\n    unit: 'ms',\n    description: 'Time to First Byte',\n  },\n];\n\n/**\n * Default bundle budgets\n */\nexport const DEFAULT_BUNDLE_BUDGETS: BudgetDefinition[] = [\n  {\n    name: 'total-bundle',\n    category: 'bundle',\n    warningThreshold: 300 * 1024, // 300KB\n    errorThreshold: 500 * 1024, // 500KB\n    criticalThreshold: 1024 * 1024, // 1MB\n    unit: 'bytes',\n    description: 'Total JavaScript bundle size',\n    degradationActions: ['disable-feature'],\n  },\n  {\n    name: 'initial-bundle',\n    category: 'bundle',\n    warningThreshold: 150 * 1024, // 150KB\n    errorThreshold: 250 * 1024, // 250KB\n    criticalThreshold: 400 * 1024, // 400KB\n    unit: 'bytes',\n    description: 'Initial JavaScript bundle size',\n  },\n  {\n    name: 'css-bundle',\n    category: 'bundle',\n    warningThreshold: 50 * 1024, // 50KB\n    errorThreshold: 100 * 1024, // 100KB\n    criticalThreshold: 200 * 1024, // 200KB\n    unit: 'bytes',\n    description: 'Total CSS bundle size',\n  },\n];\n\n/**\n * Default runtime budgets\n */\nexport const DEFAULT_RUNTIME_BUDGETS: BudgetDefinition[] = [\n  {\n    name: 'long-tasks',\n    category: 'runtime',\n    warningThreshold: 50,\n    errorThreshold: 100,\n    criticalThreshold: 200,\n    unit: 'ms',\n    description: 'Maximum long task duration',\n    degradationActions: ['disable-animations'],\n  },\n  {\n    name: 'frame-rate',\n    category: 'runtime',\n    warningThreshold: 55,\n    errorThreshold: 45,\n    criticalThreshold: 30,\n    unit: 'fps',\n    lowerIsBetter: false, // Higher FPS is better\n    description: 'Target frame rate',\n    degradationActions: ['disable-animations'],\n  },\n  {\n    name: 'memory-usage',\n    category: 'memory',\n    warningThreshold: 50 * 1024 * 1024, // 50MB\n    errorThreshold: 100 * 1024 * 1024, // 100MB\n    criticalThreshold: 200 * 1024 * 1024, // 200MB\n    unit: 'bytes',\n    description: 'JavaScript heap usage',\n    degradationActions: ['disable-prefetch'],\n  },\n];\n\nconst DEFAULT_CONFIG: BudgetEnforcerConfig = {\n  enabled: true,\n  mode: 'warn',\n  budgets: [...DEFAULT_VITALS_BUDGETS, ...DEFAULT_BUNDLE_BUDGETS, ...DEFAULT_RUNTIME_BUDGETS],\n  gracePeriod: 5000,\n  violationThreshold: 3,\n  alertCooldown: 60000,\n  autoDegradation: true,\n  debug: false,\n};\n\n// ============================================================================\n// Budget Enforcer Class\n// ============================================================================\n\n/**\n * Performance budget enforcement manager\n */\nexport class BudgetEnforcer {\n  private config: BudgetEnforcerConfig;\n  private budgetMap: Map<string, BudgetDefinition> = new Map();\n  private samples: Map<string, BudgetSample[]> = new Map();\n  private violations: Map<string, BudgetViolation> = new Map();\n  private activeDegradations: Set<DegradationAction> = new Set();\n  private lastAlertTimes: Map<string, number> = new Map();\n  private consecutiveCounts: Map<string, number> = new Map();\n  private startTime: number = Date.now();\n  private idCounter = 0;\n\n  constructor(config: Partial<BudgetEnforcerConfig> = {}) {\n    this.config = { ...DEFAULT_CONFIG, ...config };\n    this.initializeBudgets();\n  }\n\n  /**\n   * Check a value against a budget\n   */\n  check(budgetName: string, value: number): EnforcementResult {\n    const budget = this.budgetMap.get(budgetName);\n    if (!budget) {\n      return this.createPassingResult(value);\n    }\n\n    // Use custom enforcer if provided\n    if (budget.enforcer) {\n      return budget.enforcer(value, budget);\n    }\n\n    // Standard enforcement\n    return this.enforce(budget, value);\n  }\n\n  /**\n   * Record a metric value for a budget\n   */\n  record(budgetName: string, value: number): EnforcementResult {\n    const result = this.check(budgetName, value);\n    const budget = this.budgetMap.get(budgetName);\n\n    if (!budget) return result;\n\n    // Store sample\n    this.recordSample(budgetName, value, result.compliant);\n\n    // Handle violation\n    if (!result.compliant) {\n      this.handleViolation(budget, result);\n    } else {\n      this.handleCompliance(budget);\n    }\n\n    return result;\n  }\n\n  /**\n   * Add or update a budget definition\n   */\n  addBudget(budget: BudgetDefinition): void {\n    this.budgetMap.set(budget.name, budget);\n    this.config.budgets = Array.from(this.budgetMap.values());\n  }\n\n  /**\n   * Remove a budget\n   */\n  removeBudget(budgetName: string): void {\n    this.budgetMap.delete(budgetName);\n    this.samples.delete(budgetName);\n    this.violations.delete(budgetName);\n    this.consecutiveCounts.delete(budgetName);\n  }\n\n  /**\n   * Get current compliance report\n   */\n  getComplianceReport(): ComplianceReport {\n    const now = Date.now();\n    const budgetReports: BudgetComplianceReport[] = [];\n    let compliantCount = 0;\n\n    for (const [name, budget] of this.budgetMap) {\n      const report = this.getBudgetComplianceReport(name, budget);\n      budgetReports.push(report);\n      if (report.isCompliant) compliantCount++;\n    }\n\n    const activeViolations = Array.from(this.violations.values());\n    const overallCompliant = activeViolations.length === 0;\n    const complianceScore =\n      this.budgetMap.size > 0 ? Math.round((compliantCount / this.budgetMap.size) * 100) : 100;\n\n    return {\n      id: this.generateId(),\n      timestamp: now,\n      periodStart: this.startTime,\n      periodEnd: now,\n      overallCompliant,\n      complianceScore,\n      budgets: budgetReports,\n      activeViolations,\n      recommendations: this.generateRecommendations(budgetReports),\n    };\n  }\n\n  /**\n   * Get active violations\n   */\n  getActiveViolations(): BudgetViolation[] {\n    return Array.from(this.violations.values());\n  }\n\n  /**\n   * Get active degradations\n   */\n  getActiveDegradations(): DegradationAction[] {\n    return Array.from(this.activeDegradations);\n  }\n\n  /**\n   * Check if a specific degradation is active\n   */\n  isDegraded(action: DegradationAction): boolean {\n    return this.activeDegradations.has(action);\n  }\n\n  /**\n   * Manually activate a degradation\n   */\n  activateDegradation(action: DegradationAction): void {\n    if (!this.activeDegradations.has(action)) {\n      this.activeDegradations.add(action);\n      this.executeDegradation(action);\n      this.log(`Manually activated degradation: ${action}`);\n    }\n  }\n\n  /**\n   * Manually deactivate a degradation\n   */\n  deactivateDegradation(action: DegradationAction): void {\n    this.activeDegradations.delete(action);\n    this.log(`Deactivated degradation: ${action}`);\n  }\n\n  /**\n   * Reset all degradations\n   */\n  resetDegradations(): void {\n    this.activeDegradations.clear();\n    this.log('All degradations reset');\n  }\n\n  /**\n   * Clear violation for a budget\n   */\n  clearViolation(budgetName: string): void {\n    this.violations.delete(budgetName);\n    this.consecutiveCounts.delete(budgetName);\n  }\n\n  /**\n   * Reset all state\n   */\n  reset(): void {\n    this.samples.clear();\n    this.violations.clear();\n    this.activeDegradations.clear();\n    this.lastAlertTimes.clear();\n    this.consecutiveCounts.clear();\n    this.startTime = Date.now();\n  }\n\n  /**\n   * Get budget definition\n   */\n  getBudget(name: string): BudgetDefinition | undefined {\n    return this.budgetMap.get(name);\n  }\n\n  /**\n   * Get all budgets\n   */\n  getAllBudgets(): BudgetDefinition[] {\n    return Array.from(this.budgetMap.values());\n  }\n\n  /**\n   * Get budgets by category\n   */\n  getBudgetsByCategory(category: BudgetCategory): BudgetDefinition[] {\n    return Array.from(this.budgetMap.values()).filter((b) => b.category === category);\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private initializeBudgets(): void {\n    for (const budget of this.config.budgets) {\n      this.budgetMap.set(budget.name, budget);\n    }\n  }\n\n  private enforce(budget: BudgetDefinition, value: number): EnforcementResult {\n    const lowerIsBetter = budget.lowerIsBetter !== false;\n    const actionsTriggered: DegradationAction[] = [];\n\n    let severity: BudgetSeverity = 'info';\n    let threshold = 0;\n    let compliant = true;\n\n    // Determine severity based on thresholds\n    if (lowerIsBetter) {\n      if (\n        budget.criticalThreshold !== null &&\n        budget.criticalThreshold !== undefined &&\n        value > budget.criticalThreshold\n      ) {\n        severity = 'critical';\n        threshold = budget.criticalThreshold;\n        compliant = false;\n      } else if (value > budget.errorThreshold) {\n        severity = 'error';\n        threshold = budget.errorThreshold;\n        compliant = false;\n      } else if (value > budget.warningThreshold) {\n        severity = 'warning';\n        threshold = budget.warningThreshold;\n        // Warning is still compliant but needs attention\n      }\n    } else {\n      // Higher is better (e.g., frame rate)\n      if (\n        budget.criticalThreshold !== null &&\n        budget.criticalThreshold !== undefined &&\n        value < budget.criticalThreshold\n      ) {\n        severity = 'critical';\n        threshold = budget.criticalThreshold;\n        compliant = false;\n      } else if (value < budget.errorThreshold) {\n        severity = 'error';\n        threshold = budget.errorThreshold;\n        compliant = false;\n      } else if (value < budget.warningThreshold) {\n        severity = 'warning';\n        threshold = budget.warningThreshold;\n      }\n    }\n\n    // Calculate overage\n    const overage = lowerIsBetter\n      ? Math.max(0, value - budget.errorThreshold)\n      : Math.max(0, budget.errorThreshold - value);\n    const overagePercent =\n      budget.errorThreshold !== 0 ? (overage / budget.errorThreshold) * 100 : 0;\n\n    // Determine degradation actions\n    if (!compliant && this.config.autoDegradation && budget.degradationActions) {\n      actionsTriggered.push(...budget.degradationActions);\n    }\n\n    return {\n      compliant,\n      severity,\n      value,\n      threshold: threshold || budget.errorThreshold,\n      overage,\n      overagePercent,\n      actionsTriggered,\n      timestamp: Date.now(),\n      message: this.generateMessage(budget, value, severity),\n    };\n  }\n\n  private recordSample(budgetName: string, value: number, compliant: boolean): void {\n    if (!this.samples.has(budgetName)) {\n      this.samples.set(budgetName, []);\n    }\n\n    const samples = this.samples.get(budgetName);\n    if (!samples) return;\n    samples.push({\n      value,\n      timestamp: Date.now(),\n      compliant,\n    });\n\n    // Keep last 100 samples\n    if (samples.length > 100) {\n      samples.shift();\n    }\n  }\n\n  private handleViolation(budget: BudgetDefinition, result: EnforcementResult): void {\n    const count = (this.consecutiveCounts.get(budget.name) ?? 0) + 1;\n    this.consecutiveCounts.set(budget.name, count);\n\n    // Check if we should create/update violation\n    if (count >= this.config.violationThreshold) {\n      const now = Date.now();\n      const existing = this.violations.get(budget.name);\n\n      const violation: BudgetViolation = {\n        id: existing?.id ?? this.generateId(),\n        budget,\n        result,\n        url: typeof window !== 'undefined' ? window.location.href : '',\n        consecutiveViolations: count,\n        firstViolationAt: existing?.firstViolationAt ?? now,\n        lastViolationAt: now,\n      };\n\n      this.violations.set(budget.name, violation);\n\n      // Check alert cooldown\n      const lastAlert = this.lastAlertTimes.get(budget.name) ?? 0;\n      if (now - lastAlert > this.config.alertCooldown) {\n        this.lastAlertTimes.set(budget.name, now);\n        this.config.onViolation?.(violation);\n        this.log(\n          `Budget violation: ${budget.name} = ${result.value} (threshold: ${result.threshold})`\n        );\n      }\n\n      // Execute degradations if in enforce mode\n      if (this.config.mode === 'enforce' || this.config.mode === 'strict') {\n        for (const action of result.actionsTriggered) {\n          if (!this.activeDegradations.has(action)) {\n            this.activeDegradations.add(action);\n            this.executeDegradation(action, budget);\n          }\n        }\n      }\n    }\n  }\n\n  private handleCompliance(budget: BudgetDefinition): void {\n    const previousCount = this.consecutiveCounts.get(budget.name) ?? 0;\n    this.consecutiveCounts.set(budget.name, 0);\n\n    // Clear violation if it existed\n    if (this.violations.has(budget.name)) {\n      this.violations.delete(budget.name);\n      this.config.onCompliance?.(budget);\n      this.log(`Budget compliance restored: ${budget.name}`);\n    }\n\n    // Consider deactivating degradations if all related budgets are compliant\n    if (previousCount >= this.config.violationThreshold && budget.degradationActions) {\n      for (const action of budget.degradationActions) {\n        // Check if any other budget still needs this degradation\n        let stillNeeded = false;\n        for (const [, violation] of this.violations) {\n          if (violation.result.actionsTriggered.includes(action)) {\n            stillNeeded = true;\n            break;\n          }\n        }\n        if (!stillNeeded) {\n          this.activeDegradations.delete(action);\n        }\n      }\n    }\n  }\n\n  private executeDegradation(action: DegradationAction, budget?: BudgetDefinition): void {\n    const handler = this.config.degradationHandlers?.[action];\n    if (handler) {\n      void handler();\n    }\n\n    if (budget) {\n      this.config.onDegradation?.(action, budget);\n    }\n\n    this.log(`Executing degradation: ${action}`);\n  }\n\n  private getBudgetComplianceReport(\n    name: string,\n    budget: BudgetDefinition\n  ): BudgetComplianceReport {\n    const samples = this.samples.get(name) ?? [];\n    const violation = this.violations.get(name);\n\n    const values = samples.map((s) => s.value);\n    const compliantSamples = samples.filter((s) => s.compliant);\n    const currentValue = values.length > 0 ? values[values.length - 1] : 0;\n    const average = values.length > 0 ? values.reduce((sum, v) => sum + v, 0) / values.length : 0;\n    const peak = values.length > 0 ? Math.max(...values) : 0;\n    const complianceRate =\n      samples.length > 0 ? (compliantSamples.length / samples.length) * 100 : 100;\n\n    const lowerIsBetter = budget.lowerIsBetter !== false;\n    const safeCurrentValue = currentValue ?? 0;\n    const utilizationPercent = lowerIsBetter\n      ? (safeCurrentValue / budget.errorThreshold) * 100\n      : (budget.errorThreshold / safeCurrentValue) * 100;\n    const headroom = lowerIsBetter\n      ? budget.warningThreshold - safeCurrentValue\n      : safeCurrentValue - budget.warningThreshold;\n\n    return {\n      name,\n      category: budget.category,\n      isCompliant: !violation,\n      currentValue: safeCurrentValue,\n      warningThreshold: budget.warningThreshold,\n      errorThreshold: budget.errorThreshold,\n      utilizationPercent: Math.min(utilizationPercent, 200),\n      headroom: Math.max(headroom, 0),\n      samples: samples.length,\n      average,\n      peak,\n      complianceRate,\n      activeDegradations: violation?.result.actionsTriggered ?? [],\n    };\n  }\n\n  private generateRecommendations(reports: BudgetComplianceReport[]): string[] {\n    const recommendations: string[] = [];\n\n    for (const report of reports) {\n      if (!report.isCompliant) {\n        switch (report.category) {\n          case 'vitals':\n            if (report.name === 'LCP') {\n              recommendations.push(\n                'Optimize LCP by preloading critical resources and using responsive images'\n              );\n            } else if (report.name === 'CLS') {\n              recommendations.push(\n                'Reduce CLS by setting explicit dimensions on images and avoiding dynamic content insertion'\n              );\n            } else if (report.name === 'INP') {\n              recommendations.push(\n                'Improve INP by breaking up long tasks and optimizing event handlers'\n              );\n            }\n            break;\n          case 'bundle':\n            recommendations.push(`Consider code splitting to reduce ${report.name}`);\n            recommendations.push('Review and remove unused dependencies');\n            break;\n          case 'runtime':\n            recommendations.push('Profile and optimize expensive computations');\n            recommendations.push('Consider using Web Workers for heavy processing');\n            break;\n          case 'memory':\n            recommendations.push('Review for memory leaks and unnecessary caching');\n            recommendations.push('Consider implementing data virtualization');\n            break;\n        }\n      } else if (report.utilizationPercent > 80) {\n        recommendations.push(\n          `${report.name} is at ${report.utilizationPercent.toFixed(0)}% of budget - consider optimization before it exceeds threshold`\n        );\n      }\n    }\n\n    return [...new Set(recommendations)]; // Remove duplicates\n  }\n\n  private generateMessage(\n    budget: BudgetDefinition,\n    value: number,\n    severity: BudgetSeverity\n  ): string {\n    const formattedValue = this.formatValue(value, budget.unit);\n    const formattedThreshold = this.formatValue(budget.errorThreshold, budget.unit);\n\n    switch (severity) {\n      case 'critical':\n        return `CRITICAL: ${budget.name} is ${formattedValue} (critical threshold: ${this.formatValue(budget.criticalThreshold ?? budget.errorThreshold, budget.unit)})`;\n      case 'error':\n        return `ERROR: ${budget.name} exceeds budget at ${formattedValue} (limit: ${formattedThreshold})`;\n      case 'warning':\n        return `WARNING: ${budget.name} is ${formattedValue} (approaching limit: ${formattedThreshold})`;\n      default:\n        return `${budget.name}: ${formattedValue}`;\n    }\n  }\n\n  private formatValue(value: number, unit: string): string {\n    if (unit === 'bytes') {\n      if (value >= 1024 * 1024) {\n        return `${(value / (1024 * 1024)).toFixed(1)}MB`;\n      } else if (value >= 1024) {\n        return `${(value / 1024).toFixed(1)}KB`;\n      }\n      return `${value}B`;\n    }\n    return unit ? `${value}${unit}` : `${value}`;\n  }\n\n  private createPassingResult(value: number): EnforcementResult {\n    return {\n      compliant: true,\n      severity: 'info',\n      value,\n      threshold: 0,\n      overage: 0,\n      overagePercent: 0,\n      actionsTriggered: [],\n      timestamp: Date.now(),\n    };\n  }\n\n  private generateId(): string {\n    return `budget-${Date.now()}-${++this.idCounter}`;\n  }\n\n  private log(message: string, ...args: unknown[]): void {\n    if (this.config.debug) {\n      console.info(`[BudgetEnforcer] ${message}`, ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet enforcerInstance: BudgetEnforcer | null = null;\n\n/**\n * Get or create the global budget enforcer\n */\nexport function getBudgetEnforcer(config?: Partial<BudgetEnforcerConfig>): BudgetEnforcer {\n  enforcerInstance ??= new BudgetEnforcer(config);\n  return enforcerInstance;\n}\n\n/**\n * Reset the enforcer instance\n */\nexport function resetBudgetEnforcer(): void {\n  enforcerInstance?.reset();\n  enforcerInstance = null;\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Check a metric against its budget\n */\nexport function checkBudget(budgetName: string, value: number): EnforcementResult {\n  return getBudgetEnforcer().check(budgetName, value);\n}\n\n/**\n * Record and enforce a metric value\n */\nexport function enforceBudget(budgetName: string, value: number): EnforcementResult {\n  return getBudgetEnforcer().record(budgetName, value);\n}\n\n/**\n * Get current compliance report\n */\nexport function getComplianceReport(): ComplianceReport {\n  return getBudgetEnforcer().getComplianceReport();\n}\n\n/**\n * Check if any degradation is currently active\n */\nexport function isPerformanceDegraded(): boolean {\n  return getBudgetEnforcer().getActiveDegradations().length > 0;\n}\n\n/**\n * Check if a specific degradation action is active\n */\nexport function isDegradationActive(action: DegradationAction): boolean {\n  return getBudgetEnforcer().isDegraded(action);\n}\n"],"names":["DEFAULT_VITALS_BUDGETS","DEFAULT_BUNDLE_BUDGETS","DEFAULT_RUNTIME_BUDGETS","DEFAULT_CONFIG","BudgetEnforcer","config","budgetName","value","budget","result","now","budgetReports","compliantCount","name","report","activeViolations","overallCompliant","complianceScore","action","category","b","lowerIsBetter","actionsTriggered","severity","threshold","compliant","overage","overagePercent","samples","count","existing","violation","lastAlert","previousCount","stillNeeded","handler","values","s","compliantSamples","currentValue","average","sum","peak","complianceRate","safeCurrentValue","utilizationPercent","headroom","reports","recommendations","formattedValue","formattedThreshold","unit","message","args","enforcerInstance","getBudgetEnforcer","resetBudgetEnforcer","checkBudget","enforceBudget","getComplianceReport","isPerformanceDegraded","isDegradationActive"],"mappings":"AA2NO,MAAMA,IAA6C;AAAA,EACxD;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,oBAAoB,CAAC,sBAAsB,sBAAsB;AAAA,EAAA;AAAA,EAEnE;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,oBAAoB,CAAC,sBAAsB,gBAAgB;AAAA,EAAA;AAAA,EAE7D;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAEjB,GAKaC,IAA6C;AAAA,EACxD;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB,MAAM;AAAA;AAAA,IACxB,gBAAgB,MAAM;AAAA;AAAA,IACtB,mBAAmB,OAAO;AAAA;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,oBAAoB,CAAC,iBAAiB;AAAA,EAAA;AAAA,EAExC;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB,MAAM;AAAA;AAAA,IACxB,gBAAgB,MAAM;AAAA;AAAA,IACtB,mBAAmB,MAAM;AAAA;AAAA,IACzB,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB,KAAK;AAAA;AAAA,IACvB,gBAAgB,MAAM;AAAA;AAAA,IACtB,mBAAmB,MAAM;AAAA;AAAA,IACzB,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAEjB,GAKaC,IAA8C;AAAA,EACzD;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,oBAAoB,CAAC,oBAAoB;AAAA,EAAA;AAAA,EAE3C;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,MAAM;AAAA,IACN,eAAe;AAAA;AAAA,IACf,aAAa;AAAA,IACb,oBAAoB,CAAC,oBAAoB;AAAA,EAAA;AAAA,EAE3C;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,kBAAkB,KAAK,OAAO;AAAA;AAAA,IAC9B,gBAAgB,MAAM,OAAO;AAAA;AAAA,IAC7B,mBAAmB,MAAM,OAAO;AAAA;AAAA,IAChC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,oBAAoB,CAAC,kBAAkB;AAAA,EAAA;AAE3C,GAEMC,IAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS,CAAC,GAAGH,GAAwB,GAAGC,GAAwB,GAAGC,CAAuB;AAAA,EAC1F,aAAa;AAAA,EACb,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,OAAO;AACT;AASO,MAAME,EAAe;AAAA,EAClB;AAAA,EACA,gCAA+C,IAAA;AAAA,EAC/C,8BAA2C,IAAA;AAAA,EAC3C,iCAA+C,IAAA;AAAA,EAC/C,yCAAiD,IAAA;AAAA,EACjD,qCAA0C,IAAA;AAAA,EAC1C,wCAA6C,IAAA;AAAA,EAC7C,YAAoB,KAAK,IAAA;AAAA,EACzB,YAAY;AAAA,EAEpB,YAAYC,IAAwC,IAAI;AACtD,SAAK,SAAS,EAAE,GAAGF,GAAgB,GAAGE,EAAA,GACtC,KAAK,kBAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMC,GAAoBC,GAAkC;AAC1D,UAAMC,IAAS,KAAK,UAAU,IAAIF,CAAU;AAC5C,WAAKE,IAKDA,EAAO,WACFA,EAAO,SAASD,GAAOC,CAAM,IAI/B,KAAK,QAAQA,GAAQD,CAAK,IATxB,KAAK,oBAAoBA,CAAK;AAAA,EAUzC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOD,GAAoBC,GAAkC;AAC3D,UAAME,IAAS,KAAK,MAAMH,GAAYC,CAAK,GACrCC,IAAS,KAAK,UAAU,IAAIF,CAAU;AAE5C,WAAKE,MAGL,KAAK,aAAaF,GAAYC,GAAOE,EAAO,SAAS,GAGhDA,EAAO,YAGV,KAAK,iBAAiBD,CAAM,IAF5B,KAAK,gBAAgBA,GAAQC,CAAM,IAK9BA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUD,GAAgC;AACxC,SAAK,UAAU,IAAIA,EAAO,MAAMA,CAAM,GACtC,KAAK,OAAO,UAAU,MAAM,KAAK,KAAK,UAAU,QAAQ;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,aAAaF,GAA0B;AACrC,SAAK,UAAU,OAAOA,CAAU,GAChC,KAAK,QAAQ,OAAOA,CAAU,GAC9B,KAAK,WAAW,OAAOA,CAAU,GACjC,KAAK,kBAAkB,OAAOA,CAAU;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAwC;AACtC,UAAMI,IAAM,KAAK,IAAA,GACXC,IAA0C,CAAA;AAChD,QAAIC,IAAiB;AAErB,eAAW,CAACC,GAAML,CAAM,KAAK,KAAK,WAAW;AAC3C,YAAMM,IAAS,KAAK,0BAA0BD,GAAML,CAAM;AAC1D,MAAAG,EAAc,KAAKG,CAAM,GACrBA,EAAO,eAAaF;AAAA,IAC1B;AAEA,UAAMG,IAAmB,MAAM,KAAK,KAAK,WAAW,QAAQ,GACtDC,IAAmBD,EAAiB,WAAW,GAC/CE,IACJ,KAAK,UAAU,OAAO,IAAI,KAAK,MAAOL,IAAiB,KAAK,UAAU,OAAQ,GAAG,IAAI;AAEvF,WAAO;AAAA,MACL,IAAI,KAAK,WAAA;AAAA,MACT,WAAWF;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,WAAWA;AAAA,MACX,kBAAAM;AAAA,MACA,iBAAAC;AAAA,MACA,SAASN;AAAA,MACT,kBAAAI;AAAA,MACA,iBAAiB,KAAK,wBAAwBJ,CAAa;AAAA,IAAA;AAAA,EAE/D;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAyC;AACvC,WAAO,MAAM,KAAK,KAAK,WAAW,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,wBAA6C;AAC3C,WAAO,MAAM,KAAK,KAAK,kBAAkB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAWO,GAAoC;AAC7C,WAAO,KAAK,mBAAmB,IAAIA,CAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoBA,GAAiC;AACnD,IAAK,KAAK,mBAAmB,IAAIA,CAAM,MACrC,KAAK,mBAAmB,IAAIA,CAAM,GAClC,KAAK,mBAAmBA,CAAM,GAC9B,KAAK,IAAI,mCAAmCA,CAAM,EAAE;AAAA,EAExD;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsBA,GAAiC;AACrD,SAAK,mBAAmB,OAAOA,CAAM,GACrC,KAAK,IAAI,4BAA4BA,CAAM,EAAE;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA0B;AACxB,SAAK,mBAAmB,MAAA,GACxB,KAAK,IAAI,wBAAwB;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAeZ,GAA0B;AACvC,SAAK,WAAW,OAAOA,CAAU,GACjC,KAAK,kBAAkB,OAAOA,CAAU;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,MAAA,GACb,KAAK,WAAW,MAAA,GAChB,KAAK,mBAAmB,MAAA,GACxB,KAAK,eAAe,MAAA,GACpB,KAAK,kBAAkB,MAAA,GACvB,KAAK,YAAY,KAAK,IAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUO,GAA4C;AACpD,WAAO,KAAK,UAAU,IAAIA,CAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAoC;AAClC,WAAO,MAAM,KAAK,KAAK,UAAU,QAAQ;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqBM,GAA8C;AACjE,WAAO,MAAM,KAAK,KAAK,UAAU,OAAA,CAAQ,EAAE,OAAO,CAACC,MAAMA,EAAE,aAAaD,CAAQ;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAA0B;AAChC,eAAWX,KAAU,KAAK,OAAO;AAC/B,WAAK,UAAU,IAAIA,EAAO,MAAMA,CAAM;AAAA,EAE1C;AAAA,EAEQ,QAAQA,GAA0BD,GAAkC;AAC1E,UAAMc,IAAgBb,EAAO,kBAAkB,IACzCc,IAAwC,CAAA;AAE9C,QAAIC,IAA2B,QAC3BC,IAAY,GACZC,IAAY;AAGhB,IAAIJ,IAEAb,EAAO,sBAAsB,QAC7BA,EAAO,sBAAsB,UAC7BD,IAAQC,EAAO,qBAEfe,IAAW,YACXC,IAAYhB,EAAO,mBACnBiB,IAAY,MACHlB,IAAQC,EAAO,kBACxBe,IAAW,SACXC,IAAYhB,EAAO,gBACnBiB,IAAY,MACHlB,IAAQC,EAAO,qBACxBe,IAAW,WACXC,IAAYhB,EAAO,oBAMnBA,EAAO,sBAAsB,QAC7BA,EAAO,sBAAsB,UAC7BD,IAAQC,EAAO,qBAEfe,IAAW,YACXC,IAAYhB,EAAO,mBACnBiB,IAAY,MACHlB,IAAQC,EAAO,kBACxBe,IAAW,SACXC,IAAYhB,EAAO,gBACnBiB,IAAY,MACHlB,IAAQC,EAAO,qBACxBe,IAAW,WACXC,IAAYhB,EAAO;AAKvB,UAAMkB,IAAUL,IACZ,KAAK,IAAI,GAAGd,IAAQC,EAAO,cAAc,IACzC,KAAK,IAAI,GAAGA,EAAO,iBAAiBD,CAAK,GACvCoB,IACJnB,EAAO,mBAAmB,IAAKkB,IAAUlB,EAAO,iBAAkB,MAAM;AAG1E,WAAI,CAACiB,KAAa,KAAK,OAAO,mBAAmBjB,EAAO,sBACtDc,EAAiB,KAAK,GAAGd,EAAO,kBAAkB,GAG7C;AAAA,MACL,WAAAiB;AAAA,MACA,UAAAF;AAAA,MACA,OAAAhB;AAAA,MACA,WAAWiB,KAAahB,EAAO;AAAA,MAC/B,SAAAkB;AAAA,MACA,gBAAAC;AAAA,MACA,kBAAAL;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,MAChB,SAAS,KAAK,gBAAgBd,GAAQD,GAAOgB,CAAQ;AAAA,IAAA;AAAA,EAEzD;AAAA,EAEQ,aAAajB,GAAoBC,GAAekB,GAA0B;AAChF,IAAK,KAAK,QAAQ,IAAInB,CAAU,KAC9B,KAAK,QAAQ,IAAIA,GAAY,CAAA,CAAE;AAGjC,UAAMsB,IAAU,KAAK,QAAQ,IAAItB,CAAU;AAC3C,IAAKsB,MACLA,EAAQ,KAAK;AAAA,MACX,OAAArB;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,MAChB,WAAAkB;AAAA,IAAA,CACD,GAGGG,EAAQ,SAAS,OACnBA,EAAQ,MAAA;AAAA,EAEZ;AAAA,EAEQ,gBAAgBpB,GAA0BC,GAAiC;AACjF,UAAMoB,KAAS,KAAK,kBAAkB,IAAIrB,EAAO,IAAI,KAAK,KAAK;AAI/D,QAHA,KAAK,kBAAkB,IAAIA,EAAO,MAAMqB,CAAK,GAGzCA,KAAS,KAAK,OAAO,oBAAoB;AAC3C,YAAMnB,IAAM,KAAK,IAAA,GACXoB,IAAW,KAAK,WAAW,IAAItB,EAAO,IAAI,GAE1CuB,IAA6B;AAAA,QACjC,IAAID,GAAU,MAAM,KAAK,WAAA;AAAA,QACzB,QAAAtB;AAAA,QACA,QAAAC;AAAA,QACA,KAAK,OAAO,SAAW,MAAc,OAAO,SAAS,OAAO;AAAA,QAC5D,uBAAuBoB;AAAA,QACvB,kBAAkBC,GAAU,oBAAoBpB;AAAA,QAChD,iBAAiBA;AAAA,MAAA;AAGnB,WAAK,WAAW,IAAIF,EAAO,MAAMuB,CAAS;AAG1C,YAAMC,IAAY,KAAK,eAAe,IAAIxB,EAAO,IAAI,KAAK;AAU1D,UATIE,IAAMsB,IAAY,KAAK,OAAO,kBAChC,KAAK,eAAe,IAAIxB,EAAO,MAAME,CAAG,GACxC,KAAK,OAAO,cAAcqB,CAAS,GACnC,KAAK;AAAA,QACH,qBAAqBvB,EAAO,IAAI,MAAMC,EAAO,KAAK,gBAAgBA,EAAO,SAAS;AAAA,MAAA,IAKlF,KAAK,OAAO,SAAS,aAAa,KAAK,OAAO,SAAS;AACzD,mBAAWS,KAAUT,EAAO;AAC1B,UAAK,KAAK,mBAAmB,IAAIS,CAAM,MACrC,KAAK,mBAAmB,IAAIA,CAAM,GAClC,KAAK,mBAAmBA,GAAQV,CAAM;AAAA,IAI9C;AAAA,EACF;AAAA,EAEQ,iBAAiBA,GAAgC;AACvD,UAAMyB,IAAgB,KAAK,kBAAkB,IAAIzB,EAAO,IAAI,KAAK;AAWjE,QAVA,KAAK,kBAAkB,IAAIA,EAAO,MAAM,CAAC,GAGrC,KAAK,WAAW,IAAIA,EAAO,IAAI,MACjC,KAAK,WAAW,OAAOA,EAAO,IAAI,GAClC,KAAK,OAAO,eAAeA,CAAM,GACjC,KAAK,IAAI,+BAA+BA,EAAO,IAAI,EAAE,IAInDyB,KAAiB,KAAK,OAAO,sBAAsBzB,EAAO;AAC5D,iBAAWU,KAAUV,EAAO,oBAAoB;AAE9C,YAAI0B,IAAc;AAClB,mBAAW,CAAA,EAAGH,CAAS,KAAK,KAAK;AAC/B,cAAIA,EAAU,OAAO,iBAAiB,SAASb,CAAM,GAAG;AACtD,YAAAgB,IAAc;AACd;AAAA,UACF;AAEF,QAAKA,KACH,KAAK,mBAAmB,OAAOhB,CAAM;AAAA,MAEzC;AAAA,EAEJ;AAAA,EAEQ,mBAAmBA,GAA2BV,GAAiC;AACrF,UAAM2B,IAAU,KAAK,OAAO,sBAAsBjB,CAAM;AACxD,IAAIiB,KACGA,EAAA,GAGH3B,KACF,KAAK,OAAO,gBAAgBU,GAAQV,CAAM,GAG5C,KAAK,IAAI,0BAA0BU,CAAM,EAAE;AAAA,EAC7C;AAAA,EAEQ,0BACNL,GACAL,GACwB;AACxB,UAAMoB,IAAU,KAAK,QAAQ,IAAIf,CAAI,KAAK,CAAA,GACpCkB,IAAY,KAAK,WAAW,IAAIlB,CAAI,GAEpCuB,IAASR,EAAQ,IAAI,CAACS,MAAMA,EAAE,KAAK,GACnCC,IAAmBV,EAAQ,OAAO,CAACS,MAAMA,EAAE,SAAS,GACpDE,IAAeH,EAAO,SAAS,IAAIA,EAAOA,EAAO,SAAS,CAAC,IAAI,GAC/DI,IAAUJ,EAAO,SAAS,IAAIA,EAAO,OAAO,CAACK,GAAK,MAAMA,IAAM,GAAG,CAAC,IAAIL,EAAO,SAAS,GACtFM,IAAON,EAAO,SAAS,IAAI,KAAK,IAAI,GAAGA,CAAM,IAAI,GACjDO,IACJf,EAAQ,SAAS,IAAKU,EAAiB,SAASV,EAAQ,SAAU,MAAM,KAEpEP,IAAgBb,EAAO,kBAAkB,IACzCoC,IAAmBL,KAAgB,GACnCM,IAAqBxB,IACtBuB,IAAmBpC,EAAO,iBAAkB,MAC5CA,EAAO,iBAAiBoC,IAAoB,KAC3CE,IAAWzB,IACbb,EAAO,mBAAmBoC,IAC1BA,IAAmBpC,EAAO;AAE9B,WAAO;AAAA,MACL,MAAAK;AAAA,MACA,UAAUL,EAAO;AAAA,MACjB,aAAa,CAACuB;AAAA,MACd,cAAca;AAAA,MACd,kBAAkBpC,EAAO;AAAA,MACzB,gBAAgBA,EAAO;AAAA,MACvB,oBAAoB,KAAK,IAAIqC,GAAoB,GAAG;AAAA,MACpD,UAAU,KAAK,IAAIC,GAAU,CAAC;AAAA,MAC9B,SAASlB,EAAQ;AAAA,MACjB,SAAAY;AAAA,MACA,MAAAE;AAAA,MACA,gBAAAC;AAAA,MACA,oBAAoBZ,GAAW,OAAO,oBAAoB,CAAA;AAAA,IAAC;AAAA,EAE/D;AAAA,EAEQ,wBAAwBgB,GAA6C;AAC3E,UAAMC,IAA4B,CAAA;AAElC,eAAWlC,KAAUiC;AACnB,UAAKjC,EAAO;AA8BZ,QAAWA,EAAO,qBAAqB,MACrCkC,EAAgB;AAAA,UACd,GAAGlC,EAAO,IAAI,UAAUA,EAAO,mBAAmB,QAAQ,CAAC,CAAC;AAAA,QAAA;AAAA,UA/B9D,SAAQA,EAAO,UAAA;AAAA,QACb,KAAK;AACH,UAAIA,EAAO,SAAS,QAClBkC,EAAgB;AAAA,YACd;AAAA,UAAA,IAEOlC,EAAO,SAAS,QACzBkC,EAAgB;AAAA,YACd;AAAA,UAAA,IAEOlC,EAAO,SAAS,SACzBkC,EAAgB;AAAA,YACd;AAAA,UAAA;AAGJ;AAAA,QACF,KAAK;AACH,UAAAA,EAAgB,KAAK,qCAAqClC,EAAO,IAAI,EAAE,GACvEkC,EAAgB,KAAK,uCAAuC;AAC5D;AAAA,QACF,KAAK;AACH,UAAAA,EAAgB,KAAK,6CAA6C,GAClEA,EAAgB,KAAK,iDAAiD;AACtE;AAAA,QACF,KAAK;AACH,UAAAA,EAAgB,KAAK,iDAAiD,GACtEA,EAAgB,KAAK,2CAA2C;AAChE;AAAA,MAAA;AASR,WAAO,CAAC,GAAG,IAAI,IAAIA,CAAe,CAAC;AAAA,EACrC;AAAA,EAEQ,gBACNxC,GACAD,GACAgB,GACQ;AACR,UAAM0B,IAAiB,KAAK,YAAY1C,GAAOC,EAAO,IAAI,GACpD0C,IAAqB,KAAK,YAAY1C,EAAO,gBAAgBA,EAAO,IAAI;AAE9E,YAAQe,GAAA;AAAA,MACN,KAAK;AACH,eAAO,aAAaf,EAAO,IAAI,OAAOyC,CAAc,yBAAyB,KAAK,YAAYzC,EAAO,qBAAqBA,EAAO,gBAAgBA,EAAO,IAAI,CAAC;AAAA,MAC/J,KAAK;AACH,eAAO,UAAUA,EAAO,IAAI,sBAAsByC,CAAc,YAAYC,CAAkB;AAAA,MAChG,KAAK;AACH,eAAO,YAAY1C,EAAO,IAAI,OAAOyC,CAAc,wBAAwBC,CAAkB;AAAA,MAC/F;AACE,eAAO,GAAG1C,EAAO,IAAI,KAAKyC,CAAc;AAAA,IAAA;AAAA,EAE9C;AAAA,EAEQ,YAAY1C,GAAe4C,GAAsB;AACvD,WAAIA,MAAS,UACP5C,KAAS,OAAO,OACX,IAAIA,KAAS,OAAO,OAAO,QAAQ,CAAC,CAAC,OACnCA,KAAS,OACX,IAAIA,IAAQ,MAAM,QAAQ,CAAC,CAAC,OAE9B,GAAGA,CAAK,MAEV4C,IAAO,GAAG5C,CAAK,GAAG4C,CAAI,KAAK,GAAG5C,CAAK;AAAA,EAC5C;AAAA,EAEQ,oBAAoBA,GAAkC;AAC5D,WAAO;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,OAAAA;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,kBAAkB,CAAA;AAAA,MAClB,WAAW,KAAK,IAAA;AAAA,IAAI;AAAA,EAExB;AAAA,EAEQ,aAAqB;AAC3B,WAAO,UAAU,KAAK,IAAA,CAAK,IAAI,EAAE,KAAK,SAAS;AAAA,EACjD;AAAA,EAEQ,IAAI6C,MAAoBC,GAAuB;AACrD,IAAI,KAAK,OAAO,SACd,QAAQ,KAAK,oBAAoBD,CAAO,IAAI,GAAGC,CAAI;AAAA,EAEvD;AACF;AAMA,IAAIC,IAA0C;AAKvC,SAASC,EAAkBlD,GAAwD;AACxF,SAAAiD,MAAqB,IAAIlD,EAAeC,CAAM,GACvCiD;AACT;AAKO,SAASE,IAA4B;AAC1C,EAAAF,GAAkB,MAAA,GAClBA,IAAmB;AACrB;AASO,SAASG,EAAYnD,GAAoBC,GAAkC;AAChF,SAAOgD,EAAA,EAAoB,MAAMjD,GAAYC,CAAK;AACpD;AAKO,SAASmD,EAAcpD,GAAoBC,GAAkC;AAClF,SAAOgD,EAAA,EAAoB,OAAOjD,GAAYC,CAAK;AACrD;AAKO,SAASoD,IAAwC;AACtD,SAAOJ,EAAA,EAAoB,oBAAA;AAC7B;AAKO,SAASK,IAAiC;AAC/C,SAAOL,EAAA,EAAoB,sBAAA,EAAwB,SAAS;AAC9D;AAKO,SAASM,EAAoB3C,GAAoC;AACtE,SAAOqC,EAAA,EAAoB,WAAWrC,CAAM;AAC9C;"}