@elixpo/lixsketch 5.6.6 → 5.6.7

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.
Files changed (79) hide show
  1. package/dist/react/{CopyPaste-P6G35CXO.js → CopyPaste-PPDS3AD6.js} +6 -6
  2. package/dist/react/{EventDispatcher-M5B4EWHJ.js → EventDispatcher-UV7LFSAS.js} +13 -13
  3. package/dist/react/{Frame-QEUEYITT.js → Frame-DELCMYV6.js} +3 -3
  4. package/dist/react/IconShape-PZHMZSLR.js +10 -0
  5. package/dist/react/ImageShape-ZMBZARRI.js +10 -0
  6. package/dist/react/Line-VPVPL6ET.js +10 -0
  7. package/dist/react/{SceneSerializer-JEYTYXZQ.js → SceneSerializer-H6KMQCO2.js} +6 -6
  8. package/dist/react/{Selection-23MOLHEI.js → Selection-CFWRGVKH.js} +4 -4
  9. package/dist/react/{SketchEngine-OPJON7TD.js → SketchEngine-UFLZJQXS.js} +20 -20
  10. package/dist/react/{UndoRedo-QVNRI5OB.js → UndoRedo-RXO7YHA2.js} +6 -2
  11. package/dist/react/{arrowTool-VH3PJPDM.js → arrowTool-DO327FKU.js} +3 -3
  12. package/dist/react/{chunk-XSE4HQ2D.js → chunk-2ALS5JGS.js} +2 -2
  13. package/dist/react/{chunk-JEGLUNBC.js → chunk-37PF7FG2.js} +3 -3
  14. package/dist/react/{chunk-5NHJJJBZ.js → chunk-6LWUR7XB.js} +3 -3
  15. package/dist/react/{chunk-B6CYUZC4.js → chunk-7DD2JRBC.js} +2 -2
  16. package/dist/react/{chunk-DNFPTVIP.js → chunk-BOZEDUAF.js} +2 -2
  17. package/dist/react/{chunk-UEL2G6D2.js → chunk-CGMUXYPJ.js} +3 -3
  18. package/dist/react/{chunk-ULPIHUVC.js → chunk-DODPOWNX.js} +3 -3
  19. package/dist/react/{chunk-2DZHO67H.js → chunk-GQLXUZHQ.js} +2 -2
  20. package/dist/react/{chunk-G3DJQY65.js → chunk-I7TVGJFF.js} +3 -3
  21. package/dist/react/{chunk-6GPWSPJF.js → chunk-KC26KJW4.js} +22 -17
  22. package/dist/react/chunk-KC26KJW4.js.map +7 -0
  23. package/dist/react/{chunk-OK4ROGMM.js → chunk-KZBKYHZO.js} +3 -3
  24. package/dist/react/{chunk-SSFEN5CY.js → chunk-O7KXLFZN.js} +3 -3
  25. package/dist/react/{chunk-F56XUE5S.js → chunk-RK3NVAER.js} +4 -4
  26. package/dist/react/{chunk-M7GAB24F.js → chunk-VZX55VQL.js} +64 -1
  27. package/dist/react/chunk-VZX55VQL.js.map +7 -0
  28. package/dist/react/{chunk-DWEFPKDO.js → chunk-X5ENBMGL.js} +2 -2
  29. package/dist/react/{circleTool-2UODOBCV.js → circleTool-NK4RVDAR.js} +4 -4
  30. package/dist/react/{codeTool-F4RV7SAI.js → codeTool-3WF4HEOW.js} +4 -4
  31. package/dist/react/{frameTool-NTGA5BI6.js → frameTool-VCNV2NG2.js} +4 -4
  32. package/dist/react/{freehandTool-L55EUB5C.js → freehandTool-TBAOD46K.js} +4 -4
  33. package/dist/react/{iconTool-KQQBLGR3.js → iconTool-65JCAKYF.js} +4 -4
  34. package/dist/react/{imageTool-LDJ45AD7.js → imageTool-UQZUBOK2.js} +4 -4
  35. package/dist/react/index.js +2 -2
  36. package/dist/react/{lineTool-CSAFD7PW.js → lineTool-762KBYOM.js} +4 -4
  37. package/dist/react/{rectangleTool-YPD2SIIZ.js → rectangleTool-IQK3HZK6.js} +4 -4
  38. package/dist/react/{textTool-VQHMWEFJ.js → textTool-ITG2SBJK.js} +5 -5
  39. package/package.json +1 -1
  40. package/src/core/Selection.js +19 -14
  41. package/src/core/UndoRedo.js +67 -0
  42. package/dist/react/IconShape-NHJE4YBY.js +0 -10
  43. package/dist/react/ImageShape-33VCMSDP.js +0 -10
  44. package/dist/react/Line-A6FE232Q.js +0 -10
  45. package/dist/react/chunk-6GPWSPJF.js.map +0 -7
  46. package/dist/react/chunk-M7GAB24F.js.map +0 -7
  47. /package/dist/react/{CopyPaste-P6G35CXO.js.map → CopyPaste-PPDS3AD6.js.map} +0 -0
  48. /package/dist/react/{EventDispatcher-M5B4EWHJ.js.map → EventDispatcher-UV7LFSAS.js.map} +0 -0
  49. /package/dist/react/{Frame-QEUEYITT.js.map → Frame-DELCMYV6.js.map} +0 -0
  50. /package/dist/react/{IconShape-NHJE4YBY.js.map → IconShape-PZHMZSLR.js.map} +0 -0
  51. /package/dist/react/{ImageShape-33VCMSDP.js.map → ImageShape-ZMBZARRI.js.map} +0 -0
  52. /package/dist/react/{Line-A6FE232Q.js.map → Line-VPVPL6ET.js.map} +0 -0
  53. /package/dist/react/{SceneSerializer-JEYTYXZQ.js.map → SceneSerializer-H6KMQCO2.js.map} +0 -0
  54. /package/dist/react/{Selection-23MOLHEI.js.map → Selection-CFWRGVKH.js.map} +0 -0
  55. /package/dist/react/{SketchEngine-OPJON7TD.js.map → SketchEngine-UFLZJQXS.js.map} +0 -0
  56. /package/dist/react/{UndoRedo-QVNRI5OB.js.map → UndoRedo-RXO7YHA2.js.map} +0 -0
  57. /package/dist/react/{arrowTool-VH3PJPDM.js.map → arrowTool-DO327FKU.js.map} +0 -0
  58. /package/dist/react/{chunk-XSE4HQ2D.js.map → chunk-2ALS5JGS.js.map} +0 -0
  59. /package/dist/react/{chunk-JEGLUNBC.js.map → chunk-37PF7FG2.js.map} +0 -0
  60. /package/dist/react/{chunk-5NHJJJBZ.js.map → chunk-6LWUR7XB.js.map} +0 -0
  61. /package/dist/react/{chunk-B6CYUZC4.js.map → chunk-7DD2JRBC.js.map} +0 -0
  62. /package/dist/react/{chunk-DNFPTVIP.js.map → chunk-BOZEDUAF.js.map} +0 -0
  63. /package/dist/react/{chunk-UEL2G6D2.js.map → chunk-CGMUXYPJ.js.map} +0 -0
  64. /package/dist/react/{chunk-ULPIHUVC.js.map → chunk-DODPOWNX.js.map} +0 -0
  65. /package/dist/react/{chunk-2DZHO67H.js.map → chunk-GQLXUZHQ.js.map} +0 -0
  66. /package/dist/react/{chunk-G3DJQY65.js.map → chunk-I7TVGJFF.js.map} +0 -0
  67. /package/dist/react/{chunk-OK4ROGMM.js.map → chunk-KZBKYHZO.js.map} +0 -0
  68. /package/dist/react/{chunk-SSFEN5CY.js.map → chunk-O7KXLFZN.js.map} +0 -0
  69. /package/dist/react/{chunk-F56XUE5S.js.map → chunk-RK3NVAER.js.map} +0 -0
  70. /package/dist/react/{chunk-DWEFPKDO.js.map → chunk-X5ENBMGL.js.map} +0 -0
  71. /package/dist/react/{circleTool-2UODOBCV.js.map → circleTool-NK4RVDAR.js.map} +0 -0
  72. /package/dist/react/{codeTool-F4RV7SAI.js.map → codeTool-3WF4HEOW.js.map} +0 -0
  73. /package/dist/react/{frameTool-NTGA5BI6.js.map → frameTool-VCNV2NG2.js.map} +0 -0
  74. /package/dist/react/{freehandTool-L55EUB5C.js.map → freehandTool-TBAOD46K.js.map} +0 -0
  75. /package/dist/react/{iconTool-KQQBLGR3.js.map → iconTool-65JCAKYF.js.map} +0 -0
  76. /package/dist/react/{imageTool-LDJ45AD7.js.map → imageTool-UQZUBOK2.js.map} +0 -0
  77. /package/dist/react/{lineTool-CSAFD7PW.js.map → lineTool-762KBYOM.js.map} +0 -0
  78. /package/dist/react/{rectangleTool-YPD2SIIZ.js.map → rectangleTool-IQK3HZK6.js.map} +0 -0
  79. /package/dist/react/{textTool-VQHMWEFJ.js.map → textTool-ITG2SBJK.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/UndoRedo.js"],
4
+ "sourcesContent": ["/* eslint-disable */\n// Undo/Redo system - copied from undoAndRedo.js\n\n// Stacks for undo/redo\nconst undoStack = [];\nconst redoStack = [];\n\nexport function beginUndoBatch() {\n return { startIndex: undoStack.length };\n}\n\nexport function endUndoBatch(batch, label = 'batch') {\n if (!batch || !Number.isInteger(batch.startIndex)) return;\n const startIndex = Math.min(Math.max(batch.startIndex, 0), undoStack.length);\n let actions = undoStack.splice(startIndex);\n if (actions.length === 0) return;\n const groupedAction = actions.length === 1 ? actions[0] : { type: 'batch', label, actions };\n undoStack.push(groupedAction);\n redoStack.length = 0;\n notifyCollaboration();\n return groupedAction;\n}\n\n// Import references to text-related variables and functions\nlet selectedElement = null;\nlet updateSelectionFeedback = null;\nlet svg = null;\n\nfunction notifyCollaboration() {\n if (typeof window !== 'undefined' && typeof window.__collabSceneChanged === 'function') {\n window.__collabSceneChanged();\n }\n}\n\n// Function to set references from other modules\nexport function setTextReferences(element, updateFn, svgElement) {\n selectedElement = element;\n updateSelectionFeedback = updateFn;\n svg = svgElement;\n}\n\n// Function to get current selectedElement (called from other modules)\nexport function getCurrentSelectedElement() {\n return selectedElement;\n}\n\n// Function to update selectedElement reference (called from other modules)\nexport function updateSelectedElement(element) {\n selectedElement = element;\n}\n\n// Call this after creating a new shape (e.g., Rectangle)\nexport function pushCreateAction(shape, meta = null) {\n const action = {\n type: 'create',\n shape: shape\n };\n if (meta?.frameCreation && shape?.shapeName === 'frame') {\n action.frameCreation = true;\n action.containedShapes = [...(meta.containedShapes || shape.containedShapes || [])];\n action.shapeIndex = Array.isArray(shapes) ? shapes.indexOf(shape) : -1;\n }\n undoStack.push(action);\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushDeleteAction(shape, meta = null) {\n // Issue #24 bug #7: when the deleted shape is a frame, the caller may\n // pass `meta.childSnapshot` \u2014 the contained shape REFERENCES at the\n // time of delete. The undo branch uses this to re-attach the children\n // when the frame is restored, instead of leaving an empty box.\n const action = { type: 'delete', shape };\n if (meta && meta.childSnapshot) action.childSnapshot = meta.childSnapshot;\n if (Number.isInteger(meta?.shapeIndex)) action.shapeIndex = meta.shapeIndex;\n if (meta?.parentFrame) action.parentFrame = meta.parentFrame;\n if (Number.isInteger(meta?.frameIndex)) action.frameIndex = meta.frameIndex;\n undoStack.push(action);\n\n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushCanvasResetAction(snapshot, restore, reset) {\n if (!snapshot || typeof restore !== 'function' || typeof reset !== 'function') return;\n // A reset is a new history boundary. Older per-shape actions reference\n // objects that the scene loader will replace, so only the atomic reset\n // snapshot remains undoable.\n undoStack.length = 0;\n redoStack.length = 0;\n undoStack.push({ type: 'canvasReset', snapshot, restore, reset });\n}\n\nexport function invalidateCanvasResetUndo() {\n for (let index = undoStack.length - 1; index >= 0; index -= 1) {\n if (undoStack[index]?.type === 'canvasReset') undoStack.splice(index, 1);\n }\n for (let index = redoStack.length - 1; index >= 0; index -= 1) {\n if (redoStack[index]?.type === 'canvasReset') redoStack.splice(index, 1);\n }\n}\n\nexport function clearUndoHistory() {\n undoStack.length = 0;\n redoStack.length = 0;\n}\n\n// Enhanced delete action to clean up attached arrows\nexport function pushDeleteActionWithAttachments(shape) {\n let affectedArrows = [];\n \n // If deleting a text element, find all attached arrows\n if (shape.type === 'text' || shape.shapeName === 'text') {\n affectedArrows = shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }));\n }\n \n undoStack.push({\n type: 'delete',\n shape: shape,\n affectedArrows: affectedArrows\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushFrameAttachmentAction(frame, shape, action, oldFrame = null) {\n undoStack.push({\n type: 'frameAttachment',\n frame: frame,\n shape: shape,\n action: action, // 'attach' or 'detach'\n oldFrame: oldFrame, // Previous frame if shape was moved between frames\n // Store shape position for potential restoration\n shapeState: {\n x: shape.x,\n y: shape.y,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0\n }\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushCreateActionWithAttachments(shape) {\n undoStack.push({\n type: 'create',\n shape: shape,\n // Store any arrows that might need to reattach when this is undone\n potentialAttachments: []\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushTransformAction(shape, oldPos, newPos) {\n if (shape.shapeName === 'frame') {\n // Handle frame transformation with contained shapes\n const containedShapesStates = shape.containedShapes.map(containedShape => ({\n shape: containedShape,\n oldState: {\n x: containedShape.x - (newPos.x - oldPos.x),\n y: containedShape.y - (newPos.y - oldPos.y),\n width: containedShape.width || 0,\n height: containedShape.height || 0,\n rotation: containedShape.rotation || 0\n },\n newState: {\n x: containedShape.x,\n y: containedShape.y,\n width: containedShape.width || 0,\n height: containedShape.height || 0,\n rotation: containedShape.rotation || 0\n }\n }));\n\n undoStack.push({\n type: 'frameTransform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation,\n frameName: oldPos.frameName || shape.frameName\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation,\n frameName: newPos.frameName || shape.frameName\n },\n containedShapes: containedShapesStates\n });\n } else if (shape.type === 'text') {\n // Enhanced text handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n rotation: oldPos.rotation,\n fontSize: oldPos.fontSize\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n rotation: newPos.rotation,\n fontSize: newPos.fontSize\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.type === 'image') {\n // Enhanced image handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.shapeName === 'circle') {\n // Enhanced circle handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n rx: oldPos.rx,\n ry: oldPos.ry,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n rx: newPos.rx,\n ry: newPos.ry,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.shapeName === \"rectangle\") {\n // Enhanced rectangle handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: { \n x: oldPos.x, \n y: oldPos.y, \n width: oldPos.width, \n height: oldPos.height, \n rotation: oldPos.rotation\n },\n newPos: { \n x: newPos.x, \n y: newPos.y, \n width: newPos.width, \n height: newPos.height, \n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } \n else if (shape.shapeName === 'line') {\n // Enhanced line handling with curve support\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n startPoint: { x: oldPos.startPoint.x, y: oldPos.startPoint.y },\n endPoint: { x: oldPos.endPoint.x, y: oldPos.endPoint.y },\n controlPoint: oldPos.controlPoint ? { x: oldPos.controlPoint.x, y: oldPos.controlPoint.y } : null,\n isCurved: oldPos.isCurved || false\n },\n newPos: {\n startPoint: { x: newPos.startPoint.x, y: newPos.startPoint.y },\n endPoint: { x: newPos.endPoint.x, y: newPos.endPoint.y },\n controlPoint: newPos.controlPoint ? { x: newPos.controlPoint.x, y: newPos.controlPoint.y } : null,\n isCurved: newPos.isCurved || false\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n }\n });\n }\n else if (shape.shapeName === 'arrow') {\n // Handle arrow transform with attachment state\n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n startPoint: { x: oldPos.startPoint.x, y: oldPos.startPoint.y },\n endPoint: { x: oldPos.endPoint.x, y: oldPos.endPoint.y },\n controlPoint1: oldPos.controlPoint1 ? { x: oldPos.controlPoint1.x, y: oldPos.controlPoint1.y } : null,\n controlPoint2: oldPos.controlPoint2 ? { x: oldPos.controlPoint2.x, y: oldPos.controlPoint2.y } : null,\n attachments: oldPos.attachments || shape.getAttachmentState()\n },\n newPos: {\n startPoint: { x: newPos.startPoint.x, y: newPos.startPoint.y },\n endPoint: { x: newPos.endPoint.x, y: newPos.endPoint.y },\n controlPoint1: newPos.controlPoint1 ? { x: newPos.controlPoint1.x, y: newPos.controlPoint1.y } : null,\n controlPoint2: newPos.controlPoint2 ? { x: newPos.controlPoint2.x, y: newPos.controlPoint2.y } : null,\n attachments: newPos.attachments || shape.getAttachmentState()\n }\n });\n } \n else if (shape.type === 'icon') {\n // Enhanced icon handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n}\n else if (shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform\n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n points: JSON.parse(JSON.stringify(oldPos.points)),\n rotation: oldPos.rotation\n },\n newPos: {\n points: JSON.parse(JSON.stringify(newPos.points)),\n rotation: newPos.rotation\n }\n });\n }\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushOptionsChangeAction(shape, oldOptions, newOptions = null) {\n undoStack.push({\n type: 'optionsChange',\n shape: shape,\n oldOptions: oldOptions,\n newOptions: newOptions\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nfunction applyOptionsSnapshot(shape, options) {\n shape.options = { ...options };\n if (shape.shapeName === 'frame') {\n shape.fillColor = options.fillColor;\n shape.fillStyle = options.fillStyle;\n }\n shape.draw();\n}\n\n// Issue #34 bug #4: refresh the multi-selection outline + handles so it\n// follows the reverted geometry. Without this the selection rect stays\n// pinned to the pre-undo coordinates and the user sees a ghost rect\n// floating away from the shapes it claims to wrap.\nfunction refreshSelectionAfterAction() {\n const ms = (typeof window !== 'undefined') ? window.multiSelection : null;\n if (!ms) return;\n if (typeof ms.updateControls !== 'function') return;\n if (!ms.selectedShapes || ms.selectedShapes.size === 0) return;\n try { ms.updateControls(); } catch (err) { console.warn('[UndoRedo] selection refresh failed:', err); }\n}\n\nfunction restoreDeletedShapeFrame(action) {\n const frame = action.parentFrame;\n const shape = action.shape;\n if (!frame || !shape || typeof frame.addShapeToFrame !== 'function') return;\n frame.addShapeToFrame(shape);\n if (Number.isInteger(action.frameIndex) && Array.isArray(frame.containedShapes)) {\n const currentIndex = frame.containedShapes.indexOf(shape);\n if (currentIndex >= 0) frame.containedShapes.splice(currentIndex, 1);\n const targetIndex = Math.min(Math.max(action.frameIndex, 0), frame.containedShapes.length);\n frame.containedShapes.splice(targetIndex, 0, shape);\n const element = shape.group || shape.element;\n const nextShape = frame.containedShapes[targetIndex + 1];\n const nextElement = nextShape?.group || nextShape?.element;\n if (element && frame.clipGroup && nextElement?.parentNode === frame.clipGroup) {\n frame.clipGroup.insertBefore(element, nextElement);\n }\n }\n}\n\nfunction detachDeletedShapeFrame(action) {\n const frame = action.parentFrame;\n const shape = action.shape;\n if (frame && shape && typeof frame.removeShapeFromFrame === 'function' && shape.parentFrame === frame) {\n frame.removeShapeFromFrame(shape);\n }\n}\n\nexport function undo() {\n if (undoStack.length === 0) return;\n const action = undoStack.pop();\n try {\n if (action.type === 'batch') {\n for (let index = action.actions.length - 1; index >= 0; index -= 1) {\n undoStack.push(action.actions[index]);\n undo();\n redoStack.pop();\n }\n redoStack.push(action);\n return;\n }\n\n if (action.type === 'canvasReset') {\n action.restore(action.snapshot);\n redoStack.push(action);\n notifyCollaboration();\n return;\n }\n\n if (action.type === 'frameTransform') {\n // Handle frame transformation undo\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.width = action.oldPos.width;\n action.shape.height = action.oldPos.height;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.frameName = action.oldPos.frameName;\n \n // Restore contained shapes to their old positions\n action.containedShapes.forEach(shapeData => {\n const shape = shapeData.shape;\n shape.x = shapeData.oldState.x;\n shape.y = shapeData.oldState.y;\n shape.width = shapeData.oldState.width;\n shape.height = shapeData.oldState.height;\n shape.rotation = shapeData.oldState.rotation;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n });\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n action.shape.updateClipPath();\n \n redoStack.push(action);\n return;\n }\n \n if (action.type === 'frameAttachment') {\n // Handle frame attachment/detachment undo WITHOUT calling the methods that track undo\n if (action.action === 'attach') {\n // Undo attach: manually remove shape from frame\n const frameIndex = action.frame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frame.containedShapes.splice(frameIndex, 1);\n action.shape.parentFrame = null;\n \n // Move shape back to main SVG\n if (action.shape.group && action.shape.group.parentNode === action.frame.clipGroup) {\n action.frame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n \n // If shape was moved from another frame, restore it there\n if (action.oldFrame) {\n action.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.oldFrame;\n \n // Move to old frame's clipped group\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else if (action.action === 'detach') {\n // Undo detach: manually add shape back to frame\n if (!action.frame.containedShapes.includes(action.shape)) {\n action.frame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frame;\n \n // Move to frame's clipped group\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frame.clipGroup.appendChild(action.shape.group);\n }\n }\n }\n \n // Restore shape state\n action.shape.x = action.shapeState.x;\n action.shape.y = action.shapeState.y;\n action.shape.width = action.shapeState.width;\n action.shape.height = action.shapeState.height;\n action.shape.rotation = action.shapeState.rotation;\n \n if (typeof action.shape.draw === 'function') {\n action.shape.draw();\n }\n \n redoStack.push(action);\n return;\n }\n\n // Handle mode conversion undo (code \u2194 text)\n if (action.type === 'create' && action.shape.type === 'modeConvert') {\n // Undo: remove the new shape, restore the old shape\n const newShape = action.shape.newShape;\n const newElement = action.shape.newElement;\n const oldShape = action.shape.oldShape;\n const oldElement = action.shape.oldElement;\n\n // Remove new shape from DOM and shapes array\n if (newElement && newElement.parentNode) {\n newElement.parentNode.removeChild(newElement);\n }\n const newIdx = shapes.indexOf(newShape);\n if (newIdx !== -1) shapes.splice(newIdx, 1);\n\n // Restore old shape to DOM and shapes array\n if (svg && oldElement) {\n svg.appendChild(oldElement);\n }\n if (oldShape) {\n shapes.push(oldShape);\n }\n\n redoStack.push(action);\n return;\n }\n\n if (action.type === 'create') {\n if (action.frameCreation && action.shape.shapeName === 'frame') {\n // Treat a manually-created frame and its initial membership as one\n // atomic action. Children remain on the canvas when the frame is\n // undone and are clipped back into it on redo.\n for (const child of action.containedShapes || []) {\n if (child?.parentFrame === action.shape) action.shape.removeShapeFromFrame(child);\n }\n if (currentShape === action.shape) {\n action.shape.removeSelection?.();\n currentShape = null;\n }\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n action.shape.group?.remove();\n action.shape.clipGroup?.remove();\n action.shape.clipPath?.remove();\n } else\n if (action.shape.type === 'text') {\n // Handle text creation undo\n if (action.shape.element && action.shape.element.parentNode) {\n action.shape.element.parentNode.removeChild(action.shape.element);\n } else if (action.shape.parentNode) {\n action.shape.parentNode.removeChild(action.shape);\n }\n\n // Remove from shapes array\n const idx = shapes.indexOf(action.shape.element || action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Clean up any arrow attachments to this text\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(action.shape.element || action.shape);\n }\n } else if (action.shape.type === 'image') {\n // Handle image creation undo\n action.shape.remove();\n } else if (action.shape.type === 'icon') {\n // Handle icon creation undo - call the remove method\n action.shape.remove();\n } else {\n // Handle other shape creation undo\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n if (action.shape.group && action.shape.group.parentNode) {\n action.shape.group.parentNode.removeChild(action.shape.group);\n }\n \n // Handle frame cleanup\n if (action.shape.shapeName === 'frame') {\n action.shape.destroy();\n }\n }\n redoStack.push(action);\n return;\n}\n \n if (action.type === 'delete') {\n if (action.shape.type === 'text') {\n // Handle text deletion undo\n if (svg) {\n svg.appendChild(action.shape.element || action.shape);\n // Add back to shapes array\n shapes.push(action.shape.element || action.shape);\n }\n \n // Restore arrow attachments if any existed\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore the old attachment state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n });\n }\n } else if (action.shape.type === 'image') {\n // Handle image deletion undo\n action.shape.restore();\n } else {\n // Handle other shape deletion undo\n if (shapes.indexOf(action.shape) === -1) {\n const index = Number.isInteger(action.shapeIndex)\n ? Math.min(Math.max(action.shapeIndex, 0), shapes.length)\n : shapes.length;\n shapes.splice(index, 0, action.shape);\n }\n if (svg) {\n svg.appendChild(action.shape.group);\n }\n\n // Issue #24 bug #7: rehydrate frame state. The delete path\n // orphaned the frame (removed <g>, clipGroup, clipPath from\n // DOM) but kept the JS object intact. Re-attach clipGroup +\n // clipPath, then re-parent every child from the snapshot via\n // addShapeToFrame. Skip children that were subsequently\n // deleted (they'll get re-added when their own delete action\n // is undone in turn).\n if (action.shape.shapeName === 'frame' && svg) {\n if (action.shape.clipGroup && !action.shape.clipGroup.parentNode) {\n svg.appendChild(action.shape.clipGroup);\n }\n if (action.shape.clipPath && !action.shape.clipPath.parentNode) {\n const defs = svg.querySelector('defs');\n if (defs) defs.appendChild(action.shape.clipPath);\n else svg.insertBefore(action.shape.clipPath, svg.firstChild);\n }\n if (action.childSnapshot && Array.isArray(action.childSnapshot)) {\n for (const child of action.childSnapshot) {\n if (!child) continue;\n if (shapes.indexOf(child) === -1) continue;\n if (typeof action.shape.addShapeToFrame === 'function') {\n action.shape.addShapeToFrame(child);\n }\n }\n }\n }\n }\n restoreDeletedShapeFrame(action);\n redoStack.push(action);\n return;\n }\n \n if (action.type === 'transform') {\n // Handle frame attachment changes first\n if (action.frameAttachment) {\n // Use manual frame operations to avoid undo recursion\n if (action.frameAttachment.newFrame) {\n const frameIndex = action.frameAttachment.newFrame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frameAttachment.newFrame.containedShapes.splice(frameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.newFrame.clipGroup) {\n action.frameAttachment.newFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n if (action.frameAttachment.oldFrame) {\n if (!action.frameAttachment.oldFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.oldFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n if (action.shape.type === 'text') {\n // Enhanced text transform undo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement && action.oldPos.fontSize !== undefined) {\n textElement.setAttribute('font-size', action.oldPos.fontSize + 'px');\n }\n \n // Restore position and rotation\n const centerX = textElement ? textElement.getBBox().x + textElement.getBBox().width / 2 : 0;\n const centerY = textElement ? textElement.getBBox().y + textElement.getBBox().height / 2 : 0;\n \n (action.shape.element || action.shape).setAttribute('transform', \n `translate(${action.oldPos.x}, ${action.oldPos.y}) rotate(${action.oldPos.rotation}, ${centerX}, ${centerY})`\n );\n \n (action.shape.element || action.shape).setAttribute('data-x', action.oldPos.x);\n (action.shape.element || action.shape).setAttribute('data-y', action.oldPos.y);\n \n // Update attached arrows after text undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n } else if (action.shape.type === 'image') {\n // Enhanced image transform undo\n action.shape.restore(action.oldPos);\n \n // Update attached arrows after image undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n } else if (action.shape.shapeName === 'circle') {\n // Enhanced circle transform undo\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.rx = action.oldPos.rx;\n action.shape.ry = action.oldPos.ry;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after circle undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n } else if (action.shape.shapeName === 'line') {\n // Enhanced line transform undo with curve support\n action.shape.startPoint = { x: action.oldPos.startPoint.x, y: action.oldPos.startPoint.y };\n action.shape.endPoint = { x: action.oldPos.endPoint.x, y: action.oldPos.endPoint.y };\n \n // Restore curve state\n action.shape.isCurved = action.oldPos.isCurved || false;\n if (action.oldPos.controlPoint) {\n action.shape.controlPoint = { x: action.oldPos.controlPoint.x, y: action.oldPos.controlPoint.y };\n } else {\n action.shape.controlPoint = null;\n }\n \n // Handle frame attachment changes\n if (action.frameAttachment) {\n // Remove from new frame if it exists\n if (action.frameAttachment.newFrame) {\n const frameIndex = action.frameAttachment.newFrame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frameAttachment.newFrame.containedShapes.splice(frameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.newFrame.clipGroup) {\n action.frameAttachment.newFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add back to old frame if it exists\n if (action.frameAttachment.oldFrame) {\n if (!action.frameAttachment.oldFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.oldFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n }\n else if (action.shape.shapeName === 'arrow') {\n // Enhanced arrow transform undo with attachment restoration\n action.shape.startPoint = { x: action.oldPos.startPoint.x, y: action.oldPos.startPoint.y };\n action.shape.endPoint = { x: action.oldPos.endPoint.x, y: action.oldPos.endPoint.y };\n action.shape.controlPoint1 = action.oldPos.controlPoint1 ? \n { x: action.oldPos.controlPoint1.x, y: action.oldPos.controlPoint1.y } : null;\n action.shape.controlPoint2 = action.oldPos.controlPoint2 ? \n { x: action.oldPos.controlPoint2.x, y: action.oldPos.controlPoint2.y } : null;\n \n // Restore attachment state\n if (action.oldPos.attachments) {\n action.shape.restoreAttachmentState(action.oldPos.attachments);\n } else {\n // Clear attachments if none existed before\n action.shape.attachedToStart = null;\n action.shape.attachedToEnd = null;\n }\n \n action.shape.isSelected = false;\n action.shape.draw();\n \n\n \n } \n else if (action.shape.type === 'icon') {\n \n action.shape.restore(action.oldPos);\n \n // Update attached arrows after icon undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n }\n else if (action.shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform undo\n action.shape.points = JSON.parse(JSON.stringify(action.oldPos.points));\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n } else if (action.shape.shapeName === \"rectangle\") {\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.height = action.oldPos.height;\n action.shape.width = action.oldPos.width;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after rectangle undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n }\n redoStack.push(action);\n return;\n }\n \n if (action.type === 'optionsChange') {\n if (!action.newOptions && action.shape?.options) {\n action.newOptions = action.shape.shapeName === 'arrow'\n ? {\n ...action.shape.options,\n arrowOutlineStyle: action.shape.arrowOutlineStyle,\n arrowHeadStyle: action.shape.arrowHeadStyle,\n arrowCurved: action.shape.arrowCurved,\n arrowCurveAmount: action.shape.arrowCurveAmount,\n }\n : { ...action.shape.options };\n }\n if (action.shape.type === 'text') {\n // Handle text options change undo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement) {\n if (action.oldOptions.color) textElement.setAttribute('fill', action.oldOptions.color);\n if (action.oldOptions.font) textElement.setAttribute('font-family', action.oldOptions.font);\n if (action.oldOptions.size) textElement.setAttribute('font-size', action.oldOptions.size);\n if (action.oldOptions.align) textElement.setAttribute('text-anchor', action.oldOptions.align);\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n }\n } else if (action.shape.shapeName === 'arrow') {\n // Handle arrow options change undo\n action.shape.options = { ...action.oldOptions };\n action.shape.arrowOutlineStyle = action.oldOptions.arrowOutlineStyle;\n action.shape.arrowHeadStyle = action.oldOptions.arrowHeadStyle;\n action.shape.arrowCurved = action.oldOptions.arrowCurved;\n action.shape.arrowCurveAmount = action.oldOptions.arrowCurveAmount;\n action.shape.draw();\n } else {\n // Handle other shape options change undo\n applyOptionsSnapshot(action.shape, action.oldOptions);\n }\n redoStack.push(action);\n return;\n }\n } finally {\n refreshSelectionAfterAction();\n notifyCollaboration();\n }\n}\n\nexport function redo() {\n if (redoStack.length === 0) return;\n const action = redoStack.pop();\n try {\n if (action.type === 'batch') {\n for (const childAction of action.actions) {\n redoStack.push(childAction);\n redo();\n undoStack.pop();\n }\n undoStack.push(action);\n return;\n }\n\n if (action.type === 'canvasReset') {\n action.reset();\n undoStack.push(action);\n notifyCollaboration();\n return;\n }\n\n if (action.type === 'frameTransform') {\n // Handle frame transformation redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.width = action.newPos.width;\n action.shape.height = action.newPos.height;\n action.shape.rotation = action.newPos.rotation;\n action.shape.frameName = action.newPos.frameName;\n \n // Restore contained shapes to their new positions\n action.containedShapes.forEach(shapeData => {\n const shape = shapeData.shape;\n shape.x = shapeData.newState.x;\n shape.y = shapeData.newState.y;\n shape.width = shapeData.newState.width;\n shape.height = shapeData.newState.height;\n shape.rotation = shapeData.newState.rotation;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n });\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n action.shape.updateClipPath();\n \n undoStack.push(action);\n return;\n }\n\n \n if (action.type === 'frameAttachment') {\n // Handle frame attachment/detachment redo WITHOUT calling the methods that track undo\n if (action.action === 'attach') {\n // Redo attach: manually add shape to frame\n if (action.oldFrame) {\n // Remove from old frame\n const oldFrameIndex = action.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.oldFrame.clipGroup) {\n action.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add to new frame\n if (!action.frame.containedShapes.includes(action.shape)) {\n action.frame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frame;\n \n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else if (action.action === 'detach') {\n // Redo detach: manually remove shape from frame\n const frameIndex = action.frame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frame.containedShapes.splice(frameIndex, 1);\n action.shape.parentFrame = null;\n \n if (action.shape.group && action.shape.group.parentNode === action.frame.clipGroup) {\n action.frame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n if (typeof action.shape.draw === 'function') {\n action.shape.draw();\n }\n \n undoStack.push(action);\n return;\n }\n\n // Handle mode conversion redo (code \u2194 text)\n if (action.type === 'create' && action.shape.type === 'modeConvert') {\n // Redo: remove the old shape, restore the new shape\n const newShape = action.shape.newShape;\n const newElement = action.shape.newElement;\n const oldShape = action.shape.oldShape;\n const oldElement = action.shape.oldElement;\n\n // Remove old shape from DOM and shapes array\n if (oldElement && oldElement.parentNode) {\n oldElement.parentNode.removeChild(oldElement);\n }\n const oldIdx = shapes.indexOf(oldShape);\n if (oldIdx !== -1) shapes.splice(oldIdx, 1);\n\n // Restore new shape to DOM and shapes array\n if (svg && newElement) {\n svg.appendChild(newElement);\n }\n if (newShape) {\n shapes.push(newShape);\n }\n\n undoStack.push(action);\n return;\n }\n\n if (action.type === 'create') {\n if (action.frameCreation && action.shape.shapeName === 'frame') {\n const frame = action.shape;\n let defs = svg?.querySelector('defs');\n if (!defs && svg) {\n defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n svg.appendChild(defs);\n }\n if (defs && frame.clipPath && !frame.clipPath.parentNode) defs.appendChild(frame.clipPath);\n if (svg && frame.group && !frame.group.parentNode) svg.appendChild(frame.group);\n if (svg && frame.clipGroup && !frame.clipGroup.parentNode) svg.appendChild(frame.clipGroup);\n if (shapes.indexOf(frame) === -1) {\n const index = action.shapeIndex >= 0 ? Math.min(action.shapeIndex, shapes.length) : shapes.length;\n shapes.splice(index, 0, frame);\n }\n frame.containedShapes = [];\n frame.draw();\n frame.updateClipPath();\n for (const child of action.containedShapes || []) {\n if (child && shapes.includes(child)) frame.addShapeToFrame(child);\n }\n } else\n if (action.shape.type === 'text') {\n // Handle text creation redo\n if (svg) {\n svg.appendChild(action.shape.element || action.shape);\n // Add back to shapes array\n shapes.push(action.shape.element || action.shape);\n }\n }\n else if (action.shape.type === 'image') {\n // Handle image creation redo\n action.shape.restore();\n } else if (action.shape.type === 'icon') {\n // Handle icon creation redo - append the group, not the shape object\n if (svg && action.shape.group) {\n svg.appendChild(action.shape.group);\n }\n // Add back to shapes array\n if (shapes.indexOf(action.shape) === -1) {\n shapes.push(action.shape);\n }\n } else {\n // Handle other shape creation redo\n shapes.push(action.shape);\n if (svg) {\n svg.appendChild(action.shape.group);\n }\n }\n undoStack.push(action);\n return;\n}\n \n if (action.type === 'delete') {\n detachDeletedShapeFrame(action);\n if (action.shape.type === 'text') {\n // Handle text deletion redo\n if ((action.shape.element || action.shape).parentNode) {\n (action.shape.element || action.shape).parentNode.removeChild(action.shape.element || action.shape);\n }\n // Remove from shapes array\n const idx = shapes.indexOf(action.shape.element || action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n \n // Clean up arrow attachments again\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Detach from the deleted text\n if (arrow.attachedToStart && arrow.attachedToStart.shape === (action.shape.element || action.shape)) {\n arrow.detachFromShape(true);\n }\n if (arrow.attachedToEnd && arrow.attachedToEnd.shape === (action.shape.element || action.shape)) {\n arrow.detachFromShape(false);\n }\n arrow.draw();\n });\n }\n }\n else if (action.shape.type === 'image') {\n // Handle image deletion redo\n action.shape.remove();\n } else {\n // Handle other shape deletion redo\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Issue #24 bug #7: for a regular frame, re-orphan instead of\n // destroy() \u2014 releases children visually, detaches the frame's\n // own DOM bits, but keeps the JS object and child references\n // intact so a subsequent undo can rehydrate again.\n if (action.shape.shapeName === 'frame' && !action.shape._diagramType && action.childSnapshot) {\n for (const child of action.childSnapshot) {\n if (!child) continue;\n const el = child.group || child.element;\n if (el && svg) {\n if (action.shape.clipGroup && el.parentNode === action.shape.clipGroup) {\n action.shape.clipGroup.removeChild(el);\n }\n if (el.parentNode !== svg) svg.appendChild(el);\n }\n child.parentFrame = null;\n delete child.isBeingMovedByFrame;\n }\n action.shape.containedShapes = [];\n if (action.shape.group && action.shape.group.parentNode) action.shape.group.parentNode.removeChild(action.shape.group);\n if (action.shape.clipGroup && action.shape.clipGroup.parentNode) action.shape.clipGroup.parentNode.removeChild(action.shape.clipGroup);\n if (action.shape.clipPath && action.shape.clipPath.parentNode) action.shape.clipPath.parentNode.removeChild(action.shape.clipPath);\n } else {\n if (action.shape.group && action.shape.group.parentNode) {\n action.shape.group.parentNode.removeChild(action.shape.group);\n }\n // Diagram frame OR no snapshot \u2192 fall back to destroy().\n if (action.shape.shapeName === 'frame' && typeof action.shape.destroy === 'function') {\n action.shape.destroy();\n }\n }\n }\n undoStack.push(action);\n return;\n }\n \n if (action.type === 'transform') {\n // Handle frame attachment changes first\n if (action.frameAttachment) {\n // Use manual frame operations to avoid undo recursion\n if (action.frameAttachment.oldFrame) {\n const oldFrameIndex = action.frameAttachment.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.frameAttachment.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.oldFrame.clipGroup) {\n action.frameAttachment.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n if (action.frameAttachment.newFrame) {\n if (!action.frameAttachment.newFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.newFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.newFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.newFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n if (action.shape.type === 'text') {\n // Enhanced text transform redo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement && action.newPos.fontSize !== undefined) {\n textElement.setAttribute('font-size', action.newPos.fontSize + 'px');\n }\n \n // Restore position and rotation\n const centerX = textElement ? textElement.getBBox().x + textElement.getBBox().width / 2 : 0;\n const centerY = textElement ? textElement.getBBox().y + textElement.getBBox().height / 2 : 0;\n \n (action.shape.element || action.shape).setAttribute('transform', \n `translate(${action.newPos.x}, ${action.newPos.y}) rotate(${action.newPos.rotation}, ${centerX}, ${centerY})`\n );\n \n (action.shape.element || action.shape).setAttribute('data-x', action.newPos.x);\n (action.shape.element || action.shape).setAttribute('data-y', action.newPos.y);\n \n // Update attached arrows after text redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current text position\n arrow.updateAttachments();\n }\n });\n }\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n } else if (action.shape.type === 'image') {\n // Enhanced image transform redo\n action.shape.restore(action.newPos);\n \n // Update attached arrows after image redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current image position\n arrow.updateAttachments();\n }\n });\n }\n } else if (action.shape.shapeName === 'circle') {\n // Enhanced circle transform redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.rx = action.newPos.rx;\n action.shape.ry = action.newPos.ry;\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after circle redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current circle position\n arrow.updateAttachments();\n }\n });\n }\n } else if (action.shape.shapeName === 'line') {\n // Enhanced line transform redo with curve support\n action.shape.startPoint = { x: action.newPos.startPoint.x, y: action.newPos.startPoint.y };\n action.shape.endPoint = { x: action.newPos.endPoint.x, y: action.newPos.endPoint.y };\n \n // Restore curve state\n action.shape.isCurved = action.newPos.isCurved || false;\n if (action.newPos.controlPoint) {\n action.shape.controlPoint = { x: action.newPos.controlPoint.x, y: action.newPos.controlPoint.y };\n } else {\n action.shape.controlPoint = null;\n }\n \n // Handle frame attachment changes\n if (action.frameAttachment) {\n // Remove from old frame if it exists\n if (action.frameAttachment.oldFrame) {\n const oldFrameIndex = action.frameAttachment.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.frameAttachment.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.oldFrame.clipGroup) {\n action.frameAttachment.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add to new frame if it exists\n if (action.frameAttachment.newFrame) {\n if (!action.frameAttachment.newFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.newFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.newFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.newFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n }\n else if (action.shape.shapeName === 'arrow') {\n // Enhanced arrow transform redo with attachment restoration\n action.shape.startPoint = { x: action.newPos.startPoint.x, y: action.newPos.startPoint.y };\n action.shape.endPoint = { x: action.newPos.endPoint.x, y: action.newPos.endPoint.y };\n action.shape.controlPoint1 = action.newPos.controlPoint1 ? \n { x: action.newPos.controlPoint1.x, y: action.newPos.controlPoint1.y } : null;\n action.shape.controlPoint2 = action.newPos.controlPoint2 ? \n { x: action.newPos.controlPoint2.x, y: action.newPos.controlPoint2.y } : null;\n \n // Restore attachment state\n if (action.newPos.attachments) {\n action.shape.restoreAttachmentState(action.newPos.attachments);\n } else {\n // Clear attachments if none should exist\n action.shape.attachedToStart = null;\n action.shape.attachedToEnd = null;\n }\n \n action.shape.isSelected = false;\n action.shape.draw();\n \n } \n else if (action.shape.type === 'icon') {\n action.shape.restore(action.newPos);\n \n // Update attached arrows after icon redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current icon position\n arrow.updateAttachments();\n }\n });\n }\n }\n else if (action.shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform redo\n action.shape.points = JSON.parse(JSON.stringify(action.newPos.points));\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n } else if (action.shape.shapeName === \"rectangle\") {\n // Enhanced rectangle transform redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.height = action.newPos.height;\n action.shape.width = action.newPos.width;\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after rectangle redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current rectangle position\n arrow.updateAttachments();\n }\n });\n }\n }\n undoStack.push(action);\n return;\n }\n \n if (action.type === 'optionsChange') {\n if (action.shape.type === 'text') {\n // Handle text options change redo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement) {\n if (action.newOptions.color) textElement.setAttribute('fill', action.newOptions.color);\n if (action.newOptions.font) textElement.setAttribute('font-family', action.newOptions.font);\n if (action.newOptions.size) textElement.setAttribute('font-size', action.newOptions.size);\n if (action.newOptions.align) textElement.setAttribute('text-anchor', action.newOptions.align);\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n }\n } else if (action.shape.shapeName === 'arrow') {\n action.shape.options = { ...action.newOptions };\n action.shape.arrowOutlineStyle = action.newOptions.arrowOutlineStyle;\n action.shape.arrowHeadStyle = action.newOptions.arrowHeadStyle;\n action.shape.arrowCurved = action.newOptions.arrowCurved;\n action.shape.arrowCurveAmount = action.newOptions.arrowCurveAmount;\n action.shape.draw();\n } else {\n applyOptionsSnapshot(action.shape, action.newOptions);\n }\n undoStack.push(action);\n return;\n }\n } finally {\n refreshSelectionAfterAction();\n notifyCollaboration();\n }\n}\n\n// Optional: Keyboard shortcuts\ndocument.addEventListener('keydown', (e) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'z') {\n e.preventDefault();\n undo();\n }\n if ((e.ctrlKey || e.metaKey) && (e.key === 'y' || (e.shiftKey && e.key === 'z'))) {\n e.preventDefault();\n redo();\n }\n});\n\n// Attach to buttons\ndocument.getElementById('undo')?.addEventListener('click', undo);\ndocument.getElementById('redo')?.addEventListener('click', redo);\n\n// Expose globally for plain scripts\nwindow.pushCreateAction = pushCreateAction;\nwindow.pushDeleteAction = pushDeleteAction;\nwindow.pushCanvasResetAction = pushCanvasResetAction;\nwindow.invalidateCanvasResetUndo = invalidateCanvasResetUndo;\nwindow.clearUndoHistory = clearUndoHistory;\nwindow.pushDeleteActionWithAttachments = pushDeleteActionWithAttachments;\nwindow.pushTransformAction = pushTransformAction;\nwindow.pushOptionsChangeAction = pushOptionsChangeAction;\nwindow.pushCreateActionWithAttachments = pushCreateActionWithAttachments;\nwindow.undo = undo;\nwindow.redo = redo;\n"],
5
+ "mappings": ";;;AAIA,IAAM,YAAY,CAAC;AACnB,IAAM,YAAY,CAAC;AAEZ,SAAS,iBAAiB;AAC7B,SAAO,EAAE,YAAY,UAAU,OAAO;AAC1C;AAEO,SAAS,aAAa,OAAO,QAAQ,SAAS;AACjD,MAAI,CAAC,SAAS,CAAC,OAAO,UAAU,MAAM,UAAU,EAAG;AACnD,QAAM,aAAa,KAAK,IAAI,KAAK,IAAI,MAAM,YAAY,CAAC,GAAG,UAAU,MAAM;AAC3E,MAAI,UAAU,UAAU,OAAO,UAAU;AACzC,MAAI,QAAQ,WAAW,EAAG;AAC1B,QAAM,gBAAgB,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,SAAS,OAAO,QAAQ;AAC1F,YAAU,KAAK,aAAa;AAC5B,YAAU,SAAS;AACnB,sBAAoB;AACpB,SAAO;AACX;AAGA,IAAI,kBAAkB;AACtB,IAAI,0BAA0B;AAC9B,IAAI,MAAM;AAEV,SAAS,sBAAsB;AAC3B,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,yBAAyB,YAAY;AACpF,WAAO,qBAAqB;AAAA,EAChC;AACJ;AAGO,SAAS,kBAAkB,SAAS,UAAU,YAAY;AAC7D,oBAAkB;AAClB,4BAA0B;AAC1B,QAAM;AACV;AAGO,SAAS,4BAA4B;AACxC,SAAO;AACX;AAGO,SAAS,sBAAsB,SAAS;AAC3C,oBAAkB;AACtB;AAGO,SAAS,iBAAiB,OAAO,OAAO,MAAM;AACjD,QAAM,SAAS;AAAA,IACX,MAAM;AAAA,IACN;AAAA,EACJ;AACA,MAAI,MAAM,iBAAiB,OAAO,cAAc,SAAS;AACrD,WAAO,gBAAgB;AACvB,WAAO,kBAAkB,CAAC,GAAI,KAAK,mBAAmB,MAAM,mBAAmB,CAAC,CAAE;AAClF,WAAO,aAAa,MAAM,QAAQ,MAAM,IAAI,OAAO,QAAQ,KAAK,IAAI;AAAA,EACxE;AACA,YAAU,KAAK,MAAM;AAGrB,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,iBAAiB,OAAO,OAAO,MAAM;AAKjD,QAAM,SAAS,EAAE,MAAM,UAAU,MAAM;AACvC,MAAI,QAAQ,KAAK,cAAe,QAAO,gBAAgB,KAAK;AAC5D,MAAI,OAAO,UAAU,MAAM,UAAU,EAAG,QAAO,aAAa,KAAK;AACjE,MAAI,MAAM,YAAa,QAAO,cAAc,KAAK;AACjD,MAAI,OAAO,UAAU,MAAM,UAAU,EAAG,QAAO,aAAa,KAAK;AACjE,YAAU,KAAK,MAAM;AAGrB,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,sBAAsB,UAAU,SAAS,OAAO;AAC5D,MAAI,CAAC,YAAY,OAAO,YAAY,cAAc,OAAO,UAAU,WAAY;AAI/E,YAAU,SAAS;AACnB,YAAU,SAAS;AACnB,YAAU,KAAK,EAAE,MAAM,eAAe,UAAU,SAAS,MAAM,CAAC;AACpE;AAEO,SAAS,4BAA4B;AACxC,WAAS,QAAQ,UAAU,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC3D,QAAI,UAAU,KAAK,GAAG,SAAS,cAAe,WAAU,OAAO,OAAO,CAAC;AAAA,EAC3E;AACA,WAAS,QAAQ,UAAU,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC3D,QAAI,UAAU,KAAK,GAAG,SAAS,cAAe,WAAU,OAAO,OAAO,CAAC;AAAA,EAC3E;AACJ;AAEO,SAAS,mBAAmB;AAC/B,YAAU,SAAS;AACnB,YAAU,SAAS;AACvB;AAGO,SAAS,gCAAgC,OAAO;AACnD,MAAI,iBAAiB,CAAC;AAGtB,MAAI,MAAM,SAAS,UAAU,MAAM,cAAc,QAAQ;AACrD,qBAAiB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC/C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,MACX;AAAA,MACA,gBAAgB,MAAM,mBAAmB;AAAA,MACzC,WAAW;AAAA,QACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,QAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,MAClC;AAAA,IACJ,EAAE;AAAA,EACV;AAEA,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACJ,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,0BAA0B,OAAO,OAAO,QAAQ,WAAW,MAAM;AAC7E,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA;AAAA;AAAA,IAEA,YAAY;AAAA,MACR,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU,MAAM,YAAY;AAAA,IAChC;AAAA,EACJ,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,gCAAgC,OAAO;AACnD,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA;AAAA,IAEA,sBAAsB,CAAC;AAAA,EAC3B,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,oBAAoB,OAAO,QAAQ,QAAQ;AACvD,MAAI,MAAM,cAAc,SAAS;AAE7B,UAAM,wBAAwB,MAAM,gBAAgB,IAAI,qBAAmB;AAAA,MACvE,OAAO;AAAA,MACP,UAAU;AAAA,QACN,GAAG,eAAe,KAAK,OAAO,IAAI,OAAO;AAAA,QACzC,GAAG,eAAe,KAAK,OAAO,IAAI,OAAO;AAAA,QACzC,OAAO,eAAe,SAAS;AAAA,QAC/B,QAAQ,eAAe,UAAU;AAAA,QACjC,UAAU,eAAe,YAAY;AAAA,MACzC;AAAA,MACA,UAAU;AAAA,QACN,GAAG,eAAe;AAAA,QAClB,GAAG,eAAe;AAAA,QAClB,OAAO,eAAe,SAAS;AAAA,QAC/B,QAAQ,eAAe,UAAU;AAAA,QACjC,UAAU,eAAe,YAAY;AAAA,MACzC;AAAA,IACJ,EAAE;AAEF,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO,aAAa,MAAM;AAAA,MACzC;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO,aAAa,MAAM;AAAA,MACzC;AAAA,MACA,iBAAiB;AAAA,IACrB,CAAC;AAAA,EACL,WAAW,MAAM,SAAS,QAAQ;AAE9B,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WAAW,MAAM,SAAS,SAAS;AAE/B,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WAAW,MAAM,cAAc,UAAU;AAErC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,IAAI,OAAO;AAAA,QACX,IAAI,OAAO;AAAA,QACX,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,IAAI,OAAO;AAAA,QACX,IAAI,OAAO;AAAA,QACX,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WAAW,MAAM,cAAc,aAAa;AAExC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WACS,MAAM,cAAc,QAAQ;AAEjC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,cAAc,OAAO,eAAe,EAAE,GAAG,OAAO,aAAa,GAAG,GAAG,OAAO,aAAa,EAAE,IAAI;AAAA,QAC7F,UAAU,OAAO,YAAY;AAAA,MACjC;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,cAAc,OAAO,eAAe,EAAE,GAAG,OAAO,aAAa,GAAG,GAAG,OAAO,aAAa,EAAE,IAAI;AAAA,QAC7F,UAAU,OAAO,YAAY;AAAA,MACjC;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA,IACJ,CAAC;AAAA,EACL,WACU,MAAM,cAAc,SAAS;AAEnC,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,aAAa,OAAO,eAAe,MAAM,mBAAmB;AAAA,MAChE;AAAA,MACA,QAAQ;AAAA,QACJ,YAAY,EAAE,GAAG,OAAO,WAAW,GAAG,GAAG,OAAO,WAAW,EAAE;AAAA,QAC7D,UAAU,EAAE,GAAG,OAAO,SAAS,GAAG,GAAG,OAAO,SAAS,EAAE;AAAA,QACvD,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,eAAe,OAAO,gBAAgB,EAAE,GAAG,OAAO,cAAc,GAAG,GAAG,OAAO,cAAc,EAAE,IAAI;AAAA,QACjG,aAAa,OAAO,eAAe,MAAM,mBAAmB;AAAA,MAChE;AAAA,IACJ,CAAC;AAAA,EACL,WACS,MAAM,SAAS,QAAQ;AAEhC,UAAM,eAAe,MAAM,eAAe;AAE1C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,MACrB;AAAA;AAAA,MAEA,iBAAiB;AAAA,QACb,UAAU,OAAO,eAAe;AAAA,QAChC,UAAU;AAAA,MACd;AAAA;AAAA,MAEA,gBAAgB,OAAO,OAAO,OAAK,EAAE,cAAc,YAC9C,EAAE,iBAAiB,UAAU,SAAS,EAAE,eAAe,UAAU,MAAM,EACvE,IAAI,YAAU;AAAA,QACX;AAAA,QACA,gBAAgB,MAAM,mBAAmB;AAAA,QACzC,WAAW;AAAA,UACP,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,UAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,QAClC;AAAA,MACJ,EAAE;AAAA,IACV,CAAC;AAAA,EACL,WACa,MAAM,cAAc,kBAAkB;AAE3C,cAAU,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,KAAK,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,QAChD,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,QAAQ;AAAA,QACJ,QAAQ,KAAK,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,QAChD,UAAU,OAAO;AAAA,MACrB;AAAA,IACJ,CAAC;AAAA,EACL;AAGA,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEO,SAAS,wBAAwB,OAAO,YAAY,aAAa,MAAM;AAC1E,YAAU,KAAK;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AAGD,YAAU,SAAS;AACnB,sBAAoB;AACxB;AAEA,SAAS,qBAAqB,OAAO,SAAS;AAC1C,QAAM,UAAU,EAAE,GAAG,QAAQ;AAC7B,MAAI,MAAM,cAAc,SAAS;AAC7B,UAAM,YAAY,QAAQ;AAC1B,UAAM,YAAY,QAAQ;AAAA,EAC9B;AACA,QAAM,KAAK;AACf;AAMA,SAAS,8BAA8B;AACnC,QAAM,KAAM,OAAO,WAAW,cAAe,OAAO,iBAAiB;AACrE,MAAI,CAAC,GAAI;AACT,MAAI,OAAO,GAAG,mBAAmB,WAAY;AAC7C,MAAI,CAAC,GAAG,kBAAkB,GAAG,eAAe,SAAS,EAAG;AACxD,MAAI;AAAE,OAAG,eAAe;AAAA,EAAG,SAAS,KAAK;AAAE,YAAQ,KAAK,wCAAwC,GAAG;AAAA,EAAG;AAC1G;AAEA,SAAS,yBAAyB,QAAQ;AACtC,QAAM,QAAQ,OAAO;AACrB,QAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,SAAS,CAAC,SAAS,OAAO,MAAM,oBAAoB,WAAY;AACrE,QAAM,gBAAgB,KAAK;AAC3B,MAAI,OAAO,UAAU,OAAO,UAAU,KAAK,MAAM,QAAQ,MAAM,eAAe,GAAG;AAC7E,UAAM,eAAe,MAAM,gBAAgB,QAAQ,KAAK;AACxD,QAAI,gBAAgB,EAAG,OAAM,gBAAgB,OAAO,cAAc,CAAC;AACnE,UAAM,cAAc,KAAK,IAAI,KAAK,IAAI,OAAO,YAAY,CAAC,GAAG,MAAM,gBAAgB,MAAM;AACzF,UAAM,gBAAgB,OAAO,aAAa,GAAG,KAAK;AAClD,UAAM,UAAU,MAAM,SAAS,MAAM;AACrC,UAAM,YAAY,MAAM,gBAAgB,cAAc,CAAC;AACvD,UAAM,cAAc,WAAW,SAAS,WAAW;AACnD,QAAI,WAAW,MAAM,aAAa,aAAa,eAAe,MAAM,WAAW;AAC3E,YAAM,UAAU,aAAa,SAAS,WAAW;AAAA,IACrD;AAAA,EACJ;AACJ;AAEA,SAAS,wBAAwB,QAAQ;AACrC,QAAM,QAAQ,OAAO;AACrB,QAAM,QAAQ,OAAO;AACrB,MAAI,SAAS,SAAS,OAAO,MAAM,yBAAyB,cAAc,MAAM,gBAAgB,OAAO;AACnG,UAAM,qBAAqB,KAAK;AAAA,EACpC;AACJ;AAEO,SAAS,OAAO;AACnB,MAAI,UAAU,WAAW,EAAG;AAC5B,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI;AACJ,QAAI,OAAO,SAAS,SAAS;AACzB,eAAS,QAAQ,OAAO,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAChE,kBAAU,KAAK,OAAO,QAAQ,KAAK,CAAC;AACpC,aAAK;AACL,kBAAU,IAAI;AAAA,MAClB;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,eAAe;AAC/B,aAAO,QAAQ,OAAO,QAAQ;AAC9B,gBAAU,KAAK,MAAM;AACrB,0BAAoB;AACpB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,kBAAkB;AAElC,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,aAAO,MAAM,SAAS,OAAO,OAAO;AACpC,aAAO,MAAM,WAAW,OAAO,OAAO;AACtC,aAAO,MAAM,YAAY,OAAO,OAAO;AAGvC,aAAO,gBAAgB,QAAQ,eAAa;AACxC,cAAM,QAAQ,UAAU;AACxB,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,QAAQ,UAAU,SAAS;AACjC,cAAM,SAAS,UAAU,SAAS;AAClC,cAAM,WAAW,UAAU,SAAS;AAEpC,YAAI,OAAO,MAAM,SAAS,YAAY;AAClC,gBAAM,KAAK;AAAA,QACf;AAAA,MACJ,CAAC;AAED,aAAO,MAAM,aAAa;AAC1B,UAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,aAAO,MAAM,KAAK;AAClB,aAAO,MAAM,eAAe;AAE5B,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,mBAAmB;AAEnC,UAAI,OAAO,WAAW,UAAU;AAE5B,cAAM,aAAa,OAAO,MAAM,gBAAgB,QAAQ,OAAO,KAAK;AACpE,YAAI,aAAa,IAAI;AACjB,iBAAO,MAAM,gBAAgB,OAAO,YAAY,CAAC;AACjD,iBAAO,MAAM,cAAc;AAG3B,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,MAAM,WAAW;AAChF,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AACrD,gBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,UACtC;AAAA,QACJ;AAGA,YAAI,OAAO,UAAU;AACjB,iBAAO,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjD,iBAAO,MAAM,cAAc,OAAO;AAGlC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,gBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,mBAAO,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,UAC5D;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,WAAW,UAAU;AAEnC,YAAI,CAAC,OAAO,MAAM,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACtD,iBAAO,MAAM,gBAAgB,KAAK,OAAO,KAAK;AAC9C,iBAAO,MAAM,cAAc,OAAO;AAGlC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,gBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,UACzD;AAAA,QACJ;AAAA,MACJ;AAGA,aAAO,MAAM,IAAI,OAAO,WAAW;AACnC,aAAO,MAAM,IAAI,OAAO,WAAW;AACnC,aAAO,MAAM,QAAQ,OAAO,WAAW;AACvC,aAAO,MAAM,SAAS,OAAO,WAAW;AACxC,aAAO,MAAM,WAAW,OAAO,WAAW;AAE1C,UAAI,OAAO,OAAO,MAAM,SAAS,YAAY;AACzC,eAAO,MAAM,KAAK;AAAA,MACtB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAGA,QAAI,OAAO,SAAS,YAAY,OAAO,MAAM,SAAS,eAAe;AAEjE,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAChC,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAGhC,UAAI,cAAc,WAAW,YAAY;AACrC,mBAAW,WAAW,YAAY,UAAU;AAAA,MAChD;AACA,YAAM,SAAS,OAAO,QAAQ,QAAQ;AACtC,UAAI,WAAW,GAAI,QAAO,OAAO,QAAQ,CAAC;AAG1C,UAAI,OAAO,YAAY;AACnB,YAAI,YAAY,UAAU;AAAA,MAC9B;AACA,UAAI,UAAU;AACV,eAAO,KAAK,QAAQ;AAAA,MACxB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,UAAU;AAC9B,UAAI,OAAO,iBAAiB,OAAO,MAAM,cAAc,SAAS;AAI5D,mBAAW,SAAS,OAAO,mBAAmB,CAAC,GAAG;AAC9C,cAAI,OAAO,gBAAgB,OAAO,MAAO,QAAO,MAAM,qBAAqB,KAAK;AAAA,QACpF;AACA,YAAI,iBAAiB,OAAO,OAAO;AAC/B,iBAAO,MAAM,kBAAkB;AAC/B,yBAAe;AAAA,QACnB;AACA,cAAM,MAAM,OAAO,QAAQ,OAAO,KAAK;AACvC,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AACpC,eAAO,MAAM,OAAO,OAAO;AAC3B,eAAO,MAAM,WAAW,OAAO;AAC/B,eAAO,MAAM,UAAU,OAAO;AAAA,MAClC,WACI,OAAO,MAAM,SAAS,QAAQ;AAE9B,YAAI,OAAO,MAAM,WAAW,OAAO,MAAM,QAAQ,YAAY;AACzD,iBAAO,MAAM,QAAQ,WAAW,YAAY,OAAO,MAAM,OAAO;AAAA,QACpE,WAAW,OAAO,MAAM,YAAY;AAChC,iBAAO,MAAM,WAAW,YAAY,OAAO,KAAK;AAAA,QACpD;AAGA,cAAM,MAAM,OAAO,QAAQ,OAAO,MAAM,WAAW,OAAO,KAAK;AAC/D,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AAGpC,YAAI,OAAO,uBAAuB,YAAY;AAC1C,6BAAmB,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QAC3D;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,OAAO;AAAA,MACxB,WAAW,OAAO,MAAM,SAAS,QAAQ;AAErC,eAAO,MAAM,OAAO;AAAA,MACxB,OAAO;AAEH,cAAM,MAAM,OAAO,QAAQ,OAAO,KAAK;AACvC,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AACpC,YAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,YAAY;AACrD,iBAAO,MAAM,MAAM,WAAW,YAAY,OAAO,MAAM,KAAK;AAAA,QAChE;AAGA,YAAI,OAAO,MAAM,cAAc,SAAS;AACpC,iBAAO,MAAM,QAAQ;AAAA,QACzB;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEI,QAAI,OAAO,SAAS,UAAU;AAC1B,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,WAAW,OAAO,KAAK;AAEpD,iBAAO,KAAK,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QACpD;AAGA,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAAA,UACzD,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,QAAQ;AAAA,MACzB,OAAO;AAEH,YAAI,OAAO,QAAQ,OAAO,KAAK,MAAM,IAAI;AACrC,gBAAM,QAAQ,OAAO,UAAU,OAAO,UAAU,IAC1C,KAAK,IAAI,KAAK,IAAI,OAAO,YAAY,CAAC,GAAG,OAAO,MAAM,IACtD,OAAO;AACb,iBAAO,OAAO,OAAO,GAAG,OAAO,KAAK;AAAA,QACxC;AACA,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,KAAK;AAAA,QACtC;AASA,YAAI,OAAO,MAAM,cAAc,WAAW,KAAK;AAC3C,cAAI,OAAO,MAAM,aAAa,CAAC,OAAO,MAAM,UAAU,YAAY;AAC9D,gBAAI,YAAY,OAAO,MAAM,SAAS;AAAA,UAC1C;AACA,cAAI,OAAO,MAAM,YAAY,CAAC,OAAO,MAAM,SAAS,YAAY;AAC5D,kBAAM,OAAO,IAAI,cAAc,MAAM;AACrC,gBAAI,KAAM,MAAK,YAAY,OAAO,MAAM,QAAQ;AAAA,gBAC3C,KAAI,aAAa,OAAO,MAAM,UAAU,IAAI,UAAU;AAAA,UAC/D;AACA,cAAI,OAAO,iBAAiB,MAAM,QAAQ,OAAO,aAAa,GAAG;AAC7D,uBAAW,SAAS,OAAO,eAAe;AACtC,kBAAI,CAAC,MAAO;AACZ,kBAAI,OAAO,QAAQ,KAAK,MAAM,GAAI;AAClC,kBAAI,OAAO,OAAO,MAAM,oBAAoB,YAAY;AACpD,uBAAO,MAAM,gBAAgB,KAAK;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AACA,+BAAyB,MAAM;AAC/B,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,aAAa;AAE7B,UAAI,OAAO,iBAAiB;AAExB,YAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAM,aAAa,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AACvF,cAAI,aAAa,IAAI;AACjB,mBAAO,gBAAgB,SAAS,gBAAgB,OAAO,YAAY,CAAC;AACpE,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,kBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,YACtC;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,OAAO,gBAAgB,UAAU;AACjC,cAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,mBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,mBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,kBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,YAC5E;AAAA,UACJ;AAAA,QACJ,OAAO;AACH,iBAAO,MAAM,cAAc;AAAA,QAC/B;AAAA,MACJ;AAEA,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,eAAe,OAAO,OAAO,aAAa,QAAW;AACrD,sBAAY,aAAa,aAAa,OAAO,OAAO,WAAW,IAAI;AAAA,QACvE;AAGA,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,QAAQ,IAAI;AAC1F,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,SAAS,IAAI;AAE3F,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO;AAAA,UAAa;AAAA,UAChD,aAAa,OAAO,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,YAAY,OAAO,OAAO,QAAQ,KAAK,OAAO,KAAK,OAAO;AAAA,QAC9G;AAEA,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAC7E,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAG7E,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAGA,YAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,qBAAW,yBAAyB,CAAC;AAAA,QACzC;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,UAAU;AAE5C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,QAAQ;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AAGnF,eAAO,MAAM,WAAW,OAAO,OAAO,YAAY;AAClD,YAAI,OAAO,OAAO,cAAc;AAC5B,iBAAO,MAAM,eAAe,EAAE,GAAG,OAAO,OAAO,aAAa,GAAG,GAAG,OAAO,OAAO,aAAa,EAAE;AAAA,QACnG,OAAO;AACH,iBAAO,MAAM,eAAe;AAAA,QAChC;AAGA,YAAI,OAAO,iBAAiB;AAExB,cAAI,OAAO,gBAAgB,UAAU;AACjC,kBAAM,aAAa,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AACvF,gBAAI,aAAa,IAAI;AACjB,qBAAO,gBAAgB,SAAS,gBAAgB,OAAO,YAAY,CAAC;AACpE,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,oBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AAGA,cAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,qBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,qBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,oBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,cAC5E;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,mBAAO,MAAM,cAAc;AAAA,UAC/B;AAAA,QACJ;AAEA,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WACU,OAAO,MAAM,cAAc,SAAS;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AACnF,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAC7E,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAG7E,YAAI,OAAO,OAAO,aAAa;AAC3B,iBAAO,MAAM,uBAAuB,OAAO,OAAO,WAAW;AAAA,QACjE,OAAO;AAEH,iBAAO,MAAM,kBAAkB;AAC/B,iBAAO,MAAM,gBAAgB;AAAA,QACjC;AAEA,eAAO,MAAM,aAAa;AAC1B,eAAO,MAAM,KAAK;AAAA,MAItB,WACS,OAAO,MAAM,SAAS,QAAQ;AAEnC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,kBAAM,uBAAuB,UAAU,cAAc;AAGrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ,WACS,OAAO,MAAM,cAAc,kBAAkB;AAElD,eAAO,MAAM,SAAS,KAAK,MAAM,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC;AACrE,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WAAW,OAAO,MAAM,cAAc,aAAa;AAC/C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,SAAS,OAAO,OAAO;AACpC,eAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AACxB,kBAAM,uBAAuB,UAAU,cAAc;AACrD,sBAAU,YAAY;AAAA,cAClB,YAAY,EAAE,GAAG,MAAM,WAAW;AAAA,cAClC,UAAU,EAAE,GAAG,MAAM,SAAS;AAAA,YAClC;AACA,sBAAU,iBAAiB,MAAM,mBAAmB;AAAA,UACxD,CAAC;AAAA,QACL;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,iBAAiB;AACjC,UAAI,CAAC,OAAO,cAAc,OAAO,OAAO,SAAS;AAC7C,eAAO,aAAa,OAAO,MAAM,cAAc,UACzC;AAAA,UACE,GAAG,OAAO,MAAM;AAAA,UAChB,mBAAmB,OAAO,MAAM;AAAA,UAChC,gBAAgB,OAAO,MAAM;AAAA,UAC7B,aAAa,OAAO,MAAM;AAAA,UAC1B,kBAAkB,OAAO,MAAM;AAAA,QACnC,IACE,EAAE,GAAG,OAAO,MAAM,QAAQ;AAAA,MACpC;AACA,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,aAAa;AACb,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,QAAQ,OAAO,WAAW,KAAK;AACrF,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,eAAe,OAAO,WAAW,IAAI;AAC1F,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,aAAa,OAAO,WAAW,IAAI;AACxF,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,eAAe,OAAO,WAAW,KAAK;AAG5F,cAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,uBAAW,yBAAyB,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,SAAS;AAE3C,eAAO,MAAM,UAAU,EAAE,GAAG,OAAO,WAAW;AAC9C,eAAO,MAAM,oBAAoB,OAAO,WAAW;AACnD,eAAO,MAAM,iBAAiB,OAAO,WAAW;AAChD,eAAO,MAAM,cAAc,OAAO,WAAW;AAC7C,eAAO,MAAM,mBAAmB,OAAO,WAAW;AAClD,eAAO,MAAM,KAAK;AAAA,MACtB,OAAO;AAEH,6BAAqB,OAAO,OAAO,OAAO,UAAU;AAAA,MACxD;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAAA,EACA,UAAE;AACE,gCAA4B;AAC5B,wBAAoB;AAAA,EACxB;AACJ;AAEO,SAAS,OAAO;AACnB,MAAI,UAAU,WAAW,EAAG;AAC5B,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI;AACJ,QAAI,OAAO,SAAS,SAAS;AACzB,iBAAW,eAAe,OAAO,SAAS;AACtC,kBAAU,KAAK,WAAW;AAC1B,aAAK;AACL,kBAAU,IAAI;AAAA,MAClB;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,eAAe;AAC/B,aAAO,MAAM;AACb,gBAAU,KAAK,MAAM;AACrB,0BAAoB;AACpB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,kBAAkB;AAElC,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,aAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,aAAO,MAAM,SAAS,OAAO,OAAO;AACpC,aAAO,MAAM,WAAW,OAAO,OAAO;AACtC,aAAO,MAAM,YAAY,OAAO,OAAO;AAGvC,aAAO,gBAAgB,QAAQ,eAAa;AACxC,cAAM,QAAQ,UAAU;AACxB,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,IAAI,UAAU,SAAS;AAC7B,cAAM,QAAQ,UAAU,SAAS;AACjC,cAAM,SAAS,UAAU,SAAS;AAClC,cAAM,WAAW,UAAU,SAAS;AAEpC,YAAI,OAAO,MAAM,SAAS,YAAY;AAClC,gBAAM,KAAK;AAAA,QACf;AAAA,MACJ,CAAC;AAED,aAAO,MAAM,aAAa;AAC1B,UAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,aAAO,MAAM,KAAK;AAClB,aAAO,MAAM,eAAe;AAE5B,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAGA,QAAI,OAAO,SAAS,mBAAmB;AAEnC,UAAI,OAAO,WAAW,UAAU;AAE5B,YAAI,OAAO,UAAU;AAEjB,gBAAM,gBAAgB,OAAO,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AAC1E,cAAI,gBAAgB,IAAI;AACpB,mBAAO,SAAS,gBAAgB,OAAO,eAAe,CAAC;AACvD,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,SAAS,WAAW;AACnF,qBAAO,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxD,kBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,YACtC;AAAA,UACJ;AAAA,QACJ;AAGA,YAAI,CAAC,OAAO,MAAM,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACtD,iBAAO,MAAM,gBAAgB,KAAK,OAAO,KAAK;AAC9C,iBAAO,MAAM,cAAc,OAAO;AAElC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,gBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,UACzD;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,WAAW,UAAU;AAEnC,cAAM,aAAa,OAAO,MAAM,gBAAgB,QAAQ,OAAO,KAAK;AACpE,YAAI,aAAa,IAAI;AACjB,iBAAO,MAAM,gBAAgB,OAAO,YAAY,CAAC;AACjD,iBAAO,MAAM,cAAc;AAE3B,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,MAAM,WAAW;AAChF,mBAAO,MAAM,UAAU,YAAY,OAAO,MAAM,KAAK;AACrD,gBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,UACtC;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,OAAO,OAAO,MAAM,SAAS,YAAY;AACzC,eAAO,MAAM,KAAK;AAAA,MACtB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAGA,QAAI,OAAO,SAAS,YAAY,OAAO,MAAM,SAAS,eAAe;AAEjE,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAChC,YAAM,WAAW,OAAO,MAAM;AAC9B,YAAM,aAAa,OAAO,MAAM;AAGhC,UAAI,cAAc,WAAW,YAAY;AACrC,mBAAW,WAAW,YAAY,UAAU;AAAA,MAChD;AACA,YAAM,SAAS,OAAO,QAAQ,QAAQ;AACtC,UAAI,WAAW,GAAI,QAAO,OAAO,QAAQ,CAAC;AAG1C,UAAI,OAAO,YAAY;AACnB,YAAI,YAAY,UAAU;AAAA,MAC9B;AACA,UAAI,UAAU;AACV,eAAO,KAAK,QAAQ;AAAA,MACxB;AAEA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,UAAU;AAC9B,UAAI,OAAO,iBAAiB,OAAO,MAAM,cAAc,SAAS;AAC5D,cAAM,QAAQ,OAAO;AACrB,YAAI,OAAO,KAAK,cAAc,MAAM;AACpC,YAAI,CAAC,QAAQ,KAAK;AACd,iBAAO,SAAS,gBAAgB,8BAA8B,MAAM;AACpE,cAAI,YAAY,IAAI;AAAA,QACxB;AACA,YAAI,QAAQ,MAAM,YAAY,CAAC,MAAM,SAAS,WAAY,MAAK,YAAY,MAAM,QAAQ;AACzF,YAAI,OAAO,MAAM,SAAS,CAAC,MAAM,MAAM,WAAY,KAAI,YAAY,MAAM,KAAK;AAC9E,YAAI,OAAO,MAAM,aAAa,CAAC,MAAM,UAAU,WAAY,KAAI,YAAY,MAAM,SAAS;AAC1F,YAAI,OAAO,QAAQ,KAAK,MAAM,IAAI;AAC9B,gBAAM,QAAQ,OAAO,cAAc,IAAI,KAAK,IAAI,OAAO,YAAY,OAAO,MAAM,IAAI,OAAO;AAC3F,iBAAO,OAAO,OAAO,GAAG,KAAK;AAAA,QACjC;AACA,cAAM,kBAAkB,CAAC;AACzB,cAAM,KAAK;AACX,cAAM,eAAe;AACrB,mBAAW,SAAS,OAAO,mBAAmB,CAAC,GAAG;AAC9C,cAAI,SAAS,OAAO,SAAS,KAAK,EAAG,OAAM,gBAAgB,KAAK;AAAA,QACpE;AAAA,MACJ,WACI,OAAO,MAAM,SAAS,QAAQ;AAE9B,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,WAAW,OAAO,KAAK;AAEpD,iBAAO,KAAK,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QACpD;AAAA,MACJ,WACS,OAAO,MAAM,SAAS,SAAS;AAEpC,eAAO,MAAM,QAAQ;AAAA,MACzB,WAAW,OAAO,MAAM,SAAS,QAAQ;AAErC,YAAI,OAAO,OAAO,MAAM,OAAO;AAC3B,cAAI,YAAY,OAAO,MAAM,KAAK;AAAA,QACtC;AAEA,YAAI,OAAO,QAAQ,OAAO,KAAK,MAAM,IAAI;AACrC,iBAAO,KAAK,OAAO,KAAK;AAAA,QAC5B;AAAA,MACJ,OAAO;AAEH,eAAO,KAAK,OAAO,KAAK;AACxB,YAAI,KAAK;AACL,cAAI,YAAY,OAAO,MAAM,KAAK;AAAA,QACtC;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEI,QAAI,OAAO,SAAS,UAAU;AAC1B,8BAAwB,MAAM;AAC9B,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,aAAK,OAAO,MAAM,WAAW,OAAO,OAAO,YAAY;AACnD,WAAC,OAAO,MAAM,WAAW,OAAO,OAAO,WAAW,YAAY,OAAO,MAAM,WAAW,OAAO,KAAK;AAAA,QACtG;AAEA,cAAM,MAAM,OAAO,QAAQ,OAAO,MAAM,WAAW,OAAO,KAAK;AAC/D,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AAGpC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,MAAM,mBAAmB,MAAM,gBAAgB,WAAW,OAAO,MAAM,WAAW,OAAO,QAAQ;AACjG,oBAAM,gBAAgB,IAAI;AAAA,YAC9B;AACA,gBAAI,MAAM,iBAAiB,MAAM,cAAc,WAAW,OAAO,MAAM,WAAW,OAAO,QAAQ;AAC7F,oBAAM,gBAAgB,KAAK;AAAA,YAC/B;AACA,kBAAM,KAAK;AAAA,UACf,CAAC;AAAA,QACL;AAAA,MACJ,WACS,OAAO,MAAM,SAAS,SAAS;AAEpC,eAAO,MAAM,OAAO;AAAA,MACxB,OAAO;AAEH,cAAM,MAAM,OAAO,QAAQ,OAAO,KAAK;AACvC,YAAI,QAAQ,GAAI,QAAO,OAAO,KAAK,CAAC;AAMpC,YAAI,OAAO,MAAM,cAAc,WAAW,CAAC,OAAO,MAAM,gBAAgB,OAAO,eAAe;AAC1F,qBAAW,SAAS,OAAO,eAAe;AACtC,gBAAI,CAAC,MAAO;AACZ,kBAAM,KAAK,MAAM,SAAS,MAAM;AAChC,gBAAI,MAAM,KAAK;AACX,kBAAI,OAAO,MAAM,aAAa,GAAG,eAAe,OAAO,MAAM,WAAW;AACpE,uBAAO,MAAM,UAAU,YAAY,EAAE;AAAA,cACzC;AACA,kBAAI,GAAG,eAAe,IAAK,KAAI,YAAY,EAAE;AAAA,YACjD;AACA,kBAAM,cAAc;AACpB,mBAAO,MAAM;AAAA,UACjB;AACA,iBAAO,MAAM,kBAAkB,CAAC;AAChC,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,WAAY,QAAO,MAAM,MAAM,WAAW,YAAY,OAAO,MAAM,KAAK;AACrH,cAAI,OAAO,MAAM,aAAa,OAAO,MAAM,UAAU,WAAY,QAAO,MAAM,UAAU,WAAW,YAAY,OAAO,MAAM,SAAS;AACrI,cAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAS,WAAY,QAAO,MAAM,SAAS,WAAW,YAAY,OAAO,MAAM,QAAQ;AAAA,QACrI,OAAO;AACH,cAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,YAAY;AACrD,mBAAO,MAAM,MAAM,WAAW,YAAY,OAAO,MAAM,KAAK;AAAA,UAChE;AAEA,cAAI,OAAO,MAAM,cAAc,WAAW,OAAO,OAAO,MAAM,YAAY,YAAY;AAClF,mBAAO,MAAM,QAAQ;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,aAAa;AAE7B,UAAI,OAAO,iBAAiB;AAExB,YAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAM,gBAAgB,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AAC1F,cAAI,gBAAgB,IAAI;AACpB,mBAAO,gBAAgB,SAAS,gBAAgB,OAAO,eAAe,CAAC;AACvE,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,kBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,YACtC;AAAA,UACJ;AAAA,QACJ;AACA,YAAI,OAAO,gBAAgB,UAAU;AACjC,cAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,mBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,mBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,gBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,kBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,qBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,YAC5E;AAAA,UACJ;AAAA,QACJ,OAAO;AACH,iBAAO,MAAM,cAAc;AAAA,QAC/B;AAAA,MACJ;AAEA,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,eAAe,OAAO,OAAO,aAAa,QAAW;AACrD,sBAAY,aAAa,aAAa,OAAO,OAAO,WAAW,IAAI;AAAA,QACvE;AAGA,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,QAAQ,IAAI;AAC1F,cAAM,UAAU,cAAc,YAAY,QAAQ,EAAE,IAAI,YAAY,QAAQ,EAAE,SAAS,IAAI;AAE3F,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO;AAAA,UAAa;AAAA,UAChD,aAAa,OAAO,OAAO,CAAC,KAAK,OAAO,OAAO,CAAC,YAAY,OAAO,OAAO,QAAQ,KAAK,OAAO,KAAK,OAAO;AAAA,QAC9G;AAEA,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAC7E,SAAC,OAAO,MAAM,WAAW,OAAO,OAAO,aAAa,UAAU,OAAO,OAAO,CAAC;AAG7E,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAGA,YAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,qBAAW,yBAAyB,CAAC;AAAA,QACzC;AAAA,MACJ,WAAW,OAAO,MAAM,SAAS,SAAS;AAEtC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,UAAU;AAE5C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,KAAK,OAAO,OAAO;AAChC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,QAAQ;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AAGnF,eAAO,MAAM,WAAW,OAAO,OAAO,YAAY;AAClD,YAAI,OAAO,OAAO,cAAc;AAC5B,iBAAO,MAAM,eAAe,EAAE,GAAG,OAAO,OAAO,aAAa,GAAG,GAAG,OAAO,OAAO,aAAa,EAAE;AAAA,QACnG,OAAO;AACH,iBAAO,MAAM,eAAe;AAAA,QAChC;AAGA,YAAI,OAAO,iBAAiB;AAExB,cAAI,OAAO,gBAAgB,UAAU;AACjC,kBAAM,gBAAgB,OAAO,gBAAgB,SAAS,gBAAgB,QAAQ,OAAO,KAAK;AAC1F,gBAAI,gBAAgB,IAAI;AACpB,qBAAO,gBAAgB,SAAS,gBAAgB,OAAO,eAAe,CAAC;AACvE,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,OAAO,gBAAgB,SAAS,WAAW;AACnG,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AACxE,oBAAI,YAAY,OAAO,MAAM,KAAK;AAAA,cACtC;AAAA,YACJ;AAAA,UACJ;AAGA,cAAI,OAAO,gBAAgB,UAAU;AACjC,gBAAI,CAAC,OAAO,gBAAgB,SAAS,gBAAgB,SAAS,OAAO,KAAK,GAAG;AACzE,qBAAO,gBAAgB,SAAS,gBAAgB,KAAK,OAAO,KAAK;AACjE,qBAAO,MAAM,cAAc,OAAO,gBAAgB;AAClD,kBAAI,OAAO,MAAM,SAAS,OAAO,MAAM,MAAM,eAAe,KAAK;AAC7D,oBAAI,YAAY,OAAO,MAAM,KAAK;AAClC,uBAAO,gBAAgB,SAAS,UAAU,YAAY,OAAO,MAAM,KAAK;AAAA,cAC5E;AAAA,YACJ;AAAA,UACJ,OAAO;AACH,mBAAO,MAAM,cAAc;AAAA,UAC/B;AAAA,QACJ;AAEA,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WACU,OAAO,MAAM,cAAc,SAAS;AAE1C,eAAO,MAAM,aAAa,EAAE,GAAG,OAAO,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,WAAW,EAAE;AACzF,eAAO,MAAM,WAAW,EAAE,GAAG,OAAO,OAAO,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;AACnF,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAC7E,eAAO,MAAM,gBAAgB,OAAO,OAAO,gBACvC,EAAE,GAAG,OAAO,OAAO,cAAc,GAAG,GAAG,OAAO,OAAO,cAAc,EAAE,IAAI;AAG7E,YAAI,OAAO,OAAO,aAAa;AAC3B,iBAAO,MAAM,uBAAuB,OAAO,OAAO,WAAW;AAAA,QACjE,OAAO;AAEH,iBAAO,MAAM,kBAAkB;AAC/B,iBAAO,MAAM,gBAAgB;AAAA,QACjC;AAEA,eAAO,MAAM,aAAa;AAC1B,eAAO,MAAM,KAAK;AAAA,MAEtB,WACS,OAAO,MAAM,SAAS,QAAQ;AACnC,eAAO,MAAM,QAAQ,OAAO,MAAM;AAGlC,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ,WACS,OAAO,MAAM,cAAc,kBAAkB;AAElD,eAAO,MAAM,SAAS,KAAK,MAAM,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC;AACrE,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAAA,MACtB,WAAW,OAAO,MAAM,cAAc,aAAa;AAE/C,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,IAAI,OAAO,OAAO;AAC/B,eAAO,MAAM,SAAS,OAAO,OAAO;AACpC,eAAO,MAAM,QAAQ,OAAO,OAAO;AACnC,eAAO,MAAM,WAAW,OAAO,OAAO;AACtC,eAAO,MAAM,aAAa;AAC1B,YAAI,OAAO,OAAO,MAAM,oBAAoB,WAAY,QAAO,MAAM,gBAAgB;AACrF,eAAO,MAAM,KAAK;AAGlB,YAAI,OAAO,gBAAgB;AACvB,iBAAO,eAAe,QAAQ,eAAa;AACvC,kBAAM,QAAQ,UAAU;AAExB,gBAAI,UAAU,gBAAgB;AAC1B,oBAAM,uBAAuB,UAAU,cAAc;AAAA,YACzD,OAAO;AAEH,oBAAM,kBAAkB;AAAA,YAC5B;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAEA,QAAI,OAAO,SAAS,iBAAiB;AACjC,UAAI,OAAO,MAAM,SAAS,QAAQ;AAE9B,cAAM,eAAe,OAAO,MAAM,WAAW,OAAO,OAAO,cAAc,MAAM;AAC/E,YAAI,aAAa;AACb,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,QAAQ,OAAO,WAAW,KAAK;AACrF,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,eAAe,OAAO,WAAW,IAAI;AAC1F,cAAI,OAAO,WAAW,KAAM,aAAY,aAAa,aAAa,OAAO,WAAW,IAAI;AACxF,cAAI,OAAO,WAAW,MAAO,aAAY,aAAa,eAAe,OAAO,WAAW,KAAK;AAG5F,cAAI,qBAAqB,OAAO,MAAM,WAAW,OAAO,UAAU,yBAAyB;AACvF,uBAAW,yBAAyB,CAAC;AAAA,UACzC;AAAA,QACJ;AAAA,MACJ,WAAW,OAAO,MAAM,cAAc,SAAS;AAC3C,eAAO,MAAM,UAAU,EAAE,GAAG,OAAO,WAAW;AAC9C,eAAO,MAAM,oBAAoB,OAAO,WAAW;AACnD,eAAO,MAAM,iBAAiB,OAAO,WAAW;AAChD,eAAO,MAAM,cAAc,OAAO,WAAW;AAC7C,eAAO,MAAM,mBAAmB,OAAO,WAAW;AAClD,eAAO,MAAM,KAAK;AAAA,MACtB,OAAO;AACH,6BAAqB,OAAO,OAAO,OAAO,UAAU;AAAA,MACxD;AACA,gBAAU,KAAK,MAAM;AACrB;AAAA,IACJ;AAAA,EACA,UAAE;AACE,gCAA4B;AAC5B,wBAAoB;AAAA,EACxB;AACJ;AAGA,SAAS,iBAAiB,WAAW,CAAC,MAAM;AACxC,OAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAC3C,MAAE,eAAe;AACjB,SAAK;AAAA,EACT;AACA,OAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,OAAQ,EAAE,YAAY,EAAE,QAAQ,MAAO;AAC9E,MAAE,eAAe;AACjB,SAAK;AAAA,EACT;AACJ,CAAC;AAGD,SAAS,eAAe,MAAM,GAAG,iBAAiB,SAAS,IAAI;AAC/D,SAAS,eAAe,MAAM,GAAG,iBAAiB,SAAS,IAAI;AAG/D,OAAO,mBAAmB;AAC1B,OAAO,mBAAmB;AAC1B,OAAO,wBAAwB;AAC/B,OAAO,4BAA4B;AACnC,OAAO,mBAAmB;AAC1B,OAAO,kCAAkC;AACzC,OAAO,sBAAsB;AAC7B,OAAO,0BAA0B;AACjC,OAAO,kCAAkC;AACzC,OAAO,OAAO;AACd,OAAO,OAAO;",
6
+ "names": []
7
+ }
@@ -5,7 +5,7 @@ import {
5
5
  pushFrameAttachmentAction,
6
6
  pushOptionsChangeAction,
7
7
  pushTransformAction
8
- } from "./chunk-M7GAB24F.js";
8
+ } from "./chunk-VZX55VQL.js";
9
9
 
