@json-to-office/jto 2.0.0 → 2.3.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/dist/cli.js +447 -100
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/HomePage-DMpdYyZ0.js +251 -0
- package/dist/client/assets/HomePage-DMpdYyZ0.js.map +1 -0
- package/dist/client/assets/JsonEditorPage-Ct7wb9iA.js +3 -0
- package/dist/client/assets/JsonEditorPage-Ct7wb9iA.js.map +1 -0
- package/dist/client/assets/MonacoPluginProvider-B2fWYflh.js +85 -0
- package/dist/client/assets/MonacoPluginProvider-B2fWYflh.js.map +1 -0
- package/dist/client/assets/_virtual_jto-plugin-type-libs-BlMraosv.js +25700 -0
- package/dist/client/assets/_virtual_jto-plugin-type-libs-BlMraosv.js.map +1 -0
- package/dist/client/assets/_virtual_jto-sandbox-runtime-CNoAasd3.js +2 -0
- package/dist/client/assets/_virtual_jto-sandbox-runtime-CNoAasd3.js.map +1 -0
- package/dist/client/assets/editor-DFnlAOyt.js +16 -0
- package/dist/client/assets/editor-DFnlAOyt.js.map +1 -0
- package/dist/client/assets/{editor-monaco-json-DcTTqcqQ.js → editor-monaco-json-B_1-Wxq5.js} +5 -5
- package/dist/client/assets/{editor-monaco-json-DcTTqcqQ.js.map → editor-monaco-json-B_1-Wxq5.js.map} +1 -1
- package/dist/client/assets/{editor-refs-store-QHdkA6Kl.js → editor-refs-store-DHeIvmr6.js} +2 -2
- package/dist/client/assets/{editor-refs-store-QHdkA6Kl.js.map → editor-refs-store-DHeIvmr6.js.map} +1 -1
- package/dist/client/assets/index-Bj6ZAKUc.css +1 -0
- package/dist/client/assets/index-CeZaIyj_.js +5 -0
- package/dist/client/assets/index-CeZaIyj_.js.map +1 -0
- package/dist/client/assets/preview-CugO7y1j.js +4 -0
- package/dist/client/assets/preview-CugO7y1j.js.map +1 -0
- package/dist/client/assets/radix-ui-BzbaiLpZ.js +51 -0
- package/dist/client/assets/radix-ui-BzbaiLpZ.js.map +1 -0
- package/dist/client/assets/{ui-vendor-Bq4-oNFL.js → ui-vendor-BsAtAN16.js} +94 -64
- package/dist/client/assets/ui-vendor-BsAtAN16.js.map +1 -0
- package/dist/client/assets/useQualityAnalysis-DH2idzAY.js +6 -0
- package/dist/client/assets/useQualityAnalysis-DH2idzAY.js.map +1 -0
- package/dist/client/index.html +4 -4
- package/dist/render-server.js.map +1 -1
- package/package.json +5 -3
- package/dist/client/assets/HomePage-DQ0sOZFI.js +0 -106
- package/dist/client/assets/HomePage-DQ0sOZFI.js.map +0 -1
- package/dist/client/assets/JsonEditorPage-D1TS-GDF.js +0 -3
- package/dist/client/assets/JsonEditorPage-D1TS-GDF.js.map +0 -1
- package/dist/client/assets/MonacoPluginProvider-BQ2eYUHv.js +0 -3
- package/dist/client/assets/MonacoPluginProvider-BQ2eYUHv.js.map +0 -1
- package/dist/client/assets/editor-5uqC0zMy.js +0 -9
- package/dist/client/assets/editor-5uqC0zMy.js.map +0 -1
- package/dist/client/assets/index-CrzIwHLS.css +0 -1
- package/dist/client/assets/index-DlPjoC1v.js +0 -5
- package/dist/client/assets/index-DlPjoC1v.js.map +0 -1
- package/dist/client/assets/preview-C3z7o0yn.js +0 -2
- package/dist/client/assets/preview-C3z7o0yn.js.map +0 -1
- package/dist/client/assets/radix-ui-DFNP5I4e.js +0 -51
- package/dist/client/assets/radix-ui-DFNP5I4e.js.map +0 -1
- package/dist/client/assets/ui-vendor-Bq4-oNFL.js.map +0 -1
- package/dist/client/assets/useQualityAnalysis-D5-WU4pX.js +0 -6
- package/dist/client/assets/useQualityAnalysis-D5-WU4pX.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editor-5uqC0zMy.js","sources":["../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/validators.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/definedErrors.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/deepClone.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/utils/enums.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/constrainedModel.js","../../../../../node_modules/.pnpm/constrained-editor-plugin@1.4.0/node_modules/constrained-editor-plugin/dist/esm/constrainedEditor.js","../../../src/client/components/json-editor/editor-monaco-theme.tsx","../../../src/client/components/playground/editor-tabs-content.tsx","../../../src/client/utils/retry.ts","../../../src/client/components/playground/editor.tsx"],"sourcesContent":["const validators = {\n initWith: function (monaco) {\n const dummyDiv = document.createElement('div');\n const dummyEditorInstance = monaco.editor.create(dummyDiv);\n const editorInstanceConstructorName = dummyEditorInstance.constructor.name;\n const editorModelConstructorName = dummyEditorInstance.getModel().constructor.name;\n const instanceCheck = function (valueToValidate) {\n return valueToValidate.constructor.name === editorInstanceConstructorName;\n }\n const modelCheck = function (valueToValidate) {\n return valueToValidate.constructor.name === editorModelConstructorName;\n }\n const rangesCheck = function (ranges) {\n if (Array.isArray(ranges)) {\n return ranges.every(function (rangeObj) {\n if (typeof rangeObj === 'object' && rangeObj.constructor.name === 'Object') {\n if (!rangeObj.hasOwnProperty('range')) return false;\n if (!Array.isArray(rangeObj.range)) return false;\n if (rangeObj.range.length !== 4) return false;\n if (!(rangeObj.range.every(num => num > 0 && parseInt(num) === num))) return false;\n if (rangeObj.hasOwnProperty('allowMultiline')) {\n if (typeof rangeObj.allowMultiline !== 'boolean') return false;\n }\n if (rangeObj.hasOwnProperty('label')) {\n if (typeof rangeObj.label !== 'string') return false;\n }\n if (rangeObj.hasOwnProperty('validate')) {\n if (typeof rangeObj.validate !== 'function') return false;\n }\n return true;\n }\n return false;\n });\n }\n return false;\n }\n return {\n isInstanceValid: instanceCheck,\n isModelValid: modelCheck,\n isRangesValid: rangesCheck\n }\n }\n}\nexport default validators;","export const TypeMustBe = function (type, key, additional) {\n return 'The value for the ' + key + ' should be of type ' + (Array.isArray(type) ? type.join(' | ') : type) + '. ' + (additional || '')\n}\nconst definedErrors = {\n TypeMustBe : TypeMustBe\n};\nexport default definedErrors;","export const deepClone = (function () {\n const byPassPrimitives = function (value, callback) {\n if (typeof value !== 'object' || value === null) {\n return this.freeze ? Object.freeze(value) : value;\n }\n if (value instanceof Date) {\n return this.freeze ? Object.freeze(new Date(value)) : new Date(value);\n }\n return callback.call(this, value);\n }\n const cloneArray = function (array, callback) {\n const keys = Object.keys(array);\n const arrayClone = new Array(keys.length)\n for (let i = 0; i < keys.length; i++) {\n arrayClone[keys[i]] = byPassPrimitives.call(this, array[keys[i]], callback);\n }\n return arrayClone;\n }\n const cloner = function (object) {\n return byPassPrimitives.call(this, object, function (object) {\n if (Array.isArray(object)) {\n return cloneArray.call(this, object, cloner)\n }\n const clone = {};\n for (let key in object) {\n if (!this.withProto && Object.hasOwnProperty.call(object, key) === false) {\n continue;\n }\n clone[key] = byPassPrimitives.call(this, object[key], cloner);\n }\n return clone;\n })\n }\n const config = (function () {\n const constructOptionForCode = function (value) {\n const options = [\n 'withProto',\n 'freeze'\n ]\n this[value] = options.reduce(function (acc, option) {\n if (acc[option] = (value >= this[option])) {\n value -= this[option]\n }\n return acc;\n }.bind(this), {})\n }\n const codes = Object.create(Object.defineProperties({}, {\n withProto: { value: 1 },\n freeze: { value: 2 }\n }));\n for (let i = 0; i <= 3; i++) {\n constructOptionForCode.call(codes, i);\n }\n return codes;\n }());\n const methods = {\n withProto: cloner.bind(config[1]),\n andFreeze: cloner.bind(config[2]),\n withProtoAndFreeze: cloner.bind(config[3])\n }\n const API = cloner.bind(config[0]);\n for (let methodName in methods) {\n Object.defineProperty(API, methodName, {\n enumerable: false,\n writable: false,\n configurable: false,\n value: methods[methodName]\n })\n }\n return API;\n}());\n\nexport default deepClone;","export const enums = {\n SINGLE_LINE_HIGHLIGHT_CLASS: 'editableArea--single-line',\n MULTI_LINE_HIGHLIGHT_CLASS: 'editableArea--multi-line'\n}\nexport default enums;","import deepClone from './utils/deepClone.js';\nimport enums from './utils/enums.js';\nexport const constrainedModel = function (model, ranges, monaco) {\n const rangeConstructor = monaco.Range;\n const sortRangesInAscendingOrder = function (rangeObject1, rangeObject2) {\n const rangeA = rangeObject1.range;\n const rangeB = rangeObject2.range;\n if (\n rangeA[0] < rangeB[0] ||\n (rangeA[0] === rangeB[0] && rangeA[3] < rangeB[1])\n ) {\n return -1;\n }\n }\n const normalizeRange = function (range, content) {\n const lines = content.split('\\n');\n const noOfLines = lines.length;\n const normalizedRange = [];\n range.forEach(function (value, index) {\n if (value === 0) {\n throw new Error('Range values cannot be zero');//No I18n\n }\n switch (index) {\n case 0: {\n if (value < 0) {\n throw new Error('Start Line of Range cannot be negative');//No I18n\n } else if (value > noOfLines) {\n throw new Error('Provided Start Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n normalizedRange[index] = value;\n }\n break;\n case 1: {\n let actualStartCol = value;\n const startLineNo = normalizedRange[0];\n const maxCols = lines[startLineNo - 1].length\n if (actualStartCol < 0) {\n actualStartCol = maxCols - Math.abs(actualStartCol);\n if (actualStartCol < 0) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + startLineNo + ' is ' + maxCols);//No I18n\n }\n } else if (actualStartCol > (maxCols + 1)) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + startLineNo + ' is ' + maxCols);//No I18n\n }\n normalizedRange[index] = actualStartCol;\n }\n break;\n case 2: {\n let actualEndLine = value;\n if (actualEndLine < 0) {\n actualEndLine = noOfLines - Math.abs(value);\n if (actualEndLine < 0) {\n throw new Error('Provided End Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n if (actualEndLine < normalizedRange[0]) {\n console.warn('Provided End Line(' + value + ') is less than the start Line, the Restriction may not behave as expected');//No I18n\n }\n } else if (value > noOfLines) {\n throw new Error('Provided End Line(' + value + ') is out of bounds. Max Lines in content is ' + noOfLines);//No I18n\n }\n normalizedRange[index] = actualEndLine;\n }\n break;\n case 3: {\n let actualEndCol = value;\n const endLineNo = normalizedRange[2];\n const maxCols = lines[endLineNo - 1].length\n if (actualEndCol < 0) {\n actualEndCol = maxCols - Math.abs(actualEndCol);\n if (actualEndCol < 0) {\n throw new Error('Provided End Column(' + value + ') is out of bounds. Max Column in line ' + endLineNo + ' is ' + maxCols);//No I18n\n }\n } else if (actualEndCol > (maxCols + 1)) {\n throw new Error('Provided Start Column(' + value + ') is out of bounds. Max Column in line ' + endLineNo + ' is ' + maxCols);//No I18n\n }\n normalizedRange[index] = actualEndCol;\n }\n break;\n }\n })\n return normalizedRange;\n }\n let restrictions = deepClone(ranges).sort(sortRangesInAscendingOrder);\n const prepareRestrictions = function (restrictions) {\n const content = model.getValue();\n restrictions.forEach(function (restriction, index) {\n const range = normalizeRange(restriction.range, content);\n const startLine = range[0];\n const startCol = range[1];\n const endLine = range[2];\n const endCol = range[3];\n restriction._originalRange = range.slice();\n restriction.range = new rangeConstructor(startLine, startCol, endLine, endCol);\n restriction.index = index;\n if (!restriction.allowMultiline) {\n restriction.allowMultiline = rangeConstructor.spansMultipleLines(restriction.range)\n }\n if (!restriction.label) {\n restriction.label = `[${startLine},${startCol} -> ${endLine}${endCol}]`;\n }\n });\n }\n const getCurrentEditableRanges = function () {\n return restrictions.reduce(function (acc, restriction) {\n acc[restriction.label] = {\n allowMultiline: restriction.allowMultiline || false,\n index: restriction.index,\n range: Object.assign({}, restriction.range),\n originalRange: restriction._originalRange.slice()\n };\n return acc;\n }, {});\n }\n const getValueInEditableRanges = function () {\n return restrictions.reduce(function (acc, restriction) {\n acc[restriction.label] = model.getValueInRange(restriction.range);\n return acc;\n }, {});\n }\n const updateValueInEditableRanges = function (object, forceMoveMarkers) {\n if (typeof object === 'object' && !Array.isArray(object)) {\n forceMoveMarkers = typeof forceMoveMarkers === 'boolean' ? forceMoveMarkers : false;\n const restrictionsMap = restrictions.reduce(function (acc, restriction) {\n if (restriction.label) {\n acc[restriction.label] = restriction;\n }\n return acc;\n }, {});\n for (let label in object) {\n const restriction = restrictionsMap[label];\n if (restriction) {\n const value = object[label];\n if (doesChangeHasMultilineConflict(restriction, value)) {\n throw new Error('Multiline change is not allowed for ' + label);\n }\n const newRange = deepClone(restriction.range);\n newRange.endLine = newRange.startLine + value.split('\\n').length - 1;\n newRange.endColumn = value.split('\\n').pop().length;\n if (isChangeInvalidAsPerUser(restriction, value, newRange)) {\n throw new Error('Change is invalidated by validate function of ' + label);\n }\n model.applyEdits([{\n forceMoveMarkers: !!forceMoveMarkers,\n range: restriction.range,\n text: value\n }]);\n } else {\n console.error('No restriction found for ' + label);\n }\n }\n } else {\n throw new Error('Value must be an object');//No I18n\n }\n }\n const disposeRestrictions = function () {\n model._restrictionChangeListener.dispose();\n window.removeEventListener(\"error\", handleUnhandledPromiseRejection);\n delete model.editInRestrictedArea;\n delete model.disposeRestrictions;\n delete model.getValueInEditableRanges;\n delete model.updateValueInEditableRanges;\n delete model.updateRestrictions;\n delete model.getCurrentEditableRanges;\n delete model.toggleHighlightOfEditableAreas;\n delete model._hasHighlight;\n delete model._isRestrictedModel;\n delete model._isCursorAtCheckPoint;\n delete model._currentCursorPositions;\n delete model._editableRangeChangeListener;\n delete model._restrictionChangeListener;\n delete model._oldDecorations;\n delete model._oldDecorationsSource;\n return model;\n }\n const isCursorAtCheckPoint = function (positions) {\n positions.some(function (position) {\n const posLineNumber = position.lineNumber;\n const posCol = position.column;\n const length = restrictions.length;\n for (let i = 0; i < length; i++) {\n const range = restrictions[i].range;\n if (\n (range.startLineNumber === posLineNumber && range.startColumn === posCol) ||\n (range.endLineNumber === posLineNumber && range.endColumn === posCol)\n ) {\n model.pushStackElement();\n return true;\n }\n }\n });\n };\n const addEditableRangeListener = function (callback) {\n if (typeof callback === 'function') {\n model._editableRangeChangeListener.push(callback);\n }\n };\n const triggerChangeListenersWith = function (currentChanges, allChanges) {\n const currentRanges = getCurrentEditableRanges();\n model._editableRangeChangeListener.forEach(function (callback) {\n callback.call(model, currentChanges, allChanges, currentRanges);\n });\n };\n const doUndo = function () {\n return Promise.resolve().then(function () {\n model.editInRestrictedArea = true;\n model.undo();\n model.editInRestrictedArea = false;\n if (model._hasHighlight && model._oldDecorationsSource) {\n // id present in the decorations info will be omitted by monaco\n // So we don't need to remove the old decorations id\n model.deltaDecorations(model._oldDecorations, model._oldDecorationsSource);\n model._oldDecorationsSource.forEach(function (object) {\n object.range = model.getDecorationRange(object.id);\n });\n }\n });\n };\n const updateRange = function (restriction, range, finalLine, finalColumn, changes, changeIndex) {\n let oldRangeEndLineNumber = range.endLineNumber;\n let oldRangeEndColumn = range.endColumn;\n restriction.prevRange = range;\n restriction.range = range.setEndPosition(finalLine, finalColumn);\n const length = restrictions.length;\n let changesLength = changes.length;\n const diffInCol = finalColumn - oldRangeEndColumn;\n const diffInRow = finalLine - oldRangeEndLineNumber;\n\n const cursorPositions = model._currentCursorPositions || [];\n const noOfCursorPositions = cursorPositions.length;\n // if (noOfCursorPositions > 0) {\n if (changesLength !== noOfCursorPositions) {\n changes = changes.filter(function (change) {\n const range = change.range;\n for (let i = 0; i < noOfCursorPositions; i++) {\n const cursorPosition = cursorPositions[i];\n if (\n (range.startLineNumber === cursorPosition.startLineNumber) &&\n (range.endLineNumber === cursorPosition.endLineNumber) &&\n (range.startColumn === cursorPosition.startColumn) &&\n (range.endColumn === cursorPosition.endColumn)\n ) {\n return true;\n }\n }\n return false;\n });\n changesLength = changes.length;\n }\n if (diffInRow !== 0) {\n for (let i = restriction.index + 1; i < length; i++) {\n const nextRestriction = restrictions[i];\n const nextRange = nextRestriction.range;\n if (oldRangeEndLineNumber === nextRange.startLineNumber) {\n nextRange.startColumn += diffInCol;\n }\n if (oldRangeEndLineNumber === nextRange.endLineNumber) {\n nextRange.endColumn += diffInCol;\n }\n nextRange.startLineNumber += diffInRow;\n nextRange.endLineNumber += diffInRow;\n nextRestriction.range = nextRange;\n }\n for (let i = changeIndex + 1; i < changesLength; i++) {\n const nextChange = changes[i];\n const rangeInChange = nextChange.range;\n const rangeAsString = rangeInChange.toString();\n const rangeMapValue = rangeMap[rangeAsString];\n delete rangeMap[rangeAsString];\n if (oldRangeEndLineNumber === rangeInChange.startLineNumber) {\n rangeInChange.startColumn += diffInCol;\n }\n if (oldRangeEndLineNumber === rangeInChange.endLineNumber) {\n rangeInChange.endColumn += diffInCol;\n }\n rangeInChange.startLineNumber += diffInRow;\n rangeInChange.endLineNumber += diffInRow;\n nextChange.range = rangeInChange;\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n }\n } else {\n // Only Column might have changed\n for (let i = restriction.index + 1; i < length; i++) {\n const nextRestriction = restrictions[i];\n const nextRange = nextRestriction.range;\n if (nextRange.startLineNumber > oldRangeEndLineNumber) {\n break;\n } else {\n nextRange.startColumn += diffInCol;\n nextRange.endColumn += diffInCol;\n nextRestriction.range = nextRange;\n }\n }\n for (let i = changeIndex + 1; i < changesLength; i++) {\n // rangeMap\n const nextChange = changes[i];\n const rangeInChange = nextChange.range;\n const rangeAsString = rangeInChange.toString();\n const rangeMapValue = rangeMap[rangeAsString];\n delete rangeMap[rangeAsString];\n if (rangeInChange.startLineNumber > oldRangeEndLineNumber) {\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n break;\n } else {\n rangeInChange.startColumn += diffInCol;\n rangeInChange.endColumn += diffInCol;\n nextChange.range = rangeInChange;\n rangeMap[rangeInChange.toString()] = rangeMapValue;\n }\n }\n }\n // }\n };\n const getInfoFrom = function (change, editableRange) {\n const info = {};\n const range = change.range;\n // Get State\n if (change.text === '') {\n info.isDeletion = true;\n } else if (\n (range.startLineNumber === range.endLineNumber) &&\n (range.startColumn === range.endColumn)\n ) {\n info.isAddition = true;\n } else {\n info.isReplacement = true;\n }\n // Get Position Of Range\n info.startLineOfRange = range.startLineNumber === editableRange.startLineNumber;\n info.startColumnOfRange = range.startColumn === editableRange.startColumn;\n\n info.endLineOfRange = range.endLineNumber === editableRange.endLineNumber;\n info.endColumnOfRange = range.endColumn === editableRange.endColumn;\n\n info.middleLineOfRange = !info.startLineOfRange && !info.endLineOfRange;\n\n // Editable Range Span\n if (editableRange.startLineNumber === editableRange.endLineNumber) {\n info.rangeIsSingleLine = true;\n } else {\n info.rangeIsMultiLine = true;\n }\n return info;\n };\n const updateRestrictions = function (ranges) {\n restrictions = deepClone(ranges).sort(sortRangesInAscendingOrder);\n prepareRestrictions(restrictions);\n };\n const toggleHighlightOfEditableAreas = function (cssClasses) {\n if (!model._hasHighlight) {\n const cssClassForSingleLine = cssClasses.cssClassForSingleLine ||enums.SINGLE_LINE_HIGHLIGHT_CLASS\n const cssClassForMultiLine = cssClasses.cssClassForMultiLine ||enums.MULTI_LINE_HIGHLIGHT_CLASS\n const decorations = restrictions.map(function (restriction) {\n const decoration = {\n range: restriction.range,\n options: {\n className: restriction.allowMultiline ?\n cssClassForMultiLine :\n cssClassForSingleLine\n }\n }\n if (restriction.label) {\n decoration.hoverMessage = restriction.label;\n }\n return decoration;\n });\n model._oldDecorations = model.deltaDecorations([], decorations);\n model._oldDecorationsSource = decorations.map(function (decoration, index) {\n return Object.assign({}, decoration, { id: model._oldDecorations[index] });\n });\n model._hasHighlight = true;\n } else {\n model.deltaDecorations(model._oldDecorations, []);\n delete model._oldDecorations;\n delete model._oldDecorationsSource;\n model._hasHighlight = false;\n }\n }\n const handleUnhandledPromiseRejection = function () {\n console.debug('handler for unhandled promise rejection');\n };\n const setAllRangesToPrev = function (rangeMap) {\n for (let key in rangeMap) {\n const restriction = rangeMap[key];\n restriction.range = restriction.prevRange;\n }\n };\n const doesChangeHasMultilineConflict = function (restriction, text) {\n return !restriction.allowMultiline && text.includes('\\n');\n };\n const isChangeInvalidAsPerUser = function (restriction, value, range) {\n return restriction.validate && !restriction.validate(value, range, restriction.lastInfo);\n }\n\n const manipulatorApi = {\n _isRestrictedModel: true,\n _isRestrictedValueValid: true,\n _editableRangeChangeListener: [],\n _isCursorAtCheckPoint: isCursorAtCheckPoint,\n _currentCursorPositions: []\n }\n\n prepareRestrictions(restrictions);\n model._hasHighlight = false;\n manipulatorApi._restrictionChangeListener = model.onDidChangeContent(function (contentChangedEvent) {\n const isUndoing = contentChangedEvent.isUndoing;\n model._isRestrictedValueValid = true;\n if (!(isUndoing && model.editInRestrictedArea)) {\n const changes = contentChangedEvent.changes.sort(sortRangesInAscendingOrder);\n const rangeMap = {};\n const length = restrictions.length;\n const isAllChangesValid = changes.every(function (change) {\n const editedRange = change.range;\n const rangeAsString = editedRange.toString();\n rangeMap[rangeAsString] = null;\n for (let i = 0; i < length; i++) {\n const restriction = restrictions[i];\n const range = restriction.range;\n if (range.containsRange(editedRange)) {\n if (doesChangeHasMultilineConflict(restriction, change.text)) {\n return false;\n }\n rangeMap[rangeAsString] = restriction;\n return true;\n }\n }\n return false;\n })\n if (isAllChangesValid) {\n changes.forEach(function (change, changeIndex) {\n const changedRange = change.range;\n const restriction = rangeMap[changedRange.toString()];\n const editableRange = restriction.range;\n const text = change.text || '';\n /**\n * Things to check before implementing the change\n * - A | D | R => Addition | Deletion | Replacement\n * - MC | SC => MultiLineChange | SingleLineChange\n * - SOR | MOR | EOR => Change Occured in - Start Of Range | Middle Of Range | End Of Range\n * - SSL | SML => Editable Range - Spans Single Line | Spans Multiple Line\n */\n const noOfLinesAdded = (text.match(/\\n/g) || []).length;\n const noOfColsAddedAtLastLine = text.split(/\\n/g).pop().length;\n\n const lineDiffInRange = changedRange.endLineNumber - changedRange.startLineNumber;\n const colDiffInRange = changedRange.endColumn - changedRange.startColumn;\n\n let finalLine = editableRange.endLineNumber;\n let finalColumn = editableRange.endColumn;\n\n let columnsCarriedToEnd = 0;\n if (\n (editableRange.endLineNumber === changedRange.startLineNumber) ||\n (editableRange.endLineNumber === changedRange.endLineNumber)\n ) {\n columnsCarriedToEnd += (editableRange.endColumn - changedRange.startColumn) + 1;\n }\n\n const info = getInfoFrom(change, editableRange);\n restriction.lastInfo = info;\n if (info.isAddition || info.isReplacement) {\n if (info.rangeIsSingleLine) {\n /**\n * Only Column Change has occurred , so regardless of the position of the change\n * Addition of noOfCols is enough\n */\n if (noOfLinesAdded === 0) {\n finalColumn += noOfColsAddedAtLastLine;\n } else {\n finalLine += noOfLinesAdded;\n if (info.startColumnOfRange) {\n finalColumn += noOfColsAddedAtLastLine\n } else if (info.endColumnOfRange) {\n finalColumn = (noOfColsAddedAtLastLine + 1)\n } else {\n finalColumn = (noOfColsAddedAtLastLine + columnsCarriedToEnd)\n }\n }\n }\n if (info.rangeIsMultiLine) {\n // Handling for Start Of Range is not required\n finalLine += noOfLinesAdded;\n if (info.endLineOfRange) {\n if (noOfLinesAdded === 0) {\n finalColumn += noOfColsAddedAtLastLine;\n } else {\n finalColumn = (columnsCarriedToEnd + noOfColsAddedAtLastLine);\n }\n }\n }\n }\n if (info.isDeletion || info.isReplacement) {\n if (info.rangeIsSingleLine) {\n finalColumn -= colDiffInRange;\n }\n if (info.rangeIsMultiLine) {\n if (info.endLineOfRange) {\n finalLine -= lineDiffInRange;\n finalColumn -= colDiffInRange;\n } else {\n finalLine -= lineDiffInRange;\n }\n }\n }\n updateRange(restriction, editableRange, finalLine, finalColumn, changes, changeIndex);\n });\n const values = model.getValueInEditableRanges();\n const currentlyEditedRanges = {};\n for (let key in rangeMap) {\n const restriction = rangeMap[key];\n const range = restriction.range;\n const rangeString = restriction.label || range.toString();\n const value = values[rangeString];\n if (isChangeInvalidAsPerUser(restriction, value, range)) {\n setAllRangesToPrev(rangeMap);\n doUndo();\n return; // Breaks the loop and prevents the triggerChangeListener\n }\n currentlyEditedRanges[rangeString] = value;\n }\n if (model._hasHighlight) {\n model._oldDecorationsSource.forEach(function (object) {\n object.range = model.getDecorationRange(object.id);\n });\n }\n triggerChangeListenersWith(currentlyEditedRanges, values);\n } else {\n doUndo();\n }\n } else if (model.editInRestrictedArea) {\n model._isRestrictedValueValid = false;\n }\n });\n window.onerror = handleUnhandledPromiseRejection;\n const exposedApi = {\n editInRestrictedArea: false,\n getCurrentEditableRanges: getCurrentEditableRanges,\n getValueInEditableRanges: getValueInEditableRanges,\n disposeRestrictions: disposeRestrictions,\n onDidChangeContentInEditableRange: addEditableRangeListener,\n updateRestrictions: updateRestrictions,\n updateValueInEditableRanges: updateValueInEditableRanges,\n toggleHighlightOfEditableAreas: toggleHighlightOfEditableAreas\n }\n for (let funcName in manipulatorApi) {\n Object.defineProperty(model, funcName, {\n enumerable: false,\n configurable: true,\n writable: true,\n value: manipulatorApi[funcName]\n })\n }\n for (let apiName in exposedApi) {\n Object.defineProperty(model, apiName, {\n enumerable: false,\n configurable: true,\n writable: true,\n value: exposedApi[apiName]\n })\n }\n return model;\n}\nexport default constrainedModel;","import validators from './utils/validators.js';\nimport { TypeMustBe } from './utils/definedErrors.js';\nimport constrainedModel from './constrainedModel.js';\n\nexport function constrainedEditor(monaco) {\n /**\n * Injected Dependencies\n */\n if (monaco === undefined) {\n throw new Error([\n \"Please pass the monaco global variable into function as\",\n \"(eg:)constrainedEditor({ range : monaco.range });\",\n ].join('\\n'));\n }\n /**\n *\n * @param {Object} editorInstance This should be the monaco editor instance.\n * @description This is the listener function to check whether the cursor is at checkpoints\n * (i.e) the point where editable and non editable portions meet\n */\n const listenerFn = function (editorInstance) {\n const model = editorInstance.getModel();\n if (model._isCursorAtCheckPoint) {\n const selections = editorInstance.getSelections();\n const positions = selections.map(function (selection) {\n return {\n lineNumber: selection.positionLineNumber,\n column: selection.positionColumn\n }\n });\n model._isCursorAtCheckPoint(positions);\n model._currentCursorPositions = selections;\n }\n }\n const _uriRestrictionMap = {};\n const { isInstanceValid, isModelValid, isRangesValid } = validators.initWith(monaco);\n /**\n *\n * @param {Object} editorInstance This should be the monaco editor instance\n * @returns {Boolean}\n */\n const initInEditorInstance = function (editorInstance) {\n if (isInstanceValid(editorInstance)) {\n let domNode = editorInstance.getDomNode();\n manipulator._listener = listenerFn.bind(API, editorInstance);\n manipulator._editorInstance = editorInstance;\n manipulator._editorInstance._isInDevMode = false;\n domNode.addEventListener('keydown', manipulator._listener, true);\n manipulator._onChangeModelDisposable = editorInstance.onDidChangeModel(function () {\n // domNode - refers old dom node\n domNode && domNode.removeEventListener('keydown', manipulator._listener, true)\n const newDomNode = editorInstance.getDomNode(); // Gets Current dom node\n newDomNode && newDomNode.addEventListener('keydown', manipulator._listener, true);\n domNode = newDomNode;\n })\n return true;\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @param {Object} model This should be the monaco editor model instance. Refer https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.itextmodel.html\n * @param {*} ranges This should be the array of range objects. Refer constrained editor plugin documentation\n * @returns model\n */\n const addRestrictionsTo = function (model, ranges) {\n if (isModelValid(model)) {\n if (isRangesValid(ranges)) {\n const modelToConstrain = constrainedModel(model, ranges, monaco, manipulator._editorInstance);\n _uriRestrictionMap[modelToConstrain.uri.toString()] = modelToConstrain;\n return modelToConstrain;\n } else {\n throw new Error(\n TypeMustBe(\n 'Array<RangeRestrictionObject>',\n 'ranges',\n 'Please refer constrained editor documentation for proper structure'\n )\n )\n }\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @param {Object} model This should be the monaco editor model instance. Refer https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.itextmodel.html\n * @returns {Boolean} True if the restrictions are removed\n */\n const removeRestrictionsIn = function (model) {\n if (isModelValid(model)) {\n const uri = model.uri.toString();\n const restrictedModel = _uriRestrictionMap[uri];\n if (restrictedModel) {\n return restrictedModel.disposeRestrictions();\n } else {\n console.warn('Current Model is not a restricted Model');\n return false;\n }\n } else {\n throw new Error(\n TypeMustBe(\n 'ICodeEditor',\n 'editorInstance',\n 'This type interface can be found in monaco editor documentation'\n )\n )\n }\n }\n /**\n *\n * @returns {Boolean} True if the constrainer is disposed\n */\n const disposeConstrainer = function () {\n if (manipulator._editorInstance) {\n const instance = manipulator._editorInstance;\n const domNode = instance.getDomNode();\n domNode && domNode.removeEventListener('keydown', manipulator._listener);\n manipulator._onChangeModelDisposable && manipulator._onChangeModelDisposable.dispose();\n delete manipulator._listener;\n delete manipulator._editorInstance._isInDevMode;\n delete manipulator._editorInstance._devModeAction;\n delete manipulator._editorInstance;\n delete manipulator._onChangeModelDisposable;\n for (let key in _uriRestrictionMap) {\n delete _uriRestrictionMap[key];\n }\n return true;\n }\n return false;\n }\n /**\n * @description This function used to make the developer to find the ranges of selected portions\n */\n const toggleDevMode = function () {\n if (manipulator._editorInstance._isInDevMode) {\n manipulator._editorInstance._isInDevMode = false;\n manipulator._editorInstance._devModeAction.dispose();\n delete manipulator._editorInstance._devModeAction;\n } else {\n manipulator._editorInstance._isInDevMode = true;\n manipulator._editorInstance._devModeAction = manipulator._editorInstance.addAction({\n id: 'showRange',\n label: 'Show Range in console',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n run: function (editor) {\n const selections = editor.getSelections();\n const ranges = selections.reduce(function (acc, { startLineNumber, endLineNumber, startColumn, endColumn }) {\n acc.push('range : ' + JSON.stringify([\n startLineNumber,\n startColumn,\n endLineNumber,\n endColumn\n ]));\n return acc;\n }, []).join('\\n');\n console.log(`Selected Ranges : \\n` + JSON.stringify(ranges, null, 2));\n }\n });\n }\n }\n\n /**\n * Main Function starts here\n */\n // @internal\n const manipulator = {\n /**\n * These variables should not be modified by external code\n * This has to be used for debugging and testing\n */\n _listener: null,\n _editorInstance: null,\n _uriRestrictionMap: _uriRestrictionMap,\n _injectedResources: monaco\n }\n const API = Object.create(manipulator);\n const exposedMethods = {\n /**\n * These functions are exposed to the user\n * These functions should be protected from editing\n */\n initializeIn: initInEditorInstance,\n addRestrictionsTo: addRestrictionsTo,\n removeRestrictionsIn: removeRestrictionsIn,\n disposeConstrainer: disposeConstrainer,\n toggleDevMode: toggleDevMode\n }\n for (let methodName in exposedMethods) {\n Object.defineProperty(API, methodName, {\n enumerable: false,\n writable: false,\n configurable: false,\n value: exposedMethods[methodName]\n })\n }\n return Object.freeze(API);\n}\n\nexport default constrainedEditor;\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useTheme } from '../theme-provider';\nimport { constrainedEditor } from 'constrained-editor-plugin';\nimport MonacoEditor, { Monaco, DiffEditor } from '@monaco-editor/react';\nimport type { editor as MonacoEditorType } from 'monaco-editor';\nimport type { TextFile } from '../../lib/types';\nimport { type JsonEditorError } from '../../lib/json-types';\nimport { FORMAT } from '../../lib/env';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { Button } from '../ui/button';\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n getSelectionContext,\n createContextSnippet,\n} from '../../lib/monaco-selection-utils';\nimport { ValidationPanel, ValidationStatusBar } from './validation-panel';\nimport { monacoThemeFor, registerMonacoThemes } from '../../lib/monaco-theme';\n\n/** Ensure defaultPath matches the schema fileMatch pattern (*.FORMAT.theme.json) */\nfunction resolveThemeDefaultPath(name: string): string {\n const ext = `.${FORMAT}.theme.json`;\n if (name.endsWith(ext)) return name;\n const base = name\n .replace(/\\.\\w+\\.theme\\.json$/, '')\n .replace(/\\.theme\\.json$/, '')\n .replace(/\\.json$/, '');\n return base + ext;\n}\n\n/**\n * EditorMonacoTheme component for editing JSON theme files with schema validation\n */\nfunction EditorMonacoTheme({\n document,\n readOnly = false,\n onChange,\n}: {\n document: TextFile;\n readOnly?: boolean;\n onChange?: (value: string) => void;\n}) {\n const editorRef = useRef<MonacoEditorType.IStandaloneCodeEditor | null>(null);\n const monacoRef = useRef<Monaco | null>(null);\n const modelRef = useRef<MonacoEditorType.ITextModel | null>(null);\n const { theme } = useTheme();\n const [validationErrors, setValidationErrors] = useState<JsonEditorError[]>(\n []\n );\n const [showValidationPanel, setShowValidationPanel] = useState(true);\n const [isValidationPanelMinimized, setIsValidationPanelMinimized] =\n useState(false);\n const userDismissedRef = useRef(false);\n const pendingDiff = useDocumentsStore((s) => s.pendingDiffs[document.name]);\n const clearPendingDiff = useDocumentsStore((s) => s.clearPendingDiff);\n const saveDocument = useDocumentsStore((s) => s.saveDocument);\n const { registerEditor, unregisterEditor, setActiveEditor } =\n useEditorRefsStore();\n\n // Get resolved theme - convert 'system' to actual theme\n const resolvedTheme =\n theme === 'system'\n ? window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n : theme;\n\n // Initialize Monaco editor\n const handleEditorWillMount = useCallback((monaco: Monaco) => {\n monacoRef.current = monaco;\n // Idempotent; guards the case where an editor mounts before the global\n // configureMonaco() promise has resolved.\n registerMonacoThemes(monaco);\n // Don't call setDiagnosticsOptions here — it would clobber the global\n // config. The theme schema is already registered by configureMonacoInstance\n // and matched via defaultPath → fileMatch.\n }, []);\n\n // Handle editor mount\n const handleEditorMount = useCallback(\n (editor: MonacoEditorType.IStandaloneCodeEditor, monaco: Monaco) => {\n editorRef.current = editor;\n modelRef.current = editor.getModel();\n\n // Register editor in the refs store\n registerEditor(document.name, editor, monaco);\n setActiveEditor(document.name);\n\n // Enable constrained editing\n const constrainedInstance = constrainedEditor(monaco);\n const model = editor.getModel();\n if (model) {\n constrainedInstance.initializeIn(editor);\n }\n\n // Configure editor options\n editor.updateOptions({\n formatOnType: true,\n formatOnPaste: true,\n automaticLayout: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n folding: true,\n foldingStrategy: 'indentation',\n suggest: {\n showColors: true,\n showConstants: true,\n showEnums: true,\n showFields: true,\n showFunctions: true,\n showKeywords: true,\n showModules: true,\n showProperties: true,\n showSnippets: true,\n showStructs: true,\n showTypeParameters: true,\n showUnits: true,\n showValues: true,\n showVariables: true,\n },\n });\n\n // Add keyboard shortcuts\n // Cmd+K => send selection to AI assistant\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, () => {\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: document.name,\n selection,\n snippet,\n isTheme: true,\n },\n })\n );\n }\n });\n\n // Cmd+S => save command\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, () => {\n // Save command - parent component handles this\n console.log('Save command triggered in theme editor');\n });\n\n // Add context menu action for AI assistant\n editor.addAction({\n id: 'send-theme-to-ai-assistant',\n label: 'Send to AI Assistant (⌘K)',\n contextMenuGroupId: 'navigation',\n contextMenuOrder: 1.5,\n keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK],\n run: function () {\n // Use the editor reference from closure instead of the parameter\n const selection = getSelectionContext(editor, monaco);\n if (selection) {\n const snippet = createContextSnippet(selection);\n // Dispatch event for the chat panel to capture\n window.dispatchEvent(\n new CustomEvent('monaco-selection-to-ai', {\n detail: {\n documentName: document.name,\n selection,\n snippet,\n isTheme: true,\n },\n })\n );\n }\n },\n });\n\n // Format document on mount\n setTimeout(() => {\n editor.getAction('editor.action.formatDocument')?.run();\n }, 100);\n\n console.log('Monaco theme editor mounted');\n },\n [document.name, registerEditor, setActiveEditor]\n );\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n unregisterEditor(document.name);\n };\n }, [document.name, unregisterEditor]);\n\n // Handle content changes\n const handleChange = useCallback(\n (\n value: string | undefined,\n _event: MonacoEditorType.IModelContentChangedEvent\n ) => {\n if (value !== undefined && onChange) {\n onChange(value);\n }\n },\n [onChange]\n );\n\n // Handle Monaco's built-in schema validation markers\n const handleEditorValidation = useCallback(\n (markers: MonacoEditorType.IMarker[]) => {\n const errors: JsonEditorError[] = markers.map((marker) => ({\n path: '',\n message: marker.message,\n code:\n typeof marker.code === 'string'\n ? marker.code\n : marker.code?.value || 'validation_error',\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n severity:\n marker.severity >= 8\n ? 'error'\n : marker.severity >= 4\n ? 'warning'\n : 'info',\n }));\n\n setValidationErrors(errors);\n\n if (errors.length > 0 && !userDismissedRef.current) {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }\n if (errors.length === 0) {\n userDismissedRef.current = false;\n }\n },\n []\n );\n\n const handleErrorClick = useCallback((error: JsonEditorError) => {\n if (editorRef.current && error.startLineNumber && error.startColumn) {\n editorRef.current.setPosition({\n lineNumber: error.startLineNumber,\n column: error.startColumn,\n });\n editorRef.current.revealLineInCenter(error.startLineNumber);\n editorRef.current.focus();\n }\n }, []);\n\n // Update theme\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.updateOptions({ theme: monacoThemeFor(resolvedTheme) });\n }\n }, [resolvedTheme]);\n\n return (\n <div className=\"relative h-full\">\n {pendingDiff ? (\n <>\n <div className=\"flex items-center justify-between px-2 py-1 border-b bg-muted/40 text-xs\">\n <div>\n Review changes for{' '}\n <span className=\"font-medium\">{document.name}</span>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() => clearPendingDiff(document.name)}\n >\n Discard\n </Button>\n <Button\n size=\"sm\"\n onClick={() => {\n saveDocument(document.name, pendingDiff.modified);\n clearPendingDiff(document.name, true);\n }}\n >\n Apply Changes\n </Button>\n </div>\n </div>\n <DiffEditor\n height=\"calc(100% - 32px)\"\n original={pendingDiff.original}\n modified={pendingDiff.modified}\n language=\"json\"\n theme={monacoThemeFor(resolvedTheme)}\n options={{\n readOnly: true,\n renderSideBySide: true,\n originalEditable: false,\n automaticLayout: true,\n minimap: { enabled: false },\n }}\n beforeMount={handleEditorWillMount}\n />\n </>\n ) : (\n <MonacoEditor\n height=\"100%\"\n language=\"json\"\n defaultPath={resolveThemeDefaultPath(document.name)}\n value={document.text}\n theme={monacoThemeFor(resolvedTheme)}\n onChange={handleChange}\n beforeMount={handleEditorWillMount}\n onMount={handleEditorMount}\n onValidate={handleEditorValidation}\n options={{\n readOnly,\n lineNumbers: 'on',\n glyphMargin: true,\n folding: true,\n lineDecorationsWidth: 5,\n lineNumbersMinChars: 3,\n renderValidationDecorations: 'on',\n quickSuggestions: {\n other: true,\n comments: false,\n strings: true,\n },\n acceptSuggestionOnCommitCharacter: true,\n acceptSuggestionOnEnter: 'on',\n accessibilitySupport: 'auto',\n autoIndent: 'advanced',\n formatOnType: true,\n formatOnPaste: true,\n automaticLayout: true,\n minimap: { enabled: false },\n scrollBeyondLastLine: true,\n wordWrap: 'on',\n }}\n />\n )}\n\n {/* Validation Status Bar */}\n <div className=\"absolute top-0 right-0\">\n <ValidationStatusBar\n errors={validationErrors}\n onClick={() => {\n setShowValidationPanel(true);\n setIsValidationPanelMinimized(false);\n }}\n />\n </div>\n\n {/* Validation Panel */}\n {showValidationPanel && validationErrors.length > 0 && (\n <ValidationPanel\n errors={validationErrors}\n isMinimized={isValidationPanelMinimized}\n onToggleMinimize={() =>\n setIsValidationPanelMinimized(!isValidationPanelMinimized)\n }\n onErrorClick={handleErrorClick}\n onClose={() => {\n setShowValidationPanel(false);\n userDismissedRef.current = true;\n }}\n className=\"z-40\"\n />\n )}\n </div>\n );\n}\n\nexport const EditorMonacoThemeMemoized = React.memo(EditorMonacoTheme);\n","import React from 'react';\nimport { EditorMonacoJsonMemoized } from '../json-editor/editor-monaco-json';\nimport { EditorMonacoThemeMemoized } from '../json-editor/editor-monaco-theme';\nimport { TabsContent } from '../ui/tabs';\nimport { useDocumentsStore } from '../../store/documents-store-provider';\nimport { useThemesStore } from '../../store/themes-store-provider';\nimport type { TextFile } from '../../lib/types';\nimport type { DocumentType } from '../../store/documents-store';\nimport debounce from 'lodash.debounce';\n\nfunction TabContent({\n name,\n text,\n buildError: _buildError,\n saveDocumentDebounceWait,\n documentType,\n}: {\n name: string;\n text: string;\n buildError?: string;\n saveDocumentDebounceWait: number;\n documentType: DocumentType;\n}) {\n const { saveDocument } = useDocumentsStore((state) => state);\n const { updateTheme } = useThemesStore((state) => state);\n\n // Create a debounced version of updateTheme\n const debouncedUpdateTheme = React.useMemo(\n () => debounce(updateTheme, saveDocumentDebounceWait),\n [updateTheme, saveDocumentDebounceWait]\n );\n\n // Flush pending theme updates on unmount so the themes store is always\n // up-to-date when the user switches away from a theme tab.\n React.useEffect(() => {\n return () => {\n debouncedUpdateTheme.flush();\n };\n }, [debouncedUpdateTheme]);\n\n const handleChange = React.useCallback(\n (value: string) => {\n saveDocument(name, value);\n\n // If this is a theme document, update the themes store with debouncing\n if (documentType === 'application/json+theme') {\n console.log(\n 'TabContent: Theme document change detected, debouncing update',\n {\n documentName: name,\n debounceWait: saveDocumentDebounceWait,\n }\n );\n debouncedUpdateTheme(name, value);\n }\n },\n [\n name,\n saveDocument,\n debouncedUpdateTheme,\n documentType,\n saveDocumentDebounceWait,\n ]\n );\n\n // Create a fake document object for the theme editor\n const document: TextFile = React.useMemo(\n () => ({\n name,\n type: 'application/json',\n text,\n mtime: new Date(),\n ctime: new Date(),\n atime: new Date(),\n }),\n [name, text]\n );\n\n return (\n <TabsContent\n value={name}\n className=\"mt-0 h-full p-0\"\n tabIndex={-1} // to prevent focus on Tab trigger (fix for accessibility size issue)\n >\n {documentType === 'application/json+theme' ? (\n <EditorMonacoThemeMemoized\n document={document}\n onChange={handleChange}\n />\n ) : (\n <EditorMonacoJsonMemoized\n name={name}\n value={text}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n />\n )}\n </TabsContent>\n );\n}\n\nconst TabContentMemoized = React.memo(TabContent);\n\nfunction EditorTabsContent({\n openTabs,\n documents,\n buildErrors,\n saveDocumentDebounceWait,\n}: {\n openTabs: string[];\n documents: TextFile[];\n buildErrors: Record<string, string>;\n saveDocumentDebounceWait: number;\n}) {\n const { documentTypes } = useDocumentsStore((state) => state);\n\n return openTabs\n .map((name) => documents.find((d) => d.name === name))\n .filter((doc): doc is TextFile => doc !== undefined)\n .map((doc) => {\n const documentType = documentTypes[doc.name] || 'application/json+report';\n\n return (\n <TabContentMemoized\n key={doc.name}\n name={doc.name}\n text={doc.text}\n buildError={buildErrors[doc.name]}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n documentType={documentType}\n />\n );\n });\n}\n\nexport const EditorTabsContentMemoized = React.memo(EditorTabsContent);\n","export interface RetryOptions {\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffFactor?: number;\n onRetry?: (error: Error, attempt: number) => void;\n shouldRetry?: (error: Error) => boolean;\n signal?: AbortSignal;\n}\n\nexport class RetryError extends Error {\n constructor(\n message: string,\n public readonly lastError: Error,\n public readonly attempts: number\n ) {\n super(message);\n this.name = 'RetryError';\n }\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const {\n maxRetries = 3,\n initialDelay = 1000,\n maxDelay = 30000,\n backoffFactor = 2,\n onRetry,\n shouldRetry = () => true,\n signal,\n } = options;\n\n let lastError: Error;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Check if operation was cancelled\n if (signal?.aborted) {\n throw new Error('Operation cancelled');\n }\n\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n // Don't retry if it's the last attempt\n if (attempt === maxRetries) {\n break;\n }\n\n // Check if we should retry this error\n if (!shouldRetry(lastError)) {\n throw lastError;\n }\n\n // Calculate delay with exponential backoff\n const delay = Math.min(\n initialDelay * Math.pow(backoffFactor, attempt),\n maxDelay\n );\n\n // Add some jitter to prevent thundering herd\n const jitteredDelay = delay * (0.5 + Math.random() * 0.5);\n\n // Call retry callback if provided\n if (onRetry) {\n onRetry(lastError, attempt + 1);\n }\n\n // Wait before retrying\n await new Promise((resolve) => {\n const timeoutId = setTimeout(resolve, jitteredDelay);\n\n // Clean up timeout if cancelled\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n clearTimeout(timeoutId);\n resolve(undefined);\n },\n { once: true }\n );\n }\n });\n }\n }\n\n throw new RetryError(\n `Failed after ${maxRetries + 1} attempts`,\n lastError!,\n maxRetries + 1\n );\n}\n\n/**\n * Retry decorator for class methods\n */\nexport function Retryable(options: RetryOptions = {}) {\n return function (\n _target: any,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (...args: any[]) {\n return retry(() => originalMethod.apply(this, args), options);\n };\n\n return descriptor;\n };\n}\n\n/**\n * Common retry strategies\n */\nexport const RetryStrategies = {\n // Retry on network errors\n networkErrors: (error: Error) => {\n const networkErrorPatterns = [\n 'NetworkError',\n 'Failed to fetch',\n 'ERR_NETWORK',\n 'ECONNREFUSED',\n 'ETIMEDOUT',\n 'ENOTFOUND',\n 'fetch failed',\n ];\n\n return networkErrorPatterns.some(\n (pattern) =>\n error.message.includes(pattern) || error.name.includes(pattern)\n );\n },\n\n // Retry on specific HTTP status codes\n httpStatusCodes: (statusCodes: number[]) => (error: any) => {\n if (error.response?.status) {\n return statusCodes.includes(error.response.status);\n }\n return false;\n },\n\n // Retry on temporary errors\n temporaryErrors: (error: Error) => {\n const temporaryPatterns = [\n 'EBUSY',\n 'EAGAIN',\n 'temporarily unavailable',\n 'too many requests',\n 'rate limit',\n ];\n\n return temporaryPatterns.some((pattern) =>\n error.message.toLowerCase().includes(pattern.toLowerCase())\n );\n },\n\n // Combine multiple strategies\n combine:\n (...strategies: ((error: Error) => boolean)[]) =>\n (error: Error) => {\n return strategies.some((strategy) => strategy(error));\n },\n};\n","import {\n useEffect,\n useCallback,\n useRef,\n useMemo,\n memo,\n useContext,\n} from 'react';\nimport { EditorTabsContentMemoized } from './editor-tabs-content';\nimport { Tabs } from '../ui/tabs';\nimport {\n useDocumentsStore,\n DocumentsStoreContext,\n} from '../../store/documents-store-provider';\nimport {\n useOutputStore,\n OutputStoreContext,\n} from '../../store/output-store-provider';\nimport { useSettingsStore } from '../../store/settings-store-provider';\nimport { useEditorRefsStore } from '../../store/editor-refs-store';\nimport {\n useThemesStore,\n ThemesStoreContext,\n} from '../../store/themes-store-provider';\nimport {\n QualityGateFailedError,\n usePresentationGenerator,\n} from '../../hooks/usePresentationGenerator';\nimport { useQualityAnalysis } from '../../hooks/useQualityAnalysis';\nimport { FORMAT } from '../../lib/env';\nimport {\n buildQualityOptions,\n storedProfileId,\n} from '../../lib/quality-profiles';\nimport {\n isStaleQualityTicket,\n nextQualityTicket,\n} from '../../lib/quality-sequence';\nimport {\n countBySeverity,\n findingsFromAnalysis,\n splitQualityWarnings,\n type GenerationWarningLike,\n} from '../../lib/quality-findings';\nimport type { GenerationWarning, QualityState } from '../../store/output-store';\nimport { retry, RetryStrategies } from '../../utils/retry';\nimport { themeChangeEmitter } from '../../utils/theme-change-emitter';\nimport { useShallow } from 'zustand/react/shallow';\n\ninterface BuildRequest {\n id: string;\n docName: string;\n doc: any;\n signal: AbortSignal;\n timestamp: number;\n /** Ordering ticket for the quality slice; see lib/quality-sequence.ts. */\n qualityTicket: number;\n}\n\nfunction EditorComponent() {\n const setOutput = useOutputStore((state) => state.setOutput);\n const outputStore = useContext(OutputStoreContext)!;\n const documentsStore = useContext(DocumentsStoreContext)!;\n const themesStore = useContext(ThemesStoreContext)!;\n const saveDocumentDebounceWait = useSettingsStore(\n (state) => state.saveDocumentDebounceWait\n );\n const {\n openTabs,\n activeTab,\n setActiveTab,\n documents,\n buildErrors,\n setBuildError,\n documentTypes,\n } = useDocumentsStore(\n useShallow((state) => ({\n openTabs: state.openTabs,\n activeTab: state.activeTab,\n setActiveTab: state.setActiveTab,\n documents: state.documents,\n buildErrors: state.buildErrors,\n setBuildError: state.setBuildError,\n documentTypes: state.documentTypes,\n }))\n );\n const { customThemes } = useThemesStore(\n useShallow((state) => ({ customThemes: state.customThemes }))\n );\n const { generatePresentation, cancelGeneration } = usePresentationGenerator();\n const qualityProfileIds = useSettingsStore(\n (state) => state.qualityProfileIds\n );\n const qualityProfileId = storedProfileId(qualityProfileIds);\n const qualityGate = useSettingsStore((state) => state.qualityGate);\n const qualityPolicyText = useSettingsStore(\n (state) => state.qualityPolicies?.[FORMAT]\n );\n const qualityOptions = useMemo(\n () => buildQualityOptions(qualityProfileId, qualityGate, qualityPolicyText),\n [qualityProfileId, qualityGate, qualityPolicyText]\n );\n const { analyze: analyzeQuality, cancel: cancelQualityAnalysis } =\n useQualityAnalysis();\n\n // Refs to track ongoing operations and prevent race conditions\n const buildAbortControllersRef = useRef<Map<string, AbortController>>(\n new Map()\n );\n const buildTimeoutsRef = useRef<Map<string, NodeJS.Timeout>>(new Map());\n // Debounce timer for Run-button builds (150ms to coalesce rapid clicks).\n const flushBuildTimerRef = useRef<NodeJS.Timeout | null>(null);\n const lastBuildRequestIdRef = useRef<string>('');\n const documentVersionsRef = useRef<Map<string, number>>(new Map());\n\n // User-initiated cancel from the loading UI: invalidate the current request\n // id first (so both build paths take their quiet \"cancelled\" exit instead of\n // surfacing a global error), then abort the controllers and the in-flight\n // fetch.\n const cancelActiveBuild = useCallback(() => {\n lastBuildRequestIdRef.current = `cancelled-${Date.now()}`;\n // Also drop queued debounced builds — without this, a pending auto-build\n // timer could start a new generation right after the user cancelled.\n for (const timeout of buildTimeoutsRef.current.values()) {\n clearTimeout(timeout);\n }\n buildTimeoutsRef.current.clear();\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n flushBuildTimerRef.current = null;\n }\n for (const controller of buildAbortControllersRef.current.values()) {\n controller.abort();\n }\n buildAbortControllersRef.current.clear();\n cancelGeneration();\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n }, [cancelGeneration, setOutput]);\n\n useEffect(() => {\n setOutput({ cancelGeneration: cancelActiveBuild });\n }, [cancelActiveBuild, setOutput]);\n\n // Get or create a document version number\n const getDocumentVersion = useCallback((docName: string) => {\n const currentVersion = documentVersionsRef.current.get(docName) || 0;\n const newVersion = currentVersion + 1;\n documentVersionsRef.current.set(docName, newVersion);\n return newVersion;\n }, []);\n\n // Prepare valid custom themes with deep comparison\n const customThemesContentHash = useMemo(() => {\n // Create a content hash of all themes to detect deep changes\n const themeData = Object.entries(customThemes).map(([key, theme]) => {\n // Handle lastModified that might be a string (from localStorage) or Date\n let lastModifiedTime = 0;\n if (theme.lastModified) {\n if (theme.lastModified instanceof Date) {\n lastModifiedTime = theme.lastModified.getTime();\n } else if (typeof theme.lastModified === 'string') {\n lastModifiedTime = new Date(theme.lastModified).getTime();\n }\n }\n\n return {\n key,\n name: theme.name,\n content: theme.content,\n valid: theme.valid,\n lastModified: lastModifiedTime,\n };\n });\n return JSON.stringify(themeData);\n }, [customThemes]);\n\n const validCustomThemes = useMemo(() => {\n const themes: { [key: string]: any } = {};\n Object.values(customThemes).forEach((theme) => {\n if (theme.valid && theme.parsed) {\n themes[theme.name] = theme.parsed;\n }\n });\n return themes;\n }, [customThemesContentHash]);\n\n // Helper function to get fresh theme data (bypasses memo)\n const getFreshThemeData = useCallback(() => {\n const freshThemes: { [key: string]: any } = {};\n const { customThemes } = themesStore.getState();\n Object.values(customThemes).forEach((theme) => {\n if (theme.valid && theme.parsed) {\n freshThemes[theme.name] = theme.parsed;\n }\n });\n return freshThemes;\n }, [themesStore]);\n\n // Helper function to build a document with proper cancellation and retry\n const buildDocument = useCallback(\n async (\n doc: any,\n signal?: AbortSignal,\n options?: { bypassCache?: boolean }\n ) => {\n if (!doc || !generatePresentation) {\n return;\n }\n\n // Cancel any existing build operation for this document\n const existingController = buildAbortControllersRef.current.get(doc.name);\n if (existingController) {\n existingController.abort();\n buildAbortControllersRef.current.delete(doc.name);\n }\n\n // Create new abort controller if not provided\n const abortController = signal ? null : new AbortController();\n const finalSignal = signal || abortController!.signal;\n if (abortController) {\n buildAbortControllersRef.current.set(doc.name, abortController);\n }\n\n // Create build request\n const requestId = `${doc.name}-${Date.now()}-${Math.random()}`;\n const version = getDocumentVersion(doc.name);\n lastBuildRequestIdRef.current = requestId;\n\n const buildRequest: BuildRequest = {\n id: requestId,\n docName: doc.name,\n doc,\n signal: finalSignal,\n timestamp: Date.now(),\n // Claimed now, not on completion: a long build must not overwrite the\n // live analysis of an edit made while it was running.\n qualityTicket: nextQualityTicket(),\n };\n\n await processBuildRequestRef.current(buildRequest, version, options);\n },\n [generatePresentation, setOutput, getDocumentVersion]\n );\n\n // Process a build request from the queue\n const processBuildRequest = useCallback(\n async (\n request: BuildRequest,\n version: number,\n options?: { bypassCache?: boolean }\n ) => {\n const { doc, signal, id, qualityTicket } = request;\n // A build's findings describe the text it was handed. Anything newer in\n // the store was computed against text the editor actually holds now.\n const qualityIfCurrent = (next: QualityState) =>\n isStaleQualityTicket(outputStore.getState().quality, qualityTicket)\n ? {}\n : { quality: next };\n\n // Check if this is still the latest request\n if (lastBuildRequestIdRef.current !== id) {\n console.log('Skipping outdated build request for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n setOutput({\n globalError: undefined,\n isGenerating: true,\n generationStartedAt: Date.now(),\n generationProgress: {\n stage: 'parsing',\n message: 'Validating JSON structure...',\n },\n });\n\n const onProgress = (\n stage: 'parsing' | 'building' | 'rendering' | 'finalizing',\n message?: string\n ) => {\n if (signal.aborted || lastBuildRequestIdRef.current !== id) return;\n\n // Check document version to ensure we're still building the latest\n const currentVersion = documentVersionsRef.current.get(doc.name) || 0;\n if (currentVersion !== version) {\n console.log('Document version changed, aborting build');\n signal.dispatchEvent(new Event('abort'));\n return;\n }\n\n setOutput({\n isGenerating: true,\n generationProgress: { stage, message },\n });\n };\n\n try {\n // Always get fresh theme data to ensure latest changes are applied\n const freshThemeData = getFreshThemeData();\n\n console.log('Editor: Using themes for document build', {\n docName: doc.name,\n freshThemeCount: Object.keys(freshThemeData).length,\n freshThemeNames: Object.keys(freshThemeData),\n memoizedCount: Object.keys(validCustomThemes).length,\n requestId: id,\n });\n\n // Retry logic for temporary failures\n const result = await retry(\n async () => {\n if (signal.aborted) throw new Error('Build cancelled');\n return await generatePresentation(\n doc.name,\n doc.text,\n freshThemeData,\n onProgress,\n {\n ...options,\n ...(qualityOptions ? { quality: qualityOptions } : {}),\n }\n );\n },\n {\n maxRetries: 2,\n initialDelay: 500,\n shouldRetry: (error) => {\n // Don't retry on cancellation or syntax errors\n if (\n error.message.includes('cancelled') ||\n error.message.includes('JSON') ||\n error.message.includes('parse') ||\n error.message.includes('syntax')\n ) {\n return false;\n }\n // Retry on worker errors\n return RetryStrategies.combine(\n RetryStrategies.temporaryErrors,\n (e) =>\n e.message.includes('Worker') || e.message.includes('Proxy')\n )(error);\n },\n onRetry: (error, attempt) => {\n console.log(\n `Retrying presentation generation (attempt ${attempt}):`,\n error.message\n );\n setOutput({\n isGenerating: true,\n generationProgress: {\n stage: 'parsing',\n message: `Retrying generation (attempt ${attempt})...`,\n },\n });\n },\n signal,\n }\n );\n\n if (signal.aborted || lastBuildRequestIdRef.current !== id) {\n console.log('Build cancelled for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n if (\n result &&\n typeof result === 'object' &&\n 'name' in result &&\n 'text' in result &&\n 'blob' in result\n ) {\n console.log('Editor: Build completed', {\n docName: result.name,\n blobSize: (result.blob as Blob)?.size,\n timestamp: Date.now(),\n requestId: id,\n version,\n });\n\n // Quality findings arrive flattened into the same warnings array\n // as component warnings. Left there they are counted as warnings\n // whatever their real severity, which is how a stock deck's two\n // hundred advisory infos became a warning-coloured bar.\n const { findings, others } = splitQualityWarnings(\n (result as any).warnings as\n | GenerationWarningLike[]\n | null\n | undefined\n );\n\n setOutput({\n name: result.name as string,\n text: result.text as string,\n blob: result.blob as Blob,\n renderer: result.renderer as string | undefined,\n globalError: undefined,\n isGenerating: false,\n isPreviewStale: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n lastBuiltSequence: outputStore.getState().editSequence,\n cacheStatus: (result as any).cacheStatus as\n | 'HIT'\n | 'MISS'\n | 'UNKNOWN'\n | undefined,\n cacheHitRate: (result as any).cacheHitRate as string | undefined,\n warnings: others as GenerationWarning[],\n ...qualityIfCurrent({\n findings,\n counts: countBySeverity(findings),\n // The generate response does not name the profile it ran, so\n // only an explicit choice is reported; a blank label is honest\n // about the server having picked the format's default.\n ...(qualityProfileId ? { profileId: qualityProfileId } : {}),\n documentName: doc.name,\n seq: qualityTicket,\n source: 'generate',\n analyzedAt: Date.now(),\n }),\n });\n setBuildError(result.name as string, undefined);\n }\n } catch (error) {\n if (signal.aborted || lastBuildRequestIdRef.current !== id) {\n console.log('Build cancelled with error for:', doc.name);\n setOutput({\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n });\n return;\n }\n\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // A gate rejection is the only failure that says something about the\n // document rather than about the request, and it ships the findings\n // that caused it — so the panel names them instead of leaving the\n // author with \"blocked\" and nothing to act on.\n const gateFindings =\n error instanceof QualityGateFailedError\n ? findingsFromAnalysis(error.quality)\n : null;\n\n setOutput({\n globalError: errorMessage,\n isGenerating: false,\n generationProgress: undefined,\n generationStartedAt: undefined,\n ...(gateFindings\n ? qualityIfCurrent({\n findings: gateFindings,\n counts: countBySeverity(gateFindings),\n ...(qualityProfileId ? { profileId: qualityProfileId } : {}),\n documentName: doc.name,\n seq: qualityTicket,\n blocked: true,\n source: 'generate' as const,\n analyzedAt: Date.now(),\n gateError: errorMessage,\n })\n : {}),\n });\n\n setBuildError(doc.name, errorMessage);\n } finally {\n buildAbortControllersRef.current.delete(doc.name);\n }\n },\n [\n generatePresentation,\n getFreshThemeData,\n qualityOptions,\n qualityProfileId,\n setOutput,\n setBuildError,\n outputStore,\n ]\n );\n const processBuildRequestRef = useRef(processBuildRequest);\n useEffect(() => {\n processBuildRequestRef.current = processBuildRequest;\n });\n\n // Track the last viewed document for theme updates\n const lastViewedDocumentRef = useRef<string | null>(null);\n\n // re-build on active tab change or any document change\n useEffect(() => {\n console.log('Editor: Document rebuild effect triggered', {\n activeTab,\n });\n\n const activeFile = documents.find((doc) => doc.name === activeTab);\n const docType = documentTypes[activeTab] || 'application/json+report';\n\n // Track last viewed document\n if (docType === 'application/json+report' && activeFile) {\n lastViewedDocumentRef.current = activeTab;\n }\n\n // Clear any pending build timeout for this document\n const existingTimeout = buildTimeoutsRef.current.get(activeTab);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n buildTimeoutsRef.current.delete(activeTab);\n }\n\n if (activeFile && docType === 'application/json+report') {\n // Editing marks the preview stale rather than rebuilding: a build costs\n // a LibreOffice conversion, so it waits for Run. Do not clobber a build\n // already in flight (e.g. one the Run button started).\n if (!outputStore.getState().isGenerating) {\n setOutput({ isPreviewStale: true });\n }\n } else if (activeFile && docType === 'application/json+theme') {\n // Theme tab active — no document preview to build.\n // Don't clear blob: preserve the last document preview in the background.\n cancelGeneration();\n }\n\n // Cleanup function to cancel pending operations\n return () => {\n const timeout = buildTimeoutsRef.current.get(activeTab);\n if (timeout) {\n clearTimeout(timeout);\n buildTimeoutsRef.current.delete(activeTab);\n }\n };\n }, [\n documents,\n activeTab,\n setOutput,\n documentTypes,\n buildDocument,\n cancelGeneration,\n ]);\n\n // Refresh the quality findings as the document settles, so the panel tracks\n // the editor instead of only the last build. `analyze` debounces and aborts\n // its own in-flight request, so a stale analysis can never land on top of a\n // newer one; returning `cancel` drops the pending work on unmount and on a\n // document switch.\n useEffect(() => {\n const activeFile = documents.find((doc) => doc.name === activeTab);\n const docType = documentTypes[activeTab] || 'application/json+report';\n if (!activeFile || docType !== 'application/json+report') {\n // A theme has no document findings of its own, and an analysis started\n // for the previous tab would report them under this one. Clearing rather\n // than only cancelling matters because nothing else ever will: without\n // it the previous document's findings stay on screen, and actionable,\n // for as long as a theme tab is open.\n cancelQualityAnalysis();\n setOutput({ quality: null });\n return;\n }\n analyzeQuality(activeTab, activeFile.text);\n return cancelQualityAnalysis;\n }, [\n activeTab,\n analyzeQuality,\n cancelQualityAnalysis,\n documents,\n documentTypes,\n setOutput,\n ]);\n\n // Track which documents use which themes (only parse the active doc to avoid O(n) JSON.parse)\n const documentThemeDependencies = useMemo(() => {\n const deps = new Map<string, string>();\n const activeDoc = documents.find((d) => d.name === activeTab);\n if (\n activeDoc &&\n documentTypes[activeDoc.name] === 'application/json+report'\n ) {\n try {\n const parsed = JSON.parse(activeDoc.text);\n const themeName = parsed.props?.theme;\n if (typeof themeName === 'string') {\n const themeExists = Object.values(customThemes).some(\n (t) => t.name === themeName && t.valid\n );\n if (themeExists) {\n deps.set(activeDoc.name, themeName);\n }\n }\n } catch {\n // Ignore parse errors\n }\n }\n return deps;\n }, [activeTab, documents, documentTypes, customThemes]);\n\n // Listen for theme change events and force immediate rebuild\n useEffect(() => {\n console.log('Editor: Setting up theme change listener', {\n documentCount: documents.length,\n dependencyCount: documentThemeDependencies.size,\n dependencies: Array.from(documentThemeDependencies.entries()),\n customThemes: Object.entries(customThemes).map(([key, theme]) => ({\n key,\n name: theme.name,\n valid: theme.valid,\n })),\n });\n\n const unsubscribe = themeChangeEmitter.onThemeChange((event) => {\n console.log('Editor: Theme change detected', {\n event,\n dependencies: Array.from(documentThemeDependencies.entries()),\n activeTab,\n customThemes: Object.entries(customThemes).map(([key, theme]) => ({\n key,\n name: theme.name,\n valid: theme.valid,\n })),\n });\n\n // Find all documents that use this theme\n const documentsUsingTheme: any[] = [];\n\n documentThemeDependencies.forEach((themeName, docName) => {\n if (themeName === event.themeName) {\n const doc = documents.find((d) => d.name === docName);\n if (doc) {\n documentsUsingTheme.push(doc);\n }\n }\n });\n\n console.log('Editor: Documents using changed theme', {\n themeName: event.themeName,\n documentCount: documentsUsingTheme.length,\n documentNames: documentsUsingTheme.map((d) => d.name),\n });\n\n if (documentsUsingTheme.length === 0) {\n console.log('Editor: No documents use this theme, skipping rebuild');\n return;\n }\n\n // A theme change invalidates the preview of every document using it;\n // rebuilding is the author’s call, as it is for a document edit.\n if (!outputStore.getState().isGenerating) {\n setOutput({ isPreviewStale: true });\n }\n });\n\n return unsubscribe;\n }, [\n documentThemeDependencies,\n documents,\n buildDocument,\n getDocumentVersion,\n activeTab,\n setOutput,\n ]);\n\n // Flush debounces and immediately build — triggered by Run button via custom event\n // Debounced at 150ms to coalesce rapid clicks\n // Stable refs so the event handler never goes stale and doesn't need\n // reactive deps that would cause cleanup to cancel the pending timeout\n const buildDocumentRef = useRef(buildDocument);\n useEffect(() => {\n buildDocumentRef.current = buildDocument;\n });\n const getDocumentVersionRef = useRef(getDocumentVersion);\n useEffect(() => {\n getDocumentVersionRef.current = getDocumentVersion;\n });\n\n useEffect(() => {\n const handler = () => {\n // Mark generating early so the rebuild effect (triggered by saveDocument\n // below) doesn't clobber this build with isPreviewStale\n setOutput({ isGenerating: true });\n\n // 1. Flush Monaco debounce: read live text, save to store immediately\n let themeDirty = false;\n const editorRef = useEditorRefsStore.getState().getActiveEditor();\n if (editorRef) {\n // Don't flush if a pending diff is active — editor may be disposed\n const hasPendingDiff =\n documentsStore.getState().pendingDiffs[editorRef.documentName];\n if (!hasPendingDiff) {\n const liveText = editorRef.toStorageValue(\n editorRef.editor.getValue()\n );\n documentsStore\n .getState()\n .saveDocument(editorRef.documentName, liveText);\n }\n }\n\n // Flush all open theme editors whose live text differs from the\n // themes store so the build always uses up-to-date theme data.\n const { documents: allDocs, documentTypes: allDtypes } =\n documentsStore.getState();\n for (const doc of allDocs) {\n if (allDtypes[doc.name] === 'application/json+theme') {\n const ref = useEditorRefsStore.getState().getEditor(doc.name);\n if (ref) {\n const liveText = ref.toStorageValue(ref.editor.getValue());\n const existing = themesStore.getState().customThemes[doc.name];\n if (!existing || existing.content !== liveText) {\n themesStore.getState().updateTheme(doc.name, liveText);\n themeDirty = true;\n }\n }\n }\n }\n\n // 2. Cancel any pending build timeout for active doc\n const currentTab = documentsStore.getState().activeTab;\n const timeout = buildTimeoutsRef.current.get(currentTab);\n if (timeout) {\n clearTimeout(timeout);\n buildTimeoutsRef.current.delete(currentTab);\n }\n\n // 3. Debounce the actual build to coalesce rapid Run clicks\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n }\n flushBuildTimerRef.current = setTimeout(() => {\n flushBuildTimerRef.current = null;\n const {\n documents: docs,\n activeTab: tab,\n documentTypes: dtypes,\n } = documentsStore.getState();\n\n // Determine target: if active tab is a theme, build the last-viewed document instead\n let targetName = tab;\n const tabType = dtypes[tab] || 'application/json+report';\n if (tabType === 'application/json+theme') {\n if (lastViewedDocumentRef.current) {\n targetName = lastViewedDocumentRef.current;\n } else {\n // No document was viewed yet — nothing to build\n setOutput({ isGenerating: false });\n return;\n }\n }\n\n const freshDoc = docs.find((d) => d.name === targetName);\n if (freshDoc) {\n // If a pending diff exists (AI suggestion), preview the modified version\n const pending = documentsStore.getState().pendingDiffs[targetName];\n const ref = useEditorRefsStore.getState().getEditor(targetName);\n const doc = pending\n ? { ...freshDoc, text: pending.modified }\n : ref\n ? { ...freshDoc, text: ref.toStorageValue(ref.editor.getValue()) }\n : freshDoc;\n getDocumentVersionRef.current(doc.name);\n // Bypass cache only when a theme was updated during this flush\n buildDocumentRef.current(\n doc,\n undefined,\n themeDirty ? { bypassCache: true } : undefined\n );\n } else {\n setOutput({ isGenerating: false });\n }\n }, 150);\n };\n\n window.addEventListener('preview:flushAndBuild', handler);\n return () => {\n window.removeEventListener('preview:flushAndBuild', handler);\n if (flushBuildTimerRef.current) {\n clearTimeout(flushBuildTimerRef.current);\n }\n };\n }, [setOutput, documentsStore, themesStore]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n // Cancel all pending builds\n buildAbortControllersRef.current.forEach((controller) =>\n controller.abort()\n );\n buildAbortControllersRef.current.clear();\n\n // Clear all timeouts\n buildTimeoutsRef.current.forEach((timeout) => clearTimeout(timeout));\n buildTimeoutsRef.current.clear();\n\n // Cancel any ongoing generation\n cancelGeneration();\n };\n }, [cancelGeneration]);\n\n if (!openTabs.length) {\n return (\n <div className=\"flex flex-col text-muted-foreground h-full items-center justify-center\">\n {!documents?.length ? 'Create a new document...' : 'Open a document...'}\n </div>\n );\n }\n\n return (\n <Tabs value={activeTab} onValueChange={setActiveTab} className=\"h-full\">\n {/* Tabs header removed to gain vertical space */}\n <EditorTabsContentMemoized\n openTabs={openTabs}\n documents={documents}\n buildErrors={buildErrors}\n saveDocumentDebounceWait={saveDocumentDebounceWait}\n />\n </Tabs>\n );\n}\n\n// Export memoized version of Editor component\nexport const Editor = memo(EditorComponent);\n"],"names":["validators","monaco","dummyDiv","dummyEditorInstance","editorInstanceConstructorName","editorModelConstructorName","valueToValidate","ranges","rangeObj","num","TypeMustBe","type","key","additional","deepClone","byPassPrimitives","value","callback","cloneArray","array","keys","arrayClone","i","cloner","object","clone","config","constructOptionForCode","options","acc","option","codes","methods","API","methodName","enums","constrainedModel","model","rangeConstructor","sortRangesInAscendingOrder","rangeObject1","rangeObject2","rangeA","rangeB","normalizeRange","range","content","lines","noOfLines","normalizedRange","index","actualStartCol","startLineNo","maxCols","actualEndLine","actualEndCol","endLineNo","restrictions","prepareRestrictions","restriction","startLine","startCol","endLine","endCol","getCurrentEditableRanges","getValueInEditableRanges","updateValueInEditableRanges","forceMoveMarkers","restrictionsMap","label","doesChangeHasMultilineConflict","newRange","isChangeInvalidAsPerUser","disposeRestrictions","handleUnhandledPromiseRejection","isCursorAtCheckPoint","positions","position","posLineNumber","posCol","length","addEditableRangeListener","triggerChangeListenersWith","currentChanges","allChanges","currentRanges","doUndo","updateRange","finalLine","finalColumn","changes","changeIndex","oldRangeEndLineNumber","oldRangeEndColumn","changesLength","diffInCol","diffInRow","cursorPositions","noOfCursorPositions","change","cursorPosition","nextRestriction","nextRange","nextChange","rangeInChange","rangeAsString","rangeMapValue","getInfoFrom","editableRange","info","updateRestrictions","toggleHighlightOfEditableAreas","cssClasses","cssClassForSingleLine","cssClassForMultiLine","decorations","decoration","setAllRangesToPrev","rangeMap","text","manipulatorApi","contentChangedEvent","isUndoing","editedRange","changedRange","noOfLinesAdded","noOfColsAddedAtLastLine","lineDiffInRange","colDiffInRange","columnsCarriedToEnd","values","currentlyEditedRanges","rangeString","exposedApi","funcName","apiName","constrainedEditor","listenerFn","editorInstance","selections","selection","_uriRestrictionMap","isInstanceValid","isModelValid","isRangesValid","initInEditorInstance","domNode","manipulator","newDomNode","addRestrictionsTo","modelToConstrain","removeRestrictionsIn","uri","restrictedModel","disposeConstrainer","toggleDevMode","editor","startLineNumber","endLineNumber","startColumn","endColumn","exposedMethods","resolveThemeDefaultPath","name","ext","FORMAT","EditorMonacoTheme","document","readOnly","onChange","editorRef","useRef","monacoRef","modelRef","theme","useTheme","validationErrors","setValidationErrors","useState","showValidationPanel","setShowValidationPanel","isValidationPanelMinimized","setIsValidationPanelMinimized","userDismissedRef","pendingDiff","useDocumentsStore","s","clearPendingDiff","saveDocument","registerEditor","unregisterEditor","setActiveEditor","useEditorRefsStore","resolvedTheme","handleEditorWillMount","useCallback","registerMonacoThemes","handleEditorMount","constrainedInstance","getSelectionContext","snippet","createContextSnippet","_a","useEffect","handleChange","_event","handleEditorValidation","markers","errors","marker","handleErrorClick","error","monacoThemeFor","jsxs","Fragment","jsx","Button","DiffEditor","MonacoEditor","ValidationStatusBar","ValidationPanel","EditorMonacoThemeMemoized","React","TabContent","_buildError","saveDocumentDebounceWait","documentType","state","updateTheme","useThemesStore","debouncedUpdateTheme","debounce","TabsContent","EditorMonacoJsonMemoized","TabContentMemoized","EditorTabsContent","openTabs","documents","buildErrors","documentTypes","d","doc","EditorTabsContentMemoized","RetryError","message","lastError","attempts","retry","fn","maxRetries","initialDelay","maxDelay","backoffFactor","onRetry","shouldRetry","signal","attempt","jitteredDelay","resolve","timeoutId","RetryStrategies","pattern","statusCodes","strategies","strategy","EditorComponent","setOutput","useOutputStore","outputStore","useContext","OutputStoreContext","documentsStore","DocumentsStoreContext","themesStore","ThemesStoreContext","useSettingsStore","activeTab","setActiveTab","setBuildError","useShallow","customThemes","generatePresentation","cancelGeneration","usePresentationGenerator","qualityProfileIds","qualityProfileId","storedProfileId","qualityGate","qualityPolicyText","qualityOptions","useMemo","buildQualityOptions","analyzeQuality","cancelQualityAnalysis","useQualityAnalysis","buildAbortControllersRef","buildTimeoutsRef","flushBuildTimerRef","lastBuildRequestIdRef","documentVersionsRef","cancelActiveBuild","timeout","controller","getDocumentVersion","docName","newVersion","customThemesContentHash","themeData","lastModifiedTime","validCustomThemes","themes","getFreshThemeData","freshThemes","buildDocument","existingController","abortController","finalSignal","requestId","version","buildRequest","nextQualityTicket","processBuildRequestRef","processBuildRequest","request","id","qualityTicket","qualityIfCurrent","next","isStaleQualityTicket","onProgress","stage","freshThemeData","result","e","findings","others","splitQualityWarnings","countBySeverity","errorMessage","gateFindings","QualityGateFailedError","findingsFromAnalysis","lastViewedDocumentRef","activeFile","docType","existingTimeout","documentThemeDependencies","deps","activeDoc","themeName","t","themeChangeEmitter","event","documentsUsingTheme","buildDocumentRef","getDocumentVersionRef","handler","themeDirty","liveText","allDocs","allDtypes","ref","existing","currentTab","docs","tab","dtypes","targetName","freshDoc","pending","Tabs","Editor","memo"],"mappings":"4wBAAA,MAAMA,GAAa,CACjB,SAAU,SAAUC,EAAQ,CAC1B,MAAMC,EAAW,SAAS,cAAc,KAAK,EACvCC,EAAsBF,EAAO,OAAO,OAAOC,CAAQ,EACnDE,EAAgCD,EAAoB,YAAY,KAChEE,EAA6BF,EAAoB,SAAQ,EAAG,YAAY,KA+B9E,MAAO,CACL,gBA/BoB,SAAUG,EAAiB,CAC/C,OAAOA,EAAgB,YAAY,OAASF,CAC9C,EA8BE,aA7BiB,SAAUE,EAAiB,CAC5C,OAAOA,EAAgB,YAAY,OAASD,CAC9C,EA4BE,cA3BkB,SAAUE,EAAQ,CACpC,OAAI,MAAM,QAAQA,CAAM,EACfA,EAAO,MAAM,SAAUC,EAAU,CACtC,OAAI,OAAOA,GAAa,UAAYA,EAAS,YAAY,OAAS,SAC5D,GAACA,EAAS,eAAe,OAAO,GAChC,CAAC,MAAM,QAAQA,EAAS,KAAK,GAC7BA,EAAS,MAAM,SAAW,GAC1B,CAAEA,EAAS,MAAM,MAAMC,GAAOA,EAAM,GAAK,SAASA,CAAG,IAAMA,CAAG,GAC9DD,EAAS,eAAe,gBAAgB,GACtC,OAAOA,EAAS,gBAAmB,WAErCA,EAAS,eAAe,OAAO,GAC7B,OAAOA,EAAS,OAAU,UAE5BA,EAAS,eAAe,UAAU,GAChC,OAAOA,EAAS,UAAa,YAI9B,EACT,CAAC,EAEI,EACT,CAKJ,CACE,CACF,EC1CaE,GAAa,SAAUC,EAAMC,EAAKC,EAAY,CACzD,MAAO,qBAAuBD,EAAM,uBAAyB,MAAM,QAAQD,CAAI,EAAIA,EAAK,KAAK,KAAK,EAAIA,GAAQ,MAAQE,GAAc,GACtI,ECFaC,GAAa,UAAY,CACpC,MAAMC,EAAmB,SAAUC,EAAOC,EAAU,CAClD,OAAI,OAAOD,GAAU,UAAYA,IAAU,KAClC,KAAK,OAAS,OAAO,OAAOA,CAAK,EAAIA,EAE1CA,aAAiB,KACZ,KAAK,OAAS,OAAO,OAAO,IAAI,KAAKA,CAAK,CAAC,EAAI,IAAI,KAAKA,CAAK,EAE/DC,EAAS,KAAK,KAAMD,CAAK,CAClC,EACME,EAAa,SAAUC,EAAOF,EAAU,CAC5C,MAAMG,EAAO,OAAO,KAAKD,CAAK,EACxBE,EAAa,IAAI,MAAMD,EAAK,MAAM,EACxC,QAASE,EAAI,EAAGA,EAAIF,EAAK,OAAQE,IAC/BD,EAAWD,EAAKE,CAAC,CAAC,EAAIP,EAAiB,KAAK,KAAMI,EAAMC,EAAKE,CAAC,CAAC,EAAGL,CAAQ,EAE5E,OAAOI,CACT,EACME,EAAS,SAAUC,EAAQ,CAC/B,OAAOT,EAAiB,KAAK,KAAMS,EAAQ,SAAUA,EAAQ,CAC3D,GAAI,MAAM,QAAQA,CAAM,EACtB,OAAON,EAAW,KAAK,KAAMM,EAAQD,CAAM,EAE7C,MAAME,EAAQ,CAAA,EACd,QAASb,KAAOY,EACV,CAAC,KAAK,WAAa,OAAO,eAAe,KAAKA,EAAQZ,CAAG,IAAM,KAGnEa,EAAMb,CAAG,EAAIG,EAAiB,KAAK,KAAMS,EAAOZ,CAAG,EAAGW,CAAM,GAE9D,OAAOE,CACT,CAAC,CACH,EACMC,EAAU,UAAY,CAC1B,MAAMC,EAAyB,SAAUX,EAAO,CAC9C,MAAMY,EAAU,CACd,YACA,QACR,EACM,KAAKZ,CAAK,EAAIY,EAAQ,QAAO,SAAUC,EAAKC,EAAQ,CAClD,OAAID,EAAIC,CAAM,EAAKd,GAAS,KAAKc,CAAM,KACrCd,GAAS,KAAKc,CAAM,GAEfD,CACT,GAAE,KAAK,IAAI,EAAG,CAAA,CAAE,CAClB,EACME,EAAQ,OAAO,OAAO,OAAO,iBAAiB,CAAA,EAAI,CACtD,UAAW,CAAE,MAAO,CAAC,EACrB,OAAQ,CAAE,MAAO,CAAC,CACxB,CAAK,CAAC,EACF,QAAST,EAAI,EAAGA,GAAK,EAAGA,IACtBK,EAAuB,KAAKI,EAAOT,CAAC,EAEtC,OAAOS,CACT,IACMC,EAAU,CACd,UAAWT,EAAO,KAAKG,EAAO,CAAC,CAAC,EAChC,UAAWH,EAAO,KAAKG,EAAO,CAAC,CAAC,EAChC,mBAAoBH,EAAO,KAAKG,EAAO,CAAC,CAAC,CAC7C,EACQO,EAAMV,EAAO,KAAKG,EAAO,CAAC,CAAC,EACjC,QAASQ,KAAcF,EACrB,OAAO,eAAeC,EAAKC,EAAY,CACrC,WAAY,GACZ,SAAU,GACV,aAAc,GACd,MAAOF,EAAQE,CAAU,CAC/B,CAAK,EAEH,OAAOD,CACT,ICtEaE,GAAQ,CACnB,4BAA6B,4BAC7B,2BAA4B,0BAC9B,ECDaC,GAAmB,SAAUC,EAAO9B,EAAQN,EAAQ,CAC/D,MAAMqC,EAAmBrC,EAAO,MAC1BsC,EAA6B,SAAUC,EAAcC,EAAc,CACvE,MAAMC,EAASF,EAAa,MACtBG,EAASF,EAAa,MAC5B,GACEC,EAAO,CAAC,EAAIC,EAAO,CAAC,GACnBD,EAAO,CAAC,IAAMC,EAAO,CAAC,GAAKD,EAAO,CAAC,EAAIC,EAAO,CAAC,EAEhD,MAAO,EAEX,EACMC,EAAiB,SAAUC,EAAOC,EAAS,CAC/C,MAAMC,EAAQD,EAAQ,MAAM;AAAA,CAAI,EAC1BE,EAAYD,EAAM,OAClBE,EAAkB,CAAA,EACxB,OAAAJ,EAAM,QAAQ,SAAU7B,EAAOkC,EAAO,CACpC,GAAIlC,IAAU,EACZ,MAAM,IAAI,MAAM,6BAA6B,EAE/C,OAAQkC,EAAK,CACX,IAAK,GAAG,CACN,GAAIlC,EAAQ,EACV,MAAM,IAAI,MAAM,wCAAwC,EACnD,GAAIA,EAAQgC,EACjB,MAAM,IAAI,MAAM,uBAAyBhC,EAAQ,+CAAiDgC,CAAS,EAE7GC,EAAgBC,CAAK,EAAIlC,CAC3B,CACE,MACF,IAAK,GAAG,CACN,IAAImC,EAAiBnC,EACrB,MAAMoC,EAAcH,EAAgB,CAAC,EAC/BI,EAAUN,EAAMK,EAAc,CAAC,EAAE,OACvC,GAAID,EAAiB,GAEnB,GADAA,EAAiBE,EAAU,KAAK,IAAIF,CAAc,EAC9CA,EAAiB,EACnB,MAAM,IAAI,MAAM,yBAA2BnC,EAAQ,0CAA4CoC,EAAc,OAASC,CAAO,UAEtHF,EAAkBE,EAAU,EACrC,MAAM,IAAI,MAAM,yBAA2BrC,EAAQ,0CAA4CoC,EAAc,OAASC,CAAO,EAE/HJ,EAAgBC,CAAK,EAAIC,CAC3B,CACE,MACF,IAAK,GAAG,CACN,IAAIG,EAAgBtC,EACpB,GAAIsC,EAAgB,EAAG,CAErB,GADAA,EAAgBN,EAAY,KAAK,IAAIhC,CAAK,EACtCsC,EAAgB,EAClB,MAAM,IAAI,MAAM,qBAAuBtC,EAAQ,+CAAiDgC,CAAS,EAEvGM,EAAgBL,EAAgB,CAAC,GACnC,QAAQ,KAAK,qBAAuBjC,EAAQ,2EAA2E,CAE3H,SAAWA,EAAQgC,EACjB,MAAM,IAAI,MAAM,qBAAuBhC,EAAQ,+CAAiDgC,CAAS,EAE3GC,EAAgBC,CAAK,EAAII,CAC3B,CACE,MACF,IAAK,GAAG,CACN,IAAIC,EAAevC,EACnB,MAAMwC,EAAYP,EAAgB,CAAC,EAC7BI,EAAUN,EAAMS,EAAY,CAAC,EAAE,OACrC,GAAID,EAAe,GAEjB,GADAA,EAAeF,EAAU,KAAK,IAAIE,CAAY,EAC1CA,EAAe,EACjB,MAAM,IAAI,MAAM,uBAAyBvC,EAAQ,0CAA4CwC,EAAY,OAASH,CAAO,UAElHE,EAAgBF,EAAU,EACnC,MAAM,IAAI,MAAM,yBAA2BrC,EAAQ,0CAA4CwC,EAAY,OAASH,CAAO,EAE7HJ,EAAgBC,CAAK,EAAIK,CAC3B,CACE,KACV,CACI,CAAC,EACMN,CACT,EACA,IAAIQ,EAAe3C,GAAUP,CAAM,EAAE,KAAKgC,CAA0B,EACpE,MAAMmB,EAAsB,SAAUD,EAAc,CAClD,MAAMX,EAAUT,EAAM,SAAQ,EAC9BoB,EAAa,QAAQ,SAAUE,EAAaT,EAAO,CACjD,MAAML,EAAQD,EAAee,EAAY,MAAOb,CAAO,EACjDc,EAAYf,EAAM,CAAC,EACnBgB,EAAWhB,EAAM,CAAC,EAClBiB,EAAUjB,EAAM,CAAC,EACjBkB,EAASlB,EAAM,CAAC,EACtBc,EAAY,eAAiBd,EAAM,MAAK,EACxCc,EAAY,MAAQ,IAAIrB,EAAiBsB,EAAWC,EAAUC,EAASC,CAAM,EAC7EJ,EAAY,MAAQT,EACfS,EAAY,iBACfA,EAAY,eAAiBrB,EAAiB,mBAAmBqB,EAAY,KAAK,GAE/EA,EAAY,QACfA,EAAY,MAAQ,IAAIC,CAAS,IAAIC,CAAQ,OAAOC,CAAO,GAAGC,CAAM,IAExE,CAAC,CACH,EACMC,EAA2B,UAAY,CAC3C,OAAOP,EAAa,OAAO,SAAU5B,EAAK8B,EAAa,CACrD,OAAA9B,EAAI8B,EAAY,KAAK,EAAI,CACvB,eAAgBA,EAAY,gBAAkB,GAC9C,MAAOA,EAAY,MACnB,MAAO,OAAO,OAAO,CAAA,EAAIA,EAAY,KAAK,EAC1C,cAAeA,EAAY,eAAe,MAAK,CACvD,EACa9B,CACT,EAAG,CAAA,CAAE,CACP,EACMoC,EAA2B,UAAY,CAC3C,OAAOR,EAAa,OAAO,SAAU5B,EAAK8B,EAAa,CACrD,OAAA9B,EAAI8B,EAAY,KAAK,EAAItB,EAAM,gBAAgBsB,EAAY,KAAK,EACzD9B,CACT,EAAG,CAAA,CAAE,CACP,EACMqC,EAA8B,SAAU1C,EAAQ2C,EAAkB,CACtE,GAAI,OAAO3C,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,EAAG,CACxD2C,EAAmB,OAAOA,GAAqB,UAAYA,EAAmB,GAC9E,MAAMC,EAAkBX,EAAa,OAAO,SAAU5B,EAAK8B,EAAa,CACtE,OAAIA,EAAY,QACd9B,EAAI8B,EAAY,KAAK,EAAIA,GAEpB9B,CACT,EAAG,CAAA,CAAE,EACL,QAASwC,KAAS7C,EAAQ,CACxB,MAAMmC,EAAcS,EAAgBC,CAAK,EACzC,GAAIV,EAAa,CACf,MAAM3C,EAAQQ,EAAO6C,CAAK,EAC1B,GAAIC,EAA+BX,EAAa3C,CAAK,EACnD,MAAM,IAAI,MAAM,uCAAyCqD,CAAK,EAEhE,MAAME,EAAWzD,GAAU6C,EAAY,KAAK,EAG5C,GAFAY,EAAS,QAAUA,EAAS,UAAYvD,EAAM,MAAM;AAAA,CAAI,EAAE,OAAS,EACnEuD,EAAS,UAAYvD,EAAM,MAAM;AAAA,CAAI,EAAE,IAAG,EAAG,OACzCwD,EAAyBb,EAAa3C,EAAOuD,CAAQ,EACvD,MAAM,IAAI,MAAM,iDAAmDF,CAAK,EAE1EhC,EAAM,WAAW,CAAC,CAChB,iBAAkB,CAAC,CAAC8B,EACpB,MAAOR,EAAY,MACnB,KAAM3C,CAClB,CAAW,CAAC,CACJ,MACE,QAAQ,MAAM,4BAA8BqD,CAAK,CAErD,CACF,KACE,OAAM,IAAI,MAAM,yBAAyB,CAE7C,EACMI,EAAsB,UAAY,CACtC,OAAApC,EAAM,2BAA2B,QAAO,EACxC,OAAO,oBAAoB,QAASqC,CAA+B,EACnE,OAAOrC,EAAM,qBACb,OAAOA,EAAM,oBACb,OAAOA,EAAM,yBACb,OAAOA,EAAM,4BACb,OAAOA,EAAM,mBACb,OAAOA,EAAM,yBACb,OAAOA,EAAM,+BACb,OAAOA,EAAM,cACb,OAAOA,EAAM,mBACb,OAAOA,EAAM,sBACb,OAAOA,EAAM,wBACb,OAAOA,EAAM,6BACb,OAAOA,EAAM,2BACb,OAAOA,EAAM,gBACb,OAAOA,EAAM,sBACNA,CACT,EACMsC,EAAuB,SAAUC,EAAW,CAChDA,EAAU,KAAK,SAAUC,EAAU,CACjC,MAAMC,EAAgBD,EAAS,WACzBE,EAASF,EAAS,OAClBG,EAASvB,EAAa,OAC5B,QAASnC,EAAI,EAAGA,EAAI0D,EAAQ1D,IAAK,CAC/B,MAAMuB,EAAQY,EAAanC,CAAC,EAAE,MAC9B,GACGuB,EAAM,kBAAoBiC,GAAiBjC,EAAM,cAAgBkC,GACjElC,EAAM,gBAAkBiC,GAAiBjC,EAAM,YAAckC,EAE9D,OAAA1C,EAAM,iBAAgB,EACf,EAEX,CACF,CAAC,CACH,EACM4C,EAA2B,SAAUhE,EAAU,CAC/C,OAAOA,GAAa,YACtBoB,EAAM,6BAA6B,KAAKpB,CAAQ,CAEpD,EACMiE,EAA6B,SAAUC,EAAgBC,EAAY,CACvE,MAAMC,EAAgBrB,EAAwB,EAC9C3B,EAAM,6BAA6B,QAAQ,SAAUpB,EAAU,CAC7DA,EAAS,KAAKoB,EAAO8C,EAAgBC,EAAYC,CAAa,CAChE,CAAC,CACH,EACMC,EAAS,UAAY,CACzB,OAAO,QAAQ,UAAU,KAAK,UAAY,CACxCjD,EAAM,qBAAuB,GAC7BA,EAAM,KAAI,EACVA,EAAM,qBAAuB,GACzBA,EAAM,eAAiBA,EAAM,wBAG/BA,EAAM,iBAAiBA,EAAM,gBAAiBA,EAAM,qBAAqB,EACzEA,EAAM,sBAAsB,QAAQ,SAAUb,EAAQ,CACpDA,EAAO,MAAQa,EAAM,mBAAmBb,EAAO,EAAE,CACnD,CAAC,EAEL,CAAC,CACH,EACM+D,EAAc,SAAU5B,EAAad,EAAO2C,EAAWC,EAAaC,EAASC,EAAa,CAC9F,IAAIC,EAAwB/C,EAAM,cAC9BgD,EAAoBhD,EAAM,UAC9Bc,EAAY,UAAYd,EACxBc,EAAY,MAAQd,EAAM,eAAe2C,EAAWC,CAAW,EAC/D,MAAMT,EAASvB,EAAa,OAC5B,IAAIqC,EAAgBJ,EAAQ,OAC5B,MAAMK,EAAYN,EAAcI,EAC1BG,EAAYR,EAAYI,EAExBK,EAAkB5D,EAAM,yBAA2B,CAAA,EACnD6D,EAAsBD,EAAgB,OAoB5C,GAlBIH,IAAkBI,IACpBR,EAAUA,EAAQ,OAAO,SAAUS,EAAQ,CACzC,MAAMtD,EAAQsD,EAAO,MACrB,QAAS7E,EAAI,EAAGA,EAAI4E,EAAqB5E,IAAK,CAC5C,MAAM8E,EAAiBH,EAAgB3E,CAAC,EACxC,GACGuB,EAAM,kBAAoBuD,EAAe,iBACzCvD,EAAM,gBAAkBuD,EAAe,eACvCvD,EAAM,cAAgBuD,EAAe,aACrCvD,EAAM,YAAcuD,EAAe,UAEpC,MAAO,EAEX,CACA,MAAO,EACT,CAAC,EACDN,EAAgBJ,EAAQ,QAEtBM,IAAc,EAAG,CACnB,QAAS1E,EAAIqC,EAAY,MAAQ,EAAGrC,EAAI0D,EAAQ1D,IAAK,CACnD,MAAM+E,EAAkB5C,EAAanC,CAAC,EAChCgF,EAAYD,EAAgB,MAC9BT,IAA0BU,EAAU,kBACtCA,EAAU,aAAeP,GAEvBH,IAA0BU,EAAU,gBACtCA,EAAU,WAAaP,GAEzBO,EAAU,iBAAmBN,EAC7BM,EAAU,eAAiBN,EAC3BK,EAAgB,MAAQC,CAC1B,CACA,QAAShF,EAAIqE,EAAc,EAAGrE,EAAIwE,EAAexE,IAAK,CACpD,MAAMiF,EAAab,EAAQpE,CAAC,EACtBkF,EAAgBD,EAAW,MAC3BE,EAAgBD,EAAc,SAAQ,EACtCE,EAAgB,SAASD,CAAa,EAC5C,OAAO,SAASA,CAAa,EACzBb,IAA0BY,EAAc,kBAC1CA,EAAc,aAAeT,GAE3BH,IAA0BY,EAAc,gBAC1CA,EAAc,WAAaT,GAE7BS,EAAc,iBAAmBR,EACjCQ,EAAc,eAAiBR,EAC/BO,EAAW,MAAQC,EACnB,SAASA,EAAc,SAAQ,CAAE,EAAIE,CACvC,CACF,KAAO,CAEL,QAASpF,EAAIqC,EAAY,MAAQ,EAAGrC,EAAI0D,EAAQ1D,IAAK,CACnD,MAAM+E,EAAkB5C,EAAanC,CAAC,EAChCgF,EAAYD,EAAgB,MAClC,GAAIC,EAAU,gBAAkBV,EAC9B,MAEAU,EAAU,aAAeP,EACzBO,EAAU,WAAaP,EACvBM,EAAgB,MAAQC,CAE5B,CACA,QAAShF,EAAIqE,EAAc,EAAGrE,EAAIwE,EAAexE,IAAK,CAEpD,MAAMiF,EAAab,EAAQpE,CAAC,EACtBkF,EAAgBD,EAAW,MAC3BE,EAAgBD,EAAc,SAAQ,EACtCE,EAAgB,SAASD,CAAa,EAE5C,GADA,OAAO,SAASA,CAAa,EACzBD,EAAc,gBAAkBZ,EAAuB,CACzD,SAASY,EAAc,SAAQ,CAAE,EAAIE,EACrC,KACF,MACEF,EAAc,aAAeT,EAC7BS,EAAc,WAAaT,EAC3BQ,EAAW,MAAQC,EACnB,SAASA,EAAc,SAAQ,CAAE,EAAIE,CAEzC,CACF,CAEF,EACMC,EAAc,SAAUR,EAAQS,EAAe,CACnD,MAAMC,EAAO,CAAA,EACPhE,EAAQsD,EAAO,MAErB,OAAIA,EAAO,OAAS,GAClBU,EAAK,WAAa,GAEjBhE,EAAM,kBAAoBA,EAAM,eAChCA,EAAM,cAAgBA,EAAM,UAE7BgE,EAAK,WAAa,GAElBA,EAAK,cAAgB,GAGvBA,EAAK,iBAAmBhE,EAAM,kBAAoB+D,EAAc,gBAChEC,EAAK,mBAAqBhE,EAAM,cAAgB+D,EAAc,YAE9DC,EAAK,eAAiBhE,EAAM,gBAAkB+D,EAAc,cAC5DC,EAAK,iBAAmBhE,EAAM,YAAc+D,EAAc,UAE1DC,EAAK,kBAAoB,CAACA,EAAK,kBAAoB,CAACA,EAAK,eAGrDD,EAAc,kBAAoBA,EAAc,cAClDC,EAAK,kBAAoB,GAEzBA,EAAK,iBAAmB,GAEnBA,CACT,EACMC,EAAqB,SAAUvG,EAAQ,CAC3CkD,EAAe3C,GAAUP,CAAM,EAAE,KAAKgC,CAA0B,EAChEmB,EAAoBD,CAAY,CAClC,EACMsD,EAAiC,SAAUC,EAAY,CAC3D,GAAK3E,EAAM,cAuBTA,EAAM,iBAAiBA,EAAM,gBAAiB,CAAA,CAAE,EAChD,OAAOA,EAAM,gBACb,OAAOA,EAAM,sBACbA,EAAM,cAAgB,OA1BE,CACxB,MAAM4E,EAAwBD,EAAW,uBAAwB7E,GAAM,4BACjE+E,EAAuBF,EAAW,sBAAuB7E,GAAM,2BAC/DgF,EAAc1D,EAAa,IAAI,SAAUE,EAAa,CAC1D,MAAMyD,EAAa,CACjB,MAAOzD,EAAY,MACnB,QAAS,CACP,UAAWA,EAAY,eACrBuD,EACAD,CACd,CACA,EACQ,OAAItD,EAAY,QACdyD,EAAW,aAAezD,EAAY,OAEjCyD,CACT,CAAC,EACD/E,EAAM,gBAAkBA,EAAM,iBAAiB,CAAA,EAAI8E,CAAW,EAC9D9E,EAAM,sBAAwB8E,EAAY,IAAI,SAAUC,EAAYlE,EAAO,CACzE,OAAO,OAAO,OAAO,CAAA,EAAIkE,EAAY,CAAE,GAAI/E,EAAM,gBAAgBa,CAAK,EAAG,CAC3E,CAAC,EACDb,EAAM,cAAgB,EACxB,CAMF,EACMqC,EAAkC,UAAY,CAClD,QAAQ,MAAM,yCAAyC,CACzD,EACM2C,EAAqB,SAAUC,EAAU,CAC7C,QAAS1G,KAAO0G,EAAU,CACxB,MAAM3D,EAAc2D,EAAS1G,CAAG,EAChC+C,EAAY,MAAQA,EAAY,SAClC,CACF,EACMW,EAAiC,SAAUX,EAAa4D,EAAM,CAClE,MAAO,CAAC5D,EAAY,gBAAkB4D,EAAK,SAAS;AAAA,CAAI,CAC1D,EACM/C,EAA2B,SAAUb,EAAa3C,EAAO6B,EAAO,CACpE,OAAOc,EAAY,UAAY,CAACA,EAAY,SAAS3C,EAAO6B,EAAOc,EAAY,QAAQ,CACzF,EAEM6D,EAAiB,CACrB,mBAAoB,GACpB,wBAAyB,GACzB,6BAA8B,CAAA,EAC9B,sBAAuB7C,EACvB,wBAAyB,CAAA,CAC7B,EAEEjB,EAAoBD,CAAY,EAChCpB,EAAM,cAAgB,GACtBmF,EAAe,2BAA6BnF,EAAM,mBAAmB,SAAUoF,EAAqB,CAClG,MAAMC,EAAYD,EAAoB,UAEtC,GADApF,EAAM,wBAA0B,GAC1BqF,GAAarF,EAAM,qBA0HdA,EAAM,uBACfA,EAAM,wBAA0B,QA3Hc,CAC9C,MAAMqD,EAAU+B,EAAoB,QAAQ,KAAKlF,CAA0B,EACrE+E,EAAW,CAAA,EACXtC,EAASvB,EAAa,OAkB5B,GAjB0BiC,EAAQ,MAAM,SAAUS,EAAQ,CACxD,MAAMwB,EAAcxB,EAAO,MACrBM,EAAgBkB,EAAY,SAAQ,EAC1CL,EAASb,CAAa,EAAI,KAC1B,QAASnF,EAAI,EAAGA,EAAI0D,EAAQ1D,IAAK,CAC/B,MAAMqC,EAAcF,EAAanC,CAAC,EAElC,GADcqC,EAAY,MAChB,cAAcgE,CAAW,EACjC,OAAIrD,EAA+BX,EAAawC,EAAO,IAAI,EAClD,IAETmB,EAASb,CAAa,EAAI9C,EACnB,GAEX,CACA,MAAO,EACT,CAAC,EACsB,CACrB+B,EAAQ,QAAQ,SAAUS,EAAQR,EAAa,CAC7C,MAAMiC,EAAezB,EAAO,MACtBxC,EAAc2D,EAASM,EAAa,SAAQ,CAAE,EAC9ChB,EAAgBjD,EAAY,MAC5B4D,EAAOpB,EAAO,MAAQ,GAQtB0B,GAAkBN,EAAK,MAAM,KAAK,GAAK,CAAA,GAAI,OAC3CO,EAA0BP,EAAK,MAAM,KAAK,EAAE,IAAG,EAAG,OAElDQ,EAAkBH,EAAa,cAAgBA,EAAa,gBAC5DI,EAAiBJ,EAAa,UAAYA,EAAa,YAE7D,IAAIpC,EAAYoB,EAAc,cAC1BnB,EAAcmB,EAAc,UAE5BqB,EAAsB,GAEvBrB,EAAc,gBAAkBgB,EAAa,iBAC7ChB,EAAc,gBAAkBgB,EAAa,iBAE9CK,GAAwBrB,EAAc,UAAYgB,EAAa,YAAe,GAGhF,MAAMf,EAAOF,EAAYR,EAAQS,CAAa,EAC9CjD,EAAY,SAAWkD,GACnBA,EAAK,YAAcA,EAAK,iBACtBA,EAAK,oBAKHgB,IAAmB,EACrBpC,GAAeqC,GAEftC,GAAaqC,EACThB,EAAK,mBACPpB,GAAeqC,EACNjB,EAAK,iBACdpB,EAAeqC,EAA0B,EAEzCrC,EAAeqC,EAA0BG,IAI3CpB,EAAK,mBAEPrB,GAAaqC,EACThB,EAAK,iBACHgB,IAAmB,EACrBpC,GAAeqC,EAEfrC,EAAewC,EAAsBH,MAKzCjB,EAAK,YAAcA,EAAK,iBACtBA,EAAK,oBACPpB,GAAeuC,GAEbnB,EAAK,mBACHA,EAAK,gBACPrB,GAAauC,EACbtC,GAAeuC,GAEfxC,GAAauC,IAInBxC,EAAY5B,EAAaiD,EAAepB,EAAWC,EAAaC,EAASC,CAAW,CACtF,CAAC,EACD,MAAMuC,EAAS7F,EAAM,yBAAwB,EACvC8F,EAAwB,CAAA,EAC9B,QAASvH,KAAO0G,EAAU,CACxB,MAAM3D,EAAc2D,EAAS1G,CAAG,EAC1BiC,EAAQc,EAAY,MACpByE,EAAczE,EAAY,OAASd,EAAM,SAAQ,EACjD7B,EAAQkH,EAAOE,CAAW,EAChC,GAAI5D,EAAyBb,EAAa3C,EAAO6B,CAAK,EAAG,CACvDwE,EAAmBC,CAAQ,EAC3BhC,EAAM,EACN,MACF,CACA6C,EAAsBC,CAAW,EAAIpH,CACvC,CACIqB,EAAM,eACRA,EAAM,sBAAsB,QAAQ,SAAUb,EAAQ,CACpDA,EAAO,MAAQa,EAAM,mBAAmBb,EAAO,EAAE,CACnD,CAAC,EAEH0D,EAA2BiD,EAAuBD,CAAM,CAC1D,MACE5C,EAAM,CAEV,CAGF,CAAC,EACD,OAAO,QAAUZ,EACjB,MAAM2D,EAAa,CACjB,qBAAsB,GACtB,yBAA0BrE,EAC1B,yBAA0BC,EAC1B,oBAAqBQ,EACrB,kCAAmCQ,EACnC,mBAAoB6B,EACpB,4BAA6B5C,EAC7B,+BAAgC6C,CACpC,EACE,QAASuB,KAAYd,EACnB,OAAO,eAAenF,EAAOiG,EAAU,CACrC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOd,EAAec,CAAQ,CACpC,CAAK,EAEH,QAASC,KAAWF,EAClB,OAAO,eAAehG,EAAOkG,EAAS,CACpC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOF,EAAWE,CAAO,CAC/B,CAAK,EAEH,OAAOlG,CACT,EC5iBO,SAASmG,GAAkBvI,EAAQ,CAIxC,GAAIA,IAAW,OACb,MAAM,IAAI,MAAM,CACd,0DACA,mDACN,EAAM,KAAK;AAAA,CAAI,CAAC,EAQd,MAAMwI,EAAa,SAAUC,EAAgB,CAC3C,MAAMrG,EAAQqG,EAAe,SAAQ,EACrC,GAAIrG,EAAM,sBAAuB,CAC/B,MAAMsG,EAAaD,EAAe,cAAa,EACzC9D,EAAY+D,EAAW,IAAI,SAAUC,EAAW,CACpD,MAAO,CACL,WAAYA,EAAU,mBACtB,OAAQA,EAAU,cAC5B,CACM,CAAC,EACDvG,EAAM,sBAAsBuC,CAAS,EACrCvC,EAAM,wBAA0BsG,CAClC,CACF,EACME,EAAqB,CAAA,EACrB,CAAE,gBAAAC,EAAiB,aAAAC,EAAc,cAAAC,CAAa,EAAKhJ,GAAW,SAASC,CAAM,EAM7EgJ,EAAuB,SAAUP,EAAgB,CACrD,GAAII,EAAgBJ,CAAc,EAAG,CACnC,IAAIQ,EAAUR,EAAe,WAAU,EACvC,OAAAS,EAAY,UAAYV,EAAW,KAAKxG,EAAKyG,CAAc,EAC3DS,EAAY,gBAAkBT,EAC9BS,EAAY,gBAAgB,aAAe,GAC3CD,EAAQ,iBAAiB,UAAWC,EAAY,UAAW,EAAI,EAC/DA,EAAY,yBAA2BT,EAAe,iBAAiB,UAAY,CAEjFQ,GAAWA,EAAQ,oBAAoB,UAAWC,EAAY,UAAW,EAAI,EAC7E,MAAMC,EAAaV,EAAe,aAClCU,GAAcA,EAAW,iBAAiB,UAAWD,EAAY,UAAW,EAAI,EAChFD,EAAUE,CACZ,CAAC,EACM,EACT,KACE,OAAM,IAAI,MACR1I,GACE,cACA,iBACA,iEACV,CACA,CAEE,EAOM2I,EAAoB,SAAUhH,EAAO9B,EAAQ,CACjD,GAAIwI,EAAa1G,CAAK,EACpB,GAAI2G,EAAczI,CAAM,EAAG,CACzB,MAAM+I,EAAmBlH,GAAiBC,EAAO9B,EAAQN,CAAmC,EAC5F,OAAA4I,EAAmBS,EAAiB,IAAI,SAAQ,CAAE,EAAIA,EAC/CA,CACT,KACE,OAAM,IAAI,MACR5I,GACE,gCACA,SACA,oEACZ,CACA,MAGM,OAAM,IAAI,MACRA,GACE,cACA,iBACA,iEACV,CACA,CAEE,EAMM6I,EAAuB,SAAUlH,EAAO,CAC5C,GAAI0G,EAAa1G,CAAK,EAAG,CACvB,MAAMmH,EAAMnH,EAAM,IAAI,SAAQ,EACxBoH,EAAkBZ,EAAmBW,CAAG,EAC9C,OAAIC,EACKA,EAAgB,oBAAmB,GAE1C,QAAQ,KAAK,yCAAyC,EAC/C,GAEX,KACE,OAAM,IAAI,MACR/I,GACE,cACA,iBACA,iEACV,CACA,CAEE,EAKMgJ,EAAqB,UAAY,CACrC,GAAIP,EAAY,gBAAiB,CAE/B,MAAMD,EADWC,EAAY,gBACJ,WAAU,EACnCD,GAAWA,EAAQ,oBAAoB,UAAWC,EAAY,SAAS,EACvEA,EAAY,0BAA4BA,EAAY,yBAAyB,QAAO,EACpF,OAAOA,EAAY,UACnB,OAAOA,EAAY,gBAAgB,aACnC,OAAOA,EAAY,gBAAgB,eACnC,OAAOA,EAAY,gBACnB,OAAOA,EAAY,yBACnB,QAASvI,KAAOiI,EACd,OAAOA,EAAmBjI,CAAG,EAE/B,MAAO,EACT,CACA,MAAO,EACT,EAIM+I,EAAgB,UAAY,CAC5BR,EAAY,gBAAgB,cAC9BA,EAAY,gBAAgB,aAAe,GAC3CA,EAAY,gBAAgB,eAAe,QAAO,EAClD,OAAOA,EAAY,gBAAgB,iBAEnCA,EAAY,gBAAgB,aAAe,GAC3CA,EAAY,gBAAgB,eAAiBA,EAAY,gBAAgB,UAAU,CACjF,GAAI,YACJ,MAAO,wBACP,mBAAoB,aACpB,iBAAkB,IAClB,IAAK,SAAUS,EAAQ,CAErB,MAAMrJ,EADaqJ,EAAO,cAAa,EACb,OAAO,SAAU/H,EAAK,CAAE,gBAAAgI,EAAiB,cAAAC,EAAe,YAAAC,EAAa,UAAAC,GAAa,CAC1G,OAAAnI,EAAI,KAAK,WAAa,KAAK,UAAU,CACnCgI,EACAE,EACAD,EACAE,CACd,CAAa,CAAC,EACKnI,CACT,EAAG,CAAA,CAAE,EAAE,KAAK;AAAA,CAAI,EAChB,QAAQ,IAAI;AAAA,EAAyB,KAAK,UAAUtB,EAAQ,KAAM,CAAC,CAAC,CACtE,CACR,CAAO,EAEL,EAMM4I,EAAc,CAKlB,UAAW,KACX,gBAAiB,KACjB,mBAAoBN,EACpB,mBAAoB5I,CACxB,EACQgC,EAAM,OAAO,OAAOkH,CAAW,EAC/Bc,EAAiB,CAKrB,aAAchB,EACd,kBAAmBI,EACnB,qBAAsBE,EACtB,mBAAoBG,EACpB,cAAeC,CACnB,EACE,QAASzH,KAAc+H,EACrB,OAAO,eAAehI,EAAKC,EAAY,CACrC,WAAY,GACZ,SAAU,GACV,aAAc,GACd,MAAO+H,EAAe/H,CAAU,CACtC,CAAK,EAEH,OAAO,OAAO,OAAOD,CAAG,CAC1B,CChMA,SAASiI,GAAwBC,EAAsB,CACrD,MAAMC,EAAM,IAAIC,EAAM,cACtB,OAAIF,EAAK,SAASC,CAAG,EAAUD,EAClBA,EACV,QAAQ,sBAAuB,EAAE,EACjC,QAAQ,iBAAkB,EAAE,EAC5B,QAAQ,UAAW,EAAE,EACVC,CAChB,CAKA,SAASE,GAAkB,CACzB,SAAAC,EACA,SAAAC,EAAW,GACX,SAAAC,CACF,EAIG,CACD,MAAMC,EAAYC,EAAAA,OAAsD,IAAI,EACtEC,EAAYD,EAAAA,OAAsB,IAAI,EACtCE,EAAWF,EAAAA,OAA2C,IAAI,EAC1D,CAAE,MAAAG,CAAA,EAAUC,GAAA,EACZ,CAACC,EAAkBC,CAAmB,EAAIC,EAAAA,SAC9C,CAAA,CAAC,EAEG,CAACC,EAAqBC,CAAsB,EAAIF,EAAAA,SAAS,EAAI,EAC7D,CAACG,EAA4BC,CAA6B,EAC9DJ,EAAAA,SAAS,EAAK,EACVK,EAAmBZ,EAAAA,OAAO,EAAK,EAC/Ba,EAAcC,GAAmBC,GAAMA,EAAE,aAAanB,EAAS,IAAI,CAAC,EACpEoB,EAAmBF,GAAmBC,GAAMA,EAAE,gBAAgB,EAC9DE,EAAeH,GAAmBC,GAAMA,EAAE,YAAY,EACtD,CAAE,eAAAG,EAAgB,iBAAAC,EAAkB,gBAAAC,CAAA,EACxCC,GAAA,EAGIC,EACJnB,IAAU,SACN,OAAO,WAAW,8BAA8B,EAAE,QAChD,OACA,QACFA,EAGAoB,EAAwBC,cAAalM,GAAmB,CAC5D2K,EAAU,QAAU3K,EAGpBmM,GAAqBnM,CAAM,CAI7B,EAAG,CAAA,CAAE,EAGCoM,EAAoBF,EAAAA,YACxB,CAACvC,EAAgD3J,IAAmB,CAClEyK,EAAU,QAAUd,EACpBiB,EAAS,QAAUjB,EAAO,SAAA,EAG1BiC,EAAetB,EAAS,KAAMX,EAAQ3J,CAAM,EAC5C8L,EAAgBxB,EAAS,IAAI,EAG7B,MAAM+B,EAAsB9D,GAAkBvI,CAAM,EACtC2J,EAAO,SAAA,GAEnB0C,EAAoB,aAAa1C,CAAM,EAIzCA,EAAO,cAAc,CACnB,aAAc,GACd,cAAe,GACf,gBAAiB,GACjB,QAAS,CAAE,QAAS,EAAA,EACpB,qBAAsB,GACtB,SAAU,KACV,QAAS,GACT,gBAAiB,cACjB,QAAS,CACP,WAAY,GACZ,cAAe,GACf,UAAW,GACX,WAAY,GACZ,cAAe,GACf,aAAc,GACd,YAAa,GACb,eAAgB,GAChB,aAAc,GACd,YAAa,GACb,mBAAoB,GACpB,UAAW,GACX,WAAY,GACZ,cAAe,EAAA,CACjB,CACD,EAIDA,EAAO,WAAW3J,EAAO,OAAO,QAAUA,EAAO,QAAQ,KAAM,IAAM,CACnE,MAAM2I,EAAY2D,GAAoB3C,EAAQ3J,CAAM,EACpD,GAAI2I,EAAW,CACb,MAAM4D,EAAUC,GAAqB7D,CAAS,EAC9C,OAAO,cACL,IAAI,YAAY,yBAA0B,CACxC,OAAQ,CACN,aAAc2B,EAAS,KACvB,UAAA3B,EACA,QAAA4D,EACA,QAAS,EAAA,CACX,CACD,CAAA,CAEL,CACF,CAAC,EAGD5C,EAAO,WAAW3J,EAAO,OAAO,QAAUA,EAAO,QAAQ,KAAM,IAAM,CAEnE,QAAQ,IAAI,wCAAwC,CACtD,CAAC,EAGD2J,EAAO,UAAU,CACf,GAAI,6BACJ,MAAO,4BACP,mBAAoB,aACpB,iBAAkB,IAClB,YAAa,CAAC3J,EAAO,OAAO,QAAUA,EAAO,QAAQ,IAAI,EACzD,IAAK,UAAY,CAEf,MAAM2I,EAAY2D,GAAoB3C,EAAQ3J,CAAM,EACpD,GAAI2I,EAAW,CACb,MAAM4D,EAAUC,GAAqB7D,CAAS,EAE9C,OAAO,cACL,IAAI,YAAY,yBAA0B,CACxC,OAAQ,CACN,aAAc2B,EAAS,KACvB,UAAA3B,EACA,QAAA4D,EACA,QAAS,EAAA,CACX,CACD,CAAA,CAEL,CACF,CAAA,CACD,EAGD,WAAW,IAAM,QACfE,EAAA9C,EAAO,UAAU,8BAA8B,IAA/C,MAAA8C,EAAkD,KACpD,EAAG,GAAG,EAEN,QAAQ,IAAI,6BAA6B,CAC3C,EACA,CAACnC,EAAS,KAAMsB,EAAgBE,CAAe,CAAA,EAIjDY,EAAAA,UAAU,IACD,IAAM,CACXb,EAAiBvB,EAAS,IAAI,CAChC,EACC,CAACA,EAAS,KAAMuB,CAAgB,CAAC,EAGpC,MAAMc,EAAeT,EAAAA,YACnB,CACEnL,EACA6L,IACG,CACC7L,IAAU,QAAayJ,GACzBA,EAASzJ,CAAK,CAElB,EACA,CAACyJ,CAAQ,CAAA,EAILqC,EAAyBX,EAAAA,YAC5BY,GAAwC,CACvC,MAAMC,EAA4BD,EAAQ,IAAKE,GAAA,OAAY,OACzD,KAAM,GACN,QAASA,EAAO,QAChB,KACE,OAAOA,EAAO,MAAS,SACnBA,EAAO,OACPP,EAAAO,EAAO,OAAP,YAAAP,EAAa,QAAS,mBAC5B,gBAAiBO,EAAO,gBACxB,YAAaA,EAAO,YACpB,cAAeA,EAAO,cACtB,UAAWA,EAAO,UAClB,SACEA,EAAO,UAAY,EACf,QACAA,EAAO,UAAY,EACjB,UACA,MAAA,EACR,EAEFhC,EAAoB+B,CAAM,EAEtBA,EAAO,OAAS,GAAK,CAACzB,EAAiB,UACzCH,EAAuB,EAAI,EAC3BE,EAA8B,EAAK,GAEjC0B,EAAO,SAAW,IACpBzB,EAAiB,QAAU,GAE/B,EACA,CAAA,CAAC,EAGG2B,EAAmBf,cAAagB,GAA2B,CAC3DzC,EAAU,SAAWyC,EAAM,iBAAmBA,EAAM,cACtDzC,EAAU,QAAQ,YAAY,CAC5B,WAAYyC,EAAM,gBAClB,OAAQA,EAAM,WAAA,CACf,EACDzC,EAAU,QAAQ,mBAAmByC,EAAM,eAAe,EAC1DzC,EAAU,QAAQ,MAAA,EAEtB,EAAG,CAAA,CAAE,EAGLiC,OAAAA,EAAAA,UAAU,IAAM,CACVjC,EAAU,SACZA,EAAU,QAAQ,cAAc,CAAE,MAAO0C,GAAenB,CAAa,EAAG,CAE5E,EAAG,CAACA,CAAa,CAAC,EAGhBoB,EAAAA,KAAC,MAAA,CAAI,UAAU,kBACZ,SAAA,CAAA7B,EACC6B,EAAAA,KAAAC,WAAA,CACE,SAAA,CAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACb,SAAA,CAAAA,OAAC,MAAA,CAAI,SAAA,CAAA,qBACgB,IACnBE,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAe,WAAS,IAAA,CAAK,CAAA,EAC/C,EACAF,EAAAA,KAAC,MAAA,CAAI,UAAU,aACb,SAAA,CAAAE,EAAAA,IAACC,GAAA,CACC,QAAQ,YACR,KAAK,KACL,QAAS,IAAM7B,EAAiBpB,EAAS,IAAI,EAC9C,SAAA,SAAA,CAAA,EAGDgD,EAAAA,IAACC,GAAA,CACC,KAAK,KACL,QAAS,IAAM,CACb5B,EAAarB,EAAS,KAAMiB,EAAY,QAAQ,EAChDG,EAAiBpB,EAAS,KAAM,EAAI,CACtC,EACD,SAAA,eAAA,CAAA,CAED,CAAA,CACF,CAAA,EACF,EACAgD,EAAAA,IAACE,GAAA,CACC,OAAO,oBACP,SAAUjC,EAAY,SACtB,SAAUA,EAAY,SACtB,SAAS,OACT,MAAO4B,GAAenB,CAAa,EACnC,QAAS,CACP,SAAU,GACV,iBAAkB,GAClB,iBAAkB,GAClB,gBAAiB,GACjB,QAAS,CAAE,QAAS,EAAA,CAAM,EAE5B,YAAaC,CAAA,CAAA,CACf,CAAA,CACF,EAEAqB,EAAAA,IAACG,GAAA,CACC,OAAO,OACP,SAAS,OACT,YAAaxD,GAAwBK,EAAS,IAAI,EAClD,MAAOA,EAAS,KAChB,MAAO6C,GAAenB,CAAa,EACnC,SAAUW,EACV,YAAaV,EACb,QAASG,EACT,WAAYS,EACZ,QAAS,CACP,SAAAtC,EACA,YAAa,KACb,YAAa,GACb,QAAS,GACT,qBAAsB,EACtB,oBAAqB,EACrB,4BAA6B,KAC7B,iBAAkB,CAChB,MAAO,GACP,SAAU,GACV,QAAS,EAAA,EAEX,kCAAmC,GACnC,wBAAyB,KACzB,qBAAsB,OACtB,WAAY,WACZ,aAAc,GACd,cAAe,GACf,gBAAiB,GACjB,QAAS,CAAE,QAAS,EAAA,EACpB,qBAAsB,GACtB,SAAU,IAAA,CACZ,CAAA,EAKJ+C,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACb,SAAAA,EAAAA,IAACI,GAAA,CACC,OAAQ3C,EACR,QAAS,IAAM,CACbI,EAAuB,EAAI,EAC3BE,EAA8B,EAAK,CACrC,CAAA,CAAA,EAEJ,EAGCH,GAAuBH,EAAiB,OAAS,GAChDuC,EAAAA,IAACK,GAAA,CACC,OAAQ5C,EACR,YAAaK,EACb,iBAAkB,IAChBC,EAA8B,CAACD,CAA0B,EAE3D,aAAc6B,EACd,QAAS,IAAM,CACb9B,EAAuB,EAAK,EAC5BG,EAAiB,QAAU,EAC7B,EACA,UAAU,MAAA,CAAA,CACZ,EAEJ,CAEJ,CAEO,MAAMsC,GAA4BC,GAAM,KAAKxD,EAAiB,ECxWrE,SAASyD,GAAW,CAClB,KAAA5D,EACA,KAAA5C,EACA,WAAYyG,EACZ,yBAAAC,EACA,aAAAC,CACF,EAMG,CACD,KAAM,CAAE,aAAAtC,CAAA,EAAiBH,GAAmB0C,GAAUA,CAAK,EACrD,CAAE,YAAAC,CAAA,EAAgBC,GAAgBF,GAAUA,CAAK,EAGjDG,EAAuBR,GAAM,QACjC,IAAMS,GAASH,EAAaH,CAAwB,EACpD,CAACG,EAAaH,CAAwB,CAAA,EAKxCH,GAAM,UAAU,IACP,IAAM,CACXQ,EAAqB,MAAA,CACvB,EACC,CAACA,CAAoB,CAAC,EAEzB,MAAM1B,EAAekB,GAAM,YACxB9M,GAAkB,CACjB4K,EAAazB,EAAMnJ,CAAK,EAGpBkN,IAAiB,2BACnB,QAAQ,IACN,gEACA,CACE,aAAc/D,EACd,aAAc8D,CAAA,CAChB,EAEFK,EAAqBnE,EAAMnJ,CAAK,EAEpC,EACA,CACEmJ,EACAyB,EACA0C,EACAJ,EACAD,CAAA,CACF,EAII1D,EAAqBuD,GAAM,QAC/B,KAAO,CACL,KAAA3D,EACA,KAAM,mBACN,KAAA5C,EACA,UAAW,KACX,UAAW,KACX,UAAW,IAAK,GAElB,CAAC4C,EAAM5C,CAAI,CAAA,EAGb,OACEgG,EAAAA,IAACiB,GAAA,CACC,MAAOrE,EACP,UAAU,kBACV,SAAU,GAET,aAAiB,yBAChBoD,EAAAA,IAACM,GAAA,CACC,SAAAtD,EACA,SAAUqC,CAAA,CAAA,EAGZW,EAAAA,IAACkB,GAAA,CACC,KAAAtE,EACA,MAAO5C,EACP,yBAAA0G,CAAA,CAAA,CACF,CAAA,CAIR,CAEA,MAAMS,GAAqBZ,GAAM,KAAKC,EAAU,EAEhD,SAASY,GAAkB,CACzB,SAAAC,EACA,UAAAC,EACA,YAAAC,EACA,yBAAAb,CACF,EAKG,CACD,KAAM,CAAE,cAAAc,CAAA,EAAkBtD,GAAmB0C,GAAUA,CAAK,EAE5D,OAAOS,EACJ,IAAKzE,GAAS0E,EAAU,KAAMG,GAAMA,EAAE,OAAS7E,CAAI,CAAC,EACpD,OAAQ8E,GAAyBA,IAAQ,MAAS,EAClD,IAAKA,GAAQ,CACZ,MAAMf,EAAea,EAAcE,EAAI,IAAI,GAAK,0BAEhD,OACE1B,EAAAA,IAACmB,GAAA,CAEC,KAAMO,EAAI,KACV,KAAMA,EAAI,KACV,WAAYH,EAAYG,EAAI,IAAI,EAChC,yBAAAhB,EACA,aAAAC,CAAA,EALKe,EAAI,IAAA,CAQf,CAAC,CACL,CAEO,MAAMC,GAA4BpB,GAAM,KAAKa,EAAiB,EC5H9D,MAAMQ,WAAmB,KAAM,CACpC,YACEC,EACgBC,EACAC,EAChB,CACA,MAAMF,CAAO,EAHG,KAAA,UAAAC,EACA,KAAA,SAAAC,EAGhB,KAAK,KAAO,YACd,CACF,CAKA,eAAsBC,GACpBC,EACA5N,EAAwB,GACZ,CACZ,KAAM,CACJ,WAAA6N,EAAa,EACb,aAAAC,EAAe,IACf,SAAAC,EAAW,IACX,cAAAC,EAAgB,EAChB,QAAAC,EACA,YAAAC,EAAc,IAAM,GACpB,OAAAC,CAAA,EACEnO,EAEJ,IAAIyN,EAEJ,QAASW,EAAU,EAAGA,GAAWP,EAAYO,IAC3C,GAAI,CAEF,GAAID,GAAA,MAAAA,EAAQ,QACV,MAAM,IAAI,MAAM,qBAAqB,EAGvC,OAAO,MAAMP,EAAA,CACf,OAASrC,EAAO,CAId,GAHAkC,EAAYlC,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,EAGhE6C,IAAYP,EACd,MAIF,GAAI,CAACK,EAAYT,CAAS,EACxB,MAAMA,EAUR,MAAMY,EANQ,KAAK,IACjBP,EAAe,KAAK,IAAIE,EAAeI,CAAO,EAC9CL,CAAA,GAI6B,GAAM,KAAK,SAAW,IAGjDE,GACFA,EAAQR,EAAWW,EAAU,CAAC,EAIhC,MAAM,IAAI,QAASE,GAAY,CAC7B,MAAMC,EAAY,WAAWD,EAASD,CAAa,EAG/CF,GACFA,EAAO,iBACL,QACA,IAAM,CACJ,aAAaI,CAAS,EACtBD,EAAQ,MAAS,CACnB,EACA,CAAE,KAAM,EAAA,CAAK,CAGnB,CAAC,CACH,CAGF,MAAM,IAAIf,GACR,gBAAgBM,EAAa,CAAC,YAC9BJ,EACAI,EAAa,CAAA,CAEjB,CAwBO,MAAMW,GAAkB,CAE7B,cAAgBjD,GACe,CAC3B,eACA,kBACA,cACA,eACA,YACA,YACA,cAAA,EAG0B,KACzBkD,GACClD,EAAM,QAAQ,SAASkD,CAAO,GAAKlD,EAAM,KAAK,SAASkD,CAAO,CAAA,EAKpE,gBAAkBC,GAA2BnD,GAAe,OAC1D,OAAIT,EAAAS,EAAM,WAAN,MAAAT,EAAgB,OACX4D,EAAY,SAASnD,EAAM,SAAS,MAAM,EAE5C,EACT,EAGA,gBAAkBA,GACU,CACxB,QACA,SACA,0BACA,oBACA,YAAA,EAGuB,KAAMkD,GAC7BlD,EAAM,QAAQ,cAAc,SAASkD,EAAQ,YAAA,CAAa,CAAA,EAK9D,QACE,IAAIE,IACHpD,GACQoD,EAAW,KAAMC,GAAaA,EAASrD,CAAK,CAAC,CAE1D,EChHA,SAASsD,IAAkB,CACzB,MAAMC,EAAYC,GAAgBxC,GAAUA,EAAM,SAAS,EACrDyC,EAAcC,EAAAA,WAAWC,EAAkB,EAC3CC,EAAiBF,EAAAA,WAAWG,EAAqB,EACjDC,EAAcJ,EAAAA,WAAWK,EAAkB,EAC3CjD,EAA2BkD,GAC9BhD,GAAUA,EAAM,wBAAA,EAEb,CACJ,SAAAS,EACA,UAAAwC,EACA,aAAAC,EACA,UAAAxC,EACA,YAAAC,EACA,cAAAwC,EACA,cAAAvC,CAAA,EACEtD,GACF8F,GAAYpD,IAAW,CACrB,SAAUA,EAAM,SAChB,UAAWA,EAAM,UACjB,aAAcA,EAAM,aACpB,UAAWA,EAAM,UACjB,YAAaA,EAAM,YACnB,cAAeA,EAAM,cACrB,cAAeA,EAAM,aAAA,EACrB,CAAA,EAEE,CAAE,aAAAqD,GAAiBnD,GACvBkD,GAAYpD,IAAW,CAAE,aAAcA,EAAM,cAAe,CAAA,EAExD,CAAE,qBAAAsD,EAAsB,iBAAAC,CAAA,EAAqBC,GAAA,EAC7CC,EAAoBT,GACvBhD,GAAUA,EAAM,iBAAA,EAEb0D,EAAmBC,GAAgBF,CAAiB,EACpDG,EAAcZ,GAAkBhD,GAAUA,EAAM,WAAW,EAC3D6D,EAAoBb,GACvBhD,GAAA,OAAU,OAAAzB,EAAAyB,EAAM,kBAAN,YAAAzB,EAAwBrC,IAAM,EAErC4H,EAAiBC,EAAAA,QACrB,IAAMC,GAAoBN,EAAkBE,EAAaC,CAAiB,EAC1E,CAACH,EAAkBE,EAAaC,CAAiB,CAAA,EAE7C,CAAE,QAASI,EAAgB,OAAQC,CAAA,EACvCC,GAAA,EAGIC,EAA2B5H,EAAAA,WAC3B,GAAI,EAEJ6H,EAAmB7H,EAAAA,OAAoC,IAAI,GAAK,EAEhE8H,EAAqB9H,EAAAA,OAA8B,IAAI,EACvD+H,EAAwB/H,EAAAA,OAAe,EAAE,EACzCgI,EAAsBhI,EAAAA,OAA4B,IAAI,GAAK,EAM3DiI,EAAoBzG,EAAAA,YAAY,IAAM,CAC1CuG,EAAsB,QAAU,aAAa,KAAK,IAAA,CAAK,GAGvD,UAAWG,KAAWL,EAAiB,QAAQ,OAAA,EAC7C,aAAaK,CAAO,EAEtBL,EAAiB,QAAQ,MAAA,EACrBC,EAAmB,UACrB,aAAaA,EAAmB,OAAO,EACvCA,EAAmB,QAAU,MAE/B,UAAWK,KAAcP,EAAyB,QAAQ,OAAA,EACxDO,EAAW,MAAA,EAEbP,EAAyB,QAAQ,MAAA,EACjCb,EAAA,EACAhB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,CACH,EAAG,CAACgB,EAAkBhB,CAAS,CAAC,EAEhC/D,EAAAA,UAAU,IAAM,CACd+D,EAAU,CAAE,iBAAkBkC,EAAmB,CACnD,EAAG,CAACA,EAAmBlC,CAAS,CAAC,EAGjC,MAAMqC,EAAqB5G,cAAa6G,GAAoB,CAE1D,MAAMC,GADiBN,EAAoB,QAAQ,IAAIK,CAAO,GAAK,GAC/B,EACpC,OAAAL,EAAoB,QAAQ,IAAIK,EAASC,CAAU,EAC5CA,CACT,EAAG,CAAA,CAAE,EAGCC,EAA0BhB,EAAAA,QAAQ,IAAM,CAE5C,MAAMiB,EAAY,OAAO,QAAQ3B,CAAY,EAAE,IAAI,CAAC,CAAC5Q,EAAKkK,CAAK,IAAM,CAEnE,IAAIsI,EAAmB,EACvB,OAAItI,EAAM,eACJA,EAAM,wBAAwB,KAChCsI,EAAmBtI,EAAM,aAAa,QAAA,EAC7B,OAAOA,EAAM,cAAiB,WACvCsI,EAAmB,IAAI,KAAKtI,EAAM,YAAY,EAAE,QAAA,IAI7C,CACL,IAAAlK,EACA,KAAMkK,EAAM,KACZ,QAASA,EAAM,QACf,MAAOA,EAAM,MACb,aAAcsI,CAAA,CAElB,CAAC,EACD,OAAO,KAAK,UAAUD,CAAS,CACjC,EAAG,CAAC3B,CAAY,CAAC,EAEX6B,EAAoBnB,EAAAA,QAAQ,IAAM,CACtC,MAAMoB,EAAiC,CAAA,EACvC,cAAO,OAAO9B,CAAY,EAAE,QAAS1G,GAAU,CACzCA,EAAM,OAASA,EAAM,SACvBwI,EAAOxI,EAAM,IAAI,EAAIA,EAAM,OAE/B,CAAC,EACMwI,CACT,EAAG,CAACJ,CAAuB,CAAC,EAGtBK,EAAoBpH,EAAAA,YAAY,IAAM,CAC1C,MAAMqH,EAAsC,CAAA,EACtC,CAAE,aAAAhC,GAAiBP,EAAY,SAAA,EACrC,cAAO,OAAOO,CAAY,EAAE,QAAS1G,GAAU,CACzCA,EAAM,OAASA,EAAM,SACvB0I,EAAY1I,EAAM,IAAI,EAAIA,EAAM,OAEpC,CAAC,EACM0I,CACT,EAAG,CAACvC,CAAW,CAAC,EAGVwC,EAAgBtH,EAAAA,YACpB,MACE8C,EACAc,EACAnO,IACG,CACH,GAAI,CAACqN,GAAO,CAACwC,EACX,OAIF,MAAMiC,EAAqBnB,EAAyB,QAAQ,IAAItD,EAAI,IAAI,EACpEyE,IACFA,EAAmB,MAAA,EACnBnB,EAAyB,QAAQ,OAAOtD,EAAI,IAAI,GAIlD,MAAM0E,EAAkB5D,EAAS,KAAO,IAAI,gBACtC6D,EAAc7D,GAAU4D,EAAiB,OAC3CA,GACFpB,EAAyB,QAAQ,IAAItD,EAAI,KAAM0E,CAAe,EAIhE,MAAME,EAAY,GAAG5E,EAAI,IAAI,IAAI,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,CAAQ,GACtD6E,EAAUf,EAAmB9D,EAAI,IAAI,EAC3CyD,EAAsB,QAAUmB,EAEhC,MAAME,EAA6B,CACjC,GAAIF,EACJ,QAAS5E,EAAI,KACb,IAAAA,EACA,OAAQ2E,EACR,UAAW,KAAK,IAAA,EAGhB,cAAeI,GAAA,CAAkB,EAGnC,MAAMC,EAAuB,QAAQF,EAAcD,EAASlS,CAAO,CACrE,EACA,CAAC6P,EAAsBf,EAAWqC,CAAkB,CAAA,EAIhDmB,EAAsB/H,EAAAA,YAC1B,MACEgI,EACAL,EACAlS,IACG,QACH,KAAM,CAAE,IAAAqN,EAAK,OAAAc,EAAQ,GAAAqE,EAAI,cAAAC,GAAkBF,EAGrCG,EAAoBC,GACxBC,GAAqB5D,EAAY,SAAA,EAAW,QAASyD,CAAa,EAC9D,CAAA,EACA,CAAE,QAASE,CAAA,EAGjB,GAAI7B,EAAsB,UAAY0B,EAAI,CACxC,QAAQ,IAAI,uCAAwCnF,EAAI,IAAI,EAC5DyB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,EACD,MACF,CAEAA,EAAU,CACR,YAAa,OACb,aAAc,GACd,oBAAqB,KAAK,IAAA,EAC1B,mBAAoB,CAClB,MAAO,UACP,QAAS,8BAAA,CACX,CACD,EAED,MAAM+D,EAAa,CACjBC,EACAtF,IACG,CACH,GAAIW,EAAO,SAAW2C,EAAsB,UAAY0B,EAAI,OAI5D,IADuBzB,EAAoB,QAAQ,IAAI1D,EAAI,IAAI,GAAK,KAC7C6E,EAAS,CAC9B,QAAQ,IAAI,0CAA0C,EACtD/D,EAAO,cAAc,IAAI,MAAM,OAAO,CAAC,EACvC,MACF,CAEAW,EAAU,CACR,aAAc,GACd,mBAAoB,CAAE,MAAAgE,EAAO,QAAAtF,CAAA,CAAQ,CACtC,CACH,EAEA,GAAI,CAEF,MAAMuF,EAAiBpB,EAAA,EAEvB,QAAQ,IAAI,0CAA2C,CACrD,QAAStE,EAAI,KACb,gBAAiB,OAAO,KAAK0F,CAAc,EAAE,OAC7C,gBAAiB,OAAO,KAAKA,CAAc,EAC3C,cAAe,OAAO,KAAKtB,CAAiB,EAAE,OAC9C,UAAWe,CAAA,CACZ,EAGD,MAAMQ,EAAS,MAAMrF,GACnB,SAAY,CACV,GAAIQ,EAAO,QAAS,MAAM,IAAI,MAAM,iBAAiB,EACrD,OAAO,MAAM0B,EACXxC,EAAI,KACJA,EAAI,KACJ0F,EACAF,EACA,CACE,GAAG7S,EACH,GAAIqQ,EAAiB,CAAE,QAASA,GAAmB,CAAA,CAAC,CACtD,CAEJ,EACA,CACE,WAAY,EACZ,aAAc,IACd,YAAc9E,GAGVA,EAAM,QAAQ,SAAS,WAAW,GAClCA,EAAM,QAAQ,SAAS,MAAM,GAC7BA,EAAM,QAAQ,SAAS,OAAO,GAC9BA,EAAM,QAAQ,SAAS,QAAQ,EAExB,GAGFiD,GAAgB,QACrBA,GAAgB,gBACfyE,GACCA,EAAE,QAAQ,SAAS,QAAQ,GAAKA,EAAE,QAAQ,SAAS,OAAO,CAAA,EAC5D1H,CAAK,EAET,QAAS,CAACA,EAAO6C,IAAY,CAC3B,QAAQ,IACN,6CAA6CA,CAAO,KACpD7C,EAAM,OAAA,EAERuD,EAAU,CACR,aAAc,GACd,mBAAoB,CAClB,MAAO,UACP,QAAS,gCAAgCV,CAAO,MAAA,CAClD,CACD,CACH,EACA,OAAAD,CAAA,CACF,EAGF,GAAIA,EAAO,SAAW2C,EAAsB,UAAY0B,EAAI,CAC1D,QAAQ,IAAI,uBAAwBnF,EAAI,IAAI,EAC5CyB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,EACD,MACF,CAEA,GACEkE,GACA,OAAOA,GAAW,UAClB,SAAUA,GACV,SAAUA,GACV,SAAUA,EACV,CACA,QAAQ,IAAI,0BAA2B,CACrC,QAASA,EAAO,KAChB,UAAWlI,GAAAkI,EAAO,OAAP,YAAAlI,GAAsB,KACjC,UAAW,KAAK,IAAA,EAChB,UAAW0H,EACX,QAAAN,CAAA,CACD,EAMD,KAAM,CAAE,SAAAgB,EAAU,OAAAC,CAAA,EAAWC,GAC1BJ,EAAe,QAAA,EAMlBlE,EAAU,CACR,KAAMkE,EAAO,KACb,KAAMA,EAAO,KACb,KAAMA,EAAO,KACb,SAAUA,EAAO,SACjB,YAAa,OACb,aAAc,GACd,eAAgB,GAChB,mBAAoB,OACpB,oBAAqB,OACrB,kBAAmBhE,EAAY,SAAA,EAAW,aAC1C,YAAcgE,EAAe,YAK7B,aAAeA,EAAe,aAC9B,SAAUG,EACV,GAAGT,EAAiB,CAClB,SAAAQ,EACA,OAAQG,GAAgBH,CAAQ,EAIhC,GAAIjD,EAAmB,CAAE,UAAWA,CAAA,EAAqB,CAAA,EACzD,aAAc5C,EAAI,KAClB,IAAKoF,EACL,OAAQ,WACR,WAAY,KAAK,IAAA,CAAI,CACtB,CAAA,CACF,EACD/C,EAAcsD,EAAO,KAAgB,MAAS,CAChD,CACF,OAASzH,EAAO,CACd,GAAI4C,EAAO,SAAW2C,EAAsB,UAAY0B,EAAI,CAC1D,QAAQ,IAAI,kCAAmCnF,EAAI,IAAI,EACvDyB,EAAU,CACR,aAAc,GACd,mBAAoB,OACpB,oBAAqB,MAAA,CACtB,EACD,MACF,CAEA,MAAMwE,EACJ/H,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EAMjDgI,EACJhI,aAAiBiI,GACbC,GAAqBlI,EAAM,OAAO,EAClC,KAENuD,EAAU,CACR,YAAawE,EACb,aAAc,GACd,mBAAoB,OACpB,oBAAqB,OACrB,GAAIC,EACAb,EAAiB,CACf,SAAUa,EACV,OAAQF,GAAgBE,CAAY,EACpC,GAAItD,EAAmB,CAAE,UAAWA,CAAA,EAAqB,CAAA,EACzD,aAAc5C,EAAI,KAClB,IAAKoF,EACL,QAAS,GACT,OAAQ,WACR,WAAY,KAAK,IAAA,EACjB,UAAWa,CAAA,CACZ,EACD,CAAA,CAAC,CACN,EAED5D,EAAcrC,EAAI,KAAMiG,CAAY,CACtC,QAAA,CACE3C,EAAyB,QAAQ,OAAOtD,EAAI,IAAI,CAClD,CACF,EACA,CACEwC,EACA8B,EACAtB,EACAJ,EACAnB,EACAY,EACAV,CAAA,CACF,EAEIqD,EAAyBtJ,EAAAA,OAAOuJ,CAAmB,EACzDvH,EAAAA,UAAU,IAAM,CACdsH,EAAuB,QAAUC,CACnC,CAAC,EAGD,MAAMoB,EAAwB3K,EAAAA,OAAsB,IAAI,EAGxDgC,EAAAA,UAAU,IAAM,CACd,QAAQ,IAAI,4CAA6C,CACvD,UAAAyE,CAAA,CACD,EAED,MAAMmE,EAAa1G,EAAU,KAAMI,GAAQA,EAAI,OAASmC,CAAS,EAC3DoE,EAAUzG,EAAcqC,CAAS,GAAK,0BAGxCoE,IAAY,2BAA6BD,IAC3CD,EAAsB,QAAUlE,GAIlC,MAAMqE,EAAkBjD,EAAiB,QAAQ,IAAIpB,CAAS,EAC9D,OAAIqE,IACF,aAAaA,CAAe,EAC5BjD,EAAiB,QAAQ,OAAOpB,CAAS,GAGvCmE,GAAcC,IAAY,0BAIvB5E,EAAY,SAAA,EAAW,cAC1BF,EAAU,CAAE,eAAgB,GAAM,EAE3B6E,GAAcC,IAAY,0BAGnC9D,EAAA,EAIK,IAAM,CACX,MAAMmB,EAAUL,EAAiB,QAAQ,IAAIpB,CAAS,EAClDyB,IACF,aAAaA,CAAO,EACpBL,EAAiB,QAAQ,OAAOpB,CAAS,EAE7C,CACF,EAAG,CACDvC,EACAuC,EACAV,EACA3B,EACA0E,EACA/B,CAAA,CACD,EAOD/E,EAAAA,UAAU,IAAM,CACd,MAAM4I,EAAa1G,EAAU,KAAMI,GAAQA,EAAI,OAASmC,CAAS,EAC3DoE,EAAUzG,EAAcqC,CAAS,GAAK,0BAC5C,GAAI,CAACmE,GAAcC,IAAY,0BAA2B,CAMxDnD,EAAA,EACA3B,EAAU,CAAE,QAAS,KAAM,EAC3B,MACF,CACA,OAAA0B,EAAehB,EAAWmE,EAAW,IAAI,EAClClD,CACT,EAAG,CACDjB,EACAgB,EACAC,EACAxD,EACAE,EACA2B,CAAA,CACD,EAGD,MAAMgF,EAA4BxD,EAAAA,QAAQ,IAAM,OAC9C,MAAMyD,MAAW,IACXC,EAAY/G,EAAU,KAAMG,GAAMA,EAAE,OAASoC,CAAS,EAC5D,GACEwE,GACA7G,EAAc6G,EAAU,IAAI,IAAM,0BAElC,GAAI,CAEF,MAAMC,GAAYnJ,EADH,KAAK,MAAMkJ,EAAU,IAAI,EACf,QAAP,YAAAlJ,EAAc,MAC5B,OAAOmJ,GAAc,UACH,OAAO,OAAOrE,CAAY,EAAE,KAC7CsE,GAAMA,EAAE,OAASD,GAAaC,EAAE,KAAA,GAGjCH,EAAK,IAAIC,EAAU,KAAMC,CAAS,CAGxC,MAAQ,CAER,CAEF,OAAOF,CACT,EAAG,CAACvE,EAAWvC,EAAWE,EAAeyC,CAAY,CAAC,EAGtD7E,EAAAA,UAAU,KACR,QAAQ,IAAI,2CAA4C,CACtD,cAAekC,EAAU,OACzB,gBAAiB6G,EAA0B,KAC3C,aAAc,MAAM,KAAKA,EAA0B,SAAS,EAC5D,aAAc,OAAO,QAAQlE,CAAY,EAAE,IAAI,CAAC,CAAC5Q,EAAKkK,CAAK,KAAO,CAChE,IAAAlK,EACA,KAAMkK,EAAM,KACZ,MAAOA,EAAM,KAAA,EACb,CAAA,CACH,EAEmBiL,GAAmB,cAAeC,GAAU,CAC9D,QAAQ,IAAI,gCAAiC,CAC3C,MAAAA,EACA,aAAc,MAAM,KAAKN,EAA0B,SAAS,EAC5D,UAAAtE,EACA,aAAc,OAAO,QAAQI,CAAY,EAAE,IAAI,CAAC,CAAC5Q,EAAKkK,CAAK,KAAO,CAChE,IAAAlK,EACA,KAAMkK,EAAM,KACZ,MAAOA,EAAM,KAAA,EACb,CAAA,CACH,EAGD,MAAMmL,EAA6B,CAAA,EAiBnC,GAfAP,EAA0B,QAAQ,CAACG,EAAW7C,IAAY,CACxD,GAAI6C,IAAcG,EAAM,UAAW,CACjC,MAAM/G,EAAMJ,EAAU,KAAMG,GAAMA,EAAE,OAASgE,CAAO,EAChD/D,GACFgH,EAAoB,KAAKhH,CAAG,CAEhC,CACF,CAAC,EAED,QAAQ,IAAI,wCAAyC,CACnD,UAAW+G,EAAM,UACjB,cAAeC,EAAoB,OACnC,cAAeA,EAAoB,IAAKjH,GAAMA,EAAE,IAAI,CAAA,CACrD,EAEGiH,EAAoB,SAAW,EAAG,CACpC,QAAQ,IAAI,uDAAuD,EACnE,MACF,CAIKrF,EAAY,SAAA,EAAW,cAC1BF,EAAU,CAAE,eAAgB,GAAM,CAEtC,CAAC,GAGA,CACDgF,EACA7G,EACA4E,EACAV,EACA3B,EACAV,CAAA,CACD,EAMD,MAAMwF,EAAmBvL,EAAAA,OAAO8I,CAAa,EAC7C9G,EAAAA,UAAU,IAAM,CACduJ,EAAiB,QAAUzC,CAC7B,CAAC,EACD,MAAM0C,EAAwBxL,EAAAA,OAAOoI,CAAkB,EAiIvD,OAhIApG,EAAAA,UAAU,IAAM,CACdwJ,EAAsB,QAAUpD,CAClC,CAAC,EAEDpG,EAAAA,UAAU,IAAM,CACd,MAAMyJ,EAAU,IAAM,CAGpB1F,EAAU,CAAE,aAAc,GAAM,EAGhC,IAAI2F,EAAa,GACjB,MAAM3L,EAAYsB,GAAmB,SAAA,EAAW,gBAAA,EAChD,GAAItB,GAIE,CADFqG,EAAe,SAAA,EAAW,aAAarG,EAAU,YAAY,EAC1C,CACnB,MAAM4L,EAAW5L,EAAU,eACzBA,EAAU,OAAO,SAAA,CAAS,EAE5BqG,EACG,SAAA,EACA,aAAarG,EAAU,aAAc4L,CAAQ,CAClD,CAKF,KAAM,CAAE,UAAWC,EAAS,cAAeC,CAAA,EACzCzF,EAAe,SAAA,EACjB,UAAW9B,KAAOsH,EAChB,GAAIC,EAAUvH,EAAI,IAAI,IAAM,yBAA0B,CACpD,MAAMwH,EAAMzK,GAAmB,SAAA,EAAW,UAAUiD,EAAI,IAAI,EAC5D,GAAIwH,EAAK,CACP,MAAMH,GAAWG,EAAI,eAAeA,EAAI,OAAO,UAAU,EACnDC,EAAWzF,EAAY,SAAA,EAAW,aAAahC,EAAI,IAAI,GACzD,CAACyH,GAAYA,EAAS,UAAYJ,MACpCrF,EAAY,SAAA,EAAW,YAAYhC,EAAI,KAAMqH,EAAQ,EACrDD,EAAa,GAEjB,CACF,CAIF,MAAMM,EAAa5F,EAAe,SAAA,EAAW,UACvC8B,EAAUL,EAAiB,QAAQ,IAAImE,CAAU,EACnD9D,IACF,aAAaA,CAAO,EACpBL,EAAiB,QAAQ,OAAOmE,CAAU,GAIxClE,EAAmB,SACrB,aAAaA,EAAmB,OAAO,EAEzCA,EAAmB,QAAU,WAAW,IAAM,CAC5CA,EAAmB,QAAU,KAC7B,KAAM,CACJ,UAAWmE,EACX,UAAWC,EACX,cAAeC,EAAA,EACb/F,EAAe,SAAA,EAGnB,IAAIgG,EAAaF,EAEjB,IADgBC,GAAOD,CAAG,GAAK,6BACf,yBACd,GAAIvB,EAAsB,QACxByB,EAAazB,EAAsB,YAC9B,CAEL5E,EAAU,CAAE,aAAc,GAAO,EACjC,MACF,CAGF,MAAMsG,EAAWJ,EAAK,KAAM5H,GAAMA,EAAE,OAAS+H,CAAU,EACvD,GAAIC,EAAU,CAEZ,MAAMC,EAAUlG,EAAe,SAAA,EAAW,aAAagG,CAAU,EAC3DN,GAAMzK,GAAmB,SAAA,EAAW,UAAU+K,CAAU,EACxD9H,GAAMgI,EACR,CAAE,GAAGD,EAAU,KAAMC,EAAQ,UAC7BR,GACE,CAAE,GAAGO,EAAU,KAAMP,GAAI,eAAeA,GAAI,OAAO,UAAU,CAAA,EAC7DO,EACNb,EAAsB,QAAQlH,GAAI,IAAI,EAEtCiH,EAAiB,QACfjH,GACA,OACAoH,EAAa,CAAE,YAAa,IAAS,MAAA,CAEzC,MACE3F,EAAU,CAAE,aAAc,GAAO,CAErC,EAAG,GAAG,CACR,EAEA,cAAO,iBAAiB,wBAAyB0F,CAAO,EACjD,IAAM,CACX,OAAO,oBAAoB,wBAAyBA,CAAO,EACvD3D,EAAmB,SACrB,aAAaA,EAAmB,OAAO,CAE3C,CACF,EAAG,CAAC/B,EAAWK,EAAgBE,CAAW,CAAC,EAG3CtE,EAAAA,UAAU,IACD,IAAM,CAEX4F,EAAyB,QAAQ,QAASO,GACxCA,EAAW,MAAA,CAAM,EAEnBP,EAAyB,QAAQ,MAAA,EAGjCC,EAAiB,QAAQ,QAASK,GAAY,aAAaA,CAAO,CAAC,EACnEL,EAAiB,QAAQ,MAAA,EAGzBd,EAAA,CACF,EACC,CAACA,CAAgB,CAAC,EAEhB9C,EAAS,aASXsI,GAAA,CAAK,MAAO9F,EAAW,cAAeC,EAAc,UAAU,SAE7D,SAAA9D,EAAAA,IAAC2B,GAAA,CACC,SAAAN,EACA,UAAAC,EACA,YAAAC,EACA,yBAAAb,CAAA,CAAA,EAEJ,EAfEV,MAAC,OAAI,UAAU,yEACZ,SAACsB,GAAA,MAAAA,EAAW,OAAsC,qBAA7B,0BAA6B,CACrD,CAeN,CAGO,MAAMsI,GAASC,EAAAA,KAAK3G,EAAe","x_google_ignoreList":[0,1,2,3,4,5]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./files/inter-cyrillic-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./files/inter-cyrillic-wght-normal.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./files/inter-greek-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./files/inter-greek-wght-normal.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./files/inter-vietnamese-wght-normal.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./files/inter-latin-ext-wght-normal.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./files/inter-latin-wght-normal.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@layer theme{:root,:host{--font-sans:"Inter Variable","Inter",system-ui,-apple-system,"Segoe UI",sans-serif;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:11px;--text-xs--line-height:16px;--text-sm:13px;--text-sm--line-height:18px;--text-base:14px;--text-base--line-height:20px;--text-lg:16px;--text-lg--line-height:24px;--text-2xl:24px;--text-2xl--line-height:30px;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-xl:10px;--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:"Inter Variable","Inter",system-ui,-apple-system,"Segoe UI",sans-serif;--default-mono-font-family:ui-monospace,"SFMono-Regular","SF Mono","Menlo","Consolas",monospace;--animate-progress-indeterminate:progress-indeterminate 1.4s ease-in-out infinite}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:216 29% 97%;--foreground:225 28% 14%;--card:0 0% 100%;--card-foreground:225 28% 14%;--popover:0 0% 100%;--popover-foreground:225 28% 14%;--secondary:228 33% 98%;--secondary-foreground:225 28% 14%;--muted:228 33% 98%;--muted-foreground:218 30% 47%;--accent:228 33% 98%;--accent-foreground:225 28% 14%;--border:218 23% 91%;--input:218 23% 91%;--primary:229 24.8% 29.2%;--primary-foreground:0 0% 100%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--ring:223 92% 64%;--radius:.375rem;--warning:32 95% 44%;--warning-foreground:0 0% 100%;--warning-bg:48 96% 89%;--warning-bg-foreground:22 78% 26%;--success:142 72% 36%;--success-foreground:0 0% 100%;--success-bg:141 79% 93%;--success-bg-foreground:145 80% 17%;--destructive-bg:0 93% 94%;--destructive-bg-foreground:0 63% 31%;--header-bg:228 33% 98%;--accent2:28 80% 52%;--accent2-foreground:0 0% 100%;--data-blue:223 92% 64%;--data-blue-bg:214 95% 93%;--data-blue-bg-foreground:226 57% 21%;--chart-1:227 25% 15%;--chart-2:223 92% 64%;--chart-3:258 90% 66%;--chart-4:142 72% 36%;--chart-5:218 30% 47%;--sidebar:0 0% 100%;--sidebar-foreground:225 28% 14%;--sidebar-accent:220 20% 94%;--sidebar-accent-foreground:225 28% 14%;--sidebar-border:218 23% 91%;--sidebar-ring:223 92% 64%;--sidebar-primary:223 92% 64%;--sidebar-primary-foreground:0 0% 100%;--switch-off:220 24% 82%;--surface-editor:0 0% 100%;--surface-preview:216 29% 97%;--surface-chat:0 0% 100%}.dark{--background:227 24.7% 15.1%;--foreground:0 0% 98%;--card:228 22% 20%;--card-foreground:0 0% 98%;--popover:228 22% 25%;--popover-foreground:0 0% 98%;--secondary:228 18% 28%;--secondary-foreground:0 0% 98%;--muted:228 18% 28%;--muted-foreground:218 28% 72%;--accent:228 18% 28%;--accent-foreground:0 0% 98%;--border:228 16% 34%;--input:228 16% 34%;--primary:223 92% 75%;--primary-foreground:227 25% 12%;--destructive:0 93.5% 81.8%;--destructive-foreground:227 24.7% 15.1%;--ring:223 92% 72%;--warning:45 96% 74%;--warning-foreground:240 5.9% 10%;--warning-bg:26 55% 18%;--warning-bg-foreground:48 97% 77%;--success:158 64% 52%;--success-foreground:240 5.9% 10%;--success-bg:142 40% 16%;--success-bg-foreground:141 79% 85%;--destructive-bg:0 40% 18%;--destructive-bg-foreground:0 96% 89%;--header-bg:228 18% 28%;--accent2:28 85% 62%;--accent2-foreground:25 60% 12%;--data-blue:223 100% 74%;--data-blue-bg:226 45% 22%;--data-blue-bg-foreground:214 95% 87%;--sidebar:222 30% 9%;--sidebar-foreground:215 20% 82%;--sidebar-accent:229 22% 20%;--sidebar-accent-foreground:0 0% 100%;--sidebar-border:229 18% 22%;--sidebar-ring:223 92% 72%;--sidebar-primary:223 92% 75%;--sidebar-primary-foreground:227 25% 12%;--chart-1:229 51.1% 56.7%;--chart-2:223 92% 64%;--chart-3:258 90% 72%;--chart-4:160 84% 45%;--chart-5:215 20% 72%;--switch-off:228 14% 42%;--surface-editor:228 22% 20%;--surface-preview:227 24.7% 15.1%;--surface-chat:228 22% 20%}*,:after,:before,::backdrop{border-color:hsl(var(--border))}::file-selector-button{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-sans);font-feature-settings:"cv02","cv03","cv04","cv11";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button:not(:disabled):not([aria-disabled=true]),[role=button]:not([aria-disabled=true]),[role=tab]:not([aria-disabled=true]),[role=switch]:not([aria-disabled=true]),[role=checkbox]:not([aria-disabled=true]),[role=radio]:not([aria-disabled=true]),[role=menuitem],[role=menuitemcheckbox],[role=menuitemradio],[role=option],label:has(>button,>input[type=checkbox],>input[type=radio],>input[type=file]){cursor:pointer}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-x-3{inset-inline:calc(var(--spacing)*3)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.-top-1\.5{top:calc(var(--spacing)*-1.5)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\.5{top:calc(var(--spacing)*1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.top-3\.5{top:calc(var(--spacing)*3.5)}.top-4{top:calc(var(--spacing)*4)}.top-\[50\%\]{top:50%}.-right-1\.5{right:calc(var(--spacing)*-1.5)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-1\.5{right:calc(var(--spacing)*1.5)}.right-2{right:calc(var(--spacing)*2)}.right-2\.5{right:calc(var(--spacing)*2.5)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-1\.5{bottom:calc(var(--spacing)*1.5)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:calc(var(--spacing)*0)}.left-2{left:calc(var(--spacing)*2)}.left-\[50\%\]{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-3\.5{margin-inline:calc(var(--spacing)*3.5)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing)*.5)}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-4{margin-block:calc(var(--spacing)*4)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-\[15px\]{margin-left:15px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-1\.5{width:calc(var(--spacing)*1.5);height:calc(var(--spacing)*1.5)}.size-2\.5{width:calc(var(--spacing)*2.5);height:calc(var(--spacing)*2.5)}.size-3{width:calc(var(--spacing)*3);height:calc(var(--spacing)*3)}.size-3\.5{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.size-5{width:calc(var(--spacing)*5);height:calc(var(--spacing)*5)}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.size-7{width:calc(var(--spacing)*7);height:calc(var(--spacing)*7)}.size-10{width:calc(var(--spacing)*10);height:calc(var(--spacing)*10)}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-48{height:calc(var(--spacing)*48)}.h-64{height:calc(var(--spacing)*64)}.h-\[1\.2rem\]{height:1.2rem}.h-\[1\.15rem\]{height:1.15rem}.h-\[1px\]{height:1px}.h-\[18px\]{height:18px}.h-\[420px\]{height:420px}.h-\[600px\]{height:600px}.h-\[calc\(100\%-2\.5rem\)\]{height:calc(100% - 2.5rem)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.h-svh{height:100svh}.max-h-32{max-height:calc(var(--spacing)*32)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[38vh\]{max-height:38vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[300px\]{max-height:300px}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-8{min-height:calc(var(--spacing)*8)}.min-h-9{min-height:calc(var(--spacing)*9)}.min-h-\[36px\]{min-height:36px}.min-h-\[80px\]{min-height:80px}.min-h-\[200px\]{min-height:200px}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-2\/5{width:40%}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-44{width:calc(var(--spacing)*44)}.w-52{width:calc(var(--spacing)*52)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-\[--sidebar-width\]{width:--sidebar-width}.w-\[1\.2rem\]{width:1.2rem}.w-\[1px\]{width:1px}.w-\[2px\]{width:2px}.w-\[240px\]{width:240px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[--skeleton-width\]{max-width:--skeleton-width}.max-w-\[90\%\]{max-width:90%}.max-w-\[110px\]{max-width:110px}.max-w-\[120px\]{max-width:120px}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-\[280px\]{max-width:280px}.max-w-\[min\(20rem\,var\(--radix-select-content-available-width\)\)\]{max-width:min(20rem,var(--radix-select-content-available-width))}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-4{min-width:calc(var(--spacing)*4)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[12rem\]{min-width:12rem}.min-w-\[260px\]{min-width:260px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y: calc(-50% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.rotate-0{rotate:none}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-progress-indeterminate{animation:var(--animate-progress-indeterminate)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize-none{resize:none}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-2\.5{gap:calc(var(--spacing)*2.5)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-px{gap:1px}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-0\.5{column-gap:calc(var(--spacing)*.5)}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-2\.5{column-gap:calc(var(--spacing)*2.5)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-1{row-gap:calc(var(--spacing)*1)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border\/50>:not(:last-child)){border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){:where(.divide-border\/50>:not(:last-child)){border-color:color-mix(in oklab,hsl(var(--border))50%,transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-xs{border-radius:var(--radius-xs)}.rounded-t-md{border-top-left-radius:calc(var(--radius) - 2px);border-top-right-radius:calc(var(--radius) - 2px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-border,.border-border\/40{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/40{border-color:color-mix(in oklab,hsl(var(--border))40%,transparent)}}.border-border\/60{border-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.border-border\/60{border-color:color-mix(in oklab,hsl(var(--border))60%,transparent)}}.border-destructive,.border-destructive\/20{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.border-destructive\/20{border-color:color-mix(in oklab,hsl(var(--destructive))20%,transparent)}}.border-destructive\/30{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,hsl(var(--destructive))30%,transparent)}}.border-destructive\/40{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.border-destructive\/40{border-color:color-mix(in oklab,hsl(var(--destructive))40%,transparent)}}.border-foreground{border-color:hsl(var(--foreground))}.border-input{border-color:hsl(var(--input))}.border-muted-foreground,.border-muted-foreground\/40{border-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.border-muted-foreground\/40{border-color:color-mix(in oklab,hsl(var(--muted-foreground))40%,transparent)}}.border-muted-foreground\/50{border-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.border-muted-foreground\/50{border-color:color-mix(in oklab,hsl(var(--muted-foreground))50%,transparent)}}.border-primary{border-color:hsl(var(--primary))}.border-primary-foreground\/20{border-color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.border-primary-foreground\/20{border-color:color-mix(in oklab,hsl(var(--primary-foreground))20%,transparent)}}.border-primary\/20{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.border-primary\/20{border-color:color-mix(in oklab,hsl(var(--primary))20%,transparent)}}.border-secondary{border-color:hsl(var(--secondary))}.border-sidebar-border,.border-sidebar-border\/70{border-color:hsl(var(--sidebar-border))}@supports (color:color-mix(in lab,red,red)){.border-sidebar-border\/70{border-color:color-mix(in oklab,hsl(var(--sidebar-border))70%,transparent)}}.border-transparent{border-color:#0000}.border-t-transparent{border-top-color:#0000}.border-l-destructive{border-left-color:hsl(var(--destructive))}.border-l-transparent{border-left-color:#0000}.bg-accent{background-color:hsl(var(--accent))}.bg-accent2{background-color:hsl(var(--accent2))}.bg-background,.bg-background\/60{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/60{background-color:color-mix(in oklab,hsl(var(--background))60%,transparent)}}.bg-background\/80{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/80{background-color:color-mix(in oklab,hsl(var(--background))80%,transparent)}}.bg-background\/95{background-color:hsl(var(--background))}@supports (color:color-mix(in lab,red,red)){.bg-background\/95{background-color:color-mix(in oklab,hsl(var(--background))95%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-border,.bg-border\/60{background-color:hsl(var(--border))}@supports (color:color-mix(in lab,red,red)){.bg-border\/60{background-color:color-mix(in oklab,hsl(var(--border))60%,transparent)}}.bg-card{background-color:hsl(var(--card))}.bg-data-blue{background-color:hsl(var(--data-blue))}.bg-data-blue-bg{background-color:hsl(var(--data-blue-bg))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive-bg{background-color:hsl(var(--destructive-bg))}.bg-destructive\/10{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,hsl(var(--destructive))10%,transparent)}}.bg-destructive\/15{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/15{background-color:color-mix(in oklab,hsl(var(--destructive))15%,transparent)}}.bg-header-bg,.bg-header-bg\/70{background-color:hsl(var(--header-bg))}@supports (color:color-mix(in lab,red,red)){.bg-header-bg\/70{background-color:color-mix(in oklab,hsl(var(--header-bg))70%,transparent)}}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/30{background-color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/30{background-color:color-mix(in oklab,hsl(var(--muted-foreground))30%,transparent)}}.bg-muted\/10{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/10{background-color:color-mix(in oklab,hsl(var(--muted))10%,transparent)}}.bg-muted\/30{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/30{background-color:color-mix(in oklab,hsl(var(--muted))30%,transparent)}}.bg-muted\/40{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/40{background-color:color-mix(in oklab,hsl(var(--muted))40%,transparent)}}.bg-muted\/50{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,hsl(var(--muted))50%,transparent)}}.bg-muted\/60{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/60{background-color:color-mix(in oklab,hsl(var(--muted))60%,transparent)}}.bg-muted\/80{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.bg-muted\/80{background-color:color-mix(in oklab,hsl(var(--muted))80%,transparent)}}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary-foreground\/10{background-color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-primary-foreground\/10{background-color:color-mix(in oklab,hsl(var(--primary-foreground))10%,transparent)}}.bg-primary-foreground\/20{background-color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.bg-primary-foreground\/20{background-color:color-mix(in oklab,hsl(var(--primary-foreground))20%,transparent)}}.bg-primary\/5{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/5{background-color:color-mix(in oklab,hsl(var(--primary))5%,transparent)}}.bg-primary\/10{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,hsl(var(--primary))10%,transparent)}}.bg-primary\/70{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.bg-primary\/70{background-color:color-mix(in oklab,hsl(var(--primary))70%,transparent)}}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sidebar{background-color:hsl(var(--sidebar))}.bg-sidebar-accent,.bg-sidebar-accent\/40{background-color:hsl(var(--sidebar-accent))}@supports (color:color-mix(in lab,red,red)){.bg-sidebar-accent\/40{background-color:color-mix(in oklab,hsl(var(--sidebar-accent))40%,transparent)}}.bg-sidebar-accent\/60{background-color:hsl(var(--sidebar-accent))}@supports (color:color-mix(in lab,red,red)){.bg-sidebar-accent\/60{background-color:color-mix(in oklab,hsl(var(--sidebar-accent))60%,transparent)}}.bg-sidebar-border,.bg-sidebar-border\/70{background-color:hsl(var(--sidebar-border))}@supports (color:color-mix(in lab,red,red)){.bg-sidebar-border\/70{background-color:color-mix(in oklab,hsl(var(--sidebar-border))70%,transparent)}}.bg-success{background-color:hsl(var(--success))}.bg-success-bg{background-color:hsl(var(--success-bg))}.bg-success\/10{background-color:hsl(var(--success))}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,hsl(var(--success))10%,transparent)}}.bg-surface-chat{background-color:hsl(var(--surface-chat))}.bg-surface-editor{background-color:hsl(var(--surface-editor))}.bg-surface-preview{background-color:hsl(var(--surface-preview))}.bg-transparent{background-color:#0000}.bg-warning{background-color:hsl(var(--warning))}.bg-warning-bg{background-color:hsl(var(--warning-bg))}.bg-warning\/10{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,hsl(var(--warning))10%,transparent)}}.bg-warning\/15{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.bg-warning\/15{background-color:color-mix(in oklab,hsl(var(--warning))15%,transparent)}}.bg-warning\/20{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,hsl(var(--warning))20%,transparent)}}.bg-white{background-color:var(--color-white)}.fill-current{fill:currentColor}.fill-primary{fill:hsl(var(--primary))}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-\[1px\]{padding:1px}.px-0{padding-inline:calc(var(--spacing)*0)}.px-0\.5{padding-inline:calc(var(--spacing)*.5)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.py-12{padding-block:calc(var(--spacing)*12)}.py-px{padding-block:1px}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-0\.5{padding-top:calc(var(--spacing)*.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-7{padding-right:calc(var(--spacing)*7)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-0\.5{padding-bottom:calc(var(--spacing)*.5)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-7{padding-left:calc(var(--spacing)*7)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-\[1\.375rem\]{padding-left:1.375rem}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-\[1px\]{vertical-align:1px}.font-mono{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}.font-sans{font-family:Inter Variable,Inter,system-ui,-apple-system,Segoe UI,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-accent2{color:hsl(var(--accent2))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-data-blue{color:hsl(var(--data-blue))}.text-data-blue-bg-foreground{color:hsl(var(--data-blue-bg-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-bg-foreground{color:hsl(var(--destructive-bg-foreground))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-destructive\/80{color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.text-destructive\/80{color:color-mix(in oklab,hsl(var(--destructive))80%,transparent)}}.text-foreground,.text-foreground\/50{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/50{color:color-mix(in oklab,hsl(var(--foreground))50%,transparent)}}.text-foreground\/80{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/80{color:color-mix(in oklab,hsl(var(--foreground))80%,transparent)}}.text-foreground\/90{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.text-foreground\/90{color:color-mix(in oklab,hsl(var(--foreground))90%,transparent)}}.text-muted-foreground,.text-muted-foreground\/40{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/40{color:color-mix(in oklab,hsl(var(--muted-foreground))40%,transparent)}}.text-muted-foreground\/50{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/50{color:color-mix(in oklab,hsl(var(--muted-foreground))50%,transparent)}}.text-muted-foreground\/60{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/60{color:color-mix(in oklab,hsl(var(--muted-foreground))60%,transparent)}}.text-muted-foreground\/70{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/70{color:color-mix(in oklab,hsl(var(--muted-foreground))70%,transparent)}}.text-muted-foreground\/80{color:hsl(var(--muted-foreground))}@supports (color:color-mix(in lab,red,red)){.text-muted-foreground\/80{color:color-mix(in oklab,hsl(var(--muted-foreground))80%,transparent)}}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground,.text-primary-foreground\/50{color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/50{color:color-mix(in oklab,hsl(var(--primary-foreground))50%,transparent)}}.text-primary-foreground\/60{color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/60{color:color-mix(in oklab,hsl(var(--primary-foreground))60%,transparent)}}.text-primary\/60{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.text-primary\/60{color:color-mix(in oklab,hsl(var(--primary))60%,transparent)}}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-sidebar-accent-foreground,.text-sidebar-accent-foreground\/70{color:hsl(var(--sidebar-accent-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-accent-foreground\/70{color:color-mix(in oklab,hsl(var(--sidebar-accent-foreground))70%,transparent)}}.text-sidebar-foreground,.text-sidebar-foreground\/40{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/40{color:color-mix(in oklab,hsl(var(--sidebar-foreground))40%,transparent)}}.text-sidebar-foreground\/45{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/45{color:color-mix(in oklab,hsl(var(--sidebar-foreground))45%,transparent)}}.text-sidebar-foreground\/50{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/50{color:color-mix(in oklab,hsl(var(--sidebar-foreground))50%,transparent)}}.text-sidebar-foreground\/55{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/55{color:color-mix(in oklab,hsl(var(--sidebar-foreground))55%,transparent)}}.text-sidebar-foreground\/60{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/60{color:color-mix(in oklab,hsl(var(--sidebar-foreground))60%,transparent)}}.text-sidebar-foreground\/65{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/65{color:color-mix(in oklab,hsl(var(--sidebar-foreground))65%,transparent)}}.text-sidebar-foreground\/70{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/70{color:color-mix(in oklab,hsl(var(--sidebar-foreground))70%,transparent)}}.text-sidebar-foreground\/80{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/80{color:color-mix(in oklab,hsl(var(--sidebar-foreground))80%,transparent)}}.text-sidebar-foreground\/85{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.text-sidebar-foreground\/85{color:color-mix(in oklab,hsl(var(--sidebar-foreground))85%,transparent)}}.text-success{color:hsl(var(--success))}.text-success-bg-foreground{color:hsl(var(--success-bg-foreground))}.text-warning{color:hsl(var(--warning))}.text-warning-bg-foreground{color:hsl(var(--warning-bg-foreground))}.text-warning\/80{color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.text-warning\/80{color:color-mix(in oklab,hsl(var(--warning))80%,transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-90{opacity:.9}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-border)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_-2px_0_hsl\(var\(--ring\)\)\]{--tw-shadow:inset 0 -2px 0 var(--tw-shadow-color,hsl(var(--ring)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_2px_0_hsl\(var\(--ring\)\)\]{--tw-shadow:inset 0 2px 0 var(--tw-shadow-color,hsl(var(--ring)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-\[hsl\(var\(--sidebar\)\)\]{--tw-ring-color:hsl(var(--sidebar))}.ring-primary\/40{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.ring-primary\/40{--tw-ring-color:color-mix(in oklab,hsl(var(--primary))40%,transparent)}}.ring-sidebar-ring{--tw-ring-color:hsl(var(--sidebar-ring))}.ring-offset-background{--tw-ring-offset-color:hsl(var(--background))}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opa\]{transition-property:margin,opa;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{--tw-ease:cubic-bezier(.16,1,.3,1);transition-timing-function:cubic-bezier(.16,1,.3,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.duration-500{animation-duration:.5s}.ease-\[cubic-bezier\(0\.16\,1\,0\.3\,1\)\]{animation-timing-function:cubic-bezier(.16,1,.3,1)}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.ease-linear{animation-timing-function:linear}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}.fade-in-0{--tw-enter-opacity:0}.running{animation-play-state:running}.zoom-in-95{--tw-enter-scale:.95}.group-focus-within\/menu-item\:opacity-0:is(:where(.group\/menu-item):focus-within *){opacity:0}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/menu-item\:opacity-0:is(:where(.group\/menu-item):hover *){opacity:0}.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *),.group-hover\/msg\:opacity-100:is(:where(.group\/msg):hover *),.group-hover\/row\:opacity-100:is(:where(.group\/row):hover *){opacity:1}}.group-focus-visible\/row\:opacity-100:is(:where(.group\/row):focus-visible *){opacity:1}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing)*8)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing)*-8)}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing)*8)!important;height:calc(var(--spacing)*8)!important}.group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\]:is(:where(.group)[data-collapsible=icon] *){width:--sidebar-width-icon}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem)}.group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\]:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--sidebar-width-icon) + 1rem + 2px)}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*0)!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing)*2)!important}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){right:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\]:is(:where(.group)[data-collapsible=offcanvas] *){left:calc(var(--sidebar-width)*-1)}.group-data-\[collapsible\=offcanvas\]\:w-0:is(:where(.group)[data-collapsible=offcanvas] *){width:calc(var(--spacing)*0)}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing)*-4)}.group-data-\[side\=left\]\:border-r:is(:where(.group)[data-side=left] *){border-right-style:var(--tw-border-style);border-right-width:1px}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:calc(var(--spacing)*0)}.group-data-\[side\=right\]\:rotate-180:is(:where(.group)[data-side=right] *){rotate:180deg}.group-data-\[side\=right\]\:border-l:is(:where(.group)[data-side=right] *){border-left-style:var(--tw-border-style);border-left-width:1px}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:border-sidebar-border:is(:where(.group)[data-variant=floating] *){border-color:hsl(var(--sidebar-border))}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-\[\.destructive\]\:border-muted\/40:is(:where(.group).destructive *){border-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:border-muted\/40:is(:where(.group).destructive *){border-color:color-mix(in oklab,hsl(var(--muted))40%,transparent)}}.group-\[\.destructive\]\:text-destructive-foreground\/70:is(:where(.group).destructive *){color:hsl(var(--destructive-foreground))}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:text-destructive-foreground\/70:is(:where(.group).destructive *){color:color-mix(in oklab,hsl(var(--destructive-foreground))70%,transparent)}}@media (hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:hsl(var(--sidebar-accent-foreground))}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button)[data-active=true]~*){color:hsl(var(--sidebar-accent-foreground))}.peer-data-\[size\=default\]\/menu-button\:top-1\.5:is(:where(.peer\/menu-button)[data-size=default]~*){top:calc(var(--spacing)*1.5)}.peer-data-\[size\=lg\]\/menu-button\:top-2\.5:is(:where(.peer\/menu-button)[data-size=lg]~*){top:calc(var(--spacing)*2.5)}.peer-data-\[size\=sm\]\/menu-button\:top-1:is(:where(.peer\/menu-button)[data-size=sm]~*){top:calc(var(--spacing)*1)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-theme\(spacing\.4\)\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:overflow-hidden::placeholder{overflow:hidden}.placeholder\:text-ellipsis::placeholder{text-overflow:ellipsis}.placeholder\:whitespace-nowrap::placeholder{white-space:nowrap}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-sidebar-foreground\/60::placeholder{color:hsl(var(--sidebar-foreground))}@supports (color:color-mix(in lab,red,red)){.placeholder\:text-sidebar-foreground\/60::placeholder{color:color-mix(in oklab,hsl(var(--sidebar-foreground))60%,transparent)}}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing)*-2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:calc(var(--spacing)*0)}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-1:after{content:var(--tw-content);width:calc(var(--spacing)*1)}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.focus-within\:opacity-100:focus-within{opacity:1}@media (hover:hover){.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab,hsl(var(--accent))50%,transparent)}}.hover\:bg-destructive\/15:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/15:hover{background-color:color-mix(in oklab,hsl(var(--destructive))15%,transparent)}}.hover\:bg-destructive\/20:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab,hsl(var(--destructive))20%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,hsl(var(--destructive))90%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/30:hover{background-color:color-mix(in oklab,hsl(var(--muted))30%,transparent)}}.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/40:hover{background-color:color-mix(in oklab,hsl(var(--muted))40%,transparent)}}.hover\:bg-muted\/50:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,hsl(var(--muted))50%,transparent)}}.hover\:bg-muted\/60:hover{background-color:hsl(var(--muted))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/60:hover{background-color:color-mix(in oklab,hsl(var(--muted))60%,transparent)}}.hover\:bg-primary-foreground\/20:hover{background-color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary-foreground\/20:hover{background-color:color-mix(in oklab,hsl(var(--primary-foreground))20%,transparent)}}.hover\:bg-primary\/10:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab,hsl(var(--primary))10%,transparent)}}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--primary))90%,transparent)}}.hover\:bg-secondary:hover,.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,hsl(var(--secondary))80%,transparent)}}.hover\:bg-sidebar-accent:hover,.hover\:bg-sidebar-accent\/60:hover{background-color:hsl(var(--sidebar-accent))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-sidebar-accent\/60:hover{background-color:color-mix(in oklab,hsl(var(--sidebar-accent))60%,transparent)}}.hover\:bg-warning\/20:hover{background-color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/20:hover{background-color:color-mix(in oklab,hsl(var(--warning))20%,transparent)}}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover,.hover\:text-destructive\/80:hover{color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.hover\:text-destructive\/80:hover{color:color-mix(in oklab,hsl(var(--destructive))80%,transparent)}}.hover\:text-foreground:hover,.hover\:text-foreground\/80:hover{color:hsl(var(--foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:text-foreground\/80:hover{color:color-mix(in oklab,hsl(var(--foreground))80%,transparent)}}.hover\:text-primary-foreground\/80:hover{color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary-foreground\/80:hover{color:color-mix(in oklab,hsl(var(--primary-foreground))80%,transparent)}}.hover\:text-primary\/80:hover{color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.hover\:text-primary\/80:hover{color:color-mix(in oklab,hsl(var(--primary))80%,transparent)}}.hover\:text-sidebar-accent-foreground:hover{color:hsl(var(--sidebar-accent-foreground))}.hover\:text-sidebar-foreground:hover{color:hsl(var(--sidebar-foreground))}.hover\:text-warning\/80:hover{color:hsl(var(--warning))}@supports (color:color-mix(in lab,red,red)){.hover\:text-warning\/80:hover{color:color-mix(in oklab,hsl(var(--warning))80%,transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover{--tw-shadow:0 0 0 1px var(--tw-shadow-color,hsl(var(--sidebar-accent)));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:is(:where(.group)[data-collapsible=offcanvas] *):hover{background-color:hsl(var(--sidebar))}.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group).destructive *):hover{border-color:hsl(var(--destructive))}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:hover\:border-destructive\/30:is(:where(.group).destructive *):hover{border-color:color-mix(in oklab,hsl(var(--destructive))30%,transparent)}}.group-\[\.destructive\]\:hover\:bg-destructive:is(:where(.group).destructive *):hover{background-color:hsl(var(--destructive))}.group-\[\.destructive\]\:hover\:text-destructive-foreground:is(:where(.group).destructive *):hover{color:hsl(var(--destructive-foreground))}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:hsl(var(--sidebar-border))}}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:text-destructive:focus{color:hsl(var(--destructive))}.focus\:opacity-100:focus{opacity:1}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-primary\/40:focus{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus\:ring-primary\/40:focus{--tw-ring-color:color-mix(in oklab,hsl(var(--primary))40%,transparent)}}.focus\:ring-ring:focus{--tw-ring-color:hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.group-\[\.destructive\]\:focus\:ring-destructive:is(:where(.group).destructive *):focus{--tw-ring-color:hsl(var(--destructive))}.group-\[\.destructive\]\:focus\:ring-destructive-foreground\/40:is(:where(.group).destructive *):focus{--tw-ring-color:hsl(var(--destructive-foreground))}@supports (color:color-mix(in lab,red,red)){.group-\[\.destructive\]\:focus\:ring-destructive-foreground\/40:is(:where(.group).destructive *):focus{--tw-ring-color:color-mix(in oklab,hsl(var(--destructive-foreground))40%,transparent)}}.focus-visible\:h-9:focus-visible{height:calc(var(--spacing)*9)}.focus-visible\:border-primary\/50:focus-visible{border-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus-visible\:border-primary\/50:focus-visible{border-color:color-mix(in oklab,hsl(var(--primary))50%,transparent)}}.focus-visible\:border-sidebar-ring:focus-visible{border-color:hsl(var(--sidebar-ring))}.focus-visible\:bg-sidebar-accent\/60:focus-visible{background-color:hsl(var(--sidebar-accent))}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-sidebar-accent\/60:focus-visible{background-color:color-mix(in oklab,hsl(var(--sidebar-accent))60%,transparent)}}.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-primary\/30:focus-visible{--tw-ring-color:hsl(var(--primary))}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-primary\/30:focus-visible{--tw-ring-color:color-mix(in oklab,hsl(var(--primary))30%,transparent)}}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:hsl(var(--ring))}.focus-visible\:ring-sidebar-ring:focus-visible{--tw-ring-color:hsl(var(--sidebar-ring))}.focus-visible\:ring-offset-0:focus-visible{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:hsl(var(--background))}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:bg-sidebar-accent:active{background-color:hsl(var(--sidebar-accent))}.active\:text-sidebar-accent-foreground:active{color:hsl(var(--sidebar-accent-foreground))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:hsl(var(--sidebar))}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:hsl(var(--sidebar-accent))}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:hsl(var(--sidebar-accent-foreground))}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical]{height:1px}.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical]{width:100%}.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical]{flex-direction:column}.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);left:calc(var(--spacing)*0)}.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]:after{content:var(--tw-content);height:calc(var(--spacing)*1)}.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]:after{content:var(--tw-content);width:100%}.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]:after{content:var(--tw-content);--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x: calc(100% - 2px) ;translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y:100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x:-100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x:100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y:-100%}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale:.95}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y:100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x:-100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x:100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y:-100%}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale:.95}@media (hover:hover){.data-\[state\=open\]\:hover\:bg-sidebar-accent[data-state=open]:hover{background-color:hsl(var(--sidebar-accent))}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground[data-state=open]:hover{color:hsl(var(--sidebar-accent-foreground))}}.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.data-\[state\=unchecked\]\:bg-switch-off[data-state=unchecked]{background-color:hsl(var(--switch-off))}@media (min-width:40rem){.sm\:top-auto{top:auto}.sm\:right-0{right:calc(var(--spacing)*0)}.sm\:bottom-0{bottom:calc(var(--spacing)*0)}.sm\:flex{display:flex}.sm\:inline{display:inline}.sm\:max-w-5xl{max-width:var(--container-5xl)}.sm\:max-w-\[425px\]{max-width:425px}.sm\:max-w-\[525px\]{max-width:525px}.sm\:max-w-\[560px\]{max-width:560px}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing)*2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing)*0)}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:var(--radius-xl)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2:is(:where(.peer)[data-state=collapsed]~*):is(:where(.peer)[data-variant=inset]~*){margin-left:calc(var(--spacing)*2)}}.after\:md\:hidden:after{content:var(--tw-content)}@media (min-width:48rem){.after\:md\:hidden:after{display:none}}@media (min-width:64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}}.dark\:block:where(.dark,.dark *){display:block}.dark\:hidden:where(.dark,.dark *){display:none}.dark\:scale-0:where(.dark,.dark *){--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.dark\:scale-100:where(.dark,.dark *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.dark\:-rotate-90:where(.dark,.dark *){rotate:-90deg}.dark\:rotate-0:where(.dark,.dark *){rotate:none}.\[\&_\[data-radix-scroll-area-viewport\]\>div\]\:\!block [data-radix-scroll-area-viewport]>div{display:block!important}.\[\&_h1\]\:my-2 h1{margin-block:calc(var(--spacing)*2)}.\[\&_h1\]\:text-base h1{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\[\&_h2\]\:my-1\.5 h2{margin-block:calc(var(--spacing)*1.5)}.\[\&_h2\]\:text-sm h2{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_h3\]\:my-1 h3{margin-block:calc(var(--spacing)*1)}.\[\&_h3\]\:text-sm h3{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\[\&_li\]\:my-0\.5 li{margin-block:calc(var(--spacing)*.5)}.\[\&_ol\]\:my-1 ol,.\[\&_p\]\:my-1 p{margin-block:calc(var(--spacing)*1)}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_pre\]\:overflow-x-auto pre{overflow-x:auto}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-3\.5 svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\[\&_svg\]\:size-4 svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_ul\]\:my-1 ul{margin-block:calc(var(--spacing)*1)}.\[\&\>button\]\:hidden>button{display:none}.\[\&\>div\>div\]\:\!h-full>div>div{height:100%!important}.\[\&\>span\]\:flex>span{display:flex}.\[\&\>span\]\:min-w-0>span{min-width:calc(var(--spacing)*0)}.\[\&\>span\]\:items-center>span{align-items:center}.\[\&\>span\]\:gap-1\.5>span{gap:calc(var(--spacing)*1.5)}.\[\&\>span\]\:truncate>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>span\]\:break-words>span{overflow-wrap:break-word}.\[\&\>span\]\:whitespace-normal>span{white-space:normal}.\[\&\>span\]\:whitespace-nowrap>span{white-space:nowrap}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing)*4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing)*4)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing)*3.5);height:calc(var(--spacing)*3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-data-blue-bg-foreground>svg{color:hsl(var(--data-blue-bg-foreground))}.\[\&\>svg\]\:text-destructive-bg-foreground>svg{color:hsl(var(--destructive-bg-foreground))}.\[\&\>svg\]\:text-foreground>svg{color:hsl(var(--foreground))}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:hsl(var(--sidebar-accent-foreground))}.\[\&\>svg\]\:text-success-bg-foreground>svg{color:hsl(var(--success-bg-foreground))}.\[\&\>svg\]\:text-warning-bg-foreground>svg{color:hsl(var(--warning-bg-foreground))}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x)var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing)*7)}.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{rotate:90deg}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2{right:calc(var(--spacing)*-2)}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2{left:calc(var(--spacing)*-2)}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-slot=tooltip-content] .\[\[data-slot\=tooltip-content\]_\&\]\:bg-primary-foreground\/20{background-color:hsl(var(--primary-foreground))}@supports (color:color-mix(in lab,red,red)){[data-slot=tooltip-content] .\[\[data-slot\=tooltip-content\]_\&\]\:bg-primary-foreground\/20{background-color:color-mix(in oklab,hsl(var(--primary-foreground))20%,transparent)}}[data-slot=tooltip-content] .\[\[data-slot\=tooltip-content\]_\&\]\:text-primary-foreground{color:hsl(var(--primary-foreground))}}*{scrollbar-width:thin;scrollbar-color:hsl(var(--border))transparent}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--muted-foreground)/.4)}.jto-outline-flash{background:hsl(var(--ring)/.16);border-radius:2px}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes progress-indeterminate{0%{transform:translate(-100%)}to{transform:translate(350%)}}
|