maplibre-gl-layer-control 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +192 -0
- package/dist/index.cjs +1166 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +1166 -0
- package/dist/index.mjs.map +1 -0
- package/dist/maplibre-gl-layer-control.css +644 -0
- package/dist/types/index.d.ts +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/lib/utils/layerUtils.ts","../src/lib/utils/styleCache.ts","../src/lib/utils/colorUtils.ts","../src/lib/utils/formatters.ts","../src/lib/core/LayerControl.ts"],"sourcesContent":["import type { Map as MapLibreMap } from 'maplibre-gl';\nimport type { StyleableLayerType } from '../core/types';\n\n/**\n * Get the opacity property name for a given layer type\n * @param layerType MapLibre layer type\n * @returns Opacity property name(s)\n */\nexport function getOpacityProperty(layerType: string): string | string[] {\n switch (layerType) {\n case 'fill':\n return 'fill-opacity';\n case 'line':\n return 'line-opacity';\n case 'circle':\n return 'circle-opacity';\n case 'symbol':\n // Symbol layers have both icon and text opacity\n return ['icon-opacity', 'text-opacity'];\n case 'raster':\n return 'raster-opacity';\n case 'background':\n return 'background-opacity';\n default:\n return `${layerType}-opacity`;\n }\n}\n\n/**\n * Get the current opacity value for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param layerType Layer type\n * @returns Current opacity value (0-1)\n */\nexport function getLayerOpacity(\n map: MapLibreMap,\n layerId: string,\n layerType: string\n): number {\n const opacityProp = getOpacityProperty(layerType);\n\n if (Array.isArray(opacityProp)) {\n // For symbol layers, use icon-opacity as the primary value\n const opacity = map.getPaintProperty(layerId, opacityProp[0]);\n return (opacity !== undefined && opacity !== null) ? opacity as number : 1.0;\n }\n\n const opacity = map.getPaintProperty(layerId, opacityProp);\n return (opacity !== undefined && opacity !== null) ? opacity as number : 1.0;\n}\n\n/**\n * Set the opacity for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param layerType Layer type\n * @param opacity Opacity value (0-1)\n */\nexport function setLayerOpacity(\n map: MapLibreMap,\n layerId: string,\n layerType: string,\n opacity: number\n): void {\n const opacityProp = getOpacityProperty(layerType);\n\n if (Array.isArray(opacityProp)) {\n // For symbol layers, set both icon and text opacity\n opacityProp.forEach((prop) => {\n map.setPaintProperty(layerId, prop, opacity);\n });\n } else {\n map.setPaintProperty(layerId, opacityProp, opacity);\n }\n}\n\n/**\n * Check if a layer type supports style editing\n * @param layerType Layer type\n * @returns True if the layer type supports style editing\n */\nexport function isStyleableLayerType(layerType: string): layerType is StyleableLayerType {\n return ['fill', 'line', 'circle', 'symbol', 'raster'].includes(layerType);\n}\n\n/**\n * Get layer type from map\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @returns Layer type or null if layer not found\n */\nexport function getLayerType(map: MapLibreMap, layerId: string): string | null {\n try {\n const layer = map.getLayer(layerId);\n return layer ? layer.type : null;\n } catch (error) {\n console.warn(`Failed to get layer type for ${layerId}:`, error);\n return null;\n }\n}\n","import type { Map as MapLibreMap } from 'maplibre-gl';\nimport type { OriginalStyle } from '../core/types';\n\n/**\n * Deep clone a paint value (handles complex MapLibre expressions)\n * @param value Paint value to clone\n * @returns Cloned value\n */\nexport function clonePaintValue(value: any): any {\n if (Array.isArray(value)) {\n return value.map((item) => clonePaintValue(item));\n }\n if (value && typeof value === 'object') {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch (error) {\n return value;\n }\n }\n return value;\n}\n\n/**\n * Cache the original paint properties for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param originalStyles Map to store original styles\n */\nexport function cacheOriginalLayerStyle(\n map: MapLibreMap,\n layerId: string,\n originalStyles: Map<string, OriginalStyle>\n): void {\n if (originalStyles.has(layerId)) {\n return; // Already cached\n }\n\n try {\n const layer = map.getLayer(layerId);\n if (!layer) {\n return;\n }\n\n const paint: Record<string, any> = {};\n const style = map.getStyle();\n const layerDef = style.layers?.find(l => l.id === layerId);\n\n // For raster layers, handle all properties with defaults\n if (layer.type === 'raster') {\n // Default values from MapLibre GL spec\n const rasterDefaults: Record<string, number> = {\n 'raster-opacity': 1,\n 'raster-brightness-min': 0,\n 'raster-brightness-max': 1,\n 'raster-saturation': 0,\n 'raster-contrast': 0,\n 'raster-hue-rotate': 0\n };\n\n // Start with defaults\n Object.assign(paint, rasterDefaults);\n\n // Override with values from layer definition\n if (layerDef && 'paint' in layerDef && layerDef.paint) {\n Object.entries(layerDef.paint).forEach(([prop, value]) => {\n if (prop.startsWith('raster-')) {\n paint[prop] = clonePaintValue(value);\n }\n });\n }\n } else {\n // For non-raster layers, just get values from the layer definition\n if (layerDef && 'paint' in layerDef && layerDef.paint) {\n Object.entries(layerDef.paint).forEach(([prop, value]) => {\n paint[prop] = clonePaintValue(value);\n });\n }\n }\n\n originalStyles.set(layerId, { paint });\n } catch (error) {\n console.warn(`Failed to cache original style for ${layerId}:`, error);\n }\n}\n\n/**\n * Get the current value of a paint property\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param property Property name\n * @param fallback Fallback value if property is not set\n * @returns Current property value\n */\nexport function getCurrentPaintValue(\n map: MapLibreMap,\n layerId: string,\n property: string,\n fallback?: any\n): any {\n try {\n const value = map.getPaintProperty(layerId, property);\n return value !== undefined ? value : fallback;\n } catch (error) {\n return fallback;\n }\n}\n\n/**\n * Restore original paint properties for a layer\n * @param map MapLibre map instance\n * @param layerId Layer ID\n * @param originalStyles Map of original styles\n * @returns Object with restored properties\n */\nexport function restoreOriginalStyle(\n map: MapLibreMap,\n layerId: string,\n originalStyles: Map<string, OriginalStyle>\n): Record<string, any> {\n const original = originalStyles.get(layerId);\n if (!original) {\n return {};\n }\n\n const applied: Record<string, any> = {};\n\n Object.entries(original.paint).forEach(([property, value]) => {\n try {\n const restoredValue = clonePaintValue(value);\n map.setPaintProperty(layerId, property, restoredValue);\n applied[property] = restoredValue;\n } catch (error) {\n console.warn(`Failed to restore ${property} for ${layerId}:`, error);\n }\n });\n\n return applied;\n}\n","/**\n * Convert RGB values to hex color string\n * @param r Red component (0-255)\n * @param g Green component (0-255)\n * @param b Blue component (0-255)\n * @returns Hex color string (e.g., '#ff0000')\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n const toHex = (v: number) => {\n const hex = clamp(v).toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\n/**\n * Normalize a color value to hex format\n * Handles hex strings, RGB strings, and RGB arrays\n * @param value Color value in various formats\n * @returns Normalized hex color string (always 6 digits)\n */\nexport function normalizeColor(value: any): string {\n if (typeof value === 'string') {\n // Already hex format\n if (value.startsWith('#')) {\n // Expand shorthand hex (#RGB to #RRGGBB)\n if (value.length === 4) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return value;\n }\n\n // RGB string format: 'rgb(51, 136, 255)'\n if (value.startsWith('rgb')) {\n const match = value.match(/\\d+/g);\n if (match && match.length >= 3) {\n const [r, g, b] = match.map((num) => parseInt(num, 10));\n return rgbToHex(r, g, b);\n }\n }\n } else if (Array.isArray(value) && value.length >= 3) {\n // RGB array format: [51, 136, 255]\n return rgbToHex(value[0], value[1], value[2]);\n }\n\n // Fallback color (MapLibre default blue)\n return '#3388ff';\n}\n","/**\n * Format a numeric value based on the step size\n * @param value Numeric value to format\n * @param step Step size (determines decimal places)\n * @returns Formatted string\n */\nexport function formatNumericValue(value: number, step: number): string {\n let decimals = 0;\n\n if (step && Number(step) !== 1) {\n const stepNumber = Number(step);\n if (stepNumber > 0 && stepNumber < 1) {\n decimals = Math.min(4, Math.ceil(Math.abs(Math.log10(stepNumber))));\n }\n }\n\n return value.toFixed(decimals);\n}\n\n/**\n * Clamp a numeric value between min and max\n * @param value Value to clamp\n * @param min Minimum value\n * @param max Maximum value\n * @returns Clamped value\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import type { IControl, Map as MapLibreMap } from 'maplibre-gl';\nimport type {\n LayerControlOptions,\n LayerState,\n OriginalStyle,\n InternalControlState,\n} from './types';\nimport { getLayerType, getLayerOpacity, setLayerOpacity } from '../utils/layerUtils';\nimport { cacheOriginalLayerStyle, restoreOriginalStyle } from '../utils/styleCache';\nimport { normalizeColor } from '../utils/colorUtils';\nimport { formatNumericValue } from '../utils/formatters';\n\n/**\n * LayerControl - A comprehensive layer control for MapLibre GL\n * Provides visibility toggle, opacity control, and advanced style editing\n */\nexport class LayerControl implements IControl {\n private map!: MapLibreMap;\n private container!: HTMLDivElement;\n private button!: HTMLButtonElement;\n private panel!: HTMLDivElement;\n\n // State management\n private state: InternalControlState;\n private targetLayers: string[];\n private styleEditors: Map<string, HTMLElement>;\n\n // Panel width management\n private minPanelWidth: number;\n private maxPanelWidth: number;\n private widthSliderEl: HTMLElement | null = null;\n private widthThumbEl: HTMLElement | null = null;\n private widthValueEl: HTMLElement | null = null;\n private isWidthSliderActive = false;\n private widthDragRectWidth: number | null = null;\n private widthDragStartX: number | null = null;\n private widthDragStartWidth: number | null = null;\n private widthFrame: number | null = null;\n\n constructor(options: LayerControlOptions = {}) {\n this.minPanelWidth = options.panelMinWidth || 240;\n this.maxPanelWidth = options.panelMaxWidth || 420;\n\n this.state = {\n collapsed: options.collapsed !== false,\n panelWidth: options.panelWidth || 320,\n activeStyleEditor: null,\n layerStates: options.layerStates || {},\n originalStyles: new Map<string, OriginalStyle>(),\n userInteractingWithSlider: false,\n };\n\n this.targetLayers = options.layers || Object.keys(this.state.layerStates);\n this.styleEditors = new Map<string, HTMLElement>();\n }\n\n /**\n * Called when the control is added to the map\n */\n onAdd(map: MapLibreMap): HTMLElement {\n this.map = map;\n\n // Auto-detect layers if layerStates not provided\n if (Object.keys(this.state.layerStates).length === 0) {\n this.autoDetectLayers();\n }\n\n this.container = this.createContainer();\n this.button = this.createToggleButton();\n this.panel = this.createPanel();\n\n this.container.appendChild(this.button);\n this.container.appendChild(this.panel);\n\n // Now that panel is attached, update width display\n this.updateWidthDisplay();\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Build layer items\n this.buildLayerItems();\n\n return this.container;\n }\n\n /**\n * Called when the control is removed from the map\n */\n onRemove(): void {\n this.container.parentNode?.removeChild(this.container);\n // Cleanup will be handled by garbage collection\n }\n\n /**\n * Auto-detect layers from the map and populate layerStates\n */\n private autoDetectLayers(): void {\n const style = this.map.getStyle();\n if (!style || !style.layers) {\n return;\n }\n\n // Get all layer IDs from the map\n const allLayerIds = style.layers.map(layer => layer.id);\n\n if (this.targetLayers.length === 0) {\n // No layers specified - show ALL layers individually\n allLayerIds.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Generate friendly name from layer ID\n const friendlyName = this.generateFriendlyName(layerId);\n\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: friendlyName\n };\n });\n } else {\n // Specific layers requested - separate into user layers + Background\n const userLayers: string[] = [];\n const basemapLayers: string[] = [];\n\n allLayerIds.forEach(layerId => {\n if (this.targetLayers.includes(layerId)) {\n userLayers.push(layerId);\n } else {\n basemapLayers.push(layerId);\n }\n });\n\n // Add Background entry if there are basemap layers\n if (basemapLayers.length > 0) {\n this.state.layerStates['Background'] = {\n visible: true,\n opacity: 1.0,\n name: 'Background'\n };\n }\n\n // Add entries for user-specified layers\n userLayers.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Generate friendly name from layer ID\n const friendlyName = this.generateFriendlyName(layerId);\n\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: friendlyName\n };\n });\n }\n\n // Update targetLayers to include detected layers\n this.targetLayers = Object.keys(this.state.layerStates);\n }\n\n /**\n * Generate a friendly display name from a layer ID\n */\n private generateFriendlyName(layerId: string): string {\n // Remove common prefixes\n let name = layerId.replace(/^(layer[-_]?|gl[-_]?)/, '');\n\n // Replace dashes and underscores with spaces\n name = name.replace(/[-_]/g, ' ');\n\n // Capitalize first letter of each word\n name = name.replace(/\\b\\w/g, char => char.toUpperCase());\n\n return name || layerId; // Fallback to original if empty\n }\n\n /**\n * Create the main container element\n */\n private createContainer(): HTMLDivElement {\n const container = document.createElement('div');\n container.className = 'maplibregl-ctrl maplibregl-ctrl-group maplibregl-ctrl-layer-control';\n return container;\n }\n\n /**\n * Create the toggle button\n */\n private createToggleButton(): HTMLButtonElement {\n const button = document.createElement('button');\n button.type = 'button';\n button.title = 'Layer Control';\n button.setAttribute('aria-label', 'Layer Control');\n\n // Create layers icon (SVG)\n const icon = document.createElement('span');\n icon.className = 'layer-control-icon';\n icon.innerHTML =\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\" ' +\n 'fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<polygon points=\"12 3 3 8.25 12 13.5 21 8.25 12 3\"></polygon>' +\n '<polyline points=\"3 12.75 12 18 21 12.75\"></polyline>' +\n '<polyline points=\"3 17.25 12 22 21 17.25\"></polyline>' +\n '</svg>';\n\n button.appendChild(icon);\n return button;\n }\n\n /**\n * Create the panel element\n */\n private createPanel(): HTMLDivElement {\n const panel = document.createElement('div');\n panel.className = 'layer-control-panel';\n\n // Set initial width directly on the element\n panel.style.width = `${this.state.panelWidth}px`;\n\n if (!this.state.collapsed) {\n panel.classList.add('expanded');\n }\n\n // Add header\n const header = this.createPanelHeader();\n panel.appendChild(header);\n\n return panel;\n }\n\n /**\n * Create the panel header with title and width control\n */\n private createPanelHeader(): HTMLElement {\n const header = document.createElement('div');\n header.className = 'layer-control-panel-header';\n\n const title = document.createElement('span');\n title.className = 'layer-control-panel-title';\n title.textContent = 'Layers';\n header.appendChild(title);\n\n // Add width control\n const widthControl = this.createWidthControl();\n header.appendChild(widthControl);\n\n return header;\n }\n\n /**\n * Create the width control slider\n */\n private createWidthControl(): HTMLElement {\n const widthControl = document.createElement('label');\n widthControl.className = 'layer-control-width-control';\n widthControl.title = 'Adjust layer panel width';\n\n const widthLabel = document.createElement('span');\n widthLabel.textContent = 'Width';\n widthControl.appendChild(widthLabel);\n\n const widthSlider = document.createElement('div');\n widthSlider.className = 'layer-control-width-slider';\n widthSlider.setAttribute('role', 'slider');\n widthSlider.setAttribute('aria-valuemin', String(this.minPanelWidth));\n widthSlider.setAttribute('aria-valuemax', String(this.maxPanelWidth));\n widthSlider.setAttribute('aria-valuenow', String(this.state.panelWidth));\n widthSlider.setAttribute('aria-valuestep', '10');\n widthSlider.setAttribute('aria-label', 'Layer panel width');\n widthSlider.tabIndex = 0;\n\n const widthTrack = document.createElement('div');\n widthTrack.className = 'layer-control-width-track';\n const widthThumb = document.createElement('div');\n widthThumb.className = 'layer-control-width-thumb';\n\n widthSlider.appendChild(widthTrack);\n widthSlider.appendChild(widthThumb);\n\n this.widthSliderEl = widthSlider;\n this.widthThumbEl = widthThumb;\n\n // Add width value display\n const widthValue = document.createElement('span');\n widthValue.className = 'layer-control-width-value';\n this.widthValueEl = widthValue;\n\n widthControl.appendChild(widthSlider);\n widthControl.appendChild(widthValue);\n\n this.updateWidthDisplay();\n this.setupWidthSliderEvents(widthSlider);\n\n return widthControl;\n }\n\n /**\n * Setup event listeners for width slider\n */\n private setupWidthSliderEvents(widthSlider: HTMLElement): void {\n // Pointer events for dragging\n widthSlider.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n const rect = widthSlider.getBoundingClientRect();\n this.widthDragRectWidth = rect.width || 1;\n this.widthDragStartX = event.clientX;\n this.widthDragStartWidth = this.state.panelWidth;\n this.isWidthSliderActive = true;\n widthSlider.setPointerCapture(event.pointerId);\n this.updateWidthFromPointer(event, true);\n });\n\n widthSlider.addEventListener('pointermove', (event) => {\n if (!this.isWidthSliderActive) return;\n this.updateWidthFromPointer(event);\n });\n\n const endPointerDrag = (event: PointerEvent) => {\n if (!this.isWidthSliderActive) return;\n if (event.pointerId !== undefined) {\n try {\n widthSlider.releasePointerCapture(event.pointerId);\n } catch (error) {\n // Ignore release errors\n }\n }\n this.isWidthSliderActive = false;\n this.widthDragRectWidth = null;\n this.widthDragStartX = null;\n this.widthDragStartWidth = null;\n this.updateWidthDisplay();\n };\n\n widthSlider.addEventListener('pointerup', endPointerDrag);\n widthSlider.addEventListener('pointercancel', endPointerDrag);\n widthSlider.addEventListener('lostpointercapture', endPointerDrag);\n\n // Keyboard navigation\n widthSlider.addEventListener('keydown', (event) => {\n let handled = true;\n const step = event.shiftKey ? 20 : 10;\n\n switch (event.key) {\n case 'ArrowLeft':\n case 'ArrowDown':\n this.applyPanelWidth(this.state.panelWidth - step, true);\n break;\n case 'ArrowRight':\n case 'ArrowUp':\n this.applyPanelWidth(this.state.panelWidth + step, true);\n break;\n case 'Home':\n this.applyPanelWidth(this.minPanelWidth, true);\n break;\n case 'End':\n this.applyPanelWidth(this.maxPanelWidth, true);\n break;\n case 'PageUp':\n this.applyPanelWidth(this.state.panelWidth + 50, true);\n break;\n case 'PageDown':\n this.applyPanelWidth(this.state.panelWidth - 50, true);\n break;\n default:\n handled = false;\n }\n\n if (handled) {\n event.preventDefault();\n this.updateWidthDisplay();\n }\n });\n }\n\n /**\n * Update panel width from pointer event\n */\n private updateWidthFromPointer(event: PointerEvent, resetBaseline = false): void {\n if (!this.widthSliderEl) return;\n\n const sliderWidth = this.widthDragRectWidth || this.widthSliderEl.getBoundingClientRect().width || 1;\n const widthRange = this.maxPanelWidth - this.minPanelWidth;\n\n let width: number;\n if (resetBaseline) {\n const rect = this.widthSliderEl.getBoundingClientRect();\n const relative = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0;\n const clampedRatio = Math.min(1, Math.max(0, relative));\n width = this.minPanelWidth + clampedRatio * widthRange;\n this.widthDragStartWidth = width;\n this.widthDragStartX = event.clientX;\n } else {\n const delta = event.clientX - (this.widthDragStartX || event.clientX);\n width = (this.widthDragStartWidth || this.state.panelWidth) + (delta / sliderWidth) * widthRange;\n }\n\n this.applyPanelWidth(width, this.isWidthSliderActive);\n }\n\n /**\n * Apply panel width (clamped to min/max)\n */\n private applyPanelWidth(width: number, immediate = false): void {\n const clamped = Math.round(Math.min(this.maxPanelWidth, Math.max(this.minPanelWidth, width)));\n\n const applyWidth = () => {\n this.state.panelWidth = clamped;\n const px = `${clamped}px`;\n this.panel.style.width = px;\n this.updateWidthDisplay();\n };\n\n if (immediate) {\n applyWidth();\n return;\n }\n\n if (this.widthFrame) {\n cancelAnimationFrame(this.widthFrame);\n }\n this.widthFrame = requestAnimationFrame(() => {\n applyWidth();\n this.widthFrame = null;\n });\n }\n\n /**\n * Update width display (value label and thumb position)\n */\n private updateWidthDisplay(): void {\n if (this.widthValueEl) {\n this.widthValueEl.textContent = `${this.state.panelWidth}px`;\n }\n if (this.widthSliderEl) {\n this.widthSliderEl.setAttribute('aria-valuenow', String(this.state.panelWidth));\n const ratio = (this.state.panelWidth - this.minPanelWidth) / (this.maxPanelWidth - this.minPanelWidth || 1);\n if (this.widthThumbEl) {\n const sliderWidth = this.widthSliderEl.clientWidth || 1;\n const thumbWidth = this.widthThumbEl.offsetWidth || 14;\n const padding = 16;\n const available = Math.max(0, sliderWidth - padding - thumbWidth);\n const clampedRatio = Math.min(1, Math.max(0, ratio));\n const leftPx = 8 + available * clampedRatio;\n this.widthThumbEl.style.left = `${leftPx}px`;\n }\n }\n }\n\n /**\n * Setup main event listeners\n */\n private setupEventListeners(): void {\n // Toggle button click\n this.button.addEventListener('click', () => this.toggle());\n\n // Click outside to close\n document.addEventListener('click', (e) => {\n if (!this.container.contains(e.target as Node)) {\n this.collapse();\n }\n });\n\n // Listen for map layer changes\n this.setupLayerChangeListeners();\n }\n\n /**\n * Setup listeners for map layer changes\n */\n private setupLayerChangeListeners(): void {\n this.map.on('styledata', () => {\n setTimeout(() => {\n this.updateLayerStatesFromMap();\n this.checkForNewLayers();\n }, 100);\n });\n\n this.map.on('data', (e) => {\n if (e.sourceDataType === 'content') {\n setTimeout(() => {\n this.updateLayerStatesFromMap();\n this.checkForNewLayers();\n }, 100);\n }\n });\n\n this.map.on('sourcedata', (e) => {\n if (e.sourceDataType === 'metadata') {\n setTimeout(() => {\n this.checkForNewLayers();\n }, 150);\n }\n });\n }\n\n /**\n * Toggle panel expanded/collapsed state\n */\n private toggle(): void {\n if (this.state.collapsed) {\n this.expand();\n } else {\n this.collapse();\n }\n }\n\n /**\n * Expand the panel\n */\n private expand(): void {\n this.state.collapsed = false;\n this.panel.classList.add('expanded');\n }\n\n /**\n * Collapse the panel\n */\n private collapse(): void {\n this.state.collapsed = true;\n this.panel.classList.remove('expanded');\n }\n\n /**\n * Build layer items (called initially and when layers change)\n */\n private buildLayerItems(): void {\n // Clear existing items\n const existingItems = this.panel.querySelectorAll('.layer-control-item');\n existingItems.forEach(item => item.remove());\n this.styleEditors.clear();\n\n // Add items for all layers in our state\n Object.entries(this.state.layerStates).forEach(([layerId, state]) => {\n if (this.targetLayers.length === 0 || this.targetLayers.includes(layerId)) {\n this.addLayerItem(layerId, state);\n }\n });\n }\n\n /**\n * Add a single layer item to the panel\n */\n private addLayerItem(layerId: string, state: LayerState): void {\n const item = document.createElement('div');\n item.className = 'layer-control-item';\n item.setAttribute('data-layer-id', layerId);\n\n const row = document.createElement('div');\n row.className = 'layer-control-row';\n\n // Visibility checkbox\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'layer-control-checkbox';\n checkbox.checked = state.visible;\n checkbox.addEventListener('change', () => {\n this.toggleLayerVisibility(layerId, checkbox.checked);\n });\n\n // Layer name\n const name = document.createElement('span');\n name.className = 'layer-control-name';\n name.textContent = state.name || layerId;\n name.title = state.name || layerId;\n\n // Opacity slider\n const opacity = document.createElement('input');\n opacity.type = 'range';\n opacity.className = 'layer-control-opacity';\n opacity.min = '0';\n opacity.max = '1';\n opacity.step = '0.01';\n opacity.value = String(state.opacity);\n opacity.title = `Opacity: ${Math.round(state.opacity * 100)}%`;\n\n // Handle slider interaction tracking\n opacity.addEventListener('mousedown', () => {\n this.state.userInteractingWithSlider = true;\n });\n opacity.addEventListener('mouseup', () => {\n this.state.userInteractingWithSlider = false;\n });\n\n opacity.addEventListener('input', () => {\n this.changeLayerOpacity(layerId, parseFloat(opacity.value));\n opacity.title = `Opacity: ${Math.round(parseFloat(opacity.value) * 100)}%`;\n });\n\n row.appendChild(checkbox);\n row.appendChild(name);\n row.appendChild(opacity);\n\n // Style button (only for non-Background layers)\n if (layerId !== 'Background') {\n const styleButton = this.createStyleButton(layerId);\n if (styleButton) {\n row.appendChild(styleButton);\n }\n }\n\n item.appendChild(row);\n this.panel.appendChild(item);\n }\n\n /**\n * Toggle layer visibility\n */\n private toggleLayerVisibility(layerId: string, visible: boolean): void {\n // Handle Background layer group\n if (layerId === 'Background') {\n this.toggleBackgroundVisibility(visible);\n return;\n }\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].visible = visible;\n }\n\n // Update map\n this.map.setLayoutProperty(layerId, 'visibility', visible ? 'visible' : 'none');\n }\n\n /**\n * Change layer opacity\n */\n private changeLayerOpacity(layerId: string, opacity: number): void {\n // Handle Background layer group\n if (layerId === 'Background') {\n this.changeBackgroundOpacity(opacity);\n return;\n }\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].opacity = opacity;\n }\n\n // Get layer type and set appropriate opacity property\n const layerType = getLayerType(this.map, layerId);\n if (layerType) {\n setLayerOpacity(this.map, layerId, layerType, opacity);\n }\n }\n\n /**\n * Check if a layer is a user-added layer (vs basemap layer)\n */\n private isUserAddedLayer(layerId: string): boolean {\n return this.state.layerStates[layerId] !== undefined && layerId !== 'Background';\n }\n\n /**\n * Toggle visibility for all background layers (basemap layers)\n */\n private toggleBackgroundVisibility(visible: boolean): void {\n // Update local state\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].visible = visible;\n }\n\n // Apply to all basemap layers (layers not in layerStates)\n const styleLayers = this.map.getStyle().layers || [];\n styleLayers.forEach(layer => {\n if (!this.isUserAddedLayer(layer.id)) {\n this.map.setLayoutProperty(layer.id, 'visibility', visible ? 'visible' : 'none');\n }\n });\n }\n\n /**\n * Change opacity for all background layers (basemap layers)\n */\n private changeBackgroundOpacity(opacity: number): void {\n // Update local state\n if (this.state.layerStates['Background']) {\n this.state.layerStates['Background'].opacity = opacity;\n }\n\n // Apply to all basemap layers (layers not in layerStates)\n const styleLayers = this.map.getStyle().layers || [];\n styleLayers.forEach(styleLayer => {\n if (!this.isUserAddedLayer(styleLayer.id)) {\n const layerType = getLayerType(this.map, styleLayer.id);\n if (layerType) {\n setLayerOpacity(this.map, styleLayer.id, layerType, opacity);\n }\n }\n });\n }\n\n /**\n * Create style button for a layer\n */\n private createStyleButton(layerId: string): HTMLButtonElement | null {\n // Don't create button for Background layer\n if (layerId === 'Background') {\n return null;\n }\n\n const button = document.createElement('button');\n button.className = 'layer-control-style-button';\n button.innerHTML = '⚙'; // Gear icon\n button.title = 'Edit layer style';\n button.setAttribute('aria-label', `Edit style for ${layerId}`);\n\n button.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleStyleEditor(layerId);\n });\n\n return button;\n }\n\n /**\n * Toggle style editor for a layer\n */\n private toggleStyleEditor(layerId: string): void {\n // If this editor is already open, close it\n if (this.state.activeStyleEditor === layerId) {\n this.closeStyleEditor(layerId);\n return;\n }\n\n // Close any other open editor\n if (this.state.activeStyleEditor) {\n this.closeStyleEditor(this.state.activeStyleEditor);\n }\n\n // Open this editor\n this.openStyleEditor(layerId);\n }\n\n /**\n * Open style editor for a layer\n */\n private openStyleEditor(layerId: string): void {\n const itemEl = this.panel.querySelector(`[data-layer-id=\"${layerId}\"]`);\n if (!itemEl) return;\n\n // Cache original style if not already cached\n if (!this.state.originalStyles.has(layerId)) {\n const layer = this.map.getLayer(layerId);\n if (layer) {\n cacheOriginalLayerStyle(this.map, layerId, this.state.originalStyles);\n }\n }\n\n // Create style editor UI\n const editor = this.createStyleEditor(layerId);\n if (!editor) return;\n\n itemEl.appendChild(editor);\n this.styleEditors.set(layerId, editor);\n this.state.activeStyleEditor = layerId;\n\n // Scroll editor into view\n setTimeout(() => {\n editor.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n\n /**\n * Close style editor for a layer\n */\n private closeStyleEditor(layerId: string): void {\n const editor = this.styleEditors.get(layerId);\n if (editor) {\n editor.remove();\n this.styleEditors.delete(layerId);\n }\n\n if (this.state.activeStyleEditor === layerId) {\n this.state.activeStyleEditor = null;\n }\n }\n\n /**\n * Create style editor UI\n */\n private createStyleEditor(layerId: string): HTMLDivElement | null {\n const layer = this.map.getLayer(layerId);\n if (!layer) return null;\n\n const editor = document.createElement('div');\n editor.className = 'layer-control-style-editor';\n\n // Header\n const header = document.createElement('div');\n header.className = 'style-editor-header';\n\n const title = document.createElement('span');\n title.className = 'style-editor-title';\n title.textContent = 'Edit Style';\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'style-editor-close';\n closeBtn.innerHTML = '×';\n closeBtn.title = 'Close';\n closeBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeStyleEditor(layerId);\n });\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // Controls container - populate based on layer type\n const controls = document.createElement('div');\n controls.className = 'style-editor-controls';\n\n const layerType = layer.type;\n this.addStyleControlsForLayerType(controls, layerId, layerType);\n\n // Action buttons\n const actions = document.createElement('div');\n actions.className = 'style-editor-actions';\n\n const resetBtn = document.createElement('button');\n resetBtn.className = 'style-editor-button style-editor-button-reset';\n resetBtn.textContent = 'Reset';\n resetBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.resetLayerStyle(layerId);\n });\n\n const closeActionBtn = document.createElement('button');\n closeActionBtn.className = 'style-editor-button style-editor-button-close';\n closeActionBtn.textContent = 'Close';\n closeActionBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this.closeStyleEditor(layerId);\n });\n\n actions.appendChild(resetBtn);\n actions.appendChild(closeActionBtn);\n\n editor.appendChild(header);\n editor.appendChild(controls);\n editor.appendChild(actions);\n\n return editor;\n }\n\n /**\n * Add style controls based on layer type\n */\n private addStyleControlsForLayerType(container: HTMLElement, layerId: string, layerType: string): void {\n switch (layerType) {\n case 'fill':\n this.addFillControls(container, layerId);\n break;\n case 'line':\n this.addLineControls(container, layerId);\n break;\n case 'circle':\n this.addCircleControls(container, layerId);\n break;\n case 'raster':\n this.addRasterControls(container, layerId);\n break;\n case 'symbol':\n this.addSymbolControls(container, layerId);\n break;\n default:\n container.textContent = `Style controls for ${layerType} layers not yet implemented.`;\n }\n }\n\n /**\n * Add controls for fill layers\n */\n private addFillControls(container: HTMLElement, layerId: string): void {\n // Fill Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let fillColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'fill-color' in layer.paint) {\n fillColor = layer.paint['fill-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!fillColor) {\n fillColor = this.map.getPaintProperty(layerId, 'fill-color');\n }\n\n this.createColorControl(container, layerId, 'fill-color', 'Fill Color', normalizeColor(fillColor || '#088'));\n\n // Fill Opacity\n const fillOpacity = this.map.getPaintProperty(layerId, 'fill-opacity');\n if (fillOpacity !== undefined && typeof fillOpacity === 'number') {\n this.createSliderControl(container, layerId, 'fill-opacity', 'Fill Opacity', fillOpacity, 0, 1, 0.05);\n }\n\n // Fill Outline Color\n const outlineColor = this.map.getPaintProperty(layerId, 'fill-outline-color');\n if (outlineColor !== undefined) {\n this.createColorControl(container, layerId, 'fill-outline-color', 'Outline Color', normalizeColor(outlineColor));\n }\n }\n\n /**\n * Add controls for line layers\n */\n private addLineControls(container: HTMLElement, layerId: string): void {\n // Line Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let lineColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'line-color' in layer.paint) {\n lineColor = layer.paint['line-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!lineColor) {\n lineColor = this.map.getPaintProperty(layerId, 'line-color');\n }\n\n this.createColorControl(container, layerId, 'line-color', 'Line Color', normalizeColor(lineColor || '#000'));\n\n // Line Width\n const lineWidth = this.map.getPaintProperty(layerId, 'line-width');\n this.createSliderControl(container, layerId, 'line-width', 'Line Width', typeof lineWidth === 'number' ? lineWidth : 1, 0, 20, 0.5);\n\n // Line Opacity\n const lineOpacity = this.map.getPaintProperty(layerId, 'line-opacity');\n if (lineOpacity !== undefined && typeof lineOpacity === 'number') {\n this.createSliderControl(container, layerId, 'line-opacity', 'Line Opacity', lineOpacity, 0, 1, 0.05);\n }\n\n // Line Blur\n const lineBlur = this.map.getPaintProperty(layerId, 'line-blur');\n if (lineBlur !== undefined && typeof lineBlur === 'number') {\n this.createSliderControl(container, layerId, 'line-blur', 'Line Blur', lineBlur, 0, 5, 0.1);\n }\n }\n\n /**\n * Add controls for circle layers\n */\n private addCircleControls(container: HTMLElement, layerId: string): void {\n // Circle Color - try layer definition first, then runtime property\n const style = this.map.getStyle();\n const layer = style.layers?.find(l => l.id === layerId);\n let circleColor: any = undefined;\n\n // First try to get from layer definition\n if (layer && 'paint' in layer && layer.paint && 'circle-color' in layer.paint) {\n circleColor = layer.paint['circle-color'];\n }\n\n // Fallback to runtime property if not in definition\n if (!circleColor) {\n circleColor = this.map.getPaintProperty(layerId, 'circle-color');\n }\n\n this.createColorControl(container, layerId, 'circle-color', 'Circle Color', normalizeColor(circleColor || '#000'));\n\n // Circle Radius\n const circleRadius = this.map.getPaintProperty(layerId, 'circle-radius');\n this.createSliderControl(container, layerId, 'circle-radius', 'Radius', typeof circleRadius === 'number' ? circleRadius : 5, 0, 40, 0.5);\n\n // Circle Opacity\n const circleOpacity = this.map.getPaintProperty(layerId, 'circle-opacity');\n if (circleOpacity !== undefined && typeof circleOpacity === 'number') {\n this.createSliderControl(container, layerId, 'circle-opacity', 'Opacity', circleOpacity, 0, 1, 0.05);\n }\n\n // Circle Stroke Color\n const strokeColor = this.map.getPaintProperty(layerId, 'circle-stroke-color');\n if (strokeColor !== undefined) {\n this.createColorControl(container, layerId, 'circle-stroke-color', 'Stroke Color', normalizeColor(strokeColor));\n }\n\n // Circle Stroke Width\n const strokeWidth = this.map.getPaintProperty(layerId, 'circle-stroke-width');\n if (strokeWidth !== undefined && typeof strokeWidth === 'number') {\n this.createSliderControl(container, layerId, 'circle-stroke-width', 'Stroke Width', strokeWidth, 0, 10, 0.1);\n }\n }\n\n /**\n * Add controls for raster layers\n */\n private addRasterControls(container: HTMLElement, layerId: string): void {\n // Raster Opacity\n const rasterOpacity = this.map.getPaintProperty(layerId, 'raster-opacity');\n this.createSliderControl(container, layerId, 'raster-opacity', 'Opacity', typeof rasterOpacity === 'number' ? rasterOpacity : 1, 0, 1, 0.05);\n\n // Raster Brightness Min\n const brightnessMin = this.map.getPaintProperty(layerId, 'raster-brightness-min');\n this.createSliderControl(container, layerId, 'raster-brightness-min', 'Brightness Min', typeof brightnessMin === 'number' ? brightnessMin : 0, -1, 1, 0.05);\n\n // Raster Brightness Max\n const brightnessMax = this.map.getPaintProperty(layerId, 'raster-brightness-max');\n this.createSliderControl(container, layerId, 'raster-brightness-max', 'Brightness Max', typeof brightnessMax === 'number' ? brightnessMax : 1, -1, 1, 0.05);\n\n // Raster Saturation\n const saturation = this.map.getPaintProperty(layerId, 'raster-saturation');\n this.createSliderControl(container, layerId, 'raster-saturation', 'Saturation', typeof saturation === 'number' ? saturation : 0, -1, 1, 0.05);\n\n // Raster Contrast\n const contrast = this.map.getPaintProperty(layerId, 'raster-contrast');\n this.createSliderControl(container, layerId, 'raster-contrast', 'Contrast', typeof contrast === 'number' ? contrast : 0, -1, 1, 0.05);\n\n // Raster Hue Rotate\n const hueRotate = this.map.getPaintProperty(layerId, 'raster-hue-rotate');\n this.createSliderControl(container, layerId, 'raster-hue-rotate', 'Hue Rotate', typeof hueRotate === 'number' ? hueRotate : 0, 0, 360, 5);\n }\n\n /**\n * Add controls for symbol layers\n */\n private addSymbolControls(container: HTMLElement, layerId: string): void {\n // Text Color\n const textColor = this.map.getPaintProperty(layerId, 'text-color');\n if (textColor !== undefined) {\n this.createColorControl(container, layerId, 'text-color', 'Text Color', normalizeColor(textColor));\n }\n\n // Text Opacity\n const textOpacity = this.map.getPaintProperty(layerId, 'text-opacity');\n if (textOpacity !== undefined && typeof textOpacity === 'number') {\n this.createSliderControl(container, layerId, 'text-opacity', 'Text Opacity', textOpacity, 0, 1, 0.05);\n }\n\n // Icon Opacity\n const iconOpacity = this.map.getPaintProperty(layerId, 'icon-opacity');\n if (iconOpacity !== undefined && typeof iconOpacity === 'number') {\n this.createSliderControl(container, layerId, 'icon-opacity', 'Icon Opacity', iconOpacity, 0, 1, 0.05);\n }\n }\n\n /**\n * Create a color control\n */\n private createColorControl(\n container: HTMLElement,\n layerId: string,\n property: string,\n label: string,\n initialValue: string\n ): void {\n const controlGroup = document.createElement('div');\n controlGroup.className = 'style-control-group';\n\n const labelEl = document.createElement('label');\n labelEl.className = 'style-control-label';\n labelEl.textContent = label;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.className = 'style-control-color-group';\n\n const colorInput = document.createElement('input');\n colorInput.type = 'color';\n colorInput.className = 'style-control-color-picker';\n colorInput.value = initialValue;\n colorInput.dataset.property = property;\n\n const hexDisplay = document.createElement('input');\n hexDisplay.type = 'text';\n hexDisplay.className = 'style-control-color-value';\n hexDisplay.value = initialValue;\n hexDisplay.readOnly = true;\n\n colorInput.addEventListener('input', () => {\n const color = colorInput.value;\n hexDisplay.value = color;\n this.map.setPaintProperty(layerId, property, color);\n });\n\n inputWrapper.appendChild(colorInput);\n inputWrapper.appendChild(hexDisplay);\n\n controlGroup.appendChild(labelEl);\n controlGroup.appendChild(inputWrapper);\n\n container.appendChild(controlGroup);\n }\n\n /**\n * Create a slider control\n */\n private createSliderControl(\n container: HTMLElement,\n layerId: string,\n property: string,\n label: string,\n initialValue: number,\n min: number,\n max: number,\n step: number\n ): void {\n const controlGroup = document.createElement('div');\n controlGroup.className = 'style-control-group';\n\n const labelEl = document.createElement('label');\n labelEl.className = 'style-control-label';\n labelEl.textContent = label;\n\n const inputWrapper = document.createElement('div');\n inputWrapper.className = 'style-control-input-wrapper';\n\n const slider = document.createElement('input');\n slider.type = 'range';\n slider.className = 'style-control-slider';\n slider.min = String(min);\n slider.max = String(max);\n slider.step = String(step);\n slider.value = String(initialValue);\n slider.dataset.property = property;\n\n const valueDisplay = document.createElement('span');\n valueDisplay.className = 'style-control-value';\n valueDisplay.textContent = formatNumericValue(initialValue, step);\n\n slider.addEventListener('input', () => {\n const value = parseFloat(slider.value);\n valueDisplay.textContent = formatNumericValue(value, step);\n this.map.setPaintProperty(layerId, property, value);\n });\n\n inputWrapper.appendChild(slider);\n inputWrapper.appendChild(valueDisplay);\n\n controlGroup.appendChild(labelEl);\n controlGroup.appendChild(inputWrapper);\n\n container.appendChild(controlGroup);\n }\n\n /**\n * Reset layer style to original\n */\n private resetLayerStyle(layerId: string): void {\n const originalStyle = this.state.originalStyles.get(layerId);\n if (!originalStyle) return;\n\n // Restore original paint properties\n restoreOriginalStyle(this.map, layerId, this.state.originalStyles);\n\n // Update UI controls to reflect the reset values\n const editor = this.styleEditors.get(layerId);\n if (editor) {\n // Update all slider controls\n const sliders = editor.querySelectorAll('.style-control-slider') as NodeListOf<HTMLInputElement>;\n sliders.forEach(slider => {\n const property = slider.dataset.property;\n if (property) {\n const value = this.map.getPaintProperty(layerId, property);\n if (value !== undefined && typeof value === 'number') {\n slider.value = String(value);\n // Update value display\n const valueDisplay = slider.parentElement?.querySelector('.style-control-value');\n if (valueDisplay) {\n const step = parseFloat(slider.step);\n valueDisplay.textContent = formatNumericValue(value, step);\n }\n }\n }\n });\n\n // Update all color controls\n const colorPickers = editor.querySelectorAll('.style-control-color-picker') as NodeListOf<HTMLInputElement>;\n colorPickers.forEach(picker => {\n const property = picker.dataset.property;\n if (property) {\n const value = this.map.getPaintProperty(layerId, property);\n if (value !== undefined) {\n const hexColor = normalizeColor(value);\n picker.value = hexColor;\n // Update hex display\n const hexDisplay = picker.parentElement?.querySelector('.style-control-color-value');\n if (hexDisplay) {\n hexDisplay.textContent = hexColor;\n }\n }\n }\n });\n }\n }\n\n /**\n * Update layer states from map (sync UI with map)\n */\n private updateLayerStatesFromMap(): void {\n if (this.state.userInteractingWithSlider) {\n return; // Don't update while user is dragging\n }\n\n Object.keys(this.state.layerStates).forEach(layerId => {\n try {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Check visibility\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Get opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n\n // Update local state\n if (this.state.layerStates[layerId]) {\n this.state.layerStates[layerId].visible = isVisible;\n this.state.layerStates[layerId].opacity = opacity;\n }\n\n // Update UI\n this.updateUIForLayer(layerId, isVisible, opacity);\n } catch (error) {\n console.warn(`Failed to update state for layer ${layerId}:`, error);\n }\n });\n }\n\n /**\n * Update UI elements for a specific layer\n */\n private updateUIForLayer(layerId: string, visible: boolean, opacity: number): void {\n const layerItems = this.panel.querySelectorAll('.layer-control-item');\n\n layerItems.forEach(item => {\n if ((item as HTMLElement).dataset.layerId === layerId) {\n const checkbox = item.querySelector('.layer-control-checkbox') as HTMLInputElement;\n const opacitySlider = item.querySelector('.layer-control-opacity') as HTMLInputElement;\n\n if (checkbox) {\n checkbox.checked = visible;\n }\n\n if (opacitySlider) {\n opacitySlider.value = String(opacity);\n opacitySlider.title = `Opacity: ${Math.round(opacity * 100)}%`;\n }\n }\n });\n }\n\n /**\n * Check for new layers and add them to the control\n */\n private checkForNewLayers(): void {\n try {\n const style = this.map.getStyle();\n if (!style || !style.layers) {\n return;\n }\n\n const currentMapLayers = style.layers\n .map(layer => layer.id)\n .filter(id => {\n // Exclude basemap layers (those not in layerStates initially)\n // Include only user-added layers\n if (this.targetLayers.length > 0) {\n return this.targetLayers.includes(id);\n }\n return true;\n });\n\n // Find new layers that aren't in our state yet\n const newLayers: string[] = [];\n currentMapLayers.forEach(layerId => {\n if (layerId !== 'Background' && !this.state.layerStates[layerId]) {\n const layer = this.map.getLayer(layerId);\n if (layer) {\n newLayers.push(layerId);\n }\n }\n });\n\n // Add UI for new layers\n if (newLayers.length > 0) {\n newLayers.forEach(layerId => {\n const layer = this.map.getLayer(layerId);\n if (!layer) return;\n\n // Get layer type and opacity\n const layerType = layer.type;\n const opacity = getLayerOpacity(this.map, layerId, layerType);\n const visibility = this.map.getLayoutProperty(layerId, 'visibility');\n const isVisible = visibility !== 'none';\n\n // Add to state\n this.state.layerStates[layerId] = {\n visible: isVisible,\n opacity: opacity,\n name: layerId.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase()),\n };\n\n // Add to UI\n this.addLayerItem(layerId, this.state.layerStates[layerId]);\n });\n }\n } catch (error) {\n console.warn('Failed to check for new layers:', error);\n }\n }\n}\n"],"names":["opacity","clamp"],"mappings":";;;AAQO,SAAS,mBAAmB,WAAsC;AACvE,UAAQ,WAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAEH,aAAO,CAAC,gBAAgB,cAAc;AAAA,IACxC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,GAAG,SAAS;AAAA,EAAA;AAEzB;AASO,SAAS,gBACd,KACA,SACA,WACQ;AACR,QAAM,cAAc,mBAAmB,SAAS;AAEhD,MAAI,MAAM,QAAQ,WAAW,GAAG;AAE9B,UAAMA,WAAU,IAAI,iBAAiB,SAAS,YAAY,CAAC,CAAC;AAC5D,WAAQA,aAAY,UAAaA,aAAY,OAAQA,WAAoB;AAAA,EAC3E;AAEA,QAAM,UAAU,IAAI,iBAAiB,SAAS,WAAW;AACzD,SAAQ,YAAY,UAAa,YAAY,OAAQ,UAAoB;AAC3E;AASO,SAAS,gBACd,KACA,SACA,WACA,SACM;AACN,QAAM,cAAc,mBAAmB,SAAS;AAEhD,MAAI,MAAM,QAAQ,WAAW,GAAG;AAE9B,gBAAY,QAAQ,CAAC,SAAS;AAC5B,UAAI,iBAAiB,SAAS,MAAM,OAAO;AAAA,IAC7C,CAAC;AAAA,EACH,OAAO;AACL,QAAI,iBAAiB,SAAS,aAAa,OAAO;AAAA,EACpD;AACF;AAOO,SAAS,qBAAqB,WAAoD;AACvF,SAAO,CAAC,QAAQ,QAAQ,UAAU,UAAU,QAAQ,EAAE,SAAS,SAAS;AAC1E;AAQO,SAAS,aAAa,KAAkB,SAAgC;AAC7E,MAAI;AACF,UAAM,QAAQ,IAAI,SAAS,OAAO;AAClC,WAAO,QAAQ,MAAM,OAAO;AAAA,EAC9B,SAAS,OAAO;AACd,YAAQ,KAAK,gCAAgC,OAAO,KAAK,KAAK;AAC9D,WAAO;AAAA,EACT;AACF;AC5FO,SAAS,gBAAgB,OAAiB;AAC/C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC;AAAA,EAClD;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,QAAI;AACF,aAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAAA,IACzC,SAAS,OAAO;AACd,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,wBACd,KACA,SACA,gBACM;ADxBD;ACyBL,MAAI,eAAe,IAAI,OAAO,GAAG;AAC/B;AAAA,EACF;AAEA,MAAI;AACF,UAAM,QAAQ,IAAI,SAAS,OAAO;AAClC,QAAI,CAAC,OAAO;AACV;AAAA,IACF;AAEA,UAAM,QAA6B,CAAA;AACnC,UAAM,QAAQ,IAAI,SAAA;AAClB,UAAM,YAAW,WAAM,WAAN,mBAAc,KAAK,CAAA,MAAK,EAAE,OAAO;AAGlD,QAAI,MAAM,SAAS,UAAU;AAE3B,YAAM,iBAAyC;AAAA,QAC7C,kBAAkB;AAAA,QAClB,yBAAyB;AAAA,QACzB,yBAAyB;AAAA,QACzB,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,QACnB,qBAAqB;AAAA,MAAA;AAIvB,aAAO,OAAO,OAAO,cAAc;AAGnC,UAAI,YAAY,WAAW,YAAY,SAAS,OAAO;AACrD,eAAO,QAAQ,SAAS,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AACxD,cAAI,KAAK,WAAW,SAAS,GAAG;AAC9B,kBAAM,IAAI,IAAI,gBAAgB,KAAK;AAAA,UACrC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,UAAI,YAAY,WAAW,YAAY,SAAS,OAAO;AACrD,eAAO,QAAQ,SAAS,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,MAAM;AACxD,gBAAM,IAAI,IAAI,gBAAgB,KAAK;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,mBAAe,IAAI,SAAS,EAAE,MAAA,CAAO;AAAA,EACvC,SAAS,OAAO;AACd,YAAQ,KAAK,sCAAsC,OAAO,KAAK,KAAK;AAAA,EACtE;AACF;AA+BO,SAAS,qBACd,KACA,SACA,gBACqB;AACrB,QAAM,WAAW,eAAe,IAAI,OAAO;AAC3C,MAAI,CAAC,UAAU;AACb,WAAO,CAAA;AAAA,EACT;AAEA,QAAM,UAA+B,CAAA;AAErC,SAAO,QAAQ,SAAS,KAAK,EAAE,QAAQ,CAAC,CAAC,UAAU,KAAK,MAAM;AAC5D,QAAI;AACF,YAAM,gBAAgB,gBAAgB,KAAK;AAC3C,UAAI,iBAAiB,SAAS,UAAU,aAAa;AACrD,cAAQ,QAAQ,IAAI;AAAA,IACtB,SAAS,OAAO;AACd,cAAQ,KAAK,qBAAqB,QAAQ,QAAQ,OAAO,KAAK,KAAK;AAAA,IACrE;AAAA,EACF,CAAC;AAED,SAAO;AACT;AClIO,SAAS,SAAS,GAAW,GAAW,GAAmB;AAChE,QAAMC,SAAQ,CAAC,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;AACrE,QAAM,QAAQ,CAAC,MAAc;AAC3B,UAAM,MAAMA,OAAM,CAAC,EAAE,SAAS,EAAE;AAChC,WAAO,IAAI,WAAW,IAAI,IAAI,GAAG,KAAK;AAAA,EACxC;AACA,SAAO,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAC3C;AAQO,SAAS,eAAe,OAAoB;AACjD,MAAI,OAAO,UAAU,UAAU;AAE7B,QAAI,MAAM,WAAW,GAAG,GAAG;AAEzB,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,IAAI,MAAM,CAAC;AACjB,cAAM,IAAI,MAAM,CAAC;AACjB,cAAM,IAAI,MAAM,CAAC;AACjB,eAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAAA,MAClC;AACA,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,WAAW,KAAK,GAAG;AAC3B,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,UAAI,SAAS,MAAM,UAAU,GAAG;AAC9B,cAAM,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,IAAI,CAAC,QAAQ,SAAS,KAAK,EAAE,CAAC;AACtD,eAAO,SAAS,GAAG,GAAG,CAAC;AAAA,MACzB;AAAA,IACF;AAAA,EACF,WAAW,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,GAAG;AAEpD,WAAO,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EAC9C;AAGA,SAAO;AACT;AC7CO,SAAS,mBAAmB,OAAe,MAAsB;AACtE,MAAI,WAAW;AAEf,MAAI,QAAQ,OAAO,IAAI,MAAM,GAAG;AAC9B,UAAM,aAAa,OAAO,IAAI;AAC9B,QAAI,aAAa,KAAK,aAAa,GAAG;AACpC,iBAAW,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,UAAU,CAAC,CAAC,CAAC;AAAA,IACpE;AAAA,EACF;AAEA,SAAO,MAAM,QAAQ,QAAQ;AAC/B;AASO,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;ACZO,MAAM,aAAiC;AAAA,EAuB5C,YAAY,UAA+B,IAAI;AAtBvC;AACA;AACA;AACA;AAGA;AAAA;AACA;AACA;AAGA;AAAA;AACA;AACA,yCAAoC;AACpC,wCAAmC;AACnC,wCAAmC;AACnC,+CAAsB;AACtB,8CAAoC;AACpC,2CAAiC;AACjC,+CAAqC;AACrC,sCAA4B;AAGlC,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,gBAAgB,QAAQ,iBAAiB;AAE9C,SAAK,QAAQ;AAAA,MACX,WAAW,QAAQ,cAAc;AAAA,MACjC,YAAY,QAAQ,cAAc;AAAA,MAClC,mBAAmB;AAAA,MACnB,aAAa,QAAQ,eAAe,CAAA;AAAA,MACpC,oCAAoB,IAAA;AAAA,MACpB,2BAA2B;AAAA,IAAA;AAG7B,SAAK,eAAe,QAAQ,UAAU,OAAO,KAAK,KAAK,MAAM,WAAW;AACxE,SAAK,mCAAmB,IAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAA+B;AACnC,SAAK,MAAM;AAGX,QAAI,OAAO,KAAK,KAAK,MAAM,WAAW,EAAE,WAAW,GAAG;AACpD,WAAK,iBAAA;AAAA,IACP;AAEA,SAAK,YAAY,KAAK,gBAAA;AACtB,SAAK,SAAS,KAAK,mBAAA;AACnB,SAAK,QAAQ,KAAK,YAAA;AAElB,SAAK,UAAU,YAAY,KAAK,MAAM;AACtC,SAAK,UAAU,YAAY,KAAK,KAAK;AAGrC,SAAK,mBAAA;AAGL,SAAK,oBAAA;AAGL,SAAK,gBAAA;AAEL,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AJjFZ;AIkFH,eAAK,UAAU,eAAf,mBAA2B,YAAY,KAAK;AAAA,EAE9C;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAyB;AAC/B,UAAM,QAAQ,KAAK,IAAI,SAAA;AACvB,QAAI,CAAC,SAAS,CAAC,MAAM,QAAQ;AAC3B;AAAA,IACF;AAGA,UAAM,cAAc,MAAM,OAAO,IAAI,CAAA,UAAS,MAAM,EAAE;AAEtD,QAAI,KAAK,aAAa,WAAW,GAAG;AAElC,kBAAY,QAAQ,CAAA,YAAW;AAC7B,cAAM,QAAQ,KAAK,IAAI,SAAS,OAAO;AACvC,YAAI,CAAC,MAAO;AAGZ,cAAM,aAAa,KAAK,IAAI,kBAAkB,SAAS,YAAY;AACnE,cAAM,YAAY,eAAe;AAGjC,cAAM,YAAY,MAAM;AACxB,cAAM,UAAU,gBAAgB,KAAK,KAAK,SAAS,SAAS;AAG5D,cAAM,eAAe,KAAK,qBAAqB,OAAO;AAEtD,aAAK,MAAM,YAAY,OAAO,IAAI;AAAA,UAChC,SAAS;AAAA,UACT;AAAA,UACA,MAAM;AAAA,QAAA;AAAA,MAEV,CAAC;AAAA,IACH,OAAO;AAEL,YAAM,aAAuB,CAAA;AAC7B,YAAM,gBAA0B,CAAA;AAEhC,kBAAY,QAAQ,CAAA,YAAW;AAC7B,YAAI,KAAK,aAAa,SAAS,OAAO,GAAG;AACvC,qBAAW,KAAK,OAAO;AAAA,QACzB,OAAO;AACL,wBAAc,KAAK,OAAO;AAAA,QAC5B;AAAA,MACF,CAAC;AAGD,UAAI,cAAc,SAAS,GAAG;AAC5B,aAAK,MAAM,YAAY,YAAY,IAAI;AAAA,UACrC,SAAS;AAAA,UACT,SAAS;AAAA,UACT,MAAM;AAAA,QAAA;AAAA,MAEV;AAGA,iBAAW,QAAQ,CAAA,YAAW;AAC5B,cAAM,QAAQ,KAAK,IAAI,SAAS,OAAO;AACvC,YAAI,CAAC,MAAO;AAGZ,cAAM,aAAa,KAAK,IAAI,kBAAkB,SAAS,YAAY;AACnE,cAAM,YAAY,eAAe;AAGjC,cAAM,YAAY,MAAM;AACxB,cAAM,UAAU,gBAAgB,KAAK,KAAK,SAAS,SAAS;AAG5D,cAAM,eAAe,KAAK,qBAAqB,OAAO;AAEtD,aAAK,MAAM,YAAY,OAAO,IAAI;AAAA,UAChC,SAAS;AAAA,UACT;AAAA,UACA,MAAM;AAAA,QAAA;AAAA,MAEV,CAAC;AAAA,IACH;AAGA,SAAK,eAAe,OAAO,KAAK,KAAK,MAAM,WAAW;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,SAAyB;AAEpD,QAAI,OAAO,QAAQ,QAAQ,yBAAyB,EAAE;AAGtD,WAAO,KAAK,QAAQ,SAAS,GAAG;AAGhC,WAAO,KAAK,QAAQ,SAAS,CAAA,SAAQ,KAAK,aAAa;AAEvD,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkC;AACxC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,YAAY;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAwC;AAC9C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,OAAO;AACd,WAAO,QAAQ;AACf,WAAO,aAAa,cAAc,eAAe;AAGjD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,YACH;AAOF,WAAO,YAAY,IAAI;AACvB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAA8B;AACpC,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAGlB,UAAM,MAAM,QAAQ,GAAG,KAAK,MAAM,UAAU;AAE5C,QAAI,CAAC,KAAK,MAAM,WAAW;AACzB,YAAM,UAAU,IAAI,UAAU;AAAA,IAChC;AAGA,UAAM,SAAS,KAAK,kBAAA;AACpB,UAAM,YAAY,MAAM;AAExB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAiC;AACvC,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAEnB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,YAAY;AAClB,UAAM,cAAc;AACpB,WAAO,YAAY,KAAK;AAGxB,UAAM,eAAe,KAAK,mBAAA;AAC1B,WAAO,YAAY,YAAY;AAE/B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAkC;AACxC,UAAM,eAAe,SAAS,cAAc,OAAO;AACnD,iBAAa,YAAY;AACzB,iBAAa,QAAQ;AAErB,UAAM,aAAa,SAAS,cAAc,MAAM;AAChD,eAAW,cAAc;AACzB,iBAAa,YAAY,UAAU;AAEnC,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,YAAY;AACxB,gBAAY,aAAa,QAAQ,QAAQ;AACzC,gBAAY,aAAa,iBAAiB,OAAO,KAAK,aAAa,CAAC;AACpE,gBAAY,aAAa,iBAAiB,OAAO,KAAK,aAAa,CAAC;AACpE,gBAAY,aAAa,iBAAiB,OAAO,KAAK,MAAM,UAAU,CAAC;AACvE,gBAAY,aAAa,kBAAkB,IAAI;AAC/C,gBAAY,aAAa,cAAc,mBAAmB;AAC1D,gBAAY,WAAW;AAEvB,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAW,YAAY;AACvB,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAW,YAAY;AAEvB,gBAAY,YAAY,UAAU;AAClC,gBAAY,YAAY,UAAU;AAElC,SAAK,gBAAgB;AACrB,SAAK,eAAe;AAGpB,UAAM,aAAa,SAAS,cAAc,MAAM;AAChD,eAAW,YAAY;AACvB,SAAK,eAAe;AAEpB,iBAAa,YAAY,WAAW;AACpC,iBAAa,YAAY,UAAU;AAEnC,SAAK,mBAAA;AACL,SAAK,uBAAuB,WAAW;AAEvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,aAAgC;AAE7D,gBAAY,iBAAiB,eAAe,CAAC,UAAU;AACrD,YAAM,eAAA;AACN,YAAM,OAAO,YAAY,sBAAA;AACzB,WAAK,qBAAqB,KAAK,SAAS;AACxC,WAAK,kBAAkB,MAAM;AAC7B,WAAK,sBAAsB,KAAK,MAAM;AACtC,WAAK,sBAAsB;AAC3B,kBAAY,kBAAkB,MAAM,SAAS;AAC7C,WAAK,uBAAuB,OAAO,IAAI;AAAA,IACzC,CAAC;AAED,gBAAY,iBAAiB,eAAe,CAAC,UAAU;AACrD,UAAI,CAAC,KAAK,oBAAqB;AAC/B,WAAK,uBAAuB,KAAK;AAAA,IACnC,CAAC;AAED,UAAM,iBAAiB,CAAC,UAAwB;AAC9C,UAAI,CAAC,KAAK,oBAAqB;AAC/B,UAAI,MAAM,cAAc,QAAW;AACjC,YAAI;AACF,sBAAY,sBAAsB,MAAM,SAAS;AAAA,QACnD,SAAS,OAAO;AAAA,QAEhB;AAAA,MACF;AACA,WAAK,sBAAsB;AAC3B,WAAK,qBAAqB;AAC1B,WAAK,kBAAkB;AACvB,WAAK,sBAAsB;AAC3B,WAAK,mBAAA;AAAA,IACP;AAEA,gBAAY,iBAAiB,aAAa,cAAc;AACxD,gBAAY,iBAAiB,iBAAiB,cAAc;AAC5D,gBAAY,iBAAiB,sBAAsB,cAAc;AAGjE,gBAAY,iBAAiB,WAAW,CAAC,UAAU;AACjD,UAAI,UAAU;AACd,YAAM,OAAO,MAAM,WAAW,KAAK;AAEnC,cAAQ,MAAM,KAAA;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AACH,eAAK,gBAAgB,KAAK,MAAM,aAAa,MAAM,IAAI;AACvD;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,eAAK,gBAAgB,KAAK,MAAM,aAAa,MAAM,IAAI;AACvD;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,KAAK,eAAe,IAAI;AAC7C;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,KAAK,eAAe,IAAI;AAC7C;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,KAAK,MAAM,aAAa,IAAI,IAAI;AACrD;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,KAAK,MAAM,aAAa,IAAI,IAAI;AACrD;AAAA,QACF;AACE,oBAAU;AAAA,MAAA;AAGd,UAAI,SAAS;AACX,cAAM,eAAA;AACN,aAAK,mBAAA;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,OAAqB,gBAAgB,OAAa;AAC/E,QAAI,CAAC,KAAK,cAAe;AAEzB,UAAM,cAAc,KAAK,sBAAsB,KAAK,cAAc,sBAAA,EAAwB,SAAS;AACnG,UAAM,aAAa,KAAK,gBAAgB,KAAK;AAE7C,QAAI;AACJ,QAAI,eAAe;AACjB,YAAM,OAAO,KAAK,cAAc,sBAAA;AAChC,YAAM,WAAW,KAAK,QAAQ,KAAK,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAQ;AAC7E,YAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC;AACtD,cAAQ,KAAK,gBAAgB,eAAe;AAC5C,WAAK,sBAAsB;AAC3B,WAAK,kBAAkB,MAAM;AAAA,IAC/B,OAAO;AACL,YAAM,QAAQ,MAAM,WAAW,KAAK,mBAAmB,MAAM;AAC7D,eAAS,KAAK,uBAAuB,KAAK,MAAM,cAAe,QAAQ,cAAe;AAAA,IACxF;AAEA,SAAK,gBAAgB,OAAO,KAAK,mBAAmB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAe,YAAY,OAAa;AAC9D,UAAM,UAAU,KAAK,MAAM,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,KAAK,eAAe,KAAK,CAAC,CAAC;AAE5F,UAAM,aAAa,MAAM;AACvB,WAAK,MAAM,aAAa;AACxB,YAAM,KAAK,GAAG,OAAO;AACrB,WAAK,MAAM,MAAM,QAAQ;AACzB,WAAK,mBAAA;AAAA,IACP;AAEA,QAAI,WAAW;AACb,iBAAA;AACA;AAAA,IACF;AAEA,QAAI,KAAK,YAAY;AACnB,2BAAqB,KAAK,UAAU;AAAA,IACtC;AACA,SAAK,aAAa,sBAAsB,MAAM;AAC5C,iBAAA;AACA,WAAK,aAAa;AAAA,IACpB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAA2B;AACjC,QAAI,KAAK,cAAc;AACrB,WAAK,aAAa,cAAc,GAAG,KAAK,MAAM,UAAU;AAAA,IAC1D;AACA,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,aAAa,iBAAiB,OAAO,KAAK,MAAM,UAAU,CAAC;AAC9E,YAAM,SAAS,KAAK,MAAM,aAAa,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,iBAAiB;AACzG,UAAI,KAAK,cAAc;AACrB,cAAM,cAAc,KAAK,cAAc,eAAe;AACtD,cAAM,aAAa,KAAK,aAAa,eAAe;AACpD,cAAM,UAAU;AAChB,cAAM,YAAY,KAAK,IAAI,GAAG,cAAc,UAAU,UAAU;AAChE,cAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACnD,cAAM,SAAS,IAAI,YAAY;AAC/B,aAAK,aAAa,MAAM,OAAO,GAAG,MAAM;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA4B;AAElC,SAAK,OAAO,iBAAiB,SAAS,MAAM,KAAK,QAAQ;AAGzD,aAAS,iBAAiB,SAAS,CAAC,MAAM;AACxC,UAAI,CAAC,KAAK,UAAU,SAAS,EAAE,MAAc,GAAG;AAC9C,aAAK,SAAA;AAAA,MACP;AAAA,IACF,CAAC;AAGD,SAAK,0BAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAkC;AACxC,SAAK,IAAI,GAAG,aAAa,MAAM;AAC7B,iBAAW,MAAM;AACf,aAAK,yBAAA;AACL,aAAK,kBAAA;AAAA,MACP,GAAG,GAAG;AAAA,IACR,CAAC;AAED,SAAK,IAAI,GAAG,QAAQ,CAAC,MAAM;AACzB,UAAI,EAAE,mBAAmB,WAAW;AAClC,mBAAW,MAAM;AACf,eAAK,yBAAA;AACL,eAAK,kBAAA;AAAA,QACP,GAAG,GAAG;AAAA,MACR;AAAA,IACF,CAAC;AAED,SAAK,IAAI,GAAG,cAAc,CAAC,MAAM;AAC/B,UAAI,EAAE,mBAAmB,YAAY;AACnC,mBAAW,MAAM;AACf,eAAK,kBAAA;AAAA,QACP,GAAG,GAAG;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAe;AACrB,QAAI,KAAK,MAAM,WAAW;AACxB,WAAK,OAAA;AAAA,IACP,OAAO;AACL,WAAK,SAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAe;AACrB,SAAK,MAAM,YAAY;AACvB,SAAK,MAAM,UAAU,IAAI,UAAU;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAiB;AACvB,SAAK,MAAM,YAAY;AACvB,SAAK,MAAM,UAAU,OAAO,UAAU;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAwB;AAE9B,UAAM,gBAAgB,KAAK,MAAM,iBAAiB,qBAAqB;AACvE,kBAAc,QAAQ,CAAA,SAAQ,KAAK,OAAA,CAAQ;AAC3C,SAAK,aAAa,MAAA;AAGlB,WAAO,QAAQ,KAAK,MAAM,WAAW,EAAE,QAAQ,CAAC,CAAC,SAAS,KAAK,MAAM;AACnE,UAAI,KAAK,aAAa,WAAW,KAAK,KAAK,aAAa,SAAS,OAAO,GAAG;AACzE,aAAK,aAAa,SAAS,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,SAAiB,OAAyB;AAC7D,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,SAAK,aAAa,iBAAiB,OAAO;AAE1C,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY;AAGhB,UAAM,WAAW,SAAS,cAAc,OAAO;AAC/C,aAAS,OAAO;AAChB,aAAS,YAAY;AACrB,aAAS,UAAU,MAAM;AACzB,aAAS,iBAAiB,UAAU,MAAM;AACxC,WAAK,sBAAsB,SAAS,SAAS,OAAO;AAAA,IACtD,CAAC;AAGD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,cAAc,MAAM,QAAQ;AACjC,SAAK,QAAQ,MAAM,QAAQ;AAG3B,UAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,YAAQ,OAAO;AACf,YAAQ,YAAY;AACpB,YAAQ,MAAM;AACd,YAAQ,MAAM;AACd,YAAQ,OAAO;AACf,YAAQ,QAAQ,OAAO,MAAM,OAAO;AACpC,YAAQ,QAAQ,YAAY,KAAK,MAAM,MAAM,UAAU,GAAG,CAAC;AAG3D,YAAQ,iBAAiB,aAAa,MAAM;AAC1C,WAAK,MAAM,4BAA4B;AAAA,IACzC,CAAC;AACD,YAAQ,iBAAiB,WAAW,MAAM;AACxC,WAAK,MAAM,4BAA4B;AAAA,IACzC,CAAC;AAED,YAAQ,iBAAiB,SAAS,MAAM;AACtC,WAAK,mBAAmB,SAAS,WAAW,QAAQ,KAAK,CAAC;AAC1D,cAAQ,QAAQ,YAAY,KAAK,MAAM,WAAW,QAAQ,KAAK,IAAI,GAAG,CAAC;AAAA,IACzE,CAAC;AAED,QAAI,YAAY,QAAQ;AACxB,QAAI,YAAY,IAAI;AACpB,QAAI,YAAY,OAAO;AAGvB,QAAI,YAAY,cAAc;AAC5B,YAAM,cAAc,KAAK,kBAAkB,OAAO;AAClD,UAAI,aAAa;AACf,YAAI,YAAY,WAAW;AAAA,MAC7B;AAAA,IACF;AAEA,SAAK,YAAY,GAAG;AACpB,SAAK,MAAM,YAAY,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,SAAiB,SAAwB;AAErE,QAAI,YAAY,cAAc;AAC5B,WAAK,2BAA2B,OAAO;AACvC;AAAA,IACF;AAGA,QAAI,KAAK,MAAM,YAAY,OAAO,GAAG;AACnC,WAAK,MAAM,YAAY,OAAO,EAAE,UAAU;AAAA,IAC5C;AAGA,SAAK,IAAI,kBAAkB,SAAS,cAAc,UAAU,YAAY,MAAM;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,SAAiB,SAAuB;AAEjE,QAAI,YAAY,cAAc;AAC5B,WAAK,wBAAwB,OAAO;AACpC;AAAA,IACF;AAGA,QAAI,KAAK,MAAM,YAAY,OAAO,GAAG;AACnC,WAAK,MAAM,YAAY,OAAO,EAAE,UAAU;AAAA,IAC5C;AAGA,UAAM,YAAY,aAAa,KAAK,KAAK,OAAO;AAChD,QAAI,WAAW;AACb,sBAAgB,KAAK,KAAK,SAAS,WAAW,OAAO;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAA0B;AACjD,WAAO,KAAK,MAAM,YAAY,OAAO,MAAM,UAAa,YAAY;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,SAAwB;AAEzD,QAAI,KAAK,MAAM,YAAY,YAAY,GAAG;AACxC,WAAK,MAAM,YAAY,YAAY,EAAE,UAAU;AAAA,IACjD;AAGA,UAAM,cAAc,KAAK,IAAI,SAAA,EAAW,UAAU,CAAA;AAClD,gBAAY,QAAQ,CAAA,UAAS;AAC3B,UAAI,CAAC,KAAK,iBAAiB,MAAM,EAAE,GAAG;AACpC,aAAK,IAAI,kBAAkB,MAAM,IAAI,cAAc,UAAU,YAAY,MAAM;AAAA,MACjF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,SAAuB;AAErD,QAAI,KAAK,MAAM,YAAY,YAAY,GAAG;AACxC,WAAK,MAAM,YAAY,YAAY,EAAE,UAAU;AAAA,IACjD;AAGA,UAAM,cAAc,KAAK,IAAI,SAAA,EAAW,UAAU,CAAA;AAClD,gBAAY,QAAQ,CAAA,eAAc;AAChC,UAAI,CAAC,KAAK,iBAAiB,WAAW,EAAE,GAAG;AACzC,cAAM,YAAY,aAAa,KAAK,KAAK,WAAW,EAAE;AACtD,YAAI,WAAW;AACb,0BAAgB,KAAK,KAAK,WAAW,IAAI,WAAW,OAAO;AAAA,QAC7D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAA2C;AAEnE,QAAI,YAAY,cAAc;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY;AACnB,WAAO,YAAY;AACnB,WAAO,QAAQ;AACf,WAAO,aAAa,cAAc,kBAAkB,OAAO,EAAE;AAE7D,WAAO,iBAAiB,SAAS,CAAC,MAAM;AACtC,QAAE,gBAAA;AACF,WAAK,kBAAkB,OAAO;AAAA,IAChC,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAuB;AAE/C,QAAI,KAAK,MAAM,sBAAsB,SAAS;AAC5C,WAAK,iBAAiB,OAAO;AAC7B;AAAA,IACF;AAGA,QAAI,KAAK,MAAM,mBAAmB;AAChC,WAAK,iBAAiB,KAAK,MAAM,iBAAiB;AAAA,IACpD;AAGA,SAAK,gBAAgB,OAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAuB;AAC7C,UAAM,SAAS,KAAK,MAAM,cAAc,mBAAmB,OAAO,IAAI;AACtE,QAAI,CAAC,OAAQ;AAGb,QAAI,CAAC,KAAK,MAAM,eAAe,IAAI,OAAO,GAAG;AAC3C,YAAM,QAAQ,KAAK,IAAI,SAAS,OAAO;AACvC,UAAI,OAAO;AACT,gCAAwB,KAAK,KAAK,SAAS,KAAK,MAAM,cAAc;AAAA,MACtE;AAAA,IACF;AAGA,UAAM,SAAS,KAAK,kBAAkB,OAAO;AAC7C,QAAI,CAAC,OAAQ;AAEb,WAAO,YAAY,MAAM;AACzB,SAAK,aAAa,IAAI,SAAS,MAAM;AACrC,SAAK,MAAM,oBAAoB;AAG/B,eAAW,MAAM;AACf,aAAO,eAAe,EAAE,UAAU,UAAU,OAAO,WAAW;AAAA,IAChE,GAAG,EAAE;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAuB;AAC9C,UAAM,SAAS,KAAK,aAAa,IAAI,OAAO;AAC5C,QAAI,QAAQ;AACV,aAAO,OAAA;AACP,WAAK,aAAa,OAAO,OAAO;AAAA,IAClC;AAEA,QAAI,KAAK,MAAM,sBAAsB,SAAS;AAC5C,WAAK,MAAM,oBAAoB;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAwC;AAChE,UAAM,QAAQ,KAAK,IAAI,SAAS,OAAO;AACvC,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAGnB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAEnB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,YAAY;AAClB,UAAM,cAAc;AAEpB,UAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,aAAS,YAAY;AACrB,aAAS,YAAY;AACrB,aAAS,QAAQ;AACjB,aAAS,iBAAiB,SAAS,CAAC,MAAM;AACxC,QAAE,gBAAA;AACF,WAAK,iBAAiB,OAAO;AAAA,IAC/B,CAAC;AAED,WAAO,YAAY,KAAK;AACxB,WAAO,YAAY,QAAQ;AAG3B,UAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,aAAS,YAAY;AAErB,UAAM,YAAY,MAAM;AACxB,SAAK,6BAA6B,UAAU,SAAS,SAAS;AAG9D,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY;AAEpB,UAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,aAAS,YAAY;AACrB,aAAS,cAAc;AACvB,aAAS,iBAAiB,SAAS,CAAC,MAAM;AACxC,QAAE,gBAAA;AACF,WAAK,gBAAgB,OAAO;AAAA,IAC9B,CAAC;AAED,UAAM,iBAAiB,SAAS,cAAc,QAAQ;AACtD,mBAAe,YAAY;AAC3B,mBAAe,cAAc;AAC7B,mBAAe,iBAAiB,SAAS,CAAC,MAAM;AAC9C,QAAE,gBAAA;AACF,WAAK,iBAAiB,OAAO;AAAA,IAC/B,CAAC;AAED,YAAQ,YAAY,QAAQ;AAC5B,YAAQ,YAAY,cAAc;AAElC,WAAO,YAAY,MAAM;AACzB,WAAO,YAAY,QAAQ;AAC3B,WAAO,YAAY,OAAO;AAE1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAA6B,WAAwB,SAAiB,WAAyB;AACrG,YAAQ,WAAA;AAAA,MACN,KAAK;AACH,aAAK,gBAAgB,WAAW,OAAO;AACvC;AAAA,MACF,KAAK;AACH,aAAK,gBAAgB,WAAW,OAAO;AACvC;AAAA,MACF,KAAK;AACH,aAAK,kBAAkB,WAAW,OAAO;AACzC;AAAA,MACF,KAAK;AACH,aAAK,kBAAkB,WAAW,OAAO;AACzC;AAAA,MACF,KAAK;AACH,aAAK,kBAAkB,WAAW,OAAO;AACzC;AAAA,MACF;AACE,kBAAU,cAAc,sBAAsB,SAAS;AAAA,IAAA;AAAA,EAE7D;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,WAAwB,SAAuB;AJn3BlE;AIq3BH,UAAM,QAAQ,KAAK,IAAI,SAAA;AACvB,UAAM,SAAQ,WAAM,WAAN,mBAAc,KAAK,CAAA,MAAK,EAAE,OAAO;AAC/C,QAAI,YAAiB;AAGrB,QAAI,SAAS,WAAW,SAAS,MAAM,SAAS,gBAAgB,MAAM,OAAO;AAC3E,kBAAY,MAAM,MAAM,YAAY;AAAA,IACtC;AAGA,QAAI,CAAC,WAAW;AACd,kBAAY,KAAK,IAAI,iBAAiB,SAAS,YAAY;AAAA,IAC7D;AAEA,SAAK,mBAAmB,WAAW,SAAS,cAAc,cAAc,eAAe,aAAa,MAAM,CAAC;AAG3G,UAAM,cAAc,KAAK,IAAI,iBAAiB,SAAS,cAAc;AACrE,QAAI,gBAAgB,UAAa,OAAO,gBAAgB,UAAU;AAChE,WAAK,oBAAoB,WAAW,SAAS,gBAAgB,gBAAgB,aAAa,GAAG,GAAG,IAAI;AAAA,IACtG;AAGA,UAAM,eAAe,KAAK,IAAI,iBAAiB,SAAS,oBAAoB;AAC5E,QAAI,iBAAiB,QAAW;AAC9B,WAAK,mBAAmB,WAAW,SAAS,sBAAsB,iBAAiB,eAAe,YAAY,CAAC;AAAA,IACjH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,WAAwB,SAAuB;AJr5BlE;AIu5BH,UAAM,QAAQ,KAAK,IAAI,SAAA;AACvB,UAAM,SAAQ,WAAM,WAAN,mBAAc,KAAK,CAAA,MAAK,EAAE,OAAO;AAC/C,QAAI,YAAiB;AAGrB,QAAI,SAAS,WAAW,SAAS,MAAM,SAAS,gBAAgB,MAAM,OAAO;AAC3E,kBAAY,MAAM,MAAM,YAAY;AAAA,IACtC;AAGA,QAAI,CAAC,WAAW;AACd,kBAAY,KAAK,IAAI,iBAAiB,SAAS,YAAY;AAAA,IAC7D;AAEA,SAAK,mBAAmB,WAAW,SAAS,cAAc,cAAc,eAAe,aAAa,MAAM,CAAC;AAG3G,UAAM,YAAY,KAAK,IAAI,iBAAiB,SAAS,YAAY;AACjE,SAAK,oBAAoB,WAAW,SAAS,cAAc,cAAc,OAAO,cAAc,WAAW,YAAY,GAAG,GAAG,IAAI,GAAG;AAGlI,UAAM,cAAc,KAAK,IAAI,iBAAiB,SAAS,cAAc;AACrE,QAAI,gBAAgB,UAAa,OAAO,gBAAgB,UAAU;AAChE,WAAK,oBAAoB,WAAW,SAAS,gBAAgB,gBAAgB,aAAa,GAAG,GAAG,IAAI;AAAA,IACtG;AAGA,UAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,WAAW;AAC/D,QAAI,aAAa,UAAa,OAAO,aAAa,UAAU;AAC1D,WAAK,oBAAoB,WAAW,SAAS,aAAa,aAAa,UAAU,GAAG,GAAG,GAAG;AAAA,IAC5F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,WAAwB,SAAuB;AJ37BpE;AI67BH,UAAM,QAAQ,KAAK,IAAI,SAAA;AACvB,UAAM,SAAQ,WAAM,WAAN,mBAAc,KAAK,CAAA,MAAK,EAAE,OAAO;AAC/C,QAAI,cAAmB;AAGvB,QAAI,SAAS,WAAW,SAAS,MAAM,SAAS,kBAAkB,MAAM,OAAO;AAC7E,oBAAc,MAAM,MAAM,cAAc;AAAA,IAC1C;AAGA,QAAI,CAAC,aAAa;AAChB,oBAAc,KAAK,IAAI,iBAAiB,SAAS,cAAc;AAAA,IACjE;AAEA,SAAK,mBAAmB,WAAW,SAAS,gBAAgB,gBAAgB,eAAe,eAAe,MAAM,CAAC;AAGjH,UAAM,eAAe,KAAK,IAAI,iBAAiB,SAAS,eAAe;AACvE,SAAK,oBAAoB,WAAW,SAAS,iBAAiB,UAAU,OAAO,iBAAiB,WAAW,eAAe,GAAG,GAAG,IAAI,GAAG;AAGvI,UAAM,gBAAgB,KAAK,IAAI,iBAAiB,SAAS,gBAAgB;AACzE,QAAI,kBAAkB,UAAa,OAAO,kBAAkB,UAAU;AACpE,WAAK,oBAAoB,WAAW,SAAS,kBAAkB,WAAW,eAAe,GAAG,GAAG,IAAI;AAAA,IACrG;AAGA,UAAM,cAAc,KAAK,IAAI,iBAAiB,SAAS,qBAAqB;AAC5E,QAAI,gBAAgB,QAAW;AAC7B,WAAK,mBAAmB,WAAW,SAAS,uBAAuB,gBAAgB,eAAe,WAAW,CAAC;AAAA,IAChH;AAGA,UAAM,cAAc,KAAK,IAAI,iBAAiB,SAAS,qBAAqB;AAC5E,QAAI,gBAAgB,UAAa,OAAO,gBAAgB,UAAU;AAChE,WAAK,oBAAoB,WAAW,SAAS,uBAAuB,gBAAgB,aAAa,GAAG,IAAI,GAAG;AAAA,IAC7G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,WAAwB,SAAuB;AAEvE,UAAM,gBAAgB,KAAK,IAAI,iBAAiB,SAAS,gBAAgB;AACzE,SAAK,oBAAoB,WAAW,SAAS,kBAAkB,WAAW,OAAO,kBAAkB,WAAW,gBAAgB,GAAG,GAAG,GAAG,IAAI;AAG3I,UAAM,gBAAgB,KAAK,IAAI,iBAAiB,SAAS,uBAAuB;AAChF,SAAK,oBAAoB,WAAW,SAAS,yBAAyB,kBAAkB,OAAO,kBAAkB,WAAW,gBAAgB,GAAG,IAAI,GAAG,IAAI;AAG1J,UAAM,gBAAgB,KAAK,IAAI,iBAAiB,SAAS,uBAAuB;AAChF,SAAK,oBAAoB,WAAW,SAAS,yBAAyB,kBAAkB,OAAO,kBAAkB,WAAW,gBAAgB,GAAG,IAAI,GAAG,IAAI;AAG1J,UAAM,aAAa,KAAK,IAAI,iBAAiB,SAAS,mBAAmB;AACzE,SAAK,oBAAoB,WAAW,SAAS,qBAAqB,cAAc,OAAO,eAAe,WAAW,aAAa,GAAG,IAAI,GAAG,IAAI;AAG5I,UAAM,WAAW,KAAK,IAAI,iBAAiB,SAAS,iBAAiB;AACrE,SAAK,oBAAoB,WAAW,SAAS,mBAAmB,YAAY,OAAO,aAAa,WAAW,WAAW,GAAG,IAAI,GAAG,IAAI;AAGpI,UAAM,YAAY,KAAK,IAAI,iBAAiB,SAAS,mBAAmB;AACxE,SAAK,oBAAoB,WAAW,SAAS,qBAAqB,cAAc,OAAO,cAAc,WAAW,YAAY,GAAG,GAAG,KAAK,CAAC;AAAA,EAC1I;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,WAAwB,SAAuB;AAEvE,UAAM,YAAY,KAAK,IAAI,iBAAiB,SAAS,YAAY;AACjE,QAAI,cAAc,QAAW;AAC3B,WAAK,mBAAmB,WAAW,SAAS,cAAc,cAAc,eAAe,SAAS,CAAC;AAAA,IACnG;AAGA,UAAM,cAAc,KAAK,IAAI,iBAAiB,SAAS,cAAc;AACrE,QAAI,gBAAgB,UAAa,OAAO,gBAAgB,UAAU;AAChE,WAAK,oBAAoB,WAAW,SAAS,gBAAgB,gBAAgB,aAAa,GAAG,GAAG,IAAI;AAAA,IACtG;AAGA,UAAM,cAAc,KAAK,IAAI,iBAAiB,SAAS,cAAc;AACrE,QAAI,gBAAgB,UAAa,OAAO,gBAAgB,UAAU;AAChE,WAAK,oBAAoB,WAAW,SAAS,gBAAgB,gBAAgB,aAAa,GAAG,GAAG,IAAI;AAAA,IACtG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBACN,WACA,SACA,UACA,OACA,cACM;AACN,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AAEzB,UAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,YAAQ,YAAY;AACpB,YAAQ,cAAc;AAEtB,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AAEzB,UAAM,aAAa,SAAS,cAAc,OAAO;AACjD,eAAW,OAAO;AAClB,eAAW,YAAY;AACvB,eAAW,QAAQ;AACnB,eAAW,QAAQ,WAAW;AAE9B,UAAM,aAAa,SAAS,cAAc,OAAO;AACjD,eAAW,OAAO;AAClB,eAAW,YAAY;AACvB,eAAW,QAAQ;AACnB,eAAW,WAAW;AAEtB,eAAW,iBAAiB,SAAS,MAAM;AACzC,YAAM,QAAQ,WAAW;AACzB,iBAAW,QAAQ;AACnB,WAAK,IAAI,iBAAiB,SAAS,UAAU,KAAK;AAAA,IACpD,CAAC;AAED,iBAAa,YAAY,UAAU;AACnC,iBAAa,YAAY,UAAU;AAEnC,iBAAa,YAAY,OAAO;AAChC,iBAAa,YAAY,YAAY;AAErC,cAAU,YAAY,YAAY;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,WACA,SACA,UACA,OACA,cACA,KACA,KACA,MACM;AACN,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AAEzB,UAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,YAAQ,YAAY;AACpB,YAAQ,cAAc;AAEtB,UAAM,eAAe,SAAS,cAAc,KAAK;AACjD,iBAAa,YAAY;AAEzB,UAAM,SAAS,SAAS,cAAc,OAAO;AAC7C,WAAO,OAAO;AACd,WAAO,YAAY;AACnB,WAAO,MAAM,OAAO,GAAG;AACvB,WAAO,MAAM,OAAO,GAAG;AACvB,WAAO,OAAO,OAAO,IAAI;AACzB,WAAO,QAAQ,OAAO,YAAY;AAClC,WAAO,QAAQ,WAAW;AAE1B,UAAM,eAAe,SAAS,cAAc,MAAM;AAClD,iBAAa,YAAY;AACzB,iBAAa,cAAc,mBAAmB,cAAc,IAAI;AAEhE,WAAO,iBAAiB,SAAS,MAAM;AACrC,YAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,mBAAa,cAAc,mBAAmB,OAAO,IAAI;AACzD,WAAK,IAAI,iBAAiB,SAAS,UAAU,KAAK;AAAA,IACpD,CAAC;AAED,iBAAa,YAAY,MAAM;AAC/B,iBAAa,YAAY,YAAY;AAErC,iBAAa,YAAY,OAAO;AAChC,iBAAa,YAAY,YAAY;AAErC,cAAU,YAAY,YAAY;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAuB;AAC7C,UAAM,gBAAgB,KAAK,MAAM,eAAe,IAAI,OAAO;AAC3D,QAAI,CAAC,cAAe;AAGpB,yBAAqB,KAAK,KAAK,SAAS,KAAK,MAAM,cAAc;AAGjE,UAAM,SAAS,KAAK,aAAa,IAAI,OAAO;AAC5C,QAAI,QAAQ;AAEV,YAAM,UAAU,OAAO,iBAAiB,uBAAuB;AAC/D,cAAQ,QAAQ,CAAA,WAAU;AJzoCzB;AI0oCC,cAAM,WAAW,OAAO,QAAQ;AAChC,YAAI,UAAU;AACZ,gBAAM,QAAQ,KAAK,IAAI,iBAAiB,SAAS,QAAQ;AACzD,cAAI,UAAU,UAAa,OAAO,UAAU,UAAU;AACpD,mBAAO,QAAQ,OAAO,KAAK;AAE3B,kBAAM,gBAAe,YAAO,kBAAP,mBAAsB,cAAc;AACzD,gBAAI,cAAc;AAChB,oBAAM,OAAO,WAAW,OAAO,IAAI;AACnC,2BAAa,cAAc,mBAAmB,OAAO,IAAI;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAGD,YAAM,eAAe,OAAO,iBAAiB,6BAA6B;AAC1E,mBAAa,QAAQ,CAAA,WAAU;AJ3pC9B;AI4pCC,cAAM,WAAW,OAAO,QAAQ;AAChC,YAAI,UAAU;AACZ,gBAAM,QAAQ,KAAK,IAAI,iBAAiB,SAAS,QAAQ;AACzD,cAAI,UAAU,QAAW;AACvB,kBAAM,WAAW,eAAe,KAAK;AACrC,mBAAO,QAAQ;AAEf,kBAAM,cAAa,YAAO,kBAAP,mBAAsB,cAAc;AACvD,gBAAI,YAAY;AACd,yBAAW,cAAc;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAAiC;AACvC,QAAI,KAAK,MAAM,2BAA2B;AACxC;AAAA,IACF;AAEA,WAAO,KAAK,KAAK,MAAM,WAAW,EAAE,QAAQ,CAAA,YAAW;AACrD,UAAI;AACF,cAAM,QAAQ,KAAK,IAAI,SAAS,OAAO;AACvC,YAAI,CAAC,MAAO;AAGZ,cAAM,aAAa,KAAK,IAAI,kBAAkB,SAAS,YAAY;AACnE,cAAM,YAAY,eAAe;AAGjC,cAAM,YAAY,MAAM;AACxB,cAAM,UAAU,gBAAgB,KAAK,KAAK,SAAS,SAAS;AAG5D,YAAI,KAAK,MAAM,YAAY,OAAO,GAAG;AACnC,eAAK,MAAM,YAAY,OAAO,EAAE,UAAU;AAC1C,eAAK,MAAM,YAAY,OAAO,EAAE,UAAU;AAAA,QAC5C;AAGA,aAAK,iBAAiB,SAAS,WAAW,OAAO;AAAA,MACnD,SAAS,OAAO;AACd,gBAAQ,KAAK,oCAAoC,OAAO,KAAK,KAAK;AAAA,MACpE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAiB,SAAkB,SAAuB;AACjF,UAAM,aAAa,KAAK,MAAM,iBAAiB,qBAAqB;AAEpE,eAAW,QAAQ,CAAA,SAAQ;AACzB,UAAK,KAAqB,QAAQ,YAAY,SAAS;AACrD,cAAM,WAAW,KAAK,cAAc,yBAAyB;AAC7D,cAAM,gBAAgB,KAAK,cAAc,wBAAwB;AAEjE,YAAI,UAAU;AACZ,mBAAS,UAAU;AAAA,QACrB;AAEA,YAAI,eAAe;AACjB,wBAAc,QAAQ,OAAO,OAAO;AACpC,wBAAc,QAAQ,YAAY,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAA0B;AAChC,QAAI;AACF,YAAM,QAAQ,KAAK,IAAI,SAAA;AACvB,UAAI,CAAC,SAAS,CAAC,MAAM,QAAQ;AAC3B;AAAA,MACF;AAEA,YAAM,mBAAmB,MAAM,OAC5B,IAAI,WAAS,MAAM,EAAE,EACrB,OAAO,CAAA,OAAM;AAGZ,YAAI,KAAK,aAAa,SAAS,GAAG;AAChC,iBAAO,KAAK,aAAa,SAAS,EAAE;AAAA,QACtC;AACA,eAAO;AAAA,MACT,CAAC;AAGH,YAAM,YAAsB,CAAA;AAC5B,uBAAiB,QAAQ,CAAA,YAAW;AAClC,YAAI,YAAY,gBAAgB,CAAC,KAAK,MAAM,YAAY,OAAO,GAAG;AAChE,gBAAM,QAAQ,KAAK,IAAI,SAAS,OAAO;AACvC,cAAI,OAAO;AACT,sBAAU,KAAK,OAAO;AAAA,UACxB;AAAA,QACF;AAAA,MACF,CAAC;AAGD,UAAI,UAAU,SAAS,GAAG;AACxB,kBAAU,QAAQ,CAAA,YAAW;AAC3B,gBAAM,QAAQ,KAAK,IAAI,SAAS,OAAO;AACvC,cAAI,CAAC,MAAO;AAGZ,gBAAM,YAAY,MAAM;AACxB,gBAAM,UAAU,gBAAgB,KAAK,KAAK,SAAS,SAAS;AAC5D,gBAAM,aAAa,KAAK,IAAI,kBAAkB,SAAS,YAAY;AACnE,gBAAM,YAAY,eAAe;AAGjC,eAAK,MAAM,YAAY,OAAO,IAAI;AAAA,YAChC,SAAS;AAAA,YACT;AAAA,YACA,MAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,QAAQ,SAAS,CAAA,MAAK,EAAE,YAAA,CAAa;AAAA,UAAA;AAIxE,eAAK,aAAa,SAAS,KAAK,MAAM,YAAY,OAAO,CAAC;AAAA,QAC5D,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,KAAK,mCAAmC,KAAK;AAAA,IACvD;AAAA,EACF;AACF;"}
|