10
10
  // src/core/SnapGuides.js
11
11
  var SNAP_THRESHOLD = 6;
@@ -744,4 +744,4 @@ export {
744
744
  updateAttachedArrows,
745
745
  cleanupAttachments
746
746
  };
747
- //# sourceMappingURL=chunk-DWEFPKDO.js.map
747
+ //# sourceMappingURL=chunk-X5ENBMGL.js.map
@@ -3,12 +3,12 @@ import {
3
3
  handleMouseDown,
4
4
  handleMouseMove,
5
5
  handleMouseUp
6
- } from "./chunk-OK4ROGMM.js";
7
- import "./chunk-DWEFPKDO.js";
8
- import "./chunk-M7GAB24F.js";
6
+ } from "./chunk-KZBKYHZO.js";
7
+ import "./chunk-X5ENBMGL.js";
8
+ import "./chunk-VZX55VQL.js";
9
9
  export {
10
10
  handleMouseDown as handleMouseDownCircle,
11
11
  handleMouseMove as handleMouseMoveCircle,
12
12
  handleMouseUp as handleMouseUpCircle
13
13
  };
14
- //# sourceMappingURL=circleTool-2UODOBCV.js.map
14
+ //# sourceMappingURL=circleTool-NK4RVDAR.js.map
@@ -15,10 +15,10 @@ import {
15
15
  setCodeLanguage,
16
16
  updateCodeBackground,
17
17
  wrapCodeElement
18
- } from "./chunk-ULPIHUVC.js";
18
+ } from "./chunk-DODPOWNX.js";
19
19
  import "./chunk-PAKA6HUX.js";
20
- import "./chunk-DWEFPKDO.js";
21
- import "./chunk-M7GAB24F.js";
20
+ import "./chunk-X5ENBMGL.js";
21
+ import "./chunk-VZX55VQL.js";
22
22
  export {
23
23
  addCodeBlock,
24
24
  applySyntaxHighlightingToSVG,
@@ -36,4 +36,4 @@ export {
36
36
  updateCodeBackground,
37
37
  wrapCodeElement
38
38
  };
39
- //# sourceMappingURL=codeTool-F4RV7SAI.js.map
39
+ //# sourceMappingURL=codeTool-3WF4HEOW.js.map
@@ -3,12 +3,12 @@ import {
3
3
  handleMouseDown,
4
4
  handleMouseMove,
5
5
  handleMouseUp
6
- } from "./chunk-2DZHO67H.js";
7
- import "./chunk-DWEFPKDO.js";
8
- import "./chunk-M7GAB24F.js";
6
+ } from "./chunk-GQLXUZHQ.js";
7
+ import "./chunk-X5ENBMGL.js";
8
+ import "./chunk-VZX55VQL.js";
9
9
  export {
10
10
  handleMouseDown as handleMouseDownFrame,
11
11
  handleMouseMove as handleMouseMoveFrame,
12
12
  handleMouseUp as handleMouseUpFrame
13
13
  };
14
- //# sourceMappingURL=frameTool-NTGA5BI6.js.map
14
+ //# sourceMappingURL=frameTool-VCNV2NG2.js.map
@@ -3,12 +3,12 @@ import {
3
3
  handleMouseDown,
4
4
  handleMouseMove,
5
5
  handleMouseUp
6
- } from "./chunk-5NHJJJBZ.js";
7
- import "./chunk-DWEFPKDO.js";
8
- import "./chunk-M7GAB24F.js";
6
+ } from "./chunk-6LWUR7XB.js";
7
+ import "./chunk-X5ENBMGL.js";
8
+ import "./chunk-VZX55VQL.js";
9
9
  export {
10
10
  handleMouseDown as handleFreehandMouseDown,
11
11
  handleMouseMove as handleFreehandMouseMove,
12
12
  handleMouseUp as handleFreehandMouseUp
13
13
  };
14
- //# sourceMappingURL=freehandTool-L55EUB5C.js.map
14
+ //# sourceMappingURL=freehandTool-TBAOD46K.js.map
@@ -5,10 +5,10 @@ import {
5
5
  handleMouseUpIcon,
6
6
  startDrag,
7
7
  stopDrag
8
- } from "./chunk-SSFEN5CY.js";
8
+ } from "./chunk-O7KXLFZN.js";
9
9
  import "./chunk-PAKA6HUX.js";
10
- import "./chunk-DWEFPKDO.js";
11
- import "./chunk-M7GAB24F.js";
10
+ import "./chunk-X5ENBMGL.js";
11
+ import "./chunk-VZX55VQL.js";
12
12
  export {
13
13
  handleMouseDownIcon,
14
14
  handleMouseMoveIcon,
@@ -16,4 +16,4 @@ export {
16
16
  startDrag,
17
17
  stopDrag
18
18
  };
19
- //# sourceMappingURL=iconTool-KQQBLGR3.js.map
19
+ //# sourceMappingURL=iconTool-65JCAKYF.js.map
@@ -3,14 +3,14 @@ import {
3
3
  handleMouseDownImage,
4
4
  handleMouseMoveImage,
5
5
  handleMouseUpImage
6
- } from "./chunk-JEGLUNBC.js";
6
+ } from "./chunk-37PF7FG2.js";
7
7
  import "./chunk-DNAG7ML6.js";
8
8
  import "./chunk-PAKA6HUX.js";
9
- import "./chunk-DWEFPKDO.js";
10
- import "./chunk-M7GAB24F.js";
9
+ import "./chunk-X5ENBMGL.js";
10
+ import "./chunk-VZX55VQL.js";
11
11
  export {
12
12
  handleMouseDownImage,
13
13
  handleMouseMoveImage,
14
14
  handleMouseUpImage
15
15
  };
16
- //# sourceMappingURL=imageTool-LDJ45AD7.js.map
16
+ //# sourceMappingURL=imageTool-UQZUBOK2.js.map
@@ -625,7 +625,7 @@ function useSketchEngine(svgRef, ready = true) {
625
625
  setZoom: (zoom) => useSketchStore_default.setState({ zoom }),
626
626
  getState: () => useSketchStore_default.getState()
627
627
  };
628
- const { SketchEngine } = await import("./SketchEngine-OPJON7TD.js");
628
+ const { SketchEngine } = await import("./SketchEngine-UFLZJQXS.js");
629
629
  if (cancelled) return;
630
630
  const engine = new SketchEngine(svgRef.current);
631
631
  await engine.init();
@@ -5106,7 +5106,7 @@ var _saveScene = null;
5106
5106
  var _loadScene = null;
5107
5107
  async function ensureSceneSerializer() {
5108
5108
  if (_saveScene && _loadScene) return;
5109
- const m = await import("./SceneSerializer-JEYTYXZQ.js");
5109
+ const m = await import("./SceneSerializer-H6KMQCO2.js");
5110
5110
  _saveScene = m.saveScene;
5111
5111
  _loadScene = m.loadScene;
5112
5112
  }
@@ -3,12 +3,12 @@ import {
3
3
  handleMouseDown,
4
4
  handleMouseMove,
5
5
  handleMouseUp
6
- } from "./chunk-UEL2G6D2.js";
7
- import "./chunk-DWEFPKDO.js";
8
- import "./chunk-M7GAB24F.js";
6
+ } from "./chunk-CGMUXYPJ.js";
7
+ import "./chunk-X5ENBMGL.js";
8
+ import "./chunk-VZX55VQL.js";
9
9
  export {
10
10
  handleMouseDown as handleMouseDownLine,
11
11
  handleMouseMove as handleMouseMoveLine,
12
12
  handleMouseUp as handleMouseUpLine
13
13
  };
14
- //# sourceMappingURL=lineTool-CSAFD7PW.js.map
14
+ //# sourceMappingURL=lineTool-762KBYOM.js.map
@@ -3,12 +3,12 @@ import {
3
3
  handleMouseDownRect,
4
4
  handleMouseMoveRect,
5
5
  handleMouseUpRect
6
- } from "./chunk-G3DJQY65.js";
7
- import "./chunk-DWEFPKDO.js";
8
- import "./chunk-M7GAB24F.js";
6
+ } from "./chunk-I7TVGJFF.js";
7
+ import "./chunk-X5ENBMGL.js";
8
+ import "./chunk-VZX55VQL.js";
9
9
  export {
10
10
  handleMouseDownRect,
11
11
  handleMouseMoveRect,
12
12
  handleMouseUpRect
13
13
  };
14
- //# sourceMappingURL=rectangleTool-YPD2SIIZ.js.map
14
+ //# sourceMappingURL=rectangleTool-IQK3HZK6.js.map
@@ -6,11 +6,11 @@ import {
6
6
  handleTextMouseMove,
7
7
  handleTextMouseUp,
8
8
  updateCodeToggleForShape
9
- } from "./chunk-F56XUE5S.js";
10
- import "./chunk-ULPIHUVC.js";
9
+ } from "./chunk-RK3NVAER.js";
10
+ import "./chunk-DODPOWNX.js";
11
11
  import "./chunk-PAKA6HUX.js";
12
- import "./chunk-DWEFPKDO.js";
13
- import "./chunk-M7GAB24F.js";
12
+ import "./chunk-X5ENBMGL.js";
13
+ import "./chunk-VZX55VQL.js";
14
14
  export {
15
15
  deselectElement as deselectTextElement,
16
16
  enterEditMode,
@@ -19,4 +19,4 @@ export {
19
19
  handleTextMouseUp,
20
20
  updateCodeToggleForShape
21
21
  };
22
- //# sourceMappingURL=textTool-VQHMWEFJ.js.map
22
+ //# sourceMappingURL=textTool-ITG2SBJK.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elixpo/lixsketch",
3
- "version": "5.6.6",
3
+ "version": "5.6.7",
4
4
  "description": "Open-source SVG whiteboard engine + React canvas component with hand-drawn aesthetics — the core of LixSketch",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -2,7 +2,7 @@
2
2
  // Multi-selection system - copied from selection.js
3
3
 
4
4
  import { cleanupAttachments } from '../tools/arrowTool.js';
5
- import { pushCreateAction, pushTransformAction, pushFrameAttachmentAction, pushDeleteAction } from './UndoRedo.js';
5
+ import { beginUndoBatch, endUndoBatch, pushCreateAction, pushTransformAction, pushFrameAttachmentAction, pushDeleteAction } from './UndoRedo.js';
6
6
  import { calculateSnap, clearSnapGuides } from './SnapGuides.js';
7
7
  import { registerRotationAnchor } from './ScreenSpaceControls.js';
8
8
 
@@ -278,19 +278,21 @@ class MultiSelection {
278
278
  endPoint: { ...shape.endPoint },
279
279
  x: shape.x, y: shape.y,
280
280
  width: shape.width || 0, height: shape.height || 0,
281
- rotation: shape.rotation || 0
281
+ rotation: shape.rotation || 0,
282
+ parentFrame: shape.parentFrame || null
282
283
  };
283
284
  case 'circle':
284
- return { x: shape.x, y: shape.y, rx: shape.rx, ry: shape.ry, rotation: shape.rotation || 0, width: shape.width, height: shape.height };
285
+ return { x: shape.x, y: shape.y, rx: shape.rx, ry: shape.ry, rotation: shape.rotation || 0, width: shape.width, height: shape.height, parentFrame: shape.parentFrame || null };
285
286
  case 'freehandStroke':
286
- return { x: shape.x, y: shape.y, width: shape.width, height: shape.height, rotation: shape.rotation || 0, points: JSON.parse(JSON.stringify(shape.points)) };
287
+ return { x: shape.x, y: shape.y, width: shape.width, height: shape.height, rotation: shape.rotation || 0, points: JSON.parse(JSON.stringify(shape.points)), parentFrame: shape.parentFrame || null };
287
288
  default:
288
- return { x: shape.x || 0, y: shape.y || 0, width: shape.width || 0, height: shape.height || 0, rotation: shape.rotation || 0 };
289
+ return { x: shape.x || 0, y: shape.y || 0, width: shape.width || 0, height: shape.height || 0, rotation: shape.rotation || 0, parentFrame: shape.parentFrame || null };
289
290
  }
290
291
  }
291
292
 
292
293
  // Push undo actions for all shapes that changed
293
- _pushUndoForAll() {
294
+ _pushUndoForAll(existingBatch = null) {
295
+ const batch = existingBatch || beginUndoBatch();
294
296
  this.selectedShapes.forEach(shape => {
295
297
  const oldState = this._undoSnapshots.get(shape);
296
298
  if (!oldState) return;
@@ -305,6 +307,7 @@ class MultiSelection {
305
307
  }
306
308
  });
307
309
  this._undoSnapshots.clear();
310
+ if (!existingBatch) endUndoBatch(batch, 'multi-transform');
308
311
  }
309
312
 
310
313
  addShape(shape) {
@@ -1392,6 +1395,8 @@ createRotatedControls(angleDiff = 0) {
1392
1395
  shape.isSelected = true;
1393
1396
  });
1394
1397
 
1398
+ const undoBatch = beginUndoBatch();
1399
+
1395
1400
  // Re-parent any selected shape that now sits inside a different frame
1396
1401
  // (Issue #22, bug #9). The per-tool drag handlers (rectangleTool, etc.)
1397
1402
  // do this for single-shape drags, but a multi-selection drag bypassed
@@ -1418,11 +1423,6 @@ createRotatedControls(angleDiff = 0) {
1418
1423
  }
1419
1424
  if (target && typeof target.addShapeToFrame === 'function') {
1420
1425
  target.addShapeToFrame(shape);
1421
- if (typeof pushFrameAttachmentAction === 'function') {
1422
- pushFrameAttachmentAction(target, shape, 'attach', current);
1423
- }
1424
- } else if (current && typeof pushFrameAttachmentAction === 'function') {
1425
- pushFrameAttachmentAction(current, shape, 'detach', current);
1426
1426
  }
1427
1427
  });
1428
1428
  }
@@ -1430,7 +1430,8 @@ createRotatedControls(angleDiff = 0) {
1430
1430
  this.initialPositions.clear();
1431
1431
 
1432
1432
  // Push undo for all moved shapes
1433
- this._pushUndoForAll();
1433
+ this._pushUndoForAll(undoBatch);
1434
+ endUndoBatch(undoBatch, 'multi-move');
1434
1435
 
1435
1436
  // Refresh bounds and controls after finalizeMove may have changed positions
1436
1437
  this.updateControls();
@@ -1876,6 +1877,7 @@ function deleteSelectedShapes() {
1876
1877
 
1877
1878
  const shapesToDelete = Array.from(multiSelection.selectedShapes);
1878
1879
  multiSelection.clearSelection();
1880
+ const undoBatch = beginUndoBatch();
1879
1881
 
1880
1882
  // Issue #24 bug #3: when deleting a (regular, non-diagram) frame, its
1881
1883
  // children are released back to the canvas — capture them here so we
@@ -1886,6 +1888,8 @@ function deleteSelectedShapes() {
1886
1888
  shapesToDelete.forEach(shape => {
1887
1889
  const isFrame = shape.shapeName === 'frame';
1888
1890
  const isDiagramFrame = isFrame && !!shape._diagramType;
1891
+ const parentFrame = shape.parentFrame || null;
1892
+ const frameIndex = parentFrame?.containedShapes?.indexOf(shape) ?? -1;
1889
1893
 
1890
1894
  // Issue #24 bug #7: for a regular (non-diagram) frame, we don't
1891
1895
  // want destroy() — it empties containedShapes and tears down the
@@ -1948,14 +1952,15 @@ function deleteSelectedShapes() {
1948
1952
  // snapshot so undo can re-attach them.
1949
1953
  try {
1950
1954
  if (childSnapshot) {
1951
- pushDeleteAction(shape, { childSnapshot, shapeIndex: idx });
1955
+ pushDeleteAction(shape, { childSnapshot, shapeIndex: idx, parentFrame, frameIndex });
1952
1956
  } else {
1953
- pushDeleteAction(shape, { shapeIndex: idx });
1957
+ pushDeleteAction(shape, { shapeIndex: idx, parentFrame, frameIndex });
1954
1958
  }
1955
1959
  } catch (err) {
1956
1960
  console.warn('[deleteSelectedShapes] pushDeleteAction failed:', err);
1957
1961
  }
1958
1962
  });
1963
+ endUndoBatch(undoBatch, 'multi-delete');
1959
1964
 
1960
1965
  // Bug #3 follow-through: auto-select the released children and switch
1961
1966
  // to the pointer tool so the user can immediately keep manipulating