pixel-data-js 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/dist/index.dev.cjs +2723 -1487
- package/dist/index.dev.cjs.map +1 -1
- package/dist/index.dev.js +2690 -1481
- package/dist/index.dev.js.map +1 -1
- package/dist/index.prod.cjs +2723 -1487
- package/dist/index.prod.cjs.map +1 -1
- package/dist/index.prod.d.ts +400 -246
- package/dist/index.prod.js +2690 -1481
- package/dist/index.prod.js.map +1 -1
- package/package.json +21 -6
- package/src/Algorithm/forEachLinePoint.ts +36 -0
- package/src/BlendModes/BlendModeRegistry.ts +2 -0
- package/src/BlendModes/blend-modes-fast.ts +2 -2
- package/src/BlendModes/blend-modes-perfect.ts +5 -4
- package/src/BlendModes/toBlendModeIndexAndName.ts +41 -0
- package/src/History/PixelAccumulator.ts +2 -2
- package/src/History/PixelMutator/mutatorApplyAlphaMask.ts +30 -0
- package/src/History/PixelMutator/mutatorApplyBinaryMask.ts +30 -0
- package/src/History/PixelMutator/mutatorApplyCircleBrush.ts +23 -9
- package/src/History/PixelMutator/mutatorApplyCircleBrushStroke.ts +138 -0
- package/src/History/PixelMutator/mutatorApplyCirclePencil.ts +59 -0
- package/src/History/PixelMutator/mutatorApplyCirclePencilStroke.ts +131 -0
- package/src/History/PixelMutator/mutatorApplyRectBrush.ts +20 -7
- package/src/History/PixelMutator/mutatorApplyRectBrushStroke.ts +169 -0
- package/src/History/PixelMutator/mutatorApplyRectPencil.ts +62 -0
- package/src/History/PixelMutator/mutatorApplyRectPencilStroke.ts +149 -0
- package/src/History/PixelMutator/mutatorBlendColor.ts +9 -4
- package/src/History/PixelMutator/mutatorBlendPixelData.ts +10 -5
- package/src/History/PixelMutator/mutatorClear.ts +27 -0
- package/src/History/PixelMutator/{mutatorFillPixelData.ts → mutatorFill.ts} +9 -3
- package/src/History/PixelMutator/mutatorInvert.ts +10 -3
- package/src/History/PixelMutator.ts +23 -3
- package/src/History/PixelPatchTiles.ts +2 -2
- package/src/History/PixelWriter.ts +3 -3
- package/src/ImageData/ImageDataLike.ts +13 -0
- package/src/ImageData/extractImageDataBuffer.ts +22 -15
- package/src/ImageData/serialization.ts +4 -4
- package/src/ImageData/uInt32ArrayToImageData.ts +29 -0
- package/src/ImageData/writeImageData.ts +26 -18
- package/src/ImageData/writeImageDataBuffer.ts +30 -18
- package/src/IndexedImage/indexedImageToAverageColor.ts +1 -1
- package/src/Internal/resolveClipping.ts +140 -0
- package/src/Mask/applyBinaryMaskToAlphaMask.ts +89 -0
- package/src/Mask/copyMask.ts +1 -3
- package/src/Mask/mergeAlphaMasks.ts +81 -0
- package/src/Mask/mergeBinaryMasks.ts +89 -0
- package/src/PixelData/PixelBuffer32.ts +28 -0
- package/src/PixelData/PixelData.ts +38 -33
- package/src/PixelData/applyAlphaMaskToPixelData.ts +119 -0
- package/src/PixelData/applyBinaryMaskToPixelData.ts +111 -0
- package/src/PixelData/applyCircleBrushToPixelData.ts +31 -56
- package/src/PixelData/applyRectBrushToPixelData.ts +39 -71
- package/src/PixelData/blendColorPixelData.ts +18 -111
- package/src/PixelData/blendColorPixelDataAlphaMask.ts +111 -0
- package/src/PixelData/blendColorPixelDataBinaryMask.ts +89 -0
- package/src/PixelData/blendPixelData.ts +19 -107
- package/src/PixelData/blendPixelDataAlphaMask.ts +149 -0
- package/src/PixelData/blendPixelDataBinaryMask.ts +133 -0
- package/src/PixelData/clearPixelData.ts +2 -3
- package/src/PixelData/extractPixelData.ts +4 -4
- package/src/PixelData/extractPixelDataBuffer.ts +38 -26
- package/src/PixelData/fillPixelData.ts +18 -20
- package/src/PixelData/invertPixelData.ts +13 -21
- package/src/PixelData/pixelDataToAlphaMask.ts +2 -3
- package/src/PixelData/reflectPixelData.ts +3 -3
- package/src/PixelData/resamplePixelData.ts +2 -6
- package/src/PixelData/writePixelDataBuffer.ts +34 -20
- package/src/Rect/getCircleBrushOrPencilBounds.ts +43 -0
- package/src/Rect/getCircleBrushOrPencilStrokeBounds.ts +24 -0
- package/src/Rect/getRectBrushOrPencilBounds.ts +38 -0
- package/src/Rect/getRectBrushOrPencilStrokeBounds.ts +26 -0
- package/src/_types.ts +49 -33
- package/src/index.ts +47 -11
- package/src/History/PixelMutator/mutatorApplyMask.ts +0 -20
- package/src/Mask/mergeMasks.ts +0 -100
- package/src/PixelData/applyMaskToPixelData.ts +0 -129
package/dist/index.prod.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/_types.ts","../src/color.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMask.ts","../src/Rect/trimRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/BlendModes/blend-modes-perfect.ts","../src/Canvas/_constants.ts","../src/Canvas/PixelCanvas.ts","../src/Canvas/ReusableCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/PixelPatchTiles.ts","../src/History/PixelAccumulator.ts","../src/History/HistoryManager.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyCircleBrushToPixelData.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyCircleBrush.ts","../src/PixelData/applyMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyMask.ts","../src/ImageData/imageDataToUInt32Array.ts","../src/PixelData/PixelData.ts","../src/PixelData/applyRectBrushToPixelData.ts","../src/History/PixelMutator/mutatorApplyRectBrush.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorFillPixelData.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/copyImageData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/ImageData/imageDataToAlphaMask.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/invertImageData.ts","../src/Internal/resample32.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/copyMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeMasks.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/writePixelDataBuffer.ts"],"sourcesContent":["export * from './_types'\nexport * from './color'\n\nexport * from './Algorithm/floodFillSelection'\n\nexport * from './BlendModes/BlendModeRegistry'\nexport * from './BlendModes/blend-modes'\nexport * from './BlendModes/blend-modes-fast'\nexport * from './BlendModes/blend-modes-perfect'\n\nexport * from './Canvas/PixelCanvas'\nexport * from './Canvas/ReusableCanvas'\n\nexport * from './Clipboard/getImageDataFromClipboard'\nexport * from './Clipboard/writeImageDataToClipboard'\nexport * from './Clipboard/writeImgBlobToClipboard'\n\nexport * from './History/PixelAccumulator'\nexport * from './History/HistoryManager'\nexport * from './History/PixelEngineConfig'\nexport * from './History/PixelMutator'\nexport * from './History/PixelPatchTiles'\nexport * from './History/PixelWriter'\n\nexport * from './History/PixelMutator/mutatorApplyMask'\nexport * from './History/PixelMutator/mutatorBlendColor'\nexport * from './History/PixelMutator/mutatorBlendPixel'\nexport * from './History/PixelMutator/mutatorBlendPixelData'\nexport * from './History/PixelMutator/mutatorFillPixelData'\nexport * from './History/PixelMutator/mutatorInvert'\n\nexport * from './ImageData/ReusableImageData'\nexport * from './ImageData/copyImageData'\nexport * from './ImageData/extractImageDataBuffer'\nexport * from './ImageData/imageDataToAlphaMask'\nexport * from './ImageData/imageDataToDataUrl'\nexport * from './ImageData/imageDataToImgBlob'\nexport * from './ImageData/imageDataToUInt32Array'\nexport * from './ImageData/imgBlobToImageData'\nexport * from './ImageData/invertImageData'\nexport * from './ImageData/resampleImageData'\nexport * from './ImageData/resizeImageData'\nexport * from './ImageData/serialization'\nexport * from './ImageData/writeImageData'\nexport * from './ImageData/writeImageDataBuffer'\n\nexport * from './IndexedImage/IndexedImage'\nexport * from './IndexedImage/getIndexedImageColorCounts'\nexport * from './IndexedImage/indexedImageToAverageColor'\nexport * from './IndexedImage/resampleIndexedImage'\nexport * from './IndexedImage/indexedImageToImageData'\n\nexport * from './Input/fileInputChangeToImageData'\nexport * from './Input/fileToImageData'\nexport * from './Input/getSupportedRasterFormats'\n\nexport * from './Mask/copyMask'\nexport * from './Mask/extractMask'\nexport * from './Mask/invertMask'\nexport * from './Mask/mergeMasks'\n\nexport * from './PixelData/PixelData'\nexport * from './PixelData/applyCircleBrushToPixelData'\nexport * from './PixelData/applyMaskToPixelData'\nexport * from './PixelData/applyRectBrushToPixelData'\nexport * from './PixelData/blendColorPixelData'\nexport * from './PixelData/blendPixelData'\nexport * from './PixelData/clearPixelData'\nexport * from './PixelData/extractPixelData'\nexport * from './PixelData/extractPixelDataBuffer'\nexport * from './PixelData/fillPixelData'\nexport * from './PixelData/invertPixelData'\nexport * from './PixelData/pixelDataToAlphaMask'\nexport * from './PixelData/reflectPixelData'\nexport * from './PixelData/resamplePixelData'\nexport * from './PixelData/rotatePixelData'\nexport * from './PixelData/writePixelDataBuffer'\n\nexport * from './Rect/trimRectBounds'\n","import type { BlendColor32 } from '../_types'\n\nexport const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22,\n} as const\n\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\n\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>\n\nexport const overwriteBase: BlendColor32 = (src, _dst) => src\noverwriteBase.isOverwrite = true\n","import type { BlendColor32 } from '../_types'\nimport type { BaseBlendModes } from './blend-modes'\n\nexport type BlendModeRegistry<\n BlendModes extends BaseBlendModes = BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>\n\nexport function makeBlendModeRegistry<\n BlendModes extends BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n\n>(\n blendModes: BlendModes,\n initialEntries: Record<Index, BlendColor32>,\n) {\n\n const blendToName = new Map<BlendColor32, Name>()\n const blendToIndex = new Map<BlendColor32, Index>()\n const indexToName: Name[] = []\n const indexToBlend: BlendColor32[] = []\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 }\n const nameToIndex = {} as Record<Name, Index>\n\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n indexToName[index] = name\n indexToBlend[index] = blendFn\n blendToIndex.set(blendFn, index)\n blendToName.set(blendFn, name)\n nameToBlend[name] = blendFn\n nameToIndex[name] = index\n }\n\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index]\n add(name as Name, index as Index, blend)\n }\n\n return {\n nameToBlend,\n nameToIndex,\n\n blendToIndex,\n blendToName,\n\n indexToBlend,\n indexToName,\n\n indexType: null as unknown as Index,\n nameType: null as unknown as Name,\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwriteFast = overwriteBase\n\nexport const sourceOverFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return src\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const da = (dst >>> 24) & 0xFF\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (sr * sa + dr * invA) >> 8\n const g = (sg * sa + dg * invA) >> 8\n const b = (sb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (src * dst) / 255 */\nexport const multiplyFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n // Consistent floor rounding for all channels\n const br = (sr * dr) >> 8\n const bg = (sg * dg) >> 8\n const bb = (sb * db) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / sr) | 0)\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / sg) | 0)\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const bgU = dg + sg - 255\n const bbU = db + sb - 255\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkerFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(src, dst) */\nexport const lightenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const br = Math.max(src & 0xFF, dst & 0xFF)\n const bg = Math.max((src >> 8) & 0xFF, (dst >> 8) & 0xFF)\n const bb = Math.max((src >> 16) & 0xFF, (dst >> 16) & 0xFF)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const dr = dst & 0xFF\n const dg = (dst >> 8) & 0xFF\n const db = (dst >> 16) & 0xFF\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = 255 - (((255 - (src & 0xFF)) * (255 - dr)) >> 8)\n const bg = 255 - (((255 - ((src >>> 8) & 0xFF)) * (255 - dg)) >> 8)\n const bb = 255 - (((255 - ((src >>> 16) & 0xFF)) * (255 - db)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgeFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 255 ? 255 : Math.min(255, ((dr << 8) / (255 - sr)) | 0)\n const bg = sg === 255 ? 255 : Math.min(255, ((dg << 8) / (255 - sg)) | 0)\n const bb = sb === 255 ? 255 : Math.min(255, ((db << 8) / (255 - sb)) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst */\nexport const linearDodgeFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bbU = ((src >>> 16) & 0xFF) + db\n\n const br = brU > 255 ? 255 : brU\n const bg = bgU > 255 ? 255 : bgU\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const lighterFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = dr < 128 ? (2 * sr * dr) >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8)\n const bg = dg < 128 ? (2 * sg * dg) >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8)\n const bb = db < 128 ? (2 * sb * db) >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = ((255 - dr) * ((sr * dr) >> 8) + dr * (255 - (((255 - sr) * (255 - dr)) >> 8))) >> 8\n const bg = ((255 - dg) * ((sg * dg) >> 8) + dg * (255 - (((255 - sg) * (255 - dg)) >> 8))) >> 8\n const bb = ((255 - db) * ((sb * db) >> 8) + db * (255 - (((255 - sb) * (255 - db)) >> 8))) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (2 * sr * dr) >> 8 : 255 - ((2 * (255 - sr) * (255 - dr)) >> 8)\n const bg = sg < 128 ? (2 * sg * dg) >> 8 : 255 - ((2 * (255 - sg) * (255 - dg)) >> 8)\n const bb = sb < 128 ? (2 * sb * db) >> 8 : 255 - ((2 * (255 - sb) * (255 - db)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr + 2 * sr - 255\n const bgU = dg + 2 * sg - 255\n const bbU = db + 2 * sb - 255\n\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < 2 * sr ? dr : 2 * sr) : (dr > 2 * sr - 256 ? dr : 2 * sr - 256)\n const bg = sg < 128 ? (dg < 2 * sg ? dg : 2 * sg) : (dg > 2 * sg - 256 ? dg : 2 * sg - 256)\n const bb = sb < 128 ? (db < 2 * sb ? db : 2 * sb) : (db > 2 * sb - 256 ? db : 2 * sb - 256)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))) < 128 ? 0 : 255\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.abs(src - dst) */\nexport const differenceFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brD = (src & 0xFF) - dr\n const bgD = ((src >>> 8) & 0xFF) - dg\n const bbD = ((src >>> 16) & 0xFF) - db\n\n const br = brD < 0 ? -brD : brD\n const bg = bgD < 0 ? -bgD : bgD\n const bb = bbD < 0 ? -bbD : bbD\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr + sr - ((dr * sr) >> 7)\n const bg = dg + sg - ((dg * sg) >> 7)\n const bb = db + sb - ((db * sb) >> 7)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(0, dst - src) */\nexport const subtractFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr - sr\n const bgU = dg - sg\n const bbU = db - sb\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const divideFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 0 ? 255 : Math.min(255, ((dr << 8) / sr) | 0)\n const bg = sg === 0 ? 255 : Math.min(255, ((dg << 8) / sg) | 0)\n const bb = sb === 0 ? 255 : Math.min(255, ((db << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast,\n}\n\nexport function makeFastBlendModeRegistry() {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS)\n}\n","import { sourceOverFast } from './BlendModes/blend-modes-fast'\n\n/** ALL values are 0-255 (including alpha which in CSS is 0-1) */\nexport type RGBA = { r: number, g: number, b: number, a: number }\n\n/** Represents a 32-bit color in 0xAABBGGRR (Little endian) */\nexport type Color32 = number & { readonly __brandColor32: unique symbol }\n\n/**\n * A function that defines how to combine a source color with a destination color.\n * @param src - The incoming color (source).\n * @param dst - The existing color in the buffer (destination).\n * @returns The resulting 32-bit color to be written to the buffer.\n */\nexport type BlendColor32 = {\n (src: Color32, dst: Color32): Color32,\n isOverwrite?: true\n}\n\nexport type ImageDataLike = {\n width: number\n height: number\n data: Uint8ClampedArray<ArrayBufferLike>\n}\n\nexport type SerializedImageData = {\n width: number\n height: number\n data: string\n}\n\nexport type Base64EncodedUInt8Array = string & { readonly __brandBase64UInt8Array: unique symbol }\n\n/** Rectangle definition */\nexport type Rect = {\n x: number\n y: number\n w: number\n h: number\n}\n\n/**\n * Defines how mask values should be interpreted during a draw operation.\n */\nexport enum MaskType {\n /**\n * Values are treated as alpha weights.\n * 0 is skipped, values > 0 are processed.\n */\n ALPHA,\n /**\n * Values are treated as on/off.\n * 0 is fully transparent (skipped), any other value is fully opaque.\n */\n BINARY\n}\n\n/** Strictly 0 or 1 */\nexport type BinaryMask = Uint8Array & { readonly __brand: 'Binary' }\n/** Strictly 0-255 */\nexport type AlphaMask = Uint8Array & { readonly __brand: 'Alpha' }\n\nexport type AnyMask = BinaryMask | AlphaMask\n\n/**\n * Configuration for pixel manipulation operations.\n * Designed to be used by spreading a Rect object ({x, y, w, h}) directly.\n */\nexport interface PixelRectOptions {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number\n\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number\n\n /**\n * The width of the region to process.\n * @default Source width.\n */\n w?: number\n\n /**\n * The height of the region to process.\n * @default Source height.\n */\n h?: number\n}\n\nexport interface PixelMaskRectOptions {\n\n /**\n * Mask width.\n * @default value of `w`\n */\n mw?: number\n\n /**\n * X offset into the mask buffer.\n * @default 0\n */\n mx?: number\n\n /**\n * Y offset into the mask buffer.\n * @default 0\n */\n my?: number\n}\n\nexport interface PixelMaskInvertOptions {\n\n /**\n * If true the inverse of the mask will be applied\n * @default false\n */\n invertMask?: boolean\n}\n\n/**\n * Configuration for pixel manipulation operations.\n * Designed to be used by spreading a Rect object ({x, y, w, h}) directly.\n */\nexport interface PixelOptions extends PixelRectOptions, PixelMaskRectOptions, PixelMaskInvertOptions {\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number\n\n /** An optional mask to restrict where pixels are written. */\n mask?: AnyMask | null\n\n /** The interpretation logic for the provided mask.\n * @default {@link MaskType.ALPHA}\n */\n maskType?: MaskType\n}\n\nexport interface PixelMutateOptions extends PixelRectOptions, PixelMaskRectOptions, PixelMaskInvertOptions {\n /** An optional mask to restrict where pixels are mutated. */\n mask?: BinaryMask | null\n}\n\n/**\n * Configuration for blitting (copying/blending) one image into another.\n */\nexport interface PixelBlendOptions extends PixelOptions {\n /**\n * The source rectangle x-coordinate\n * @default 0\n */\n sx?: number\n\n /**\n * The source rectangle y-coordinate\n * @default 0\n */\n sy?: number\n\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverFast}\n */\n blendFn?: BlendColor32\n}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelOptions {\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverFast}\n */\n blendFn?: BlendColor32\n}\n\nexport type ApplyMaskOptions = Omit<PixelOptions, 'mask'>\n\nexport type SelectionRect = Rect & ({\n mask: Uint8Array,\n maskType: MaskType,\n} | {\n mask?: null\n maskType?: null,\n})\n\nexport type Point = {\n x: number,\n y: number,\n}\n","import type { Color32, RGBA } from './_types'\n\n/**\n * Packs RGBA into a 32-bit integer compatible with\n * Little-Endian Uint32Array views on ImageData.\n */\nexport function packColor(r: number, g: number, b: number, a: number): Color32 {\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport function packRGBA({ r, g, b, a }: RGBA): Color32 {\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const unpackRed = (packed: Color32): number => (packed >>> 0) & 0xFF\nexport const unpackGreen = (packed: Color32): number => (packed >>> 8) & 0xFF\nexport const unpackBlue = (packed: Color32): number => (packed >>> 16) & 0xFF\nexport const unpackAlpha = (packed: Color32): number => (packed >>> 24) & 0xFF\n\nexport function unpackColor(packed: Color32): RGBA {\n return {\n r: (packed >>> 0) & 0xFF,\n g: (packed >>> 8) & 0xFF,\n b: (packed >>> 16) & 0xFF,\n a: (packed >>> 24) & 0xFF,\n }\n}\n\nconst SCRATCH_RGBA: RGBA = { r: 0, g: 0, b: 0, a: 0 }\n\n// uses a scratch arg for memory perf. be careful about re-use.\nexport function unpackColorTo(packed: Color32, scratch = SCRATCH_RGBA): RGBA {\n scratch.r = (packed >>> 0) & 0xFF\n scratch.g = (packed >>> 8) & 0xFF\n scratch.b = (packed >>> 16) & 0xFF\n scratch.a = (packed >>> 24) & 0xFF\n return scratch\n}\n\nexport function colorDistance(a: Color32, b: Color32): number {\n const dr = (a & 0xFF) - (b & 0xFF)\n const dg = ((a >>> 8) & 0xFF) - ((b >>> 8) & 0xFF)\n const db = ((a >>> 16) & 0xFF) - ((b >>> 16) & 0xFF)\n const da = ((a >>> 24) & 0xFF) - ((b >>> 24) & 0xFF)\n return dr * dr + dg * dg + db * db + da * da\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using a floating-point weight.\n * * This is the preferred method for UI animations or scenarios where high\n * precision is required. It uses the standard `a + t * (b - a)` formula\n * for each channel.\n * @param a - The starting color as a 32-bit integer (AABBGGRR).\n * @param b - The target color as a 32-bit integer (AABBGGRR).\n * @param t - The interpolation factor between 0.0 and 1.0.\n * @returns The interpolated 32-bit color.\n */\nexport function lerpColor32(a: Color32, b: Color32, t: number): Color32 {\n const r = (a & 0xFF) + t * ((b & 0xFF) - (a & 0xFF))\n const g = ((a >>> 8) & 0xFF) + t * (((b >>> 8) & 0xFF) - ((a >>> 8) & 0xFF))\n const b_ = ((a >>> 16) & 0xFF) + t * (((b >>> 16) & 0xFF) - ((a >>> 16) & 0xFF))\n const a_ = ((a >>> 24) & 0xFF) + t * (((b >>> 24) & 0xFF) - ((a >>> 24) & 0xFF))\n\n return ((a_ << 24) | (b_ << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using integer fixed-point math.\n * Highly optimized for image processing and real-time blitting. It processes\n * channels in parallel using bitmasks (RB and GA pairs).\n * **Note:** Subject to a 1-bit drift (rounding down) due to fast bit-shift division.\n * @param src - The source (foreground) color as a 32-bit integer.\n * @param dst - The destination (background) color as a 32-bit integer.\n * @param w - The blend weight as a byte value from 0 to 255. Where 0 is 100% dst and 255 is 100% src\n * @returns The blended 32-bit color.\n */export function lerpColor32Fast(src: Color32, dst: Color32, w: number): Color32 {\n const invA = 255 - w\n\n // Masking Red and Blue: 0x00FF00FF\n // We process R and B in one go, then shift back down\n const rb = (((src & 0x00FF00FF) * w + (dst & 0x00FF00FF) * invA) >>> 8) & 0x00FF00FF\n\n // Masking Green and Alpha: 0xFF00FF00\n // We shift down first to avoid overflow, then shift back up\n const ga = ((((src >>> 8) & 0x00FF00FF) * w + ((dst >>> 8) & 0x00FF00FF) * invA) >>> 8) & 0x00FF00FF\n\n return (rb | (ga << 8)) >>> 0 as Color32\n}\n\n// Convert 0xAABBGGRR to #RRGGBBAA\nexport function color32ToHex(color: Color32): string {\n const r = (color & 0xFF).toString(16).padStart(2, '0')\n const g = ((color >>> 8) & 0xFF).toString(16).padStart(2, '0')\n const b = ((color >>> 16) & 0xFF).toString(16).padStart(2, '0')\n const a = ((color >>> 24) & 0xFF).toString(16).padStart(2, '0')\n return `#${r}${g}${b}${a}`\n}\n\n/**\n * Converts a 32-bit integer (0xAABBGGRR) to a CSS rgba() string.\n * Example: 0xFF0000FF -> \"rgba(255,0,0,1)\"\n */\nexport function color32ToCssRGBA(color: Color32): string {\n const r = color & 0xFF\n const g = (color >>> 8) & 0xFF\n const b = (color >>> 16) & 0xFF\n const a = (color >>> 24) & 0xFF\n\n const alpha = Number((a / 255).toFixed(3))\n\n return `rgba(${r},${g},${b},${alpha})`\n}\n","import type { ImageDataLike, Rect } from '../_types'\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n rect: Rect,\n): Uint8ClampedArray\n/**\n * @param imageData - The source image data to read from.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8ClampedArray\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): Uint8ClampedArray {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const { width: srcW, height: srcH, data: src } = imageData\n // Safety check for invalid dimensions\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0)\n const out = new Uint8ClampedArray(w * h * 4)\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(srcW, x + w)\n const y1 = Math.min(srcH, y + h)\n\n // If no intersection, return the empty\n if (x1 <= x0 || y1 <= y0) return out\n\n for (let row = 0; row < (y1 - y0); row++) {\n // Where to read from the source canvas\n const srcRow = y0 + row\n const srcStart = (srcRow * srcW + x0) * 4\n const rowLen = (x1 - x0) * 4\n\n // Where to write into the 'out' patch\n const dstRow = (y0 - y) + row\n const dstCol = (x0 - x)\n const dstStart = (dstRow * w + dstCol) * 4\n\n // Perform the high-speed bulk copy\n out.set(src.subarray(srcStart, srcStart + rowLen), dstStart)\n }\n\n return out\n}\n","import type { Rect } from '../_types'\n\n/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n rect: Rect,\n): Uint8Array\n/**\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8Array\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n xOrRect: number | Rect,\n y?: number,\n w?: number,\n h?: number,\n): Uint8Array {\n let finalX: number\n let finalY: number\n let finalW: number\n let finalH: number\n\n if (typeof xOrRect === 'object') {\n finalX = xOrRect.x\n finalY = xOrRect.y\n finalW = xOrRect.w\n finalH = xOrRect.h\n } else {\n finalX = xOrRect\n finalY = y!\n finalW = w!\n finalH = h!\n }\n\n const out = new Uint8Array(finalW * finalH)\n const srcH = mask.length / maskWidth\n\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row\n\n if (currentSrcY < 0 || currentSrcY >= srcH) {\n continue\n }\n\n const start = Math.max(0, finalX)\n const end = Math.min(maskWidth, finalX + finalW)\n\n if (start < end) {\n const srcOffset = currentSrcY * maskWidth + start\n const dstOffset = (row * finalW) + (start - finalX)\n const count = end - start\n\n out.set(\n mask.subarray(srcOffset, srcOffset + count),\n dstOffset,\n )\n }\n }\n\n return out\n}\n","import type { Rect, SelectionRect } from '../_types'\nimport { extractMask } from '../Mask/extractMask'\n\n/**\n * Intersects a target rectangle with a boundary, trimming dimensions and masks in-place.\n * This utility calculates the axis-aligned intersection between the `target` and `bounds`.\n * If the `target` includes a `mask` (as in a {@link SelectionRect}), the mask is physically\n * cropped and re-aligned using `extractMask` to match the new dimensions.\n * @param target - The rectangle or selection object to be trimmed. **Note:** This object is mutated in-place.\n * @param bounds - The boundary rectangle defining the maximum allowable area (e.g., canvas dimensions).\n * @example\n * const selection = { x: -10, y: -10, w: 50, h: 50, mask: new Uint8Array(2500) };\n * const canvas = { x: 0, y: 0, w: 100, h: 100 };\n * // Selection will be moved to (0,0) and resized to 40x40.\n * // The mask is cropped by 10 px on the top and left.\n * trimRectBounds(selection, canvas);\n */\nexport function trimRectBounds<T extends Rect | SelectionRect>(\n target: T,\n bounds: Rect,\n): void {\n const originalX = target.x\n const originalY = target.y\n const originalW = target.w\n\n const intersectedX = Math.max(target.x, bounds.x)\n const intersectedY = Math.max(target.y, bounds.y)\n\n const intersectedMaxX = Math.min(\n target.x + target.w,\n bounds.x + bounds.w,\n )\n const intersectedMaxY = Math.min(\n target.y + target.h,\n bounds.y + bounds.h,\n )\n\n // Intersection check\n if (intersectedMaxX <= intersectedX || intersectedMaxY <= intersectedY) {\n target.w = 0\n target.h = 0\n\n if ('mask' in target && target.mask) {\n // This line is now hit by the 'empty intersection' test below\n target.mask = new Uint8Array(0)\n }\n\n return\n }\n\n const intersectedW = intersectedMaxX - intersectedX\n const intersectedH = intersectedMaxY - intersectedY\n const offsetX = intersectedX - originalX\n const offsetY = intersectedY - originalY\n\n target.x = intersectedX\n target.y = intersectedY\n target.w = intersectedW\n target.h = intersectedH\n\n if ('mask' in target && target.mask) {\n const currentMask = extractMask(\n target.mask,\n originalW,\n offsetX,\n offsetY,\n intersectedW,\n intersectedH,\n )\n\n let minX = intersectedW\n let maxX = -1\n let minY = intersectedH\n let maxY = -1\n\n // Scan for content\n for (let y = 0; y < intersectedH; y++) {\n for (let x = 0; x < intersectedW; x++) {\n if (currentMask[y * intersectedW + x] !== 0) {\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n }\n\n // If no content is found (all zeros)\n if (maxX === -1) {\n target.w = 0\n target.h = 0\n // This covers the specific line you mentioned\n target.mask = new Uint8Array(0)\n return\n }\n\n const finalW = maxX - minX + 1\n const finalH = maxY - minY + 1\n\n // Only shift and crop if the content is smaller than the intersection\n if (finalW !== intersectedW || finalH !== intersectedH) {\n target.mask = extractMask(\n currentMask,\n intersectedW,\n minX,\n minY,\n finalW,\n finalH,\n )\n target.x += minX\n target.y += minY\n target.w = finalW\n target.h = finalH\n } else {\n target.mask = currentMask\n }\n }\n}\n","import { type Color32, type ImageDataLike, MaskType, type Rect, type SelectionRect } from '../_types'\nimport { colorDistance } from '../color'\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer'\nimport type { PixelData } from '../PixelData/PixelData'\nimport { trimRectBounds } from '../Rect/trimRectBounds'\n\nexport type FloodFillImageDataOptions = {\n contiguous?: boolean\n tolerance?: number\n bounds?: Rect\n}\n\nexport type FloodFillResult = {\n startX: number\n startY: number\n selectionRect: SelectionRect\n pixels: Uint8ClampedArray\n}\n\n/**\n * Performs a color-based flood fill selection on {@link ImageData} or {@link PixelData}.\n * This utility identifies pixels starting from a specific coordinate that fall within a\n * color tolerance. It can operate in \"contiguous\" mode (classic bucket fill) or\n * \"non-contiguous\" mode (selects all matching pixels in the buffer).\n *\n * @param img - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param options - Configuration for the fill operation.\n * @param options.contiguous - @default true. If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param options.tolerance - @default 0. The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param options.bounds - Optional bounding box to restrict the search area.\n *\n * @returns A {@link FloodFillResult} containing the mask and bounds of the selection,\n * or `null` if the starting coordinates are out of bounds.\n *\n * @example\n * ```typescript\n * const result = floodFillImageDataSelection(\n * ctx.getImageData(0, 0, 100, 100),\n * 50,\n * 50,\n * {\n * tolerance: 20,\n * contiguous: true\n * }\n * );\n * ```\n */\nexport function floodFillSelection(\n img: ImageDataLike | PixelData,\n startX: number,\n startY: number,\n {\n contiguous = true,\n tolerance = 0,\n bounds,\n }: FloodFillImageDataOptions = {},\n): FloodFillResult | null {\n\n let imageData: ImageDataLike\n let data32: Uint32Array\n if ('data32' in img) {\n data32 = img.data32\n imageData = img.imageData\n } else {\n data32 = new Uint32Array(\n img.data.buffer,\n img.data.byteOffset,\n img.data.byteLength >> 2,\n )\n imageData = img\n }\n const {\n width,\n height,\n } = img\n\n const limit = bounds || {\n x: 0,\n y: 0,\n w: width,\n h: height,\n }\n\n const xMin = Math.max(0, limit.x)\n const xMax = Math.min(width - 1, limit.x + limit.w - 1)\n const yMin = Math.max(0, limit.y)\n const yMax = Math.min(height - 1, limit.y + limit.h - 1)\n\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null\n }\n\n const baseColor = data32[startY * width + startX] as Color32\n\n let matchCount = 0\n const matchX = new Uint16Array(width * height)\n const matchY = new Uint16Array(width * height)\n\n let minX = startX\n let maxX = startX\n let minY = startY\n let maxY = startY\n\n if (contiguous) {\n const visited = new Uint8Array(width * height)\n const stack = new Uint32Array(width * height)\n let stackPtr = 0\n\n stack[stackPtr++] = (startY << 16) | startX\n visited[startY * width + startX] = 1\n\n while (stackPtr > 0) {\n const val = stack[--stackPtr]\n const x = val & 0xFFFF\n const y = val >>> 16\n\n matchX[matchCount] = x\n matchY[matchCount] = y\n matchCount++\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n\n // Right\n if (x + 1 <= xMax) {\n const idx = y * width + (x + 1)\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = (y << 16) | (x + 1)\n }\n }\n // Left\n if (x - 1 >= xMin) {\n const idx = y * width + (x - 1)\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = (y << 16) | (x - 1)\n }\n }\n // Down\n if (y + 1 <= yMax) {\n const idx = (y + 1) * width + x\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = ((y + 1) << 16) | x\n }\n }\n // Up\n if (y - 1 >= yMin) {\n const idx = (y - 1) * width + x\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = ((y - 1) << 16) | x\n }\n }\n }\n } else {\n for (let y = yMin; y <= yMax; y++) {\n for (let x = xMin; x <= xMax; x++) {\n const color = data32[y * width + x] as Color32\n if (colorDistance(color, baseColor) <= tolerance) {\n matchX[matchCount] = x\n matchY[matchCount] = y\n matchCount++\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n }\n }\n\n if (matchCount === 0) {\n return null\n }\n const selectionRect: SelectionRect = {\n x: minX,\n y: minY,\n w: maxX - minX + 1,\n h: maxY - minY + 1,\n mask: new Uint8Array((maxX - minX + 1) * (maxY - minY + 1)),\n maskType: MaskType.BINARY,\n }\n\n // REMOVED trimRectBounds from here\n\n const sw = selectionRect.w\n const sh = selectionRect.h\n const finalMask = selectionRect.mask!\n\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - selectionRect.x\n const my = matchY[i] - selectionRect.y\n\n if (mx >= 0 && mx < sw && my >= 0 && my < sh) {\n finalMask[my * sw + mx] = 1\n }\n }\n\n // trimRectBounds can see them and work correctly.\n trimRectBounds(\n selectionRect,\n { x: 0, y: 0, w: width, h: height },\n )\n\n // Use the UPDATED values from the selectionRect after trimming\n const extracted = extractImageDataBuffer(\n imageData,\n selectionRect.x,\n selectionRect.y,\n selectionRect.w,\n selectionRect.h,\n )\n\n return {\n startX,\n startY,\n selectionRect,\n pixels: extracted,\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwritePerfect = overwriteBase\n\nexport const sourceOverPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return src\n if (sa === 0) return dst\n\n const invA = 255 - sa\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const da = (dst >>> 24) & 0xFF\n\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = (sr * sa + dr * invA)\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = (sg * sa + dg * invA)\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = (sb * sa + db * invA)\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = (255 * sa + da * invA)\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (src * dst) / 255 */\nexport const multiplyPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const da = (dst >>> 24) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr\n const br = (mR + 1 + (mR >> 8)) >> 8\n\n const mG = sg * dg\n const bg = (mG + 1 + (mG >> 8)) >> 8\n\n const mB = sb * db\n const bb = (mB + 1 + (mB >> 8)) >> 8\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - (((255 - dr) * 255 / sr) | 0)\n const br = resR < 0 ? 0 : resR\n\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - (((255 - dg) * 255 / sg) | 0)\n const bg = resG < 0 ? 0 : resG\n\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - (((255 - db) * 255 / sb) | 0)\n const bb = resB < 0 ? 0 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const br = brU < 0 ? 0 : brU\n const bgU = dg + sg - 255\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db + sb - 255\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkerPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(src, dst) */\nexport const lightenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const br = (src & 0xFF) > dr ? (src & 0xFF) : dr\n const bg = ((src >>> 8) & 0xFF) > dg ? ((src >>> 8) & 0xFF) : dg\n const bb = ((src >>> 16) & 0xFF) > db ? ((src >>> 16) & 0xFF) : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = 255 - (((255 - (src & 0xFF)) * (255 - dr) / 255) | 0)\n const bg = 255 - (((255 - ((src >>> 8) & 0xFF)) * (255 - dg) / 255) | 0)\n const bb = 255 - (((255 - ((src >>> 16) & 0xFF)) * (255 - db) / 255) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : (dr * 255 / (255 - sr)) | 0\n const br = resR > 255 ? 255 : resR\n\n const resG = sg === 255 ? 255 : (dg * 255 / (255 - sg)) | 0\n const bg = resG > 255 ? 255 : resG\n\n const resB = sb === 255 ? 255 : (db * 255 / (255 - sb)) | 0\n const bb = resB > 255 ? 255 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst */\nexport const linearDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const br = brU > 255 ? 255 : brU\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bg = bgU > 255 ? 255 : bgU\n const bbU = ((src >>> 16) & 0xFF) + db\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const lighterPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const br = dr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = dg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = db < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const mR = (sr * dr)\n const scR = (255 - sr) * (255 - dr)\n const br = ((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8)) + 1 + (((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8))) >> 8)) >> 8\n\n const mG = (sg * dg)\n const scG = (255 - sg) * (255 - dg)\n const bg = ((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8)) + 1 + (((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8))) >> 8)) >> 8\n\n const mB = (sb * db)\n const scB = (255 - sb) * (255 - db)\n const bb = ((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8)) + 1 + (((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8))) >> 8)) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = sg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = sb < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr + 2 * sr - 255\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bgU = dg + 2 * sg - 255\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bbU = db + 2 * sb - 255\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < (sr << 1) ? dr : (sr << 1)) : (dr > ((sr - 128) << 1) ? dr : ((sr - 128) << 1))\n const bg = sg < 128 ? (dg < (sg << 1) ? dg : (sg << 1)) : (dg > ((sg - 128) << 1) ? dg : ((sg - 128) << 1))\n const bb = sb < 128 ? (db < (sb << 1) ? db : (sb << 1)) : (db > ((sb - 128) << 1) ? db : ((sb - 128) << 1))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))) < 128 ? 0 : 255\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.abs(src - dst) */\nexport const differencePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr > sr ? dr - sr : sr - dr\n const bg = dg > sg ? dg - sg : sg - dg\n const bb = db > sb ? db - sb : sb - db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const r2 = dr * sr\n const br = dr + sr - (((r2 + r2) + 1 + ((r2 + r2) >> 8)) >> 8)\n\n const g2 = dg * sg\n const bg = dg + sg - (((g2 + g2) + 1 + ((g2 + g2) >> 8)) >> 8)\n\n const b2 = db * sb\n const bb = db + sb - (((b2 + b2) + 1 + ((b2 + b2) >> 8)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(0, dst - src) */\nexport const subtractPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr - sr\n const br = brU < 0 ? 0 : brU\n const bgU = dg - sg\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db - sb\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const dividePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr === 0 ? 255 : Math.min(255, ((dr * 255 / sr) | 0))\n const bg = sg === 0 ? 255 : Math.min(255, ((dg * 255 / sg) | 0))\n const bb = sb === 0 ? 255 : Math.min(255, ((db * 255 / sb) | 0))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect,\n}\n\nexport function makePerfectBlendModeRegistry() {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS)\n}\n","export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context'\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context'\n","import { CANVAS_CTX_FAILED } from './_constants'\n\nexport type PixelCanvas = {\n readonly canvas: HTMLCanvasElement,\n readonly ctx: CanvasRenderingContext2D,\n readonly resize: (w: number, h: number) => void\n}\n\n/**\n * Ensures the canvas ctx is always set to imageSmoothingEnabled = false.\n * Intended for canvas elements that are already part of the DOM.\n * @see makeReusableCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makePixelCanvas(\n canvas: HTMLCanvasElement,\n): PixelCanvas {\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error(CANVAS_CTX_FAILED)\n ctx.imageSmoothingEnabled = false\n\n return {\n canvas,\n ctx,\n resize(w: number, h: number) {\n canvas.width = w\n canvas.height = h\n ctx.imageSmoothingEnabled = false\n },\n }\n}\n","import { CANVAS_CTX_FAILED } from './_constants'\n\nexport type ReusableCanvas = {\n readonly canvas: HTMLCanvasElement\n readonly ctx: CanvasRenderingContext2D\n}\n\n/**\n * Creates a reusable canvas and context that are not part of the DOM.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makeReusableCanvas() {\n let canvas: HTMLCanvasElement | null = null\n let ctx: CanvasRenderingContext2D | null = null\n\n function get(width: number, height: number): ReusableCanvas {\n if (canvas === null) {\n canvas = document.createElement('canvas')!\n ctx = canvas.getContext('2d')!\n if (!ctx) throw new Error(CANVAS_CTX_FAILED)\n }\n\n // Resize if needed (resizing auto-clears)\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width\n canvas.height = height\n ctx!.imageSmoothingEnabled = false\n } else {\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height)\n }\n\n return { canvas, ctx: ctx! }\n }\n\n get.reset = () => {\n canvas = null\n ctx = null\n }\n\n return get\n}\n","/**\n * Decodes a {@link Blob} (typically PNG) back into an {@link ImageData} object.\n *\n * This function uses hardware-accelerated decoding via {@link createImageBitmap}\n * and processes the data using an {@link OffscreenCanvas} to ensure\n * compatibility with Web Workers.\n *\n * @param blob - The binary image data to decode.\n *\n * @returns A promise resolving to the decoded {@link ImageData}.\n *\n * @throws {Error}\n * Thrown if the blob is corrupted or the browser cannot decode the format.\n *\n * @example\n * ```typescript\n * const blob = await getBlobFromStorage();\n *\n * const imageData = await pngBlobToImageData(blob);\n * ```\n */\nexport async function imgBlobToImageData(\n blob: Blob,\n): Promise<ImageData> {\n let bitmap: ImageBitmap | null = null\n\n try {\n bitmap = await createImageBitmap(blob)\n\n const canvas = new OffscreenCanvas(\n bitmap.width,\n bitmap.height,\n )\n\n const ctx = canvas.getContext('2d')\n\n if (!ctx) {\n throw new Error('Failed to get 2D context')\n }\n\n ctx.drawImage(bitmap, 0, 0)\n\n return ctx.getImageData(\n 0,\n 0,\n bitmap.width,\n bitmap.height,\n )\n } finally {\n bitmap?.close()\n }\n}\n","import { imgBlobToImageData } from '../ImageData/imgBlobToImageData'\n\n/**\n * Extracts {@link ImageData} from a clipboard event if an image is present.\n *\n * This function iterates through the {@link DataTransferItemList} to find\n * the first item with an image MIME type and decodes it.\n *\n * @param clipboardEvent - The event object from a `paste` listener.\n *\n * @returns A promise resolving to {@link ImageData}, or `null` if no\n * image was found in the clipboard.\n *\n * @example\n * ```typescript\n * window.addEventListener('paste', async (event) => {\n * const data = await getImageDataFromClipboard(event)\n * if (data) {\n * console.log('Pasted image dimensions:', data.width, data.height)\n * }\n * });\n * ```\n */\nexport async function getImageDataFromClipboard(clipboardEvent: ClipboardEvent) {\n const items = clipboardEvent?.clipboardData?.items\n if (!items?.length) return null\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n\n if (item.type.startsWith('image/')) {\n const blob = item.getAsFile()\n\n if (!blob) {\n continue\n }\n\n return imgBlobToImageData(blob)\n }\n }\n return null\n}\n","/**\n * Converts an {@link ImageData} object into a {@link Blob} in PNG format.\n *\n * This operation is asynchronous and uses {@link OffscreenCanvas}\n * to perform the encoding, making it suitable for usage in both the main\n * thread and Web Workers.\n *\n * @param imageData - The pixel data to be encoded.\n *\n * @returns A promise that resolves to a {@link Blob} with the MIME type `image/png`.\n *\n * @throws {Error}\n * Thrown if the {@link OffscreenCanvas} context cannot be initialized or the blob\n * encoding fails.\n *\n * @example\n * ```typescript\n * const blob = await imageDataToImgBlob(imageData);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport async function imageDataToImgBlob(imageData: ImageData): Promise<Blob> {\n const canvas = new OffscreenCanvas(imageData.width, imageData.height)\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('could not create 2d context')\n\n ctx.putImageData(imageData, 0, 0)\n return canvas!.convertToBlob({\n type: 'image/png',\n })\n}\n","/**\n * Writes a {@link Blob} image to the system clipboard.\n *\n * @param blob - The image {@link Blob} (typically `image/png`) to copy.\n * @returns A promise that resolves when the clipboard has been updated.\n */\nexport async function writeImgBlobToClipboard(blob: Blob): Promise<void> {\n const item = new ClipboardItem({\n 'image/png': blob,\n })\n\n await navigator.clipboard.write([item])\n}\n","import { imageDataToImgBlob } from '../ImageData/imageDataToImgBlob'\nimport { writeImgBlobToClipboard } from './writeImgBlobToClipboard'\n\n/**\n * Converts {@link ImageData} to a PNG {@link Blob} and writes it to the system clipboard.\n * This is a high-level utility that combines {@link imageDataToImgBlob} and\n * {@link writeImgBlobToClipboard}.\n * @param imageData - The image data to copy to the clipboard.\n * @returns A promise that resolves when the image has been successfully copied.\n * @throws {Error}\n * If the conversion to blob fails or clipboard permissions are denied.\n *\n * @example\n * ```typescript\n * const canvas = document.querySelector('canvas')\n * const ctx = canvas.getContext('2d')\n * const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n * await writeImageDataToClipboard(imageData)\n * ```\n */\nexport async function writeImageDataToClipboard(imageData: ImageData): Promise<void> {\n const blob = await imageDataToImgBlob(imageData)\n\n return writeImgBlobToClipboard(blob)\n}\n","import type { PixelData } from '../PixelData/PixelData'\n\nexport type PixelPatchTiles = {\n beforeTiles: PixelTile[]\n afterTiles: PixelTile[]\n}\n\nexport class PixelTile {\n public data32: Uint32Array\n\n constructor(\n public id: number,\n public tx: number,\n public ty: number,\n tileArea: number,\n ) {\n this.data32 = new Uint32Array(tileArea)\n }\n}\n\nexport function applyPatchTiles(target: PixelData, tiles: PixelTile[], tileSize: number = 256) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i]\n\n if (!tile) continue\n\n const dst = target.data32\n const src = tile.data32\n const dstWidth = target.width\n const dstHeight = target.height\n const startX = tile.tx * tileSize\n const startY = tile.ty * tileSize\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX))\n\n if (copyWidth <= 0) return\n\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break\n\n const dstIndex = globalY * dstWidth + startX\n const srcIndex = ly * tileSize\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n dst.set(rowData, dstIndex)\n }\n }\n}\n","import type { PixelData } from '../PixelData/PixelData'\nimport type { PixelEngineConfig } from './PixelEngineConfig'\nimport { type PixelPatchTiles, PixelTile } from './PixelPatchTiles'\n\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[]\n public beforeTiles: PixelTile[]\n public pool: PixelTile[]\n\n constructor(\n public target: PixelData,\n readonly config: PixelEngineConfig,\n ) {\n this.lookup = []\n this.beforeTiles = []\n this.pool = []\n }\n\n getTile(\n id: number,\n tx: number,\n ty: number,\n ): PixelTile {\n let tile = this.pool.pop()\n\n if (tile) {\n tile.id = id\n tile.tx = tx\n tile.ty = ty\n\n return tile\n }\n\n return new PixelTile(\n id,\n tx,\n ty,\n this.config.tileArea,\n )\n }\n\n recyclePatch(patch: PixelPatchTiles) {\n const before = patch.beforeTiles\n\n for (let i = 0; i < before.length; i++) {\n let tile = before[i]\n\n if (tile) {\n this.pool.push(tile)\n }\n }\n\n const after = patch.afterTiles\n\n for (let i = 0; i < after.length; i++) {\n let tile = after[i]\n\n if (tile) {\n this.pool.push(tile)\n }\n }\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storeTileBeforeState(x: number, y: number): void {\n let target = this.target\n let shift = this.config.tileShift\n let columns = (target.width + this.config.tileMask) >> shift\n let tx = x >> shift\n let ty = y >> shift\n let id = ty * columns + tx\n\n let tile = this.lookup[id]\n\n if (!tile) {\n tile = this.getTile(\n id,\n tx,\n ty,\n )\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n }\n }\n\n /**\n *\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(\n x: number,\n y: number,\n w: number,\n h: number,\n ) {\n let target = this.target\n let shift = this.config.tileShift\n let columns = (target.width + this.config.tileMask) >> shift\n\n let startX = x >> shift\n let startY = y >> shift\n let endX = (x + w - 1) >> shift\n let endY = (y + h - 1) >> shift\n\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n let id = ty * columns + tx\n let tile = this.lookup[id]\n\n if (!tile) {\n tile = this.getTile(\n id,\n tx,\n ty,\n )\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n }\n }\n }\n }\n\n extractState(tile: PixelTile) {\n let target = this.target\n let TILE_SIZE = this.config.tileSize\n let dst = tile.data32\n let src = target.data32\n let startX = tile.tx * TILE_SIZE\n let startY = tile.ty * TILE_SIZE\n let targetWidth = target.width\n let targetHeight = target.height\n\n let copyWidth = Math.max(0, Math.min(TILE_SIZE, targetWidth - startX))\n\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly\n let dstIndex = ly * TILE_SIZE\n\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE)\n continue\n }\n\n let srcIndex = globalY * targetWidth + startX\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n dst.set(rowData, dstIndex)\n\n if (copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + copyWidth, dstIndex + TILE_SIZE)\n }\n }\n }\n\n extractAfterTiles(): PixelTile[] {\n let afterTiles: PixelTile[] = []\n let length = this.beforeTiles.length\n\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i]\n\n if (beforeTile) {\n let afterTile = this.getTile(\n beforeTile.id,\n beforeTile.tx,\n beforeTile.ty,\n )\n\n this.extractState(afterTile)\n afterTiles.push(afterTile)\n }\n }\n\n return afterTiles\n }\n\n reset() {\n this.lookup = []\n this.beforeTiles = []\n }\n}\n","export interface HistoryAction {\n undo: () => void\n redo: () => void\n dispose?: () => void\n}\n\nexport class HistoryManager {\n public undoStack: HistoryAction[]\n public redoStack: HistoryAction[]\n public listeners: Set<() => void>\n\n constructor(\n public maxSteps = 50,\n ) {\n this.undoStack = []\n this.redoStack = []\n this.listeners = new Set()\n }\n\n get canUndo() {\n return this.undoStack.length > 0\n }\n\n get canRedo() {\n return this.redoStack.length > 0\n }\n\n subscribe(fn: () => void) {\n this.listeners.add(fn)\n return () => this.listeners.delete(fn)\n }\n\n notify() {\n this.listeners.forEach((fn) => fn())\n }\n\n commit(action: HistoryAction) {\n this.undoStack.push(action)\n this.clearRedoStack()\n\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.()\n }\n\n this.notify()\n }\n\n undo() {\n let action = this.undoStack.pop()\n\n if (!action) return\n\n this.redoStack.push(action)\n action.undo()\n\n this.notify()\n }\n\n redo() {\n let action = this.redoStack.pop()\n\n if (!action) return\n\n this.undoStack.push(action)\n action.redo()\n\n this.notify()\n }\n\n clearRedoStack() {\n let length = this.redoStack.length\n\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i]\n\n if (action) {\n action.dispose?.()\n }\n }\n\n this.redoStack.length = 0\n }\n}\n","export class PixelEngineConfig {\n public readonly tileSize: number\n public readonly tileShift: number\n public readonly tileMask: number\n public readonly tileArea: number\n\n constructor(tileSize: number = 256) {\n // Ensure it's a power of 2 to guarantee bitwise math works\n if ((tileSize & (tileSize - 1)) !== 0) {\n throw new Error('tileSize must be a power of 2')\n }\n\n this.tileSize = tileSize\n this.tileShift = Math.log2(tileSize)\n this.tileMask = tileSize - 1\n this.tileArea = tileSize * tileSize\n }\n}\n","import type { BlendColor32, Color32, Rect } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { PixelData } from './PixelData'\n\n/**\n * Applies a circular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushSize The diameter of the brush.\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @param bounds precalculated result from {@link getCircleBrushBounds}\n * @default sourceOverPerfect\n */\nexport function applyCircleBrushToPixelData(\n target: PixelData,\n color: Color32,\n centerX: number,\n centerY: number,\n brushSize: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn: BlendColor32 = sourceOverPerfect,\n bounds?: Rect,\n): void {\n const targetWidth = target.width\n const targetHeight = target.height\n\n // Use provided bounds OR calculate them once\n const b = bounds ?? getCircleBrushBounds(\n centerX,\n centerY,\n brushSize,\n targetWidth,\n targetHeight\n )\n\n if (b.w <= 0 || b.h <= 0) return\n\n const data32 = target.data32\n const r = brushSize / 2\n const rSqr = r * r\n const invR = 1 / r\n\n const centerOffset = (brushSize % 2 === 0) ? 0.5 : 0\n const baseColor = color & 0x00ffffff\n const constantSrc = ((alpha << 24) | baseColor) >>> 0 as Color32\n\n const endX = b.x + b.w\n const endY = b.y + b.h\n\n // Anchor the math to the floor of the center for exact pixel art parity\n const fCenterX = Math.floor(centerX)\n const fCenterY = Math.floor(centerY)\n\n for (let cy = b.y; cy < endY; cy++) {\n const relY = (cy - fCenterY) + centerOffset\n const dySqr = relY * relY\n const rowOffset = cy * targetWidth\n\n for (let cx = b.x; cx < endX; cx++) {\n const relX = (cx - fCenterX) + centerOffset\n const dSqr = relX * relX + dySqr\n\n if (dSqr <= rSqr) {\n const idx = rowOffset + cx\n\n if (fallOff) {\n const strength = fallOff(Math.sqrt(dSqr) * invR)\n const fAlpha = (alpha * strength) & 0xFF\n const src = ((fAlpha << 24) | baseColor) >>> 0 as Color32\n data32[idx] = blendFn(src, data32[idx] as Color32)\n } else {\n data32[idx] = blendFn(constantSrc, data32[idx] as Color32)\n }\n }\n }\n }\n}\n\nexport function getCircleBrushBounds(\n centerX: number,\n centerY: number,\n brushSize: number,\n targetWidth?: number,\n targetHeight?: number,\n out?: Rect,\n): Rect {\n const r = brushSize / 2\n\n // These offsets match your getPerfectCircleCoords exactly\n const minOffset = -Math.ceil(r - 0.5)\n const maxOffset = Math.floor(r - 0.5)\n\n // start is inclusive, end is exclusive\n const startX = Math.floor(centerX + minOffset)\n const startY = Math.floor(centerY + minOffset)\n const endX = Math.floor(centerX + maxOffset) + 1\n const endY = Math.floor(centerY + maxOffset) + 1\n\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n }\n\n const cStartX = targetWidth !== undefined ? Math.max(0, startX) : startX\n const cStartY = targetHeight !== undefined ? Math.max(0, startY) : startY\n const cEndX = targetWidth !== undefined ? Math.min(targetWidth, endX) : endX\n const cEndY = targetHeight !== undefined ? Math.min(targetHeight, endY) : endY\n\n res.x = cStartX\n res.y = cStartY\n res.w = Math.max(0, cEndX - cStartX)\n res.h = Math.max(0, cEndY - cStartY)\n\n return res\n}\n","import type { PixelData } from '../PixelData/PixelData'\nimport { type HistoryAction, HistoryManager } from './HistoryManager'\nimport { PixelAccumulator } from './PixelAccumulator'\nimport { PixelEngineConfig } from './PixelEngineConfig'\nimport { applyPatchTiles, type PixelPatchTiles } from './PixelPatchTiles'\n\nexport interface PixelWriterOptions {\n maxHistorySteps?: number\n tileSize?: number\n historyManager?: HistoryManager\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n public target: PixelData\n public historyManager: HistoryManager\n public accumulator: PixelAccumulator\n protected config: PixelEngineConfig\n readonly mutator: M\n\n constructor(target: PixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps),\n }: PixelWriterOptions = {}) {\n this.target = target\n this.config = new PixelEngineConfig(tileSize)\n this.historyManager = historyManager\n this.accumulator = new PixelAccumulator(target, this.config)\n this.mutator = mutatorFactory(this)\n }\n\n withHistory(cb: (mutator: M) => void) {\n cb(this.mutator)\n\n this.captureHistory()\n }\n\n captureHistory() {\n const beforeTiles = this.accumulator.beforeTiles\n if (beforeTiles.length === 0) return\n\n const afterTiles = this.accumulator.extractAfterTiles()\n\n const patch: PixelPatchTiles = {\n beforeTiles: beforeTiles,\n afterTiles: afterTiles,\n }\n\n const target = this.target\n const tileSize = this.config.tileSize\n const accumulator = this.accumulator\n\n const action: HistoryAction = {\n undo: () => applyPatchTiles(target, patch.beforeTiles, tileSize),\n redo: () => applyPatchTiles(target, patch.afterTiles, tileSize),\n dispose: () => accumulator.recyclePatch(patch),\n }\n\n this.historyManager.commit(action)\n this.accumulator.reset()\n }\n}\n","import type { BlendColor32, Color32, Rect } from '../../_types'\nimport { applyCircleBrushToPixelData, getCircleBrushBounds } from '../../PixelData/applyCircleBrushToPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nconst boundsOut: Rect = { x: 0, y: 0, w: 0, h: 0 }\n\nexport function mutatorApplyCircleBrush(writer: PixelWriter<any>) {\n return {\n applyCircleBrush(\n color: Color32,\n centerX: number,\n centerY: number,\n brushSize: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn?: BlendColor32,\n ) {\n\n const circleBounds = getCircleBrushBounds(\n centerX,\n centerY,\n brushSize,\n writer.target.width,\n writer.target.height,\n boundsOut,\n )\n\n const { x, y, w, h } = circleBounds\n\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n\n applyCircleBrushToPixelData(\n writer.target,\n color,\n centerX,\n centerY,\n brushSize,\n alpha,\n fallOff,\n blendFn,\n circleBounds,\n )\n },\n }\n}\n","import { type AnyMask, type ApplyMaskOptions, MaskType } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n */\nexport function applyMaskToPixelData(\n dst: PixelData,\n mask: AnyMask,\n opts: ApplyMaskOptions = {},\n): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Clipping Logic\n if (x < 0) {\n w += x\n x = 0\n }\n\n if (y < 0) {\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0 || globalAlpha === 0) {\n return\n }\n\n const dst32 = dst.data32\n const dw = dst.width\n const mPitch = mw ?? width\n const isAlpha = maskType === MaskType.ALPHA\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const mStride = mPitch - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx]\n let weight = globalAlpha\n\n if (isAlpha) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // Short-circuit: if source is 0, destination alpha becomes 0\n if (effectiveM === 0) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n dIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha === 255\n ? effectiveM\n : (effectiveM * globalAlpha + 128) >> 8\n } else {\n // Strict Binary 1/0 Logic\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n dIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // If calculated weight is 0, clear alpha\n if (weight === 0) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n } else {\n const d = dst32[dIdx]\n const da = (d >>> 24)\n\n let finalAlpha = da\n\n if (da === 0) {\n // Already transparent\n } else if (weight === 255) {\n // Identity: keep original da\n } else if (da === 255) {\n // Identity: result is just the weight\n finalAlpha = weight\n } else {\n finalAlpha = (da * weight + 128) >> 8\n }\n\n dst32[dIdx] = ((d & 0x00ffffff) | (finalAlpha << 24)) >>> 0\n }\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import { type AnyMask, type ApplyMaskOptions } from '../../_types'\nimport { applyMaskToPixelData } from '../../PixelData/applyMaskToPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorApplyMask(writer: PixelWriter<any>) {\n return {\n applyMask: (mask: AnyMask, opts: ApplyMaskOptions = {}) => {\n let target = writer.target\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n applyMaskToPixelData(target, mask, opts)\n },\n }\n}\n","import type { ImageDataLike } from '../_types'\n\n/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUInt32Array(imageData: ImageDataLike): Uint32Array {\n return new Uint32Array(\n imageData.data.buffer,\n imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2,\n )\n}\n","import { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array'\n\nexport class PixelData {\n public data32: Uint32Array\n public imageData!: ImageData\n\n get width(): number {\n return this.imageData.width\n }\n\n get height(): number {\n return this.imageData.height\n }\n\n constructor(imageData: ImageData) {\n this.data32 = imageDataToUInt32Array(imageData)\n this.imageData = imageData\n }\n\n set(imageData: ImageData): void {\n this.imageData = imageData\n this.data32 = imageDataToUInt32Array(imageData)\n }\n\n /**\n * Creates a deep copy of the PixelData using the environment's ImageData constructor.\n */\n copy(): PixelData {\n const buffer = new Uint8ClampedArray(this.imageData.data)\n\n // Fallback to the object's own constructor if the global ImageData is missing (Node tests)\n const ImageConstructor = (typeof ImageData !== 'undefined'\n ? ImageData\n : (this.imageData.constructor as typeof ImageData))\n\n const newImageData = new ImageConstructor(\n buffer,\n this.width,\n this.height,\n )\n\n return new PixelData(newImageData)\n }\n}\n","import type { BlendColor32, Color32, Rect } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport { PixelData } from './PixelData'\n\n/**\n * Applies a rectangular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushWidth\n * @param brushHeight\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @param bounds precalculated result from {@link getRectBrushBounds}\n * @default sourceOverPerfect\n */\nexport function applyRectBrushToPixelData(\n target: PixelData,\n color: Color32,\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn: BlendColor32 = sourceOverPerfect,\n bounds?: Rect,\n): void {\n const targetWidth = target.width\n const targetHeight = target.height\n\n // Use provided bounds or compute once\n const b = bounds ?? getRectBrushBounds(\n centerX,\n centerY,\n brushWidth,\n brushHeight,\n targetWidth,\n targetHeight\n )\n\n if (b.w <= 0 || b.h <= 0) return\n\n const data32 = target.data32\n const baseColor = color & 0x00ffffff\n const constantSrc = ((alpha << 24) | baseColor) >>> 0 as Color32\n\n const invHalfW = 1 / (brushWidth / 2)\n const invHalfH = 1 / (brushHeight / 2)\n const endX = b.x + b.w\n const endY = b.y + b.h\n\n for (let py = b.y; py < endY; py++) {\n const rowOffset = py * targetWidth\n\n // Y-distance check for falloff (center of pixel to center of brush)\n const dy = fallOff ? Math.abs(py + 0.5 - centerY) * invHalfH : 0\n\n for (let px = b.x; px < endX; px++) {\n const idx = rowOffset + px\n\n if (fallOff) {\n const dx = Math.abs(px + 0.5 - centerX) * invHalfW\n const dist = dx > dy ? dx : dy\n\n const strength = fallOff(dist)\n const fAlpha = (alpha * strength) | 0\n const src = ((fAlpha << 24) | baseColor) >>> 0 as Color32\n\n data32[idx] = blendFn(src, data32[idx] as Color32)\n } else {\n data32[idx] = blendFn(constantSrc, data32[idx] as Color32)\n }\n }\n }\n}\n\nexport function getRectBrushBounds(\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n targetWidth?: number,\n targetHeight?: number,\n out?: Rect,\n): Rect {\n const startX = Math.floor(centerX - brushWidth / 2)\n const startY = Math.floor(centerY - brushHeight / 2)\n const endX = startX + brushWidth\n const endY = startY + brushHeight\n\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n }\n\n const cStartX = targetWidth !== undefined ? Math.max(0, startX) : startX\n const cStartY = targetHeight !== undefined ? Math.max(0, startY) : startY\n const cEndX = targetWidth !== undefined ? Math.min(targetWidth, endX) : endX\n const cEndY = targetHeight !== undefined ? Math.min(targetHeight, endY) : endY\n\n const w = cEndX - cStartX\n const h = cEndY - cStartY\n\n res.x = cStartX\n res.y = cStartY\n res.w = w < 0 ? 0 : w\n res.h = h < 0 ? 0 : h\n\n return res\n}\n","import type { BlendColor32, Color32, Rect } from '../../_types'\nimport { applyRectBrushToPixelData, getRectBrushBounds } from '../../PixelData/applyRectBrushToPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nconst boundsOut: Rect = { x: 0, y: 0, w: 0, h: 0 }\n\nexport function mutatorApplyRectBrush(writer: PixelWriter<any>) {\n return {\n applyRectBrush(\n color: Color32,\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn?: BlendColor32,\n ) {\n\n const bounds = getRectBrushBounds(\n centerX,\n centerY,\n brushWidth,\n brushHeight,\n writer.target.width,\n writer.target.height,\n boundsOut,\n )\n\n const { x, y, w, h } = bounds\n\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n\n applyRectBrushToPixelData(\n writer.target,\n color,\n centerX,\n centerY,\n brushWidth,\n brushHeight,\n alpha,\n fallOff,\n blendFn,\n bounds,\n )\n },\n }\n}\n","import { type Color32, type ColorBlendOptions, MaskType } from '../_types'\nimport { sourceOverFast } from '../BlendModes/blend-modes-fast'\nimport type { PixelData } from './PixelData'\n\n/**\n * Fills a rectangle in the destination PixelData with a single color,\n * supporting blend modes, global alpha, and masking.\n */\nexport function blendColorPixelData(\n dst: PixelData,\n color: Color32,\n opts: ColorBlendOptions = {},\n) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverFast,\n mask,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (globalAlpha === 0) return\n\n const baseSrcAlpha = (color >>> 24)\n const isOverwrite = blendFn.isOverwrite\n if (baseSrcAlpha === 0 && !isOverwrite) return\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0) return\n\n const dst32 = dst.data32\n const dw = dst.width\n const mPitch = mw ?? width\n const isAlphaMask = maskType === MaskType.ALPHA\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const mStride = mPitch - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n let weight = globalAlpha\n\n if (mask) {\n const mVal = mask[mIdx]\n\n if (isAlphaMask) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // If mask is transparent, skip\n if (effectiveM === 0) {\n dIdx++\n mIdx++\n continue\n }\n\n // globalAlpha is not a factor\n if (globalAlpha === 255) {\n weight = effectiveM\n // mask is not a factor\n } else if (effectiveM === 255) {\n weight = globalAlpha\n } else {\n // use rounding-corrected multiplication\n weight = (effectiveM * globalAlpha + 128) >> 8\n }\n } else {\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // Final safety check for weight (can be 0 if globalAlpha or alphaMask rounds down)\n // if mask or global alpha are 0 we bail even if we are overwriting\n if (weight === 0) {\n dIdx++\n mIdx++\n continue\n }\n }\n\n let currentSrcColor = color\n\n if (weight < 255) {\n let currentSrcAlpha = baseSrcAlpha\n\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (!isOverwrite && currentSrcAlpha === 0) {\n dIdx++\n mIdx++\n continue\n }\n\n currentSrcColor = ((color & 0x00ffffff) | (currentSrcAlpha << 24)) >>> 0 as Color32\n }\n\n dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx] as Color32)\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import type { Color32, ColorBlendOptions } from '../../_types'\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendColor(writer: PixelWriter<any>) {\n return {\n blendColor(\n color: Color32,\n opts: ColorBlendOptions = {},\n ) {\n\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n blendColorPixelData(writer.target, color, opts)\n },\n }\n}\n","import type { BlendColor32, Color32 } from '../../_types'\nimport { overwriteFast } from '../../BlendModes/blend-modes-fast'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendPixel(writer: PixelWriter<any>) {\n return {\n blendPixel(\n x: number,\n y: number,\n color: Color32,\n alpha: number = 255,\n blendFn: BlendColor32 = overwriteFast,\n ) {\n let target = writer.target\n let width = target.width\n let height = target.height\n\n if (x < 0 || x >= width || y < 0 || y >= height) return\n\n writer.accumulator.storeTileBeforeState(x, y)\n\n let index = y * width + x\n let bg = target.data32[index] as Color32\n\n let finalColor = color\n\n if (alpha < 255) {\n let baseSrcAlpha = color >>> 24\n let finalAlpha = (baseSrcAlpha * alpha + 128) >> 8\n\n finalColor = (((color & 0x00ffffff) | (finalAlpha << 24)) >>> 0) as Color32\n }\n\n target.data32[index] = blendFn(finalColor, bg)\n },\n }\n}\n","import { type Color32, MaskType, type PixelBlendOptions } from '../_types'\nimport { sourceOverFast } from '../BlendModes/blend-modes-fast'\nimport type { PixelData } from './PixelData'\n\n/**\n * Blits source PixelData into a destination PixelData using 32-bit integer bitwise blending.\n * This function bypasses standard ImageData limitations by operating directly on\n * Uint32Array views. It supports various blend modes, binary/alpha masking, and\n * automatic clipping of both source and destination bounds.\n * @example\n *\n * const dst = new PixelData(ctx.getImageData(0,0,100,100))\n * blendImageData32(dst, sprite, {\n * blendFn: COLOR_32_BLEND_MODES.multiply,\n * mask: brushMask,\n * maskType: MaskType.ALPHA\n * });\n */\nexport function blendPixelData(\n dst: PixelData,\n src: PixelData,\n opts: PixelBlendOptions,\n) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverFast,\n mask,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (globalAlpha === 0) return\n\n let x = targetX\n let y = targetY\n let sx = sourceX\n let sy = sourceY\n let w = width\n let h = height\n\n // 1. Source Clipping\n if (sx < 0) {\n x -= sx\n w += sx\n sx = 0\n }\n if (sy < 0) {\n y -= sy\n h += sy\n sy = 0\n }\n w = Math.min(w, src.width - sx)\n h = Math.min(h, src.height - sy)\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x\n w += x\n x = 0\n }\n if (y < 0) {\n sy -= y\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0) return\n\n const dst32 = dst.data32\n const src32 = src.data32\n const dw = dst.width\n const sw = src.width\n const mPitch = mw ?? width\n const isAlphaMask = maskType === MaskType.ALPHA\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let sIdx = sy * sw + sx\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const sStride = sw - actualW\n const mStride = mPitch - actualW\n\n const isOverwrite = blendFn.isOverwrite\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const baseSrcColor = src32[sIdx] as Color32\n const baseSrcAlpha = (baseSrcColor >>> 24)\n\n // In Overwrite, we process even if baseSrcAlpha is 0\n if (baseSrcAlpha === 0 && !isOverwrite) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n let weight = globalAlpha\n\n if (mask) {\n const mVal = mask[mIdx]\n\n if (isAlphaMask) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // If mask is transparent, skip\n if (effectiveM === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n // globalAlpha is not a factor\n if (globalAlpha === 255) {\n weight = effectiveM\n // mask is not a factor\n } else if (effectiveM === 255) {\n weight = globalAlpha\n } else {\n // use rounding-corrected multiplication\n weight = (effectiveM * globalAlpha + 128) >> 8\n }\n } else {\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // Final safety check for weight (can be 0 if globalAlpha or alphaMask rounds down)\n // if mask or global alpha are 0 we bail even if we are overwriting\n if (weight === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n let currentSrcAlpha = baseSrcAlpha\n\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (!isOverwrite && currentSrcAlpha === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n currentSrcColor = ((baseSrcColor & 0x00ffffff) | (currentSrcAlpha << 24)) >>> 0 as Color32\n }\n\n dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx] as Color32)\n\n dIdx++\n sIdx++\n mIdx++\n }\n\n dIdx += dStride\n sIdx += sStride\n mIdx += mStride\n }\n}\n","import type { PixelBlendOptions } from '../../_types'\nimport { blendPixelData } from '../../PixelData/blendPixelData'\nimport type { PixelData } from '../../PixelData/PixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendPixelData(writer: PixelWriter<any>) {\n return {\n blendPixelData(\n src: PixelData,\n opts: PixelBlendOptions,\n ) {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n\n blendPixelData(writer.target, src, opts)\n },\n }\n}\n\n","import type { Color32, Rect } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Fills a region or the {@link PixelData} buffer with a solid color.\n *\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param rect - A {@link Rect} defining the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n rect?: Partial<Rect>,\n): void\n/**\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param x - Starting horizontal coordinate.\n * @param y - Starting vertical coordinate.\n * @param w - Width of the fill area.\n * @param h - Height of the fill area.\n */\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n _x?: Partial<Rect> | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n let x: number\n let y: number\n let w: number\n let h: number\n\n if (typeof _x === 'object') {\n x = _x.x ?? 0\n y = _x.y ?? 0\n w = _x.w ?? dst.width\n h = _x.h ?? dst.height\n } else if (typeof _x === 'number') {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n } else {\n x = 0\n y = 0\n w = dst.width\n h = dst.height\n }\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0) {\n return\n }\n\n const dst32 = dst.data32\n const dw = dst.width\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.height && x === 0 && y === 0) {\n dst32.fill(color)\n return\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (y + iy) * dw + x\n const end = start + actualW\n dst32.fill(color, start, end)\n }\n}\n","import type { Color32, Rect } from '../../_types'\nimport { fillPixelData } from '../../PixelData/fillPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorFill(writer: PixelWriter<any>) {\n return {\n fill(\n color: Color32,\n rect: Partial<Rect> = {},\n ) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = rect\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n fillPixelData(writer.target, color, x, y, w, h)\n },\n }\n}\n","import { type PixelMutateOptions } from '../_types'\nimport type { PixelData } from './PixelData'\n\nexport function invertPixelData(\n pixelData: PixelData,\n opts: PixelMutateOptions = {},\n): void {\n const dst = pixelData\n const {\n x: targetX = 0,\n y: targetY = 0,\n\n w: width = pixelData.width,\n h: height = pixelData.height,\n mask,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0) return\n\n const dst32 = dst.data32\n const dw = dst.width\n const mPitch = mw ?? width\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const mStride = mPitch - actualW\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx]\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n }\n dIdx++\n mIdx++\n }\n dIdx += dStride\n mIdx += mStride\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n dIdx++\n }\n dIdx += dStride\n }\n }\n}\n","import type { PixelMutateOptions } from '../../_types'\nimport { invertPixelData } from '../../PixelData/invertPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorInvert(writer: PixelWriter<any>) {\n return {\n invert(opts: PixelMutateOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n invertPixelData(writer.target, opts)\n },\n }\n}\n","import { mutatorApplyCircleBrush } from './PixelMutator/mutatorApplyCircleBrush'\nimport { mutatorApplyMask } from './PixelMutator/mutatorApplyMask'\nimport { mutatorApplyRectBrush } from './PixelMutator/mutatorApplyRectBrush'\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor'\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel'\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData'\nimport { mutatorFill } from './PixelMutator/mutatorFillPixelData'\nimport { mutatorInvert } from './PixelMutator/mutatorInvert'\nimport type { PixelWriter } from './PixelWriter'\n\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n ...mutatorApplyMask(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorFill(writer),\n ...mutatorInvert(writer),\n ...mutatorApplyCircleBrush(writer),\n ...mutatorApplyRectBrush(writer),\n }\n}\n","export type ReusableImageData = ReturnType<typeof makeReusableImageData>\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n const hasInstance = !!imageData\n const widthMatches = hasInstance && imageData!.width === width\n const heightMatches = hasInstance && imageData!.height === height\n\n if (!widthMatches || !heightMatches) {\n imageData = new ImageData(width, height)\n }\n\n return imageData!\n }\n}\n","import type { ImageDataLike } from '../_types'\n\nexport function copyImageData({ data, width, height }: ImageDataLike): ImageData {\n return new ImageData(data.slice(), width, height)\n}\n\nexport function copyImageDataLike({ data, width, height }: ImageDataLike): ImageDataLike {\n return {\n data: data.slice(),\n width,\n height,\n }\n}\n","import type { AlphaMask } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(\n pixelData: PixelData,\n): AlphaMask {\n const {\n data32,\n width,\n height,\n } = pixelData\n const len = data32.length\n const mask = new Uint8Array(width * height) as AlphaMask\n\n for (let i = 0; i < len; i++) {\n const val = data32[i]\n\n // Extract the Alpha byte (top 8 bits in ABGR / Little-Endian)\n // Shift right by 24 moves the 4th byte to the 1st position\n mask[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import type { AlphaMask } from '../_types'\nimport { pixelDataToAlphaMask } from '../PixelData/pixelDataToAlphaMask'\n\n/**\n * Extracts the alpha channel from raw ImageData into an AlphaMask.\n * When possible use {@link pixelDataToAlphaMask} instead.\n * Repeat calls to the same data will use less memory.\n */\nexport function imageDataToAlphaMask(\n imageData: ImageData,\n): AlphaMask {\n const {\n width,\n height,\n data,\n } = imageData\n\n // Create a 32-bit view of the existing buffer\n const data32 = new Uint32Array(\n data.buffer,\n data.byteOffset,\n data.byteLength >> 2,\n )\n const len = data32.length\n const mask = new Uint8Array(width * height) as AlphaMask\n\n for (let i = 0; i < len; i++) {\n const val = data32[i]\n\n // Extract Alpha (top 8 bits in Little-Endian/ABGR)\n mask[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import { makeReusableCanvas } from '../Canvas/ReusableCanvas'\n\nconst get = makeReusableCanvas()\n\n/**\n * Converts an {@link ImageData} object into a base64-encoded Data URL string.\n *\n * @param imageData - The pixel data to be converted.\n *\n * @returns A string representing the image in `image/png` format as a\n * [Data URL](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n * @example\n * ```typescript\n * const dataUrl = imageDataToDataUrl(imageData);\n * const img = new Image();\n * img.src = dataUrl;\n * ```\n */\nexport function imageDataToDataUrl(imageData: ImageData): string {\n const { canvas, ctx } = get(imageData.width, imageData.height)\n\n ctx.putImageData(imageData, 0, 0)\n return canvas.toDataURL()\n}\n\nimageDataToDataUrl.reset = get.reset\n","export function invertImageData(imageData: ImageData) {\n const data = imageData.data\n let length = data.length\n for (let i = 0; i < length; i += 4) {\n data[i] = 255 - data[i]!\n data[i + 1] = 255 - data[i + 1]!\n data[i + 2] = 255 - data[i + 2]!\n }\n return imageData\n}\n","const resample32Scratch = {\n data: null as null | Int32Array,\n width: 0,\n height: 0,\n}\n\n/**\n * @internal\n */\ntype Resample32Result = { data: Int32Array; width: number; height: number }\n\n/**\n * @internal\n */\nexport function resample32(\n srcData32: Uint32Array | Int32Array,\n srcW: number,\n srcH: number,\n factor: number,\n): Resample32Result {\n const dstW = Math.max(1, (srcW * factor) | 0)\n const dstH = Math.max(1, (srcH * factor) | 0)\n const dstData = new Int32Array(dstW * dstH)\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW\n const scaleY = srcH / dstH\n\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, (y * scaleY) | 0)\n const srcRowOffset = srcY * srcW\n const dstRowOffset = y * dstW\n\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, (x * scaleX) | 0)\n\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!\n }\n }\n\n resample32Scratch.data = dstData\n resample32Scratch.width = dstW\n resample32Scratch.height = dstH\n\n return resample32Scratch as Resample32Result\n}\n","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer)\n const { data, width, height } = resample32(src32, source.width, source.height, factor)\n\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>\n return new ImageData(uint8ClampedArray, width, height)\n}\n","import type { ImageDataLike } from '../_types'\n\n/**\n * Non destructively resizes the {@link ImageData} buffer to new dimensions, optionally\n * offsetting the original content.\n * This operation creates a new buffer. It does not scale or stretch pixels;\n * instead, it crops or pads the image based on the new dimensions and\n * provides an offset for repositioning.\n *\n * @param current The source {@link ImageDataLike} to resize.\n * @param newWidth The target width in pixels.\n * @param newHeight The target height in pixels.\n * @param offsetX The horizontal offset for placing the\n * original image within the new buffer.\n * @default 0\n * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\n * @default 0\n *\n * @returns A new {@link ImageData} instance with the specified dimensions.\n *\n * @example\n * ```typescript\n * // Centers an 80x80 image in a new 100x100 buffer\n * const resized = resizeImageData(\n * originalData,\n * 100,\n * 100,\n * 10,\n * 10\n * );\n * ```\n */\nexport function resizeImageData(\n current: ImageDataLike,\n newWidth: number,\n newHeight: number,\n offsetX = 0,\n offsetY = 0,\n): ImageData {\n const result = new ImageData(newWidth, newHeight)\n const {\n width: oldW,\n height: oldH,\n data: oldData,\n } = current\n const newData = result.data\n\n // Determine intersection of the old image (at offset) and new canvas bounds\n const x0 = Math.max(0, offsetX)\n const y0 = Math.max(0, offsetY)\n const x1 = Math.min(newWidth, offsetX + oldW)\n const y1 = Math.min(newHeight, offsetY + oldH)\n\n if (x1 <= x0 || y1 <= y0) {\n return result\n }\n\n const rowCount = y1 - y0\n const rowLen = (x1 - x0) * 4\n\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row\n const srcY = dstY - offsetY\n const srcX = x0 - offsetX\n\n const dstStart = (dstY * newWidth + x0) * 4\n const srcStart = (srcY * oldW + srcX) * 4\n\n newData.set(\n oldData.subarray(srcStart, srcStart + rowLen),\n dstStart,\n )\n }\n\n return result\n}\n","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types'\n\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer);\n const decoder = new TextDecoder('latin1');\n const binary = decoder.decode(uint8);\n\n return btoa(binary) as Base64EncodedUInt8Array;\n}\n\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded)\n const bytes = new Uint8ClampedArray(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer),\n }\n}\n\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any\n\n return serializeImageData(imageData) as any\n}\n\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array),\n }\n}\n\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any\n}\n\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any\n return deserializeImageData(serialized) as any\n}\n","import { MaskType } from '../_types'\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(\n target: ImageData,\n source: ImageData,\n x: number,\n y: number,\n sx: number = 0,\n sy: number = 0,\n sw: number = source.width,\n sh: number = source.height,\n mask: Uint8Array | null = null,\n maskType: MaskType = MaskType.BINARY,\n): void {\n const dstW = target.width\n const dstH = target.height\n const dstData = target.data\n const srcW = source.width\n const srcData = source.data\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + sw)\n const y1 = Math.min(dstH, y + sh)\n\n if (x1 <= x0 || y1 <= y0) {\n return\n }\n\n const useMask = !!mask\n const rowCount = y1 - y0\n const rowLenPixels = x1 - x0\n\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row\n const srcY = sy + (dstY - y)\n const srcXBase = sx + (x0 - x)\n\n const dstStart = (dstY * dstW + x0) * 4\n const srcStart = (srcY * srcW + srcXBase) * 4\n\n if (useMask && mask) {\n for (let ix = 0; ix < rowLenPixels; ix++) {\n const mi = srcY * srcW + (srcXBase + ix)\n const alpha = mask[mi]\n\n if (alpha === 0) {\n continue\n }\n\n const di = dstStart + (ix * 4)\n const si = srcStart + (ix * 4)\n\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si]\n dstData[di + 1] = srcData[si + 1]\n dstData[di + 2] = srcData[si + 2]\n dstData[di + 3] = srcData[si + 3]\n } else {\n const a = alpha / 255\n const invA = 1 - a\n\n dstData[di] = srcData[si] * a + dstData[di] * invA\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA\n }\n }\n } else {\n const byteLen = rowLenPixels * 4\n const sub = srcData.subarray(srcStart, srcStart + byteLen)\n dstData.set(sub, dstStart)\n }\n }\n}\n","import type { Rect } from '../_types'\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param imageData - The target {@link ImageData} to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A {@link Rect} object defining the destination region.\n */\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n rect: Rect,\n): void\n/**\n * @param imageData - The target {@link ImageData} to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const { width: dstW, height: dstH, data: dst } = imageData\n\n // 1. Calculate the intersection of the patch and the canvas\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + w)\n const y1 = Math.min(dstH, y + h)\n\n // If the intersection is empty, do nothing\n if (x1 <= x0 || y1 <= y0) return\n\n const rowLen = (x1 - x0) * 4\n const srcCol = x0 - x\n const srcYOffset = y0 - y\n const actualH = y1 - y0\n\n for (let row = 0; row < actualH; row++) {\n // Target index\n const dstStart = ((y0 + row) * dstW + x0) * 4\n\n // Source data index (must account for the offset if the rect was partially OOB)\n const srcRow = srcYOffset + row\n const o = (srcRow * w + srcCol) * 4\n\n dst.set(data.subarray(o, o + rowLen), dstStart)\n }\n}\n","import type { Color32 } from '../_types'\n\n/**\n * Represents an image using a palette-based indexing system.\n * Instead of storing 4 bytes (RGBA) per pixel, this class stores a single index\n * into a color palette. This format is optimized for memory efficiency and\n * high-speed pattern matching or recoloring operations.\n */\nexport class IndexedImage {\n /** The width of the image in pixels. */\n public readonly width: number\n /** The height of the image in pixels. */\n public readonly height: number\n /** Flat array of palette indices. Index = x + (y * width). */\n public readonly data: Int32Array\n /** The palette of unique 32-bit colors (ABGR/RGBA packed) found in the image. */\n public readonly palette: Uint32Array\n /** The specific index in the palette reserved for fully transparent pixels. */\n public readonly transparentPalletIndex: number\n\n /**\n * @param width - Image width.\n * @param height - Image height.\n * @param data - The indexed pixel data.\n * @param palette - The array of packed colors.\n * @param transparentPalletIndex - The index representing alpha 0.\n */\n constructor(\n width: number,\n height: number,\n data: Int32Array,\n palette: Uint32Array,\n transparentPalletIndex: number,\n ) {\n this.width = width\n this.height = height\n this.data = data\n this.palette = palette\n this.transparentPalletIndex = transparentPalletIndex\n }\n\n /**\n * Creates an IndexedImage from standard browser ImageData.\n * @param imageData - The source ImageData to convert.\n * @returns A new IndexedImage instance.\n */\n static fromImageData(imageData: ImageData): IndexedImage {\n return IndexedImage.fromRaw(imageData.data, imageData.width, imageData.height)\n }\n\n /**\n * Creates an IndexedImage from a raw byte buffer and dimensions.\n * Any pixel with an alpha channel of 0 is normalized to the transparent palette index.\n * @param data - Raw RGBA byte data.\n * @param width - Image width.\n * @param height - Image height.\n * @returns A new IndexedImage instance.\n */\n static fromRaw(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n ): IndexedImage {\n const buffer = data.buffer\n const rawData = new Uint32Array(buffer)\n const indexedData = new Int32Array(rawData.length)\n const colorMap = new Map<number, number>()\n const transparentColor = 0\n const transparentPalletIndex = 0\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex)\n\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number\n const alpha = (pixel >>> 24) & 0xFF\n const isTransparent = alpha === 0\n const colorKey = isTransparent ? transparentColor : (pixel >>> 0)\n\n let id = colorMap.get(colorKey)\n\n if (id === undefined) {\n id = colorMap.size\n colorMap.set(colorKey, id)\n }\n\n indexedData[i] = id\n }\n\n const palette = Uint32Array.from(colorMap.keys())\n\n return new IndexedImage(\n width,\n height,\n indexedData,\n palette,\n transparentPalletIndex,\n )\n }\n\n /**\n * Retrieves the 32-bit packed color value at the given coordinates.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @returns The packed color from the palette.\n */\n public getColorAt(x: number, y: number): Color32 {\n const index = x + y * this.width\n const paletteIndex = this.data[index]\n\n return this.palette[paletteIndex] as Color32\n }\n}\n","import type { IndexedImage } from './IndexedImage.ts'\n\n/**\n * Calculates the frequency of each palette index based on the image data.\n * The index of the returned array maps directly to the index of the palette.\n * @param indexedImage - The source image containing data and palette definitions.\n * @returns A typed array where each entry represents the total count of that palette index.\n */\nexport function getIndexedImageColorCounts(indexedImage: IndexedImage): Int32Array {\n const data = indexedImage.data\n const palette = indexedImage.palette\n const frequencies = new Int32Array(palette.length)\n\n for (let i = 0; i < data.length; i++) {\n const colorIndex = data[i]!\n frequencies[colorIndex]++\n }\n\n return frequencies\n}\n","import type { Color32 } from '../_types'\nimport { packColor } from '../color'\nimport type { IndexedImage } from './IndexedImage'\n\n/**\n * Calculates the area-weighted average color of an IndexedImage.\n * This accounts for how often each palette index appears in the pixel data.\n * @param indexedImage - The IndexedImage containing pixel indices and the palette.\n * @param includeTransparent - Whether to include the transparent pixels in the average.\n * @returns The average RGBA color of the image.\n */\nexport function indexedImageToAverageColor(\n indexedImage: IndexedImage,\n includeTransparent: boolean = false,\n): Color32 {\n const { data, palette, transparentPalletIndex } = indexedImage\n const counts = new Uint32Array(palette.length)\n\n // Tally occurrences of each index\n for (let i = 0; i < data.length; i++) {\n const id = data[i]!\n counts[id]!++\n }\n\n let rSum = 0\n let gSum = 0\n let bSum = 0\n let aSum = 0\n let totalWeight = 0\n\n for (let id = 0; id < counts.length; id++) {\n const weight = counts[id]!\n\n if (weight === 0) {\n continue\n }\n\n if (!includeTransparent && id === transparentPalletIndex) {\n continue\n }\n\n const color = palette[id]! >>> 0;\n\n const r = color & 0xFF\n const g = (color >> 8) & 0xFF\n const b = (color >> 16) & 0xFF\n const a = (color >> 24) & 0xFF\n\n rSum += r * weight\n gSum += g * weight\n bSum += b * weight\n aSum += a * weight\n totalWeight += weight\n }\n\n if (totalWeight === 0) {\n return packColor(0, 0, 0, 0)\n }\n\n const r = (rSum / totalWeight) | 0\n const g = (gSum / totalWeight) | 0\n const b = (bSum / totalWeight) | 0\n const a = (aSum / totalWeight) | 0\n\n return packColor(r, g, b, a)\n}\n","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { IndexedImage } from '../index'\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleIndexedImage(\n source: IndexedImage,\n factor: number,\n): IndexedImage {\n\n const { data, width, height } = resample32(\n source.data,\n source.width,\n source.height,\n factor,\n )\n\n return new IndexedImage(\n width,\n height,\n data,\n source.palette,\n source.transparentPalletIndex,\n )\n}\n","import type { IndexedImage } from './IndexedImage'\n\n/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const { width, height, data, palette } = indexedImage\n const result = new ImageData(width, height)\n const data32 = new Uint32Array(result.data.buffer)\n\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i]\n const color = palette[paletteIndex]\n\n data32[i] = color\n }\n\n return result\n}\n","import { fileToImageData } from '../../src'\n\n/**\n * A convenience wrapper that extracts the first {@link File} from an\n * {@link HTMLInputElement} change event and converts it into {@link ImageData}.\n *\n * This function handles the boilerplate of accessing the file list and checking\n * for existence. It is ideal for use directly in an `onchange` event listener.\n *\n * @param event - The change {@link Event} from an `<input type=\"file\">` element.\n *\n * @returns A promise that resolves to {@link ImageData} if a file was successfully\n * processed, or `null` if no file was selected or the input was cleared.\n *\n * @example\n * ```typescript\n * const input = document.querySelector('input[type=\"file\"]');\n *\n * input.addEventListener('change', async (event) => {\n * const imageData = await fileInputChangeToImageData(event);\n *\n * if (imageData) {\n * console.log('Image loaded:', imageData.width, imageData.height);\n * }\n * });\n * ```\n */\nexport async function fileInputChangeToImageData(\n event: Event,\n): Promise<ImageData | null> {\n const target = event.target as HTMLInputElement\n\n const file = target.files?.[0]\n if (!file) return null\n\n return await fileToImageData(file)\n}\n","import { OFFSCREEN_CANVAS_CTX_FAILED } from '../Canvas/_constants'\n\n/**\n * Thrown when the user provides a file that isn't an image.\n */\nexport class UnsupportedFormatError extends Error {\n constructor(mimeType: string) {\n super(`File type ${mimeType} is not a supported image format.`)\n this.name = 'UnsupportedFormatError'\n }\n}\n\n/**\n * Converts a browser {@link File} object into {@link ImageData}.\n * This utility handles the full pipeline of image decoding using hardware-accelerated\n * APIs {@link createImageBitmap} and {@link OffscreenCanvas}. It ensures that underlying\n * resources like `ImageBitmap` are properly closed even if the conversion fails.\n *\n * @param file - The image file to convert. Can be null or undefined.\n * @returns A `Promise` resolving to the pixel data as {@link ImageData},\n * or `null` if no file was provided.\n * @throws {@link UnsupportedFormatError}\n * Thrown if the provided file's MIME type does not start with `image/`.\n * @example\n * ```typescript\n * try {\n * const imageData = await fileToImageData(file);\n * if (imageData) {\n * console.log('Pixels:', imageData.data);\n * }\n * } catch (err) {\n * if (err instanceof UnsupportedFormatError) {\n * // Handle bad file type\n * }\n * }\n * ```\n */\nexport async function fileToImageData(\n file: File | null | undefined,\n): Promise<ImageData | null> {\n if (!file) return null\n\n if (!file.type.startsWith('image/')) {\n throw new UnsupportedFormatError(file.type)\n }\n\n let bitmap: ImageBitmap | null = null\n\n try {\n bitmap = await createImageBitmap(file)\n\n const canvas = new OffscreenCanvas(\n bitmap.width,\n bitmap.height,\n )\n\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error(OFFSCREEN_CANVAS_CTX_FAILED)\n\n ctx.drawImage(\n bitmap,\n 0,\n 0,\n )\n\n return ctx.getImageData(\n 0,\n 0,\n bitmap.width,\n bitmap.height,\n )\n } finally {\n bitmap?.close()\n }\n}\n","// Cache the Promise to prevent race conditions during initialization\nlet formatsPromise: Promise<string[]> | null = null\n\nconst defaultRasterMimes = [\n 'image/png',\n 'image/jpeg',\n 'image/webp',\n 'image/avif',\n 'image/gif',\n 'image/bmp',\n]\n\n/**\n * Probes the browser environment to determine which image MIME types are\n * supported for pixel-level operations.\n * This function performs a one-time check by attempting to convert a\n * {@link OffscreenCanvas} to MIME types. The result is\n * cached to prevent redundant hardware-accelerated operations on\n * subsequent calls.\n * @param rasterMimes List of MIME types to check\n * @default ['image/png',\n * 'image/jpeg',\n * 'image/webp',\n * 'image/avif',\n * 'image/gif',\n * 'image/bmp']\n * @returns A `Promise` resolving to an array of supported MIME\n * types from the `rasterMimes` list.\n * @throws {Error} If the {@link OffscreenCanvas} context cannot be initialized.\n * @example\n * ```typescript\n * const supported = await getSupportedPixelFormats();\n * if (supported.includes('image/avif')) {\n * console.log('High-efficiency formats available');\n * }\n * ```\n */\nexport async function getSupportedPixelFormats(rasterMimes = defaultRasterMimes): Promise<string[]> {\n if (formatsPromise) {\n return formatsPromise\n }\n\n const probeCanvas = async () => {\n const canvas = new OffscreenCanvas(1, 1)\n\n const results = await Promise.all(\n rasterMimes.map(async (mime) => {\n try {\n const blob = await canvas.convertToBlob({\n type: mime,\n })\n\n return blob.type === mime ? mime : null\n } catch {\n return null\n }\n }),\n )\n\n return results.filter((type): type is string => {\n return type !== null\n })\n }\n\n // By chaining .catch here, the microtask guarantees formatsPromise\n // is assigned the promise BEFORE the catch block runs to reset it.\n formatsPromise = probeCanvas().catch((error) => {\n formatsPromise = null\n\n throw error\n })\n\n return formatsPromise\n}\n","import type { AnyMask } from '../index'\n\n/**\n * Creates a new copy of a mask.\n * Uses the underlying buffer's slice method for high-performance memory copying.\n */\nexport function copyMask<T extends AnyMask>(src: T): T {\n // Uint8Array.slice() is highly optimized at the engine level\n return src.slice() as T\n}\n","import type { AlphaMask, BinaryMask } from '../index'\n\n/**\n * Inverts a BinaryMask in-place.\n */\nexport function invertBinaryMask(dst: BinaryMask): void {\n const len = dst.length\n\n for (let i = 0; i < len; i++) {\n dst[i] = dst[i] === 0\n ? 1\n : 0\n }\n}\n\n/**\n * Inverts an AlphaMask in-place.\n */\nexport function invertAlphaMask(dst: AlphaMask): void {\n const len = dst.length\n\n for (let i = 0; i < len; i++) {\n dst[i] = 255 - dst[i]\n }\n}\n","import { type AlphaMask, type AnyMask, type ApplyMaskOptions, MaskType } from '../_types'\n\n/**\n * Merges a source mask into a destination AlphaMask.\n */\nexport function mergeMasks(\n dst: AlphaMask,\n dstWidth: number,\n src: AnyMask,\n opts: ApplyMaskOptions,\n): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n alpha: globalAlpha = 255,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (width <= 0 || height <= 0 || globalAlpha === 0) {\n return\n }\n\n const sPitch = mw ?? width\n const isAlpha = maskType === MaskType.ALPHA\n\n for (let iy = 0; iy < height; iy++) {\n const dy = targetY + iy\n const sy = my + iy\n\n if (dy < 0 || sy < 0) {\n continue\n }\n\n for (let ix = 0; ix < width; ix++) {\n const dx = targetX + ix\n const sx = mx + ix\n\n if (dx < 0 || dx >= dstWidth || sx < 0 || sx >= sPitch) {\n continue\n }\n\n const dIdx = dy * dstWidth + dx\n const sIdx = sy * sPitch + sx\n const mVal = src[sIdx]\n let weight = globalAlpha\n\n if (isAlpha) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n if (effectiveM === 0) {\n dst[dIdx] = 0\n continue\n }\n\n weight = globalAlpha === 255\n ? effectiveM\n : (effectiveM * globalAlpha + 128) >> 8\n } else {\n // Strict Binary 1/0 Logic\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dst[dIdx] = 0\n continue\n }\n\n // If binary hit, weight is just the global alpha\n weight = globalAlpha\n }\n\n if (weight === 0) {\n dst[dIdx] = 0\n continue\n }\n\n const da = dst[dIdx]\n\n if (da === 0) {\n // Already transparent\n } else if (weight === 255) {\n // Identity: keep da\n } else if (da === 255) {\n // Identity: result is weight\n dst[dIdx] = weight\n } else {\n dst[dIdx] = (da * weight + 128) >> 8\n }\n }\n }\n}\n","import type { Color32, Rect } from '../_types'\nimport type { PixelData } from './PixelData'\nimport { fillPixelData } from './fillPixelData'\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(\n dst: PixelData,\n rect?: Partial<Rect>,\n): void {\n fillPixelData(dst, 0 as Color32, rect)\n}\n","import type { Rect } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: PixelData, rect: Rect): Uint32Array\nexport function extractPixelDataBuffer(source: PixelData, x: number, y: number, w: number, h: number): Uint32Array\nexport function extractPixelDataBuffer(\n source: PixelData,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): Uint32Array {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const srcW = source.width\n const srcH = source.height\n const srcData = source.data32\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0)\n }\n\n // Create a new ImageData to get a clean, aligned buffer\n const dstImageData = new ImageData(w, h)\n const dstData = new Uint32Array(dstImageData.data.buffer)\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(srcW, x + w)\n const y1 = Math.min(srcH, y + h)\n\n // Return empty buffer if no intersection\n if (x1 <= x0 || y1 <= y0) {\n return dstData\n }\n\n const copyWidth = x1 - x0\n const copyHeight = y1 - y0\n\n for (let row = 0; row < copyHeight; row++) {\n const srcRow = y0 + row\n const srcStart = srcRow * srcW + x0\n\n const dstRow = (y0 - y) + row\n const dstCol = (x0 - x)\n const dstStart = dstRow * w + dstCol\n\n // Perform the high-speed 32-bit bulk copy\n const chunk = srcData.subarray(srcStart, srcStart + copyWidth)\n dstData.set(chunk, dstStart)\n }\n\n return dstData\n}\n","import type { Rect } from '../_types'\nimport { extractPixelDataBuffer } from './extractPixelDataBuffer'\nimport { PixelData } from './PixelData'\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: PixelData, rect: Rect): PixelData\nexport function extractPixelData(source: PixelData, x: number, y: number, w: number, h: number): PixelData\nexport function extractPixelData(\n source: PixelData,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): PixelData {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const result = new PixelData(new ImageData(w, h))\n\n const buffer = extractPixelDataBuffer(source, x, y, w, h)\n result.data32.set(buffer)\n\n return result\n}\n","import type { PixelData } from './PixelData'\n\nexport function reflectPixelDataHorizontal(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n const halfWidth = Math.floor(width / 2)\n\n for (let y = 0; y < height; y++) {\n const rowOffset = y * width\n\n for (let x = 0; x < halfWidth; x++) {\n const leftIdx = rowOffset + x\n const rightIdx = rowOffset + (width - 1 - x)\n const temp = data[leftIdx]\n\n data[leftIdx] = data[rightIdx]\n data[rightIdx] = temp\n }\n }\n}\n\nexport function reflectPixelDataVertical(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n const halfHeight = Math.floor(height / 2)\n\n for (let y = 0; y < halfHeight; y++) {\n const topRowOffset = y * width\n const bottomRowOffset = (height - 1 - y) * width\n\n for (let x = 0; x < width; x++) {\n const topIdx = topRowOffset + x\n const bottomIdx = bottomRowOffset + x\n const temp = data[topIdx]\n\n data[topIdx] = data[bottomIdx]\n data[bottomIdx] = temp\n }\n }\n}\n","/**\n * Resamples an PixelData by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { PixelData } from '../index'\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(\n pixelData: PixelData,\n factor: number,\n): PixelData {\n const { data, width, height } = resample32(pixelData.data32, pixelData.width, pixelData.height, factor)\n\n return new PixelData(new ImageData(\n new Uint8ClampedArray(data.buffer) as ImageDataArray,\n width,\n height,\n ))\n}\n","import { PixelData } from './PixelData'\n\n/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n\n if (width === height) {\n rotateSquareInPlace(pixelData)\n return\n }\n\n const newWidth = height\n const newHeight = width\n const newData32 = new Uint32Array(data.length)\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const oldIdx = y * width + x\n const newX = height - 1 - y\n const newY = x\n const newIdx = newY * newWidth + newX\n\n newData32[newIdx] = data[oldIdx]\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(\n new Uint8ClampedArray(newData32.buffer),\n newWidth,\n newHeight,\n )\n\n pixelData.set(newImageData)\n}\n\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.width\n const data = pixelData.data32\n\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j\n const right = j * n + (n - 1 - i)\n const bottom = (n - 1 - i) * n + (n - 1 - j)\n const left = (n - 1 - j) * n + i\n\n const temp = data[top]\n data[top] = data[left]\n data[left] = data[bottom]\n data[bottom] = data[right]\n data[right] = temp\n }\n }\n}\n","import type { PixelData } from './PixelData'\nimport { type Rect } from '../_types'\n\n/**\n * Copies a pixel buffer into a specific region of a {@link PixelData} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target {@link PixelData} buffer.\n */\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n rect: Rect,\n): void\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!,\n }\n\n const dstW = target.width\n const dstH = target.height\n const dstData = target.data32\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + w)\n const y1 = Math.min(dstH, y + h)\n\n if (x1 <= x0 || y1 <= y0) {\n return\n }\n\n const rowLen = x1 - x0\n const srcCol = x0 - x\n const srcYOffset = y0 - y\n const actualH = y1 - y0\n\n for (let row = 0; row < actualH; row++) {\n const dstStart = (y0 + row) * dstW + x0\n const srcRow = srcYOffset + row\n const srcStart = srcRow * w + srcCol\n\n dstData.set(data.subarray(srcStart, srcStart + rowLen), dstStart)\n }\n}\n"],"mappings":"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","names":["MaskType","get","boundsOut","r","g","b","a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/_types.ts","../src/color.ts","../src/Internal/resolveClipping.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMask.ts","../src/Rect/trimRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/BlendModes/blend-modes-perfect.ts","../src/BlendModes/toBlendModeIndexAndName.ts","../src/Canvas/_constants.ts","../src/Canvas/PixelCanvas.ts","../src/Canvas/ReusableCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/HistoryManager.ts","../src/History/PixelPatchTiles.ts","../src/History/PixelAccumulator.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyAlphaMask.ts","../src/PixelData/applyBinaryMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyBinaryMask.ts","../src/Rect/getCircleBrushOrPencilBounds.ts","../src/PixelData/applyCircleBrushToPixelData.ts","../src/History/PixelMutator/mutatorApplyCircleBrush.ts","../src/Algorithm/forEachLinePoint.ts","../src/PixelData/blendColorPixelDataAlphaMask.ts","../src/Rect/getCircleBrushOrPencilStrokeBounds.ts","../src/History/PixelMutator/mutatorApplyCircleBrushStroke.ts","../src/PixelData/blendColorPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorApplyCirclePencilStroke.ts","../src/Rect/getRectBrushOrPencilBounds.ts","../src/PixelData/applyRectBrushToPixelData.ts","../src/History/PixelMutator/mutatorApplyRectBrush.ts","../src/Rect/getRectBrushOrPencilStrokeBounds.ts","../src/History/PixelMutator/mutatorApplyRectBrushStroke.ts","../src/History/PixelMutator/mutatorApplyRectPencil.ts","../src/History/PixelMutator/mutatorApplyRectPencilStroke.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorClear.ts","../src/History/PixelMutator/mutatorFill.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyCirclePencil.ts","../src/ImageData/copyImageData.ts","../src/ImageData/ImageDataLike.ts","../src/ImageData/imageDataToAlphaMask.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUInt32Array.ts","../src/ImageData/invertImageData.ts","../src/Internal/resample32.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/uInt32ArrayToImageData.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/applyBinaryMaskToAlphaMask.ts","../src/Mask/copyMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeAlphaMasks.ts","../src/Mask/mergeBinaryMasks.ts","../src/PixelData/PixelData.ts","../src/PixelData/blendPixelDataAlphaMask.ts","../src/PixelData/blendPixelDataBinaryMask.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/PixelBuffer32.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/writePixelDataBuffer.ts"],"sourcesContent":["// @sort-all\nexport * from './_types';\nexport * from './color';\nexport * from './Algorithm/floodFillSelection';\nexport * from './BlendModes/blend-modes-fast';\nexport * from './BlendModes/blend-modes-perfect';\nexport * from './BlendModes/blend-modes';\nexport * from './BlendModes/BlendModeRegistry';\nexport * from './BlendModes/toBlendModeIndexAndName';\nexport * from './Canvas/_constants';\nexport * from './Canvas/PixelCanvas';\nexport * from './Canvas/ReusableCanvas';\nexport * from './Clipboard/getImageDataFromClipboard';\nexport * from './Clipboard/writeImageDataToClipboard';\nexport * from './Clipboard/writeImgBlobToClipboard';\nexport * from './History/HistoryManager';\nexport * from './History/PixelAccumulator';\nexport * from './History/PixelEngineConfig';\nexport * from './History/PixelMutator';\nexport * from './History/PixelPatchTiles';\nexport * from './History/PixelWriter';\nexport * from './History/PixelMutator/mutatorApplyAlphaMask';\nexport * from './History/PixelMutator/mutatorApplyBinaryMask';\nexport * from './History/PixelMutator/mutatorApplyCircleBrush';\nexport * from './History/PixelMutator/mutatorApplyCircleBrushStroke';\nexport * from './History/PixelMutator/mutatorApplyCirclePencil';\nexport * from './History/PixelMutator/mutatorApplyCirclePencilStroke';\nexport * from './History/PixelMutator/mutatorApplyRectPencil';\nexport * from './History/PixelMutator/mutatorApplyRectPencilStroke';\nexport * from './History/PixelMutator/mutatorApplyRectBrush';\nexport * from './History/PixelMutator/mutatorApplyRectBrushStroke';\nexport * from './History/PixelMutator/mutatorBlendColor';\nexport * from './History/PixelMutator/mutatorBlendPixel';\nexport * from './History/PixelMutator/mutatorBlendPixelData';\nexport * from './History/PixelMutator/mutatorClear';\nexport * from './History/PixelMutator/mutatorFill';\nexport * from './History/PixelMutator/mutatorInvert';\nexport * from './ImageData/copyImageData';\nexport * from './ImageData/extractImageDataBuffer';\nexport * from './ImageData/ImageDataLike';\nexport * from './ImageData/imageDataToAlphaMask';\nexport * from './ImageData/imageDataToDataUrl';\nexport * from './ImageData/imageDataToImgBlob';\nexport * from './ImageData/imageDataToUInt32Array';\nexport * from './ImageData/imgBlobToImageData';\nexport * from './ImageData/invertImageData';\nexport * from './ImageData/resampleImageData';\nexport * from './ImageData/resizeImageData';\nexport * from './ImageData/ReusableImageData';\nexport * from './ImageData/serialization';\nexport * from './ImageData/uInt32ArrayToImageData';\nexport * from './ImageData/writeImageData';\nexport * from './ImageData/writeImageDataBuffer';\nexport * from './IndexedImage/getIndexedImageColorCounts';\nexport * from './IndexedImage/IndexedImage';\nexport * from './IndexedImage/indexedImageToAverageColor';\nexport * from './IndexedImage/indexedImageToImageData';\nexport * from './IndexedImage/resampleIndexedImage';\nexport * from './Input/fileInputChangeToImageData';\nexport * from './Input/fileToImageData';\nexport * from './Input/getSupportedRasterFormats';\nexport * from './Mask/applyBinaryMaskToAlphaMask';\nexport * from './Mask/copyMask';\nexport * from './Mask/extractMask';\nexport * from './Mask/invertMask';\nexport * from './Mask/mergeAlphaMasks';\nexport * from './Mask/mergeBinaryMasks';\nexport * from './PixelData/applyAlphaMaskToPixelData';\nexport * from './PixelData/applyBinaryMaskToPixelData';\nexport * from './PixelData/applyCircleBrushToPixelData';\nexport * from './PixelData/PixelData';\nexport * from './PixelData/applyRectBrushToPixelData';\nexport * from './PixelData/blendColorPixelData';\nexport * from './PixelData/blendColorPixelDataAlphaMask';\nexport * from './PixelData/blendColorPixelDataBinaryMask';\nexport * from './PixelData/blendPixelData';\nexport * from './PixelData/blendPixelDataAlphaMask';\nexport * from './PixelData/blendPixelDataBinaryMask';\nexport * from './PixelData/clearPixelData';\nexport * from './PixelData/extractPixelData';\nexport * from './PixelData/extractPixelDataBuffer';\nexport * from './PixelData/fillPixelData';\nexport * from './PixelData/invertPixelData';\nexport * from './PixelData/PixelBuffer32';\nexport * from './PixelData/pixelDataToAlphaMask';\nexport * from './PixelData/reflectPixelData';\nexport * from './PixelData/resamplePixelData';\nexport * from './PixelData/rotatePixelData';\nexport * from './PixelData/writePixelDataBuffer';\nexport * from './Rect/getCircleBrushOrPencilBounds';\nexport * from './Rect/getCircleBrushOrPencilStrokeBounds';\nexport * from './Rect/getRectBrushOrPencilBounds';\nexport * from './Rect/getRectBrushOrPencilStrokeBounds';\nexport * from './Rect/trimRectBounds';\nexport * from './Algorithm/forEachLinePoint';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQHNvcnQtYWxsXG5leHBvcnQgKiBmcm9tICcuL190eXBlcydcbmV4cG9ydCAqIGZyb20gJy4vY29sb3InXG5cbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2Zsb29kRmlsbFNlbGVjdGlvbidcblxuZXhwb3J0ICogZnJvbSAnLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLWZhc3QnXG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRNb2Rlcy9ibGVuZC1tb2RlcydcbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRNb2Rlcy9CbGVuZE1vZGVSZWdpc3RyeSdcbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRNb2Rlcy90b0JsZW5kTW9kZUluZGV4QW5kTmFtZSdcblxuZXhwb3J0ICogZnJvbSAnLi9DYW52YXMvX2NvbnN0YW50cydcbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL1BpeGVsQ2FudmFzJ1xuZXhwb3J0ICogZnJvbSAnLi9DYW52YXMvUmV1c2FibGVDYW52YXMnXG5cbmV4cG9ydCAqIGZyb20gJy4vQ2xpcGJvYXJkL2dldEltYWdlRGF0YUZyb21DbGlwYm9hcmQnXG5leHBvcnQgKiBmcm9tICcuL0NsaXBib2FyZC93cml0ZUltYWdlRGF0YVRvQ2xpcGJvYXJkJ1xuZXhwb3J0ICogZnJvbSAnLi9DbGlwYm9hcmQvd3JpdGVJbWdCbG9iVG9DbGlwYm9hcmQnXG5cbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9IaXN0b3J5TWFuYWdlcidcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbEFjY3VtdWxhdG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsRW5naW5lQ29uZmlnJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvcidcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbFBhdGNoVGlsZXMnXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxXcml0ZXInXG5cbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5QWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlCaW5hcnlNYXNrJ1xuXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZUJydXNoJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSdcblxuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlDaXJjbGVQZW5jaWwnXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZVBlbmNpbFN0cm9rZSdcblxuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlSZWN0UGVuY2lsJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlSZWN0UGVuY2lsU3Ryb2tlJ1xuXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RCcnVzaCdcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5UmVjdEJydXNoU3Ryb2tlJ1xuXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCdcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQ2xlYXInXG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JGaWxsJ1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9ySW52ZXJ0J1xuXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9jb3B5SW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcidcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL0ltYWdlRGF0YUxpa2UnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbWFnZURhdGFUb0FscGhhTWFzaydcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvRGF0YVVybCdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvSW1nQmxvYidcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvVUludDMyQXJyYXknXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbWdCbG9iVG9JbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbnZlcnRJbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9yZXNhbXBsZUltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3Jlc2l6ZUltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL1JldXNhYmxlSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvc2VyaWFsaXphdGlvbidcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3VJbnQzMkFycmF5VG9JbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS93cml0ZUltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3dyaXRlSW1hZ2VEYXRhQnVmZmVyJ1xuXG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9nZXRJbmRleGVkSW1hZ2VDb2xvckNvdW50cydcbmV4cG9ydCAqIGZyb20gJy4vSW5kZXhlZEltYWdlL0luZGV4ZWRJbWFnZSdcbmV4cG9ydCAqIGZyb20gJy4vSW5kZXhlZEltYWdlL2luZGV4ZWRJbWFnZVRvQXZlcmFnZUNvbG9yJ1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvaW5kZXhlZEltYWdlVG9JbWFnZURhdGEnXG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9yZXNhbXBsZUluZGV4ZWRJbWFnZSdcblxuZXhwb3J0ICogZnJvbSAnLi9JbnB1dC9maWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXQvZmlsZVRvSW1hZ2VEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dC9nZXRTdXBwb3J0ZWRSYXN0ZXJGb3JtYXRzJ1xuXG5leHBvcnQgKiBmcm9tICcuL01hc2svYXBwbHlCaW5hcnlNYXNrVG9BbHBoYU1hc2snXG5leHBvcnQgKiBmcm9tICcuL01hc2svY29weU1hc2snXG5leHBvcnQgKiBmcm9tICcuL01hc2svZXh0cmFjdE1hc2snXG5leHBvcnQgKiBmcm9tICcuL01hc2svaW52ZXJ0TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9tZXJnZUFscGhhTWFza3MnXG5leHBvcnQgKiBmcm9tICcuL01hc2svbWVyZ2VCaW5hcnlNYXNrcydcblxuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2FwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvUGl4ZWxEYXRhJ1xuXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzaydcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFBbHBoYU1hc2snXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2snXG5cbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2NsZWFyUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvZXh0cmFjdFBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2V4dHJhY3RQaXhlbERhdGFCdWZmZXInXG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvaW52ZXJ0UGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvUGl4ZWxCdWZmZXIzMidcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3BpeGVsRGF0YVRvQWxwaGFNYXNrJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvcmVmbGVjdFBpeGVsRGF0YSdcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3Jlc2FtcGxlUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvcm90YXRlUGl4ZWxEYXRhJ1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvd3JpdGVQaXhlbERhdGFCdWZmZXInXG5cbmV4cG9ydCAqIGZyb20gJy4vUmVjdC9nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzJ1xuZXhwb3J0ICogZnJvbSAnLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5leHBvcnQgKiBmcm9tICcuL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMnXG5leHBvcnQgKiBmcm9tICcuL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5leHBvcnQgKiBmcm9tICcuL1JlY3QvdHJpbVJlY3RCb3VuZHMnXG5cbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/** ALL values are 0-255 (including alpha which in CSS is 0-1) */\nexport type RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\n/** Represents a 32-bit color in 0xAABBGGRR (Little endian) */\nexport type Color32 = number & {\n readonly __brandColor32: unique symbol;\n};\n\n/**\n * A function that defines how to combine a source color with a destination color.\n * @param src - The incoming color (source).\n * @param dst - The existing color in the buffer (destination).\n * @returns The resulting 32-bit color to be written to the buffer.\n */\nexport type BlendColor32 = {\n (src: Color32, dst: Color32): Color32;\n isOverwrite?: true;\n};\nexport type ImageDataLike = {\n width: number;\n height: number;\n data: Uint8ClampedArray<ArrayBufferLike>;\n};\nexport type ImageDataLikeConstructor<T extends ImageDataLike = ImageDataLike> = {\n new (data: Uint8ClampedArray, width: number, height: number): T;\n};\nexport type SerializedImageData = {\n width: number;\n height: number;\n data: string;\n};\nexport type Base64EncodedUInt8Array = string & {\n readonly __brandBase64UInt8Array: unique symbol;\n};\n\n/** Rectangle definition */\nexport type Rect = {\n x: number;\n y: number;\n w: number;\n h: number;\n};\n\n/**\n * Defines how mask values should be interpreted during a draw operation.\n */\nexport enum MaskType {\n /**\n * Values are treated as alpha weights.\n * 0 is skipped, values > 0 are processed.\n */\n ALPHA,\n /**\n * Values are treated as on/off.\n * 0 is fully transparent (skipped), any other value is fully opaque.\n */\n BINARY,\n}\n\n/** Strictly 0 or 1 */\nexport type BinaryMask = Uint8Array & {\n readonly __brand: 'Binary';\n};\n/** Strictly 0-255 */\nexport type AlphaMask = Uint8Array & {\n readonly __brand: 'Alpha';\n};\nexport type AnyMask = BinaryMask | AlphaMask;\n\n/**\n * Configuration for pixel manipulation operations.\n * Designed to be used by spreading a Rect object ({x, y, w, h}) directly.\n */\nexport interface PixelRect {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number;\n\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number;\n\n /**\n * The width of the region in the destination buffer.\n * @default Source width.\n */\n w?: number;\n\n /**\n * The height of the region in the destination buffer.\n * @default Source height.\n */\n h?: number;\n}\nexport interface MaskOffset {\n /**\n * X offset into the mask buffer.\n * @default 0\n */\n mx?: number;\n\n /**\n * Y offset into the mask buffer.\n * @default 0\n */\n my?: number;\n}\nexport interface MaskOffsetWidth {\n /**\n * Mask width.\n * @default value of `w`\n */\n mw?: number;\n}\nexport interface InvertMask {\n /**\n * If true the inverse of the mask will be applied\n * @default false\n */\n invertMask?: boolean;\n}\nexport interface Alpha {\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number;\n}\nexport interface ApplyMaskToPixelDataOptions extends PixelRect, Alpha, MaskOffsetWidth, MaskOffset, InvertMask {}\nexport interface MergeAlphaMasksOptions extends PixelRect, Alpha, MaskOffset, InvertMask {}\nexport interface PixelMutateOptions extends PixelRect, MaskOffset, MaskOffsetWidth, InvertMask {\n /** An optional mask to restrict where pixels are mutated. */\n mask?: BinaryMask | null;\n}\n\n/**\n * Configuration for blitting (copying/blending) one image into another.\n */\n\nexport interface BasePixelBlendOptions {\n /**\n * The source rectangle x-coordinate\n * @default 0\n */\n sx?: number;\n\n /**\n * The source rectangle y-coordinate\n * @default 0\n */\n sy?: number;\n\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface PixelBlendOptions extends PixelRect, Alpha, BasePixelBlendOptions {}\nexport interface PixelBlendMaskOptions extends PixelRect, Alpha, MaskOffsetWidth, MaskOffset, InvertMask, BasePixelBlendOptions {}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelRect, Alpha {\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface ColorBlendMaskOptions extends ColorBlendOptions, MaskOffset, MaskOffsetWidth, InvertMask {}\nexport type SelectionRect = Rect & ({\n mask: Uint8Array;\n maskType: MaskType;\n} | {\n mask?: null;\n maskType?: null;\n});\nexport type HistoryMutator<T extends {}, D extends {}> = (writer: PixelWriter<any>, deps?: Partial<D>) => T;\nexport interface IPixelData {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxXcml0ZXIsIHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi9pbmRleCdcblxuLyoqIEFMTCB2YWx1ZXMgYXJlIDAtMjU1IChpbmNsdWRpbmcgYWxwaGEgd2hpY2ggaW4gQ1NTIGlzIDAtMSkgKi9cbmV4cG9ydCB0eXBlIFJHQkEgPSB7IHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIsIGE6IG51bWJlciB9XG5cbi8qKiBSZXByZXNlbnRzIGEgMzItYml0IGNvbG9yIGluIDB4QUFCQkdHUlIgKExpdHRsZSBlbmRpYW4pICovXG5leHBvcnQgdHlwZSBDb2xvcjMyID0gbnVtYmVyICYgeyByZWFkb25seSBfX2JyYW5kQ29sb3IzMjogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIGNvbWJpbmUgYSBzb3VyY2UgY29sb3Igd2l0aCBhIGRlc3RpbmF0aW9uIGNvbG9yLlxuICogQHBhcmFtIHNyYyAtIFRoZSBpbmNvbWluZyBjb2xvciAoc291cmNlKS5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZXhpc3RpbmcgY29sb3IgaW4gdGhlIGJ1ZmZlciAoZGVzdGluYXRpb24pLlxuICogQHJldHVybnMgVGhlIHJlc3VsdGluZyAzMi1iaXQgY29sb3IgdG8gYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyLlxuICovXG5leHBvcnQgdHlwZSBCbGVuZENvbG9yMzIgPSB7XG4gIChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMik6IENvbG9yMzIsXG4gIGlzT3ZlcndyaXRlPzogdHJ1ZVxufVxuXG5leHBvcnQgdHlwZSBJbWFnZURhdGFMaWtlID0ge1xuICB3aWR0aDogbnVtYmVyXG4gIGhlaWdodDogbnVtYmVyXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyTGlrZT5cbn1cblxuZXhwb3J0IHR5cGUgSW1hZ2VEYXRhTGlrZUNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlID0gSW1hZ2VEYXRhTGlrZT4gPSB7XG4gIG5ldyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBUXG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRJbWFnZURhdGEgPSB7XG4gIHdpZHRoOiBudW1iZXJcbiAgaGVpZ2h0OiBudW1iZXJcbiAgZGF0YTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEJhc2U2NEVuY29kZWRVSW50OEFycmF5ID0gc3RyaW5nICYgeyByZWFkb25seSBfX2JyYW5kQmFzZTY0VUludDhBcnJheTogdW5pcXVlIHN5bWJvbCB9XG5cbi8qKiBSZWN0YW5nbGUgZGVmaW5pdGlvbiAqL1xuZXhwb3J0IHR5cGUgUmVjdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICB3OiBudW1iZXJcbiAgaDogbnVtYmVyXG59XG5cbi8qKlxuICogRGVmaW5lcyBob3cgbWFzayB2YWx1ZXMgc2hvdWxkIGJlIGludGVycHJldGVkIGR1cmluZyBhIGRyYXcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBNYXNrVHlwZSB7XG4gIC8qKlxuICAgKiBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYWxwaGEgd2VpZ2h0cy5cbiAgICogMCBpcyBza2lwcGVkLCB2YWx1ZXMgPiAwIGFyZSBwcm9jZXNzZWQuXG4gICAqL1xuICBBTFBIQSxcbiAgLyoqXG4gICAqICBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgb24vb2ZmLlxuICAgKiAwIGlzIGZ1bGx5IHRyYW5zcGFyZW50IChza2lwcGVkKSwgYW55IG90aGVyIHZhbHVlIGlzIGZ1bGx5IG9wYXF1ZS5cbiAgICovXG4gIEJJTkFSWVxufVxuXG4vKiogU3RyaWN0bHkgMCBvciAxICovXG5leHBvcnQgdHlwZSBCaW5hcnlNYXNrID0gVWludDhBcnJheSAmIHsgcmVhZG9ubHkgX19icmFuZDogJ0JpbmFyeScgfVxuLyoqIFN0cmljdGx5IDAtMjU1ICovXG5leHBvcnQgdHlwZSBBbHBoYU1hc2sgPSBVaW50OEFycmF5ICYgeyByZWFkb25seSBfX2JyYW5kOiAnQWxwaGEnIH1cblxuZXhwb3J0IHR5cGUgQW55TWFzayA9IEJpbmFyeU1hc2sgfCBBbHBoYU1hc2tcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBwaXhlbCBtYW5pcHVsYXRpb24gb3BlcmF0aW9ucy5cbiAqIERlc2lnbmVkIHRvIGJlIHVzZWQgYnkgc3ByZWFkaW5nIGEgUmVjdCBvYmplY3QgKHt4LCB5LCB3LCBofSkgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxSZWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgeD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgc3RhcnRpbmcgWSBjb29yZGluYXRlIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHk/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgU291cmNlIHdpZHRoLlxuICAgKi9cbiAgdz86IG51bWJlclxuXG4gIC8qKlxuICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgU291cmNlIGhlaWdodC5cbiAgICovXG4gIGg/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXNrT2Zmc2V0IHtcbiAgLyoqXG4gICAqIFggb2Zmc2V0IGludG8gdGhlIG1hc2sgYnVmZmVyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBteD86IG51bWJlclxuXG4gIC8qKlxuICAgKiBZIG9mZnNldCBpbnRvIHRoZSBtYXNrIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgbXk/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXNrT2Zmc2V0V2lkdGgge1xuICAvKipcbiAgICogTWFzayB3aWR0aC5cbiAgICogQGRlZmF1bHQgdmFsdWUgb2YgYHdgXG4gICAqL1xuICBtdz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludmVydE1hc2sge1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlIHRoZSBpbnZlcnNlIG9mIHRoZSBtYXNrIHdpbGwgYmUgYXBwbGllZFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgaW52ZXJ0TWFzaz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBbHBoYSB7XG4gIC8qKlxuICAgKiBPdmVyYWxsIGxheWVyIG9wYWNpdHkgMC0yNTUuXG4gICAqIEBkZWZhdWx0IDI1NVxuICAgKi9cbiAgYWxwaGE/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0V2lkdGgsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lcmdlQWxwaGFNYXNrc09wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrIHtcblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsTXV0YXRlT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgTWFza09mZnNldCwgTWFza09mZnNldFdpZHRoLCBJbnZlcnRNYXNrIHtcbiAgLyoqIEFuIG9wdGlvbmFsIG1hc2sgdG8gcmVzdHJpY3Qgd2hlcmUgcGl4ZWxzIGFyZSBtdXRhdGVkLiAqL1xuICBtYXNrPzogQmluYXJ5TWFzayB8IG51bGxcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBibGl0dGluZyAoY29weWluZy9ibGVuZGluZykgb25lIGltYWdlIGludG8gYW5vdGhlci5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VQaXhlbEJsZW5kT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHJlY3RhbmdsZSB4LWNvb3JkaW5hdGVcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc3g/OiBudW1iZXJcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSByZWN0YW5nbGUgeS1jb29yZGluYXRlXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHN5PzogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSBibGVuZGluZyBhbGdvcml0aG0gdG8gdXNlIGZvciBibGVuZGluZyBwaXhlbHMuXG4gICAqIEBkZWZhdWx0IHtAbGluayBzb3VyY2VPdmVyUGVyZmVjdH1cbiAgICovXG4gIGJsZW5kRm4/OiBCbGVuZENvbG9yMzJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXhlbEJsZW5kT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgQWxwaGEsIEJhc2VQaXhlbEJsZW5kT3B0aW9ucyB7XG5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXhlbEJsZW5kTWFza09wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhLCBNYXNrT2Zmc2V0V2lkdGgsIE1hc2tPZmZzZXQsIEludmVydE1hc2ssIEJhc2VQaXhlbEJsZW5kT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3Igb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgY29sb3IgYmxlbmRpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29sb3JCbGVuZE9wdGlvbnMgZXh0ZW5kcyBQaXhlbFJlY3QsIEFscGhhIHtcbiAgLyoqXG4gICAqIFRoZSBibGVuZGluZyBhbGdvcml0aG0gdG8gdXNlIGZvciBibGVuZGluZyBwaXhlbHMuXG4gICAqIEBkZWZhdWx0IHtAbGluayBzb3VyY2VPdmVyUGVyZmVjdH1cbiAgICovXG4gIGJsZW5kRm4/OiBCbGVuZENvbG9yMzJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xvckJsZW5kTWFza09wdGlvbnMgZXh0ZW5kcyBDb2xvckJsZW5kT3B0aW9ucywgTWFza09mZnNldCwgTWFza09mZnNldFdpZHRoLCBJbnZlcnRNYXNrIHtcbn1cblxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uUmVjdCA9IFJlY3QgJiAoe1xuICBtYXNrOiBVaW50OEFycmF5LFxuICBtYXNrVHlwZTogTWFza1R5cGUsXG59IHwge1xuICBtYXNrPzogbnVsbFxuICBtYXNrVHlwZT86IG51bGwsXG59KVxuXG5leHBvcnQgdHlwZSBIaXN0b3J5TXV0YXRvcjxUIGV4dGVuZHMge30sIEQgZXh0ZW5kcyB7fT4gPSAod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzPzogUGFydGlhbDxEPikgPT4gVFxuXG5leHBvcnQgaW50ZXJmYWNlIElQaXhlbERhdGEge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5XG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXJcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXJcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from './_types';\n\n/**\n * Packs RGBA into a 32-bit integer compatible with\n * Little-Endian Uint32Array views on ImageData.\n */\nexport function packColor(r: number, g: number, b: number, a: number): Color32 {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n}\nexport function packRGBA({\n r,\n g,\n b,\n a\n}: RGBA): Color32 {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n}\nexport const unpackRed = (packed: Color32): number => packed >>> 0 & 0xFF;\nexport const unpackGreen = (packed: Color32): number => packed >>> 8 & 0xFF;\nexport const unpackBlue = (packed: Color32): number => packed >>> 16 & 0xFF;\nexport const unpackAlpha = (packed: Color32): number => packed >>> 24 & 0xFF;\nexport function unpackColor(packed: Color32): RGBA {\n return {\n r: packed >>> 0 & 0xFF,\n g: packed >>> 8 & 0xFF,\n b: packed >>> 16 & 0xFF,\n a: packed >>> 24 & 0xFF\n };\n}\nconst SCRATCH_RGBA: RGBA = {\n r: 0,\n g: 0,\n b: 0,\n a: 0\n};\n\n// uses a scratch arg for memory perf. be careful about re-use.\nexport function unpackColorTo(packed: Color32, scratch = SCRATCH_RGBA): RGBA {\n scratch.r = packed >>> 0 & 0xFF;\n scratch.g = packed >>> 8 & 0xFF;\n scratch.b = packed >>> 16 & 0xFF;\n scratch.a = packed >>> 24 & 0xFF;\n return scratch;\n}\nexport function colorDistance(a: Color32, b: Color32): number {\n const dr = (a & 0xFF) - (b & 0xFF);\n const dg = (a >>> 8 & 0xFF) - (b >>> 8 & 0xFF);\n const db = (a >>> 16 & 0xFF) - (b >>> 16 & 0xFF);\n const da = (a >>> 24 & 0xFF) - (b >>> 24 & 0xFF);\n return dr * dr + dg * dg + db * db + da * da;\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using a floating-point weight.\n * * This is the preferred method for UI animations or scenarios where high\n * precision is required. It uses the standard `a + t * (b - a)` formula\n * for each channel.\n * @param a - The starting color as a 32-bit integer (AABBGGRR).\n * @param b - The target color as a 32-bit integer (AABBGGRR).\n * @param t - The interpolation factor between 0.0 and 1.0.\n * @returns The interpolated 32-bit color.\n */\nexport function lerpColor32(a: Color32, b: Color32, t: number): Color32 {\n const r = (a & 0xFF) + t * ((b & 0xFF) - (a & 0xFF));\n const g = (a >>> 8 & 0xFF) + t * ((b >>> 8 & 0xFF) - (a >>> 8 & 0xFF));\n const b_ = (a >>> 16 & 0xFF) + t * ((b >>> 16 & 0xFF) - (a >>> 16 & 0xFF));\n const a_ = (a >>> 24 & 0xFF) + t * ((b >>> 24 & 0xFF) - (a >>> 24 & 0xFF));\n return (a_ << 24 | b_ << 16 | g << 8 | r) >>> 0 as Color32;\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using integer fixed-point math.\n * Highly optimized for image processing and real-time blitting. It processes\n * channels in parallel using bitmasks (RB and GA pairs).\n * **Note:** Subject to a 1-bit drift (rounding down) due to fast bit-shift division.\n * @param src - The source (foreground) color as a 32-bit integer.\n * @param dst - The destination (background) color as a 32-bit integer.\n * @param w - The blend weight as a byte value from 0 to 255. Where 0 is 100% dst and 255 is 100% src\n * @returns The blended 32-bit color.\n */\nexport function lerpColor32Fast(src: Color32, dst: Color32, w: number): Color32 {\n const invA = 255 - w;\n\n // Masking Red and Blue: 0x00FF00FF\n // We process R and B in one go, then shift back down\n const rb = (src & 0x00FF00FF) * w + (dst & 0x00FF00FF) * invA >>> 8 & 0x00FF00FF;\n\n // Masking Green and Alpha: 0xFF00FF00\n // We shift down first to avoid overflow, then shift back up\n const ga = (src >>> 8 & 0x00FF00FF) * w + (dst >>> 8 & 0x00FF00FF) * invA >>> 8 & 0x00FF00FF;\n return (rb | ga << 8) >>> 0 as Color32;\n}\n\n// Convert 0xAABBGGRR to #RRGGBBAA\nexport function color32ToHex(color: Color32): string {\n const r = (color & 0xFF).toString(16).padStart(2, '0');\n const g = (color >>> 8 & 0xFF).toString(16).padStart(2, '0');\n const b = (color >>> 16 & 0xFF).toString(16).padStart(2, '0');\n const a = (color >>> 24 & 0xFF).toString(16).padStart(2, '0');\n return `#${r}${g}${b}${a}`;\n}\n\n/**\n * Converts a 32-bit integer (0xAABBGGRR) to a CSS rgba() string.\n * Example: 0xFF0000FF -> \"rgba(255,0,0,1)\"\n */\nexport function color32ToCssRGBA(color: Color32): string {\n const r = color & 0xFF;\n const g = color >>> 8 & 0xFF;\n const b = color >>> 16 & 0xFF;\n const a = color >>> 24 & 0xFF;\n const alpha = Number((a / 255).toFixed(3));\n return `rgba(${r},${g},${b},${alpha})`;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBSR0JBIH0gZnJvbSAnLi9fdHlwZXMnXG5cbi8qKlxuICogUGFja3MgUkdCQSBpbnRvIGEgMzItYml0IGludGVnZXIgY29tcGF0aWJsZSB3aXRoXG4gKiBMaXR0bGUtRW5kaWFuIFVpbnQzMkFycmF5IHZpZXdzIG9uIEltYWdlRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2tDb2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIpOiBDb2xvcjMyIHtcbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhY2tSR0JBKHsgciwgZywgYiwgYSB9OiBSR0JBKTogQ29sb3IzMiB7XG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCB1bnBhY2tSZWQgPSAocGFja2VkOiBDb2xvcjMyKTogbnVtYmVyID0+IChwYWNrZWQgPj4+IDApICYgMHhGRlxuZXhwb3J0IGNvbnN0IHVucGFja0dyZWVuID0gKHBhY2tlZDogQ29sb3IzMik6IG51bWJlciA9PiAocGFja2VkID4+PiA4KSAmIDB4RkZcbmV4cG9ydCBjb25zdCB1bnBhY2tCbHVlID0gKHBhY2tlZDogQ29sb3IzMik6IG51bWJlciA9PiAocGFja2VkID4+PiAxNikgJiAweEZGXG5leHBvcnQgY29uc3QgdW5wYWNrQWxwaGEgPSAocGFja2VkOiBDb2xvcjMyKTogbnVtYmVyID0+IChwYWNrZWQgPj4+IDI0KSAmIDB4RkZcblxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja0NvbG9yKHBhY2tlZDogQ29sb3IzMik6IFJHQkEge1xuICByZXR1cm4ge1xuICAgIHI6IChwYWNrZWQgPj4+IDApICYgMHhGRixcbiAgICBnOiAocGFja2VkID4+PiA4KSAmIDB4RkYsXG4gICAgYjogKHBhY2tlZCA+Pj4gMTYpICYgMHhGRixcbiAgICBhOiAocGFja2VkID4+PiAyNCkgJiAweEZGLFxuICB9XG59XG5cbmNvbnN0IFNDUkFUQ0hfUkdCQTogUkdCQSA9IHsgcjogMCwgZzogMCwgYjogMCwgYTogMCB9XG5cbi8vIHVzZXMgYSBzY3JhdGNoIGFyZyBmb3IgbWVtb3J5IHBlcmYuIGJlIGNhcmVmdWwgYWJvdXQgcmUtdXNlLlxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja0NvbG9yVG8ocGFja2VkOiBDb2xvcjMyLCBzY3JhdGNoID0gU0NSQVRDSF9SR0JBKTogUkdCQSB7XG4gIHNjcmF0Y2guciA9IChwYWNrZWQgPj4+IDApICYgMHhGRlxuICBzY3JhdGNoLmcgPSAocGFja2VkID4+PiA4KSAmIDB4RkZcbiAgc2NyYXRjaC5iID0gKHBhY2tlZCA+Pj4gMTYpICYgMHhGRlxuICBzY3JhdGNoLmEgPSAocGFja2VkID4+PiAyNCkgJiAweEZGXG4gIHJldHVybiBzY3JhdGNoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckRpc3RhbmNlKGE6IENvbG9yMzIsIGI6IENvbG9yMzIpOiBudW1iZXIge1xuICBjb25zdCBkciA9IChhICYgMHhGRikgLSAoYiAmIDB4RkYpXG4gIGNvbnN0IGRnID0gKChhID4+PiA4KSAmIDB4RkYpIC0gKChiID4+PiA4KSAmIDB4RkYpXG4gIGNvbnN0IGRiID0gKChhID4+PiAxNikgJiAweEZGKSAtICgoYiA+Pj4gMTYpICYgMHhGRilcbiAgY29uc3QgZGEgPSAoKGEgPj4+IDI0KSAmIDB4RkYpIC0gKChiID4+PiAyNCkgJiAweEZGKVxuICByZXR1cm4gZHIgKiBkciArIGRnICogZGcgKyBkYiAqIGRiICsgZGEgKiBkYVxufVxuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHR3byAzMi1iaXQgY29sb3JzIHVzaW5nIGEgZmxvYXRpbmctcG9pbnQgd2VpZ2h0LlxuICogKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBVSSBhbmltYXRpb25zIG9yIHNjZW5hcmlvcyB3aGVyZSBoaWdoXG4gKiBwcmVjaXNpb24gaXMgcmVxdWlyZWQuIEl0IHVzZXMgdGhlIHN0YW5kYXJkIGBhICsgdCAqIChiIC0gYSlgIGZvcm11bGFcbiAqIGZvciBlYWNoIGNoYW5uZWwuXG4gKiBAcGFyYW0gYSAtIFRoZSBzdGFydGluZyBjb2xvciBhcyBhIDMyLWJpdCBpbnRlZ2VyIChBQUJCR0dSUikuXG4gKiBAcGFyYW0gYiAtIFRoZSB0YXJnZXQgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlciAoQUFCQkdHUlIpLlxuICogQHBhcmFtIHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEByZXR1cm5zIFRoZSBpbnRlcnBvbGF0ZWQgMzItYml0IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVycENvbG9yMzIoYTogQ29sb3IzMiwgYjogQ29sb3IzMiwgdDogbnVtYmVyKTogQ29sb3IzMiB7XG4gIGNvbnN0IHIgPSAoYSAmIDB4RkYpICsgdCAqICgoYiAmIDB4RkYpIC0gKGEgJiAweEZGKSlcbiAgY29uc3QgZyA9ICgoYSA+Pj4gOCkgJiAweEZGKSArIHQgKiAoKChiID4+PiA4KSAmIDB4RkYpIC0gKChhID4+PiA4KSAmIDB4RkYpKVxuICBjb25zdCBiXyA9ICgoYSA+Pj4gMTYpICYgMHhGRikgKyB0ICogKCgoYiA+Pj4gMTYpICYgMHhGRikgLSAoKGEgPj4+IDE2KSAmIDB4RkYpKVxuICBjb25zdCBhXyA9ICgoYSA+Pj4gMjQpICYgMHhGRikgKyB0ICogKCgoYiA+Pj4gMjQpICYgMHhGRikgLSAoKGEgPj4+IDI0KSAmIDB4RkYpKVxuXG4gIHJldHVybiAoKGFfIDw8IDI0KSB8IChiXyA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqXG4gKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gMzItYml0IGNvbG9ycyB1c2luZyBpbnRlZ2VyIGZpeGVkLXBvaW50IG1hdGguXG4gKiBIaWdobHkgb3B0aW1pemVkIGZvciBpbWFnZSBwcm9jZXNzaW5nIGFuZCByZWFsLXRpbWUgYmxpdHRpbmcuIEl0IHByb2Nlc3Nlc1xuICogY2hhbm5lbHMgaW4gcGFyYWxsZWwgdXNpbmcgYml0bWFza3MgKFJCIGFuZCBHQSBwYWlycykuXG4gKiAqKk5vdGU6KiogU3ViamVjdCB0byBhIDEtYml0IGRyaWZ0IChyb3VuZGluZyBkb3duKSBkdWUgdG8gZmFzdCBiaXQtc2hpZnQgZGl2aXNpb24uXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSAoZm9yZWdyb3VuZCkgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlci5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZGVzdGluYXRpb24gKGJhY2tncm91bmQpIGNvbG9yIGFzIGEgMzItYml0IGludGVnZXIuXG4gKiBAcGFyYW0gdyAtIFRoZSBibGVuZCB3ZWlnaHQgYXMgYSBieXRlIHZhbHVlIGZyb20gMCB0byAyNTUuIFdoZXJlIDAgaXMgMTAwJSBkc3QgYW5kIDI1NSBpcyAxMDAlIHNyY1xuICogQHJldHVybnMgVGhlIGJsZW5kZWQgMzItYml0IGNvbG9yLlxuICovZXhwb3J0IGZ1bmN0aW9uIGxlcnBDb2xvcjMyRmFzdChzcmM6IENvbG9yMzIsIGRzdDogQ29sb3IzMiwgdzogbnVtYmVyKTogQ29sb3IzMiB7XG4gIGNvbnN0IGludkEgPSAyNTUgLSB3XG5cbiAgLy8gTWFza2luZyBSZWQgYW5kIEJsdWU6IDB4MDBGRjAwRkZcbiAgLy8gV2UgcHJvY2VzcyBSIGFuZCBCIGluIG9uZSBnbywgdGhlbiBzaGlmdCBiYWNrIGRvd25cbiAgY29uc3QgcmIgPSAoKChzcmMgJiAweDAwRkYwMEZGKSAqIHcgKyAoZHN0ICYgMHgwMEZGMDBGRikgKiBpbnZBKSA+Pj4gOCkgJiAweDAwRkYwMEZGXG5cbiAgLy8gTWFza2luZyBHcmVlbiBhbmQgQWxwaGE6IDB4RkYwMEZGMDBcbiAgLy8gV2Ugc2hpZnQgZG93biBmaXJzdCB0byBhdm9pZCBvdmVyZmxvdywgdGhlbiBzaGlmdCBiYWNrIHVwXG4gIGNvbnN0IGdhID0gKCgoKHNyYyA+Pj4gOCkgJiAweDAwRkYwMEZGKSAqIHcgKyAoKGRzdCA+Pj4gOCkgJiAweDAwRkYwMEZGKSAqIGludkEpID4+PiA4KSAmIDB4MDBGRjAwRkZcblxuICByZXR1cm4gKHJiIHwgKGdhIDw8IDgpKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8vIENvbnZlcnQgMHhBQUJCR0dSUiB0byAjUlJHR0JCQUFcbmV4cG9ydCBmdW5jdGlvbiBjb2xvcjMyVG9IZXgoY29sb3I6IENvbG9yMzIpOiBzdHJpbmcge1xuICBjb25zdCByID0gKGNvbG9yICYgMHhGRikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgZyA9ICgoY29sb3IgPj4+IDgpICYgMHhGRikudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3QgYiA9ICgoY29sb3IgPj4+IDE2KSAmIDB4RkYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IGEgPSAoKGNvbG9yID4+PiAyNCkgJiAweEZGKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKVxuICByZXR1cm4gYCMke3J9JHtnfSR7Yn0ke2F9YFxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgMzItYml0IGludGVnZXIgKDB4QUFCQkdHUlIpIHRvIGEgQ1NTIHJnYmEoKSBzdHJpbmcuXG4gKiBFeGFtcGxlOiAweEZGMDAwMEZGIC0+IFwicmdiYSgyNTUsMCwwLDEpXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yMzJUb0Nzc1JHQkEoY29sb3I6IENvbG9yMzIpOiBzdHJpbmcge1xuICBjb25zdCByID0gY29sb3IgJiAweEZGXG4gIGNvbnN0IGcgPSAoY29sb3IgPj4+IDgpICYgMHhGRlxuICBjb25zdCBiID0gKGNvbG9yID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGEgPSAoY29sb3IgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCBhbHBoYSA9IE51bWJlcigoYSAvIDI1NSkudG9GaXhlZCgzKSlcblxuICByZXR1cm4gYHJnYmEoJHtyfSwke2d9LCR7Yn0sJHthbHBoYX0pYFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type ClippedRect = {\n x: number;\n y: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\nexport type ClippedBlit = {\n x: number;\n y: number;\n sx: number;\n sy: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\n\n// use factory functions when creating reusable objects ensure property order for JIT perf\nexport const makeClippedRect = (): ClippedRect => ({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\nexport const makeClippedBlit = (): ClippedBlit => ({\n x: 0,\n y: 0,\n sx: 0,\n sy: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\n\n/**\n * Calculates the intersection of a target rectangle and a bounding box (usually 0,0 -> width,height).\n * Handles negative offsets by shrinking dimensions.\n */\nexport function resolveRectClipping(x: number, y: number, w: number, h: number, boundaryW: number, boundaryH: number, out: ClippedRect): ClippedRect {\n // Destination Clipping (Top/Left)\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n\n // Destination Clipping (Bottom/Right)\n const actualW = Math.min(w, boundaryW - x);\n const actualH = Math.min(h, boundaryH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n\n/**\n * Calculates the clipping for transferring data from a Source to a Destination.\n * Handles cases where the source is out of bounds (shifting the destination target)\n * AND cases where the destination is out of bounds (shifting the source target).\n */\nexport function resolveBlitClipping(x: number, y: number, sx: number, sy: number, w: number, h: number, dstW: number, dstH: number, srcW: number, srcH: number, out: ClippedBlit): ClippedBlit {\n // 1. Source Clipping: If reading from negative source, shift target right and shrink\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, srcW - sx);\n h = Math.min(h, srcH - sy);\n\n // 2. Destination Clipping: If writing to negative dest, shift source right and shrink\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dstW - x);\n const actualH = Math.min(h, dstH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.sx = sx;\n out.sy = sy;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2xpcHBlZFJlY3QgPSB7XG4gIHg6IG51bWJlclxuICB5OiBudW1iZXJcbiAgdzogbnVtYmVyXG4gIGg6IG51bWJlclxuICBpbkJvdW5kczogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBDbGlwcGVkQmxpdCA9IHtcbiAgeDogbnVtYmVyXG4gIHk6IG51bWJlclxuICBzeDogbnVtYmVyXG4gIHN5OiBudW1iZXJcbiAgdzogbnVtYmVyXG4gIGg6IG51bWJlclxuICBpbkJvdW5kczogYm9vbGVhblxufVxuXG4vLyB1c2UgZmFjdG9yeSBmdW5jdGlvbnMgd2hlbiBjcmVhdGluZyByZXVzYWJsZSBvYmplY3RzIGVuc3VyZSBwcm9wZXJ0eSBvcmRlciBmb3IgSklUIHBlcmZcbmV4cG9ydCBjb25zdCBtYWtlQ2xpcHBlZFJlY3QgPSAoKTogQ2xpcHBlZFJlY3QgPT4gKHtcbiAgeDogMCxcbiAgeTogMCxcbiAgdzogMCxcbiAgaDogMCxcbiAgaW5Cb3VuZHM6IGZhbHNlLFxufSlcblxuZXhwb3J0IGNvbnN0IG1ha2VDbGlwcGVkQmxpdCA9ICgpOiBDbGlwcGVkQmxpdCA9PiAoe1xuICB4OiAwLFxuICB5OiAwLFxuICBzeDogMCxcbiAgc3k6IDAsXG4gIHc6IDAsXG4gIGg6IDAsXG4gIGluQm91bmRzOiBmYWxzZSxcbn0pXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgdGFyZ2V0IHJlY3RhbmdsZSBhbmQgYSBib3VuZGluZyBib3ggKHVzdWFsbHkgMCwwIC0+IHdpZHRoLGhlaWdodCkuXG4gKiBIYW5kbGVzIG5lZ2F0aXZlIG9mZnNldHMgYnkgc2hyaW5raW5nIGRpbWVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVjdENsaXBwaW5nKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4gIGJvdW5kYXJ5VzogbnVtYmVyLFxuICBib3VuZGFyeUg6IG51bWJlcixcbiAgb3V0OiBDbGlwcGVkUmVjdCxcbik6IENsaXBwZWRSZWN0IHtcbiAgLy8gRGVzdGluYXRpb24gQ2xpcHBpbmcgKFRvcC9MZWZ0KVxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICAvLyBEZXN0aW5hdGlvbiBDbGlwcGluZyAoQm90dG9tL1JpZ2h0KVxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgYm91bmRhcnlXIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGJvdW5kYXJ5SCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHtcbiAgICBvdXQuaW5Cb3VuZHMgPSBmYWxzZVxuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIG91dC54ID0geFxuICBvdXQueSA9IHlcbiAgb3V0LncgPSBhY3R1YWxXXG4gIG91dC5oID0gYWN0dWFsSFxuICBvdXQuaW5Cb3VuZHMgPSB0cnVlXG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNsaXBwaW5nIGZvciB0cmFuc2ZlcnJpbmcgZGF0YSBmcm9tIGEgU291cmNlIHRvIGEgRGVzdGluYXRpb24uXG4gKiBIYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSBzb3VyY2UgaXMgb3V0IG9mIGJvdW5kcyAoc2hpZnRpbmcgdGhlIGRlc3RpbmF0aW9uIHRhcmdldClcbiAqIEFORCBjYXNlcyB3aGVyZSB0aGUgZGVzdGluYXRpb24gaXMgb3V0IG9mIGJvdW5kcyAoc2hpZnRpbmcgdGhlIHNvdXJjZSB0YXJnZXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHN4OiBudW1iZXIsXG4gIHN5OiBudW1iZXIsXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuICBkc3RXOiBudW1iZXIsXG4gIGRzdEg6IG51bWJlcixcbiAgc3JjVzogbnVtYmVyLFxuICBzcmNIOiBudW1iZXIsXG4gIG91dDogQ2xpcHBlZEJsaXQsXG4pOiBDbGlwcGVkQmxpdCB7XG4gIC8vIDEuIFNvdXJjZSBDbGlwcGluZzogSWYgcmVhZGluZyBmcm9tIG5lZ2F0aXZlIHNvdXJjZSwgc2hpZnQgdGFyZ2V0IHJpZ2h0IGFuZCBzaHJpbmtcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyY1cgLSBzeClcbiAgaCA9IE1hdGgubWluKGgsIHNyY0ggLSBzeSlcblxuICAvLyAyLiBEZXN0aW5hdGlvbiBDbGlwcGluZzogSWYgd3JpdGluZyB0byBuZWdhdGl2ZSBkZXN0LCBzaGlmdCBzb3VyY2UgcmlnaHQgYW5kIHNocmlua1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3RXIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGRzdEggLSB5KVxuXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSB7XG4gICAgb3V0LmluQm91bmRzID0gZmFsc2VcbiAgICByZXR1cm4gb3V0XG4gIH1cblxuICBvdXQueCA9IHhcbiAgb3V0LnkgPSB5XG4gIG91dC5zeCA9IHN4XG4gIG91dC5zeSA9IHN5XG4gIG91dC53ID0gYWN0dWFsV1xuICBvdXQuaCA9IGFjdHVhbEhcbiAgb3V0LmluQm91bmRzID0gdHJ1ZVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, rect: Rect): Uint8ClampedArray;\n/**\n * @param imageData - The source image data to read from.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, x: number, y: number, w: number, h: number): Uint8ClampedArray;\nexport function extractImageDataBuffer(imageData: ImageDataLike, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint8ClampedArray {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const {\n width: srcW,\n height: srcH,\n data: src\n } = imageData;\n // Safety check for invalid dimensions\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0);\n const out = new Uint8ClampedArray(w * h * 4);\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return out;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const srcStart = ((srcY + row) * srcW + srcX) * 4;\n const dstStart = ((dstY + row) * w + dstX) * 4;\n\n // Perform the high-speed bulk copy\n out.set(src.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgc3BlY2lmaWMgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIGEgbGFyZ2VyIHtAbGluayBJbWFnZURhdGFMaWtlfVxuICogc291cmNlIGludG8gYSBuZXcge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fS5cbiAqXG4gKiBUaGlzIGlzIGEgXCJyZWFkLW9ubHlcIiBvcGVyYXRpb24gdGhhdCByZXR1cm5zIGEgY29weSBvZiB0aGUgcGl4ZWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHNvdXJjZSBpbWFnZSBkYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSByZWN0IC0gQSB7QGxpbmsgUmVjdH0gb2JqZWN0IGRlZmluaW5nIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fSBjb250YWluaW5nIHRoZSBSR0JBIHBpeGVsIGRhdGEgb2YgdGhlIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbWFnZURhdGFCdWZmZXIoXG4gIGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSxcbiAgcmVjdDogUmVjdCxcbik6IFVpbnQ4Q2xhbXBlZEFycmF5XG4vKipcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgc291cmNlIGltYWdlIGRhdGEgdG8gcmVhZCBmcm9tLlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHkgLSBUaGUgc3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBoIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIHtAbGluayBVaW50OENsYW1wZWRBcnJheX0gY29udGFpbmluZyB0aGUgUkdCQSBwaXhlbCBkYXRhIG9mIHRoZSByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKFxuICBpbWFnZURhdGE6IEltYWdlRGF0YUxpa2UsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICB3OiBudW1iZXIsXG4gIGg6IG51bWJlcixcbik6IFVpbnQ4Q2xhbXBlZEFycmF5XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihcbiAgaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDogeyB4OiBfeCwgeTogX3khLCB3OiBfdyEsIGg6IF9oISB9XG5cbiAgY29uc3QgeyB3aWR0aDogc3JjVywgaGVpZ2h0OiBzcmNILCBkYXRhOiBzcmMgfSA9IGltYWdlRGF0YVxuICAvLyBTYWZldHkgY2hlY2sgZm9yIGludmFsaWQgZGltZW5zaW9uc1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheSgwKVxuICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodyAqIGggKiA0KVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIDAsXG4gICAgMCxcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoLFxuICAgIHcsXG4gICAgaCxcbiAgICBzcmNXLFxuICAgIHNyY0gsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gb3V0XG5cbiAgY29uc3QgeyB4OiBkc3RYLCB5OiBkc3RZLCBzeDogc3JjWCwgc3k6IHNyY1ksIHc6IGNvcHlXLCBoOiBjb3B5SCB9ID0gY2xpcFxuICBjb25zdCByb3dMZW4gPSBjb3B5VyAqIDRcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBzcmNTdGFydCA9ICgoc3JjWSArIHJvdykgKiBzcmNXICsgc3JjWCkgKiA0XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoKGRzdFkgKyByb3cpICogdyArIGRzdFgpICogNFxuXG4gICAgLy8gUGVyZm9ybSB0aGUgaGlnaC1zcGVlZCBidWxrIGNvcHlcbiAgICBvdXQuc2V0KHNyYy5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pLCBkc3RTdGFydClcbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(mask: Uint8Array, maskWidth: number, rect: Rect): Uint8Array;\n/**\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(mask: Uint8Array, maskWidth: number, x: number, y: number, w: number, h: number): Uint8Array;\nexport function extractMask(mask: Uint8Array, maskWidth: number, xOrRect: number | Rect, y?: number, w?: number, h?: number): Uint8Array {\n let finalX: number;\n let finalY: number;\n let finalW: number;\n let finalH: number;\n if (typeof xOrRect === 'object') {\n finalX = xOrRect.x;\n finalY = xOrRect.y;\n finalW = xOrRect.w;\n finalH = xOrRect.h;\n } else {\n finalX = xOrRect;\n finalY = y!;\n finalW = w!;\n finalH = h!;\n }\n const out = new Uint8Array(finalW * finalH);\n const srcH = mask.length / maskWidth;\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row;\n if (currentSrcY < 0 || currentSrcY >= srcH) {\n continue;\n }\n const start = Math.max(0, finalX);\n const end = Math.min(maskWidth, finalX + finalW);\n if (start < end) {\n const srcOffset = currentSrcY * maskWidth + start;\n const dstOffset = row * finalW + (start - finalX);\n const count = end - start;\n out.set(mask.subarray(srcOffset, srcOffset + count), dstOffset);\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gYSAxRCB7QGxpbmsgVWludDhBcnJheX0gbWFzay5cbiAqIFRoaXMgdXRpbGl0eSBjYWxjdWxhdGVzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0cyBiYXNlZCBvbiB0aGUgYG1hc2tXaWR0aGAgdG9cbiAqIHNsaWNlIG91dCBhIHNwZWNpZmljIGFyZWEuXG4gKlxuICogQHBhcmFtIG1hc2sgLSBUaGUgc291cmNlIDFEIGFycmF5IHJlcHJlc2VudGluZyB0aGUgZnVsbCAyRCBtYXNrLlxuICogQHBhcmFtIG1hc2tXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgc291cmNlIG1hc2sgKHN0cmlkZSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEge0BsaW5rIFJlY3R9IG9iamVjdCBkZWZpbmluZyB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgVWludDhBcnJheX0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNYXNrKFxuICBtYXNrOiBVaW50OEFycmF5LFxuICBtYXNrV2lkdGg6IG51bWJlcixcbiAgcmVjdDogUmVjdCxcbik6IFVpbnQ4QXJyYXlcbi8qKlxuICogQHBhcmFtIG1hc2sgLSBUaGUgc291cmNlIDFEIGFycmF5IHJlcHJlc2VudGluZyB0aGUgZnVsbCAyRCBtYXNrLlxuICogQHBhcmFtIG1hc2tXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgc291cmNlIG1hc2sgKHN0cmlkZSkuXG4gKiBAcGFyYW0geCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHcgLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBVaW50OEFycmF5fSBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hc2soXG4gIG1hc2s6IFVpbnQ4QXJyYXksXG4gIG1hc2tXaWR0aDogbnVtYmVyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiBVaW50OEFycmF5XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hc2soXG4gIG1hc2s6IFVpbnQ4QXJyYXksXG4gIG1hc2tXaWR0aDogbnVtYmVyLFxuICB4T3JSZWN0OiBudW1iZXIgfCBSZWN0LFxuICB5PzogbnVtYmVyLFxuICB3PzogbnVtYmVyLFxuICBoPzogbnVtYmVyLFxuKTogVWludDhBcnJheSB7XG4gIGxldCBmaW5hbFg6IG51bWJlclxuICBsZXQgZmluYWxZOiBudW1iZXJcbiAgbGV0IGZpbmFsVzogbnVtYmVyXG4gIGxldCBmaW5hbEg6IG51bWJlclxuXG4gIGlmICh0eXBlb2YgeE9yUmVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICBmaW5hbFggPSB4T3JSZWN0LnhcbiAgICBmaW5hbFkgPSB4T3JSZWN0LnlcbiAgICBmaW5hbFcgPSB4T3JSZWN0LndcbiAgICBmaW5hbEggPSB4T3JSZWN0LmhcbiAgfSBlbHNlIHtcbiAgICBmaW5hbFggPSB4T3JSZWN0XG4gICAgZmluYWxZID0geSFcbiAgICBmaW5hbFcgPSB3IVxuICAgIGZpbmFsSCA9IGghXG4gIH1cblxuICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShmaW5hbFcgKiBmaW5hbEgpXG4gIGNvbnN0IHNyY0ggPSBtYXNrLmxlbmd0aCAvIG1hc2tXaWR0aFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGZpbmFsSDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50U3JjWSA9IGZpbmFsWSArIHJvd1xuXG4gICAgaWYgKGN1cnJlbnRTcmNZIDwgMCB8fCBjdXJyZW50U3JjWSA+PSBzcmNIKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgZmluYWxYKVxuICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKG1hc2tXaWR0aCwgZmluYWxYICsgZmluYWxXKVxuXG4gICAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICBjb25zdCBzcmNPZmZzZXQgPSBjdXJyZW50U3JjWSAqIG1hc2tXaWR0aCArIHN0YXJ0XG4gICAgICBjb25zdCBkc3RPZmZzZXQgPSAocm93ICogZmluYWxXKSArIChzdGFydCAtIGZpbmFsWClcbiAgICAgIGNvbnN0IGNvdW50ID0gZW5kIC0gc3RhcnRcblxuICAgICAgb3V0LnNldChcbiAgICAgICAgbWFzay5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50KSxcbiAgICAgICAgZHN0T2Zmc2V0LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Rect, SelectionRect } from '../_types';\nimport { extractMask } from '../Mask/extractMask';\n\n/**\n * Intersects a target rectangle with a boundary, trimming dimensions and masks in-place.\n * This utility calculates the axis-aligned intersection between the `target` and `bounds`.\n * If the `target` includes a `mask` (as in a {@link SelectionRect}), the mask is physically\n * cropped and re-aligned using `extractMask` to match the new dimensions.\n * @param target - The rectangle or selection object to be trimmed. **Note:** This object is mutated in-place.\n * @param bounds - The boundary rectangle defining the maximum allowable area (e.g., canvas dimensions).\n * @example\n * const selection = { x: -10, y: -10, w: 50, h: 50, mask: new Uint8Array(2500) };\n * const canvas = { x: 0, y: 0, w: 100, h: 100 };\n * // Selection will be moved to (0,0) and resized to 40x40.\n * // The mask is cropped by 10 px on the top and left.\n * trimRectBounds(selection, canvas);\n */\nexport function trimRectBounds<T extends Rect | SelectionRect>(target: T, bounds: Rect): void {\n const originalX = target.x;\n const originalY = target.y;\n const originalW = target.w;\n const intersectedX = Math.max(target.x, bounds.x);\n const intersectedY = Math.max(target.y, bounds.y);\n const intersectedMaxX = Math.min(target.x + target.w, bounds.x + bounds.w);\n const intersectedMaxY = Math.min(target.y + target.h, bounds.y + bounds.h);\n\n // Intersection check\n if (intersectedMaxX <= intersectedX || intersectedMaxY <= intersectedY) {\n target.w = 0;\n target.h = 0;\n if ('mask' in target && target.mask) {\n // This line is now hit by the 'empty intersection' test below\n target.mask = new Uint8Array(0);\n }\n return;\n }\n const intersectedW = intersectedMaxX - intersectedX;\n const intersectedH = intersectedMaxY - intersectedY;\n const offsetX = intersectedX - originalX;\n const offsetY = intersectedY - originalY;\n target.x = intersectedX;\n target.y = intersectedY;\n target.w = intersectedW;\n target.h = intersectedH;\n if ('mask' in target && target.mask) {\n const currentMask = extractMask(target.mask, originalW, offsetX, offsetY, intersectedW, intersectedH);\n let minX = intersectedW;\n let maxX = -1;\n let minY = intersectedH;\n let maxY = -1;\n\n // Scan for content\n for (let y = 0; y < intersectedH; y++) {\n for (let x = 0; x < intersectedW; x++) {\n if (currentMask[y * intersectedW + x] !== 0) {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n\n // If no content is found (all zeros)\n if (maxX === -1) {\n target.w = 0;\n target.h = 0;\n // This covers the specific line you mentioned\n target.mask = new Uint8Array(0);\n return;\n }\n const finalW = maxX - minX + 1;\n const finalH = maxY - minY + 1;\n\n // Only shift and crop if the content is smaller than the intersection\n if (finalW !== intersectedW || finalH !== intersectedH) {\n target.mask = extractMask(currentMask, intersectedW, minX, minY, finalW, finalH);\n target.x += minX;\n target.y += minY;\n target.w = finalW;\n target.h = finalH;\n } else {\n target.mask = currentMask;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0LCBTZWxlY3Rpb25SZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hc2sgfSBmcm9tICcuLi9NYXNrL2V4dHJhY3RNYXNrJ1xuXG4vKipcbiAqIEludGVyc2VjdHMgYSB0YXJnZXQgcmVjdGFuZ2xlIHdpdGggYSBib3VuZGFyeSwgdHJpbW1pbmcgZGltZW5zaW9ucyBhbmQgbWFza3MgaW4tcGxhY2UuXG4gKiBUaGlzIHV0aWxpdHkgY2FsY3VsYXRlcyB0aGUgYXhpcy1hbGlnbmVkIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBgdGFyZ2V0YCBhbmQgYGJvdW5kc2AuXG4gKiBJZiB0aGUgYHRhcmdldGAgaW5jbHVkZXMgYSBgbWFza2AgKGFzIGluIGEge0BsaW5rIFNlbGVjdGlvblJlY3R9KSwgdGhlIG1hc2sgaXMgcGh5c2ljYWxseVxuICogY3JvcHBlZCBhbmQgcmUtYWxpZ25lZCB1c2luZyBgZXh0cmFjdE1hc2tgIHRvIG1hdGNoIHRoZSBuZXcgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgcmVjdGFuZ2xlIG9yIHNlbGVjdGlvbiBvYmplY3QgdG8gYmUgdHJpbW1lZC4gKipOb3RlOioqIFRoaXMgb2JqZWN0IGlzIG11dGF0ZWQgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYm91bmRzIC0gVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgbWF4aW11bSBhbGxvd2FibGUgYXJlYSAoZS5nLiwgY2FudmFzIGRpbWVuc2lvbnMpLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlbGVjdGlvbiA9IHsgeDogLTEwLCB5OiAtMTAsIHc6IDUwLCBoOiA1MCwgbWFzazogbmV3IFVpbnQ4QXJyYXkoMjUwMCkgfTtcbiAqIGNvbnN0IGNhbnZhcyA9IHsgeDogMCwgeTogMCwgdzogMTAwLCBoOiAxMDAgfTtcbiAqIC8vIFNlbGVjdGlvbiB3aWxsIGJlIG1vdmVkIHRvICgwLDApIGFuZCByZXNpemVkIHRvIDQweDQwLlxuICogLy8gVGhlIG1hc2sgaXMgY3JvcHBlZCBieSAxMCBweCBvbiB0aGUgdG9wIGFuZCBsZWZ0LlxuICogdHJpbVJlY3RCb3VuZHMoc2VsZWN0aW9uLCBjYW52YXMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVJlY3RCb3VuZHM8VCBleHRlbmRzIFJlY3QgfCBTZWxlY3Rpb25SZWN0PihcbiAgdGFyZ2V0OiBULFxuICBib3VuZHM6IFJlY3QsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxYID0gdGFyZ2V0LnhcbiAgY29uc3Qgb3JpZ2luYWxZID0gdGFyZ2V0LnlcbiAgY29uc3Qgb3JpZ2luYWxXID0gdGFyZ2V0LndcblxuICBjb25zdCBpbnRlcnNlY3RlZFggPSBNYXRoLm1heCh0YXJnZXQueCwgYm91bmRzLngpXG4gIGNvbnN0IGludGVyc2VjdGVkWSA9IE1hdGgubWF4KHRhcmdldC55LCBib3VuZHMueSlcblxuICBjb25zdCBpbnRlcnNlY3RlZE1heFggPSBNYXRoLm1pbihcbiAgICB0YXJnZXQueCArIHRhcmdldC53LFxuICAgIGJvdW5kcy54ICsgYm91bmRzLncsXG4gIClcbiAgY29uc3QgaW50ZXJzZWN0ZWRNYXhZID0gTWF0aC5taW4oXG4gICAgdGFyZ2V0LnkgKyB0YXJnZXQuaCxcbiAgICBib3VuZHMueSArIGJvdW5kcy5oLFxuICApXG5cbiAgLy8gSW50ZXJzZWN0aW9uIGNoZWNrXG4gIGlmIChpbnRlcnNlY3RlZE1heFggPD0gaW50ZXJzZWN0ZWRYIHx8IGludGVyc2VjdGVkTWF4WSA8PSBpbnRlcnNlY3RlZFkpIHtcbiAgICB0YXJnZXQudyA9IDBcbiAgICB0YXJnZXQuaCA9IDBcblxuICAgIGlmICgnbWFzaycgaW4gdGFyZ2V0ICYmIHRhcmdldC5tYXNrKSB7XG4gICAgICAvLyBUaGlzIGxpbmUgaXMgbm93IGhpdCBieSB0aGUgJ2VtcHR5IGludGVyc2VjdGlvbicgdGVzdCBiZWxvd1xuICAgICAgdGFyZ2V0Lm1hc2sgPSBuZXcgVWludDhBcnJheSgwKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgaW50ZXJzZWN0ZWRXID0gaW50ZXJzZWN0ZWRNYXhYIC0gaW50ZXJzZWN0ZWRYXG4gIGNvbnN0IGludGVyc2VjdGVkSCA9IGludGVyc2VjdGVkTWF4WSAtIGludGVyc2VjdGVkWVxuICBjb25zdCBvZmZzZXRYID0gaW50ZXJzZWN0ZWRYIC0gb3JpZ2luYWxYXG4gIGNvbnN0IG9mZnNldFkgPSBpbnRlcnNlY3RlZFkgLSBvcmlnaW5hbFlcblxuICB0YXJnZXQueCA9IGludGVyc2VjdGVkWFxuICB0YXJnZXQueSA9IGludGVyc2VjdGVkWVxuICB0YXJnZXQudyA9IGludGVyc2VjdGVkV1xuICB0YXJnZXQuaCA9IGludGVyc2VjdGVkSFxuXG4gIGlmICgnbWFzaycgaW4gdGFyZ2V0ICYmIHRhcmdldC5tYXNrKSB7XG4gICAgY29uc3QgY3VycmVudE1hc2sgPSBleHRyYWN0TWFzayhcbiAgICAgIHRhcmdldC5tYXNrLFxuICAgICAgb3JpZ2luYWxXLFxuICAgICAgb2Zmc2V0WCxcbiAgICAgIG9mZnNldFksXG4gICAgICBpbnRlcnNlY3RlZFcsXG4gICAgICBpbnRlcnNlY3RlZEgsXG4gICAgKVxuXG4gICAgbGV0IG1pblggPSBpbnRlcnNlY3RlZFdcbiAgICBsZXQgbWF4WCA9IC0xXG4gICAgbGV0IG1pblkgPSBpbnRlcnNlY3RlZEhcbiAgICBsZXQgbWF4WSA9IC0xXG5cbiAgICAvLyBTY2FuIGZvciBjb250ZW50XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBpbnRlcnNlY3RlZEg7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBpbnRlcnNlY3RlZFc7IHgrKykge1xuICAgICAgICBpZiAoY3VycmVudE1hc2tbeSAqIGludGVyc2VjdGVkVyArIHhdICE9PSAwKSB7XG4gICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geFxuICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHhcbiAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5XG4gICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gY29udGVudCBpcyBmb3VuZCAoYWxsIHplcm9zKVxuICAgIGlmIChtYXhYID09PSAtMSkge1xuICAgICAgdGFyZ2V0LncgPSAwXG4gICAgICB0YXJnZXQuaCA9IDBcbiAgICAgIC8vIFRoaXMgY292ZXJzIHRoZSBzcGVjaWZpYyBsaW5lIHlvdSBtZW50aW9uZWRcbiAgICAgIHRhcmdldC5tYXNrID0gbmV3IFVpbnQ4QXJyYXkoMClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsVyA9IG1heFggLSBtaW5YICsgMVxuICAgIGNvbnN0IGZpbmFsSCA9IG1heFkgLSBtaW5ZICsgMVxuXG4gICAgLy8gT25seSBzaGlmdCBhbmQgY3JvcCBpZiB0aGUgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIGludGVyc2VjdGlvblxuICAgIGlmIChmaW5hbFcgIT09IGludGVyc2VjdGVkVyB8fCBmaW5hbEggIT09IGludGVyc2VjdGVkSCkge1xuICAgICAgdGFyZ2V0Lm1hc2sgPSBleHRyYWN0TWFzayhcbiAgICAgICAgY3VycmVudE1hc2ssXG4gICAgICAgIGludGVyc2VjdGVkVyxcbiAgICAgICAgbWluWCxcbiAgICAgICAgbWluWSxcbiAgICAgICAgZmluYWxXLFxuICAgICAgICBmaW5hbEgsXG4gICAgICApXG4gICAgICB0YXJnZXQueCArPSBtaW5YXG4gICAgICB0YXJnZXQueSArPSBtaW5ZXG4gICAgICB0YXJnZXQudyA9IGZpbmFsV1xuICAgICAgdGFyZ2V0LmggPSBmaW5hbEhcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0Lm1hc2sgPSBjdXJyZW50TWFza1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type Color32, MaskType } from '../_types';\nimport { colorDistance } from '../color';\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nexport type FloodFillImageDataOptions = {\n contiguous?: boolean;\n tolerance?: number;\n bounds?: Rect;\n};\nexport type FloodFillResult = {\n startX: number;\n startY: number;\n selectionRect: SelectionRect;\n pixels: Uint8ClampedArray;\n};\n\n/**\n * Performs a color-based flood fill selection on {@link ImageData} or {@link PixelData}.\n * This utility identifies pixels starting from a specific coordinate that fall within a\n * color tolerance. It can operate in \"contiguous\" mode (classic bucket fill) or\n * \"non-contiguous\" mode (selects all matching pixels in the buffer).\n *\n * @param img - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param options - Configuration for the fill operation.\n * @param options.contiguous - @default true. If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param options.tolerance - @default 0. The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param options.bounds - Optional bounding box to restrict the search area.\n *\n * @returns A {@link FloodFillResult} containing the mask and bounds of the selection,\n * or `null` if the starting coordinates are out of bounds.\n *\n * @example\n * ```typescript\n * const result = floodFillImageDataSelection(\n * ctx.getImageData(0, 0, 100, 100),\n * 50,\n * 50,\n * {\n * tolerance: 20,\n * contiguous: true\n * }\n * );\n * ```\n */\nexport function floodFillSelection(img: ImageDataLike | PixelData, startX: number, startY: number, {\n contiguous = true,\n tolerance = 0,\n bounds\n}: FloodFillImageDataOptions = {}): FloodFillResult | null {\n let imageData: ImageDataLike;\n let data32: Uint32Array;\n if ('data32' in img) {\n data32 = img.data32;\n imageData = img.imageData;\n } else {\n data32 = new Uint32Array(img.data.buffer, img.data.byteOffset, img.data.byteLength >> 2);\n imageData = img;\n }\n const {\n width,\n height\n } = img;\n const limit = bounds || {\n x: 0,\n y: 0,\n w: width,\n h: height\n };\n const xMin = Math.max(0, limit.x);\n const xMax = Math.min(width - 1, limit.x + limit.w - 1);\n const yMin = Math.max(0, limit.y);\n const yMax = Math.min(height - 1, limit.y + limit.h - 1);\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null;\n }\n const baseColor = data32[startY * width + startX] as Color32;\n let matchCount = 0;\n const matchX = new Uint16Array(width * height);\n const matchY = new Uint16Array(width * height);\n let minX = startX;\n let maxX = startX;\n let minY = startY;\n let maxY = startY;\n if (contiguous) {\n const visited = new Uint8Array(width * height);\n const stack = new Uint32Array(width * height);\n let stackPtr = 0;\n stack[stackPtr++] = startY << 16 | startX;\n visited[startY * width + startX] = 1;\n while (stackPtr > 0) {\n const val = stack[--stackPtr];\n const x = val & 0xFFFF;\n const y = val >>> 16;\n matchX[matchCount] = x;\n matchY[matchCount] = y;\n matchCount++;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n\n // Right\n if (x + 1 <= xMax) {\n const idx = y * width + (x + 1);\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y << 16 | x + 1;\n }\n }\n // Left\n if (x - 1 >= xMin) {\n const idx = y * width + (x - 1);\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y << 16 | x - 1;\n }\n }\n // Down\n if (y + 1 <= yMax) {\n const idx = (y + 1) * width + x;\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y + 1 << 16 | x;\n }\n }\n // Up\n if (y - 1 >= yMin) {\n const idx = (y - 1) * width + x;\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1;\n stack[stackPtr++] = y - 1 << 16 | x;\n }\n }\n }\n } else {\n for (let y = yMin; y <= yMax; y++) {\n for (let x = xMin; x <= xMax; x++) {\n const color = data32[y * width + x] as Color32;\n if (colorDistance(color, baseColor) <= tolerance) {\n matchX[matchCount] = x;\n matchY[matchCount] = y;\n matchCount++;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n }\n if (matchCount === 0) {\n return null;\n }\n const selectionRect: SelectionRect = {\n x: minX,\n y: minY,\n w: maxX - minX + 1,\n h: maxY - minY + 1,\n mask: new Uint8Array((maxX - minX + 1) * (maxY - minY + 1)),\n maskType: MaskType.BINARY\n };\n\n // REMOVED trimRectBounds from here\n\n const sw = selectionRect.w;\n const sh = selectionRect.h;\n const finalMask = selectionRect.mask!;\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - selectionRect.x;\n const my = matchY[i] - selectionRect.y;\n if (mx >= 0 && mx < sw && my >= 0 && my < sh) {\n finalMask[my * sw + mx] = 1;\n }\n }\n\n // trimRectBounds can see them and work correctly.\n trimRectBounds(selectionRect, {\n x: 0,\n y: 0,\n w: width,\n h: height\n });\n\n // Use the UPDATED values from the selectionRect after trimming\n const extracted = extractImageDataBuffer(imageData, selectionRect.x, selectionRect.y, selectionRect.w, selectionRect.h);\n return {\n startX,\n startY,\n selectionRect,\n pixels: extracted\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIEltYWdlRGF0YUxpa2UsIE1hc2tUeXBlLCB0eXBlIFJlY3QsIHR5cGUgU2VsZWN0aW9uUmVjdCB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IGNvbG9yRGlzdGFuY2UgfSBmcm9tICcuLi9jb2xvcidcbmltcG9ydCB7IGV4dHJhY3RJbWFnZURhdGFCdWZmZXIgfSBmcm9tICcuLi9JbWFnZURhdGEvZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcidcbmltcG9ydCB0eXBlIHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi4vUGl4ZWxEYXRhL1BpeGVsRGF0YSdcbmltcG9ydCB7IHRyaW1SZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltUmVjdEJvdW5kcydcblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsSW1hZ2VEYXRhT3B0aW9ucyA9IHtcbiAgY29udGlndW91cz86IGJvb2xlYW5cbiAgdG9sZXJhbmNlPzogbnVtYmVyXG4gIGJvdW5kcz86IFJlY3Rcbn1cblxuZXhwb3J0IHR5cGUgRmxvb2RGaWxsUmVzdWx0ID0ge1xuICBzdGFydFg6IG51bWJlclxuICBzdGFydFk6IG51bWJlclxuICBzZWxlY3Rpb25SZWN0OiBTZWxlY3Rpb25SZWN0XG4gIHBpeGVsczogVWludDhDbGFtcGVkQXJyYXlcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBhIGNvbG9yLWJhc2VkIGZsb29kIGZpbGwgc2VsZWN0aW9uIG9uIHtAbGluayBJbWFnZURhdGF9IG9yIHtAbGluayBQaXhlbERhdGF9LlxuICogVGhpcyB1dGlsaXR5IGlkZW50aWZpZXMgcGl4ZWxzIHN0YXJ0aW5nIGZyb20gYSBzcGVjaWZpYyBjb29yZGluYXRlIHRoYXQgZmFsbCB3aXRoaW4gYVxuICogY29sb3IgdG9sZXJhbmNlLiBJdCBjYW4gb3BlcmF0ZSBpbiBcImNvbnRpZ3VvdXNcIiBtb2RlIChjbGFzc2ljIGJ1Y2tldCBmaWxsKSBvclxuICogXCJub24tY29udGlndW91c1wiIG1vZGUgKHNlbGVjdHMgYWxsIG1hdGNoaW5nIHBpeGVscyBpbiB0aGUgYnVmZmVyKS5cbiAqXG4gKiBAcGFyYW0gaW1nIC0gVGhlIHNvdXJjZSBpbWFnZSBkYXRhIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0gc3RhcnRYIC0gVGhlIHN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSBzdGFydFkgLSBUaGUgc3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGZpbGwgb3BlcmF0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMuY29udGlndW91cyAtIEBkZWZhdWx0IHRydWUuIElmIHRydWUsIG9ubHkgY29ubmVjdGVkIHBpeGVscyBhcmVcbiAqIHNlbGVjdGVkLiBJZiBmYWxzZSwgYWxsIHBpeGVscyB3aXRoaW4gdG9sZXJhbmNlIGFyZSBzZWxlY3RlZCByZWdhcmRsZXNzIG9mIHBvc2l0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMudG9sZXJhbmNlIC0gQGRlZmF1bHQgMC4gVGhlIG1heGltdW0gYWxsb3dlZCBkaWZmZXJlbmNlIGluIGNvbG9yXG4gKiBkaXN0YW5jZSAoMC0yNTUpIGZvciBhIHBpeGVsIHRvIGJlIGluY2x1ZGVkLlxuICogQHBhcmFtIG9wdGlvbnMuYm91bmRzIC0gT3B0aW9uYWwgYm91bmRpbmcgYm94IHRvIHJlc3RyaWN0IHRoZSBzZWFyY2ggYXJlYS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBGbG9vZEZpbGxSZXN1bHR9IGNvbnRhaW5pbmcgdGhlIG1hc2sgYW5kIGJvdW5kcyBvZiB0aGUgc2VsZWN0aW9uLFxuICogb3IgYG51bGxgIGlmIHRoZSBzdGFydGluZyBjb29yZGluYXRlcyBhcmUgb3V0IG9mIGJvdW5kcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gZmxvb2RGaWxsSW1hZ2VEYXRhU2VsZWN0aW9uKFxuICogY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMDAsIDEwMCksXG4gKiA1MCxcbiAqIDUwLFxuICoge1xuICogdG9sZXJhbmNlOiAyMCxcbiAqIGNvbnRpZ3VvdXM6IHRydWVcbiAqIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb29kRmlsbFNlbGVjdGlvbihcbiAgaW1nOiBJbWFnZURhdGFMaWtlIHwgUGl4ZWxEYXRhLFxuICBzdGFydFg6IG51bWJlcixcbiAgc3RhcnRZOiBudW1iZXIsXG4gIHtcbiAgICBjb250aWd1b3VzID0gdHJ1ZSxcbiAgICB0b2xlcmFuY2UgPSAwLFxuICAgIGJvdW5kcyxcbiAgfTogRmxvb2RGaWxsSW1hZ2VEYXRhT3B0aW9ucyA9IHt9LFxuKTogRmxvb2RGaWxsUmVzdWx0IHwgbnVsbCB7XG5cbiAgbGV0IGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZVxuICBsZXQgZGF0YTMyOiBVaW50MzJBcnJheVxuICBpZiAoJ2RhdGEzMicgaW4gaW1nKSB7XG4gICAgZGF0YTMyID0gaW1nLmRhdGEzMlxuICAgIGltYWdlRGF0YSA9IGltZy5pbWFnZURhdGFcbiAgfSBlbHNlIHtcbiAgICBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkoXG4gICAgICBpbWcuZGF0YS5idWZmZXIsXG4gICAgICBpbWcuZGF0YS5ieXRlT2Zmc2V0LFxuICAgICAgaW1nLmRhdGEuYnl0ZUxlbmd0aCA+PiAyLFxuICAgIClcbiAgICBpbWFnZURhdGEgPSBpbWdcbiAgfVxuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICB9ID0gaW1nXG5cbiAgY29uc3QgbGltaXQgPSBib3VuZHMgfHwge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiB3aWR0aCxcbiAgICBoOiBoZWlnaHQsXG4gIH1cblxuICBjb25zdCB4TWluID0gTWF0aC5tYXgoMCwgbGltaXQueClcbiAgY29uc3QgeE1heCA9IE1hdGgubWluKHdpZHRoIC0gMSwgbGltaXQueCArIGxpbWl0LncgLSAxKVxuICBjb25zdCB5TWluID0gTWF0aC5tYXgoMCwgbGltaXQueSlcbiAgY29uc3QgeU1heCA9IE1hdGgubWluKGhlaWdodCAtIDEsIGxpbWl0LnkgKyBsaW1pdC5oIC0gMSlcblxuICBpZiAoc3RhcnRYIDwgeE1pbiB8fCBzdGFydFggPiB4TWF4IHx8IHN0YXJ0WSA8IHlNaW4gfHwgc3RhcnRZID4geU1heCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBiYXNlQ29sb3IgPSBkYXRhMzJbc3RhcnRZICogd2lkdGggKyBzdGFydFhdIGFzIENvbG9yMzJcblxuICBsZXQgbWF0Y2hDb3VudCA9IDBcbiAgY29uc3QgbWF0Y2hYID0gbmV3IFVpbnQxNkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICBjb25zdCBtYXRjaFkgPSBuZXcgVWludDE2QXJyYXkod2lkdGggKiBoZWlnaHQpXG5cbiAgbGV0IG1pblggPSBzdGFydFhcbiAgbGV0IG1heFggPSBzdGFydFhcbiAgbGV0IG1pblkgPSBzdGFydFlcbiAgbGV0IG1heFkgPSBzdGFydFlcblxuICBpZiAoY29udGlndW91cykge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgICBjb25zdCBzdGFjayA9IG5ldyBVaW50MzJBcnJheSh3aWR0aCAqIGhlaWdodClcbiAgICBsZXQgc3RhY2tQdHIgPSAwXG5cbiAgICBzdGFja1tzdGFja1B0cisrXSA9IChzdGFydFkgPDwgMTYpIHwgc3RhcnRYXG4gICAgdmlzaXRlZFtzdGFydFkgKiB3aWR0aCArIHN0YXJ0WF0gPSAxXG5cbiAgICB3aGlsZSAoc3RhY2tQdHIgPiAwKSB7XG4gICAgICBjb25zdCB2YWwgPSBzdGFja1stLXN0YWNrUHRyXVxuICAgICAgY29uc3QgeCA9IHZhbCAmIDB4RkZGRlxuICAgICAgY29uc3QgeSA9IHZhbCA+Pj4gMTZcblxuICAgICAgbWF0Y2hYW21hdGNoQ291bnRdID0geFxuICAgICAgbWF0Y2hZW21hdGNoQ291bnRdID0geVxuICAgICAgbWF0Y2hDb3VudCsrXG5cbiAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHhcbiAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHhcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHlcbiAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHlcblxuICAgICAgLy8gUmlnaHRcbiAgICAgIGlmICh4ICsgMSA8PSB4TWF4KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiB3aWR0aCArICh4ICsgMSlcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDFcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9ICh5IDw8IDE2KSB8ICh4ICsgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gTGVmdFxuICAgICAgaWYgKHggLSAxID49IHhNaW4pIHtcbiAgICAgICAgY29uc3QgaWR4ID0geSAqIHdpZHRoICsgKHggLSAxKVxuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMVxuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0gKHkgPDwgMTYpIHwgKHggLSAxKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEb3duXG4gICAgICBpZiAoeSArIDEgPD0geU1heCkge1xuICAgICAgICBjb25zdCBpZHggPSAoeSArIDEpICogd2lkdGggKyB4XG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxXG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoKHkgKyAxKSA8PCAxNikgfCB4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFVwXG4gICAgICBpZiAoeSAtIDEgPj0geU1pbikge1xuICAgICAgICBjb25zdCBpZHggPSAoeSAtIDEpICogd2lkdGggKyB4XG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxXG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSAoKHkgLSAxKSA8PCAxNikgfCB4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgeSA9IHlNaW47IHkgPD0geU1heDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0geE1pbjsgeCA8PSB4TWF4OyB4KyspIHtcbiAgICAgICAgY29uc3QgY29sb3IgPSBkYXRhMzJbeSAqIHdpZHRoICsgeF0gYXMgQ29sb3IzMlxuICAgICAgICBpZiAoY29sb3JEaXN0YW5jZShjb2xvciwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICBtYXRjaFhbbWF0Y2hDb3VudF0gPSB4XG4gICAgICAgICAgbWF0Y2hZW21hdGNoQ291bnRdID0geVxuICAgICAgICAgIG1hdGNoQ291bnQrK1xuXG4gICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geFxuICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHhcbiAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5XG4gICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG1hdGNoQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGNvbnN0IHNlbGVjdGlvblJlY3Q6IFNlbGVjdGlvblJlY3QgPSB7XG4gICAgeDogbWluWCxcbiAgICB5OiBtaW5ZLFxuICAgIHc6IG1heFggLSBtaW5YICsgMSxcbiAgICBoOiBtYXhZIC0gbWluWSArIDEsXG4gICAgbWFzazogbmV3IFVpbnQ4QXJyYXkoKG1heFggLSBtaW5YICsgMSkgKiAobWF4WSAtIG1pblkgKyAxKSksXG4gICAgbWFza1R5cGU6IE1hc2tUeXBlLkJJTkFSWSxcbiAgfVxuXG4gIC8vIFJFTU9WRUQgdHJpbVJlY3RCb3VuZHMgZnJvbSBoZXJlXG5cbiAgY29uc3Qgc3cgPSBzZWxlY3Rpb25SZWN0LndcbiAgY29uc3Qgc2ggPSBzZWxlY3Rpb25SZWN0LmhcbiAgY29uc3QgZmluYWxNYXNrID0gc2VsZWN0aW9uUmVjdC5tYXNrIVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hDb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbXggPSBtYXRjaFhbaV0gLSBzZWxlY3Rpb25SZWN0LnhcbiAgICBjb25zdCBteSA9IG1hdGNoWVtpXSAtIHNlbGVjdGlvblJlY3QueVxuXG4gICAgaWYgKG14ID49IDAgJiYgbXggPCBzdyAmJiBteSA+PSAwICYmIG15IDwgc2gpIHtcbiAgICAgIGZpbmFsTWFza1tteSAqIHN3ICsgbXhdID0gMVxuICAgIH1cbiAgfVxuXG4gIC8vIHRyaW1SZWN0Qm91bmRzIGNhbiBzZWUgdGhlbSBhbmQgd29yayBjb3JyZWN0bHkuXG4gIHRyaW1SZWN0Qm91bmRzKFxuICAgIHNlbGVjdGlvblJlY3QsXG4gICAgeyB4OiAwLCB5OiAwLCB3OiB3aWR0aCwgaDogaGVpZ2h0IH0sXG4gIClcblxuICAvLyBVc2UgdGhlIFVQREFURUQgdmFsdWVzIGZyb20gdGhlIHNlbGVjdGlvblJlY3QgYWZ0ZXIgdHJpbW1pbmdcbiAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihcbiAgICBpbWFnZURhdGEsXG4gICAgc2VsZWN0aW9uUmVjdC54LFxuICAgIHNlbGVjdGlvblJlY3QueSxcbiAgICBzZWxlY3Rpb25SZWN0LncsXG4gICAgc2VsZWN0aW9uUmVjdC5oLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydFgsXG4gICAgc3RhcnRZLFxuICAgIHNlbGVjdGlvblJlY3QsXG4gICAgcGl4ZWxzOiBleHRyYWN0ZWQsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22\n} as const;\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>;\nexport const overwriteBase: BlendColor32 = (src, _dst) => src;\noverwriteBase.isOverwrite = true;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBjb25zdCBCYXNlQmxlbmRNb2RlID0ge1xuICBvdmVyd3JpdGU6IDAsXG4gIHNvdXJjZU92ZXI6IDEsXG4gIGRhcmtlbjogMixcbiAgbXVsdGlwbHk6IDMsXG4gIGNvbG9yQnVybjogNCxcbiAgbGluZWFyQnVybjogNSxcbiAgZGFya2VyQ29sb3I6IDYsXG4gIGxpZ2h0ZW46IDcsXG4gIHNjcmVlbjogOCxcbiAgY29sb3JEb2RnZTogOSxcbiAgbGluZWFyRG9kZ2U6IDEwLFxuICBsaWdodGVyQ29sb3I6IDExLFxuICBvdmVybGF5OiAxMixcbiAgc29mdExpZ2h0OiAxMyxcbiAgaGFyZExpZ2h0OiAxNCxcbiAgdml2aWRMaWdodDogMTUsXG4gIGxpbmVhckxpZ2h0OiAxNixcbiAgcGluTGlnaHQ6IDE3LFxuICBoYXJkTWl4OiAxOCxcbiAgZGlmZmVyZW5jZTogMTksXG4gIGV4Y2x1c2lvbjogMjAsXG4gIHN1YnRyYWN0OiAyMSxcbiAgZGl2aWRlOiAyMixcbn0gYXMgY29uc3RcblxuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZEJsZW5kTW9kZXMge1xuICBvdmVyd3JpdGU6IDA7XG59XG5cbmV4cG9ydCB0eXBlIEJhc2VCbGVuZE1vZGVzID0gUmVxdWlyZWRCbGVuZE1vZGVzICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPlxuXG5leHBvcnQgY29uc3Qgb3ZlcndyaXRlQmFzZTogQmxlbmRDb2xvcjMyID0gKHNyYywgX2RzdCkgPT4gc3JjXG5vdmVyd3JpdGVCYXNlLmlzT3ZlcndyaXRlID0gdHJ1ZVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { BlendColor32 } from '../_types';\nimport type { BaseBlendModes } from './blend-modes';\nexport type BlendModeRegistry<BlendModes extends BaseBlendModes = BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>;\nexport function makeBlendModeRegistry<BlendModes extends BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]>(blendModes: BlendModes, initialEntries: Record<Index, BlendColor32>, registryName = 'anonymous') {\n const blendToName = new Map<BlendColor32, Name>();\n const blendToIndex = new Map<BlendColor32, Index>();\n const indexToName: Name[] = [];\n const indexToBlend: BlendColor32[] = [];\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 };\n const nameToIndex = {} as Record<Name, Index>;\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n indexToName[index] = name;\n indexToBlend[index] = blendFn;\n blendToIndex.set(blendFn, index);\n blendToName.set(blendFn, name);\n nameToBlend[name] = blendFn;\n nameToIndex[name] = index;\n };\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index];\n add(name as Name, index as Index, blend);\n }\n return {\n registryName,\n nameToBlend,\n nameToIndex,\n blendToIndex,\n blendToName,\n indexToBlend,\n indexToName,\n indexType: null as unknown as Index,\n nameType: null as unknown as Name\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEJhc2VCbGVuZE1vZGVzIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcblxuZXhwb3J0IHR5cGUgQmxlbmRNb2RlUmVnaXN0cnk8XG4gIEJsZW5kTW9kZXMgZXh0ZW5kcyBCYXNlQmxlbmRNb2RlcyA9IEJhc2VCbGVuZE1vZGVzLFxuICBOYW1lIGV4dGVuZHMga2V5b2YgQmxlbmRNb2RlcyA9IGtleW9mIEJsZW5kTW9kZXMsXG4gIEluZGV4IGV4dGVuZHMgQmxlbmRNb2Rlc1tOYW1lXSA9IEJsZW5kTW9kZXNbTmFtZV1cbj4gPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQmxlbmRNb2RlUmVnaXN0cnk8QmxlbmRNb2RlcywgTmFtZSwgSW5kZXg+PlxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5PFxuICBCbGVuZE1vZGVzIGV4dGVuZHMgQmFzZUJsZW5kTW9kZXMsXG4gIE5hbWUgZXh0ZW5kcyBrZXlvZiBCbGVuZE1vZGVzID0ga2V5b2YgQmxlbmRNb2RlcyxcbiAgSW5kZXggZXh0ZW5kcyBCbGVuZE1vZGVzW05hbWVdID0gQmxlbmRNb2Rlc1tOYW1lXVxuXG4+KFxuICBibGVuZE1vZGVzOiBCbGVuZE1vZGVzLFxuICBpbml0aWFsRW50cmllczogUmVjb3JkPEluZGV4LCBCbGVuZENvbG9yMzI+LFxuICByZWdpc3RyeU5hbWUgPSAnYW5vbnltb3VzJyxcbikge1xuXG4gIGNvbnN0IGJsZW5kVG9OYW1lID0gbmV3IE1hcDxCbGVuZENvbG9yMzIsIE5hbWU+KClcbiAgY29uc3QgYmxlbmRUb0luZGV4ID0gbmV3IE1hcDxCbGVuZENvbG9yMzIsIEluZGV4PigpXG4gIGNvbnN0IGluZGV4VG9OYW1lOiBOYW1lW10gPSBbXVxuICBjb25zdCBpbmRleFRvQmxlbmQ6IEJsZW5kQ29sb3IzMltdID0gW11cbiAgY29uc3QgbmFtZVRvQmxlbmQgPSB7fSBhcyB7IFtLIGluIGtleW9mIEJsZW5kTW9kZXNdOiBCbGVuZENvbG9yMzIgfVxuICBjb25zdCBuYW1lVG9JbmRleCA9IHt9IGFzIFJlY29yZDxOYW1lLCBJbmRleD5cblxuICBjb25zdCBhZGQgPSAobmFtZTogTmFtZSwgaW5kZXg6IEluZGV4LCBibGVuZEZuOiBCbGVuZENvbG9yMzIpID0+IHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kZXggXCIke2luZGV4fVwiIGlzIG5vdCBhIG51bWJlci4gQXR0ZW1wdGluZyB0byBhZGQgbmFtZTogXCIke25hbWUgYXMgc3RyaW5nfVwiLCBpbmRleDogXCIke2luZGV4fVwiYClcbiAgICB9XG5cbiAgICBpZiAoaW5kZXhUb0JsZW5kW2luZGV4XSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBCbGVuZCBNb2RlIGluZGV4OiAke2luZGV4fSBpcyBhbHJlYWR5IHVzZWQuIEF0dGVtcHRpbmcgdG8gYWRkIG5hbWU6IFwiJHtuYW1lIGFzIHN0cmluZ31cIiwgaW5kZXg6IFwiJHtpbmRleH1cImApXG4gICAgfVxuXG4gICAgaW5kZXhUb05hbWVbaW5kZXhdID0gbmFtZVxuICAgIGluZGV4VG9CbGVuZFtpbmRleF0gPSBibGVuZEZuXG4gICAgYmxlbmRUb0luZGV4LnNldChibGVuZEZuLCBpbmRleClcbiAgICBibGVuZFRvTmFtZS5zZXQoYmxlbmRGbiwgbmFtZSlcbiAgICBuYW1lVG9CbGVuZFtuYW1lXSA9IGJsZW5kRm5cbiAgICBuYW1lVG9JbmRleFtuYW1lXSA9IGluZGV4XG4gIH1cblxuICBmb3IgKGNvbnN0IFtuYW1lLCBpbmRleF0gb2YgT2JqZWN0LmVudHJpZXMoYmxlbmRNb2RlcykpIHtcbiAgICBjb25zdCBibGVuZCA9IGluaXRpYWxFbnRyaWVzW2luZGV4IGFzIEluZGV4XVxuICAgIGFkZChuYW1lIGFzIE5hbWUsIGluZGV4IGFzIEluZGV4LCBibGVuZClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVnaXN0cnlOYW1lLFxuICAgIG5hbWVUb0JsZW5kLFxuICAgIG5hbWVUb0luZGV4LFxuXG4gICAgYmxlbmRUb0luZGV4LFxuICAgIGJsZW5kVG9OYW1lLFxuXG4gICAgaW5kZXhUb0JsZW5kLFxuICAgIGluZGV4VG9OYW1lLFxuXG4gICAgaW5kZXhUeXBlOiBudWxsIGFzIHVua25vd24gYXMgSW5kZXgsXG4gICAgbmFtZVR5cGU6IG51bGwgYXMgdW5rbm93biBhcyBOYW1lLFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwriteFast = overwriteBase;\nexport const sourceOverFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return src;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = sr * sa + dr * invA >> 8;\n const g = sg * sa + dg * invA >> 8;\n const b = sb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (src * dst) / 255 */\nexport const multiplyFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n\n // Consistent floor rounding for all channels\n const br = sr * dr >> 8;\n const bg = sg * dg >> 8;\n const bb = sb * db >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** 255 - (255-src)/dst */\nexport const colorBurnFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / sr | 0);\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / sg | 0);\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + da * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst - 255 */\nexport const linearBurnFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255;\n const bgU = dg + sg - 255;\n const bbU = db + sb - 255;\n const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb;\n if (lumSrc < lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(src, dst) */\nexport const lightenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const br = Math.max(src & 0xFF, dst & 0xFF);\n const bg = Math.max(src >> 8 & 0xFF, dst >> 8 & 0xFF);\n const bb = Math.max(src >> 16 & 0xFF, dst >> 16 & 0xFF);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const dr = dst & 0xFF;\n const dg = dst >> 8 & 0xFF;\n const db = dst >> 16 & 0xFF;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = 255 - ((255 - (src & 0xFF)) * (255 - dr) >> 8);\n const bg = 255 - ((255 - (src >>> 8 & 0xFF)) * (255 - dg) >> 8);\n const bb = 255 - ((255 - (src >>> 16 & 0xFF)) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgeFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 255 ? 255 : Math.min(255, (dr << 8) / (255 - sr) | 0);\n const bg = sg === 255 ? 255 : Math.min(255, (dg << 8) / (255 - sg) | 0);\n const bb = sb === 255 ? 255 : Math.min(255, (db << 8) / (255 - sb) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst */\nexport const linearDodgeFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brU = (src & 0xFF) + dr;\n const bgU = (src >>> 8 & 0xFF) + dg;\n const bbU = (src >>> 16 & 0xFF) + db;\n const br = brU > 255 ? 255 : brU;\n const bg = bgU > 255 ? 255 : bgU;\n const bb = bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // Selection Logic (Base result)\n let br, bg, bb;\n if (lumSrc > lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);\n const bg = dg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);\n const bb = db < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (255 - dr) * (sr * dr >> 8) + dr * (255 - ((255 - sr) * (255 - dr) >> 8)) >> 8;\n const bg = (255 - dg) * (sg * dg >> 8) + dg * (255 - ((255 - sg) * (255 - dg) >> 8)) >> 8;\n const bb = (255 - db) * (sb * db >> 8) + db * (255 - ((255 - sb) * (255 - db) >> 8)) >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? 2 * sr * dr >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8);\n const bg = sg < 128 ? 2 * sg * dg >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8);\n const bb = sb < 128 ? 2 * sb * db >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0);\n const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0);\n const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const bgU = dg + 2 * sg - 255;\n const bbU = db + 2 * sb - 255;\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? dr < 2 * sr ? dr : 2 * sr : dr > 2 * sr - 256 ? dr : 2 * sr - 256;\n const bg = sg < 128 ? dg < 2 * sg ? dg : 2 * sg : dg > 2 * sg - 256 ? dg : 2 * sg - 256;\n const bb = sb < 128 ? db < 2 * sb ? db : 2 * sb : db > 2 * sb - 256 ? db : 2 * sb - 256;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - (255 - dr << 8) / (2 * sr) | 0) : sr === 255 ? 255 : Math.min(255, (dr << 8) / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;\n const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - (255 - dg << 8) / (2 * sg) | 0) : sg === 255 ? 255 : Math.min(255, (dg << 8) / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;\n const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - (255 - db << 8) / (2 * sb) | 0) : sb === 255 ? 255 : Math.min(255, (db << 8) / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.abs(src - dst) */\nexport const differenceFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brD = (src & 0xFF) - dr;\n const bgD = (src >>> 8 & 0xFF) - dg;\n const bbD = (src >>> 16 & 0xFF) - db;\n const br = brD < 0 ? -brD : brD;\n const bg = bgD < 0 ? -bgD : bgD;\n const bb = bbD < 0 ? -bbD : bbD;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = dr + sr - (dr * sr >> 7);\n const bg = dg + sg - (dg * sg >> 7);\n const bb = db + sb - (db * sb >> 7);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(0, dst - src) */\nexport const subtractFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const bgU = dg - sg;\n const bbU = db - sb;\n const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const divideFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 0 ? 255 : Math.min(255, (dr << 8) / sr | 0);\n const bg = sg === 0 ? 255 : Math.min(255, (dg << 8) / sg | 0);\n const bb = sb === 0 ? 255 : Math.min(255, (db << 8) / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const r = br * sa + dr * invA >> 8;\n const g = bg * sa + dg * invA >> 8;\n const b = bb * sa + db * invA >> 8;\n const a = 255 * sa + (dst >>> 24 & 0xFF) * invA >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast\n};\nexport function makeFastBlendModeRegistry(name = 'fast') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBCYXNlQmxlbmRNb2RlLCBvdmVyd3JpdGVCYXNlIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcbmltcG9ydCB7IG1ha2VCbGVuZE1vZGVSZWdpc3RyeSB9IGZyb20gJy4vQmxlbmRNb2RlUmVnaXN0cnknXG5cbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVGYXN0ID0gb3ZlcndyaXRlQmFzZVxuXG5leHBvcnQgY29uc3Qgc291cmNlT3ZlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiBzcmNcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChzciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoc2cgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKHNiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArIGRhICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCBkYXJrZW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBzciA8IGRyID8gc3IgOiBkclxuICBjb25zdCBiZyA9IHNnIDwgZGcgPyBzZyA6IGRnXG4gIGNvbnN0IGJiID0gc2IgPCBkYiA/IHNiIDogZGJcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIC8vIENvbnNpc3RlbnQgZmxvb3Igcm91bmRpbmcgZm9yIGFsbCBjaGFubmVsc1xuICBjb25zdCBiciA9IChzciAqIGRyKSA+PiA4XG4gIGNvbnN0IGJnID0gKHNnICogZGcpID4+IDhcbiAgY29uc3QgYmIgPSAoc2IgKiBkYikgPj4gOFxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHIgPSAoYnIgKiBzYSArIGRyICogaW52QSkgPj4gOFxuICBjb25zdCBnID0gKGJnICogc2EgKyBkZyAqIGludkEpID4+IDhcbiAgY29uc3QgYiA9IChiYiAqIHNhICsgZGIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGEgPSAoMjU1ICogc2EgKyBkYSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogMjU1IC0gKDI1NS1zcmMpL2RzdCAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yQnVybkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gZHIgPT09IDI1NSA/IDI1NSA6IHNyID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRyKSA8PCA4KSAvIHNyKSB8IDApXG4gIGNvbnN0IGJnID0gZGcgPT09IDI1NSA/IDI1NSA6IHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvIHNnKSB8IDApXG4gIGNvbnN0IGJiID0gZGIgPT09IDI1NSA/IDI1NSA6IHNiID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRiKSA8PCA4KSAvIHNiKSB8IDApXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgZGEgKiBpbnZBKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAtIDI1NSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckJ1cm5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTVcbiAgY29uc3QgYmdVID0gZGcgKyBzZyAtIDI1NVxuICBjb25zdCBiYlUgPSBkYiArIHNiIC0gMjU1XG5cbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVXG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbmV4cG9ydCBjb25zdCBkYXJrZXJGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyAxLiBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIFdlaWdodHM6IFI6MC4zLCBHOjAuNTksIEI6MC4xMSlcbiAgLy8gU2NhbGVkIGJ5IDI1NiBmb3IgaW50ZWdlciBtYXRoOiA3NywgMTUxLCAyOFxuICBjb25zdCBsdW1TcmMgPSAoc3IgKiA3NyArIHNnICogMTUxICsgc2IgKiAyOClcbiAgY29uc3QgbHVtRHN0ID0gKGRyICogNzcgKyBkZyAqIDE1MSArIGRiICogMjgpXG5cbiAgLy8gMi4gU2VsZWN0aW9uIExvZ2ljXG4gIC8vIFBpY2sgdGhlIHBlcmNlcHR1YWxseSBkYXJrZXIgcGl4ZWxcbiAgbGV0IGJyLCBiZywgYmJcbiAgaWYgKGx1bVNyYyA8IGx1bURzdCkge1xuICAgIGJyID0gc3JcbiAgICBiZyA9IHNnXG4gICAgYmIgPSBzYlxuICB9IGVsc2Uge1xuICAgIGJyID0gZHJcbiAgICBiZyA9IGRnXG4gICAgYmIgPSBkYlxuICB9XG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIDMuIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoc3JjLCBkc3QpICovXG5leHBvcnQgY29uc3QgbGlnaHRlbkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IGJyID0gTWF0aC5tYXgoc3JjICYgMHhGRiwgZHN0ICYgMHhGRilcbiAgY29uc3QgYmcgPSBNYXRoLm1heCgoc3JjID4+IDgpICYgMHhGRiwgKGRzdCA+PiA4KSAmIDB4RkYpXG4gIGNvbnN0IGJiID0gTWF0aC5tYXgoKHNyYyA+PiAxNikgJiAweEZGLCAoZHN0ID4+IDE2KSAmIDB4RkYpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4gOCkgJiAweEZGXG4gIGNvbnN0IGRiID0gKGRzdCA+PiAxNikgJiAweEZGXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKlxuICogMjU1IC0gKCgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpXG4gKi9cbmV4cG9ydCBjb25zdCBzY3JlZW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gMjU1IC0gKCgoMjU1IC0gKHNyYyAmIDB4RkYpKSAqICgyNTUgLSBkcikpID4+IDgpXG4gIGNvbnN0IGJnID0gMjU1IC0gKCgoMjU1IC0gKChzcmMgPj4+IDgpICYgMHhGRikpICogKDI1NSAtIGRnKSkgPj4gOClcbiAgY29uc3QgYmIgPSAyNTUgLSAoKCgyNTUgLSAoKHNyYyA+Pj4gMTYpICYgMHhGRikpICogKDI1NSAtIGRiKSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRzdCA8PCA4KSAvICgyNTUgLSBzcmMpKSAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yRG9kZ2VGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiciA9IHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMjU1IC0gc3IpKSB8IDApXG4gIGNvbnN0IGJnID0gc2cgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkZyA8PCA4KSAvICgyNTUgLSBzZykpIHwgMClcbiAgY29uc3QgYmIgPSBzYiA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRiIDw8IDgpIC8gKDI1NSAtIHNiKSkgfCAwKVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IHIgPSAoYnIgKiBzYSArIGRyICogaW52QSkgPj4gOFxuICBjb25zdCBnID0gKGJnICogc2EgKyBkZyAqIGludkEpID4+IDhcbiAgY29uc3QgYiA9IChiYiAqIHNhICsgZGIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGEgPSAoMjU1ICogc2EgKyAoKGRzdCA+Pj4gMjQpICYgMHhGRikgKiBpbnZBKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckRvZGdlRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnJVID0gKHNyYyAmIDB4RkYpICsgZHJcbiAgY29uc3QgYmdVID0gKChzcmMgPj4+IDgpICYgMHhGRikgKyBkZ1xuICBjb25zdCBiYlUgPSAoKHNyYyA+Pj4gMTYpICYgMHhGRikgKyBkYlxuXG4gIGNvbnN0IGJyID0gYnJVID4gMjU1ID8gMjU1IDogYnJVXG4gIGNvbnN0IGJnID0gYmdVID4gMjU1ID8gMjU1IDogYmdVXG4gIGNvbnN0IGJiID0gYmJVID4gMjU1ID8gMjU1IDogYmJVXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgbGlnaHRlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIC8vIENhbGN1bGF0ZSBMdW1pbm9zaXR5IChQaG90b3Nob3AgdXNlcyBXZWlnaHRzOiBSOjAuMywgRzowLjU5LCBCOjAuMTEpXG4gIC8vIFdlIHVzZSBpbnRlZ2VyIG1hdGggKHNjYWxlZCBieSAyNTYpIGZvciBzcGVlZC5cbiAgY29uc3QgbHVtU3JjID0gKHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjgpXG4gIGNvbnN0IGx1bURzdCA9IChkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4KVxuXG4gIC8vIFNlbGVjdGlvbiBMb2dpYyAoQmFzZSByZXN1bHQpXG4gIGxldCBiciwgYmcsIGJiXG4gIGlmIChsdW1TcmMgPiBsdW1Ec3QpIHtcbiAgICBiciA9IHNyXG4gICAgYmcgPSBzZ1xuICAgIGJiID0gc2JcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyXG4gICAgYmcgPSBkZ1xuICAgIGJiID0gZGJcbiAgfVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyAoMiAqIHNyYyAqIGRzdCkgOiAoMjU1IC0gMiAqICgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpICovXG5leHBvcnQgY29uc3Qgb3ZlcmxheUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gZHIgPCAxMjggPyAoMiAqIHNyICogZHIpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpID4+IDgpXG4gIGNvbnN0IGJnID0gZGcgPCAxMjggPyAoMiAqIHNnICogZGcpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpID4+IDgpXG4gIGNvbnN0IGJiID0gZGIgPCAxMjggPyAoMiAqIHNiICogZGIpID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpID4+IDgpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogKCgyNTUgLSBkc3QpICogKChzcmMgKiBkc3QpID4+IDgpICsgZHN0ICogKDI1NSAtICgoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSkgPj4gOCkpKSA+PiA4ICovXG5leHBvcnQgY29uc3Qgc29mdExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAoKDI1NSAtIGRyKSAqICgoc3IgKiBkcikgPj4gOCkgKyBkciAqICgyNTUgLSAoKCgyNTUgLSBzcikgKiAoMjU1IC0gZHIpKSA+PiA4KSkpID4+IDhcbiAgY29uc3QgYmcgPSAoKDI1NSAtIGRnKSAqICgoc2cgKiBkZykgPj4gOCkgKyBkZyAqICgyNTUgLSAoKCgyNTUgLSBzZykgKiAoMjU1IC0gZGcpKSA+PiA4KSkpID4+IDhcbiAgY29uc3QgYmIgPSAoKDI1NSAtIGRiKSAqICgoc2IgKiBkYikgPj4gOCkgKyBkYiAqICgyNTUgLSAoKCgyNTUgLSBzYikgKiAoMjU1IC0gZGIpKSA+PiA4KSkpID4+IDhcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBJZiBzcmMgPCAxMjggKDUwJSBncmF5KSwgTXVsdGlwbHk7IG90aGVyd2lzZSwgU2NyZWVuICovXG5leHBvcnQgY29uc3QgaGFyZExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/ICgyICogc3IgKiBkcikgPj4gOCA6IDI1NSAtICgoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpKSA+PiA4KVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKDIgKiBzZyAqIGRnKSA+PiA4IDogMjU1IC0gKCgyICogKDI1NSAtIHNnKSAqICgyNTUgLSBkZykpID4+IDgpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoMiAqIHNiICogZGIpID4+IDggOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2IpICogKDI1NSAtIGRiKSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKlxuICogSWYgc3JjIDwgMTI4OiBCdXJuKGRzdCwgMiAqIHNyYylcbiAqIElmIHNyYyA+PSAxMjg6IERvZGdlKGRzdCwgMiAqIChzcmMgLSAxMjgpKVxuICovXG5leHBvcnQgY29uc3Qgdml2aWRMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgoMjU1IC0gZHIpIDw8IDgpIC8gKDIgKiBzcikpIHwgMCkpIDogKHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMiAqICgyNTUgLSBzcikpKSB8IDApKVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvICgyICogc2cpKSB8IDApKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSlcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IChzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoKCgyNTUgLSBkYikgPDwgOCkgLyAoMiAqIHNiKSkgfCAwKSkgOiAoc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvICgyICogKDI1NSAtIHNiKSkpIHwgMCkpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgMiAqIHNyYyAtIDI1NSAoQ2xhbXBlZCB0byAwLTI1NSkgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyVSA9IGRyICsgMiAqIHNyIC0gMjU1XG4gIGNvbnN0IGJnVSA9IGRnICsgMiAqIHNnIC0gMjU1XG4gIGNvbnN0IGJiVSA9IGRiICsgMiAqIHNiIC0gMjU1XG5cbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVSA+IDI1NSA/IDI1NSA6IGJyVVxuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVID4gMjU1ID8gMjU1IDogYmdVXG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlUgPiAyNTUgPyAyNTUgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyBtaW4oZHN0LCAyICogc3JjKSA6IG1heChkc3QsIDIgKiAoc3JjIC0gMTI4KSkgKi9cbmV4cG9ydCBjb25zdCBwaW5MaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoZHIgPCAyICogc3IgPyBkciA6IDIgKiBzcikgOiAoZHIgPiAyICogc3IgLSAyNTYgPyBkciA6IDIgKiBzciAtIDI1NilcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IChkZyA8IDIgKiBzZyA/IGRnIDogMiAqIHNnKSA6IChkZyA+IDIgKiBzZyAtIDI1NiA/IGRnIDogMiAqIHNnIC0gMjU2KVxuICBjb25zdCBiYiA9IHNiIDwgMTI4ID8gKGRiIDwgMiAqIHNiID8gZGIgOiAyICogc2IpIDogKGRiID4gMiAqIHNiIC0gMjU2ID8gZGIgOiAyICogc2IgLSAyNTYpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogKFZpdmlkIExpZ2h0IGxvZ2ljIGZvcmNlZCB0byAwIG9yIDI1NSkgKi9cbmV4cG9ydCBjb25zdCBoYXJkTWl4RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAoc3IgPCAxMjggPyAoc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgoMjU1IC0gZHIpIDw8IDgpIC8gKDIgKiBzcikpIHwgMCkpIDogKHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyAoMiAqICgyNTUgLSBzcikpKSB8IDApKSkgPCAxMjggPyAwIDogMjU1XG4gIGNvbnN0IGJnID0gKHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoKDI1NSAtIGRnKSA8PCA4KSAvICgyICogc2cpKSB8IDApKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpIDwgMTI4ID8gMCA6IDI1NVxuICBjb25zdCBiYiA9IChzYiA8IDEyOCA/IChzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoKCgyNTUgLSBkYikgPDwgOCkgLyAoMiAqIHNiKSkgfCAwKSkgOiAoc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvICgyICogKDI1NSAtIHNiKSkpIHwgMCkpKSA8IDEyOCA/IDAgOiAyNTVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBNYXRoLmFicyhzcmMgLSBkc3QpICovXG5leHBvcnQgY29uc3QgZGlmZmVyZW5jZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnJEID0gKHNyYyAmIDB4RkYpIC0gZHJcbiAgY29uc3QgYmdEID0gKChzcmMgPj4+IDgpICYgMHhGRikgLSBkZ1xuICBjb25zdCBiYkQgPSAoKHNyYyA+Pj4gMTYpICYgMHhGRikgLSBkYlxuXG4gIGNvbnN0IGJyID0gYnJEIDwgMCA/IC1ickQgOiBickRcbiAgY29uc3QgYmcgPSBiZ0QgPCAwID8gLWJnRCA6IGJnRFxuICBjb25zdCBiYiA9IGJiRCA8IDAgPyAtYmJEIDogYmJEXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgc3JjIC0gKChkc3QgKiBzcmMpID4+IDcpICovXG5leHBvcnQgY29uc3QgZXhjbHVzaW9uRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBkciArIHNyIC0gKChkciAqIHNyKSA+PiA3KVxuICBjb25zdCBiZyA9IGRnICsgc2cgLSAoKGRnICogc2cpID4+IDcpXG4gIGNvbnN0IGJiID0gZGIgKyBzYiAtICgoZGIgKiBzYikgPj4gNylcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCByID0gKGJyICogc2EgKyBkciAqIGludkEpID4+IDhcbiAgY29uc3QgZyA9IChiZyAqIHNhICsgZGcgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGIgPSAoYmIgKiBzYSArIGRiICogaW52QSkgPj4gOFxuICBjb25zdCBhID0gKDI1NSAqIHNhICsgKChkc3QgPj4+IDI0KSAmIDB4RkYpICogaW52QSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBNYXRoLm1heCgwLCBkc3QgLSBzcmMpICovXG5leHBvcnQgY29uc3Qgc3VidHJhY3RGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiclUgPSBkciAtIHNyXG4gIGNvbnN0IGJnVSA9IGRnIC0gc2dcbiAgY29uc3QgYmJVID0gZGIgLSBzYlxuXG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclVcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvIHNyKSAqL1xuZXhwb3J0IGNvbnN0IGRpdmlkZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZHIgPDwgOCkgLyBzcikgfCAwKVxuICBjb25zdCBiZyA9IHNnID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnIDw8IDgpIC8gc2cpIHwgMClcbiAgY29uc3QgYmIgPSBzYiA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiA8PCA4KSAvIHNiKSB8IDApXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgciA9IChiciAqIHNhICsgZHIgKiBpbnZBKSA+PiA4XG4gIGNvbnN0IGcgPSAoYmcgKiBzYSArIGRnICogaW52QSkgPj4gOFxuICBjb25zdCBiID0gKGJiICogc2EgKyBkYiAqIGludkEpID4+IDhcbiAgY29uc3QgYSA9ICgyNTUgKiBzYSArICgoZHN0ID4+PiAyNCkgJiAweEZGKSAqIGludkEpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgQkFTRV9GQVNUX0JMRU5EX01PREVfRlVOQ1RJT05TOiBSZWNvcmQ8bnVtYmVyLCBCbGVuZENvbG9yMzI+ID0ge1xuICBbQmFzZUJsZW5kTW9kZS5vdmVyd3JpdGVdOiBvdmVyd3JpdGVGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5zb3VyY2VPdmVyXTogc291cmNlT3ZlckZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRhcmtlbl06IGRhcmtlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLm11bHRpcGx5XTogbXVsdGlwbHlGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5jb2xvckJ1cm5dOiBjb2xvckJ1cm5GYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJCdXJuXTogbGluZWFyQnVybkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRhcmtlckNvbG9yXTogZGFya2VyRmFzdCxcblxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVuXTogbGlnaHRlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNjcmVlbl06IHNjcmVlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmNvbG9yRG9kZ2VdOiBjb2xvckRvZGdlRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyRG9kZ2VdOiBsaW5lYXJEb2RnZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpZ2h0ZXJDb2xvcl06IGxpZ2h0ZXJGYXN0LFxuXG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJsYXldOiBvdmVybGF5RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc29mdExpZ2h0XTogc29mdExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuaGFyZExpZ2h0XTogaGFyZExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUudml2aWRMaWdodF06IHZpdmlkTGlnaHRGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJMaWdodF06IGxpbmVhckxpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUucGluTGlnaHRdOiBwaW5MaWdodEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRNaXhdOiBoYXJkTWl4RmFzdCxcblxuICBbQmFzZUJsZW5kTW9kZS5kaWZmZXJlbmNlXTogZGlmZmVyZW5jZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmV4Y2x1c2lvbl06IGV4Y2x1c2lvbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnN1YnRyYWN0XTogc3VidHJhY3RGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5kaXZpZGVdOiBkaXZpZGVGYXN0LFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUZhc3RCbGVuZE1vZGVSZWdpc3RyeShuYW1lID0gJ2Zhc3QnKSB7XG4gIHJldHVybiBtYWtlQmxlbmRNb2RlUmVnaXN0cnkoQmFzZUJsZW5kTW9kZSwgQkFTRV9GQVNUX0JMRU5EX01PREVfRlVOQ1RJT05TLCBuYW1lKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwritePerfect = overwriteBase;\nexport const sourceOverPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return src;\n if (sa === 0) return dst;\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return src;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const invA = 255 - sa;\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = sr * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (src * dst) / 255 */\nexport const multiplyPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr;\n const br = mR + 1 + (mR >> 8) >> 8;\n const mG = sg * dg;\n const bg = mG + 1 + (mG >> 8) >> 8;\n const mB = sb * db;\n const bb = mB + 1 + (mB >> 8) >> 8;\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** 255 - (255-src)/dst */\nexport const colorBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - ((255 - dr) * 255 / sr | 0);\n const br = resR < 0 ? 0 : resR;\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - ((255 - dg) * 255 / sg | 0);\n const bg = resG < 0 ? 0 : resG;\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - ((255 - db) * 255 / sb | 0);\n const bb = resB < 0 ? 0 : resB;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst - 255 */\nexport const linearBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg + sg - 255;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db + sb - 255;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb;\n if (lumSrc < lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(src, dst) */\nexport const lightenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = (src & 0xFF) > dr ? src & 0xFF : dr;\n const bg = (src >>> 8 & 0xFF) > dg ? src >>> 8 & 0xFF : dg;\n const bb = (src >>> 16 & 0xFF) > db ? src >>> 16 & 0xFF : db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = 255 - ((255 - (src & 0xFF)) * (255 - dr) / 255 | 0);\n const bg = 255 - ((255 - (src >>> 8 & 0xFF)) * (255 - dg) / 255 | 0);\n const bb = 255 - ((255 - (src >>> 16 & 0xFF)) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : dr * 255 / (255 - sr) | 0;\n const br = resR > 255 ? 255 : resR;\n const resG = sg === 255 ? 255 : dg * 255 / (255 - sg) | 0;\n const bg = resG > 255 ? 255 : resG;\n const resB = sb === 255 ? 255 : db * 255 / (255 - sb) | 0;\n const bb = resB > 255 ? 255 : resB;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src + dst */\nexport const linearDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brU = (src & 0xFF) + dr;\n const br = brU > 255 ? 255 : brU;\n const bgU = (src >>> 8 & 0xFF) + dg;\n const bg = bgU > 255 ? 255 : bgU;\n const bbU = (src >>> 16 & 0xFF) + db;\n const bb = bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = sr * 77 + sg * 151 + sb * 28;\n const lumDst = dr * 77 + dg * 151 + db * 28;\n\n // Selection Logic (Base result)\n let br, bg, bb;\n if (lumSrc > lumDst) {\n br = sr;\n bg = sg;\n bb = sb;\n } else {\n br = dr;\n bg = dg;\n bb = db;\n }\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = dg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = db < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const mR = sr * dr;\n const scR = (255 - sr) * (255 - dr);\n const br = (255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) + 1 + ((255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) >> 8) >> 8;\n const mG = sg * dg;\n const scG = (255 - sg) * (255 - dg);\n const bg = (255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) + 1 + ((255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) >> 8) >> 8;\n const mB = sb * db;\n const scB = (255 - sb) * (255 - db);\n const bb = (255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) + 1 + ((255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) >> 8) >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = sg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = sb < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0);\n const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0);\n const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;\n const bgU = dg + 2 * sg - 255;\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;\n const bbU = db + 2 * sb - 255;\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? dr < sr << 1 ? dr : sr << 1 : dr > sr - 128 << 1 ? dr : sr - 128 << 1;\n const bg = sg < 128 ? dg < sg << 1 ? dg : sg << 1 : dg > sg - 128 << 1 ? dg : sg - 128 << 1;\n const bb = sb < 128 ? db < sb << 1 ? db : sb << 1 : db > sb - 128 << 1 ? db : sb - 128 << 1;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;\n const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;\n const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.abs(src - dst) */\nexport const differencePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = dr > sr ? dr - sr : sr - dr;\n const bg = dg > sg ? dg - sg : sg - dg;\n const bb = db > sb ? db - sb : sb - db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const r2 = dr * sr;\n const br = dr + sr - (r2 + r2 + 1 + (r2 + r2 >> 8) >> 8);\n const g2 = dg * sg;\n const bg = dg + sg - (g2 + g2 + 1 + (g2 + g2 >> 8) >> 8);\n const b2 = db * sb;\n const bb = db + sb - (b2 + b2 + 1 + (b2 + b2 >> 8) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** Math.max(0, dst - src) */\nexport const subtractPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg - sg;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db - sb;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const dividePerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 0 ? 255 : Math.min(255, dr * 255 / sr | 0);\n const bg = sg === 0 ? 255 : Math.min(255, dg * 255 / sg | 0);\n const bb = sb === 0 ? 255 : Math.min(255, db * 255 / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect\n};\nexport function makePerfectBlendModeRegistry(name = 'perfect') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBCYXNlQmxlbmRNb2RlLCBvdmVyd3JpdGVCYXNlIH0gZnJvbSAnLi9ibGVuZC1tb2RlcydcbmltcG9ydCB7IG1ha2VCbGVuZE1vZGVSZWdpc3RyeSB9IGZyb20gJy4vQmxlbmRNb2RlUmVnaXN0cnknXG5cbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVQZXJmZWN0ID0gb3ZlcndyaXRlQmFzZVxuXG5leHBvcnQgY29uc3Qgc291cmNlT3ZlclBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiBzcmNcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG4gIGlmIChkYSA9PT0gMCkgcmV0dXJuIHNyY1xuXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgLy8gRXhhY3QgZGl2aXNpb24gYnkgMjU1IHVzaW5nIGJpdC1zaGlmdHNcbiAgLy8gRm9ybXVsYTogKHYgKyAxICsgKHYgPj4gOCkpID4+IDhcbiAgY29uc3QgdFIgPSAoc3IgKiBzYSArIGRyICogaW52QSlcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IChzZyAqIHNhICsgZGcgKiBpbnZBKVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IHRCID0gKHNiICogc2EgKyBkYiAqIGludkEpXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEEgPSAoMjU1ICogc2EgKyBkYSAqIGludkEpXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IGRhcmtlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBiciA9IHNyIDwgZHIgPyBzciA6IGRyXG4gIGNvbnN0IGJnID0gc2cgPCBkZyA/IHNnIDogZGdcbiAgY29uc3QgYmIgPSBzYiA8IGRiID8gc2IgOiBkYlxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkZcbiAgY29uc3QgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkZcbiAgY29uc3QgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRlxuICBjb25zdCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRlxuICBjb25zdCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyBDYWxjdWxhdGUgYmFzZSBtdWx0aXBseSByZXN1bHQ6IChzciAqIGRyKSAvIDI1NVxuICBjb25zdCBtUiA9IHNyICogZHJcbiAgY29uc3QgYnIgPSAobVIgKyAxICsgKG1SID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgbUcgPSBzZyAqIGRnXG4gIGNvbnN0IGJnID0gKG1HICsgMSArIChtRyA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1CID0gc2IgKiBkYlxuICBjb25zdCBiYiA9IChtQiArIDEgKyAobUIgPj4gOCkpID4+IDhcblxuICAvLyBJZiBmdWxseSBvcGFxdWUsIHJldHVybiB3aXRoIGZ1bGwgYWxwaGFcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIDI1NSAtICgyNTUtc3JjKS9kc3QgKi9cbmV4cG9ydCBjb25zdCBjb2xvckJ1cm5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBzciA9IHNyYyAmIDB4RkZcbiAgY29uc3Qgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkZcbiAgY29uc3Qgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gQ29sb3IgQnVybiBDb3JlIE1hdGg6IDI1NSAtICgoMjU1IC0gZHN0KSAqIDI1NSAvIHNyYylcbiAgLy8gV2UgdXNlIHwgMCB0byB0cnVuY2F0ZSB0aGUgZGl2aXNpb24gcmVzdWx0IGltbWVkaWF0ZWx5LlxuICBjb25zdCByZXNSID0gZHIgPT09IDI1NSA/IDI1NSA6IHNyID09PSAwID8gMCA6IDI1NSAtICgoKDI1NSAtIGRyKSAqIDI1NSAvIHNyKSB8IDApXG4gIGNvbnN0IGJyID0gcmVzUiA8IDAgPyAwIDogcmVzUlxuXG4gIGNvbnN0IHJlc0cgPSBkZyA9PT0gMjU1ID8gMjU1IDogc2cgPT09IDAgPyAwIDogMjU1IC0gKCgoMjU1IC0gZGcpICogMjU1IC8gc2cpIHwgMClcbiAgY29uc3QgYmcgPSByZXNHIDwgMCA/IDAgOiByZXNHXG5cbiAgY29uc3QgcmVzQiA9IGRiID09PSAyNTUgPyAyNTUgOiBzYiA9PT0gMCA/IDAgOiAyNTUgLSAoKCgyNTUgLSBkYikgKiAyNTUgLyBzYikgfCAwKVxuICBjb25zdCBiYiA9IHJlc0IgPCAwID8gMCA6IHJlc0JcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcblxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIHNyYyArIGRzdCAtIDI1NSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckJ1cm5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTVcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZ1UgPSBkZyArIHNnIC0gMjU1XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1VcbiAgY29uc3QgYmJVID0gZGIgKyBzYiAtIDI1NVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG5leHBvcnQgY29uc3QgZGFya2VyUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gMS4gQ2FsY3VsYXRlIEx1bWlub3NpdHkgKFBob3Rvc2hvcCBXZWlnaHRzOiBSOjAuMywgRzowLjU5LCBCOjAuMTEpXG4gIC8vIFNjYWxlZCBieSAyNTYgZm9yIGludGVnZXIgbWF0aDogNzcsIDE1MSwgMjhcbiAgY29uc3QgbHVtU3JjID0gKHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjgpXG4gIGNvbnN0IGx1bURzdCA9IChkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4KVxuXG4gIC8vIDIuIFNlbGVjdGlvbiBMb2dpY1xuICAvLyBQaWNrIHRoZSBwZXJjZXB0dWFsbHkgZGFya2VyIHBpeGVsXG4gIGxldCBiciwgYmcsIGJiXG4gIGlmIChsdW1TcmMgPCBsdW1Ec3QpIHtcbiAgICBiciA9IHNyXG4gICAgYmcgPSBzZ1xuICAgIGJiID0gc2JcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyXG4gICAgYmcgPSBkZ1xuICAgIGJiID0gZGJcbiAgfVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyAzLiBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoc3JjLCBkc3QpICovXG5leHBvcnQgY29uc3QgbGlnaHRlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyID0gKHNyYyAmIDB4RkYpID4gZHIgPyAoc3JjICYgMHhGRikgOiBkclxuICBjb25zdCBiZyA9ICgoc3JjID4+PiA4KSAmIDB4RkYpID4gZGcgPyAoKHNyYyA+Pj4gOCkgJiAweEZGKSA6IGRnXG4gIGNvbnN0IGJiID0gKChzcmMgPj4+IDE2KSAmIDB4RkYpID4gZGIgPyAoKHNyYyA+Pj4gMTYpICYgMHhGRikgOiBkYlxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqXG4gKiAyNTUgLSAoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmVlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSAyNTUgLSAoKCgyNTUgLSAoc3JjICYgMHhGRikpICogKDI1NSAtIGRyKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiZyA9IDI1NSAtICgoKDI1NSAtICgoc3JjID4+PiA4KSAmIDB4RkYpKSAqICgyNTUgLSBkZykgLyAyNTUpIHwgMClcbiAgY29uc3QgYmIgPSAyNTUgLSAoKCgyNTUgLSAoKHNyYyA+Pj4gMTYpICYgMHhGRikpICogKDI1NSAtIGRiKSAvIDI1NSkgfCAwKVxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG5cbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRzdCA8PCA4KSAvICgyNTUgLSBzcmMpKSAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yRG9kZ2VQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCBzciA9IHNyYyAmIDB4RkZcbiAgY29uc3Qgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkZcbiAgY29uc3Qgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgLy8gQ29sb3IgRG9kZ2UgQ29yZSBNYXRoOiAoZHN0ICogMjU1KSAvICgyNTUgLSBzcmMpXG4gIC8vIFdlIHVzZSB0ZXJuYXJ5IGNoZWNrcyB0byBoYW5kbGUgdGhlIHNyID09PSAyNTUgZGl2aXNpb24tYnktemVybyBndWFyZC5cbiAgY29uc3QgcmVzUiA9IHNyID09PSAyNTUgPyAyNTUgOiAoZHIgKiAyNTUgLyAoMjU1IC0gc3IpKSB8IDBcbiAgY29uc3QgYnIgPSByZXNSID4gMjU1ID8gMjU1IDogcmVzUlxuXG4gIGNvbnN0IHJlc0cgPSBzZyA9PT0gMjU1ID8gMjU1IDogKGRnICogMjU1IC8gKDI1NSAtIHNnKSkgfCAwXG4gIGNvbnN0IGJnID0gcmVzRyA+IDI1NSA/IDI1NSA6IHJlc0dcblxuICBjb25zdCByZXNCID0gc2IgPT09IDI1NSA/IDI1NSA6IChkYiAqIDI1NSAvICgyNTUgLSBzYikpIHwgMFxuICBjb25zdCBiYiA9IHJlc0IgPiAyNTUgPyAyNTUgOiByZXNCXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG5cbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgKyBkc3QgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJEb2RnZVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyVSA9IChzcmMgJiAweEZGKSArIGRyXG4gIGNvbnN0IGJyID0gYnJVID4gMjU1ID8gMjU1IDogYnJVXG4gIGNvbnN0IGJnVSA9ICgoc3JjID4+PiA4KSAmIDB4RkYpICsgZGdcbiAgY29uc3QgYmcgPSBiZ1UgPiAyNTUgPyAyNTUgOiBiZ1VcbiAgY29uc3QgYmJVID0gKChzcmMgPj4+IDE2KSAmIDB4RkYpICsgZGJcbiAgY29uc3QgYmIgPSBiYlUgPiAyNTUgPyAyNTUgOiBiYlVcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IGxpZ2h0ZXJQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICAvLyBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIHVzZXMgV2VpZ2h0czogUjowLjMsIEc6MC41OSwgQjowLjExKVxuICAvLyBXZSB1c2UgaW50ZWdlciBtYXRoIChzY2FsZWQgYnkgMjU2KSBmb3Igc3BlZWQuXG4gIGNvbnN0IGx1bVNyYyA9IChzciAqIDc3ICsgc2cgKiAxNTEgKyBzYiAqIDI4KVxuICBjb25zdCBsdW1Ec3QgPSAoZHIgKiA3NyArIGRnICogMTUxICsgZGIgKiAyOClcblxuICAvLyBTZWxlY3Rpb24gTG9naWMgKEJhc2UgcmVzdWx0KVxuICBsZXQgYnIsIGJnLCBiYlxuICBpZiAobHVtU3JjID4gbHVtRHN0KSB7XG4gICAgYnIgPSBzclxuICAgIGJnID0gc2dcbiAgICBiYiA9IHNiXG4gIH0gZWxzZSB7XG4gICAgYnIgPSBkclxuICAgIGJnID0gZGdcbiAgICBiYiA9IGRiXG4gIH1cblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBzcmMgPCAxMjggPyAoMiAqIHNyYyAqIGRzdCkgOiAoMjU1IC0gMiAqICgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpICovXG5leHBvcnQgY29uc3Qgb3ZlcmxheVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IGRyIDwgMTI4ID8gKDIgKiBzciAqIGRyIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc3IpICogKDI1NSAtIGRyKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiZyA9IGRnIDwgMTI4ID8gKDIgKiBzZyAqIGRnIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2cpICogKDI1NSAtIGRnKSAvIDI1NSkgfCAwKVxuICBjb25zdCBiYiA9IGRiIDwgMTI4ID8gKDIgKiBzYiAqIGRiIC8gMjU1KSB8IDAgOiAyNTUgLSAoKDIgKiAoMjU1IC0gc2IpICogKDI1NSAtIGRiKSAvIDI1NSkgfCAwKVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqICgoMjU1IC0gZHN0KSAqICgoc3JjICogZHN0KSA+PiA4KSArIGRzdCAqICgyNTUgLSAoKCgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpID4+IDgpKSkgPj4gOCAqL1xuZXhwb3J0IGNvbnN0IHNvZnRMaWdodFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IG1SID0gKHNyICogZHIpXG4gIGNvbnN0IHNjUiA9ICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpXG4gIGNvbnN0IGJyID0gKCgyNTUgLSBkcikgKiAoKG1SICsgMSArIChtUiA+PiA4KSkgPj4gOCkgKyBkciAqICgyNTUgLSAoKHNjUiArIDEgKyAoc2NSID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZHIpICogKChtUiArIDEgKyAobVIgPj4gOCkpID4+IDgpICsgZHIgKiAoMjU1IC0gKChzY1IgKyAxICsgKHNjUiA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1HID0gKHNnICogZGcpXG4gIGNvbnN0IHNjRyA9ICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpXG4gIGNvbnN0IGJnID0gKCgyNTUgLSBkZykgKiAoKG1HICsgMSArIChtRyA+PiA4KSkgPj4gOCkgKyBkZyAqICgyNTUgLSAoKHNjRyArIDEgKyAoc2NHID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZGcpICogKChtRyArIDEgKyAobUcgPj4gOCkpID4+IDgpICsgZGcgKiAoMjU1IC0gKChzY0cgKyAxICsgKHNjRyA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGNvbnN0IG1CID0gKHNiICogZGIpXG4gIGNvbnN0IHNjQiA9ICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpXG4gIGNvbnN0IGJiID0gKCgyNTUgLSBkYikgKiAoKG1CICsgMSArIChtQiA+PiA4KSkgPj4gOCkgKyBkYiAqICgyNTUgLSAoKHNjQiArIDEgKyAoc2NCID4+IDgpKSA+PiA4KSkgKyAxICsgKCgoMjU1IC0gZGIpICogKChtQiArIDEgKyAobUIgPj4gOCkpID4+IDgpICsgZGIgKiAoMjU1IC0gKChzY0IgKyAxICsgKHNjQiA+PiA4KSkgPj4gOCkpKSA+PiA4KSkgPj4gOFxuXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBJZiBzcmMgPCAxMjggKDUwJSBncmF5KSwgTXVsdGlwbHk7IG90aGVyd2lzZSwgU2NyZWVuICovXG5leHBvcnQgY29uc3QgaGFyZExpZ2h0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoMiAqIHNyICogZHIgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpIC8gMjU1KSB8IDApXG4gIGNvbnN0IGJnID0gc2cgPCAxMjggPyAoMiAqIHNnICogZGcgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpIC8gMjU1KSB8IDApXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoMiAqIHNiICogZGIgLyAyNTUpIHwgMCA6IDI1NSAtICgoMiAqICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpIC8gMjU1KSB8IDApXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKipcbiAqIElmIHNyYyA8IDEyODogQnVybihkc3QsIDIgKiBzcmMpXG4gKiBJZiBzcmMgPj0gMTI4OiBEb2RnZShkc3QsIDIgKiAoc3JjIC0gMTI4KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHZpdmlkTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRiwgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkYsIGRiID0gKGRzdCA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsIHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGLCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IChzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAoMjU1IC0gKCgoMjU1IC0gZHIpICogMjU1IC8gKDIgKiBzcikpIHwgMCkpKSkgOiAoc3IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkciAqIDI1NSAvICgyICogKDI1NSAtIHNyKSkpIHwgMCkpKVxuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsICgyNTUgLSAoKCgyNTUgLSBkZykgKiAyNTUgLyAoMiAqIHNnKSkgfCAwKSkpKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnICogMjU1IC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgKDI1NSAtICgoKDI1NSAtIGRiKSAqIDI1NSAvICgyICogc2IpKSB8IDApKSkpIDogKHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGIgKiAyNTUgLyAoMiAqICgyNTUgLSBzYikpKSB8IDApKSlcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2FcbiAgY29uc3QgZGEgPSAoZHN0ID4+PiAyNCkgJiAweEZGXG5cbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBXG4gIGNvbnN0IHIgPSAodFIgKyAxICsgKHRSID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QVxuICBjb25zdCBnID0gKHRHICsgMSArICh0RyA+PiA4KSkgPj4gOFxuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkFcbiAgY29uc3QgYiA9ICh0QiArIDEgKyAodEIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QVxuICBjb25zdCBhID0gKHRBICsgMSArICh0QSA+PiA4KSkgPj4gOFxuXG4gIHJldHVybiAoKGEgPDwgMjQpIHwgKGIgPDwgMTYpIHwgKGcgPDwgOCkgfCByKSA+Pj4gMCBhcyBDb2xvcjMyXG59XG5cbi8qKiBkc3QgKyAyICogc3JjIC0gMjU1IChDbGFtcGVkIHRvIDAtMjU1KSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckxpZ2h0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyVSA9IGRyICsgMiAqIHNyIC0gMjU1XG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclUgPiAyNTUgPyAyNTUgOiBiclVcbiAgY29uc3QgYmdVID0gZGcgKyAyICogc2cgLSAyNTVcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVSA+IDI1NSA/IDI1NSA6IGJnVVxuICBjb25zdCBiYlUgPSBkYiArIDIgKiBzYiAtIDI1NVxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVID4gMjU1ID8gMjU1IDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3JjIDwgMTI4ID8gbWluKGRzdCwgMiAqIHNyYykgOiBtYXgoZHN0LCAyICogKHNyYyAtIDEyOCkpICovXG5leHBvcnQgY29uc3QgcGluTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSAoc3JjID4+PiAyNCkgJiAweEZGXG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdFxuXG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRlxuICBjb25zdCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRlxuICBjb25zdCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGXG4gIGNvbnN0IHNnID0gKHNyYyA+Pj4gOCkgJiAweEZGXG4gIGNvbnN0IHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuXG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAoZHIgPCAoc3IgPDwgMSkgPyBkciA6IChzciA8PCAxKSkgOiAoZHIgPiAoKHNyIC0gMTI4KSA8PCAxKSA/IGRyIDogKChzciAtIDEyOCkgPDwgMSkpXG4gIGNvbnN0IGJnID0gc2cgPCAxMjggPyAoZGcgPCAoc2cgPDwgMSkgPyBkZyA6IChzZyA8PCAxKSkgOiAoZGcgPiAoKHNnIC0gMTI4KSA8PCAxKSA/IGRnIDogKChzZyAtIDEyOCkgPDwgMSkpXG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAoZGIgPCAoc2IgPDwgMSkgPyBkYiA6IChzYiA8PCAxKSkgOiAoZGIgPiAoKHNiIC0gMTI4KSA8PCAxKSA/IGRiIDogKChzYiAtIDEyOCkgPDwgMSkpXG5cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IChiYiA8PCAxNikgfCAoYmcgPDwgOCkgfCBicikgPj4+IDAgYXMgQ29sb3IzMlxuXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIChWaXZpZCBMaWdodCBsb2dpYyBmb3JjZWQgdG8gMCBvciAyNTUpICovXG5leHBvcnQgY29uc3QgaGFyZE1peFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IChzciA8IDEyOCA/IChzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAoMjU1IC0gKCgoMjU1IC0gZHIpICogMjU1IC8gKDIgKiBzcikpIHwgMCkpKSkgOiAoc3IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkciAqIDI1NSAvICgyICogKDI1NSAtIHNyKSkpIHwgMCkpKSkgPCAxMjggPyAwIDogMjU1XG4gIGNvbnN0IGJnID0gKHNnIDwgMTI4ID8gKHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsICgyNTUgLSAoKCgyNTUgLSBkZykgKiAyNTUgLyAoMiAqIHNnKSkgfCAwKSkpKSA6IChzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRnICogMjU1IC8gKDIgKiAoMjU1IC0gc2cpKSkgfCAwKSkpKSA8IDEyOCA/IDAgOiAyNTVcbiAgY29uc3QgYmIgPSAoc2IgPCAxMjggPyAoc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgKDI1NSAtICgoKDI1NSAtIGRiKSAqIDI1NSAvICgyICogc2IpKSB8IDApKSkpIDogKHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGIgKiAyNTUgLyAoMiAqICgyNTUgLSBzYikpKSB8IDApKSkpIDwgMTI4ID8gMCA6IDI1NVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuLyoqIE1hdGguYWJzKHNyYyAtIGRzdCkgKi9cbmV4cG9ydCBjb25zdCBkaWZmZXJlbmNlUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG5cbiAgY29uc3QgYnIgPSBkciA+IHNyID8gZHIgLSBzciA6IHNyIC0gZHJcbiAgY29uc3QgYmcgPSBkZyA+IHNnID8gZGcgLSBzZyA6IHNnIC0gZGdcbiAgY29uc3QgYmIgPSBkYiA+IHNiID8gZGIgLSBzYiA6IHNiIC0gZGJcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogZHN0ICsgc3JjIC0gKChkc3QgKiBzcmMpID4+IDcpICovXG5leHBvcnQgY29uc3QgZXhjbHVzaW9uUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkZcbiAgY29uc3QgZGcgPSAoZHN0ID4+PiA4KSAmIDB4RkZcbiAgY29uc3QgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRlxuICBjb25zdCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRlxuICBjb25zdCBzYiA9IChzcmMgPj4+IDE2KSAmIDB4RkZcblxuICBjb25zdCByMiA9IGRyICogc3JcbiAgY29uc3QgYnIgPSBkciArIHNyIC0gKCgocjIgKyByMikgKyAxICsgKChyMiArIHIyKSA+PiA4KSkgPj4gOClcblxuICBjb25zdCBnMiA9IGRnICogc2dcbiAgY29uc3QgYmcgPSBkZyArIHNnIC0gKCgoZzIgKyBnMikgKyAxICsgKChnMiArIGcyKSA+PiA4KSkgPj4gOClcblxuICBjb25zdCBiMiA9IGRiICogc2JcbiAgY29uc3QgYmIgPSBkYiArIHNiIC0gKCgoYjIgKyBiMikgKyAxICsgKChiMiArIGIyKSA+PiA4KSkgPj4gOClcblxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogTWF0aC5tYXgoMCwgZHN0IC0gc3JjKSAqL1xuZXhwb3J0IGNvbnN0IHN1YnRyYWN0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gKHNyYyA+Pj4gMjQpICYgMHhGRlxuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3RcblxuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsIGRnID0gKGRzdCA+Pj4gOCkgJiAweEZGLCBkYiA9IChkc3QgPj4+IDE2KSAmIDB4RkZcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLCBzZyA9IChzcmMgPj4+IDgpICYgMHhGRiwgc2IgPSAoc3JjID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IGJyVSA9IGRyIC0gc3JcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVVxuICBjb25zdCBiZ1UgPSBkZyAtIHNnXG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1VcbiAgY29uc3QgYmJVID0gZGIgLSBzYlxuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCAoYmIgPDwgMTYpIHwgKGJnIDw8IDgpIHwgYnIpID4+PiAwIGFzIENvbG9yMzJcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhXG4gIGNvbnN0IGRhID0gKGRzdCA+Pj4gMjQpICYgMHhGRlxuXG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QVxuICBjb25zdCByID0gKHRSICsgMSArICh0UiA+PiA4KSkgPj4gOFxuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkFcbiAgY29uc3QgZyA9ICh0RyArIDEgKyAodEcgPj4gOCkpID4+IDhcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBXG4gIGNvbnN0IGIgPSAodEIgKyAxICsgKHRCID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkFcbiAgY29uc3QgYSA9ICh0QSArIDEgKyAodEEgPj4gOCkpID4+IDhcblxuICByZXR1cm4gKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChnIDw8IDgpIHwgcikgPj4+IDAgYXMgQ29sb3IzMlxufVxuXG4vKiogc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvIHNyKSAqL1xuZXhwb3J0IGNvbnN0IGRpdmlkZVBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IChzcmMgPj4+IDI0KSAmIDB4RkZcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0XG5cbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLCBkZyA9IChkc3QgPj4+IDgpICYgMHhGRiwgZGIgPSAoZHN0ID4+PiAxNikgJiAweEZGXG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRiwgc2cgPSAoc3JjID4+PiA4KSAmIDB4RkYsIHNiID0gKHNyYyA+Pj4gMTYpICYgMHhGRlxuICBjb25zdCBiciA9IHNyID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoKGRyICogMjU1IC8gc3IpIHwgMCkpXG4gIGNvbnN0IGJnID0gc2cgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsICgoZGcgKiAyNTUgLyBzZykgfCAwKSlcbiAgY29uc3QgYmIgPSBzYiA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKChkYiAqIDI1NSAvIHNiKSB8IDApKVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgKGJiIDw8IDE2KSB8IChiZyA8PCA4KSB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyXG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYVxuICBjb25zdCBkYSA9IChkc3QgPj4+IDI0KSAmIDB4RkZcblxuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkFcbiAgY29uc3QgciA9ICh0UiArIDEgKyAodFIgPj4gOCkpID4+IDhcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBXG4gIGNvbnN0IGcgPSAodEcgKyAxICsgKHRHID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QVxuICBjb25zdCBiID0gKHRCICsgMSArICh0QiA+PiA4KSkgPj4gOFxuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBXG4gIGNvbnN0IGEgPSAodEEgKyAxICsgKHRBID4+IDgpKSA+PiA4XG5cbiAgcmV0dXJuICgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoZyA8PCA4KSB8IHIpID4+PiAwIGFzIENvbG9yMzJcbn1cblxuZXhwb3J0IGNvbnN0IEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUzogUmVjb3JkPG51bWJlciwgQmxlbmRDb2xvcjMyPiA9IHtcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcndyaXRlXTogb3ZlcndyaXRlUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlT3Zlcl06IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZW5dOiBkYXJrZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5tdWx0aXBseV06IG11bHRpcGx5UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JCdXJuXTogY29sb3JCdXJuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyQnVybl06IGxpbmVhckJ1cm5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZXJDb2xvcl06IGRhcmtlclBlcmZlY3QsXG5cbiAgW0Jhc2VCbGVuZE1vZGUubGlnaHRlbl06IGxpZ2h0ZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zY3JlZW5dOiBzY3JlZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5jb2xvckRvZGdlXTogY29sb3JEb2RnZVBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpbmVhckRvZGdlXTogbGluZWFyRG9kZ2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVyQ29sb3JdOiBsaWdodGVyUGVyZmVjdCxcblxuICBbQmFzZUJsZW5kTW9kZS5vdmVybGF5XTogb3ZlcmxheVBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvZnRMaWdodF06IHNvZnRMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRMaWdodF06IGhhcmRMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnZpdmlkTGlnaHRdOiB2aXZpZExpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyTGlnaHRdOiBsaW5lYXJMaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnBpbkxpZ2h0XTogcGluTGlnaHRQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5oYXJkTWl4XTogaGFyZE1peFBlcmZlY3QsXG5cbiAgW0Jhc2VCbGVuZE1vZGUuZGlmZmVyZW5jZV06IGRpZmZlcmVuY2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5leGNsdXNpb25dOiBleGNsdXNpb25QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zdWJ0cmFjdF06IHN1YnRyYWN0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGl2aWRlXTogZGl2aWRlUGVyZmVjdCxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQZXJmZWN0QmxlbmRNb2RlUmVnaXN0cnkobmFtZSA9ICdwZXJmZWN0Jykge1xuICByZXR1cm4gbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5KEJhc2VCbGVuZE1vZGUsIEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUywgbmFtZSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { BaseBlendMode } from './blend-modes';\nexport function toBlendModeIndexAndName(input: string | number) {\n if (typeof input === 'number') {\n const name = getKeyByValue(BaseBlendMode, input);\n if (name === undefined) throw new Error(`Invalid index: ${input}`);\n return {\n blendIndex: input,\n blendName: name\n };\n }\n const trimmed = input.trim();\n const num = Number(trimmed);\n const isNumeric = trimmed !== '' && !Number.isNaN(num);\n if (isNumeric && Number.isInteger(num)) {\n console.log({\n trimmed,\n num,\n isNumeric,\n isInt: Number.isInteger(num)\n });\n const name = getKeyByValue(BaseBlendMode, num);\n console.log({\n name\n });\n if (name === undefined) throw new Error(`Invalid index: ${num}`);\n return {\n blendIndex: num,\n blendName: name\n };\n }\n if (trimmed in BaseBlendMode) {\n return {\n blendIndex: BaseBlendMode[trimmed as keyof typeof BaseBlendMode],\n blendName: trimmed as keyof typeof BaseBlendMode\n };\n }\n throw new Error(`Invalid blend mode: ${JSON.stringify(input)}`);\n}\nconst getKeyByValue = (obj: any, value: any) => {\n for (const key in obj) {\n if (obj[key] === value) return key;\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSB9IGZyb20gJy4vYmxlbmQtbW9kZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0b0JsZW5kTW9kZUluZGV4QW5kTmFtZShpbnB1dDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgbmFtZSA9IGdldEtleUJ5VmFsdWUoQmFzZUJsZW5kTW9kZSwgaW5wdXQpXG4gICAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGV4OiAke2lucHV0fWApXG4gICAgcmV0dXJuIHsgYmxlbmRJbmRleDogaW5wdXQsIGJsZW5kTmFtZTogbmFtZSB9XG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gaW5wdXQudHJpbSgpXG4gIGNvbnN0IG51bSA9IE51bWJlcih0cmltbWVkKVxuICBjb25zdCBpc051bWVyaWMgPSB0cmltbWVkICE9PSAnJyAmJiAhTnVtYmVyLmlzTmFOKG51bSlcblxuICBpZiAoaXNOdW1lcmljICYmIE51bWJlci5pc0ludGVnZXIobnVtKSkge1xuICAgIGNvbnNvbGUubG9nKHtcbiAgICAgIHRyaW1tZWQsXG4gICAgICBudW0sXG4gICAgICBpc051bWVyaWMsXG4gICAgICBpc0ludDogTnVtYmVyLmlzSW50ZWdlcihudW0pLFxuICAgIH0pXG4gICAgY29uc3QgbmFtZSA9IGdldEtleUJ5VmFsdWUoQmFzZUJsZW5kTW9kZSwgbnVtKVxuICAgIGNvbnNvbGUubG9nKHtuYW1lfSlcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kZXg6ICR7bnVtfWApXG4gICAgcmV0dXJuIHsgYmxlbmRJbmRleDogbnVtLCBibGVuZE5hbWU6IG5hbWUgfVxuICB9XG5cbiAgaWYgKHRyaW1tZWQgaW4gQmFzZUJsZW5kTW9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICBibGVuZEluZGV4OiBCYXNlQmxlbmRNb2RlW3RyaW1tZWQgYXMga2V5b2YgdHlwZW9mIEJhc2VCbGVuZE1vZGVdLFxuICAgICAgYmxlbmROYW1lOiB0cmltbWVkIGFzIGtleW9mIHR5cGVvZiBCYXNlQmxlbmRNb2RlLFxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBibGVuZCBtb2RlOiAke0pTT04uc3RyaW5naWZ5KGlucHV0KX1gKVxufVxuXG5jb25zdCBnZXRLZXlCeVZhbHVlID0gKG9iajogYW55LCB2YWx1ZTogYW55KSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUpIHJldHVybiBrZXlcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context';\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IE9GRlNDUkVFTl9DQU5WQVNfQ1RYX0ZBSUxFRCA9ICdGYWlsZWQgdG8gY3JlYXRlIE9mZnNjcmVlbkNhbnZhcyBjb250ZXh0J1xuZXhwb3J0IGNvbnN0IENBTlZBU19DVFhfRkFJTEVEID0gJ0ZhaWxlZCB0byBjcmVhdGUgQ2FudmFzIGNvbnRleHQnXG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { CANVAS_CTX_FAILED } from './_constants';\nexport type PixelCanvas = {\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D;\n readonly resize: (w: number, h: number) => void;\n};\n\n/**\n * Ensures the canvas ctx is always set to imageSmoothingEnabled = false.\n * Intended for canvas elements that are already part of the DOM.\n * @see makeReusableCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makePixelCanvas(canvas: HTMLCanvasElement): PixelCanvas {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n return {\n canvas,\n ctx,\n resize(w: number, h: number) {\n canvas.width = w;\n canvas.height = h;\n ctx.imageSmoothingEnabled = false;\n }\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIFBpeGVsQ2FudmFzID0ge1xuICByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuICByZWFkb25seSBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgcmVhZG9ubHkgcmVzaXplOiAodzogbnVtYmVyLCBoOiBudW1iZXIpID0+IHZvaWRcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBjYW52YXMgY3R4IGlzIGFsd2F5cyBzZXQgdG8gaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2UuXG4gKiBJbnRlbmRlZCBmb3IgY2FudmFzIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NLlxuICogQHNlZSBtYWtlUmV1c2FibGVDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQaXhlbENhbnZhcyhcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbik6IFBpeGVsQ2FudmFzIHtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG5cbiAgcmV0dXJuIHtcbiAgICBjYW52YXMsXG4gICAgY3R4LFxuICAgIHJlc2l6ZSh3OiBudW1iZXIsIGg6IG51bWJlcikge1xuICAgICAgY2FudmFzLndpZHRoID0gd1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhcbiAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZVxuICAgIH0sXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { CANVAS_CTX_FAILED } from './_constants';\nexport type ReusableCanvas = {\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D;\n};\n\n/**\n * Creates a reusable canvas and context that are not part of the DOM.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makeReusableCanvas() {\n let canvas: HTMLCanvasElement | null = null;\n let ctx: CanvasRenderingContext2D | null = null;\n function get(width: number, height: number): ReusableCanvas {\n if (canvas === null) {\n canvas = document.createElement('canvas')!;\n ctx = canvas.getContext('2d')!;\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n }\n\n // Resize if needed (resizing auto-clears)\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n ctx!.imageSmoothingEnabled = false;\n } else {\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height);\n }\n return {\n canvas,\n ctx: ctx!\n };\n }\n get.reset = () => {\n canvas = null;\n ctx = null;\n };\n return get;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuL19jb25zdGFudHMnXG5cbmV4cG9ydCB0eXBlIFJldXNhYmxlQ2FudmFzID0ge1xuICByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50XG4gIHJlYWRvbmx5IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldXNhYmxlIGNhbnZhcyBhbmQgY29udGV4dCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgRE9NLlxuICogRW5zdXJlcyBpdCBpcyBhbHdheXMgc2V0IHRvIGBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlYFxuICogQHNlZSBtYWtlUGl4ZWxDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZUNhbnZhcygpIHtcbiAgbGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gbnVsbFxuICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbFxuXG4gIGZ1bmN0aW9uIGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFJldXNhYmxlQ2FudmFzIHtcbiAgICBpZiAoY2FudmFzID09PSBudWxsKSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSFcbiAgICAgIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIVxuICAgICAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRClcbiAgICB9XG5cbiAgICAvLyBSZXNpemUgaWYgbmVlZGVkIChyZXNpemluZyBhdXRvLWNsZWFycylcbiAgICBpZiAoY2FudmFzLndpZHRoICE9PSB3aWR0aCB8fCBjYW52YXMuaGVpZ2h0ICE9PSBoZWlnaHQpIHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgICBjdHghLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNhbWUgc2l6ZSDihpIgbWFudWFsbHkgY2xlYXJcbiAgICAgIGN0eCEuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2FudmFzLCBjdHg6IGN0eCEgfVxuICB9XG5cbiAgZ2V0LnJlc2V0ID0gKCkgPT4ge1xuICAgIGNhbnZhcyA9IG51bGxcbiAgICBjdHggPSBudWxsXG4gIH1cblxuICByZXR1cm4gZ2V0XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Decodes a {@link Blob} (typically PNG) back into an {@link ImageData} object.\n *\n * This function uses hardware-accelerated decoding via {@link createImageBitmap}\n * and processes the data using an {@link OffscreenCanvas} to ensure\n * compatibility with Web Workers.\n *\n * @param blob - The binary image data to decode.\n *\n * @returns A promise resolving to the decoded {@link ImageData}.\n *\n * @throws {Error}\n * Thrown if the blob is corrupted or the browser cannot decode the format.\n *\n * @example\n * ```typescript\n * const blob = await getBlobFromStorage();\n *\n * const imageData = await pngBlobToImageData(blob);\n * ```\n */\nexport async function imgBlobToImageData(blob: Blob): Promise<ImageData> {\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(blob);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2D context');\n }\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWNvZGVzIGEge0BsaW5rIEJsb2J9ICh0eXBpY2FsbHkgUE5HKSBiYWNrIGludG8gYW4ge0BsaW5rIEltYWdlRGF0YX0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBoYXJkd2FyZS1hY2NlbGVyYXRlZCBkZWNvZGluZyB2aWEge0BsaW5rIGNyZWF0ZUltYWdlQml0bWFwfVxuICogYW5kIHByb2Nlc3NlcyB0aGUgZGF0YSB1c2luZyBhbiB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSB0byBlbnN1cmVcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCBXZWIgV29ya2Vycy5cbiAqXG4gKiBAcGFyYW0gYmxvYiAtIFRoZSBiaW5hcnkgaW1hZ2UgZGF0YSB0byBkZWNvZGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgZGVjb2RlZCB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqIFRocm93biBpZiB0aGUgYmxvYiBpcyBjb3JydXB0ZWQgb3IgdGhlIGJyb3dzZXIgY2Fubm90IGRlY29kZSB0aGUgZm9ybWF0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBibG9iID0gYXdhaXQgZ2V0QmxvYkZyb21TdG9yYWdlKCk7XG4gKlxuICogY29uc3QgaW1hZ2VEYXRhID0gYXdhaXQgcG5nQmxvYlRvSW1hZ2VEYXRhKGJsb2IpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbWdCbG9iVG9JbWFnZURhdGEoXG4gIGJsb2I6IEJsb2IsXG4pOiBQcm9taXNlPEltYWdlRGF0YT4ge1xuICBsZXQgYml0bWFwOiBJbWFnZUJpdG1hcCB8IG51bGwgPSBudWxsXG5cbiAgdHJ5IHtcbiAgICBiaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChibG9iKVxuXG4gICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhcbiAgICAgIGJpdG1hcC53aWR0aCxcbiAgICAgIGJpdG1hcC5oZWlnaHQsXG4gICAgKVxuXG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJylcblxuICAgIGlmICghY3R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgMkQgY29udGV4dCcpXG4gICAgfVxuXG4gICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApXG5cbiAgICByZXR1cm4gY3R4LmdldEltYWdlRGF0YShcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgYml0bWFwLndpZHRoLFxuICAgICAgYml0bWFwLmhlaWdodCxcbiAgICApXG4gIH0gZmluYWxseSB7XG4gICAgYml0bWFwPy5jbG9zZSgpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { imgBlobToImageData } from '../ImageData/imgBlobToImageData';\n\n/**\n * Extracts {@link ImageData} from a clipboard event if an image is present.\n *\n * This function iterates through the {@link DataTransferItemList} to find\n * the first item with an image MIME type and decodes it.\n *\n * @param clipboardEvent - The event object from a `paste` listener.\n *\n * @returns A promise resolving to {@link ImageData}, or `null` if no\n * image was found in the clipboard.\n *\n * @example\n * ```typescript\n * window.addEventListener('paste', async (event) => {\n * const data = await getImageDataFromClipboard(event)\n * if (data) {\n * console.log('Pasted image dimensions:', data.width, data.height)\n * }\n * });\n * ```\n */\nexport async function getImageDataFromClipboard(clipboardEvent: ClipboardEvent) {\n const items = clipboardEvent?.clipboardData?.items;\n if (!items?.length) return null;\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith('image/')) {\n const blob = item.getAsFile();\n if (!blob) {\n continue;\n }\n return imgBlobToImageData(blob);\n }\n }\n return null;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW1nQmxvYlRvSW1hZ2VEYXRhIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltZ0Jsb2JUb0ltYWdlRGF0YSdcblxuLyoqXG4gKiBFeHRyYWN0cyB7QGxpbmsgSW1hZ2VEYXRhfSBmcm9tIGEgY2xpcGJvYXJkIGV2ZW50IGlmIGFuIGltYWdlIGlzIHByZXNlbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyB0aHJvdWdoIHRoZSB7QGxpbmsgRGF0YVRyYW5zZmVySXRlbUxpc3R9IHRvIGZpbmRcbiAqIHRoZSBmaXJzdCBpdGVtIHdpdGggYW4gaW1hZ2UgTUlNRSB0eXBlIGFuZCBkZWNvZGVzIGl0LlxuICpcbiAqIEBwYXJhbSBjbGlwYm9hcmRFdmVudCAtIFRoZSBldmVudCBvYmplY3QgZnJvbSBhIGBwYXN0ZWAgbGlzdGVuZXIuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byB7QGxpbmsgSW1hZ2VEYXRhfSwgb3IgYG51bGxgIGlmIG5vXG4gKiBpbWFnZSB3YXMgZm91bmQgaW4gdGhlIGNsaXBib2FyZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRJbWFnZURhdGFGcm9tQ2xpcGJvYXJkKGV2ZW50KVxuICogICBpZiAoZGF0YSkge1xuICogICAgIGNvbnNvbGUubG9nKCdQYXN0ZWQgaW1hZ2UgZGltZW5zaW9uczonLCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodClcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEltYWdlRGF0YUZyb21DbGlwYm9hcmQoY2xpcGJvYXJkRXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4gIGNvbnN0IGl0ZW1zID0gY2xpcGJvYXJkRXZlbnQ/LmNsaXBib2FyZERhdGE/Lml0ZW1zXG4gIGlmICghaXRlbXM/Lmxlbmd0aCkgcmV0dXJuIG51bGxcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldXG5cbiAgICBpZiAoaXRlbS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gICAgICBjb25zdCBibG9iID0gaXRlbS5nZXRBc0ZpbGUoKVxuXG4gICAgICBpZiAoIWJsb2IpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGltZ0Jsb2JUb0ltYWdlRGF0YShibG9iKVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Converts an {@link ImageData} object into a {@link Blob} in PNG format.\n *\n * This operation is asynchronous and uses {@link OffscreenCanvas}\n * to perform the encoding, making it suitable for usage in both the main\n * thread and Web Workers.\n *\n * @param imageData - The pixel data to be encoded.\n *\n * @returns A promise that resolves to a {@link Blob} with the MIME type `image/png`.\n *\n * @throws {Error}\n * Thrown if the {@link OffscreenCanvas} context cannot be initialized or the blob\n * encoding fails.\n *\n * @example\n * ```typescript\n * const blob = await imageDataToImgBlob(imageData);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport async function imageDataToImgBlob(imageData: ImageData): Promise<Blob> {\n const canvas = new OffscreenCanvas(imageData.width, imageData.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('could not create 2d context');\n ctx.putImageData(imageData, 0, 0);\n return canvas!.convertToBlob({\n type: 'image/png'\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb252ZXJ0cyBhbiB7QGxpbmsgSW1hZ2VEYXRhfSBvYmplY3QgaW50byBhIHtAbGluayBCbG9ifSBpbiBQTkcgZm9ybWF0LlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGlzIGFzeW5jaHJvbm91cyBhbmQgdXNlcyB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfVxuICogdG8gcGVyZm9ybSB0aGUgZW5jb2RpbmcsIG1ha2luZyBpdCBzdWl0YWJsZSBmb3IgdXNhZ2UgaW4gYm90aCB0aGUgbWFpblxuICogdGhyZWFkIGFuZCBXZWIgV29ya2Vycy5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHBpeGVsIGRhdGEgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIHtAbGluayBCbG9ifSB3aXRoIHRoZSBNSU1FIHR5cGUgYGltYWdlL3BuZ2AuXG4gKlxuICogQHRocm93cyB7RXJyb3J9XG4gKiBUaHJvd24gaWYgdGhlIHtAbGluayBPZmZzY3JlZW5DYW52YXN9IGNvbnRleHQgY2Fubm90IGJlIGluaXRpYWxpemVkIG9yIHRoZSBibG9iXG4gKiBlbmNvZGluZyBmYWlscy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYmxvYiA9IGF3YWl0IGltYWdlRGF0YVRvSW1nQmxvYihpbWFnZURhdGEpO1xuICogY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VEYXRhVG9JbWdCbG9iKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvbWlzZTxCbG9iPiB7XG4gIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0KVxuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgY3JlYXRlIDJkIGNvbnRleHQnKVxuXG4gIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKVxuICByZXR1cm4gY2FudmFzIS5jb252ZXJ0VG9CbG9iKHtcbiAgICB0eXBlOiAnaW1hZ2UvcG5nJyxcbiAgfSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Writes a {@link Blob} image to the system clipboard.\n *\n * @param blob - The image {@link Blob} (typically `image/png`) to copy.\n * @returns A promise that resolves when the clipboard has been updated.\n */\nexport async function writeImgBlobToClipboard(blob: Blob): Promise<void> {\n const item = new ClipboardItem({\n 'image/png': blob\n });\n await navigator.clipboard.write([item]);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXcml0ZXMgYSB7QGxpbmsgQmxvYn0gaW1hZ2UgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQuXG4gKlxuICogQHBhcmFtIGJsb2IgLSBUaGUgaW1hZ2Uge0BsaW5rIEJsb2J9ICh0eXBpY2FsbHkgYGltYWdlL3BuZ2ApIHRvIGNvcHkuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGlwYm9hcmQgaGFzIGJlZW4gdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1nQmxvYlRvQ2xpcGJvYXJkKGJsb2I6IEJsb2IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbSA9IG5ldyBDbGlwYm9hcmRJdGVtKHtcbiAgICAnaW1hZ2UvcG5nJzogYmxvYixcbiAgfSlcblxuICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlKFtpdGVtXSlcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { imageDataToImgBlob } from '../ImageData/imageDataToImgBlob';\nimport { writeImgBlobToClipboard } from './writeImgBlobToClipboard';\n\n/**\n * Converts {@link ImageData} to a PNG {@link Blob} and writes it to the system clipboard.\n * This is a high-level utility that combines {@link imageDataToImgBlob} and\n * {@link writeImgBlobToClipboard}.\n * @param imageData - The image data to copy to the clipboard.\n * @returns A promise that resolves when the image has been successfully copied.\n * @throws {Error}\n * If the conversion to blob fails or clipboard permissions are denied.\n *\n * @example\n * ```typescript\n * const canvas = document.querySelector('canvas')\n * const ctx = canvas.getContext('2d')\n * const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n * await writeImageDataToClipboard(imageData)\n * ```\n */\nexport async function writeImageDataToClipboard(imageData: ImageData): Promise<void> {\n const blob = await imageDataToImgBlob(imageData);\n return writeImgBlobToClipboard(blob);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW1hZ2VEYXRhVG9JbWdCbG9iIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvSW1nQmxvYidcbmltcG9ydCB7IHdyaXRlSW1nQmxvYlRvQ2xpcGJvYXJkIH0gZnJvbSAnLi93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCdcblxuLyoqXG4gKiBDb252ZXJ0cyB7QGxpbmsgSW1hZ2VEYXRhfSB0byBhIFBORyB7QGxpbmsgQmxvYn0gYW5kIHdyaXRlcyBpdCB0byB0aGUgc3lzdGVtIGNsaXBib2FyZC5cbiAqIFRoaXMgaXMgYSBoaWdoLWxldmVsIHV0aWxpdHkgdGhhdCBjb21iaW5lcyB7QGxpbmsgaW1hZ2VEYXRhVG9JbWdCbG9ifSBhbmRcbiAqIHtAbGluayB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZH0uXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIGltYWdlIGRhdGEgdG8gY29weSB0byB0aGUgY2xpcGJvYXJkLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaW1hZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvcGllZC5cbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogSWYgdGhlIGNvbnZlcnNpb24gdG8gYmxvYiBmYWlscyBvciBjbGlwYm9hcmQgcGVybWlzc2lvbnMgYXJlIGRlbmllZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzJylcbiAqIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXG4gKiBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodClcbiAqIGF3YWl0IHdyaXRlSW1hZ2VEYXRhVG9DbGlwYm9hcmQoaW1hZ2VEYXRhKVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YVRvQ2xpcGJvYXJkKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJsb2IgPSBhd2FpdCBpbWFnZURhdGFUb0ltZ0Jsb2IoaW1hZ2VEYXRhKVxuXG4gIHJldHVybiB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZChibG9iKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export interface HistoryAction {\n undo: () => void;\n redo: () => void;\n dispose?: () => void;\n}\nexport class HistoryManager {\n public undoStack: HistoryAction[];\n public redoStack: HistoryAction[];\n public listeners: Set<() => void>;\n constructor(public maxSteps = 50) {\n this.undoStack = [];\n this.redoStack = [];\n this.listeners = new Set();\n }\n get canUndo() {\n return this.undoStack.length > 0;\n }\n get canRedo() {\n return this.redoStack.length > 0;\n }\n subscribe(fn: () => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n notify() {\n this.listeners.forEach(fn => fn());\n }\n commit(action: HistoryAction) {\n this.undoStack.push(action);\n this.clearRedoStack();\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.();\n }\n this.notify();\n }\n undo() {\n let action = this.undoStack.pop();\n if (!action) return;\n this.redoStack.push(action);\n action.undo();\n this.notify();\n }\n redo() {\n let action = this.redoStack.pop();\n if (!action) return;\n this.undoStack.push(action);\n action.redo();\n this.notify();\n }\n clearRedoStack() {\n let length = this.redoStack.length;\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i];\n if (action) {\n action.dispose?.();\n }\n }\n this.redoStack.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5QWN0aW9uIHtcbiAgdW5kbzogKCkgPT4gdm9pZFxuICByZWRvOiAoKSA9PiB2b2lkXG4gIGRpc3Bvc2U/OiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjbGFzcyBIaXN0b3J5TWFuYWdlciB7XG4gIHB1YmxpYyB1bmRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXVxuICBwdWJsaWMgcmVkb1N0YWNrOiBIaXN0b3J5QWN0aW9uW11cbiAgcHVibGljIGxpc3RlbmVyczogU2V0PCgpID0+IHZvaWQ+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1heFN0ZXBzID0gNTAsXG4gICkge1xuICAgIHRoaXMudW5kb1N0YWNrID0gW11cbiAgICB0aGlzLnJlZG9TdGFjayA9IFtdXG4gICAgdGhpcy5saXN0ZW5lcnMgPSBuZXcgU2V0KClcbiAgfVxuXG4gIGdldCBjYW5VbmRvKCkge1xuICAgIHJldHVybiB0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAwXG4gIH1cblxuICBnZXQgY2FuUmVkbygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMFxuICB9XG5cbiAgc3Vic2NyaWJlKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuYWRkKGZuKVxuICAgIHJldHVybiAoKSA9PiB0aGlzLmxpc3RlbmVycy5kZWxldGUoZm4pXG4gIH1cblxuICBub3RpZnkoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gIH1cblxuICBjb21taXQoYWN0aW9uOiBIaXN0b3J5QWN0aW9uKSB7XG4gICAgdGhpcy51bmRvU3RhY2sucHVzaChhY3Rpb24pXG4gICAgdGhpcy5jbGVhclJlZG9TdGFjaygpXG5cbiAgICBpZiAodGhpcy51bmRvU3RhY2subGVuZ3RoID4gdGhpcy5tYXhTdGVwcykge1xuICAgICAgdGhpcy51bmRvU3RhY2suc2hpZnQoKT8uZGlzcG9zZT8uKClcbiAgICB9XG5cbiAgICB0aGlzLm5vdGlmeSgpXG4gIH1cblxuICB1bmRvKCkge1xuICAgIGxldCBhY3Rpb24gPSB0aGlzLnVuZG9TdGFjay5wb3AoKVxuXG4gICAgaWYgKCFhY3Rpb24pIHJldHVyblxuXG4gICAgdGhpcy5yZWRvU3RhY2sucHVzaChhY3Rpb24pXG4gICAgYWN0aW9uLnVuZG8oKVxuXG4gICAgdGhpcy5ub3RpZnkoKVxuICB9XG5cbiAgcmVkbygpIHtcbiAgICBsZXQgYWN0aW9uID0gdGhpcy5yZWRvU3RhY2sucG9wKClcblxuICAgIGlmICghYWN0aW9uKSByZXR1cm5cblxuICAgIHRoaXMudW5kb1N0YWNrLnB1c2goYWN0aW9uKVxuICAgIGFjdGlvbi5yZWRvKClcblxuICAgIHRoaXMubm90aWZ5KClcbiAgfVxuXG4gIGNsZWFyUmVkb1N0YWNrKCkge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLnJlZG9TdGFjay5sZW5ndGhcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBhY3Rpb24gPSB0aGlzLnJlZG9TdGFja1tpXVxuXG4gICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgIGFjdGlvbi5kaXNwb3NlPy4oKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVkb1N0YWNrLmxlbmd0aCA9IDBcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type PixelPatchTiles = {\n beforeTiles: PixelTile[];\n afterTiles: PixelTile[];\n};\nexport class PixelTile {\n public data32: Uint32Array;\n constructor(public id: number, public tx: number, public ty: number, tileArea: number) {\n this.data32 = new Uint32Array(tileArea);\n }\n}\nexport function applyPatchTiles(target: IPixelData, tiles: PixelTile[], tileSize: number = 256) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n if (!tile) continue;\n const dst = target.data32;\n const src = tile.data32;\n const dstWidth = target.width;\n const dstHeight = target.height;\n const startX = tile.tx * tileSize;\n const startY = tile.ty * tileSize;\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX));\n if (copyWidth <= 0) return;\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly;\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break;\n const dstIndex = globalY * dstWidth + startX;\n const srcIndex = ly * tileSize;\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n dst.set(rowData, dstIndex);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgdHlwZSBQaXhlbFBhdGNoVGlsZXMgPSB7XG4gIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXVxuICBhZnRlclRpbGVzOiBQaXhlbFRpbGVbXVxufVxuXG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlIHtcbiAgcHVibGljIGRhdGEzMjogVWludDMyQXJyYXlcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaWQ6IG51bWJlcixcbiAgICBwdWJsaWMgdHg6IG51bWJlcixcbiAgICBwdWJsaWMgdHk6IG51bWJlcixcbiAgICB0aWxlQXJlYTogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLmRhdGEzMiA9IG5ldyBVaW50MzJBcnJheSh0aWxlQXJlYSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXRjaFRpbGVzKHRhcmdldDogSVBpeGVsRGF0YSwgdGlsZXM6IFBpeGVsVGlsZVtdLCB0aWxlU2l6ZTogbnVtYmVyID0gMjU2KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gdGlsZXNbaV1cblxuICAgIGlmICghdGlsZSkgY29udGludWVcblxuICAgIGNvbnN0IGRzdCA9IHRhcmdldC5kYXRhMzJcbiAgICBjb25zdCBzcmMgPSB0aWxlLmRhdGEzMlxuICAgIGNvbnN0IGRzdFdpZHRoID0gdGFyZ2V0LndpZHRoXG4gICAgY29uc3QgZHN0SGVpZ2h0ID0gdGFyZ2V0LmhlaWdodFxuICAgIGNvbnN0IHN0YXJ0WCA9IHRpbGUudHggKiB0aWxlU2l6ZVxuICAgIGNvbnN0IHN0YXJ0WSA9IHRpbGUudHkgKiB0aWxlU2l6ZVxuXG4gICAgLy8gQ2FsY3VsYXRlIGNsYW1waW5nIHRvIHByZXZlbnQgd3JhcHBpbmcgYXJ0aWZhY3RzIG9uIGltYWdlIGVkZ2VzXG4gICAgY29uc3QgY29weVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGlsZVNpemUsIGRzdFdpZHRoIC0gc3RhcnRYKSlcblxuICAgIGlmIChjb3B5V2lkdGggPD0gMCkgcmV0dXJuXG5cbiAgICBmb3IgKGxldCBseSA9IDA7IGx5IDwgdGlsZVNpemU7IGx5KyspIHtcbiAgICAgIGNvbnN0IGdsb2JhbFkgPSBzdGFydFkgKyBseVxuXG4gICAgICAvLyBTdG9wIGlmIHdlIGdvIGJlbG93IHRoZSBpbWFnZVxuICAgICAgaWYgKGdsb2JhbFkgPj0gZHN0SGVpZ2h0KSBicmVha1xuXG4gICAgICBjb25zdCBkc3RJbmRleCA9IGdsb2JhbFkgKiBkc3RXaWR0aCArIHN0YXJ0WFxuICAgICAgY29uc3Qgc3JjSW5kZXggPSBseSAqIHRpbGVTaXplXG4gICAgICBjb25zdCByb3dEYXRhID0gc3JjLnN1YmFycmF5KHNyY0luZGV4LCBzcmNJbmRleCArIGNvcHlXaWR0aClcblxuICAgICAgZHN0LnNldChyb3dEYXRhLCBkc3RJbmRleClcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { PixelTile } from './PixelPatchTiles';\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[];\n public beforeTiles: PixelTile[];\n public pool: PixelTile[];\n constructor(public target: IPixelData, readonly config: PixelEngineConfig) {\n this.lookup = [];\n this.beforeTiles = [];\n this.pool = [];\n }\n getTile(id: number, tx: number, ty: number): PixelTile {\n let tile = this.pool.pop();\n if (tile) {\n tile.id = id;\n tile.tx = tx;\n tile.ty = ty;\n return tile;\n }\n return new PixelTile(id, tx, ty, this.config.tileArea);\n }\n recyclePatch(patch: PixelPatchTiles) {\n const before = patch.beforeTiles;\n for (let i = 0; i < before.length; i++) {\n let tile = before[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n const after = patch.afterTiles;\n for (let i = 0; i < after.length; i++) {\n let tile = after[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storeTileBeforeState(x: number, y: number): void {\n let target = this.target;\n let shift = this.config.tileShift;\n let columns = target.width + this.config.tileMask >> shift;\n let tx = x >> shift;\n let ty = y >> shift;\n let id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n\n /**\n *\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(x: number, y: number, w: number, h: number) {\n let target = this.target;\n let shift = this.config.tileShift;\n let columns = target.width + this.config.tileMask >> shift;\n let startX = x >> shift;\n let startY = y >> shift;\n let endX = x + w - 1 >> shift;\n let endY = y + h - 1 >> shift;\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n let id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n }\n }\n extractState(tile: PixelTile) {\n let target = this.target;\n let TILE_SIZE = this.config.tileSize;\n let dst = tile.data32;\n let src = target.data32;\n let startX = tile.tx * TILE_SIZE;\n let startY = tile.ty * TILE_SIZE;\n let targetWidth = target.width;\n let targetHeight = target.height;\n let copyWidth = Math.max(0, Math.min(TILE_SIZE, targetWidth - startX));\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly;\n let dstIndex = ly * TILE_SIZE;\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE);\n continue;\n }\n let srcIndex = globalY * targetWidth + startX;\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n dst.set(rowData, dstIndex);\n if (copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + copyWidth, dstIndex + TILE_SIZE);\n }\n }\n }\n extractAfterTiles(): PixelTile[] {\n let afterTiles: PixelTile[] = [];\n let length = this.beforeTiles.length;\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i];\n if (beforeTile) {\n let afterTile = this.getTile(beforeTile.id, beforeTile.tx, beforeTile.ty);\n this.extractState(afterTile);\n afterTiles.push(afterTile);\n }\n }\n return afterTiles;\n }\n reset() {\n this.lookup = [];\n this.beforeTiles = [];\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vUGl4ZWxFbmdpbmVDb25maWcnXG5pbXBvcnQgeyB0eXBlIFBpeGVsUGF0Y2hUaWxlcywgUGl4ZWxUaWxlIH0gZnJvbSAnLi9QaXhlbFBhdGNoVGlsZXMnXG5cbmV4cG9ydCBjbGFzcyBQaXhlbEFjY3VtdWxhdG9yIHtcbiAgcHVibGljIGxvb2t1cDogKFBpeGVsVGlsZSB8IHVuZGVmaW5lZClbXVxuICBwdWJsaWMgYmVmb3JlVGlsZXM6IFBpeGVsVGlsZVtdXG4gIHB1YmxpYyBwb29sOiBQaXhlbFRpbGVbXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0YXJnZXQ6IElQaXhlbERhdGEsXG4gICAgcmVhZG9ubHkgY29uZmlnOiBQaXhlbEVuZ2luZUNvbmZpZyxcbiAgKSB7XG4gICAgdGhpcy5sb29rdXAgPSBbXVxuICAgIHRoaXMuYmVmb3JlVGlsZXMgPSBbXVxuICAgIHRoaXMucG9vbCA9IFtdXG4gIH1cblxuICBnZXRUaWxlKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdHg6IG51bWJlcixcbiAgICB0eTogbnVtYmVyLFxuICApOiBQaXhlbFRpbGUge1xuICAgIGxldCB0aWxlID0gdGhpcy5wb29sLnBvcCgpXG5cbiAgICBpZiAodGlsZSkge1xuICAgICAgdGlsZS5pZCA9IGlkXG4gICAgICB0aWxlLnR4ID0gdHhcbiAgICAgIHRpbGUudHkgPSB0eVxuXG4gICAgICByZXR1cm4gdGlsZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGl4ZWxUaWxlKFxuICAgICAgaWQsXG4gICAgICB0eCxcbiAgICAgIHR5LFxuICAgICAgdGhpcy5jb25maWcudGlsZUFyZWEsXG4gICAgKVxuICB9XG5cbiAgcmVjeWNsZVBhdGNoKHBhdGNoOiBQaXhlbFBhdGNoVGlsZXMpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBwYXRjaC5iZWZvcmVUaWxlc1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiZWZvcmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB0aWxlID0gYmVmb3JlW2ldXG5cbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWZ0ZXIgPSBwYXRjaC5hZnRlclRpbGVzXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFmdGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdGlsZSA9IGFmdGVyW2ldXG5cbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB4IHBpeGVsIHggY29vcmRpbmF0ZVxuICAgKiBAcGFyYW0geSBwaXhlbCB5IGNvb3JkaW5hdGVcbiAgICovXG4gIHN0b3JlVGlsZUJlZm9yZVN0YXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IHRhcmdldCA9IHRoaXMudGFyZ2V0XG4gICAgbGV0IHNoaWZ0ID0gdGhpcy5jb25maWcudGlsZVNoaWZ0XG4gICAgbGV0IGNvbHVtbnMgPSAodGFyZ2V0LndpZHRoICsgdGhpcy5jb25maWcudGlsZU1hc2spID4+IHNoaWZ0XG4gICAgbGV0IHR4ID0geCA+PiBzaGlmdFxuICAgIGxldCB0eSA9IHkgPj4gc2hpZnRcbiAgICBsZXQgaWQgPSB0eSAqIGNvbHVtbnMgKyB0eFxuXG4gICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgIGlmICghdGlsZSkge1xuICAgICAgdGlsZSA9IHRoaXMuZ2V0VGlsZShcbiAgICAgICAgaWQsXG4gICAgICAgIHR4LFxuICAgICAgICB0eSxcbiAgICAgIClcblxuICAgICAgdGhpcy5leHRyYWN0U3RhdGUodGlsZSlcbiAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGVcbiAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geCBwaXhlbCB4IGNvb3JkaW5hdGVcbiAgICogQHBhcmFtIHkgcGl4ZWwgeSBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB3IHBpeGVsIHdpZHRoXG4gICAqIEBwYXJhbSBoIHBpeGVsIGhlaWdodFxuICAgKi9cbiAgc3RvcmVSZWdpb25CZWZvcmVTdGF0ZShcbiAgICB4OiBudW1iZXIsXG4gICAgeTogbnVtYmVyLFxuICAgIHc6IG51bWJlcixcbiAgICBoOiBudW1iZXIsXG4gICkge1xuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGxldCBzaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdFxuICAgIGxldCBjb2x1bW5zID0gKHRhcmdldC53aWR0aCArIHRoaXMuY29uZmlnLnRpbGVNYXNrKSA+PiBzaGlmdFxuXG4gICAgbGV0IHN0YXJ0WCA9IHggPj4gc2hpZnRcbiAgICBsZXQgc3RhcnRZID0geSA+PiBzaGlmdFxuICAgIGxldCBlbmRYID0gKHggKyB3IC0gMSkgPj4gc2hpZnRcbiAgICBsZXQgZW5kWSA9ICh5ICsgaCAtIDEpID4+IHNoaWZ0XG5cbiAgICBmb3IgKGxldCB0eSA9IHN0YXJ0WTsgdHkgPD0gZW5kWTsgdHkrKykge1xuICAgICAgZm9yIChsZXQgdHggPSBzdGFydFg7IHR4IDw9IGVuZFg7IHR4KyspIHtcbiAgICAgICAgbGV0IGlkID0gdHkgKiBjb2x1bW5zICsgdHhcbiAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF1cblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICB0aWxlID0gdGhpcy5nZXRUaWxlKFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB0eCxcbiAgICAgICAgICAgIHR5LFxuICAgICAgICAgIClcblxuICAgICAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKHRpbGUpXG4gICAgICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZVxuICAgICAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXh0cmFjdFN0YXRlKHRpbGU6IFBpeGVsVGlsZSkge1xuICAgIGxldCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGxldCBUSUxFX1NJWkUgPSB0aGlzLmNvbmZpZy50aWxlU2l6ZVxuICAgIGxldCBkc3QgPSB0aWxlLmRhdGEzMlxuICAgIGxldCBzcmMgPSB0YXJnZXQuZGF0YTMyXG4gICAgbGV0IHN0YXJ0WCA9IHRpbGUudHggKiBUSUxFX1NJWkVcbiAgICBsZXQgc3RhcnRZID0gdGlsZS50eSAqIFRJTEVfU0laRVxuICAgIGxldCB0YXJnZXRXaWR0aCA9IHRhcmdldC53aWR0aFxuICAgIGxldCB0YXJnZXRIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0XG5cbiAgICBsZXQgY29weVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oVElMRV9TSVpFLCB0YXJnZXRXaWR0aCAtIHN0YXJ0WCkpXG5cbiAgICBmb3IgKGxldCBseSA9IDA7IGx5IDwgVElMRV9TSVpFOyBseSsrKSB7XG4gICAgICBsZXQgZ2xvYmFsWSA9IHN0YXJ0WSArIGx5XG4gICAgICBsZXQgZHN0SW5kZXggPSBseSAqIFRJTEVfU0laRVxuXG4gICAgICBpZiAoZ2xvYmFsWSA8IDAgfHwgZ2xvYmFsWSA+PSB0YXJnZXRIZWlnaHQgfHwgY29weVdpZHRoID09PSAwKSB7XG4gICAgICAgIGRzdC5maWxsKDAsIGRzdEluZGV4LCBkc3RJbmRleCArIFRJTEVfU0laRSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IHNyY0luZGV4ID0gZ2xvYmFsWSAqIHRhcmdldFdpZHRoICsgc3RhcnRYXG4gICAgICBsZXQgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpXG5cbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXgpXG5cbiAgICAgIGlmIChjb3B5V2lkdGggPCBUSUxFX1NJWkUpIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXggKyBjb3B5V2lkdGgsIGRzdEluZGV4ICsgVElMRV9TSVpFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4dHJhY3RBZnRlclRpbGVzKCk6IFBpeGVsVGlsZVtdIHtcbiAgICBsZXQgYWZ0ZXJUaWxlczogUGl4ZWxUaWxlW10gPSBbXVxuICAgIGxldCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGJlZm9yZVRpbGUgPSB0aGlzLmJlZm9yZVRpbGVzW2ldXG5cbiAgICAgIGlmIChiZWZvcmVUaWxlKSB7XG4gICAgICAgIGxldCBhZnRlclRpbGUgPSB0aGlzLmdldFRpbGUoXG4gICAgICAgICAgYmVmb3JlVGlsZS5pZCxcbiAgICAgICAgICBiZWZvcmVUaWxlLnR4LFxuICAgICAgICAgIGJlZm9yZVRpbGUudHksXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmV4dHJhY3RTdGF0ZShhZnRlclRpbGUpXG4gICAgICAgIGFmdGVyVGlsZXMucHVzaChhZnRlclRpbGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFmdGVyVGlsZXNcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMubG9va3VwID0gW11cbiAgICB0aGlzLmJlZm9yZVRpbGVzID0gW11cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export class PixelEngineConfig {\n public readonly tileSize: number;\n public readonly tileShift: number;\n public readonly tileMask: number;\n public readonly tileArea: number;\n constructor(tileSize: number = 256) {\n // Ensure it's a power of 2 to guarantee bitwise math works\n if ((tileSize & tileSize - 1) !== 0) {\n throw new Error('tileSize must be a power of 2');\n }\n this.tileSize = tileSize;\n this.tileShift = Math.log2(tileSize);\n this.tileMask = tileSize - 1;\n this.tileArea = tileSize * tileSize;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFBpeGVsRW5naW5lQ29uZmlnIHtcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVTaXplOiBudW1iZXJcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVTaGlmdDogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aWxlTWFzazogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aWxlQXJlYTogbnVtYmVyXG5cbiAgY29uc3RydWN0b3IodGlsZVNpemU6IG51bWJlciA9IDI1Nikge1xuICAgIC8vIEVuc3VyZSBpdCdzIGEgcG93ZXIgb2YgMiB0byBndWFyYW50ZWUgYml0d2lzZSBtYXRoIHdvcmtzXG4gICAgaWYgKCh0aWxlU2l6ZSAmICh0aWxlU2l6ZSAtIDEpKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlU2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMicpXG4gICAgfVxuXG4gICAgdGhpcy50aWxlU2l6ZSA9IHRpbGVTaXplXG4gICAgdGhpcy50aWxlU2hpZnQgPSBNYXRoLmxvZzIodGlsZVNpemUpXG4gICAgdGhpcy50aWxlTWFzayA9IHRpbGVTaXplIC0gMVxuICAgIHRoaXMudGlsZUFyZWEgPSB0aWxlU2l6ZSAqIHRpbGVTaXplXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function applyAlphaMaskToPixelData(dst: IPixelData, mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n mw,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n\n // 1. Initial Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dst.width - x);\n h = Math.min(h, dst.height - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Determine Source Dimensions\n const mPitch = mw ?? width;\n if (mPitch <= 0) return;\n const maskHeight = mask.length / mPitch | 0;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(maskHeight, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = dst.data32;\n const dw = dst.width;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const mVal = mask[mIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - mVal : mVal;\n let weight = 0;\n if (effectiveM === 0) {\n weight = 0;\n } else if (effectiveM === 255) {\n weight = globalAlpha;\n } else if (globalAlpha === 255) {\n weight = effectiveM;\n } else {\n weight = effectiveM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n // Clear alpha channel\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0;\n } else if (weight !== 255) {\n // Merge alpha channel\n const d = dst32[dIdx];\n const da = d >>> 24;\n if (da !== 0) {\n const finalAlpha = da === 255 ? weight : da * weight + 128 >> 8;\n dst32[dIdx] = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIG1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG13LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgLy8gMS4gSW5pdGlhbCBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCB3ID0gd2lkdGhcbiAgbGV0IGggPSBoZWlnaHRcblxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG5cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIHcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBoID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKHcgPD0gMCkgcmV0dXJuXG4gIGlmIChoIDw9IDApIHJldHVyblxuXG4gIC8vIDIuIERldGVybWluZSBTb3VyY2UgRGltZW5zaW9uc1xuICBjb25zdCBtUGl0Y2ggPSBtdyA/PyB3aWR0aFxuICBpZiAobVBpdGNoIDw9IDApIHJldHVyblxuICBjb25zdCBtYXNrSGVpZ2h0ID0gKG1hc2subGVuZ3RoIC8gbVBpdGNoKSB8IDBcblxuICAvLyAzLiBTb3VyY2UgQm91bmRzIENsaXBwaW5nXG4gIC8vIENhbGN1bGF0ZSB3aGVyZSB3ZSB3b3VsZCBzdGFydCByZWFkaW5nIGluIHRoZSBtYXNrXG4gIGNvbnN0IHN0YXJ0WCA9IG14ICsgKHggLSB0YXJnZXRYKVxuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSlcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WClcbiAgY29uc3Qgc1kwID0gTWF0aC5tYXgoMCwgc3RhcnRZKVxuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpXG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2tIZWlnaHQsIHN0YXJ0WSArIGgpXG5cbiAgY29uc3QgZmluYWxXID0gc1gxIC0gc1gwXG4gIGNvbnN0IGZpbmFsSCA9IHNZMSAtIHNZMFxuXG4gIC8vIFRoaXMgaXMgd2hlcmUgeW91ciBmYWlsaW5nIHRlc3RzIGFyZSBub3cgY2F1Z2h0XG4gIGlmIChmaW5hbFcgPD0gMCkgcmV0dXJuXG4gIGlmIChmaW5hbEggPD0gMCkgcmV0dXJuXG5cbiAgLy8gNC4gQWxpZ24gRGVzdGluYXRpb24gd2l0aCBTb3VyY2UgQ2xpcHBpbmdcbiAgLy8gSWYgdGhlIHNvdXJjZSB3YXMgY2xpcHBlZCBvbiB0aGUgdG9wL2xlZnQsIHdlIG11c3Qgc2hpZnQgdGhlIGRlc3RpbmF0aW9uIHN0YXJ0XG4gIGNvbnN0IHhTaGlmdCA9IHNYMCAtIHN0YXJ0WFxuICBjb25zdCB5U2hpZnQgPSBzWTAgLSBzdGFydFlcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gZmluYWxXXG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBmaW5hbFdcblxuICBsZXQgZElkeCA9ICh5ICsgeVNoaWZ0KSAqIGR3ICsgKHggKyB4U2hpZnQpXG4gIGxldCBtSWR4ID0gc1kwICogbVBpdGNoICsgc1gwXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgdzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IG1hc2tbbUlkeF1cbiAgICAgIC8vIFVuaWZpZWQgbG9naWMgYnJhbmNoIGluc2lkZSB0aGUgaG90IHBhdGhcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgbGV0IHdlaWdodCA9IDBcblxuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMFxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxwaGEgY2hhbm5lbFxuICAgICAgICBkc3QzMltkSWR4XSA9IChkc3QzMltkSWR4XSAmIDB4MDBmZmZmZmYpID4+PiAwXG4gICAgICB9IGVsc2UgaWYgKHdlaWdodCAhPT0gMjU1KSB7XG4gICAgICAgIC8vIE1lcmdlIGFscGhhIGNoYW5uZWxcbiAgICAgICAgY29uc3QgZCA9IGRzdDMyW2RJZHhdXG4gICAgICAgIGNvbnN0IGRhID0gZCA+Pj4gMjRcblxuICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBmaW5hbEFscGhhID0gZGEgPT09IDI1NSA/IHdlaWdodCA6IChkYSAqIHdlaWdodCArIDEyOCkgPj4gOFxuICAgICAgICAgIGRzdDMyW2RJZHhdID0gKChkICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type HistoryMutator } from '../../_types';\nimport { applyAlphaMaskToPixelData } from '../../PixelData/applyAlphaMaskToPixelData';\nconst defaults = {\n applyAlphaMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyAlphaMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyAlphaMaskToPixelData = defaults.applyAlphaMaskToPixelData\n } = deps;\n return {\n applyAlphaMask: (mask: AlphaMask, opts: ApplyMaskToPixelDataOptions = {}) => {\n let target = writer.target;\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyAlphaMaskToPixelData(target, mask, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zLCB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseUFscGhhTWFzazogKG1hc2s6IEFscGhhTWFzaywgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSB3cml0ZXIudGFyZ2V0XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cylcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n */\nexport function applyBinaryMaskToPixelData(dst: IPixelData, mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha = 255,\n mw,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (alpha === 0) return;\n\n // 1. Initial Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dst.width - x);\n h = Math.min(h, dst.height - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Determine Source Dimensions\n const mPitch = mw ?? width;\n if (mPitch <= 0) return;\n const maskHeight = mask.length / mPitch | 0;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(maskHeight, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = dst.data32;\n const dw = dst.width;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const mVal = mask[mIdx];\n // Consistently determines if this pixel should be \"masked out\" (cleared)\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n // Clear alpha channel only (keep RGB)\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0;\n } else if (alpha !== 255) {\n const d = dst32[dIdx];\n const da = d >>> 24;\n\n // If pixel isn't already fully transparent, apply global alpha\n if (da !== 0) {\n const finalAlpha = da === 255 ? alpha : da * alpha + 128 >> 8;\n dst32[dIdx] = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgbWFzazogQmluYXJ5TWFzayxcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGEgPSAyNTUsXG4gICAgbXcsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGFscGhhID09PSAwKSByZXR1cm5cblxuICAvLyAxLiBJbml0aWFsIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgdyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAodyA8PSAwKSByZXR1cm5cbiAgaWYgKGggPD0gMCkgcmV0dXJuXG5cbiAgLy8gMi4gRGV0ZXJtaW5lIFNvdXJjZSBEaW1lbnNpb25zXG4gIGNvbnN0IG1QaXRjaCA9IG13ID8/IHdpZHRoXG4gIGlmIChtUGl0Y2ggPD0gMCkgcmV0dXJuXG4gIGNvbnN0IG1hc2tIZWlnaHQgPSAobWFzay5sZW5ndGggLyBtUGl0Y2gpIHwgMFxuXG4gIC8vIDMuIFNvdXJjZSBCb3VuZHMgQ2xpcHBpbmdcbiAgLy8gQ2FsY3VsYXRlIHdoZXJlIHdlIHdvdWxkIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIG1hc2tcbiAgY29uc3Qgc3RhcnRYID0gbXggKyAoeCAtIHRhcmdldFgpXG4gIGNvbnN0IHN0YXJ0WSA9IG15ICsgKHkgLSB0YXJnZXRZKVxuXG4gIC8vIEZpbmQgdGhlIHNhZmUgb3ZlcmxhcCBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGFuZCB0aGUgbWFzayBib3VuZHNcbiAgY29uc3Qgc1gwID0gTWF0aC5tYXgoMCwgc3RhcnRYKVxuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKG1QaXRjaCwgc3RhcnRYICsgdylcbiAgY29uc3Qgc1kxID0gTWF0aC5taW4obWFza0hlaWdodCwgc3RhcnRZICsgaClcblxuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDBcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwXG5cbiAgLy8gVGhpcyBpcyB3aGVyZSB5b3VyIGZhaWxpbmcgdGVzdHMgYXJlIG5vdyBjYXVnaHRcbiAgaWYgKGZpbmFsVyA8PSAwKSByZXR1cm5cbiAgaWYgKGZpbmFsSCA8PSAwKSByZXR1cm5cblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsV1xuXG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdClcbiAgbGV0IG1JZHggPSBzWTAgKiBtUGl0Y2ggKyBzWDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgaDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCB3OyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza1ttSWR4XVxuICAgICAgLy8gQ29uc2lzdGVudGx5IGRldGVybWluZXMgaWYgdGhpcyBwaXhlbCBzaG91bGQgYmUgXCJtYXNrZWQgb3V0XCIgKGNsZWFyZWQpXG4gICAgICBjb25zdCBpc01hc2tlZE91dCA9IGludmVydE1hc2sgPyBtVmFsICE9PSAwIDogbVZhbCA9PT0gMFxuXG4gICAgICBpZiAoaXNNYXNrZWRPdXQpIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxwaGEgY2hhbm5lbCBvbmx5IChrZWVwIFJHQilcbiAgICAgICAgZHN0MzJbZElkeF0gPSAoZHN0MzJbZElkeF0gJiAweDAwZmZmZmZmKSA+Pj4gMFxuICAgICAgfSBlbHNlIGlmIChhbHBoYSAhPT0gMjU1KSB7XG4gICAgICAgIGNvbnN0IGQgPSBkc3QzMltkSWR4XVxuICAgICAgICBjb25zdCBkYSA9IGQgPj4+IDI0XG5cbiAgICAgICAgLy8gSWYgcGl4ZWwgaXNuJ3QgYWxyZWFkeSBmdWxseSB0cmFuc3BhcmVudCwgYXBwbHkgZ2xvYmFsIGFscGhhXG4gICAgICAgIGlmIChkYSAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGZpbmFsQWxwaGEgPSBkYSA9PT0gMjU1ID8gYWxwaGEgOiAoZGEgKiBhbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICAgIGRzdDMyW2RJZHhdID0gKChkICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type HistoryMutator } from '../../_types';\nimport { applyBinaryMaskToPixelData } from '../../PixelData/applyBinaryMaskToPixelData';\nconst defaults = {\n applyBinaryMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyBinaryMaskToPixelData = defaults.applyBinaryMaskToPixelData\n } = deps;\n return {\n applyBinaryMask: (mask: BinaryMask, opts: ApplyMaskToPixelDataOptions = {}) => {\n let target = writer.target;\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyBinaryMaskToPixelData(target, mask, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMsIHR5cGUgQmluYXJ5TWFzaywgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYXBwbHlCaW5hcnlNYXNrOiAobWFzazogQmluYXJ5TWFzaywgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30pID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSB3cml0ZXIudGFyZ2V0XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQsIG1hc2ssIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function getCircleBrushOrPencilBounds(centerX: number, centerY: number, brushSize: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const r = brushSize / 2;\n const minOffset = -Math.ceil(r - 0.5);\n const maxOffset = Math.floor(r - 0.5);\n\n // start is inclusive, end is exclusive\n const startX = Math.floor(centerX + minOffset);\n const startY = Math.floor(centerY + minOffset);\n const endX = Math.floor(centerX + maxOffset) + 1;\n const endY = Math.floor(centerY + maxOffset) + 1;\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const cStartX = Math.max(0, startX);\n const cStartY = Math.max(0, startY);\n const cEndX = Math.min(targetWidth, endX);\n const cEndY = Math.min(targetHeight, endY);\n const w = cEndX - cStartX;\n const h = cEndY - cStartY;\n res.x = cStartX;\n res.y = cStartY;\n res.w = w < 0 ? 0 : w;\n res.h = h < 0 ? 0 : h;\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgY2VudGVyWDogbnVtYmVyLFxuICBjZW50ZXJZOiBudW1iZXIsXG4gIGJydXNoU2l6ZTogbnVtYmVyLFxuICB0YXJnZXRXaWR0aDogbnVtYmVyLFxuICB0YXJnZXRIZWlnaHQ6IG51bWJlcixcbiAgb3V0PzogUmVjdCxcbik6IFJlY3Qge1xuICBjb25zdCByID0gYnJ1c2hTaXplIC8gMlxuXG4gIGNvbnN0IG1pbk9mZnNldCA9IC1NYXRoLmNlaWwociAtIDAuNSlcbiAgY29uc3QgbWF4T2Zmc2V0ID0gTWF0aC5mbG9vcihyIC0gMC41KVxuXG4gIC8vIHN0YXJ0IGlzIGluY2x1c2l2ZSwgZW5kIGlzIGV4Y2x1c2l2ZVxuICBjb25zdCBzdGFydFggPSBNYXRoLmZsb29yKGNlbnRlclggKyBtaW5PZmZzZXQpXG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3IoY2VudGVyWSArIG1pbk9mZnNldClcbiAgY29uc3QgZW5kWCA9IE1hdGguZmxvb3IoY2VudGVyWCArIG1heE9mZnNldCkgKyAxXG4gIGNvbnN0IGVuZFkgPSBNYXRoLmZsb29yKGNlbnRlclkgKyBtYXhPZmZzZXQpICsgMVxuXG4gIGNvbnN0IHJlcyA9IG91dCA/PyB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNTdGFydFggPSBNYXRoLm1heCgwLCBzdGFydFgpXG4gIGNvbnN0IGNTdGFydFkgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IGNFbmRYID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIGVuZFgpXG4gIGNvbnN0IGNFbmRZID0gTWF0aC5taW4odGFyZ2V0SGVpZ2h0LCBlbmRZKVxuXG4gIGNvbnN0IHcgPSBjRW5kWCAtIGNTdGFydFhcbiAgY29uc3QgaCA9IGNFbmRZIC0gY1N0YXJ0WVxuXG4gIHJlcy54ID0gY1N0YXJ0WFxuICByZXMueSA9IGNTdGFydFlcbiAgcmVzLncgPSB3IDwgMCA/IDAgOiB3XG4gIHJlcy5oID0gaCA8IDAgPyAwIDogaFxuXG4gIHJldHVybiByZXNcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { getCircleBrushOrPencilBounds } from '../Rect/getCircleBrushOrPencilBounds';\n\n/**\n * Applies a circular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushSize The diameter of the brush.\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @param bounds precalculated result from {@link getCircleBrushOrPencilBounds}\n * @default sourceOverPerfect\n */\nexport function applyCircleBrushToPixelData(target: IPixelData, color: Color32, centerX: number, centerY: number, brushSize: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect, bounds?: Rect): void {\n const targetWidth = target.width;\n const targetHeight = target.height;\n\n // Use provided bounds OR calculate them once\n const b = bounds ?? getCircleBrushOrPencilBounds(centerX, centerY, brushSize, targetWidth, targetHeight);\n if (b.w <= 0 || b.h <= 0) return;\n const data32 = target.data32;\n const r = brushSize / 2;\n const rSqr = r * r;\n const invR = 1 / r;\n const centerOffset = brushSize % 2 === 0 ? 0.5 : 0;\n const endX = b.x + b.w;\n const endY = b.y + b.h;\n\n // Anchor the math to the floor of the center for exact pixel art parity\n const fCenterX = Math.floor(centerX);\n const fCenterY = Math.floor(centerY);\n const baseSrcAlpha = color >>> 24;\n const colorRGB = color & 0x00ffffff;\n const isOpaque = alpha === 255;\n const isOverwrite = (blendFn as any).isOverwrite;\n for (let cy = b.y; cy < endY; cy++) {\n const relY = cy - fCenterY + centerOffset;\n const dySqr = relY * relY;\n const rowOffset = cy * targetWidth;\n for (let cx = b.x; cx < endX; cx++) {\n const relX = cx - fCenterX + centerOffset;\n const dSqr = relX * relX + dySqr;\n if (dSqr <= rSqr) {\n const idx = rowOffset + cx;\n let weight = alpha;\n const strength = fallOff(1 - Math.sqrt(dSqr) * invR);\n const maskVal = strength * 255 | 0;\n if (maskVal === 0) continue;\n\n // Match Blitter's weight calculation exactly\n if (isOpaque) {\n weight = maskVal;\n } else if (maskVal !== 255) {\n weight = maskVal * alpha + 128 >> 8;\n }\n\n // Match Blitter's final color calculation exactly\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) continue;\n finalCol = (colorRGB | a << 24) >>> 0 as Color32;\n }\n data32[idx] = blendFn(finalCol, data32[idx] as Color32);\n }\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIElQaXhlbERhdGEsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMnXG5cbi8qKlxuICogQXBwbGllcyBhIGNpcmN1bGFyIGJydXNoIHRvIHBpeGVsIGRhdGEsIGJsZW5kaW5nIGEgY29sb3Igd2l0aCBvcHRpb25hbCBmYWxsb2ZmLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIFBpeGVsRGF0YSB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgVGhlIGJydXNoIGNvbG9yLlxuICogQHBhcmFtIGNlbnRlclggVGhlIGNlbnRlciB4LWNvb3JkaW5hdGUgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGNlbnRlclkgVGhlIGNlbnRlciB5LWNvb3JkaW5hdGUgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGJydXNoU2l6ZSBUaGUgZGlhbWV0ZXIgb2YgdGhlIGJydXNoLlxuICogQHBhcmFtIGFscGhhIFRoZSBvdmVyYWxsIG9wYWNpdHkgb2YgdGhlIGJydXNoICgwLTI1NSkuXG4gKiBAZGVmYXVsdCAyNTVcbiAqIEBwYXJhbSBmYWxsT2ZmIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGFscGhhIG11bHRpcGxpZXIgKDAtMSkgYmFzZWQgb24gdGhlIG5vcm1hbGl6ZWQgZGlzdGFuY2UgKDAtMSkgZnJvbSB0aGUgY2lyY2xlJ3MgY2VudGVyLlxuICogQHBhcmFtIGJsZW5kRm5cbiAqIEBwYXJhbSBib3VuZHMgcHJlY2FsY3VsYXRlZCByZXN1bHQgZnJvbSB7QGxpbmsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kc31cbiAqIEBkZWZhdWx0IHNvdXJjZU92ZXJQZXJmZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUNpcmNsZUJydXNoVG9QaXhlbERhdGEoXG4gIHRhcmdldDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFNpemU6IG51bWJlcixcbiAgYWxwaGEgPSAyNTUsXG4gIGZhbGxPZmY6IChkaXN0OiBudW1iZXIpID0+IG51bWJlcixcbiAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4gIGJvdW5kcz86IFJlY3QsXG4pOiB2b2lkIHtcbiAgY29uc3QgdGFyZ2V0V2lkdGggPSB0YXJnZXQud2lkdGhcbiAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gdGFyZ2V0LmhlaWdodFxuXG4gIC8vIFVzZSBwcm92aWRlZCBib3VuZHMgT1IgY2FsY3VsYXRlIHRoZW0gb25jZVxuICBjb25zdCBiID0gYm91bmRzID8/IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgY2VudGVyWCxcbiAgICBjZW50ZXJZLFxuICAgIGJydXNoU2l6ZSxcbiAgICB0YXJnZXRXaWR0aCxcbiAgICB0YXJnZXRIZWlnaHQsXG4gIClcblxuICBpZiAoYi53IDw9IDAgfHwgYi5oIDw9IDApIHJldHVyblxuXG4gIGNvbnN0IGRhdGEzMiA9IHRhcmdldC5kYXRhMzJcbiAgY29uc3QgciA9IGJydXNoU2l6ZSAvIDJcbiAgY29uc3QgclNxciA9IHIgKiByXG4gIGNvbnN0IGludlIgPSAxIC8gclxuXG4gIGNvbnN0IGNlbnRlck9mZnNldCA9IChicnVzaFNpemUgJSAyID09PSAwKSA/IDAuNSA6IDBcblxuICBjb25zdCBlbmRYID0gYi54ICsgYi53XG4gIGNvbnN0IGVuZFkgPSBiLnkgKyBiLmhcblxuICAvLyBBbmNob3IgdGhlIG1hdGggdG8gdGhlIGZsb29yIG9mIHRoZSBjZW50ZXIgZm9yIGV4YWN0IHBpeGVsIGFydCBwYXJpdHlcbiAgY29uc3QgZkNlbnRlclggPSBNYXRoLmZsb29yKGNlbnRlclgpXG4gIGNvbnN0IGZDZW50ZXJZID0gTWF0aC5mbG9vcihjZW50ZXJZKVxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBjb2xvclJHQiA9IGNvbG9yICYgMHgwMGZmZmZmZlxuICBjb25zdCBpc09wYXF1ZSA9IGFscGhhID09PSAyNTVcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlXG5cbiAgZm9yIChsZXQgY3kgPSBiLnk7IGN5IDwgZW5kWTsgY3krKykge1xuICAgIGNvbnN0IHJlbFkgPSAoY3kgLSBmQ2VudGVyWSkgKyBjZW50ZXJPZmZzZXRcbiAgICBjb25zdCBkeVNxciA9IHJlbFkgKiByZWxZXG4gICAgY29uc3Qgcm93T2Zmc2V0ID0gY3kgKiB0YXJnZXRXaWR0aFxuXG4gICAgZm9yIChsZXQgY3ggPSBiLng7IGN4IDwgZW5kWDsgY3grKykge1xuICAgICAgY29uc3QgcmVsWCA9IChjeCAtIGZDZW50ZXJYKSArIGNlbnRlck9mZnNldFxuICAgICAgY29uc3QgZFNxciA9IHJlbFggKiByZWxYICsgZHlTcXJcblxuICAgICAgaWYgKGRTcXIgPD0gclNxcikge1xuICAgICAgICBjb25zdCBpZHggPSByb3dPZmZzZXQgKyBjeFxuICAgICAgICBsZXQgd2VpZ2h0ID0gYWxwaGFcblxuICAgICAgICBjb25zdCBzdHJlbmd0aCA9IGZhbGxPZmYoMSAtIChNYXRoLnNxcnQoZFNxcikgKiBpbnZSKSlcbiAgICAgICAgY29uc3QgbWFza1ZhbCA9IChzdHJlbmd0aCAqIDI1NSkgfCAwXG4gICAgICAgIGlmIChtYXNrVmFsID09PSAwKSBjb250aW51ZVxuXG4gICAgICAgIC8vIE1hdGNoIEJsaXR0ZXIncyB3ZWlnaHQgY2FsY3VsYXRpb24gZXhhY3RseVxuICAgICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgICB3ZWlnaHQgPSBtYXNrVmFsXG4gICAgICAgIH0gZWxzZSBpZiAobWFza1ZhbCAhPT0gMjU1KSB7XG4gICAgICAgICAgd2VpZ2h0ID0gKG1hc2tWYWwgKiBhbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF0Y2ggQmxpdHRlcidzIGZpbmFsIGNvbG9yIGNhbGN1bGF0aW9uIGV4YWN0bHlcbiAgICAgICAgbGV0IGZpbmFsQ29sID0gY29sb3JcbiAgICAgICAgaWYgKHdlaWdodCA8IDI1NSkge1xuICAgICAgICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG4gICAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSBjb250aW51ZVxuICAgICAgICAgIGZpbmFsQ29sID0gKGNvbG9yUkdCIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhMzJbaWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRhdGEzMltpZHhdIGFzIENvbG9yMzIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { applyCircleBrushToPixelData } from '../../PixelData/applyCircleBrushToPixelData';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nconst defaults = {\n applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCircleBrush = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyCircleBrushToPixelData = defaults.applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCircleBrush(color: Color32, centerX: number, centerY: number, brushSize: number, alpha = 255, fallOff: (dist: number) => number, blendFn?: BlendColor32) {\n const bounds = getCircleBrushOrPencilBounds(centerX, centerY, brushSize, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyCircleBrushToPixelData(writer.target, color, centerX, centerY, brushSize, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSdcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhLFxuICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUNpcmNsZUJydXNoID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxuXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2goXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGNlbnRlclg6IG51bWJlcixcbiAgICAgIGNlbnRlclk6IG51bWJlcixcbiAgICAgIGJydXNoU2l6ZTogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaFNpemUsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YShcbiAgICAgICAgd3JpdGVyLnRhcmdldCxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoU2l6ZSxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGZhbGxPZmYsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Iterates through a line with sub-pixel precision.\n * Guarantees that the first and last points are exactly (x0, y0) and (x1, y1).\n */\nexport function forEachLinePoint(x0: number, y0: number, x1: number, y1: number, callback: (x: number, y: number) => void): void {\n const dx = x1 - x0;\n const dy = y1 - y0;\n\n // Determine the number of steps based on the longest axis\n const steps = Math.max(Math.abs(dx), Math.abs(dy));\n\n // Handle the zero-length line (Single Stamp Case)\n if (steps === 0) {\n callback(x0, y0);\n return;\n }\n const xInc = dx / steps;\n const yInc = dy / steps;\n let curX = x0;\n let curY = y0;\n\n // We add +1 to the loop to ensure we reach the final (x1, y1)\n for (let i = 0; i <= steps; i++) {\n callback(curX, curY);\n curX += xInc;\n curY += yInc;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGEgbGluZSB3aXRoIHN1Yi1waXhlbCBwcmVjaXNpb24uXG4gKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgZXhhY3RseSAoeDAsIHkwKSBhbmQgKHgxLCB5MSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoTGluZVBvaW50KFxuICB4MDogbnVtYmVyLFxuICB5MDogbnVtYmVyLFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICBjYWxsYmFjazogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGNvbnN0IGR4ID0geDEgLSB4MFxuICBjb25zdCBkeSA9IHkxIC0geTBcblxuICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzdGVwcyBiYXNlZCBvbiB0aGUgbG9uZ2VzdCBheGlzXG4gIGNvbnN0IHN0ZXBzID0gTWF0aC5tYXgoTWF0aC5hYnMoZHgpLCBNYXRoLmFicyhkeSkpXG5cbiAgLy8gSGFuZGxlIHRoZSB6ZXJvLWxlbmd0aCBsaW5lIChTaW5nbGUgU3RhbXAgQ2FzZSlcbiAgaWYgKHN0ZXBzID09PSAwKSB7XG4gICAgY2FsbGJhY2soeDAsIHkwKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeEluYyA9IGR4IC8gc3RlcHNcbiAgY29uc3QgeUluYyA9IGR5IC8gc3RlcHNcblxuICBsZXQgY3VyWCA9IHgwXG4gIGxldCBjdXJZID0geTBcblxuICAvLyBXZSBhZGQgKzEgdG8gdGhlIGxvb3AgdG8gZW5zdXJlIHdlIHJlYWNoIHRoZSBmaW5hbCAoeDEsIHkxKVxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gICAgY2FsbGJhY2soY3VyWCwgY3VyWSlcbiAgICBjdXJYICs9IHhJbmNcbiAgICBjdXJZICs9IHlJbmNcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendColorPixelDataAlphaMask(dst: IPixelData, color: Color32, mask: AlphaMask, opts: ColorBlendMaskOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0 || !mask) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mw;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n let mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const colorRGB = color & 0x00ffffff;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n if (effM === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n mIdx++;\n continue;\n }\n finalCol = (colorRGB | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIENvbG9yMzIsIENvbG9yQmxlbmRNYXNrT3B0aW9ucywgSVBpeGVsRGF0YSB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBjb2xvcjogQ29sb3IzMixcbiAgbWFzazogQWxwaGFNYXNrLFxuICBvcHRzOiBDb2xvckJsZW5kTWFza09wdGlvbnMsXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBtdyA9IHdpZHRoLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCB8fCAhbWFzaykgcmV0dXJuXG5cbiAgY29uc3QgYmFzZVNyY0FscGhhID0gKGNvbG9yID4+PiAyNClcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlIHx8IGZhbHNlXG5cbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVyblxuXG4gIGxldCB4ID0gdGFyZ2V0WFxuICBsZXQgeSA9IHRhcmdldFlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geFxuICAgIHggPSAwXG4gIH1cblxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcblxuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuXG5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG13XG5cbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGxldCBtSWR4ID0gKChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KSkgfCAwXG5cbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBsZXQgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGNvbG9yUkdCID0gY29sb3IgJiAweDAwZmZmZmZmXG5cbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IG1hc2tbbUlkeF1cbiAgICAgIGNvbnN0IGVmZk0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgaWYgKGVmZk0gPT09IDApIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcblxuICAgICAgaWYgKGlzT3BhcXVlKSB7XG4gICAgICAgIHdlaWdodCA9IGVmZk1cbiAgICAgIH0gZWxzZSBpZiAoZWZmTSAhPT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IChlZmZNICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgIH1cblxuICAgICAgaWYgKHdlaWdodCA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IGNvbG9yXG5cbiAgICAgIGlmICh3ZWlnaHQgPCAyNTUpIHtcbiAgICAgICAgY29uc3QgYSA9IChiYXNlU3JjQWxwaGEgKiB3ZWlnaHQgKyAxMjgpID4+IDhcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrXG4gICAgICAgICAgbUlkeCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9IChjb2xvclJHQiB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG5cbiAgICAgIGRJZHgrK1xuICAgICAgbUlkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgbUlkeCArPSBtU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function getCircleBrushOrPencilStrokeBounds(x0: number, y0: number, x1: number, y1: number, brushSize: number, result: Rect): Rect {\n const r = Math.ceil(brushSize / 2);\n const minX = Math.min(x0, x1) - r;\n const minY = Math.min(y0, y1) - r;\n const maxX = Math.max(x0, x1) + r;\n const maxY = Math.max(x0, y1) + r;\n result.x = Math.floor(minX);\n result.y = Math.floor(minY);\n result.w = Math.ceil(maxX - minX);\n result.h = Math.ceil(maxY - minY);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyhcbiAgeDA6IG51bWJlcixcbiAgeTA6IG51bWJlcixcbiAgeDE6IG51bWJlcixcbiAgeTE6IG51bWJlcixcbiAgYnJ1c2hTaXplOiBudW1iZXIsXG4gIHJlc3VsdDogUmVjdCxcbik6IFJlY3Qge1xuICBjb25zdCByID0gTWF0aC5jZWlsKGJydXNoU2l6ZSAvIDIpXG5cbiAgY29uc3QgbWluWCA9IE1hdGgubWluKHgwLCB4MSkgLSByXG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MCwgeTEpIC0gclxuICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDAsIHgxKSArIHJcbiAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHgwLCB5MSkgKyByXG5cbiAgcmVzdWx0LnggPSBNYXRoLmZsb29yKG1pblgpXG4gIHJlc3VsdC55ID0gTWF0aC5mbG9vcihtaW5ZKVxuICByZXN1bHQudyA9IE1hdGguY2VpbChtYXhYIC0gbWluWClcbiAgcmVzdWx0LmggPSBNYXRoLmNlaWwobWF4WSAtIG1pblkpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type AlphaMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nimport { getCircleBrushOrPencilStrokeBounds } from '../../Rect/getCircleBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataAlphaMask,\n getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCircleBrushStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds = defaults.getCircleBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const circleBrushBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendMaskOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCircleBrushStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushSize: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getCircleBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushSize, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as AlphaMask;\n const r = brushSize / 2;\n const rSqr = r * r;\n const invR = 1 / r;\n const centerOffset = brushSize % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n // 2. Calculate bounds for this specific stamp\n const {\n x: cbx,\n y: cby,\n w: cbw,\n h: cbh\n } = getCircleBrushOrPencilBounds(px, py, brushSize, targetWidth, targetHeight, circleBrushBounds);\n writer.accumulator.storeRegionBeforeState(cbx, cby, cbw, cbh);\n const startX = Math.max(bx, cbx);\n const startY = Math.max(by, cby);\n const endX = Math.min(bx + bw, cbx + cbw);\n const endY = Math.min(by + bh, cby + cbh);\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = my - fPy + centerOffset;\n const dySqr = dy * dy;\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = mx - fPx + centerOffset;\n const dSqr = dx * dx + dySqr;\n if (dSqr <= rSqr) {\n const maskIdx = maskRowOffset + (mx - bx);\n const dist = Math.sqrt(dSqr) * invR;\n const intensity = fallOff(1 - dist) * 255 | 0;\n if (intensity > mask[maskIdx]) {\n mask[maskIdx] = intensity;\n }\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataAlphaMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbHBoYU1hc2ssXG4gIHR5cGUgQmxlbmRDb2xvcjMyLFxuICB0eXBlIENvbG9yMzIsXG4gIHR5cGUgQ29sb3JCbGVuZE1hc2tPcHRpb25zLFxuICB0eXBlIEhpc3RvcnlNdXRhdG9yLFxuICB0eXBlIFJlY3QsXG59IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZvckVhY2hMaW5lUG9pbnQgfSBmcm9tICcuLi8uLi9BbGdvcml0aG0vZm9yRWFjaExpbmVQb2ludCdcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJ1xuaW1wb3J0IHsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcydcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayxcbiAgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbn1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbmV4cG9ydCBjb25zdCBtdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZvckVhY2hMaW5lUG9pbnQgPSBkZWZhdWx0cy5mb3JFYWNoTGluZVBvaW50LFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxuICAgIGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgPSBkZWZhdWx0cy5nZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IHN0cm9rZUJvdW5kc091dDogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgY2lyY2xlQnJ1c2hCb3VuZHM6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGJsZW5kQ29sb3JQaXhlbE9wdGlvbnM6IENvbG9yQmxlbmRNYXNrT3B0aW9ucyA9IHtcbiAgICBhbHBoYTogMjU1LFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDAsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2hTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaFNpemU6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgZmFsbE9mZjogKGRpc3Q6IG51bWJlcikgPT4gbnVtYmVyLFxuICAgICAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4gICAgKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IGJ4LFxuICAgICAgICB5OiBieSxcbiAgICAgICAgdzogYncsXG4gICAgICAgIGg6IGJoLFxuICAgICAgfSA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoeDAsIHkwLCB4MSwgeTEsIGJydXNoU2l6ZSwgc3Ryb2tlQm91bmRzT3V0KVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGJ3ICogYmgpIGFzIEFscGhhTWFza1xuXG4gICAgICBjb25zdCByID0gYnJ1c2hTaXplIC8gMlxuICAgICAgY29uc3QgclNxciA9IHIgKiByXG4gICAgICBjb25zdCBpbnZSID0gMSAvIHJcbiAgICAgIGNvbnN0IGNlbnRlck9mZnNldCA9IChicnVzaFNpemUgJSAyID09PSAwKSA/IDAuNSA6IDBcblxuICAgICAgY29uc3QgdGFyZ2V0V2lkdGggPSB3cml0ZXIudGFyZ2V0LndpZHRoXG4gICAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSB3cml0ZXIudGFyZ2V0LmhlaWdodFxuXG4gICAgICBmb3JFYWNoTGluZVBvaW50KHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICAgIC8vIDIuIENhbGN1bGF0ZSBib3VuZHMgZm9yIHRoaXMgc3BlY2lmaWMgc3RhbXBcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IGNieCxcbiAgICAgICAgICB5OiBjYnksXG4gICAgICAgICAgdzogY2J3LFxuICAgICAgICAgIGg6IGNiaCxcbiAgICAgICAgfSA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMocHgsIHB5LCBicnVzaFNpemUsIHRhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHQsIGNpcmNsZUJydXNoQm91bmRzKVxuXG4gICAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKGNieCwgY2J5LCBjYncsIGNiaClcblxuICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1heChieCwgY2J4KVxuICAgICAgICBjb25zdCBzdGFydFkgPSBNYXRoLm1heChieSwgY2J5KVxuICAgICAgICBjb25zdCBlbmRYID0gTWF0aC5taW4oYnggKyBidywgY2J4ICsgY2J3KVxuICAgICAgICBjb25zdCBlbmRZID0gTWF0aC5taW4oYnkgKyBiaCwgY2J5ICsgY2JoKVxuXG4gICAgICAgIGNvbnN0IGZQeCA9IE1hdGguZmxvb3IocHgpXG4gICAgICAgIGNvbnN0IGZQeSA9IE1hdGguZmxvb3IocHkpXG5cbiAgICAgICAgZm9yIChsZXQgbXkgPSBzdGFydFk7IG15IDwgZW5kWTsgbXkrKykge1xuICAgICAgICAgIGNvbnN0IGR5ID0gKG15IC0gZlB5KSArIGNlbnRlck9mZnNldFxuICAgICAgICAgIGNvbnN0IGR5U3FyID0gZHkgKiBkeVxuICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuXG4gICAgICAgICAgZm9yIChsZXQgbXggPSBzdGFydFg7IG14IDwgZW5kWDsgbXgrKykge1xuICAgICAgICAgICAgY29uc3QgZHggPSAobXggLSBmUHgpICsgY2VudGVyT2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBkU3FyID0gZHggKiBkeCArIGR5U3FyXG5cbiAgICAgICAgICAgIGlmIChkU3FyIDw9IHJTcXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcblxuICAgICAgICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5zcXJ0KGRTcXIpICogaW52UlxuICAgICAgICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSAoZmFsbE9mZigxIC0gZGlzdCkgKiAyNTUpIHwgMFxuICAgICAgICAgICAgICBpZiAoaW50ZW5zaXR5ID4gbWFza1ttYXNrSWR4XSkge1xuICAgICAgICAgICAgICAgIG1hc2tbbWFza0lkeF0gPSBpbnRlbnNpdHlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5ibGVuZEZuID0gYmxlbmRGblxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5hbHBoYSA9IGFscGhhXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnggPSBieFxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy55ID0gYnlcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMudyA9IGJ3XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmggPSBiaFxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci50YXJnZXQsIGNvbG9yLCBtYXNrLCBibGVuZENvbG9yUGl4ZWxPcHRpb25zKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendColorPixelDataBinaryMask(dst: IPixelData, color: Color32, mask: BinaryMask, opts: ColorBlendMaskOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0 || !mask) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n let baseColorWithGlobalAlpha = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return;\n baseColorWithGlobalAlpha = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mw;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n if (mask[mIdx] === skipVal) {\n dIdx++;\n mIdx++;\n continue;\n }\n dst32[dIdx] = blendFn(baseColorWithGlobalAlpha, dst32[dIdx] as Color32);\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBDb2xvckJsZW5kTWFza09wdGlvbnMsIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICBtYXNrOiBCaW5hcnlNYXNrLFxuICBvcHRzOiBDb2xvckJsZW5kTWFza09wdGlvbnMgPSB7fSxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSBkc3Qud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gZHN0LmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIG13ID0gd2lkdGgsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwIHx8ICFtYXNrKSByZXR1cm5cblxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2VcblxuICBpZiAoYmFzZVNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuXG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgZHN0LndpZHRoIC0geClcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIGRzdC5oZWlnaHQgLSB5KVxuXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm5cblxuICBsZXQgYmFzZUNvbG9yV2l0aEdsb2JhbEFscGhhID0gY29sb3JcblxuICBpZiAoZ2xvYmFsQWxwaGEgPCAyNTUpIHtcbiAgICBjb25zdCBhID0gKGJhc2VTcmNBbHBoYSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm5cbiAgICBiYXNlQ29sb3JXaXRoR2xvYmFsQWxwaGEgPSAoKGNvbG9yICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgfVxuXG4gIGNvbnN0IGR4ID0gKHggLSB0YXJnZXRYKSB8IDBcbiAgY29uc3QgZHkgPSAoeSAtIHRhcmdldFkpIHwgMFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtd1xuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3QgbVN0cmlkZSA9IChtUGl0Y2ggLSBhY3R1YWxXKSB8IDBcbiAgY29uc3Qgc2tpcFZhbCA9IGludmVydE1hc2sgPyAxIDogMFxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGlmIChtYXNrW21JZHhdID09PSBza2lwVmFsKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgZHN0MzJbZElkeF0gPSBibGVuZEZuKGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcblxuICAgICAgZElkeCsrXG4gICAgICBtSWR4KytcbiAgICB9XG5cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type BinaryMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nimport { getCircleBrushOrPencilStrokeBounds } from '../../Rect/getCircleBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataBinaryMask,\n getCircleBrushOrPencilBounds,\n getCircleBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCirclePencilStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n getCircleBrushOrPencilStrokeBounds = defaults.getCircleBrushOrPencilStrokeBounds,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const circlePencilBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendMaskOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCirclePencilStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushSize: number, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getCircleBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushSize, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as BinaryMask;\n const r = brushSize / 2;\n const rSqr = r * r;\n const centerOffset = brushSize % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n // 2. Calculate bounds for this specific stamp\n const {\n x: cbx,\n y: cby,\n w: cbw,\n h: cbh\n } = getCircleBrushOrPencilBounds(px, py, brushSize, targetWidth, targetHeight, circlePencilBounds);\n writer.accumulator.storeRegionBeforeState(cbx, cby, cbw, cbh);\n const startX = Math.max(bx, cbx);\n const startY = Math.max(by, cby);\n const endX = Math.min(bx + bw, cbx + cbw);\n const endY = Math.min(by + bh, cby + cbh);\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = my - fPy + centerOffset;\n const dySqr = dy * dy;\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = mx - fPx + centerOffset;\n const dSqr = dx * dx + dySqr;\n if (dSqr <= rSqr) {\n const maskIdx = maskRowOffset + (mx - bx);\n mask[maskIdx] = 1;\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataBinaryMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBCaW5hcnlNYXNrLFxuICB0eXBlIEJsZW5kQ29sb3IzMixcbiAgdHlwZSBDb2xvcjMyLFxuICB0eXBlIENvbG9yQmxlbmRNYXNrT3B0aW9ucyxcbiAgdHlwZSBIaXN0b3J5TXV0YXRvcixcbiAgdHlwZSBSZWN0LFxufSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrJ1xuaW1wb3J0IHsgZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcydcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gIGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMsXG59XG5cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5Q2lyY2xlUGVuY2lsU3Ryb2tlID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZm9yRWFjaExpbmVQb2ludCA9IGRlZmF1bHRzLmZvckVhY2hMaW5lUG9pbnQsXG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgfSA9IGRlcHNcblxuICBjb25zdCBzdHJva2VCb3VuZHNPdXQ6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNpcmNsZVBlbmNpbEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE1hc2tPcHRpb25zID0ge1xuICAgIGFscGhhOiAyNTUsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXBwbHlDaXJjbGVQZW5jaWxTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaFNpemU6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QsXG4gICAgKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IGJ4LFxuICAgICAgICB5OiBieSxcbiAgICAgICAgdzogYncsXG4gICAgICAgIGg6IGJoLFxuICAgICAgfSA9IGdldENpcmNsZUJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoeDAsIHkwLCB4MSwgeTEsIGJydXNoU2l6ZSwgc3Ryb2tlQm91bmRzT3V0KVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGJ3ICogYmgpIGFzIEJpbmFyeU1hc2tcblxuICAgICAgY29uc3QgciA9IGJydXNoU2l6ZSAvIDJcbiAgICAgIGNvbnN0IHJTcXIgPSByICogclxuICAgICAgY29uc3QgY2VudGVyT2Zmc2V0ID0gKGJydXNoU2l6ZSAlIDIgPT09IDApID8gMC41IDogMFxuXG4gICAgICBjb25zdCB0YXJnZXRXaWR0aCA9IHdyaXRlci50YXJnZXQud2lkdGhcbiAgICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0XG5cbiAgICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgICAgLy8gMi4gQ2FsY3VsYXRlIGJvdW5kcyBmb3IgdGhpcyBzcGVjaWZpYyBzdGFtcFxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogY2J4LFxuICAgICAgICAgIHk6IGNieSxcbiAgICAgICAgICB3OiBjYncsXG4gICAgICAgICAgaDogY2JoLFxuICAgICAgICB9ID0gZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyhweCwgcHksIGJydXNoU2l6ZSwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgY2lyY2xlUGVuY2lsQm91bmRzKVxuXG4gICAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKGNieCwgY2J5LCBjYncsIGNiaClcblxuICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1heChieCwgY2J4KVxuICAgICAgICBjb25zdCBzdGFydFkgPSBNYXRoLm1heChieSwgY2J5KVxuICAgICAgICBjb25zdCBlbmRYID0gTWF0aC5taW4oYnggKyBidywgY2J4ICsgY2J3KVxuICAgICAgICBjb25zdCBlbmRZID0gTWF0aC5taW4oYnkgKyBiaCwgY2J5ICsgY2JoKVxuXG4gICAgICAgIGNvbnN0IGZQeCA9IE1hdGguZmxvb3IocHgpXG4gICAgICAgIGNvbnN0IGZQeSA9IE1hdGguZmxvb3IocHkpXG5cbiAgICAgICAgZm9yIChsZXQgbXkgPSBzdGFydFk7IG15IDwgZW5kWTsgbXkrKykge1xuICAgICAgICAgIGNvbnN0IGR5ID0gKG15IC0gZlB5KSArIGNlbnRlck9mZnNldFxuICAgICAgICAgIGNvbnN0IGR5U3FyID0gZHkgKiBkeVxuICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuXG4gICAgICAgICAgZm9yIChsZXQgbXggPSBzdGFydFg7IG14IDwgZW5kWDsgbXgrKykge1xuICAgICAgICAgICAgY29uc3QgZHggPSAobXggLSBmUHgpICsgY2VudGVyT2Zmc2V0XG4gICAgICAgICAgICBjb25zdCBkU3FyID0gZHggKiBkeCArIGR5U3FyXG5cbiAgICAgICAgICAgIGlmIChkU3FyIDw9IHJTcXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcbiAgICAgICAgICAgICAgbWFza1ttYXNrSWR4XSA9IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuYmxlbmRGbiA9IGJsZW5kRm5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuYWxwaGEgPSBhbHBoYVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy54ID0gYnhcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueSA9IGJ5XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLncgPSBid1xuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy5oID0gYmhcblxuICAgICAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sod3JpdGVyLnRhcmdldCwgY29sb3IsIG1hc2ssIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function getRectBrushOrPencilBounds(centerX: number, centerY: number, brushWidth: number, brushHeight: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const startX = Math.floor(centerX - brushWidth / 2);\n const startY = Math.floor(centerY - brushHeight / 2);\n const endX = startX + brushWidth;\n const endY = startY + brushHeight;\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const cStartX = Math.max(0, startX);\n const cStartY = Math.max(0, startY);\n const cEndX = Math.min(targetWidth, endX);\n const cEndY = Math.min(targetHeight, endY);\n const w = cEndX - cStartX;\n const h = cEndY - cStartY;\n res.x = cStartX;\n res.y = cStartY;\n res.w = w < 0 ? 0 : w;\n res.h = h < 0 ? 0 : h;\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFdpZHRoOiBudW1iZXIsXG4gIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gIHRhcmdldFdpZHRoOiBudW1iZXIsXG4gIHRhcmdldEhlaWdodDogbnVtYmVyLFxuICBvdXQ/OiBSZWN0LFxuKTogUmVjdCB7XG4gIGNvbnN0IHN0YXJ0WCA9IE1hdGguZmxvb3IoY2VudGVyWCAtIGJydXNoV2lkdGggLyAyKVxuICBjb25zdCBzdGFydFkgPSBNYXRoLmZsb29yKGNlbnRlclkgLSBicnVzaEhlaWdodCAvIDIpXG4gIGNvbnN0IGVuZFggPSBzdGFydFggKyBicnVzaFdpZHRoXG4gIGNvbnN0IGVuZFkgPSBzdGFydFkgKyBicnVzaEhlaWdodFxuXG4gIGNvbnN0IHJlcyA9IG91dCA/PyB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IGNTdGFydFggPSBNYXRoLm1heCgwLCBzdGFydFgpXG4gIGNvbnN0IGNTdGFydFkgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IGNFbmRYID0gTWF0aC5taW4odGFyZ2V0V2lkdGgsIGVuZFgpXG4gIGNvbnN0IGNFbmRZID0gTWF0aC5taW4odGFyZ2V0SGVpZ2h0LCBlbmRZKVxuXG4gIGNvbnN0IHcgPSBjRW5kWCAtIGNTdGFydFhcbiAgY29uc3QgaCA9IGNFbmRZIC0gY1N0YXJ0WVxuXG4gIHJlcy54ID0gY1N0YXJ0WFxuICByZXMueSA9IGNTdGFydFlcbiAgcmVzLncgPSB3IDwgMCA/IDAgOiB3XG4gIHJlcy5oID0gaCA8IDAgPyAwIDogaFxuXG4gIHJldHVybiByZXNcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { getRectBrushOrPencilBounds } from '../Rect/getRectBrushOrPencilBounds';\nexport function applyRectBrushToPixelData(target: IPixelData, color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect, bounds?: Rect): void {\n const targetWidth = target.width;\n const targetHeight = target.height;\n const b = bounds ?? getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, targetWidth, targetHeight);\n if (b.w <= 0 || b.h <= 0) return;\n const data32 = target.data32;\n const baseColor = color & 0x00ffffff;\n const baseSrcAlpha = color >>> 24;\n const isOpaque = alpha === 255;\n const invHalfW = 1 / (brushWidth / 2);\n const invHalfH = 1 / (brushHeight / 2);\n\n // Restore the pixel-art centering logic\n const centerOffsetX = brushWidth % 2 === 0 ? 0.5 : 0;\n const centerOffsetY = brushHeight % 2 === 0 ? 0.5 : 0;\n const fCenterX = Math.floor(centerX);\n const fCenterY = Math.floor(centerY);\n const endX = b.x + b.w;\n const endY = b.y + b.h;\n const isOverwrite = (blendFn as any).isOverwrite;\n for (let py = b.y; py < endY; py++) {\n const rowOffset = py * targetWidth;\n const dy = Math.abs(py - fCenterY + centerOffsetY) * invHalfH;\n for (let px = b.x; px < endX; px++) {\n const idx = rowOffset + px;\n const dx = Math.abs(px - fCenterX + centerOffsetX) * invHalfW;\n const dist = dx > dy ? dx : dy;\n const strength = fallOff(dist);\n const maskVal = strength * 255 | 0;\n if (maskVal <= 0) continue;\n let weight = alpha;\n if (isOpaque) {\n weight = maskVal;\n } else if (maskVal !== 255) {\n weight = maskVal * alpha + 128 >> 8;\n }\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) continue;\n finalCol = (a << 24 | baseColor) >>> 0 as Color32;\n }\n data32[idx] = blendFn(finalCol, data32[idx] as Color32);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIElQaXhlbERhdGEsIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcbmltcG9ydCB7IGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzIH0gZnJvbSAnLi4vUmVjdC9nZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEoXG4gIHRhcmdldDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIGNlbnRlclg6IG51bWJlcixcbiAgY2VudGVyWTogbnVtYmVyLFxuICBicnVzaFdpZHRoOiBudW1iZXIsXG4gIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gIGFscGhhID0gMjU1LFxuICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBib3VuZHM/OiBSZWN0LFxuKTogdm9pZCB7XG4gIGNvbnN0IHRhcmdldFdpZHRoID0gdGFyZ2V0LndpZHRoXG4gIGNvbnN0IHRhcmdldEhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICBjb25zdCBiID0gYm91bmRzID8/IGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgIGNlbnRlclgsXG4gICAgY2VudGVyWSxcbiAgICBicnVzaFdpZHRoLFxuICAgIGJydXNoSGVpZ2h0LFxuICAgIHRhcmdldFdpZHRoLFxuICAgIHRhcmdldEhlaWdodCxcbiAgKVxuXG4gIGlmIChiLncgPD0gMCB8fCBiLmggPD0gMCkgcmV0dXJuXG5cbiAgY29uc3QgZGF0YTMyID0gdGFyZ2V0LmRhdGEzMlxuICBjb25zdCBiYXNlQ29sb3IgPSBjb2xvciAmIDB4MDBmZmZmZmZcbiAgY29uc3QgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gIGNvbnN0IGlzT3BhcXVlID0gYWxwaGEgPT09IDI1NVxuXG4gIGNvbnN0IGludkhhbGZXID0gMSAvIChicnVzaFdpZHRoIC8gMilcbiAgY29uc3QgaW52SGFsZkggPSAxIC8gKGJydXNoSGVpZ2h0IC8gMilcblxuICAvLyBSZXN0b3JlIHRoZSBwaXhlbC1hcnQgY2VudGVyaW5nIGxvZ2ljXG4gIGNvbnN0IGNlbnRlck9mZnNldFggPSAoYnJ1c2hXaWR0aCAlIDIgPT09IDApID8gMC41IDogMFxuICBjb25zdCBjZW50ZXJPZmZzZXRZID0gKGJydXNoSGVpZ2h0ICUgMiA9PT0gMCkgPyAwLjUgOiAwXG4gIGNvbnN0IGZDZW50ZXJYID0gTWF0aC5mbG9vcihjZW50ZXJYKVxuICBjb25zdCBmQ2VudGVyWSA9IE1hdGguZmxvb3IoY2VudGVyWSlcblxuICBjb25zdCBlbmRYID0gYi54ICsgYi53XG4gIGNvbnN0IGVuZFkgPSBiLnkgKyBiLmhcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlXG5cbiAgZm9yIChsZXQgcHkgPSBiLnk7IHB5IDwgZW5kWTsgcHkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IHB5ICogdGFyZ2V0V2lkdGhcbiAgICBjb25zdCBkeSA9IE1hdGguYWJzKChweSAtIGZDZW50ZXJZKSArIGNlbnRlck9mZnNldFkpICogaW52SGFsZkhcblxuICAgIGZvciAobGV0IHB4ID0gYi54OyBweCA8IGVuZFg7IHB4KyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IHJvd09mZnNldCArIHB4XG5cbiAgICAgIGNvbnN0IGR4ID0gTWF0aC5hYnMoKHB4IC0gZkNlbnRlclgpICsgY2VudGVyT2Zmc2V0WCkgKiBpbnZIYWxmV1xuICAgICAgY29uc3QgZGlzdCA9IGR4ID4gZHkgPyBkeCA6IGR5XG5cbiAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZihkaXN0KVxuICAgICAgY29uc3QgbWFza1ZhbCA9IChzdHJlbmd0aCAqIDI1NSkgfCAwXG5cbiAgICAgIGlmIChtYXNrVmFsIDw9IDApIGNvbnRpbnVlXG5cbiAgICAgIGxldCB3ZWlnaHQgPSBhbHBoYVxuXG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gbWFza1ZhbFxuICAgICAgfSBlbHNlIGlmIChtYXNrVmFsICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gKG1hc2tWYWwgKiBhbHBoYSArIDEyOCkgPj4gOFxuICAgICAgfVxuXG4gICAgICBsZXQgZmluYWxDb2wgPSBjb2xvclxuXG4gICAgICBpZiAod2VpZ2h0IDwgMjU1KSB7XG4gICAgICAgIGNvbnN0IGEgPSAoYmFzZVNyY0FscGhhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG5cbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSBjb250aW51ZVxuXG4gICAgICAgIGZpbmFsQ29sID0gKChhIDw8IDI0KSB8IGJhc2VDb2xvcikgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkYXRhMzJbaWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRhdGEzMltpZHhdIGFzIENvbG9yMzIpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { applyRectBrushToPixelData } from '../../PixelData/applyRectBrushToPixelData';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nconst defaults = {\n applyRectBrushToPixelData,\n getRectBrushOrPencilBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectBrush = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyRectBrushToPixelData = defaults.applyRectBrushToPixelData,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectBrush(color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn?: BlendColor32) {\n const bounds = getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyRectBrushToPixelData(writer.target, color, centerX, centerY, brushWidth, brushHeight, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RCcnVzaCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEgPSBkZWZhdWx0cy5hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhLFxuICAgIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5UmVjdEJydXNoKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICBjZW50ZXJYOiBudW1iZXIsXG4gICAgICBjZW50ZXJZOiBudW1iZXIsXG4gICAgICBicnVzaFdpZHRoOiBudW1iZXIsXG4gICAgICBicnVzaEhlaWdodDogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBmYWxsT2ZmOiAoZGlzdDogbnVtYmVyKSA9PiBudW1iZXIsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyhcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEoXG4gICAgICAgIHdyaXRlci50YXJnZXQsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaFdpZHRoLFxuICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGZhbGxPZmYsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function getRectBrushOrPencilStrokeBounds(x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, result: Rect): Rect {\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const minX = Math.min(x0, x1) - halfW;\n const minY = Math.min(y0, y1) - halfH;\n const maxX = Math.max(x0, x1) + halfW;\n const maxY = Math.max(y0, y1) + halfH;\n result.x = Math.floor(minX);\n result.y = Math.floor(minY);\n result.w = Math.ceil(maxX - minX);\n result.h = Math.ceil(maxY - minY);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoXG4gIHgwOiBudW1iZXIsXG4gIHkwOiBudW1iZXIsXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIGJydXNoV2lkdGg6IG51bWJlcixcbiAgYnJ1c2hIZWlnaHQ6IG51bWJlcixcbiAgcmVzdWx0OiBSZWN0LFxuKTogUmVjdCB7XG4gIGNvbnN0IGhhbGZXID0gYnJ1c2hXaWR0aCAvIDJcbiAgY29uc3QgaGFsZkggPSBicnVzaEhlaWdodCAvIDJcblxuICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDAsIHgxKSAtIGhhbGZXXG4gIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MCwgeTEpIC0gaGFsZkhcbiAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgwLCB4MSkgKyBoYWxmV1xuICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTAsIHkxKSArIGhhbGZIXG5cbiAgcmVzdWx0LnggPSBNYXRoLmZsb29yKG1pblgpXG4gIHJlc3VsdC55ID0gTWF0aC5mbG9vcihtaW5ZKVxuICByZXN1bHQudyA9IE1hdGguY2VpbChtYXhYIC0gbWluWClcbiAgcmVzdWx0LmggPSBNYXRoLmNlaWwobWF4WSAtIG1pblkpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type AlphaMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nimport { getRectBrushOrPencilStrokeBounds } from '../../Rect/getRectBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n blendColorPixelDataAlphaMask,\n getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectBrushStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds = defaults.getRectBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const rectBrushBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectBrushStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, alpha = 255, fallOff: (dist: number) => number, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getRectBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushWidth, brushHeight, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as AlphaMask;\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const invHalfW = 1 / halfW;\n const invHalfH = 1 / halfH;\n\n // Restore the pixel-art centering logic\n const centerOffsetX = brushWidth % 2 === 0 ? 0.5 : 0;\n const centerOffsetY = brushHeight % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: rbx,\n y: rby,\n w: rbw,\n h: rbh\n } = getRectBrushOrPencilBounds(px, py, brushWidth, brushHeight, targetWidth, targetHeight, rectBrushBounds);\n writer.accumulator.storeRegionBeforeState(rbx, rby, rbw, rbh);\n const startX = Math.max(bx, rbx);\n const startY = Math.max(by, rby);\n const endX = Math.min(bx + bw, rbx + rbw);\n const endY = Math.min(by + bh, rby + rbh);\n\n // Snapped origin for this specific point on the line\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = Math.abs(my - fPy + centerOffsetY) * invHalfH;\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = Math.abs(mx - fPx + centerOffsetX) * invHalfW;\n const maskIdx = maskRowOffset + (mx - bx);\n const dist = dx > dy ? dx : dy;\n const strength = fallOff!(dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n if (intensity > mask[maskIdx]) {\n mask[maskIdx] = intensity;\n }\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataAlphaMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBbHBoYU1hc2ssXG4gIHR5cGUgQmxlbmRDb2xvcjMyLFxuICB0eXBlIENvbG9yMzIsXG4gIHR5cGUgQ29sb3JCbGVuZE9wdGlvbnMsXG4gIHR5cGUgSGlzdG9yeU11dGF0b3IsXG4gIHR5cGUgUmVjdCxcbn0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZm9yRWFjaExpbmVQb2ludCB9IGZyb20gJy4uLy4uL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50J1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi8uLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayxcbiAgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZvckVhY2hMaW5lUG9pbnQgPSBkZWZhdWx0cy5mb3JFYWNoTGluZVBvaW50LFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICAgIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gICAgZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMgPSBkZWZhdWx0cy5nZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyxcbiAgfSA9IGRlcHNcblxuICBjb25zdCBzdHJva2VCb3VuZHNPdXQ6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMCxcbiAgfVxuXG4gIGNvbnN0IHJlY3RCcnVzaEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE9wdGlvbnMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseVJlY3RCcnVzaFN0cm9rZShcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgeDA6IG51bWJlcixcbiAgICAgIHkwOiBudW1iZXIsXG4gICAgICB4MTogbnVtYmVyLFxuICAgICAgeTE6IG51bWJlcixcbiAgICAgIGJydXNoV2lkdGg6IG51bWJlcixcbiAgICAgIGJydXNoSGVpZ2h0OiBudW1iZXIsXG4gICAgICBhbHBoYSA9IDI1NSxcbiAgICAgIGZhbGxPZmY6IChkaXN0OiBudW1iZXIpID0+IG51bWJlcixcbiAgICAgIGJsZW5kRm46IEJsZW5kQ29sb3IzMiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgICkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB4OiBieCxcbiAgICAgICAgeTogYnksXG4gICAgICAgIHc6IGJ3LFxuICAgICAgICBoOiBiaCxcbiAgICAgIH0gPSBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyhcbiAgICAgICAgeDAsXG4gICAgICAgIHkwLFxuICAgICAgICB4MSxcbiAgICAgICAgeTEsXG4gICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgIGJydXNoSGVpZ2h0LFxuICAgICAgICBzdHJva2VCb3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGlmIChidyA8PSAwIHx8IGJoIDw9IDApIHJldHVyblxuXG4gICAgICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoYncgKiBiaCkgYXMgQWxwaGFNYXNrXG5cbiAgICAgIGNvbnN0IGhhbGZXID0gYnJ1c2hXaWR0aCAvIDJcbiAgICAgIGNvbnN0IGhhbGZIID0gYnJ1c2hIZWlnaHQgLyAyXG4gICAgICBjb25zdCBpbnZIYWxmVyA9IDEgLyBoYWxmV1xuICAgICAgY29uc3QgaW52SGFsZkggPSAxIC8gaGFsZkhcblxuICAgICAgLy8gUmVzdG9yZSB0aGUgcGl4ZWwtYXJ0IGNlbnRlcmluZyBsb2dpY1xuICAgICAgY29uc3QgY2VudGVyT2Zmc2V0WCA9IChicnVzaFdpZHRoICUgMiA9PT0gMCkgPyAwLjUgOiAwXG4gICAgICBjb25zdCBjZW50ZXJPZmZzZXRZID0gKGJydXNoSGVpZ2h0ICUgMiA9PT0gMCkgPyAwLjUgOiAwXG5cbiAgICAgIGNvbnN0IHRhcmdldFdpZHRoID0gd3JpdGVyLnRhcmdldC53aWR0aFxuICAgICAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gd3JpdGVyLnRhcmdldC5oZWlnaHRcblxuICAgICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogcmJ4LFxuICAgICAgICAgIHk6IHJieSxcbiAgICAgICAgICB3OiByYncsXG4gICAgICAgICAgaDogcmJoLFxuICAgICAgICB9ID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgICAgcHgsXG4gICAgICAgICAgcHksXG4gICAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgcmVjdEJydXNoQm91bmRzLFxuICAgICAgICApXG5cbiAgICAgICAgd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoXG4gICAgICAgICAgcmJ4LFxuICAgICAgICAgIHJieSxcbiAgICAgICAgICByYncsXG4gICAgICAgICAgcmJoLFxuICAgICAgICApXG5cbiAgICAgICAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoYngsIHJieClcbiAgICAgICAgY29uc3Qgc3RhcnRZID0gTWF0aC5tYXgoYnksIHJieSlcbiAgICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWluKGJ4ICsgYncsIHJieCArIHJidylcbiAgICAgICAgY29uc3QgZW5kWSA9IE1hdGgubWluKGJ5ICsgYmgsIHJieSArIHJiaClcblxuICAgICAgICAvLyBTbmFwcGVkIG9yaWdpbiBmb3IgdGhpcyBzcGVjaWZpYyBwb2ludCBvbiB0aGUgbGluZVxuICAgICAgICBjb25zdCBmUHggPSBNYXRoLmZsb29yKHB4KVxuICAgICAgICBjb25zdCBmUHkgPSBNYXRoLmZsb29yKHB5KVxuXG4gICAgICAgIGZvciAobGV0IG15ID0gc3RhcnRZOyBteSA8IGVuZFk7IG15KyspIHtcbiAgICAgICAgICBjb25zdCBkeSA9IE1hdGguYWJzKChteSAtIGZQeSkgKyBjZW50ZXJPZmZzZXRZKSAqIGludkhhbGZIXG4gICAgICAgICAgY29uc3QgbWFza1Jvd09mZnNldCA9IChteSAtIGJ5KSAqIGJ3XG5cbiAgICAgICAgICBmb3IgKGxldCBteCA9IHN0YXJ0WDsgbXggPCBlbmRYOyBteCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkeCA9IE1hdGguYWJzKChteCAtIGZQeCkgKyBjZW50ZXJPZmZzZXRYKSAqIGludkhhbGZXXG4gICAgICAgICAgICBjb25zdCBtYXNrSWR4ID0gbWFza1Jvd09mZnNldCArIChteCAtIGJ4KVxuXG4gICAgICAgICAgICBjb25zdCBkaXN0ID0gZHggPiBkeSA/IGR4IDogZHlcbiAgICAgICAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZiEoZGlzdClcblxuICAgICAgICAgICAgaWYgKHN0cmVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSAoc3RyZW5ndGggKiAyNTUpIHwgMFxuXG4gICAgICAgICAgICAgIGlmIChpbnRlbnNpdHkgPiBtYXNrW21hc2tJZHhdKSB7XG4gICAgICAgICAgICAgICAgbWFza1ttYXNrSWR4XSA9IGludGVuc2l0eVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmJsZW5kRm4gPSBibGVuZEZuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmFscGhhID0gYWxwaGFcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueCA9IGJ4XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnkgPSBieVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy53ID0gYndcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuaCA9IGJoXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2soXG4gICAgICAgIHdyaXRlci50YXJnZXQsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBtYXNrLFxuICAgICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { HistoryMutator } from '../../_types';\nimport { applyRectBrushToPixelData } from '../../PixelData/applyRectBrushToPixelData';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nconst defaults = {\n applyRectBrushToPixelData,\n getRectBrushOrPencilBounds,\n fallOff: () => 1\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectPencil = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyRectBrushToPixelData = defaults.applyRectBrushToPixelData,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n fallOff = defaults.fallOff\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectPencil(color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, blendFn?: BlendColor32) {\n const bounds = getRectBrushOrPencilBounds(centerX, centerY, brushWidth, brushHeight, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyRectBrushToPixelData(writer.target, color, centerX, centerY, brushWidth, brushHeight, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhJ1xuaW1wb3J0IHsgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzJ1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5UmVjdEJydXNoVG9QaXhlbERhdGEsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICBmYWxsT2ZmOiAoKSA9PiAxLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseVJlY3RQZW5jaWwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlSZWN0QnJ1c2hUb1BpeGVsRGF0YSxcbiAgICBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyA9IGRlZmF1bHRzLmdldFJlY3RCcnVzaE9yUGVuY2lsQm91bmRzLFxuICAgIGZhbGxPZmYgPSBkZWZhdWx0cy5mYWxsT2ZmXG4gIH0gPSBkZXBzXG5cbiAgY29uc3QgYm91bmRzT3V0OiBSZWN0ID0geyB4OiAwLCB5OiAwLCB3OiAwLCBoOiAwIH1cblxuICByZXR1cm4ge1xuICAgIGFwcGx5UmVjdFBlbmNpbChcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgY2VudGVyWDogbnVtYmVyLFxuICAgICAgY2VudGVyWTogbnVtYmVyLFxuICAgICAgYnJ1c2hXaWR0aDogbnVtYmVyLFxuICAgICAgYnJ1c2hIZWlnaHQ6IG51bWJlcixcbiAgICAgIGFscGhhID0gMjU1LFxuICAgICAgYmxlbmRGbj86IEJsZW5kQ29sb3IzMixcbiAgICApIHtcblxuICAgICAgY29uc3QgYm91bmRzID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoV2lkdGgsXG4gICAgICAgIGJydXNoSGVpZ2h0LFxuICAgICAgICB3cml0ZXIudGFyZ2V0LndpZHRoLFxuICAgICAgICB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgICAgYm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHgsIHksIHcsIGggfSA9IGJvdW5kc1xuXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuXG4gICAgICBhcHBseVJlY3RCcnVzaFRvUGl4ZWxEYXRhKFxuICAgICAgICB3cml0ZXIudGFyZ2V0LFxuICAgICAgICBjb2xvcixcbiAgICAgICAgY2VudGVyWCxcbiAgICAgICAgY2VudGVyWSxcbiAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgYnJ1c2hIZWlnaHQsXG4gICAgICAgIGFscGhhLFxuICAgICAgICBmYWxsT2ZmLFxuICAgICAgICBibGVuZEZuLFxuICAgICAgICBib3VuZHMsXG4gICAgICApXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type BinaryMask, type HistoryMutator } from '../../_types';\nimport { forEachLinePoint } from '../../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { getRectBrushOrPencilBounds } from '../../Rect/getRectBrushOrPencilBounds';\nimport { getRectBrushOrPencilStrokeBounds } from '../../Rect/getRectBrushOrPencilStrokeBounds';\nconst defaults = {\n forEachLinePoint,\n getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds,\n blendColorPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyRectPencilStroke = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n forEachLinePoint = defaults.forEachLinePoint,\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n getRectBrushOrPencilBounds = defaults.getRectBrushOrPencilBounds,\n getRectBrushOrPencilStrokeBounds = defaults.getRectBrushOrPencilStrokeBounds\n } = deps;\n const strokeBoundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const rectPencilBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const blendColorPixelOptions: ColorBlendOptions = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyRectPencilStroke(color: Color32, x0: number, y0: number, x1: number, y1: number, brushWidth: number, brushHeight: number, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect) {\n const {\n x: bx,\n y: by,\n w: bw,\n h: bh\n } = getRectBrushOrPencilStrokeBounds(x0, y0, x1, y1, brushWidth, brushHeight, strokeBoundsOut);\n if (bw <= 0 || bh <= 0) return;\n const mask = new Uint8Array(bw * bh) as BinaryMask;\n const halfW = brushWidth / 2;\n const halfH = brushHeight / 2;\n const centerOffset = brushWidth % 2 === 0 ? 0.5 : 0;\n const targetWidth = writer.target.width;\n const targetHeight = writer.target.height;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const {\n x: rbx,\n y: rby,\n w: rbw,\n h: rbh\n } = getRectBrushOrPencilBounds(px, py, brushWidth, brushHeight, targetWidth, targetHeight, rectPencilBounds);\n writer.accumulator.storeRegionBeforeState(rbx, rby, rbw, rbh);\n const startX = Math.max(bx, rbx);\n const startY = Math.max(by, rby);\n const endX = Math.min(bx + bw, rbx + rbw);\n const endY = Math.min(by + bh, rby + rbh);\n const fPx = Math.floor(px);\n const fPy = Math.floor(py);\n for (let my = startY; my < endY; my++) {\n const dy = Math.abs(my - fPy + centerOffset);\n const maskRowOffset = (my - by) * bw;\n for (let mx = startX; mx < endX; mx++) {\n const dx = Math.abs(mx - fPx + centerOffset);\n const maskIdx = maskRowOffset + (mx - bx);\n if (dx <= halfW && dy <= halfH) {\n mask[maskIdx] = 1;\n }\n }\n }\n });\n blendColorPixelOptions.blendFn = blendFn;\n blendColorPixelOptions.alpha = alpha;\n blendColorPixelOptions.x = bx;\n blendColorPixelOptions.y = by;\n blendColorPixelOptions.w = bw;\n blendColorPixelOptions.h = bh;\n blendColorPixelDataBinaryMask(writer.target, color, mask, blendColorPixelOptions);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBCaW5hcnlNYXNrLFxuICB0eXBlIEJsZW5kQ29sb3IzMixcbiAgdHlwZSBDb2xvcjMyLFxuICB0eXBlIENvbG9yQmxlbmRPcHRpb25zLFxuICB0eXBlIEhpc3RvcnlNdXRhdG9yLFxuICB0eXBlIFJlY3QsXG59IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZvckVhY2hMaW5lUG9pbnQgfSBmcm9tICcuLi8uLi9BbGdvcml0aG0vZm9yRWFjaExpbmVQb2ludCdcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyB9IGZyb20gJy4uLy4uL1JlY3QvZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZm9yRWFjaExpbmVQb2ludCxcbiAgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMsXG4gIGdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayxcbn1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5UmVjdFBlbmNpbFN0cm9rZSA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZvckVhY2hMaW5lUG9pbnQgPSBkZWZhdWx0cy5mb3JFYWNoTGluZVBvaW50LFxuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gICAgZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMgPSBkZWZhdWx0cy5nZXRSZWN0QnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgICBnZXRSZWN0QnJ1c2hPclBlbmNpbFN0cm9rZUJvdW5kcyA9IGRlZmF1bHRzLmdldFJlY3RCcnVzaE9yUGVuY2lsU3Ryb2tlQm91bmRzLFxuICB9ID0gZGVwc1xuXG4gIGNvbnN0IHN0cm9rZUJvdW5kc091dDogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgcmVjdFBlbmNpbEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgY29uc3QgYmxlbmRDb2xvclBpeGVsT3B0aW9uczogQ29sb3JCbGVuZE9wdGlvbnMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBseVJlY3RQZW5jaWxTdHJva2UoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIHgwOiBudW1iZXIsXG4gICAgICB5MDogbnVtYmVyLFxuICAgICAgeDE6IG51bWJlcixcbiAgICAgIHkxOiBudW1iZXIsXG4gICAgICBicnVzaFdpZHRoOiBudW1iZXIsXG4gICAgICBicnVzaEhlaWdodDogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBibGVuZEZuOiBCbGVuZENvbG9yMzIgPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogYngsXG4gICAgICAgIHk6IGJ5LFxuICAgICAgICB3OiBidyxcbiAgICAgICAgaDogYmgsXG4gICAgICB9ID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxTdHJva2VCb3VuZHMoXG4gICAgICAgIHgwLFxuICAgICAgICB5MCxcbiAgICAgICAgeDEsXG4gICAgICAgIHkxLFxuICAgICAgICBicnVzaFdpZHRoLFxuICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgc3Ryb2tlQm91bmRzT3V0LFxuICAgICAgKVxuXG4gICAgICBpZiAoYncgPD0gMCB8fCBiaCA8PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGJ3ICogYmgpIGFzIEJpbmFyeU1hc2tcblxuICAgICAgY29uc3QgaGFsZlcgPSBicnVzaFdpZHRoIC8gMlxuICAgICAgY29uc3QgaGFsZkggPSBicnVzaEhlaWdodCAvIDJcbiAgICAgIGNvbnN0IGNlbnRlck9mZnNldCA9IChicnVzaFdpZHRoICUgMiA9PT0gMCkgPyAwLjUgOiAwXG5cbiAgICAgIGNvbnN0IHRhcmdldFdpZHRoID0gd3JpdGVyLnRhcmdldC53aWR0aFxuICAgICAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gd3JpdGVyLnRhcmdldC5oZWlnaHRcblxuICAgICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogcmJ4LFxuICAgICAgICAgIHk6IHJieSxcbiAgICAgICAgICB3OiByYncsXG4gICAgICAgICAgaDogcmJoLFxuICAgICAgICB9ID0gZ2V0UmVjdEJydXNoT3JQZW5jaWxCb3VuZHMoXG4gICAgICAgICAgcHgsXG4gICAgICAgICAgcHksXG4gICAgICAgICAgYnJ1c2hXaWR0aCxcbiAgICAgICAgICBicnVzaEhlaWdodCxcbiAgICAgICAgICB0YXJnZXRXaWR0aCxcbiAgICAgICAgICB0YXJnZXRIZWlnaHQsXG4gICAgICAgICAgcmVjdFBlbmNpbEJvdW5kcyxcbiAgICAgICAgKVxuXG4gICAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKFxuICAgICAgICAgIHJieCxcbiAgICAgICAgICByYnksXG4gICAgICAgICAgcmJ3LFxuICAgICAgICAgIHJiaCxcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWF4KGJ4LCByYngpXG4gICAgICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KGJ5LCByYnkpXG4gICAgICAgIGNvbnN0IGVuZFggPSBNYXRoLm1pbihieCArIGJ3LCByYnggKyByYncpXG4gICAgICAgIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihieSArIGJoLCByYnkgKyByYmgpXG5cbiAgICAgICAgY29uc3QgZlB4ID0gTWF0aC5mbG9vcihweClcbiAgICAgICAgY29uc3QgZlB5ID0gTWF0aC5mbG9vcihweSlcblxuICAgICAgICBmb3IgKGxldCBteSA9IHN0YXJ0WTsgbXkgPCBlbmRZOyBteSsrKSB7XG4gICAgICAgICAgY29uc3QgZHkgPSBNYXRoLmFicygobXkgLSBmUHkpICsgY2VudGVyT2Zmc2V0KVxuICAgICAgICAgIGNvbnN0IG1hc2tSb3dPZmZzZXQgPSAobXkgLSBieSkgKiBid1xuXG4gICAgICAgICAgZm9yIChsZXQgbXggPSBzdGFydFg7IG14IDwgZW5kWDsgbXgrKykge1xuICAgICAgICAgICAgY29uc3QgZHggPSBNYXRoLmFicygobXggLSBmUHgpICsgY2VudGVyT2Zmc2V0KVxuICAgICAgICAgICAgY29uc3QgbWFza0lkeCA9IG1hc2tSb3dPZmZzZXQgKyAobXggLSBieClcblxuICAgICAgICAgICAgaWYgKGR4IDw9IGhhbGZXICYmIGR5IDw9IGhhbGZIKSB7XG4gICAgICAgICAgICAgIG1hc2tbbWFza0lkeF0gPSAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmJsZW5kRm4gPSBibGVuZEZuXG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLmFscGhhID0gYWxwaGFcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMueCA9IGJ4XG4gICAgICBibGVuZENvbG9yUGl4ZWxPcHRpb25zLnkgPSBieVxuICAgICAgYmxlbmRDb2xvclBpeGVsT3B0aW9ucy53ID0gYndcbiAgICAgIGJsZW5kQ29sb3JQaXhlbE9wdGlvbnMuaCA9IGJoXG5cbiAgICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci50YXJnZXQsIGNvbG9yLCBtYXNrLCBibGVuZENvbG9yUGl4ZWxPcHRpb25zKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendColorPixelData(dst: IPixelData, color: Color32, opts: ColorBlendOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect\n } = opts;\n if (globalAlpha === 0) return;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return;\n\n // Clipping\n let x = targetX,\n y = targetY,\n w = width,\n h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // Single-color fills can pre-calculate the source color once\n let finalSrcColor = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return;\n finalSrcColor = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dst32 = dst.data32;\n const dw = dst.width;\n let dIdx = y * dw + x | 0;\n const dStride = dw - actualW | 0;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = blendFn(finalSrcColor, dst32[dIdx] as Color32);\n dIdx++;\n }\n dIdx += dStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIENvbG9yQmxlbmRPcHRpb25zLCB0eXBlIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kQ29sb3JQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgY29sb3I6IENvbG9yMzIsXG4gIG9wdHM6IENvbG9yQmxlbmRPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gZHN0LndpZHRoLFxuICAgIGg6IGhlaWdodCA9IGRzdC5oZWlnaHQsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgfSA9IG9wdHNcblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVyblxuICBjb25zdCBiYXNlU3JjQWxwaGEgPSAoY29sb3IgPj4+IDI0KVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2VcbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVyblxuXG4gIC8vIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WCwgeSA9IHRhcmdldFksIHcgPSB3aWR0aCwgaCA9IGhlaWdodFxuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIFNpbmdsZS1jb2xvciBmaWxscyBjYW4gcHJlLWNhbGN1bGF0ZSB0aGUgc291cmNlIGNvbG9yIG9uY2VcbiAgbGV0IGZpbmFsU3JjQ29sb3IgPSBjb2xvclxuICBpZiAoZ2xvYmFsQWxwaGEgPCAyNTUpIHtcbiAgICBjb25zdCBhID0gKGJhc2VTcmNBbHBoYSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm5cbiAgICBmaW5hbFNyY0NvbG9yID0gKChjb2xvciAmIDB4MDBmZmZmZmYpIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gIH1cblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGhcbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxTcmNDb2xvciwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcbiAgICAgIGRJZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData';\nconst defaults = {\n blendColorPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorBlendColor = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n blendColorPixelData = defaults.blendColorPixelData\n } = deps;\n return {\n blendColor(color: Color32, opts: ColorBlendOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n blendColorPixelData(writer.target, color, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBDb2xvckJsZW5kT3B0aW9ucywgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHsgYmxlbmRDb2xvclBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRDb2xvciA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kQ29sb3JQaXhlbERhdGEgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYmxlbmRDb2xvcihcbiAgICAgIGNvbG9yOiBDb2xvcjMyLFxuICAgICAgb3B0czogQ29sb3JCbGVuZE9wdGlvbnMgPSB7fSxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gd3JpdGVyLnRhcmdldC53aWR0aCxcbiAgICAgICAgaCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgfSA9IG9wdHNcbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBibGVuZENvbG9yUGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIGNvbG9yLCBvcHRzKVxuICAgIH0sXG4gIH1cbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../../_types';\nimport { overwriteFast } from '../../BlendModes/blend-modes-fast';\nexport function mutatorBlendPixel(writer: PixelWriter<any>) {\n return {\n blendPixel(x: number, y: number, color: Color32, alpha: number = 255, blendFn: BlendColor32 = overwriteFast) {\n let target = writer.target;\n let width = target.width;\n let height = target.height;\n if (x < 0 || x >= width || y < 0 || y >= height) return;\n writer.accumulator.storeTileBeforeState(x, y);\n let index = y * width + x;\n let bg = target.data32[index] as Color32;\n let finalColor = color;\n if (alpha < 255) {\n let baseSrcAlpha = color >>> 24;\n let finalAlpha = baseSrcAlpha * alpha + 128 >> 8;\n finalColor = (color & 0x00ffffff | finalAlpha << 24) >>> 0 as Color32;\n }\n target.data32[index] = blendFn(finalColor, bg);\n }\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBvdmVyd3JpdGVGYXN0IH0gZnJvbSAnLi4vLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1mYXN0J1xuaW1wb3J0IHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuLi9QaXhlbFdyaXRlcidcblxuZXhwb3J0IGZ1bmN0aW9uIG11dGF0b3JCbGVuZFBpeGVsKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55Pikge1xuICByZXR1cm4ge1xuICAgIGJsZW5kUGl4ZWwoXG4gICAgICB4OiBudW1iZXIsXG4gICAgICB5OiBudW1iZXIsXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGFscGhhOiBudW1iZXIgPSAyNTUsXG4gICAgICBibGVuZEZuOiBCbGVuZENvbG9yMzIgPSBvdmVyd3JpdGVGYXN0LFxuICAgICkge1xuICAgICAgbGV0IHRhcmdldCA9IHdyaXRlci50YXJnZXRcbiAgICAgIGxldCB3aWR0aCA9IHRhcmdldC53aWR0aFxuICAgICAgbGV0IGhlaWdodCA9IHRhcmdldC5oZWlnaHRcblxuICAgICAgaWYgKHggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA8IDAgfHwgeSA+PSBoZWlnaHQpIHJldHVyblxuXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVUaWxlQmVmb3JlU3RhdGUoeCwgeSlcblxuICAgICAgbGV0IGluZGV4ID0geSAqIHdpZHRoICsgeFxuICAgICAgbGV0IGJnID0gdGFyZ2V0LmRhdGEzMltpbmRleF0gYXMgQ29sb3IzMlxuXG4gICAgICBsZXQgZmluYWxDb2xvciA9IGNvbG9yXG5cbiAgICAgIGlmIChhbHBoYSA8IDI1NSkge1xuICAgICAgICBsZXQgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0XG4gICAgICAgIGxldCBmaW5hbEFscGhhID0gKGJhc2VTcmNBbHBoYSAqIGFscGhhICsgMTI4KSA+PiA4XG5cbiAgICAgICAgZmluYWxDb2xvciA9ICgoKGNvbG9yICYgMHgwMGZmZmZmZikgfCAoZmluYWxBbHBoYSA8PCAyNCkpID4+PiAwKSBhcyBDb2xvcjMyXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5kYXRhMzJbaW5kZXhdID0gYmxlbmRGbihmaW5hbENvbG9yLCBiZylcbiAgICB9LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blits source PixelData into a destination PixelData using 32-bit integer bitwise blending.\n * This function bypasses standard ImageData limitations by operating directly on\n * Uint32Array views. It supports various blend modes, binary/alpha masking, and\n * automatic clipping of both source and destination bounds.\n * @example\n *\n * const dst = new PixelData(ctx.getImageData(0,0,100,100))\n * blendImageData32(dst, sprite, {\n * blendFn: COLOR_32_BLEND_MODES.multiply,\n * mask: brushMask,\n * maskType: MaskType.ALPHA\n * });\n */\nexport function blendPixelData(dst: IPixelData, src: IPixelData, opts: PixelBlendOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n const dst32 = dst.data32;\n const src32 = src.data32;\n const dw = dst.width;\n const sw = src.width;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb2xvcjMyLCB0eXBlIElQaXhlbERhdGEsIHR5cGUgUGl4ZWxCbGVuZE9wdGlvbnMgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuLyoqXG4gKiBCbGl0cyBzb3VyY2UgUGl4ZWxEYXRhIGludG8gYSBkZXN0aW5hdGlvbiBQaXhlbERhdGEgdXNpbmcgMzItYml0IGludGVnZXIgYml0d2lzZSBibGVuZGluZy5cbiAqIFRoaXMgZnVuY3Rpb24gYnlwYXNzZXMgc3RhbmRhcmQgSW1hZ2VEYXRhIGxpbWl0YXRpb25zIGJ5IG9wZXJhdGluZyBkaXJlY3RseSBvblxuICogVWludDMyQXJyYXkgdmlld3MuIEl0IHN1cHBvcnRzIHZhcmlvdXMgYmxlbmQgbW9kZXMsIGJpbmFyeS9hbHBoYSBtYXNraW5nLCBhbmRcbiAqIGF1dG9tYXRpYyBjbGlwcGluZyBvZiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYm91bmRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkc3QgPSBuZXcgUGl4ZWxEYXRhKGN0eC5nZXRJbWFnZURhdGEoMCwwLDEwMCwxMDApKVxuICogYmxlbmRJbWFnZURhdGEzMihkc3QsIHNwcml0ZSwge1xuICogICBibGVuZEZuOiBDT0xPUl8zMl9CTEVORF9NT0RFUy5tdWx0aXBseSxcbiAqICAgbWFzazogYnJ1c2hNYXNrLFxuICogICBtYXNrVHlwZTogTWFza1R5cGUuQUxQSEFcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgc3JjOiBJUGl4ZWxEYXRhLFxuICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgc3g6IHNvdXJjZVggPSAwLFxuICAgIHN5OiBzb3VyY2VZID0gMCxcbiAgICB3OiB3aWR0aCA9IHNyYy53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBzcmMuaGVpZ2h0LFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm5cblxuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCBzeCA9IHNvdXJjZVhcbiAgbGV0IHN5ID0gc291cmNlWVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3hcbiAgICB3ICs9IHN4XG4gICAgc3ggPSAwXG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3lcbiAgICBoICs9IHN5XG4gICAgc3kgPSAwXG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyYy53aWR0aCAtIHN4KVxuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KVxuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG5cbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGxldCBzSWR4ID0gKHN5ICogc3cgKyBzeCkgfCAwXG5cbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBzU3RyaWRlID0gKHN3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IGlzT3BhcXVlID0gZ2xvYmFsQWxwaGEgPT09IDI1NVxuICBjb25zdCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGVcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IChzcmNDb2wgPj4+IDI0KVxuXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sXG4gICAgICBpZiAoIWlzT3BhcXVlKSB7XG4gICAgICAgIGNvbnN0IGEgPSAoc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCkgPj4gOFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4KytcbiAgICAgICAgICBzSWR4KytcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKChzcmNDb2wgJiAweDAwZmZmZmZmKSB8IChhIDw8IDI0KSkgPj4+IDAgYXMgQ29sb3IzMlxuICAgICAgfVxuXG4gICAgICBkc3QzMltkSWR4XSA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpXG4gICAgICBkSWR4KytcbiAgICAgIHNJZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBzSWR4ICs9IHNTdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { blendPixelData } from '../../PixelData/blendPixelData';\nconst defaults = {\n blendPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorBlendPixelData = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelData = defaults.blendPixelData\n } = deps;\n return {\n blendPixelData(src: IPixelData, opts: PixelBlendOptions) {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n blendPixelData(writer.target, src, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgSVBpeGVsRGF0YSwgUGl4ZWxCbGVuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi9fdHlwZXMnXG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBibGVuZFBpeGVsRGF0YSB9XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRQaXhlbERhdGEgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZFBpeGVsRGF0YSA9IGRlZmF1bHRzLmJsZW5kUGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgYmxlbmRQaXhlbERhdGEoXG4gICAgICBzcmM6IElQaXhlbERhdGEsXG4gICAgICBvcHRzOiBQaXhlbEJsZW5kT3B0aW9ucyxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gc3JjLndpZHRoLFxuICAgICAgICBoID0gc3JjLmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuXG4gICAgICBibGVuZFBpeGVsRGF0YSh3cml0ZXIudGFyZ2V0LCBzcmMsIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cblxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link PixelData} buffer with a solid color.\n *\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param rect - A {@link Rect} defining the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelData(dst: IPixelData, color: Color32, rect?: Partial<Rect>): void;\n/**\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param x - Starting horizontal coordinate.\n * @param y - Starting vertical coordinate.\n * @param w - Width of the fill area.\n * @param h - Height of the fill area.\n */\nexport function fillPixelData(dst: IPixelData, color: Color32, x: number, y: number, w: number, h: number): void;\nexport function fillPixelData(dst: IPixelData, color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): void {\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n if (typeof _x === 'object') {\n x = _x.x ?? 0;\n y = _x.y ?? 0;\n w = _x.w ?? dst.width;\n h = _x.h ?? dst.height;\n } else if (typeof _x === 'number') {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n } else {\n x = 0;\n y = 0;\n w = dst.width;\n h = dst.height;\n }\n const clip = resolveRectClipping(x, y, w, h, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n\n // Use the clipped values\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.height && finalX === 0 && finalY === 0) {\n dst32.fill(color);\n return;\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (finalY + iy) * dw + finalX;\n const end = start + actualW;\n dst32.fill(color, start, end);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRSZWN0LCByZXNvbHZlUmVjdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuaW1wb3J0IHR5cGUgeyBQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsRGF0YSdcblxuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KClcblxuLyoqXG4gKiBGaWxscyBhIHJlZ2lvbiBvciB0aGUge0BsaW5rIFBpeGVsRGF0YX0gYnVmZmVyIHdpdGggYSBzb2xpZCBjb2xvci5cbiAqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB7QGxpbmsgUGl4ZWxEYXRhfSB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUge0BsaW5rIENvbG9yMzJ9IHZhbHVlIHRvIGFwcGx5LlxuICogQHBhcmFtIHJlY3QgLSBBIHtAbGluayBSZWN0fSBkZWZpbmluZyB0aGUgYXJlYSB0byBmaWxsLiBJZiBvbWl0dGVkLCB0aGUgZW50aXJlXG4gKiBidWZmZXIgaXMgZmlsbGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBjb2xvcjogQ29sb3IzMixcbiAgcmVjdD86IFBhcnRpYWw8UmVjdD4sXG4pOiB2b2lkXG4vKipcbiAqIEBwYXJhbSBkc3QgLSBUaGUgdGFyZ2V0IHtAbGluayBQaXhlbERhdGF9IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSB7QGxpbmsgQ29sb3IzMn0gdmFsdWUgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhKFxuICBkc3Q6IElQaXhlbERhdGEsXG4gIGNvbG9yOiBDb2xvcjMyLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBjb2xvcjogQ29sb3IzMixcbiAgX3g/OiBQYXJ0aWFsPFJlY3Q+IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogdm9pZCB7XG4gIGxldCB4OiBudW1iZXJcbiAgbGV0IHk6IG51bWJlclxuICBsZXQgdzogbnVtYmVyXG4gIGxldCBoOiBudW1iZXJcblxuICBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgIHggPSBfeC54ID8/IDBcbiAgICB5ID0gX3gueSA/PyAwXG4gICAgdyA9IF94LncgPz8gZHN0LndpZHRoXG4gICAgaCA9IF94LmggPz8gZHN0LmhlaWdodFxuICB9IGVsc2UgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3hcbiAgICB5ID0gX3khXG4gICAgdyA9IF93IVxuICAgIGggPSBfaCFcbiAgfSBlbHNlIHtcbiAgICB4ID0gMFxuICAgIHkgPSAwXG4gICAgdyA9IGRzdC53aWR0aFxuICAgIGggPSBkc3QuaGVpZ2h0XG4gIH1cblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh4LCB5LCB3LCBoLCBkc3Qud2lkdGgsIGRzdC5oZWlnaHQsIFNDUkFUQ0hfUkVDVClcblxuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVyblxuXG4gIC8vIFVzZSB0aGUgY2xpcHBlZCB2YWx1ZXNcbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuXG4gIC8vIE9wdGltaXphdGlvbjogSWYgZmlsbGluZyB0aGUgZW50aXJlIGJ1ZmZlciwgdXNlIHRoZSBuYXRpdmUgLmZpbGwoKVxuICBpZiAoYWN0dWFsVyA9PT0gZHcgJiYgYWN0dWFsSCA9PT0gZHN0LmhlaWdodCAmJiBmaW5hbFggPT09IDAgJiYgZmluYWxZID09PSAwKSB7XG4gICAgZHN0MzIuZmlsbChjb2xvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIFJvdy1ieS1yb3cgZmlsbCBmb3IgcGFydGlhbCByZWN0YW5nbGVzXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3Qgc3RhcnQgPSAoZmluYWxZICsgaXkpICogZHcgKyBmaW5hbFhcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGFjdHVhbFdcbiAgICBkc3QzMi5maWxsKGNvbG9yLCBzdGFydCwgZW5kKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32, HistoryMutator } from '../../_types';\nimport { fillPixelData } from '../../PixelData/fillPixelData';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorClear = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n clear(rect: Partial<Rect> = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = rect;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(writer.target, 0 as Color32, x, y, w, h);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciwgUmVjdCB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvZmlsbFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBmaWxsUGl4ZWxEYXRhIH1cblxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5leHBvcnQgY29uc3QgbXV0YXRvckNsZWFyID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YSA9IGRlZmF1bHRzLmZpbGxQaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhcihcbiAgICAgIHJlY3Q6IFBhcnRpYWw8UmVjdD4gPSB7fSxcbiAgICApIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB3ID0gd3JpdGVyLnRhcmdldC53aWR0aCxcbiAgICAgICAgaCA9IHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgfSA9IHJlY3RcbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG4gICAgICBmaWxsUGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIDAgYXMgQ29sb3IzMiwgeCwgeSwgdywgaClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { fillPixelData } from '../../PixelData/fillPixelData';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorFill = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n fill(color: Color32, rect: Partial<Rect> = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = rect;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n fillPixelData(writer.target, color, x, y, w, h);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBIaXN0b3J5TXV0YXRvciwgUmVjdCB9IGZyb20gJy4uLy4uL190eXBlcydcbmltcG9ydCB7IGZpbGxQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvZmlsbFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBmaWxsUGl4ZWxEYXRhIH1cbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPlxuZXhwb3J0IGNvbnN0IG11dGF0b3JGaWxsID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YSA9IGRlZmF1bHRzLmZpbGxQaXhlbERhdGEsXG4gIH0gPSBkZXBzXG5cbiAgcmV0dXJuIHtcbiAgICBmaWxsKFxuICAgICAgY29sb3I6IENvbG9yMzIsXG4gICAgICByZWN0OiBQYXJ0aWFsPFJlY3Q+ID0ge30sXG4gICAgKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSByZWN0XG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuICAgICAgZmlsbFBpeGVsRGF0YSh3cml0ZXIudGFyZ2V0LCBjb2xvciwgeCwgeSwgdywgaClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\nexport function invertPixelData(pixelData: IPixelData, opts: PixelMutateOptions = {}): void {\n const dst = pixelData;\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = pixelData.width,\n h: height = pixelData.height,\n mask,\n mw,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const clip = resolveRectClipping(targetX, targetY, width, height, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n const {\n x,\n y,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n const mPitch = mw ?? width;\n const dx = x - targetX;\n const dy = y - targetY;\n let dIdx = y * dw + x;\n let mIdx = (my + dy) * mPitch + (mx + dx);\n const dStride = dw - actualW;\n const mStride = mPitch - actualW;\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx];\n const isHit = invertMask ? mVal === 0 : mVal === 1;\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n dIdx++;\n }\n dIdx += dStride;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFBpeGVsTXV0YXRlT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IG1ha2VDbGlwcGVkUmVjdCwgcmVzb2x2ZVJlY3RDbGlwcGluZyB9IGZyb20gJy4uL0ludGVybmFsL3Jlc29sdmVDbGlwcGluZydcblxuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KClcblxuZXhwb3J0IGZ1bmN0aW9uIGludmVydFBpeGVsRGF0YShcbiAgcGl4ZWxEYXRhOiBJUGl4ZWxEYXRhLFxuICBvcHRzOiBQaXhlbE11dGF0ZU9wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBkc3QgPSBwaXhlbERhdGFcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gcGl4ZWxEYXRhLndpZHRoLFxuICAgIGg6IGhlaWdodCA9IHBpeGVsRGF0YS5oZWlnaHQsXG4gICAgbWFzayxcbiAgICBtdyxcbiAgICBteCA9IDAsXG4gICAgbXkgPSAwLFxuICAgIGludmVydE1hc2sgPSBmYWxzZSxcbiAgfSA9IG9wdHNcblxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh0YXJnZXRYLCB0YXJnZXRZLCB3aWR0aCwgaGVpZ2h0LCBkc3Qud2lkdGgsIGRzdC5oZWlnaHQsIFNDUkFUQ0hfUkVDVClcblxuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVyblxuXG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtdyA/PyB3aWR0aFxuXG4gIGNvbnN0IGR4ID0geCAtIHRhcmdldFhcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WVxuXG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeFxuICBsZXQgbUlkeCA9IChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KVxuXG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFdcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGFjdHVhbFdcblxuICAvLyBPcHRpbWl6YXRpb246IFNwbGl0IGxvb3BzIHRvIGF2b2lkIGNoZWNraW5nIGBpZiAobWFzaylgIGZvciBldmVyeSBwaXhlbC5cbiAgaWYgKG1hc2spIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgY29uc3QgbVZhbCA9IG1hc2tbbUlkeF1cbiAgICAgICAgY29uc3QgaXNIaXQgPSBpbnZlcnRNYXNrXG4gICAgICAgICAgPyBtVmFsID09PSAwXG4gICAgICAgICAgOiBtVmFsID09PSAxXG5cbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgLy8gWE9SIHdpdGggMHgwMEZGRkZGRiBmbGlwcyBSR0IgYml0cyBhbmQgaWdub3JlcyBBbHBoYSAodGhlIHRvcCA4IGJpdHMpXG4gICAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgfVxuICAgICAgICBkSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICAgIG1JZHggKz0gbVN0cmlkZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkZcbiAgICAgICAgZElkeCsrXG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { HistoryMutator } from '../../_types';\nimport { invertPixelData } from '../../PixelData/invertPixelData';\nconst defaults = {\n invertPixelData\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorInvert = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n invertPixelData = defaults.invertPixelData\n } = deps;\n return {\n invert(opts: PixelMutateOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height\n } = opts;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n invertPixelData(writer.target, opts);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIaXN0b3J5TXV0YXRvciwgUGl4ZWxNdXRhdGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgaW52ZXJ0UGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ludmVydFBpeGVsRGF0YSdcbmltcG9ydCB7IFBpeGVsV3JpdGVyIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInXG5cbmNvbnN0IGRlZmF1bHRzID0geyBpbnZlcnRQaXhlbERhdGEgfVxudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+XG5cbmV4cG9ydCBjb25zdCBtdXRhdG9ySW52ZXJ0ID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgaW52ZXJ0UGl4ZWxEYXRhID0gZGVmYXVsdHMuaW52ZXJ0UGl4ZWxEYXRhLFxuICB9ID0gZGVwc1xuXG4gIHJldHVybiB7XG4gICAgaW52ZXJ0KG9wdHM6IFBpeGVsTXV0YXRlT3B0aW9ucyA9IHt9KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHggPSAwLFxuICAgICAgICB5ID0gMCxcbiAgICAgICAgdyA9IHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIGggPSB3cml0ZXIudGFyZ2V0LmhlaWdodCxcbiAgICAgIH0gPSBvcHRzXG4gICAgICB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKVxuICAgICAgaW52ZXJ0UGl4ZWxEYXRhKHdyaXRlci50YXJnZXQsIG9wdHMpXG4gICAgfSxcbiAgfVxufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz5cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { mutatorApplyAlphaMask } from './PixelMutator/mutatorApplyAlphaMask';\nimport { mutatorApplyBinaryMask } from './PixelMutator/mutatorApplyBinaryMask';\nimport { mutatorApplyCircleBrush } from './PixelMutator/mutatorApplyCircleBrush';\nimport { mutatorApplyCircleBrushStroke } from './PixelMutator/mutatorApplyCircleBrushStroke';\nimport { mutatorApplyCirclePencilStroke } from './PixelMutator/mutatorApplyCirclePencilStroke';\nimport { mutatorApplyRectBrush } from './PixelMutator/mutatorApplyRectBrush';\nimport { mutatorApplyRectBrushStroke } from './PixelMutator/mutatorApplyRectBrushStroke';\nimport { mutatorApplyRectPencil } from './PixelMutator/mutatorApplyRectPencil';\nimport { mutatorApplyRectPencilStroke } from './PixelMutator/mutatorApplyRectPencilStroke';\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor';\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel';\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData';\nimport { mutatorClear } from './PixelMutator/mutatorClear';\nimport { mutatorFill } from './PixelMutator/mutatorFill';\nimport { mutatorInvert } from './PixelMutator/mutatorInvert';\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n ...mutatorApplyAlphaMask(writer),\n ...mutatorApplyBinaryMask(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorFill(writer),\n ...mutatorInvert(writer),\n ...mutatorApplyCircleBrush(writer),\n ...mutatorApplyCircleBrushStroke(writer),\n ...mutatorApplyCirclePencilStroke(writer),\n ...mutatorApplyRectBrush(writer),\n ...mutatorApplyRectBrushStroke(writer),\n ...mutatorApplyRectPencil(writer),\n ...mutatorApplyRectPencilStroke(writer),\n ...mutatorClear(writer)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbXV0YXRvckFwcGx5QWxwaGFNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5QWxwaGFNYXNrJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5QmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUJpbmFyeU1hc2snXG5pbXBvcnQgeyBtdXRhdG9yQXBwbHlDaXJjbGVCcnVzaCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZUJydXNoJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5Q2lyY2xlQnJ1c2hTdHJva2UgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseUNpcmNsZVBlbmNpbFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUNpcmNsZVBlbmNpbFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RCcnVzaCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RCcnVzaCdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RCcnVzaFN0cm9rZSdcbmltcG9ydCB7IG11dGF0b3JBcHBseVJlY3RQZW5jaWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlSZWN0UGVuY2lsJ1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5UmVjdFBlbmNpbFN0cm9rZSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseVJlY3RQZW5jaWxTdHJva2UnXG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRDb2xvciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yJ1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kUGl4ZWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCdcbmltcG9ydCB7IG11dGF0b3JCbGVuZFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBpeGVsRGF0YSdcbmltcG9ydCB7IG11dGF0b3JDbGVhciB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JDbGVhcidcbmltcG9ydCB7IG11dGF0b3JGaWxsIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckZpbGwnXG5pbXBvcnQgeyBtdXRhdG9ySW52ZXJ0IH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckludmVydCdcbmltcG9ydCB0eXBlIHsgUGl4ZWxXcml0ZXIgfSBmcm9tICcuL1BpeGVsV3JpdGVyJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUZ1bGxQaXhlbE11dGF0b3Iod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+KSB7XG4gIHJldHVybiB7XG4gICAgLi4ubXV0YXRvckFwcGx5QWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckFwcGx5QmluYXJ5TWFzayh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckJsZW5kUGl4ZWxEYXRhKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3Iod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbCh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JGaWxsKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckludmVydCh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckFwcGx5Q2lyY2xlQnJ1c2god3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlDaXJjbGVCcnVzaFN0cm9rZSh3cml0ZXIpLFxuXG4gICAgLi4ubXV0YXRvckFwcGx5Q2lyY2xlUGVuY2lsU3Ryb2tlKHdyaXRlciksXG5cbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0QnJ1c2god3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0QnJ1c2hTdHJva2Uod3JpdGVyKSxcblxuICAgIC4uLm11dGF0b3JBcHBseVJlY3RQZW5jaWwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlSZWN0UGVuY2lsU3Ryb2tlKHdyaXRlciksXG5cbiAgICAuLi5tdXRhdG9yQ2xlYXIod3JpdGVyKSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { HistoryManager } from './HistoryManager';\nimport { PixelAccumulator } from './PixelAccumulator';\nimport { PixelEngineConfig } from './PixelEngineConfig';\nimport { applyPatchTiles } from './PixelPatchTiles';\nexport interface PixelWriterOptions {\n maxHistorySteps?: number;\n tileSize?: number;\n historyManager?: HistoryManager;\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n public target: IPixelData;\n public historyManager: HistoryManager;\n public accumulator: PixelAccumulator;\n protected config: PixelEngineConfig;\n readonly mutator: M;\n constructor(target: IPixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps)\n }: PixelWriterOptions = {}) {\n this.target = target;\n this.config = new PixelEngineConfig(tileSize);\n this.historyManager = historyManager;\n this.accumulator = new PixelAccumulator(target, this.config);\n this.mutator = mutatorFactory(this);\n }\n withHistory(cb: (mutator: M) => void) {\n cb(this.mutator);\n this.captureHistory();\n }\n captureHistory() {\n const beforeTiles = this.accumulator.beforeTiles;\n if (beforeTiles.length === 0) return;\n const afterTiles = this.accumulator.extractAfterTiles();\n const patch: PixelPatchTiles = {\n beforeTiles: beforeTiles,\n afterTiles: afterTiles\n };\n const target = this.target;\n const tileSize = this.config.tileSize;\n const accumulator = this.accumulator;\n const action: HistoryAction = {\n undo: () => applyPatchTiles(target, patch.beforeTiles, tileSize),\n redo: () => applyPatchTiles(target, patch.afterTiles, tileSize),\n dispose: () => accumulator.recyclePatch(patch)\n };\n this.historyManager.commit(action);\n this.accumulator.reset();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5QWN0aW9uLCBIaXN0b3J5TWFuYWdlciB9IGZyb20gJy4vSGlzdG9yeU1hbmFnZXInXG5pbXBvcnQgeyBQaXhlbEFjY3VtdWxhdG9yIH0gZnJvbSAnLi9QaXhlbEFjY3VtdWxhdG9yJ1xuaW1wb3J0IHsgUGl4ZWxFbmdpbmVDb25maWcgfSBmcm9tICcuL1BpeGVsRW5naW5lQ29uZmlnJ1xuaW1wb3J0IHsgYXBwbHlQYXRjaFRpbGVzLCB0eXBlIFBpeGVsUGF0Y2hUaWxlcyB9IGZyb20gJy4vUGl4ZWxQYXRjaFRpbGVzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsV3JpdGVyT3B0aW9ucyB7XG4gIG1heEhpc3RvcnlTdGVwcz86IG51bWJlclxuICB0aWxlU2l6ZT86IG51bWJlclxuICBoaXN0b3J5TWFuYWdlcj86IEhpc3RvcnlNYW5hZ2VyXG59XG5cbi8qKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRhcmcgPSBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEoMTAsIDEwKSlcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCAod3JpdGVyKSA9PiB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgLi4ubXV0YXRvckFwcGx5TWFzayh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsRGF0YSh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZENvbG9yKHdyaXRlciksXG4gKiAgICAgLi4ubXV0YXRvckJsZW5kUGl4ZWwod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yRmlsbCh3cml0ZXIpLFxuICogICB9XG4gKiB9KVxuICpcbiAqIC8vIHRvIGltcG9ydCBhbGwgbXV0YXRvciBmdW5jdGlvbnNcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCBtYWtlRnVsbFBpeGVsTXV0YXRvcilcbiAqXG4gKiB3cml0ZXIud2l0aEhpc3RvcnkoKG11dGF0b3IpID0+IHtcbiAqICAgbXV0YXRvci5hcHBseU1hc2soKVxuICogICBtdXRhdG9yLmJsZW5kUGl4ZWxEYXRhKClcbiAqIH0pXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXhlbFdyaXRlcjxNPiB7XG4gIHB1YmxpYyB0YXJnZXQ6IElQaXhlbERhdGFcbiAgcHVibGljIGhpc3RvcnlNYW5hZ2VyOiBIaXN0b3J5TWFuYWdlclxuICBwdWJsaWMgYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3JcbiAgcHJvdGVjdGVkIGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWdcbiAgcmVhZG9ubHkgbXV0YXRvcjogTVxuXG4gIGNvbnN0cnVjdG9yKHRhcmdldDogSVBpeGVsRGF0YSwgbXV0YXRvckZhY3Rvcnk6ICh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4pID0+IE0sIHtcbiAgICB0aWxlU2l6ZSA9IDI1NixcbiAgICBtYXhIaXN0b3J5U3RlcHMgPSA1MCxcbiAgICBoaXN0b3J5TWFuYWdlciA9IG5ldyBIaXN0b3J5TWFuYWdlcihtYXhIaXN0b3J5U3RlcHMpLFxuICB9OiBQaXhlbFdyaXRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGhpcy5jb25maWcgPSBuZXcgUGl4ZWxFbmdpbmVDb25maWcodGlsZVNpemUpXG4gICAgdGhpcy5oaXN0b3J5TWFuYWdlciA9IGhpc3RvcnlNYW5hZ2VyXG4gICAgdGhpcy5hY2N1bXVsYXRvciA9IG5ldyBQaXhlbEFjY3VtdWxhdG9yKHRhcmdldCwgdGhpcy5jb25maWcpXG4gICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvckZhY3RvcnkodGhpcylcbiAgfVxuXG4gIHdpdGhIaXN0b3J5KGNiOiAobXV0YXRvcjogTSkgPT4gdm9pZCkge1xuICAgIGNiKHRoaXMubXV0YXRvcilcblxuICAgIHRoaXMuY2FwdHVyZUhpc3RvcnkoKVxuICB9XG5cbiAgY2FwdHVyZUhpc3RvcnkoKSB7XG4gICAgY29uc3QgYmVmb3JlVGlsZXMgPSB0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzXG4gICAgaWYgKGJlZm9yZVRpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBjb25zdCBhZnRlclRpbGVzID0gdGhpcy5hY2N1bXVsYXRvci5leHRyYWN0QWZ0ZXJUaWxlcygpXG5cbiAgICBjb25zdCBwYXRjaDogUGl4ZWxQYXRjaFRpbGVzID0ge1xuICAgICAgYmVmb3JlVGlsZXM6IGJlZm9yZVRpbGVzLFxuICAgICAgYWZ0ZXJUaWxlczogYWZ0ZXJUaWxlcyxcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRhcmdldFxuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5jb25maWcudGlsZVNpemVcbiAgICBjb25zdCBhY2N1bXVsYXRvciA9IHRoaXMuYWNjdW11bGF0b3JcblxuICAgIGNvbnN0IGFjdGlvbjogSGlzdG9yeUFjdGlvbiA9IHtcbiAgICAgIHVuZG86ICgpID0+IGFwcGx5UGF0Y2hUaWxlcyh0YXJnZXQsIHBhdGNoLmJlZm9yZVRpbGVzLCB0aWxlU2l6ZSksXG4gICAgICByZWRvOiAoKSA9PiBhcHBseVBhdGNoVGlsZXModGFyZ2V0LCBwYXRjaC5hZnRlclRpbGVzLCB0aWxlU2l6ZSksXG4gICAgICBkaXNwb3NlOiAoKSA9PiBhY2N1bXVsYXRvci5yZWN5Y2xlUGF0Y2gocGF0Y2gpLFxuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuY29tbWl0KGFjdGlvbilcbiAgICB0aGlzLmFjY3VtdWxhdG9yLnJlc2V0KClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { HistoryMutator } from '../../_types';\nimport { applyCircleBrushToPixelData } from '../../PixelData/applyCircleBrushToPixelData';\nimport { getCircleBrushOrPencilBounds } from '../../Rect/getCircleBrushOrPencilBounds';\nconst defaults = {\n applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds,\n fallOff: () => 1\n};\ntype Deps = Partial<typeof defaults>;\nexport const mutatorApplyCirclePencil = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyCircleBrushToPixelData = defaults.applyCircleBrushToPixelData,\n getCircleBrushOrPencilBounds = defaults.getCircleBrushOrPencilBounds,\n fallOff = defaults.fallOff\n } = deps;\n const boundsOut: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n return {\n applyCirclePencil(color: Color32, centerX: number, centerY: number, brushSize: number, alpha = 255, blendFn?: BlendColor32) {\n const bounds = getCircleBrushOrPencilBounds(centerX, centerY, brushSize, writer.target.width, writer.target.height, boundsOut);\n const {\n x,\n y,\n w,\n h\n } = bounds;\n writer.accumulator.storeRegionBeforeState(x, y, w, h);\n applyCircleBrushToPixelData(writer.target, color, centerX, centerY, brushSize, alpha, fallOff, blendFn, bounds);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCbGVuZENvbG9yMzIsIENvbG9yMzIsIEhpc3RvcnlNdXRhdG9yLCBSZWN0IH0gZnJvbSAnLi4vLi4vX3R5cGVzJ1xuaW1wb3J0IHsgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSdcbmltcG9ydCB7IGdldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMgfSBmcm9tICcuLi8uLi9SZWN0L2dldENpcmNsZUJydXNoT3JQZW5jaWxCb3VuZHMnXG5pbXBvcnQgeyBQaXhlbFdyaXRlciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYXBwbHlDaXJjbGVCcnVzaFRvUGl4ZWxEYXRhLFxuICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzLFxuICBmYWxsT2ZmOiAoKSA9PiAxLFxufVxuXG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz5cblxuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseUNpcmNsZVBlbmNpbCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YSxcbiAgICBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzID0gZGVmYXVsdHMuZ2V0Q2lyY2xlQnJ1c2hPclBlbmNpbEJvdW5kcyxcbiAgICBmYWxsT2ZmID0gZGVmYXVsdHMuZmFsbE9mZixcbiAgfSA9IGRlcHNcblxuICBjb25zdCBib3VuZHNPdXQ6IFJlY3QgPSB7IHg6IDAsIHk6IDAsIHc6IDAsIGg6IDAgfVxuXG4gIHJldHVybiB7XG4gICAgYXBwbHlDaXJjbGVQZW5jaWwoXG4gICAgICBjb2xvcjogQ29sb3IzMixcbiAgICAgIGNlbnRlclg6IG51bWJlcixcbiAgICAgIGNlbnRlclk6IG51bWJlcixcbiAgICAgIGJydXNoU2l6ZTogbnVtYmVyLFxuICAgICAgYWxwaGEgPSAyNTUsXG4gICAgICBibGVuZEZuPzogQmxlbmRDb2xvcjMyLFxuICAgICkge1xuXG4gICAgICBjb25zdCBib3VuZHMgPSBnZXRDaXJjbGVCcnVzaE9yUGVuY2lsQm91bmRzKFxuICAgICAgICBjZW50ZXJYLFxuICAgICAgICBjZW50ZXJZLFxuICAgICAgICBicnVzaFNpemUsXG4gICAgICAgIHdyaXRlci50YXJnZXQud2lkdGgsXG4gICAgICAgIHdyaXRlci50YXJnZXQuaGVpZ2h0LFxuICAgICAgICBib3VuZHNPdXQsXG4gICAgICApXG5cbiAgICAgIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gYm91bmRzXG5cbiAgICAgIHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpXG5cbiAgICAgIGFwcGx5Q2lyY2xlQnJ1c2hUb1BpeGVsRGF0YShcbiAgICAgICAgd3JpdGVyLnRhcmdldCxcbiAgICAgICAgY29sb3IsXG4gICAgICAgIGNlbnRlclgsXG4gICAgICAgIGNlbnRlclksXG4gICAgICAgIGJydXNoU2l6ZSxcbiAgICAgICAgYWxwaGEsXG4gICAgICAgIGZhbGxPZmYsXG4gICAgICAgIGJsZW5kRm4sXG4gICAgICAgIGJvdW5kcyxcbiAgICAgIClcbiAgICB9LFxuICB9XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPlxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function copyImageData({\n data,\n width,\n height\n}: ImageDataLike): ImageData {\n return new ImageData(data.slice(), width, height);\n}\nexport function copyImageDataLike({\n data,\n width,\n height\n}: ImageDataLike): ImageDataLike {\n return {\n data: data.slice(),\n width,\n height\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY29weUltYWdlRGF0YSh7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfTogSW1hZ2VEYXRhTGlrZSk6IEltYWdlRGF0YSB7XG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGRhdGEuc2xpY2UoKSwgd2lkdGgsIGhlaWdodClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJbWFnZURhdGFMaWtlKHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9OiBJbWFnZURhdGFMaWtlKTogSW1hZ2VEYXRhTGlrZSB7XG4gIHJldHVybiB7XG4gICAgZGF0YTogZGF0YS5zbGljZSgpLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function makeImageDataLike(width: number, height: number, data?: Buffer): ImageDataLike {\n const size = width * height * 4;\n const buffer = data ? new Uint8ClampedArray(data.buffer, data.byteOffset, size) : new Uint8ClampedArray(size);\n return {\n width,\n height,\n data: buffer\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUltYWdlRGF0YUxpa2Uod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE/OiBCdWZmZXIpOiBJbWFnZURhdGFMaWtlIHtcbiAgY29uc3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogNFxuICBjb25zdCBidWZmZXIgPSBkYXRhXG4gICAgPyBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgc2l6ZSlcbiAgICA6IG5ldyBVaW50OENsYW1wZWRBcnJheShzaXplKVxuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkYXRhOiBidWZmZXIsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { AlphaMask } from '../_types';\n/**\n * Extracts the alpha channel from raw ImageData into an AlphaMask.\n * When possible use {@link pixelDataToAlphaMask} instead.\n * Repeat calls to the same data will use less memory.\n */\nexport function imageDataToAlphaMask(imageData: ImageData): AlphaMask {\n const {\n width,\n height,\n data\n } = imageData;\n\n // Create a 32-bit view of the existing buffer\n const data32 = new Uint32Array(data.buffer, data.byteOffset, data.byteLength >> 2);\n const len = data32.length;\n const mask = new Uint8Array(width * height) as AlphaMask;\n for (let i = 0; i < len; i++) {\n const val = data32[i];\n\n // Extract Alpha (top 8 bits in Little-Endian/ABGR)\n mask[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2sgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBwaXhlbERhdGFUb0FscGhhTWFzayB9IGZyb20gJy4uL1BpeGVsRGF0YS9waXhlbERhdGFUb0FscGhhTWFzaydcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYWxwaGEgY2hhbm5lbCBmcm9tIHJhdyBJbWFnZURhdGEgaW50byBhbiBBbHBoYU1hc2suXG4gKiBXaGVuIHBvc3NpYmxlIHVzZSB7QGxpbmsgcGl4ZWxEYXRhVG9BbHBoYU1hc2t9IGluc3RlYWQuXG4gKiBSZXBlYXQgY2FsbHMgdG8gdGhlIHNhbWUgZGF0YSB3aWxsIHVzZSBsZXNzIG1lbW9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltYWdlRGF0YVRvQWxwaGFNYXNrKFxuICBpbWFnZURhdGE6IEltYWdlRGF0YSxcbik6IEFscGhhTWFzayB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZGF0YSxcbiAgfSA9IGltYWdlRGF0YVxuXG4gIC8vIENyZWF0ZSBhIDMyLWJpdCB2aWV3IG9mIHRoZSBleGlzdGluZyBidWZmZXJcbiAgY29uc3QgZGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KFxuICAgIGRhdGEuYnVmZmVyLFxuICAgIGRhdGEuYnl0ZU9mZnNldCxcbiAgICBkYXRhLmJ5dGVMZW5ndGggPj4gMixcbiAgKVxuICBjb25zdCBsZW4gPSBkYXRhMzIubGVuZ3RoXG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCkgYXMgQWxwaGFNYXNrXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHZhbCA9IGRhdGEzMltpXVxuXG4gICAgLy8gRXh0cmFjdCBBbHBoYSAodG9wIDggYml0cyBpbiBMaXR0bGUtRW5kaWFuL0FCR1IpXG4gICAgbWFza1tpXSA9ICh2YWwgPj4+IDI0KSAmIDB4ZmZcbiAgfVxuXG4gIHJldHVybiBtYXNrXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeReusableCanvas } from '../Canvas/ReusableCanvas';\nconst get = makeReusableCanvas();\n\n/**\n * Converts an {@link ImageData} object into a base64-encoded Data URL string.\n *\n * @param imageData - The pixel data to be converted.\n *\n * @returns A string representing the image in `image/png` format as a\n * [Data URL](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n * @example\n * ```typescript\n * const dataUrl = imageDataToDataUrl(imageData);\n * const img = new Image();\n * img.src = dataUrl;\n * ```\n */\nexport function imageDataToDataUrl(imageData: ImageData): string {\n const {\n canvas,\n ctx\n } = get(imageData.width, imageData.height);\n ctx.putImageData(imageData, 0, 0);\n return canvas.toDataURL();\n}\nimageDataToDataUrl.reset = get.reset;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFrZVJldXNhYmxlQ2FudmFzIH0gZnJvbSAnLi4vQ2FudmFzL1JldXNhYmxlQ2FudmFzJ1xuXG5jb25zdCBnZXQgPSBtYWtlUmV1c2FibGVDYW52YXMoKVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdCBpbnRvIGEgYmFzZTY0LWVuY29kZWQgRGF0YSBVUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgcGl4ZWwgZGF0YSB0byBiZSBjb252ZXJ0ZWQuXG4gKlxuICogQHJldHVybnMgQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBpbWFnZSBpbiBgaW1hZ2UvcG5nYCBmb3JtYXQgYXMgYVxuICogW0RhdGEgVVJMXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9VUkkvUmVmZXJlbmNlL1NjaGVtZXMvZGF0YSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHtAbGluayBIVE1MQ2FudmFzRWxlbWVudH0gY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGF0YVVybCA9IGltYWdlRGF0YVRvRGF0YVVybChpbWFnZURhdGEpO1xuICogY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gKiBpbWcuc3JjID0gZGF0YVVybDtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VEYXRhVG9EYXRhVXJsKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjYW52YXMsIGN0eCB9ID0gZ2V0KGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodClcblxuICBjdHgucHV0SW1hZ2VEYXRhKGltYWdlRGF0YSwgMCwgMClcbiAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKVxufVxuXG5pbWFnZURhdGFUb0RhdGFVcmwucmVzZXQgPSBnZXQucmVzZXRcbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUInt32Array(imageData: ImageDataLike): Uint32Array {\n return new Uint32Array(imageData.data.buffer, imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIGNvbnZlcnRzIHtAbGluayBJbWFnZURhdGF9IHRvIGEgZmFzdGVyIFVpbnQzMkFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSk6IFVpbnQzMkFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShcbiAgICBpbWFnZURhdGEuZGF0YS5idWZmZXIsXG4gICAgaW1hZ2VEYXRhLmRhdGEuYnl0ZU9mZnNldCxcbiAgICAvLyBTaGlmdCByaWdodCBieSAyIGlzIGEgZmFzdCBiaXR3aXNlIGRpdmlzaW9uIGJ5IDQuXG4gICAgaW1hZ2VEYXRhLmRhdGEuYnl0ZUxlbmd0aCA+PiAyLFxuICApXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function invertImageData(imageData: ImageData) {\n const data = imageData.data;\n let length = data.length;\n for (let i = 0; i < length; i += 4) {\n data[i] = 255 - data[i]!;\n data[i + 1] = 255 - data[i + 1]!;\n data[i + 2] = 255 - data[i + 2]!;\n }\n return imageData;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGludmVydEltYWdlRGF0YShpbWFnZURhdGE6IEltYWdlRGF0YSkge1xuICBjb25zdCBkYXRhID0gaW1hZ2VEYXRhLmRhdGFcbiAgbGV0IGxlbmd0aCA9IGRhdGEubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDQpIHtcbiAgICBkYXRhW2ldID0gMjU1IC0gZGF0YVtpXSFcbiAgICBkYXRhW2kgKyAxXSA9IDI1NSAtIGRhdGFbaSArIDFdIVxuICAgIGRhdGFbaSArIDJdID0gMjU1IC0gZGF0YVtpICsgMl0hXG4gIH1cbiAgcmV0dXJuIGltYWdlRGF0YVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","const resample32Scratch = {\n data: null as null | Int32Array,\n width: 0,\n height: 0\n};\n\n/**\n * @internal\n */\ntype Resample32Result = {\n data: Int32Array;\n width: number;\n height: number;\n};\n\n/**\n * @internal\n */\nexport function resample32(srcData32: Uint32Array | Int32Array, srcW: number, srcH: number, factor: number): Resample32Result {\n const dstW = Math.max(1, srcW * factor | 0);\n const dstH = Math.max(1, srcH * factor | 0);\n const dstData = new Int32Array(dstW * dstH);\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW;\n const scaleY = srcH / dstH;\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, y * scaleY | 0);\n const srcRowOffset = srcY * srcW;\n const dstRowOffset = y * dstW;\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, x * scaleX | 0);\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!;\n }\n }\n resample32Scratch.data = dstData;\n resample32Scratch.width = dstW;\n resample32Scratch.height = dstH;\n return resample32Scratch as Resample32Result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcmVzYW1wbGUzMlNjcmF0Y2ggPSB7XG4gIGRhdGE6IG51bGwgYXMgbnVsbCB8IEludDMyQXJyYXksXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG59XG5cbi8qKlxuICogIEBpbnRlcm5hbFxuICovXG50eXBlIFJlc2FtcGxlMzJSZXN1bHQgPSB7IGRhdGE6IEludDMyQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH1cblxuLyoqXG4gKiAgQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNhbXBsZTMyKFxuICBzcmNEYXRhMzI6IFVpbnQzMkFycmF5IHwgSW50MzJBcnJheSxcbiAgc3JjVzogbnVtYmVyLFxuICBzcmNIOiBudW1iZXIsXG4gIGZhY3RvcjogbnVtYmVyLFxuKTogUmVzYW1wbGUzMlJlc3VsdCB7XG4gIGNvbnN0IGRzdFcgPSBNYXRoLm1heCgxLCAoc3JjVyAqIGZhY3RvcikgfCAwKVxuICBjb25zdCBkc3RIID0gTWF0aC5tYXgoMSwgKHNyY0ggKiBmYWN0b3IpIHwgMClcbiAgY29uc3QgZHN0RGF0YSA9IG5ldyBJbnQzMkFycmF5KGRzdFcgKiBkc3RIKVxuXG4gIC8vIFVzZSB0aGUgcmVjaXByb2NhbCB0byBtYXAgYmFjayBwcmVjaXNlbHlcbiAgY29uc3Qgc2NhbGVYID0gc3JjVyAvIGRzdFdcbiAgY29uc3Qgc2NhbGVZID0gc3JjSCAvIGRzdEhcblxuICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzdEg7IHkrKykge1xuICAgIGNvbnN0IHNyY1kgPSBNYXRoLm1pbihzcmNIIC0gMSwgKHkgKiBzY2FsZVkpIHwgMClcbiAgICBjb25zdCBzcmNSb3dPZmZzZXQgPSBzcmNZICogc3JjV1xuICAgIGNvbnN0IGRzdFJvd09mZnNldCA9IHkgKiBkc3RXXG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGRzdFc7IHgrKykge1xuICAgICAgY29uc3Qgc3JjWCA9IE1hdGgubWluKHNyY1cgLSAxLCAoeCAqIHNjYWxlWCkgfCAwKVxuXG4gICAgICBkc3REYXRhW2RzdFJvd09mZnNldCArIHhdID0gc3JjRGF0YTMyW3NyY1Jvd09mZnNldCArIHNyY1hdIVxuICAgIH1cbiAgfVxuXG4gIHJlc2FtcGxlMzJTY3JhdGNoLmRhdGEgPSBkc3REYXRhXG4gIHJlc2FtcGxlMzJTY3JhdGNoLndpZHRoID0gZHN0V1xuICByZXNhbXBsZTMyU2NyYXRjaC5oZWlnaHQgPSBkc3RIXG5cbiAgcmV0dXJuIHJlc2FtcGxlMzJTY3JhdGNoIGFzIFJlc2FtcGxlMzJSZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer);\n const {\n data,\n width,\n height\n } = resample32(src32, source.width, source.height, factor);\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>;\n return new ImageData(uint8ClampedArray, width, height);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNhbXBsZXMgSW1hZ2VEYXRhIGJ5IGEgc3BlY2lmaWMgZmFjdG9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMidcblxuLyoqXG4gKiBSZXNhbXBsZXMgSW1hZ2VEYXRhIGJ5IGEgc3BlY2lmaWMgZmFjdG9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVJbWFnZURhdGEoc291cmNlOiBJbWFnZURhdGEsIGZhY3RvcjogbnVtYmVyKTogSW1hZ2VEYXRhIHtcbiAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc291cmNlLmRhdGEuYnVmZmVyKVxuICBjb25zdCB7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfSA9IHJlc2FtcGxlMzIoc3JjMzIsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgZmFjdG9yKVxuXG4gIGNvbnN0IHVpbnQ4Q2xhbXBlZEFycmF5ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEuYnVmZmVyKSBhcyBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj5cbiAgcmV0dXJuIG5ldyBJbWFnZURhdGEodWludDhDbGFtcGVkQXJyYXksIHdpZHRoLCBoZWlnaHQpXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Non destructively resizes the {@link ImageData} buffer to new dimensions, optionally\n * offsetting the original content.\n * This operation creates a new buffer. It does not scale or stretch pixels;\n * instead, it crops or pads the image based on the new dimensions and\n * provides an offset for repositioning.\n *\n * @param current The source {@link ImageDataLike} to resize.\n * @param newWidth The target width in pixels.\n * @param newHeight The target height in pixels.\n * @param offsetX The horizontal offset for placing the\n * original image within the new buffer.\n * @default 0\n * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\n * @default 0\n *\n * @returns A new {@link ImageData} instance with the specified dimensions.\n *\n * @example\n * ```typescript\n * // Centers an 80x80 image in a new 100x100 buffer\n * const resized = resizeImageData(\n * originalData,\n * 100,\n * 100,\n * 10,\n * 10\n * );\n * ```\n */\nexport function resizeImageData(current: ImageDataLike, newWidth: number, newHeight: number, offsetX = 0, offsetY = 0): ImageData {\n const result = new ImageData(newWidth, newHeight);\n const {\n width: oldW,\n height: oldH,\n data: oldData\n } = current;\n const newData = result.data;\n\n // Determine intersection of the old image (at offset) and new canvas bounds\n const x0 = Math.max(0, offsetX);\n const y0 = Math.max(0, offsetY);\n const x1 = Math.min(newWidth, offsetX + oldW);\n const y1 = Math.min(newHeight, offsetY + oldH);\n if (x1 <= x0 || y1 <= y0) {\n return result;\n }\n const rowCount = y1 - y0;\n const rowLen = (x1 - x0) * 4;\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row;\n const srcY = dstY - offsetY;\n const srcX = x0 - offsetX;\n const dstStart = (dstY * newWidth + x0) * 4;\n const srcStart = (srcY * oldW + srcX) * 4;\n newData.set(oldData.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIE5vbiBkZXN0cnVjdGl2ZWx5IHJlc2l6ZXMgdGhlIHtAbGluayBJbWFnZURhdGF9IGJ1ZmZlciB0byBuZXcgZGltZW5zaW9ucywgb3B0aW9uYWxseVxuICogb2Zmc2V0dGluZyB0aGUgb3JpZ2luYWwgY29udGVudC5cbiAqIFRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYnVmZmVyLiBJdCBkb2VzIG5vdCBzY2FsZSBvciBzdHJldGNoIHBpeGVscztcbiAqIGluc3RlYWQsIGl0IGNyb3BzIG9yIHBhZHMgdGhlIGltYWdlIGJhc2VkIG9uIHRoZSBuZXcgZGltZW5zaW9ucyBhbmRcbiAqIHByb3ZpZGVzIGFuIG9mZnNldCBmb3IgcmVwb3NpdGlvbmluZy5cbiAqXG4gKiBAcGFyYW0gY3VycmVudCBUaGUgc291cmNlIHtAbGluayBJbWFnZURhdGFMaWtlfSB0byByZXNpemUuXG4gKiBAcGFyYW0gbmV3V2lkdGggVGhlIHRhcmdldCB3aWR0aCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0gbmV3SGVpZ2h0IFRoZSB0YXJnZXQgaGVpZ2h0IGluIHBpeGVscy5cbiAqIEBwYXJhbSBvZmZzZXRYIFRoZSBob3Jpem9udGFsIG9mZnNldCBmb3IgcGxhY2luZyB0aGVcbiAqIG9yaWdpbmFsIGltYWdlIHdpdGhpbiB0aGUgbmV3IGJ1ZmZlci5cbiAqIEBkZWZhdWx0IDBcbiAqIEBwYXJhbSBvZmZzZXRZIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgZm9yIHBsYWNpbmcgdGhlXG4gKiBvcmlnaW5hbCBpbWFnZSB3aXRoaW4gdGhlIG5ldyBidWZmZXIuXG4gKiBAZGVmYXVsdCAwXG4gKlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIEltYWdlRGF0YX0gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENlbnRlcnMgYW4gODB4ODAgaW1hZ2UgaW4gYSBuZXcgMTAweDEwMCBidWZmZXJcbiAqIGNvbnN0IHJlc2l6ZWQgPSByZXNpemVJbWFnZURhdGEoXG4gKiAgIG9yaWdpbmFsRGF0YSxcbiAqICAgMTAwLFxuICogICAxMDAsXG4gKiAgIDEwLFxuICogICAxMFxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplSW1hZ2VEYXRhKFxuICBjdXJyZW50OiBJbWFnZURhdGFMaWtlLFxuICBuZXdXaWR0aDogbnVtYmVyLFxuICBuZXdIZWlnaHQ6IG51bWJlcixcbiAgb2Zmc2V0WCA9IDAsXG4gIG9mZnNldFkgPSAwLFxuKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEltYWdlRGF0YShuZXdXaWR0aCwgbmV3SGVpZ2h0KVxuICBjb25zdCB7XG4gICAgd2lkdGg6IG9sZFcsXG4gICAgaGVpZ2h0OiBvbGRILFxuICAgIGRhdGE6IG9sZERhdGEsXG4gIH0gPSBjdXJyZW50XG4gIGNvbnN0IG5ld0RhdGEgPSByZXN1bHQuZGF0YVxuXG4gIC8vIERldGVybWluZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9sZCBpbWFnZSAoYXQgb2Zmc2V0KSBhbmQgbmV3IGNhbnZhcyBib3VuZHNcbiAgY29uc3QgeDAgPSBNYXRoLm1heCgwLCBvZmZzZXRYKVxuICBjb25zdCB5MCA9IE1hdGgubWF4KDAsIG9mZnNldFkpXG4gIGNvbnN0IHgxID0gTWF0aC5taW4obmV3V2lkdGgsIG9mZnNldFggKyBvbGRXKVxuICBjb25zdCB5MSA9IE1hdGgubWluKG5ld0hlaWdodCwgb2Zmc2V0WSArIG9sZEgpXG5cbiAgaWYgKHgxIDw9IHgwIHx8IHkxIDw9IHkwKSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3Qgcm93Q291bnQgPSB5MSAtIHkwXG4gIGNvbnN0IHJvd0xlbiA9ICh4MSAtIHgwKSAqIDRcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dDb3VudDsgcm93KyspIHtcbiAgICBjb25zdCBkc3RZID0geTAgKyByb3dcbiAgICBjb25zdCBzcmNZID0gZHN0WSAtIG9mZnNldFlcbiAgICBjb25zdCBzcmNYID0geDAgLSBvZmZzZXRYXG5cbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICogbmV3V2lkdGggKyB4MCkgKiA0XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSAqIG9sZFcgKyBzcmNYKSAqIDRcblxuICAgIG5ld0RhdGEuc2V0KFxuICAgICAgb2xkRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pLFxuICAgICAgZHN0U3RhcnQsXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type ReusableImageData = ReturnType<typeof makeReusableImageData>;\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null;\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n const hasInstance = !!imageData;\n const widthMatches = hasInstance && imageData!.width === width;\n const heightMatches = hasInstance && imageData!.height === height;\n if (!widthMatches || !heightMatches) {\n imageData = new ImageData(width, height);\n }\n return imageData!;\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgUmV1c2FibGVJbWFnZURhdGEgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlUmV1c2FibGVJbWFnZURhdGE+XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIGEgc2luZ2xlLCByZXVzYWJsZSBJbWFnZURhdGEgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHVzZWQgdG8gbWluaW1pemUgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIGJ5IHJlY3ljbGluZyB0aGVcbiAqIHVuZGVybHlpbmcgcGl4ZWwgYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJldHVybnMgYSBwb29sZWQgSW1hZ2VEYXRhIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlSW1hZ2VEYXRhKCkge1xuICBsZXQgaW1hZ2VEYXRhOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbFxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gSW1hZ2VEYXRhIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucy5cbiAgICogSWYgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGRpZmZlciBmcm9tIHRoZSBjYWNoZWQgaW5zdGFuY2UsIGEgbmV3IG9uZSBpcyBhbGxvY2F0ZWQuXG4gICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cbiAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBpbiBwaXhlbHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgbmV3bHkgYWxsb2NhdGVkIEltYWdlRGF0YSBvYmplY3QuXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UmV1c2FibGVJbWFnZURhdGEod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICBjb25zdCBoYXNJbnN0YW5jZSA9ICEhaW1hZ2VEYXRhXG4gICAgY29uc3Qgd2lkdGhNYXRjaGVzID0gaGFzSW5zdGFuY2UgJiYgaW1hZ2VEYXRhIS53aWR0aCA9PT0gd2lkdGhcbiAgICBjb25zdCBoZWlnaHRNYXRjaGVzID0gaGFzSW5zdGFuY2UgJiYgaW1hZ2VEYXRhIS5oZWlnaHQgPT09IGhlaWdodFxuXG4gICAgaWYgKCF3aWR0aE1hdGNoZXMgfHwgIWhlaWdodE1hdGNoZXMpIHtcbiAgICAgIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodClcbiAgICB9XG5cbiAgICByZXR1cm4gaW1hZ2VEYXRhIVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types';\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer);\n const decoder = new TextDecoder('latin1');\n const binary = decoder.decode(uint8);\n return btoa(binary) as Base64EncodedUInt8Array;\n}\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded);\n const bytes = new Uint8ClampedArray(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer)\n };\n}\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any;\n return serializeImageData(imageData) as any;\n}\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n };\n}\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array);\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any;\n}\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any;\n return deserializeImageData(serialized) as any;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCYXNlNjRFbmNvZGVkVUludDhBcnJheSwgSW1hZ2VEYXRhTGlrZSwgU2VyaWFsaXplZEltYWdlRGF0YSB9IGZyb20gJy4uL190eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NEVuY29kZUFycmF5QnVmZmVyKGJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlKTogQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkge1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcilcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignbGF0aW4xJylcbiAgY29uc3QgYmluYXJ5ID0gZGVjb2Rlci5kZWNvZGUodWludDgpXG5cbiAgcmV0dXJuIGJ0b2EoYmluYXJ5KSBhcyBCYXNlNjRFbmNvZGVkVUludDhBcnJheVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0RGVjb2RlQXJyYXlCdWZmZXIoZW5jb2RlZDogQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpOiBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj4ge1xuICBjb25zdCBiaW5hcnkgPSBhdG9iKGVuY29kZWQpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJpbmFyeS5sZW5ndGgpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKVxuICB9XG4gIHJldHVybiBieXRlc1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBmb3IgdXNlIGluIEpTT04uIFBpeGVsIGRhdGEgaXMgc3RvcmVkIGFzIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUltYWdlRGF0YTxUIGV4dGVuZHMgSW1hZ2VEYXRhTGlrZT4oaW1hZ2VEYXRhOiBUKTogU2VyaWFsaXplZEltYWdlRGF0YSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IGltYWdlRGF0YS53aWR0aCxcbiAgICBoZWlnaHQ6IGltYWdlRGF0YS5oZWlnaHQsXG4gICAgZGF0YTogYmFzZTY0RW5jb2RlQXJyYXlCdWZmZXIoaW1hZ2VEYXRhLmRhdGEuYnVmZmVyKSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTnVsbGFibGVJbWFnZURhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgfCBudWxsPihpbWFnZURhdGE6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBTZXJpYWxpemVkSW1hZ2VEYXRhIHtcbiAgaWYgKCFpbWFnZURhdGEpIHJldHVybiBudWxsIGFzIGFueVxuXG4gIHJldHVybiBzZXJpYWxpemVJbWFnZURhdGEoaW1hZ2VEYXRhKSBhcyBhbnlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplUmF3SW1hZ2VEYXRhPFQgZXh0ZW5kcyBTZXJpYWxpemVkSW1hZ2VEYXRhPihzZXJpYWxpemVkOiBUKTogSW1hZ2VEYXRhTGlrZSB7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHNlcmlhbGl6ZWQud2lkdGgsXG4gICAgaGVpZ2h0OiBzZXJpYWxpemVkLmhlaWdodCxcbiAgICBkYXRhOiBiYXNlNjREZWNvZGVBcnJheUJ1ZmZlcihzZXJpYWxpemVkLmRhdGEgYXMgQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpLFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YT4oc2VyaWFsaXplZDogVCk6IEltYWdlRGF0YSB7XG4gIGNvbnN0IGRhdGEgPSBiYXNlNjREZWNvZGVBcnJheUJ1ZmZlcihzZXJpYWxpemVkLmRhdGEgYXMgQmFzZTY0RW5jb2RlZFVJbnQ4QXJyYXkpXG5cbiAgcmV0dXJuIG5ldyBJbWFnZURhdGEoZGF0YSBhcyBJbWFnZURhdGFBcnJheSwgc2VyaWFsaXplZC53aWR0aCwgc2VyaWFsaXplZC5oZWlnaHQpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVOdWxsYWJsZUltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YSB8IG51bGw+KHNlcmlhbGl6ZWQ6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBJbWFnZURhdGEge1xuICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiBudWxsIGFzIGFueVxuICByZXR1cm4gZGVzZXJpYWxpemVJbWFnZURhdGEoc2VyaWFsaXplZCkgYXMgYW55XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function uInt32ArrayToImageData(data: Uint32Array, width: number, height: number): ImageData {\n const buffer = data.buffer as ArrayBuffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return new ImageData(clampedArray, width, height);\n}\nexport function uInt32ArrayToImageDataLike(data: Uint32Array, width: number, height: number): ImageDataLike {\n const buffer = data.buffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return {\n width,\n height,\n data: clampedArray\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdUludDMyQXJyYXlUb0ltYWdlRGF0YShcbiAgZGF0YTogVWludDMyQXJyYXksXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgYnVmZmVyID0gZGF0YS5idWZmZXIgYXMgQXJyYXlCdWZmZXJcbiAgY29uc3QgYnl0ZU9mZnNldCA9IGRhdGEuYnl0ZU9mZnNldFxuICBjb25zdCBieXRlTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoXG4gIGNvbnN0IGNsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpXG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGNsYW1wZWRBcnJheSwgd2lkdGgsIGhlaWdodClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVJbnQzMkFycmF5VG9JbWFnZURhdGFMaWtlKFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4pOiBJbWFnZURhdGFMaWtlIHtcbiAgY29uc3QgYnVmZmVyID0gZGF0YS5idWZmZXJcbiAgY29uc3QgYnl0ZU9mZnNldCA9IGRhdGEuYnl0ZU9mZnNldFxuICBjb25zdCBieXRlTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoXG4gIGNvbnN0IGNsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpXG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGRhdGE6IGNsYW1wZWRBcnJheSxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_types';\nimport { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(target: ImageData, source: ImageData, x: number, y: number, sx: number = 0, sy: number = 0, sw: number = source.width, sh: number = source.height, mask: Uint8Array | null = null, maskType: MaskType = MaskType.BINARY): void {\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data;\n const srcW = source.width;\n const srcData = source.data;\n const clip = resolveBlitClipping(x, y, sx, sy, sw, sh, dstW, dstH, srcW, source.height, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const useMask = !!mask;\n for (let row = 0; row < copyH; row++) {\n const currentDstY = dstY + row;\n const currentSrcY = srcY + row;\n const dstStart = (currentDstY * dstW + dstX) * 4;\n const srcStart = (currentSrcY * srcW + srcX) * 4;\n if (useMask && mask) {\n for (let ix = 0; ix < copyW; ix++) {\n const mi = currentSrcY * srcW + (srcX + ix);\n const alpha = mask[mi];\n if (alpha === 0) {\n continue;\n }\n const di = dstStart + ix * 4;\n const si = srcStart + ix * 4;\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si];\n dstData[di + 1] = srcData[si + 1];\n dstData[di + 2] = srcData[si + 2];\n dstData[di + 3] = srcData[si + 3];\n } else {\n const a = alpha / 255;\n const invA = 1 - a;\n dstData[di] = srcData[si] * a + dstData[di] * invA;\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA;\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA;\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA;\n }\n }\n } else {\n const byteLen = copyW * 4;\n const sub = srcData.subarray(srcStart, srcStart + byteLen);\n dstData.set(sub, dstStart);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFza1R5cGUgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5cbmNvbnN0IFNDUkFUQ0hfQkxJVCA9IG1ha2VDbGlwcGVkQmxpdCgpXG5cbi8qKlxuICogV3JpdGVzIGltYWdlIGRhdGEgZnJvbSBhIHNvdXJjZSB0byBhIHRhcmdldCB3aXRoIHN1cHBvcnQgZm9yIGNsaXBwaW5nIGFuZCBhbHBoYSBtYXNraW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZGVzdGluYXRpb24gSW1hZ2VEYXRhIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0IHdoZXJlIGRyYXdpbmcgc3RhcnRzLlxuICogQHBhcmFtIHkgLSBUaGUgeS1jb29yZGluYXRlIGluIHRoZSB0YXJnZXQgd2hlcmUgZHJhd2luZyBzdGFydHMuXG4gKiBAcGFyYW0gc3ggLSBUaGUgeC1jb29yZGluYXRlIGluIHRoZSBzb3VyY2UgdG8gc3RhcnQgY29weWluZyBmcm9tLlxuICogQHBhcmFtIHN5IC0gVGhlIHktY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS5cbiAqIEBwYXJhbSBzdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvcHkuXG4gKiBAcGFyYW0gc2ggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY29weS5cbiAqIEBwYXJhbSBtYXNrIC0gQW4gb3B0aW9uYWwgVWludDhBcnJheSBtYXNrICgwLTI1NSkuIDAgaXMgdHJhbnNwYXJlbnQsIDI1NSBpcyBvcGFxdWUuXG4gKiBAcGFyYW0gbWFza1R5cGUgLSB0eXBlIG9mIG1hc2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhKFxuICB0YXJnZXQ6IEltYWdlRGF0YSxcbiAgc291cmNlOiBJbWFnZURhdGEsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBzeDogbnVtYmVyID0gMCxcbiAgc3k6IG51bWJlciA9IDAsXG4gIHN3OiBudW1iZXIgPSBzb3VyY2Uud2lkdGgsXG4gIHNoOiBudW1iZXIgPSBzb3VyY2UuaGVpZ2h0LFxuICBtYXNrOiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGwsXG4gIG1hc2tUeXBlOiBNYXNrVHlwZSA9IE1hc2tUeXBlLkJJTkFSWSxcbik6IHZvaWQge1xuICBjb25zdCBkc3RXID0gdGFyZ2V0LndpZHRoXG4gIGNvbnN0IGRzdEggPSB0YXJnZXQuaGVpZ2h0XG4gIGNvbnN0IGRzdERhdGEgPSB0YXJnZXQuZGF0YVxuICBjb25zdCBzcmNXID0gc291cmNlLndpZHRoXG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsIHksIHN4LCBzeSwgc3csIHNoLFxuICAgIGRzdFcsIGRzdEgsIHNyY1csIHNvdXJjZS5oZWlnaHQsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IHVzZU1hc2sgPSAhIW1hc2tcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50RHN0WSA9IGRzdFkgKyByb3dcbiAgICBjb25zdCBjdXJyZW50U3JjWSA9IHNyY1kgKyByb3dcblxuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGN1cnJlbnREc3RZICogZHN0VyArIGRzdFgpICogNFxuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKGN1cnJlbnRTcmNZICogc3JjVyArIHNyY1gpICogNFxuXG4gICAgaWYgKHVzZU1hc2sgJiYgbWFzaykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGNvcHlXOyBpeCsrKSB7XG4gICAgICAgIGNvbnN0IG1pID0gY3VycmVudFNyY1kgKiBzcmNXICsgKHNyY1ggKyBpeClcbiAgICAgICAgY29uc3QgYWxwaGEgPSBtYXNrW21pXVxuXG4gICAgICAgIGlmIChhbHBoYSA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaSA9IGRzdFN0YXJ0ICsgKGl4ICogNClcbiAgICAgICAgY29uc3Qgc2kgPSBzcmNTdGFydCArIChpeCAqIDQpXG5cbiAgICAgICAgaWYgKG1hc2tUeXBlID09PSBNYXNrVHlwZS5CSU5BUlkgfHwgYWxwaGEgPT09IDI1NSkge1xuICAgICAgICAgIGRzdERhdGFbZGldID0gc3JjRGF0YVtzaV1cbiAgICAgICAgICBkc3REYXRhW2RpICsgMV0gPSBzcmNEYXRhW3NpICsgMV1cbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl1cbiAgICAgICAgICBkc3REYXRhW2RpICsgM10gPSBzcmNEYXRhW3NpICsgM11cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhID0gYWxwaGEgLyAyNTVcbiAgICAgICAgICBjb25zdCBpbnZBID0gMSAtIGFcblxuICAgICAgICAgIGRzdERhdGFbZGldID0gc3JjRGF0YVtzaV0gKiBhICsgZHN0RGF0YVtkaV0gKiBpbnZBXG4gICAgICAgICAgZHN0RGF0YVtkaSArIDFdID0gc3JjRGF0YVtzaSArIDFdICogYSArIGRzdERhdGFbZGkgKyAxXSAqIGludkFcbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl0gKiBhICsgZHN0RGF0YVtkaSArIDJdICogaW52QVxuICAgICAgICAgIGRzdERhdGFbZGkgKyAzXSA9IHNyY0RhdGFbc2kgKyAzXSAqIGEgKyBkc3REYXRhW2RpICsgM10gKiBpbnZBXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnl0ZUxlbiA9IGNvcHlXICogNFxuICAgICAgY29uc3Qgc3ViID0gc3JjRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBieXRlTGVuKVxuICAgICAgZHN0RGF0YS5zZXQoc3ViLCBkc3RTdGFydClcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param imageData - The target {@link ImageData} to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A {@link Rect} object defining the destination region.\n */\nexport function writeImageDataBuffer(imageData: ImageData, data: Uint8ClampedArray, rect: Rect): void;\n/**\n * @param imageData - The target {@link ImageData} to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(imageData: ImageData, data: Uint8ClampedArray, x: number, y: number, w: number, h: number): void;\nexport function writeImageDataBuffer(imageData: ImageData, data: Uint8ClampedArray, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const {\n width: dstW,\n height: dstH,\n data: dst\n } = imageData;\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const dstStart = ((dstY + row) * dstW + dstX) * 4;\n const srcStart = ((srcY + row) * w + srcX) * 4;\n dst.set(data.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIENvcGllcyBhIHBpeGVsIGJ1ZmZlciBpbnRvIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGlyZWN0IG1lbW9yeSBjb3B5IGZyb20gYSB7QGxpbmsgVWludDhDbGFtcGVkQXJyYXl9XG4gKiBpbnRvIHRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gYnVmZmVyLiBJdCBzdXBwb3J0cyBib3RoIHtAbGluayBSZWN0fVxuICogb2JqZWN0cyBhbmQgZGlzY3JldGUgY29vcmRpbmF0ZXMuXG4gKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gdG8gd3JpdGUgaW50by4gTXVzdCBtYXRjaCB0aGUgcmVjdCB3aWR0aC9oZWlnaHQuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBzb3VyY2UgcGl4ZWwgZGF0YSAoUkdCQSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEge0BsaW5rIFJlY3R9IG9iamVjdCBkZWZpbmluZyB0aGUgZGVzdGluYXRpb24gcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIoXG4gIGltYWdlRGF0YTogSW1hZ2VEYXRhLFxuICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbi8qKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gdG8gd3JpdGUgaW50by5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHNvdXJjZSBwaXhlbCBkYXRhIChSR0JBKS4gTXVzdCBtYXRjaCB0aGUgd2lkdGgvaGVpZ2h0LlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIHdyaXRlLlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gd3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YUJ1ZmZlcihcbiAgaW1hZ2VEYXRhOiBJbWFnZURhdGEsXG4gIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgdzogbnVtYmVyLFxuICBoOiBudW1iZXIsXG4pOiB2b2lkXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIoXG4gIGltYWdlRGF0YTogSW1hZ2VEYXRhLFxuICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgX3g6IFJlY3QgfCBudW1iZXIsXG4gIF95PzogbnVtYmVyLFxuICBfdz86IG51bWJlcixcbiAgX2g/OiBudW1iZXIsXG4pOiB2b2lkIHtcbiAgY29uc3QgeyB4LCB5LCB3LCBoIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnXG4gICAgPyBfeFxuICAgIDogeyB4OiBfeCwgeTogX3khLCB3OiBfdyEsIGg6IF9oISB9XG5cbiAgY29uc3QgeyB3aWR0aDogZHN0VywgaGVpZ2h0OiBkc3RILCBkYXRhOiBkc3QgfSA9IGltYWdlRGF0YVxuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICAwLFxuICAgIDAsXG4gICAgdyxcbiAgICBoLFxuICAgIGRzdFcsXG4gICAgZHN0SCxcbiAgICB3LFxuICAgIGgsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGNvbnN0IHJvd0xlbiA9IGNvcHlXICogNFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKChkc3RZICsgcm93KSAqIGRzdFcgKyBkc3RYKSAqIDRcbiAgICBjb25zdCBzcmNTdGFydCA9ICgoc3JjWSArIHJvdykgKiB3ICsgc3JjWCkgKiA0XG5cbiAgICBkc3Quc2V0KGRhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgcm93TGVuKSwgZHN0U3RhcnQpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Calculates the frequency of each palette index based on the image data.\n * The index of the returned array maps directly to the index of the palette.\n * @param indexedImage - The source image containing data and palette definitions.\n * @returns A typed array where each entry represents the total count of that palette index.\n */\nexport function getIndexedImageColorCounts(indexedImage: IndexedImage): Int32Array {\n const data = indexedImage.data;\n const palette = indexedImage.palette;\n const frequencies = new Int32Array(palette.length);\n for (let i = 0; i < data.length; i++) {\n const colorIndex = data[i]!;\n frequencies[colorIndex]++;\n }\n return frequencies;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmRleGVkSW1hZ2UgfSBmcm9tICcuL0luZGV4ZWRJbWFnZS50cydcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBmcmVxdWVuY3kgb2YgZWFjaCBwYWxldHRlIGluZGV4IGJhc2VkIG9uIHRoZSBpbWFnZSBkYXRhLlxuICogVGhlIGluZGV4IG9mIHRoZSByZXR1cm5lZCBhcnJheSBtYXBzIGRpcmVjdGx5IHRvIHRoZSBpbmRleCBvZiB0aGUgcGFsZXR0ZS5cbiAqIEBwYXJhbSBpbmRleGVkSW1hZ2UgLSBUaGUgc291cmNlIGltYWdlIGNvbnRhaW5pbmcgZGF0YSBhbmQgcGFsZXR0ZSBkZWZpbml0aW9ucy5cbiAqIEByZXR1cm5zIEEgdHlwZWQgYXJyYXkgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIHRoZSB0b3RhbCBjb3VudCBvZiB0aGF0IHBhbGV0dGUgaW5kZXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmRleGVkSW1hZ2VDb2xvckNvdW50cyhpbmRleGVkSW1hZ2U6IEluZGV4ZWRJbWFnZSk6IEludDMyQXJyYXkge1xuICBjb25zdCBkYXRhID0gaW5kZXhlZEltYWdlLmRhdGFcbiAgY29uc3QgcGFsZXR0ZSA9IGluZGV4ZWRJbWFnZS5wYWxldHRlXG4gIGNvbnN0IGZyZXF1ZW5jaWVzID0gbmV3IEludDMyQXJyYXkocGFsZXR0ZS5sZW5ndGgpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY29sb3JJbmRleCA9IGRhdGFbaV0hXG4gICAgZnJlcXVlbmNpZXNbY29sb3JJbmRleF0rK1xuICB9XG5cbiAgcmV0dXJuIGZyZXF1ZW5jaWVzXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\n\n/**\n * Represents an image using a palette-based indexing system.\n * Instead of storing 4 bytes (RGBA) per pixel, this class stores a single index\n * into a color palette. This format is optimized for memory efficiency and\n * high-speed pattern matching or recoloring operations.\n */\nexport class IndexedImage {\n /** The width of the image in pixels. */\n public readonly width: number;\n /** The height of the image in pixels. */\n public readonly height: number;\n /** Flat array of palette indices. Index = x + (y * width). */\n public readonly data: Int32Array;\n /** The palette of unique 32-bit colors (ABGR/RGBA packed) found in the image. */\n public readonly palette: Uint32Array;\n /** The specific index in the palette reserved for fully transparent pixels. */\n public readonly transparentPalletIndex: number;\n\n /**\n * @param width - Image width.\n * @param height - Image height.\n * @param data - The indexed pixel data.\n * @param palette - The array of packed colors.\n * @param transparentPalletIndex - The index representing alpha 0.\n */\n constructor(width: number, height: number, data: Int32Array, palette: Uint32Array, transparentPalletIndex: number) {\n this.width = width;\n this.height = height;\n this.data = data;\n this.palette = palette;\n this.transparentPalletIndex = transparentPalletIndex;\n }\n\n /**\n * Creates an IndexedImage from standard browser ImageData.\n * @param imageData - The source ImageData to convert.\n * @returns A new IndexedImage instance.\n */\n static fromImageData(imageData: ImageData): IndexedImage {\n return IndexedImage.fromRaw(imageData.data, imageData.width, imageData.height);\n }\n\n /**\n * Creates an IndexedImage from a raw byte buffer and dimensions.\n * Any pixel with an alpha channel of 0 is normalized to the transparent palette index.\n * @param data - Raw RGBA byte data.\n * @param width - Image width.\n * @param height - Image height.\n * @returns A new IndexedImage instance.\n */\n static fromRaw(data: Uint8ClampedArray, width: number, height: number): IndexedImage {\n const buffer = data.buffer;\n const rawData = new Uint32Array(buffer);\n const indexedData = new Int32Array(rawData.length);\n const colorMap = new Map<number, number>();\n const transparentColor = 0;\n const transparentPalletIndex = 0;\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex);\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number;\n const alpha = pixel >>> 24 & 0xFF;\n const isTransparent = alpha === 0;\n const colorKey = isTransparent ? transparentColor : pixel >>> 0;\n let id = colorMap.get(colorKey);\n if (id === undefined) {\n id = colorMap.size;\n colorMap.set(colorKey, id);\n }\n indexedData[i] = id;\n }\n const palette = Uint32Array.from(colorMap.keys());\n return new IndexedImage(width, height, indexedData, palette, transparentPalletIndex);\n }\n\n /**\n * Retrieves the 32-bit packed color value at the given coordinates.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @returns The packed color from the palette.\n */\n public getColorAt(x: number, y: number): Color32 {\n const index = x + y * this.width;\n const paletteIndex = this.data[index];\n return this.palette[paletteIndex] as Color32;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1hZ2UgdXNpbmcgYSBwYWxldHRlLWJhc2VkIGluZGV4aW5nIHN5c3RlbS5cbiAqIEluc3RlYWQgb2Ygc3RvcmluZyA0IGJ5dGVzIChSR0JBKSBwZXIgcGl4ZWwsIHRoaXMgY2xhc3Mgc3RvcmVzIGEgc2luZ2xlIGluZGV4XG4gKiBpbnRvIGEgY29sb3IgcGFsZXR0ZS4gVGhpcyBmb3JtYXQgaXMgb3B0aW1pemVkIGZvciBtZW1vcnkgZWZmaWNpZW5jeSBhbmRcbiAqIGhpZ2gtc3BlZWQgcGF0dGVybiBtYXRjaGluZyBvciByZWNvbG9yaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleGVkSW1hZ2Uge1xuICAvKiogVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSB3aWR0aDogbnVtYmVyXG4gIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSBoZWlnaHQ6IG51bWJlclxuICAvKiogRmxhdCBhcnJheSBvZiBwYWxldHRlIGluZGljZXMuIEluZGV4ID0geCArICh5ICogd2lkdGgpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YTogSW50MzJBcnJheVxuICAvKiogVGhlIHBhbGV0dGUgb2YgdW5pcXVlIDMyLWJpdCBjb2xvcnMgKEFCR1IvUkdCQSBwYWNrZWQpIGZvdW5kIGluIHRoZSBpbWFnZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhbGV0dGU6IFVpbnQzMkFycmF5XG4gIC8qKiBUaGUgc3BlY2lmaWMgaW5kZXggaW4gdGhlIHBhbGV0dGUgcmVzZXJ2ZWQgZm9yIGZ1bGx5IHRyYW5zcGFyZW50IHBpeGVscy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYW5zcGFyZW50UGFsbGV0SW5kZXg6IG51bWJlclxuXG4gIC8qKlxuICAgKiBAcGFyYW0gd2lkdGggLSBJbWFnZSB3aWR0aC5cbiAgICogQHBhcmFtIGhlaWdodCAtIEltYWdlIGhlaWdodC5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5kZXhlZCBwaXhlbCBkYXRhLlxuICAgKiBAcGFyYW0gcGFsZXR0ZSAtIFRoZSBhcnJheSBvZiBwYWNrZWQgY29sb3JzLlxuICAgKiBAcGFyYW0gdHJhbnNwYXJlbnRQYWxsZXRJbmRleCAtIFRoZSBpbmRleCByZXByZXNlbnRpbmcgYWxwaGEgMC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgZGF0YTogSW50MzJBcnJheSxcbiAgICBwYWxldHRlOiBVaW50MzJBcnJheSxcbiAgICB0cmFuc3BhcmVudFBhbGxldEluZGV4OiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMud2lkdGggPSB3aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIHRoaXMucGFsZXR0ZSA9IHBhbGV0dGVcbiAgICB0aGlzLnRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSB0cmFuc3BhcmVudFBhbGxldEluZGV4XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBJbmRleGVkSW1hZ2UgZnJvbSBzdGFuZGFyZCBicm93c2VyIEltYWdlRGF0YS5cbiAgICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIEEgbmV3IEluZGV4ZWRJbWFnZSBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tSW1hZ2VEYXRhKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogSW5kZXhlZEltYWdlIHtcbiAgICByZXR1cm4gSW5kZXhlZEltYWdlLmZyb21SYXcoaW1hZ2VEYXRhLmRhdGEsIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIEluZGV4ZWRJbWFnZSBmcm9tIGEgcmF3IGJ5dGUgYnVmZmVyIGFuZCBkaW1lbnNpb25zLlxuICAgKiBBbnkgcGl4ZWwgd2l0aCBhbiBhbHBoYSBjaGFubmVsIG9mIDAgaXMgbm9ybWFsaXplZCB0byB0aGUgdHJhbnNwYXJlbnQgcGFsZXR0ZSBpbmRleC5cbiAgICogQHBhcmFtIGRhdGEgLSBSYXcgUkdCQSBieXRlIGRhdGEuXG4gICAqIEBwYXJhbSB3aWR0aCAtIEltYWdlIHdpZHRoLlxuICAgKiBAcGFyYW0gaGVpZ2h0IC0gSW1hZ2UgaGVpZ2h0LlxuICAgKiBAcmV0dXJucyBBIG5ldyBJbmRleGVkSW1hZ2UgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgZnJvbVJhdyhcbiAgICBkYXRhOiBVaW50OENsYW1wZWRBcnJheSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApOiBJbmRleGVkSW1hZ2Uge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGRhdGEuYnVmZmVyXG4gICAgY29uc3QgcmF3RGF0YSA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpXG4gICAgY29uc3QgaW5kZXhlZERhdGEgPSBuZXcgSW50MzJBcnJheShyYXdEYXRhLmxlbmd0aClcbiAgICBjb25zdCBjb2xvck1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KClcbiAgICBjb25zdCB0cmFuc3BhcmVudENvbG9yID0gMFxuICAgIGNvbnN0IHRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSAwXG5cbiAgICAvLyBJbml0aWFsaXplIHBhbGV0dGUgd2l0aCBub3JtYWxpemVkIHRyYW5zcGFyZW50IGNvbG9yXG4gICAgY29sb3JNYXAuc2V0KHRyYW5zcGFyZW50Q29sb3IsIHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBpeGVsID0gcmF3RGF0YVtpXSBhcyBudW1iZXJcbiAgICAgIGNvbnN0IGFscGhhID0gKHBpeGVsID4+PiAyNCkgJiAweEZGXG4gICAgICBjb25zdCBpc1RyYW5zcGFyZW50ID0gYWxwaGEgPT09IDBcbiAgICAgIGNvbnN0IGNvbG9yS2V5ID0gaXNUcmFuc3BhcmVudCA/IHRyYW5zcGFyZW50Q29sb3IgOiAocGl4ZWwgPj4+IDApXG5cbiAgICAgIGxldCBpZCA9IGNvbG9yTWFwLmdldChjb2xvcktleSlcblxuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWQgPSBjb2xvck1hcC5zaXplXG4gICAgICAgIGNvbG9yTWFwLnNldChjb2xvcktleSwgaWQpXG4gICAgICB9XG5cbiAgICAgIGluZGV4ZWREYXRhW2ldID0gaWRcbiAgICB9XG5cbiAgICBjb25zdCBwYWxldHRlID0gVWludDMyQXJyYXkuZnJvbShjb2xvck1hcC5rZXlzKCkpXG5cbiAgICByZXR1cm4gbmV3IEluZGV4ZWRJbWFnZShcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgaW5kZXhlZERhdGEsXG4gICAgICBwYWxldHRlLFxuICAgICAgdHJhbnNwYXJlbnRQYWxsZXRJbmRleCxcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSAzMi1iaXQgcGFja2VkIGNvbG9yIHZhbHVlIGF0IHRoZSBnaXZlbiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHggLSBYIGNvb3JkaW5hdGUuXG4gICAqIEBwYXJhbSB5IC0gWSBjb29yZGluYXRlLlxuICAgKiBAcmV0dXJucyBUaGUgcGFja2VkIGNvbG9yIGZyb20gdGhlIHBhbGV0dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sb3JBdCh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbG9yMzIge1xuICAgIGNvbnN0IGluZGV4ID0geCArIHkgKiB0aGlzLndpZHRoXG4gICAgY29uc3QgcGFsZXR0ZUluZGV4ID0gdGhpcy5kYXRhW2luZGV4XVxuXG4gICAgcmV0dXJuIHRoaXMucGFsZXR0ZVtwYWxldHRlSW5kZXhdIGFzIENvbG9yMzJcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { packColor } from '../color';\n/**\n * Calculates the area-weighted average color of an IndexedImage.\n * This accounts for how often each palette index appears in the pixel data.\n * @param indexedImage - The IndexedImage containing pixel indices and the palette.\n * @param includeTransparent - Whether to include the transparent pixels in the average.\n * @returns The average RGBA color of the image.\n */\nexport function indexedImageToAverageColor(indexedImage: IndexedImage, includeTransparent: boolean = false): Color32 {\n const {\n data,\n palette,\n transparentPalletIndex\n } = indexedImage;\n const counts = new Uint32Array(palette.length);\n\n // Tally occurrences of each index\n for (let i = 0; i < data.length; i++) {\n const id = data[i]!;\n counts[id]!++;\n }\n let rSum = 0;\n let gSum = 0;\n let bSum = 0;\n let aSum = 0;\n let totalWeight = 0;\n for (let id = 0; id < counts.length; id++) {\n const weight = counts[id]!;\n if (weight === 0) {\n continue;\n }\n if (!includeTransparent && id === transparentPalletIndex) {\n continue;\n }\n const color = palette[id]! >>> 0;\n const r = color & 0xFF;\n const g = color >> 8 & 0xFF;\n const b = color >> 16 & 0xFF;\n const a = color >> 24 & 0xFF;\n rSum += r * weight;\n gSum += g * weight;\n bSum += b * weight;\n aSum += a * weight;\n totalWeight += weight;\n }\n if (totalWeight === 0) {\n return packColor(0, 0, 0, 0);\n }\n const r = rSum / totalWeight | 0;\n const g = gSum / totalWeight | 0;\n const b = bSum / totalWeight | 0;\n const a = aSum / totalWeight | 0;\n return packColor(r, g, b, a);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyIH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgcGFja0NvbG9yIH0gZnJvbSAnLi4vY29sb3InXG5pbXBvcnQgdHlwZSB7IEluZGV4ZWRJbWFnZSB9IGZyb20gJy4vSW5kZXhlZEltYWdlJ1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFyZWEtd2VpZ2h0ZWQgYXZlcmFnZSBjb2xvciBvZiBhbiBJbmRleGVkSW1hZ2UuXG4gKiBUaGlzIGFjY291bnRzIGZvciBob3cgb2Z0ZW4gZWFjaCBwYWxldHRlIGluZGV4IGFwcGVhcnMgaW4gdGhlIHBpeGVsIGRhdGEuXG4gKiBAcGFyYW0gaW5kZXhlZEltYWdlIC0gVGhlIEluZGV4ZWRJbWFnZSBjb250YWluaW5nIHBpeGVsIGluZGljZXMgYW5kIHRoZSBwYWxldHRlLlxuICogQHBhcmFtIGluY2x1ZGVUcmFuc3BhcmVudCAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIHRoZSBhdmVyYWdlLlxuICogQHJldHVybnMgVGhlIGF2ZXJhZ2UgUkdCQSBjb2xvciBvZiB0aGUgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleGVkSW1hZ2VUb0F2ZXJhZ2VDb2xvcihcbiAgaW5kZXhlZEltYWdlOiBJbmRleGVkSW1hZ2UsXG4gIGluY2x1ZGVUcmFuc3BhcmVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogQ29sb3IzMiB7XG4gIGNvbnN0IHsgZGF0YSwgcGFsZXR0ZSwgdHJhbnNwYXJlbnRQYWxsZXRJbmRleCB9ID0gaW5kZXhlZEltYWdlXG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShwYWxldHRlLmxlbmd0aClcblxuICAvLyBUYWxseSBvY2N1cnJlbmNlcyBvZiBlYWNoIGluZGV4XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlkID0gZGF0YVtpXSFcbiAgICBjb3VudHNbaWRdISsrXG4gIH1cblxuICBsZXQgclN1bSA9IDBcbiAgbGV0IGdTdW0gPSAwXG4gIGxldCBiU3VtID0gMFxuICBsZXQgYVN1bSA9IDBcbiAgbGV0IHRvdGFsV2VpZ2h0ID0gMFxuXG4gIGZvciAobGV0IGlkID0gMDsgaWQgPCBjb3VudHMubGVuZ3RoOyBpZCsrKSB7XG4gICAgY29uc3Qgd2VpZ2h0ID0gY291bnRzW2lkXSFcblxuICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKCFpbmNsdWRlVHJhbnNwYXJlbnQgJiYgaWQgPT09IHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgY29sb3IgPSBwYWxldHRlW2lkXSEgPj4+IDBcblxuICAgIGNvbnN0IHIgPSBjb2xvciAmIDB4RkZcbiAgICBjb25zdCBnID0gKGNvbG9yID4+IDgpICYgMHhGRlxuICAgIGNvbnN0IGIgPSAoY29sb3IgPj4gMTYpICYgMHhGRlxuICAgIGNvbnN0IGEgPSAoY29sb3IgPj4gMjQpICYgMHhGRlxuXG4gICAgclN1bSArPSByICogd2VpZ2h0XG4gICAgZ1N1bSArPSBnICogd2VpZ2h0XG4gICAgYlN1bSArPSBiICogd2VpZ2h0XG4gICAgYVN1bSArPSBhICogd2VpZ2h0XG4gICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0XG4gIH1cblxuICBpZiAodG90YWxXZWlnaHQgPT09IDApIHtcbiAgICByZXR1cm4gcGFja0NvbG9yKDAsIDAsIDAsIDApXG4gIH1cblxuICBjb25zdCByID0gKHJTdW0gLyB0b3RhbFdlaWdodCkgfCAwXG4gIGNvbnN0IGcgPSAoZ1N1bSAvIHRvdGFsV2VpZ2h0KSB8IDBcbiAgY29uc3QgYiA9IChiU3VtIC8gdG90YWxXZWlnaHQpIHwgMFxuICBjb25zdCBhID0gKGFTdW0gLyB0b3RhbFdlaWdodCkgfCAwXG5cbiAgcmV0dXJuIHBhY2tDb2xvcihyLCBnLCBiLCBhKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const {\n width,\n height,\n data,\n palette\n } = indexedImage;\n const result = new ImageData(width, height);\n const data32 = new Uint32Array(result.data.buffer);\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i];\n const color = palette[paletteIndex];\n data32[i] = color;\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbmRleGVkSW1hZ2UgfSBmcm9tICcuL0luZGV4ZWRJbWFnZSdcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBJbmRleGVkSW1hZ2UgYmFjayBpbnRvIHN0YW5kYXJkIEltYWdlRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZGV4ZWRJbWFnZVRvSW1hZ2VEYXRhKGluZGV4ZWRJbWFnZTogSW5kZXhlZEltYWdlKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkYXRhLCBwYWxldHRlIH0gPSBpbmRleGVkSW1hZ2VcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KVxuICBjb25zdCBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEuYnVmZmVyKVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBhbGV0dGVJbmRleCA9IGRhdGFbaV1cbiAgICBjb25zdCBjb2xvciA9IHBhbGV0dGVbcGFsZXR0ZUluZGV4XVxuXG4gICAgZGF0YTMyW2ldID0gY29sb3JcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { IndexedImage } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleIndexedImage(source: IndexedImage, factor: number): IndexedImage {\n const {\n data,\n width,\n height\n } = resample32(source.data, source.width, source.height, factor);\n return new IndexedImage(width, height, data, source.palette, source.transparentPalletIndex);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNhbXBsZXMgYW4gSW5kZXhlZEltYWdlIGJ5IGEgc3BlY2lmaWMgZmFjdG9yIHVzaW5nIG5lYXJlc3QgbmVpZ2hib3JcbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuaW1wb3J0IHsgSW5kZXhlZEltYWdlIH0gZnJvbSAnLi4vaW5kZXgnXG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMidcblxuLyoqXG4gKiBSZXNhbXBsZXMgYW4gSW5kZXhlZEltYWdlIGJ5IGEgc3BlY2lmaWMgZmFjdG9yIHVzaW5nIG5lYXJlc3QgbmVpZ2hib3JcbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlSW5kZXhlZEltYWdlKFxuICBzb3VyY2U6IEluZGV4ZWRJbWFnZSxcbiAgZmFjdG9yOiBudW1iZXIsXG4pOiBJbmRleGVkSW1hZ2Uge1xuXG4gIGNvbnN0IHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9ID0gcmVzYW1wbGUzMihcbiAgICBzb3VyY2UuZGF0YSxcbiAgICBzb3VyY2Uud2lkdGgsXG4gICAgc291cmNlLmhlaWdodCxcbiAgICBmYWN0b3IsXG4gIClcblxuICByZXR1cm4gbmV3IEluZGV4ZWRJbWFnZShcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZGF0YSxcbiAgICBzb3VyY2UucGFsZXR0ZSxcbiAgICBzb3VyY2UudHJhbnNwYXJlbnRQYWxsZXRJbmRleCxcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { fileToImageData } from '../../src';\n\n/**\n * A convenience wrapper that extracts the first {@link File} from an\n * {@link HTMLInputElement} change event and converts it into {@link ImageData}.\n *\n * This function handles the boilerplate of accessing the file list and checking\n * for existence. It is ideal for use directly in an `onchange` event listener.\n *\n * @param event - The change {@link Event} from an `<input type=\"file\">` element.\n *\n * @returns A promise that resolves to {@link ImageData} if a file was successfully\n * processed, or `null` if no file was selected or the input was cleared.\n *\n * @example\n * ```typescript\n * const input = document.querySelector('input[type=\"file\"]');\n *\n * input.addEventListener('change', async (event) => {\n * const imageData = await fileInputChangeToImageData(event);\n *\n * if (imageData) {\n * console.log('Image loaded:', imageData.width, imageData.height);\n * }\n * });\n * ```\n */\nexport async function fileInputChangeToImageData(event: Event): Promise<ImageData | null> {\n const target = event.target as HTMLInputElement;\n const file = target.files?.[0];\n if (!file) return null;\n return await fileToImageData(file);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZmlsZVRvSW1hZ2VEYXRhIH0gZnJvbSAnLi4vLi4vc3JjJ1xuXG4vKipcbiAqIEEgY29udmVuaWVuY2Ugd3JhcHBlciB0aGF0IGV4dHJhY3RzIHRoZSBmaXJzdCB7QGxpbmsgRmlsZX0gZnJvbSBhblxuICoge0BsaW5rIEhUTUxJbnB1dEVsZW1lbnR9IGNoYW5nZSBldmVudCBhbmQgY29udmVydHMgaXQgaW50byB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGJvaWxlcnBsYXRlIG9mIGFjY2Vzc2luZyB0aGUgZmlsZSBsaXN0IGFuZCBjaGVja2luZ1xuICogZm9yIGV4aXN0ZW5jZS4gSXQgaXMgaWRlYWwgZm9yIHVzZSBkaXJlY3RseSBpbiBhbiBgb25jaGFuZ2VgIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFRoZSBjaGFuZ2Uge0BsaW5rIEV2ZW50fSBmcm9tIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIEltYWdlRGF0YX0gaWYgYSBmaWxlIHdhcyBzdWNjZXNzZnVsbHlcbiAqIHByb2Nlc3NlZCwgb3IgYG51bGxgIGlmIG5vIGZpbGUgd2FzIHNlbGVjdGVkIG9yIHRoZSBpbnB1dCB3YXMgY2xlYXJlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xuICpcbiAqIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChldmVudCkgPT4ge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YShldmVudCk7XG4gKlxuICogICBpZiAoaW1hZ2VEYXRhKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0ltYWdlIGxvYWRlZDonLCBpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQpO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZUlucHV0Q2hhbmdlVG9JbWFnZURhdGEoXG4gIGV2ZW50OiBFdmVudCxcbik6IFByb21pc2U8SW1hZ2VEYXRhIHwgbnVsbD4ge1xuICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuXG4gIGNvbnN0IGZpbGUgPSB0YXJnZXQuZmlsZXM/LlswXVxuICBpZiAoIWZpbGUpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIGF3YWl0IGZpbGVUb0ltYWdlRGF0YShmaWxlKVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { OFFSCREEN_CANVAS_CTX_FAILED } from '../Canvas/_constants';\n\n/**\n * Thrown when the user provides a file that isn't an image.\n */\nexport class UnsupportedFormatError extends Error {\n constructor(mimeType: string) {\n super(`File type ${mimeType} is not a supported image format.`);\n this.name = 'UnsupportedFormatError';\n }\n}\n\n/**\n * Converts a browser {@link File} object into {@link ImageData}.\n * This utility handles the full pipeline of image decoding using hardware-accelerated\n * APIs {@link createImageBitmap} and {@link OffscreenCanvas}. It ensures that underlying\n * resources like `ImageBitmap` are properly closed even if the conversion fails.\n *\n * @param file - The image file to convert. Can be null or undefined.\n * @returns A `Promise` resolving to the pixel data as {@link ImageData},\n * or `null` if no file was provided.\n * @throws {@link UnsupportedFormatError}\n * Thrown if the provided file's MIME type does not start with `image/`.\n * @example\n * ```typescript\n * try {\n * const imageData = await fileToImageData(file);\n * if (imageData) {\n * console.log('Pixels:', imageData.data);\n * }\n * } catch (err) {\n * if (err instanceof UnsupportedFormatError) {\n * // Handle bad file type\n * }\n * }\n * ```\n */\nexport async function fileToImageData(file: File | null | undefined): Promise<ImageData | null> {\n if (!file) return null;\n if (!file.type.startsWith('image/')) {\n throw new UnsupportedFormatError(file.type);\n }\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(file);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(OFFSCREEN_CANVAS_CTX_FAILED);\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEIH0gZnJvbSAnLi4vQ2FudmFzL19jb25zdGFudHMnXG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHVzZXIgcHJvdmlkZXMgYSBmaWxlIHRoYXQgaXNuJ3QgYW4gaW1hZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnN1cHBvcnRlZEZvcm1hdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtaW1lVHlwZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYEZpbGUgdHlwZSAke21pbWVUeXBlfSBpcyBub3QgYSBzdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0LmApXG4gICAgdGhpcy5uYW1lID0gJ1Vuc3VwcG9ydGVkRm9ybWF0RXJyb3InXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJyb3dzZXIge0BsaW5rIEZpbGV9IG9iamVjdCBpbnRvIHtAbGluayBJbWFnZURhdGF9LlxuICogVGhpcyB1dGlsaXR5IGhhbmRsZXMgdGhlIGZ1bGwgcGlwZWxpbmUgb2YgaW1hZ2UgZGVjb2RpbmcgdXNpbmcgaGFyZHdhcmUtYWNjZWxlcmF0ZWRcbiAqIEFQSXMge0BsaW5rIGNyZWF0ZUltYWdlQml0bWFwfSBhbmQge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30uIEl0IGVuc3VyZXMgdGhhdCB1bmRlcmx5aW5nXG4gKiByZXNvdXJjZXMgbGlrZSBgSW1hZ2VCaXRtYXBgIGFyZSBwcm9wZXJseSBjbG9zZWQgZXZlbiBpZiB0aGUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBpbWFnZSBmaWxlIHRvIGNvbnZlcnQuIENhbiBiZSBudWxsIG9yIHVuZGVmaW5lZC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmluZyB0byB0aGUgcGl4ZWwgZGF0YSBhcyB7QGxpbmsgSW1hZ2VEYXRhfSxcbiAqIG9yIGBudWxsYCBpZiBubyBmaWxlIHdhcyBwcm92aWRlZC5cbiAqIEB0aHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkRm9ybWF0RXJyb3J9XG4gKiBUaHJvd24gaWYgdGhlIHByb3ZpZGVkIGZpbGUncyBNSU1FIHR5cGUgZG9lcyBub3Qgc3RhcnQgd2l0aCBgaW1hZ2UvYC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlVG9JbWFnZURhdGEoZmlsZSk7XG4gKiAgIGlmIChpbWFnZURhdGEpIHtcbiAqICAgICBjb25zb2xlLmxvZygnUGl4ZWxzOicsIGltYWdlRGF0YS5kYXRhKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIGlmIChlcnIgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEZvcm1hdEVycm9yKSB7XG4gKiAgICAgLy8gSGFuZGxlIGJhZCBmaWxlIHR5cGVcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlVG9JbWFnZURhdGEoXG4gIGZpbGU6IEZpbGUgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxJbWFnZURhdGEgfCBudWxsPiB7XG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGxcblxuICBpZiAoIWZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEZvcm1hdEVycm9yKGZpbGUudHlwZSlcbiAgfVxuXG4gIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGxcblxuICB0cnkge1xuICAgIGJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGZpbGUpXG5cbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKFxuICAgICAgYml0bWFwLndpZHRoLFxuICAgICAgYml0bWFwLmhlaWdodCxcbiAgICApXG5cbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEKVxuXG4gICAgY3R4LmRyYXdJbWFnZShcbiAgICAgIGJpdG1hcCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgIClcblxuICAgIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICBiaXRtYXAud2lkdGgsXG4gICAgICBiaXRtYXAuaGVpZ2h0LFxuICAgIClcbiAgfSBmaW5hbGx5IHtcbiAgICBiaXRtYXA/LmNsb3NlKClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","// Cache the Promise to prevent race conditions during initialization\nlet formatsPromise: Promise<string[]> | null = null;\nconst defaultRasterMimes = ['image/png', 'image/jpeg', 'image/webp', 'image/avif', 'image/gif', 'image/bmp'];\n\n/**\n * Probes the browser environment to determine which image MIME types are\n * supported for pixel-level operations.\n * This function performs a one-time check by attempting to convert a\n * {@link OffscreenCanvas} to MIME types. The result is\n * cached to prevent redundant hardware-accelerated operations on\n * subsequent calls.\n * @param rasterMimes List of MIME types to check\n * @default ['image/png',\n * 'image/jpeg',\n * 'image/webp',\n * 'image/avif',\n * 'image/gif',\n * 'image/bmp']\n * @returns A `Promise` resolving to an array of supported MIME\n * types from the `rasterMimes` list.\n * @throws {Error} If the {@link OffscreenCanvas} context cannot be initialized.\n * @example\n * ```typescript\n * const supported = await getSupportedPixelFormats();\n * if (supported.includes('image/avif')) {\n * console.log('High-efficiency formats available');\n * }\n * ```\n */\nexport async function getSupportedPixelFormats(rasterMimes = defaultRasterMimes): Promise<string[]> {\n if (formatsPromise) {\n return formatsPromise;\n }\n const probeCanvas = async () => {\n const canvas = new OffscreenCanvas(1, 1);\n const results = await Promise.all(rasterMimes.map(async mime => {\n try {\n const blob = await canvas.convertToBlob({\n type: mime\n });\n return blob.type === mime ? mime : null;\n } catch {\n return null;\n }\n }));\n return results.filter((type): type is string => {\n return type !== null;\n });\n };\n\n // By chaining .catch here, the microtask guarantees formatsPromise\n // is assigned the promise BEFORE the catch block runs to reset it.\n formatsPromise = probeCanvas().catch(error => {\n formatsPromise = null;\n throw error;\n });\n return formatsPromise;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ2FjaGUgdGhlIFByb21pc2UgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIGluaXRpYWxpemF0aW9uXG5sZXQgZm9ybWF0c1Byb21pc2U6IFByb21pc2U8c3RyaW5nW10+IHwgbnVsbCA9IG51bGxcblxuY29uc3QgZGVmYXVsdFJhc3Rlck1pbWVzID0gW1xuICAnaW1hZ2UvcG5nJyxcbiAgJ2ltYWdlL2pwZWcnLFxuICAnaW1hZ2Uvd2VicCcsXG4gICdpbWFnZS9hdmlmJyxcbiAgJ2ltYWdlL2dpZicsXG4gICdpbWFnZS9ibXAnLFxuXVxuXG4vKipcbiAqIFByb2JlcyB0aGUgYnJvd3NlciBlbnZpcm9ubWVudCB0byBkZXRlcm1pbmUgd2hpY2ggaW1hZ2UgTUlNRSB0eXBlcyBhcmVcbiAqIHN1cHBvcnRlZCBmb3IgcGl4ZWwtbGV2ZWwgb3BlcmF0aW9ucy5cbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBvbmUtdGltZSBjaGVjayBieSBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgYVxuICoge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30gdG8gTUlNRSB0eXBlcy4gVGhlIHJlc3VsdCBpc1xuICogY2FjaGVkIHRvIHByZXZlbnQgcmVkdW5kYW50IGhhcmR3YXJlLWFjY2VsZXJhdGVkIG9wZXJhdGlvbnMgb25cbiAqIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBAcGFyYW0gcmFzdGVyTWltZXMgTGlzdCBvZiBNSU1FIHR5cGVzIHRvIGNoZWNrXG4gKiBAZGVmYXVsdCBbJ2ltYWdlL3BuZycsXG4gKiAgICdpbWFnZS9qcGVnJyxcbiAqICAgJ2ltYWdlL3dlYnAnLFxuICogICAnaW1hZ2UvYXZpZicsXG4gKiAgICdpbWFnZS9naWYnLFxuICogICAnaW1hZ2UvYm1wJ11cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmluZyB0byBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgTUlNRVxuICogdHlwZXMgZnJvbSB0aGUgYHJhc3Rlck1pbWVzYCBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSB7QGxpbmsgT2Zmc2NyZWVuQ2FudmFzfSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdXBwb3J0ZWQgPSBhd2FpdCBnZXRTdXBwb3J0ZWRQaXhlbEZvcm1hdHMoKTtcbiAqIGlmIChzdXBwb3J0ZWQuaW5jbHVkZXMoJ2ltYWdlL2F2aWYnKSkge1xuICogICBjb25zb2xlLmxvZygnSGlnaC1lZmZpY2llbmN5IGZvcm1hdHMgYXZhaWxhYmxlJyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN1cHBvcnRlZFBpeGVsRm9ybWF0cyhyYXN0ZXJNaW1lcyA9IGRlZmF1bHRSYXN0ZXJNaW1lcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKGZvcm1hdHNQcm9taXNlKSB7XG4gICAgcmV0dXJuIGZvcm1hdHNQcm9taXNlXG4gIH1cblxuICBjb25zdCBwcm9iZUNhbnZhcyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpXG5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICByYXN0ZXJNaW1lcy5tYXAoYXN5bmMgKG1pbWUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgY2FudmFzLmNvbnZlcnRUb0Jsb2Ioe1xuICAgICAgICAgICAgdHlwZTogbWltZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgcmV0dXJuIGJsb2IudHlwZSA9PT0gbWltZSA/IG1pbWUgOiBudWxsXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigodHlwZSk6IHR5cGUgaXMgc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiB0eXBlICE9PSBudWxsXG4gICAgfSlcbiAgfVxuXG4gIC8vIEJ5IGNoYWluaW5nIC5jYXRjaCBoZXJlLCB0aGUgbWljcm90YXNrIGd1YXJhbnRlZXMgZm9ybWF0c1Byb21pc2VcbiAgLy8gaXMgYXNzaWduZWQgdGhlIHByb21pc2UgQkVGT1JFIHRoZSBjYXRjaCBibG9jayBydW5zIHRvIHJlc2V0IGl0LlxuICBmb3JtYXRzUHJvbWlzZSA9IHByb2JlQ2FudmFzKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgZm9ybWF0c1Byb21pc2UgPSBudWxsXG5cbiAgICB0aHJvdyBlcnJvclxuICB9KVxuXG4gIHJldHVybiBmb3JtYXRzUHJvbWlzZVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function applyBinaryMaskToAlphaMask(alphaMaskDst: AlphaMask, dstWidth: number, binaryMaskSrc: BinaryMask, srcWidth: number, opts: ApplyMaskToPixelDataOptions = {}): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: reqWidth = 0,\n h: reqHeight = 0,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (dstWidth <= 0) return;\n if (binaryMaskSrc.length === 0) return;\n if (srcWidth <= 0) return;\n const dstHeight = alphaMaskDst.length / dstWidth | 0;\n const srcHeight = binaryMaskSrc.length / srcWidth | 0;\n if (dstHeight <= 0) return;\n if (srcHeight <= 0) return;\n const dstX0 = Math.max(0, targetX);\n const dstY0 = Math.max(0, targetY);\n const dstX1 = reqWidth > 0 ? Math.min(dstWidth, targetX + reqWidth) : dstWidth;\n const dstY1 = reqHeight > 0 ? Math.min(dstHeight, targetY + reqHeight) : dstHeight;\n if (dstX0 >= dstX1) return;\n if (dstY0 >= dstY1) return;\n const srcX0 = mx + (dstX0 - targetX);\n const srcY0 = my + (dstY0 - targetY);\n if (srcX0 >= srcWidth) return;\n if (srcY0 >= srcHeight) return;\n if (srcX0 + (dstX1 - dstX0) <= 0) return;\n if (srcY0 + (dstY1 - dstY0) <= 0) return;\n const iterW = Math.min(dstX1 - dstX0, srcWidth - srcX0);\n const iterH = Math.min(dstY1 - dstY0, srcHeight - srcY0);\n let dstIdx = dstY0 * dstWidth + dstX0;\n let srcIdx = srcY0 * srcWidth + srcX0;\n if (invertMask) {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // inverted\n if (binaryMaskSrc[s] !== 0) {\n alphaMaskDst[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n } else {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // If binary mask is empty, clear the alpha pixel.\n if (binaryMaskSrc[s] === 0) {\n alphaMaskDst[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucywgQmluYXJ5TWFzayB9IGZyb20gJy4uL190eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QmluYXJ5TWFza1RvQWxwaGFNYXNrKFxuICBhbHBoYU1hc2tEc3Q6IEFscGhhTWFzayxcbiAgZHN0V2lkdGg6IG51bWJlcixcbiAgYmluYXJ5TWFza1NyYzogQmluYXJ5TWFzayxcbiAgc3JjV2lkdGg6IG51bWJlcixcbiAgb3B0czogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHJlcVdpZHRoID0gMCxcbiAgICBoOiByZXFIZWlnaHQgPSAwLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChkc3RXaWR0aCA8PSAwKSByZXR1cm5cbiAgaWYgKGJpbmFyeU1hc2tTcmMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgaWYgKHNyY1dpZHRoIDw9IDApIHJldHVyblxuXG4gIGNvbnN0IGRzdEhlaWdodCA9IChhbHBoYU1hc2tEc3QubGVuZ3RoIC8gZHN0V2lkdGgpIHwgMFxuICBjb25zdCBzcmNIZWlnaHQgPSAoYmluYXJ5TWFza1NyYy5sZW5ndGggLyBzcmNXaWR0aCkgfCAwXG5cbiAgaWYgKGRzdEhlaWdodCA8PSAwKSByZXR1cm5cbiAgaWYgKHNyY0hlaWdodCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3RYMCA9IE1hdGgubWF4KDAsIHRhcmdldFgpXG4gIGNvbnN0IGRzdFkwID0gTWF0aC5tYXgoMCwgdGFyZ2V0WSlcbiAgY29uc3QgZHN0WDEgPSByZXFXaWR0aCA+IDAgPyBNYXRoLm1pbihkc3RXaWR0aCwgdGFyZ2V0WCArIHJlcVdpZHRoKSA6IGRzdFdpZHRoXG4gIGNvbnN0IGRzdFkxID0gcmVxSGVpZ2h0ID4gMCA/IE1hdGgubWluKGRzdEhlaWdodCwgdGFyZ2V0WSArIHJlcUhlaWdodCkgOiBkc3RIZWlnaHRcblxuICBpZiAoZHN0WDAgPj0gZHN0WDEpIHJldHVyblxuICBpZiAoZHN0WTAgPj0gZHN0WTEpIHJldHVyblxuXG4gIGNvbnN0IHNyY1gwID0gbXggKyAoZHN0WDAgLSB0YXJnZXRYKVxuICBjb25zdCBzcmNZMCA9IG15ICsgKGRzdFkwIC0gdGFyZ2V0WSlcblxuICBpZiAoc3JjWDAgPj0gc3JjV2lkdGgpIHJldHVyblxuICBpZiAoc3JjWTAgPj0gc3JjSGVpZ2h0KSByZXR1cm5cbiAgaWYgKHNyY1gwICsgKGRzdFgxIC0gZHN0WDApIDw9IDApIHJldHVyblxuICBpZiAoc3JjWTAgKyAoZHN0WTEgLSBkc3RZMCkgPD0gMCkgcmV0dXJuXG5cbiAgY29uc3QgaXRlclcgPSBNYXRoLm1pbihkc3RYMSAtIGRzdFgwLCBzcmNXaWR0aCAtIHNyY1gwKVxuICBjb25zdCBpdGVySCA9IE1hdGgubWluKGRzdFkxIC0gZHN0WTAsIHNyY0hlaWdodCAtIHNyY1kwKVxuXG4gIGxldCBkc3RJZHggPSBkc3RZMCAqIGRzdFdpZHRoICsgZHN0WDBcbiAgbGV0IHNyY0lkeCA9IHNyY1kwICogc3JjV2lkdGggKyBzcmNYMFxuXG4gIGlmIChpbnZlcnRNYXNrKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaXRlckg7IHJvdysrKSB7XG4gICAgICBjb25zdCBkc3RFbmQgPSBkc3RJZHggKyBpdGVyV1xuICAgICAgbGV0IGQgPSBkc3RJZHhcbiAgICAgIGxldCBzID0gc3JjSWR4XG5cbiAgICAgIHdoaWxlIChkIDwgZHN0RW5kKSB7XG4gICAgICAgIC8vIGludmVydGVkXG4gICAgICAgIGlmIChiaW5hcnlNYXNrU3JjW3NdICE9PSAwKSB7XG4gICAgICAgICAgYWxwaGFNYXNrRHN0W2RdID0gMFxuICAgICAgICB9XG4gICAgICAgIGQrK1xuICAgICAgICBzKytcbiAgICAgIH1cblxuICAgICAgZHN0SWR4ICs9IGRzdFdpZHRoXG4gICAgICBzcmNJZHggKz0gc3JjV2lkdGhcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaXRlckg7IHJvdysrKSB7XG4gICAgICBjb25zdCBkc3RFbmQgPSBkc3RJZHggKyBpdGVyV1xuICAgICAgbGV0IGQgPSBkc3RJZHhcbiAgICAgIGxldCBzID0gc3JjSWR4XG5cbiAgICAgIHdoaWxlIChkIDwgZHN0RW5kKSB7XG4gICAgICAgIC8vIElmIGJpbmFyeSBtYXNrIGlzIGVtcHR5LCBjbGVhciB0aGUgYWxwaGEgcGl4ZWwuXG4gICAgICAgIGlmIChiaW5hcnlNYXNrU3JjW3NdID09PSAwKSB7XG4gICAgICAgICAgYWxwaGFNYXNrRHN0W2RdID0gMFxuICAgICAgICB9XG4gICAgICAgIGQrK1xuICAgICAgICBzKytcbiAgICAgIH1cblxuICAgICAgZHN0SWR4ICs9IGRzdFdpZHRoXG4gICAgICBzcmNJZHggKz0gc3JjV2lkdGhcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Creates a new copy of a mask.\n * Uses the underlying buffer's slice method for high-performance memory copying.\n */\nexport function copyMask<T extends Uint8Array>(src: T): T {\n // Uint8Array.slice() is highly optimized at the engine level\n return src.slice() as T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGNvcHkgb2YgYSBtYXNrLlxuICogVXNlcyB0aGUgdW5kZXJseWluZyBidWZmZXIncyBzbGljZSBtZXRob2QgZm9yIGhpZ2gtcGVyZm9ybWFuY2UgbWVtb3J5IGNvcHlpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5TWFzazxUIGV4dGVuZHMgVWludDhBcnJheT4oc3JjOiBUKTogVCB7XG4gIC8vIFVpbnQ4QXJyYXkuc2xpY2UoKSBpcyBoaWdobHkgb3B0aW1pemVkIGF0IHRoZSBlbmdpbmUgbGV2ZWxcbiAgcmV0dXJuIHNyYy5zbGljZSgpIGFzIFRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Inverts a BinaryMask in-place.\n */\nexport function invertBinaryMask(dst: BinaryMask): void {\n const len = dst.length;\n for (let i = 0; i < len; i++) {\n dst[i] = dst[i] === 0 ? 1 : 0;\n }\n}\n\n/**\n * Inverts an AlphaMask in-place.\n */\nexport function invertAlphaMask(dst: AlphaMask): void {\n const len = dst.length;\n for (let i = 0; i < len; i++) {\n dst[i] = 255 - dst[i];\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIEJpbmFyeU1hc2sgfSBmcm9tICcuLi9pbmRleCdcblxuLyoqXG4gKiBJbnZlcnRzIGEgQmluYXJ5TWFzayBpbi1wbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVydEJpbmFyeU1hc2soZHN0OiBCaW5hcnlNYXNrKTogdm9pZCB7XG4gIGNvbnN0IGxlbiA9IGRzdC5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgZHN0W2ldID0gZHN0W2ldID09PSAwXG4gICAgICA/IDFcbiAgICAgIDogMFxuICB9XG59XG5cbi8qKlxuICogSW52ZXJ0cyBhbiBBbHBoYU1hc2sgaW4tcGxhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnRBbHBoYU1hc2soZHN0OiBBbHBoYU1hc2spOiB2b2lkIHtcbiAgY29uc3QgbGVuID0gZHN0Lmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBkc3RbaV0gPSAyNTUgLSBkc3RbaV1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Merges 2 alpha masks values are 0-255\n */\nexport function mergeAlphaMasks(dst: AlphaMask, dstWidth: number, src: AlphaMask, srcWidth: number, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n alpha: globalAlpha = 255,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const dstHeight = dst.length / dstWidth | 0;\n const srcHeight = src.length / srcWidth | 0;\n if (width <= 0) return;\n if (height <= 0) return;\n if (globalAlpha === 0) return;\n const startX = Math.max(0, -targetX, -mx);\n const startY = Math.max(0, -targetY, -my);\n const endX = Math.min(width, dstWidth - targetX, srcWidth - mx);\n const endY = Math.min(height, dstHeight - targetY, srcHeight - my);\n if (startX >= endX) return;\n if (startY >= endY) return;\n for (let iy = startY; iy < endY; iy++) {\n const dy = targetY + iy;\n const sy = my + iy;\n let dIdx = dy * dstWidth + targetX + startX;\n let sIdx = sy * srcWidth + mx + startX;\n for (let ix = startX; ix < endX; ix++) {\n const rawM = src[sIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - rawM : rawM;\n let weight = 0;\n if (effectiveM === 0) {\n weight = 0;\n } else if (effectiveM === 255) {\n weight = globalAlpha;\n } else if (globalAlpha === 255) {\n weight = effectiveM;\n } else {\n weight = effectiveM * globalAlpha + 128 >> 8;\n }\n if (weight !== 255) {\n if (weight === 0) {\n dst[dIdx] = 0;\n } else {\n const da = dst[dIdx];\n if (da === 255) {\n dst[dIdx] = weight;\n } else if (da !== 0) {\n dst[dIdx] = da * weight + 128 >> 8;\n }\n }\n }\n sIdx++;\n dIdx++;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcblxuLyoqXG4gKiBNZXJnZXMgMiBhbHBoYSBtYXNrcyB2YWx1ZXMgYXJlIDAtMjU1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFscGhhTWFza3MoXG4gIGRzdDogQWxwaGFNYXNrLFxuICBkc3RXaWR0aDogbnVtYmVyLFxuICBzcmM6IEFscGhhTWFzayxcbiAgc3JjV2lkdGg6IG51bWJlcixcbiAgb3B0czogTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyxcbik6IHZvaWQge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSAwLFxuICAgIGg6IGhlaWdodCA9IDAsXG4gICAgYWxwaGE6IGdsb2JhbEFscGhhID0gMjU1LFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuICBjb25zdCBkc3RIZWlnaHQgPSAoZHN0Lmxlbmd0aCAvIGRzdFdpZHRoKSB8IDBcbiAgY29uc3Qgc3JjSGVpZ2h0ID0gKHNyYy5sZW5ndGggLyBzcmNXaWR0aCkgfCAwXG5cbiAgaWYgKHdpZHRoIDw9IDApIHJldHVyblxuICBpZiAoaGVpZ2h0IDw9IDApIHJldHVyblxuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVyblxuXG4gIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWF4KDAsIC10YXJnZXRYLCAtbXgpXG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KDAsIC10YXJnZXRZLCAtbXkpXG5cbiAgY29uc3QgZW5kWCA9IE1hdGgubWluKHdpZHRoLCBkc3RXaWR0aCAtIHRhcmdldFgsIHNyY1dpZHRoIC0gbXgpXG4gIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihoZWlnaHQsIGRzdEhlaWdodCAtIHRhcmdldFksIHNyY0hlaWdodCAtIG15KVxuXG4gIGlmIChzdGFydFggPj0gZW5kWCkgcmV0dXJuXG4gIGlmIChzdGFydFkgPj0gZW5kWSkgcmV0dXJuXG5cbiAgZm9yIChsZXQgaXkgPSBzdGFydFk7IGl5IDwgZW5kWTsgaXkrKykge1xuICAgIGNvbnN0IGR5ID0gdGFyZ2V0WSArIGl5XG4gICAgY29uc3Qgc3kgPSBteSArIGl5XG5cbiAgICBsZXQgZElkeCA9IGR5ICogZHN0V2lkdGggKyB0YXJnZXRYICsgc3RhcnRYXG4gICAgbGV0IHNJZHggPSBzeSAqIHNyY1dpZHRoICsgbXggKyBzdGFydFhcblxuICAgIGZvciAobGV0IGl4ID0gc3RhcnRYOyBpeCA8IGVuZFg7IGl4KyspIHtcbiAgICAgIGNvbnN0IHJhd00gPSBzcmNbc0lkeF1cbiAgICAgIC8vIFVuaWZpZWQgbG9naWMgYnJhbmNoIGluc2lkZSB0aGUgaG90IHBhdGhcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU0gPSBpbnZlcnRNYXNrID8gMjU1IC0gcmF3TSA6IHJhd01cblxuICAgICAgbGV0IHdlaWdodCA9IDBcblxuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMFxuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGFcbiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQWxwaGEgPT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSAoZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4KSA+PiA4XG4gICAgICB9XG5cbiAgICAgIGlmICh3ZWlnaHQgIT09IDI1NSkge1xuICAgICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgZHN0W2RJZHhdID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRhID0gZHN0W2RJZHhdXG5cbiAgICAgICAgICBpZiAoZGEgPT09IDI1NSkge1xuICAgICAgICAgICAgZHN0W2RJZHhdID0gd2VpZ2h0XG4gICAgICAgICAgfSBlbHNlIGlmIChkYSAhPT0gMCkge1xuICAgICAgICAgICAgZHN0W2RJZHhdID0gKGRhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNJZHgrK1xuICAgICAgZElkeCsrXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function mergeBinaryMasks(dst: BinaryMask, dstWidth: number, src: BinaryMask, srcWidth: number, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (dstWidth <= 0) return;\n if (srcWidth <= 0) return;\n const dstHeight = dst.length / dstWidth | 0;\n const srcHeight = src.length / srcWidth | 0;\n\n // 1. Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dstWidth - x);\n h = Math.min(h, dstHeight - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Source Bounds Clipping (Double Clipping)\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(srcWidth, startX + w);\n const sY1 = Math.min(srcHeight, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 3. Coordinate Alignment\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dStride = dstWidth - finalW;\n const sStride = srcWidth - finalW;\n let dIdx = (y + yShift) * dstWidth + (x + xShift);\n let sIdx = sY0 * srcWidth + sX0;\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = src[sIdx];\n // Determine if the source pixel effectively \"clears\" the destination\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n dst[dIdx] = 0;\n }\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBNZXJnZUFscGhhTWFza3NPcHRpb25zIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlNYXNrcyhcbiAgZHN0OiBCaW5hcnlNYXNrLFxuICBkc3RXaWR0aDogbnVtYmVyLFxuICBzcmM6IEJpbmFyeU1hc2ssXG4gIHNyY1dpZHRoOiBudW1iZXIsXG4gIG9wdHM6IE1lcmdlQWxwaGFNYXNrc09wdGlvbnMsXG4pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gMCxcbiAgICBoOiBoZWlnaHQgPSAwLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuICBpZiAoZHN0V2lkdGggPD0gMCkgcmV0dXJuXG4gIGlmIChzcmNXaWR0aCA8PSAwKSByZXR1cm5cblxuICBjb25zdCBkc3RIZWlnaHQgPSAoZHN0Lmxlbmd0aCAvIGRzdFdpZHRoKSB8IDBcbiAgY29uc3Qgc3JjSGVpZ2h0ID0gKHNyYy5sZW5ndGggLyBzcmNXaWR0aCkgfCAwXG5cbiAgLy8gMS4gRGVzdGluYXRpb24gQ2xpcHBpbmdcbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuXG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geVxuICAgIHkgPSAwXG4gIH1cblxuICB3ID0gTWF0aC5taW4odywgZHN0V2lkdGggLSB4KVxuICBoID0gTWF0aC5taW4oaCwgZHN0SGVpZ2h0IC0geSlcblxuICBpZiAodyA8PSAwKSByZXR1cm5cbiAgaWYgKGggPD0gMCkgcmV0dXJuXG5cbiAgLy8gMi4gU291cmNlIEJvdW5kcyBDbGlwcGluZyAoRG91YmxlIENsaXBwaW5nKVxuICBjb25zdCBzdGFydFggPSBteCArICh4IC0gdGFyZ2V0WClcbiAgY29uc3Qgc3RhcnRZID0gbXkgKyAoeSAtIHRhcmdldFkpXG5cbiAgY29uc3Qgc1gwID0gTWF0aC5tYXgoMCwgc3RhcnRYKVxuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpXG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKHNyY1dpZHRoLCBzdGFydFggKyB3KVxuICBjb25zdCBzWTEgPSBNYXRoLm1pbihzcmNIZWlnaHQsIHN0YXJ0WSArIGgpXG5cbiAgY29uc3QgZmluYWxXID0gc1gxIC0gc1gwXG4gIGNvbnN0IGZpbmFsSCA9IHNZMSAtIHNZMFxuXG4gIGlmIChmaW5hbFcgPD0gMCkgcmV0dXJuXG4gIGlmIChmaW5hbEggPD0gMCkgcmV0dXJuXG5cbiAgLy8gMy4gQ29vcmRpbmF0ZSBBbGlnbm1lbnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYXG4gIGNvbnN0IHlTaGlmdCA9IHNZMCAtIHN0YXJ0WVxuXG4gIGNvbnN0IGRTdHJpZGUgPSBkc3RXaWR0aCAtIGZpbmFsV1xuICBjb25zdCBzU3RyaWRlID0gc3JjV2lkdGggLSBmaW5hbFdcblxuICBsZXQgZElkeCA9ICh5ICsgeVNoaWZ0KSAqIGRzdFdpZHRoICsgKHggKyB4U2hpZnQpXG4gIGxldCBzSWR4ID0gc1kwICogc3JjV2lkdGggKyBzWDBcblxuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgZmluYWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGZpbmFsVzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IHNyY1tzSWR4XVxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzb3VyY2UgcGl4ZWwgZWZmZWN0aXZlbHkgXCJjbGVhcnNcIiB0aGUgZGVzdGluYXRpb25cbiAgICAgIGNvbnN0IGlzTWFza2VkT3V0ID0gaW52ZXJ0TWFzayA/IG1WYWwgIT09IDAgOiBtVmFsID09PSAwXG5cbiAgICAgIGlmIChpc01hc2tlZE91dCkge1xuICAgICAgICBkc3RbZElkeF0gPSAwXG4gICAgICB9XG5cbiAgICAgIGRJZHgrK1xuICAgICAgc0lkeCsrXG4gICAgfVxuXG4gICAgZElkeCArPSBkU3RyaWRlXG4gICAgc0lkeCArPSBzU3RyaWRlXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { ImageDataLike, ImageDataLikeConstructor, IPixelData } from '../_types';\nimport { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array';\nexport class PixelData<T extends ImageDataLike = ImageData> implements IPixelData {\n readonly data32: Uint32Array;\n readonly imageData: T;\n readonly width: number;\n readonly height: number;\n constructor(imageData: T) {\n this.data32 = imageDataToUInt32Array(imageData);\n this.imageData = imageData;\n this.width = imageData.width;\n this.height = imageData.height;\n }\n set(imageData: T): void {\n ;\n (this as any).imageData = imageData;\n (this as any).data32 = imageDataToUInt32Array(imageData);\n (this as any).width = imageData.width;\n (this as any).height = imageData.height;\n }\n\n // should only be used for debug and testing\n copy(): PixelData<T> {\n const data = this.imageData.data;\n const buffer = new Uint8ClampedArray(data);\n const Ctor = this.imageData.constructor;\n const isCtorValid = typeof Ctor === 'function';\n let newImageData: T;\n if (isCtorValid && Ctor !== Object) {\n const ImageConstructor = Ctor as ImageDataLikeConstructor<T>;\n newImageData = new ImageConstructor(buffer, this.width, this.height);\n } else {\n newImageData = {\n width: this.width,\n height: this.height,\n data: buffer\n } as unknown as T;\n }\n return new PixelData<T>(newImageData);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJbWFnZURhdGFMaWtlLCBJbWFnZURhdGFMaWtlQ29uc3RydWN0b3IsIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBpbWFnZURhdGFUb1VJbnQzMkFycmF5IH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvVUludDMyQXJyYXknXG5cbmV4cG9ydCBjbGFzcyBQaXhlbERhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgPSBJbWFnZURhdGE+IGltcGxlbWVudHMgSVBpeGVsRGF0YSB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXlcbiAgcmVhZG9ubHkgaW1hZ2VEYXRhOiBUXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXJcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihpbWFnZURhdGE6IFQpIHtcbiAgICB0aGlzLmRhdGEzMiA9IGltYWdlRGF0YVRvVUludDMyQXJyYXkoaW1hZ2VEYXRhKVxuICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhXG4gICAgdGhpcy53aWR0aCA9IGltYWdlRGF0YS53aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodFxuICB9XG5cbiAgc2V0KGltYWdlRGF0YTogVCk6IHZvaWQge1xuICAgIDsodGhpcyBhcyBhbnkpLmltYWdlRGF0YSA9IGltYWdlRGF0YVxuICAgIDsodGhpcyBhcyBhbnkpLmRhdGEzMiA9IGltYWdlRGF0YVRvVUludDMyQXJyYXkoaW1hZ2VEYXRhKVxuICAgIDsodGhpcyBhcyBhbnkpLndpZHRoID0gaW1hZ2VEYXRhLndpZHRoXG4gICAgOyh0aGlzIGFzIGFueSkuaGVpZ2h0ID0gaW1hZ2VEYXRhLmhlaWdodFxuICB9XG5cbiAgLy8gc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWcgYW5kIHRlc3RpbmdcbiAgY29weSgpOiBQaXhlbERhdGE8VD4ge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmltYWdlRGF0YS5kYXRhXG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEpXG4gICAgY29uc3QgQ3RvciA9IHRoaXMuaW1hZ2VEYXRhLmNvbnN0cnVjdG9yXG4gICAgY29uc3QgaXNDdG9yVmFsaWQgPSB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuXG4gICAgbGV0IG5ld0ltYWdlRGF0YTogVFxuICAgIGlmIChpc0N0b3JWYWxpZCAmJiBDdG9yICE9PSBPYmplY3QpIHtcbiAgICAgIGNvbnN0IEltYWdlQ29uc3RydWN0b3IgPSBDdG9yIGFzIEltYWdlRGF0YUxpa2VDb25zdHJ1Y3RvcjxUPlxuICAgICAgbmV3SW1hZ2VEYXRhID0gbmV3IEltYWdlQ29uc3RydWN0b3IoXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgdGhpcy53aWR0aCxcbiAgICAgICAgdGhpcy5oZWlnaHQsXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0ltYWdlRGF0YSA9IHtcbiAgICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICAgIGRhdGE6IGJ1ZmZlcixcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQaXhlbERhdGE8VD4obmV3SW1hZ2VEYXRhKVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataAlphaMask(dst: IPixelData, src: IPixelData, alphaMask: AlphaMask, opts: PixelBlendMaskOptions = {}) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = src.width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n\n // 1. Clipping (Matches main branch behavior)\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // 2. Index Setup\n const dw = dst.width;\n const sw = src.width;\n const mPitch = mw;\n\n // dx/dy is the displacement from requested start to clipped start.\n // This keeps the mask locked to the source content during cross-clipping.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const src32 = src.data32;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = alphaMask[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n\n // Early exit if mask is fully transparent\n if (effM === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Early exit if source is fully transparent (unless overwriting)\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n\n // Calculate weight using linear logic (Easier for JIT than nested ternaries)\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n\n // Zero-weight safety check\n if (weight === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (weight < 255) {\n const a = srcAlpha * weight + 128 >> 8;\n // Final check: weight might have resulted in a transparent pixel\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBBbHBoYU1hc2ssIHR5cGUgQ29sb3IzMiwgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyB9IGZyb20gJy4uL190eXBlcydcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0J1xuXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGFBbHBoYU1hc2soXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgc3JjOiBJUGl4ZWxEYXRhLFxuICBhbHBoYU1hc2s6IEFscGhhTWFzayxcbiAgb3B0czogUGl4ZWxCbGVuZE1hc2tPcHRpb25zID0ge30sXG4pIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHN4OiBzb3VyY2VYID0gMCxcbiAgICBzeTogc291cmNlWSA9IDAsXG4gICAgdzogd2lkdGggPSBzcmMud2lkdGgsXG4gICAgaDogaGVpZ2h0ID0gc3JjLmhlaWdodCxcbiAgICBhbHBoYTogZ2xvYmFsQWxwaGEgPSAyNTUsXG4gICAgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIG13ID0gc3JjLndpZHRoLFxuICAgIG14ID0gMCxcbiAgICBteSA9IDAsXG4gICAgaW52ZXJ0TWFzayA9IGZhbHNlLFxuICB9ID0gb3B0c1xuXG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuXG5cbiAgbGV0IHggPSB0YXJnZXRYXG4gIGxldCB5ID0gdGFyZ2V0WVxuICBsZXQgc3ggPSBzb3VyY2VYXG4gIGxldCBzeSA9IHNvdXJjZVlcbiAgbGV0IHcgPSB3aWR0aFxuICBsZXQgaCA9IGhlaWdodFxuXG4gIC8vIDEuIENsaXBwaW5nIChNYXRjaGVzIG1haW4gYnJhbmNoIGJlaGF2aW9yKVxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeFxuICAgIHcgKz0gc3hcbiAgICBzeCA9IDBcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeVxuICAgIGggKz0gc3lcbiAgICBzeSA9IDBcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpXG4gIGggPSBNYXRoLm1pbihoLCBzcmMuaGVpZ2h0IC0gc3kpXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHhcbiAgICB3ICs9IHhcbiAgICB4ID0gMFxuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHlcbiAgICBoICs9IHlcbiAgICB5ID0gMFxuICB9XG5cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIGRzdC53aWR0aCAtIHgpXG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3QuaGVpZ2h0IC0geSlcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIDIuIEluZGV4IFNldHVwXG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoXG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoXG4gIGNvbnN0IG1QaXRjaCA9IG13XG5cbiAgLy8gZHgvZHkgaXMgdGhlIGRpc3BsYWNlbWVudCBmcm9tIHJlcXVlc3RlZCBzdGFydCB0byBjbGlwcGVkIHN0YXJ0LlxuICAvLyBUaGlzIGtlZXBzIHRoZSBtYXNrIGxvY2tlZCB0byB0aGUgc291cmNlIGNvbnRlbnQgZHVyaW5nIGNyb3NzLWNsaXBwaW5nLlxuICBjb25zdCBkeCA9ICh4IC0gdGFyZ2V0WCkgfCAwXG4gIGNvbnN0IGR5ID0gKHkgLSB0YXJnZXRZKSB8IDBcblxuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzJcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyXG5cbiAgbGV0IGRJZHggPSAoeSAqIGR3ICsgeCkgfCAwXG4gIGxldCBzSWR4ID0gKHN5ICogc3cgKyBzeCkgfCAwXG4gIGxldCBtSWR4ID0gKChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KSkgfCAwXG5cbiAgY29uc3QgZFN0cmlkZSA9IChkdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBzU3RyaWRlID0gKHN3IC0gYWN0dWFsVykgfCAwXG4gIGNvbnN0IG1TdHJpZGUgPSAobVBpdGNoIC0gYWN0dWFsVykgfCAwXG5cbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBhbHBoYU1hc2tbbUlkeF1cbiAgICAgIGNvbnN0IGVmZk0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWxcblxuICAgICAgLy8gRWFybHkgZXhpdCBpZiBtYXNrIGlzIGZ1bGx5IHRyYW5zcGFyZW50XG4gICAgICBpZiAoZWZmTSA9PT0gMCkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyXG4gICAgICBjb25zdCBzcmNBbHBoYSA9IHNyY0NvbCA+Pj4gMjRcblxuICAgICAgLy8gRWFybHkgZXhpdCBpZiBzb3VyY2UgaXMgZnVsbHkgdHJhbnNwYXJlbnQgKHVubGVzcyBvdmVyd3JpdGluZylcbiAgICAgIGlmIChzcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIHNJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHdlaWdodCB1c2luZyBsaW5lYXIgbG9naWMgKEVhc2llciBmb3IgSklUIHRoYW4gbmVzdGVkIHRlcm5hcmllcylcbiAgICAgIGxldCB3ZWlnaHQgPSBnbG9iYWxBbHBoYVxuICAgICAgaWYgKGlzT3BhcXVlKSB7XG4gICAgICAgIHdlaWdodCA9IGVmZk1cbiAgICAgIH0gZWxzZSBpZiAoZWZmTSAhPT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IChlZmZNICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgIH1cblxuICAgICAgLy8gWmVyby13ZWlnaHQgc2FmZXR5IGNoZWNrXG4gICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIGRJZHgrK1xuICAgICAgICBzSWR4KytcbiAgICAgICAgbUlkeCsrXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBmaW5hbENvbCA9IHNyY0NvbFxuICAgICAgaWYgKHdlaWdodCA8IDI1NSkge1xuICAgICAgICBjb25zdCBhID0gKHNyY0FscGhhICogd2VpZ2h0ICsgMTI4KSA+PiA4XG4gICAgICAgIC8vIEZpbmFsIGNoZWNrOiB3ZWlnaHQgbWlnaHQgaGF2ZSByZXN1bHRlZCBpbiBhIHRyYW5zcGFyZW50IHBpeGVsXG4gICAgICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICAgIGRJZHgrK1xuICAgICAgICAgIHNJZHgrK1xuICAgICAgICAgIG1JZHgrK1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxDb2wgPSAoKHNyY0NvbCAmIDB4MDBmZmZmZmYpIHwgKGEgPDwgMjQpKSA+Pj4gMCBhcyBDb2xvcjMyXG4gICAgICB9XG5cbiAgICAgIGRzdDMyW2RJZHhdID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMilcblxuICAgICAgZElkeCsrXG4gICAgICBzSWR4KytcbiAgICAgIG1JZHgrK1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGVcbiAgICBzSWR4ICs9IHNTdHJpZGVcbiAgICBtSWR4ICs9IG1TdHJpZGVcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataBinaryMask(dst: IPixelData, src: IPixelData, binaryMask: BinaryMask, opts: PixelBlendMaskOptions) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverPerfect,\n mw = src.width,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (globalAlpha === 0) return;\n let x = targetX;\n let y = targetY;\n let sx = sourceX;\n let sy = sourceY;\n let w = width;\n let h = height;\n\n // 1. Source Clipping\n if (sx < 0) {\n x -= sx;\n w += sx;\n sx = 0;\n }\n if (sy < 0) {\n y -= sy;\n h += sy;\n sy = 0;\n }\n w = Math.min(w, src.width - sx);\n h = Math.min(h, src.height - sy);\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, dst.width - x);\n const actualH = Math.min(h, dst.height - y);\n if (actualW <= 0 || actualH <= 0) return;\n\n // 3. Coordinate Displacement for Mask Sync\n // dx/dy represents how far the clipped start is from the requested start.\n // This is the stable way to align the mask across all clipping permutations.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = dst.data32;\n const src32 = src.data32;\n const dw = dst.width;\n const sw = src.width;\n const mPitch = mw;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n // Binary Mask Check (Earliest exit)\n if (binaryMask[mIdx] === skipVal) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Source Alpha Check\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n // Rounding-corrected global alpha application\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n dst32[dIdx] = blendFn(finalCol, dst32[dIdx] as Color32);\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaW5hcnlNYXNrLCBDb2xvcjMyLCBJUGl4ZWxEYXRhLCBQaXhlbEJsZW5kTWFza09wdGlvbnMgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCdcblxuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayhcbiAgZHN0OiBJUGl4ZWxEYXRhLFxuICBzcmM6IElQaXhlbERhdGEsXG4gIGJpbmFyeU1hc2s6IEJpbmFyeU1hc2ssXG4gIG9wdHM6IFBpeGVsQmxlbmRNYXNrT3B0aW9ucyxcbikge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgc3g6IHNvdXJjZVggPSAwLFxuICAgIHN5OiBzb3VyY2VZID0gMCxcbiAgICB3OiB3aWR0aCA9IHNyYy53aWR0aCxcbiAgICBoOiBoZWlnaHQgPSBzcmMuaGVpZ2h0LFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QsXG4gICAgbXcgPSBzcmMud2lkdGgsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2UsXG4gIH0gPSBvcHRzXG5cbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm5cblxuICBsZXQgeCA9IHRhcmdldFhcbiAgbGV0IHkgPSB0YXJnZXRZXG4gIGxldCBzeCA9IHNvdXJjZVhcbiAgbGV0IHN5ID0gc291cmNlWVxuICBsZXQgdyA9IHdpZHRoXG4gIGxldCBoID0gaGVpZ2h0XG5cbiAgLy8gMS4gU291cmNlIENsaXBwaW5nXG4gIGlmIChzeCA8IDApIHtcbiAgICB4IC09IHN4XG4gICAgdyArPSBzeFxuICAgIHN4ID0gMFxuICB9XG4gIGlmIChzeSA8IDApIHtcbiAgICB5IC09IHN5XG4gICAgaCArPSBzeVxuICAgIHN5ID0gMFxuICB9XG4gIHcgPSBNYXRoLm1pbih3LCBzcmMud2lkdGggLSBzeClcbiAgaCA9IE1hdGgubWluKGgsIHNyYy5oZWlnaHQgLSBzeSlcblxuICAvLyAyLiBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4XG4gICAgdyArPSB4XG4gICAgeCA9IDBcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5XG4gICAgaCArPSB5XG4gICAgeSA9IDBcbiAgfVxuXG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3Qud2lkdGggLSB4KVxuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgZHN0LmhlaWdodCAtIHkpXG5cbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVyblxuXG4gIC8vIDMuIENvb3JkaW5hdGUgRGlzcGxhY2VtZW50IGZvciBNYXNrIFN5bmNcbiAgLy8gZHgvZHkgcmVwcmVzZW50cyBob3cgZmFyIHRoZSBjbGlwcGVkIHN0YXJ0IGlzIGZyb20gdGhlIHJlcXVlc3RlZCBzdGFydC5cbiAgLy8gVGhpcyBpcyB0aGUgc3RhYmxlIHdheSB0byBhbGlnbiB0aGUgbWFzayBhY3Jvc3MgYWxsIGNsaXBwaW5nIHBlcm11dGF0aW9ucy5cbiAgY29uc3QgZHggPSAoeCAtIHRhcmdldFgpIHwgMFxuICBjb25zdCBkeSA9ICh5IC0gdGFyZ2V0WSkgfCAwXG5cbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTMyXG4gIGNvbnN0IHNyYzMyID0gc3JjLmRhdGEzMlxuICBjb25zdCBkdyA9IGRzdC53aWR0aFxuICBjb25zdCBzdyA9IHNyYy53aWR0aFxuICBjb25zdCBtUGl0Y2ggPSBtd1xuXG4gIGxldCBkSWR4ID0gKHkgKiBkdyArIHgpIHwgMFxuICBsZXQgc0lkeCA9IChzeSAqIHN3ICsgc3gpIHwgMFxuICBsZXQgbUlkeCA9ICgobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkpIHwgMFxuXG4gIGNvbnN0IGRTdHJpZGUgPSAoZHcgLSBhY3R1YWxXKSB8IDBcbiAgY29uc3Qgc1N0cmlkZSA9IChzdyAtIGFjdHVhbFcpIHwgMFxuICBjb25zdCBtU3RyaWRlID0gKG1QaXRjaCAtIGFjdHVhbFcpIHwgMFxuXG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDBcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZSB8fCBmYWxzZVxuXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIC8vIEJpbmFyeSBNYXNrIENoZWNrIChFYXJsaWVzdCBleGl0KVxuICAgICAgaWYgKGJpbmFyeU1hc2tbbUlkeF0gPT09IHNraXBWYWwpIHtcbiAgICAgICAgZElkeCsrXG4gICAgICAgIHNJZHgrK1xuICAgICAgICBtSWR4KytcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3JjQ29sID0gc3JjMzJbc0lkeF0gYXMgQ29sb3IzMlxuICAgICAgY29uc3Qgc3JjQWxwaGEgPSBzcmNDb2wgPj4+IDI0XG5cbiAgICAgIC8vIFNvdXJjZSBBbHBoYSBDaGVja1xuICAgICAgaWYgKHNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICBkSWR4KytcbiAgICAgICAgc0lkeCsrXG4gICAgICAgIG1JZHgrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBsZXQgZmluYWxDb2wgPSBzcmNDb2xcbiAgICAgIGlmICghaXNPcGFxdWUpIHtcbiAgICAgICAgLy8gUm91bmRpbmctY29ycmVjdGVkIGdsb2JhbCBhbHBoYSBhcHBsaWNhdGlvblxuICAgICAgICBjb25zdCBhID0gKHNyY0FscGhhICogZ2xvYmFsQWxwaGEgKyAxMjgpID4+IDhcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrXG4gICAgICAgICAgc0lkeCsrXG4gICAgICAgICAgbUlkeCsrXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9ICgoc3JjQ29sICYgMHgwMGZmZmZmZikgfCAoYSA8PCAyNCkpID4+PiAwIGFzIENvbG9yMzJcbiAgICAgIH1cblxuICAgICAgZHN0MzJbZElkeF0gPSBibGVuZEZuKGZpbmFsQ29sLCBkc3QzMltkSWR4XSBhcyBDb2xvcjMyKVxuXG4gICAgICBkSWR4KytcbiAgICAgIHNJZHgrK1xuICAgICAgbUlkeCsrXG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZVxuICAgIHNJZHggKz0gc1N0cmlkZVxuICAgIG1JZHggKz0gbVN0cmlkZVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { fillPixelData } from './fillPixelData';\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(dst: IPixelData, rect?: Partial<Rect>): void {\n fillPixelData(dst, 0 as Color32, rect);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb2xvcjMyLCBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZmlsbFBpeGVsRGF0YSB9IGZyb20gJy4vZmlsbFBpeGVsRGF0YSdcblxuLyoqXG4gKiBDbGVhcnMgYSByZWdpb24gb2YgdGhlIFBpeGVsRGF0YSB0byB0cmFuc3BhcmVudCAoMHgwMDAwMDAwMCkuXG4gKiBJbnRlcm5hbGx5IHVzZXMgdGhlIG9wdGltaXplZCBmaWxsUGl4ZWxEYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJQaXhlbERhdGEoXG4gIGRzdDogSVBpeGVsRGF0YSxcbiAgcmVjdD86IFBhcnRpYWw8UmVjdD4sXG4pOiB2b2lkIHtcbiAgZmlsbFBpeGVsRGF0YShkc3QsIDAgYXMgQ29sb3IzMiwgcmVjdClcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: IPixelData, rect: Rect): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData, x: number, y: number, w: number, h: number): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint32Array {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const srcW = source.width;\n const srcH = source.height;\n const srcData = source.data32;\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0);\n }\n const dstData = new Uint32Array(w * h);\n\n // We map from Source (srcW, srcH) at (x,y)\n // To Dest (w, h) at (0,0)\n // Note: resolveBlitClipping usually takes (dstX, dstY, srcX, srcY...)\n // Here we are \"blitting\" FROM x,y TO 0,0.\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return dstData;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX;\n const dstStart = (dstY + row) * w + dstX;\n\n // Perform the high-speed 32-bit bulk copy\n const chunk = srcData.subarray(srcStart, srcStart + copyW);\n dstData.set(chunk, dstStart);\n }\n return dstData;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIFBpeGVsRGF0YS5cbiAqIFJldHVybnMgYSBuZXcgVWludDMyQXJyYXkgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHBpeGVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBJUGl4ZWxEYXRhLCByZWN0OiBSZWN0KTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZTogSVBpeGVsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDMyQXJyYXlcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKFxuICBzb3VyY2U6IElQaXhlbERhdGEsXG4gIF94OiBSZWN0IHwgbnVtYmVyLFxuICBfeT86IG51bWJlcixcbiAgX3c/OiBudW1iZXIsXG4gIF9oPzogbnVtYmVyLFxuKTogVWludDMyQXJyYXkge1xuICBjb25zdCB7IHgsIHksIHcsIGggfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCdcbiAgICA/IF94XG4gICAgOiB7IHg6IF94LCB5OiBfeSEsIHc6IF93ISwgaDogX2ghIH1cblxuICBjb25zdCBzcmNXID0gc291cmNlLndpZHRoXG4gIGNvbnN0IHNyY0ggPSBzb3VyY2UuaGVpZ2h0XG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YTMyXG5cbiAgLy8gU2FmZXR5IGNoZWNrIGZvciBlbXB0eSBvciBpbnZhbGlkIGRpbWVuc2lvbnNcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KDApXG4gIH1cblxuICBjb25zdCBkc3REYXRhID0gbmV3IFVpbnQzMkFycmF5KHcgKiBoKVxuXG4gIC8vIFdlIG1hcCBmcm9tIFNvdXJjZSAoc3JjVywgc3JjSCkgYXQgKHgseSlcbiAgLy8gVG8gRGVzdCAodywgaCkgYXQgKDAsMClcbiAgLy8gTm90ZTogcmVzb2x2ZUJsaXRDbGlwcGluZyB1c3VhbGx5IHRha2VzIChkc3RYLCBkc3RZLCBzcmNYLCBzcmNZLi4uKVxuICAvLyBIZXJlIHdlIGFyZSBcImJsaXR0aW5nXCIgRlJPTSB4LHkgVE8gMCwwLlxuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyhcbiAgICAwLFxuICAgIDAsXG4gICAgeCxcbiAgICB5LFxuICAgIHcsXG4gICAgaCxcbiAgICB3LFxuICAgIGgsXG4gICAgc3JjVyxcbiAgICBzcmNILFxuICAgIFNDUkFUQ0hfQkxJVCxcbiAgKVxuXG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIGRzdERhdGFcblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1hcbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICsgcm93KSAqIHcgKyBkc3RYXG5cbiAgICAvLyBQZXJmb3JtIHRoZSBoaWdoLXNwZWVkIDMyLWJpdCBidWxrIGNvcHlcbiAgICBjb25zdCBjaHVuayA9IHNyY0RhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgY29weVcpXG4gICAgZHN0RGF0YS5zZXQoY2h1bmssIGRzdFN0YXJ0KVxuICB9XG5cbiAgcmV0dXJuIGRzdERhdGFcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { extractPixelDataBuffer } from './extractPixelDataBuffer';\nimport { PixelData } from './PixelData';\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: IPixelData, rect: Rect): PixelData;\nexport function extractPixelData(source: IPixelData, x: number, y: number, w: number, h: number): PixelData;\nexport function extractPixelData(source: IPixelData, _x: Rect | number, _y?: number, _w?: number, _h?: number): PixelData {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const result = new PixelData(new ImageData(w, h));\n const buffer = extractPixelDataBuffer(source, x, y, w, h);\n result.data32.set(buffer);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhLCBSZWN0IH0gZnJvbSAnLi4vX3R5cGVzJ1xuaW1wb3J0IHsgZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlciB9IGZyb20gJy4vZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcidcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxEYXRhJ1xuXG4vKipcbiAqIEhpZ2gtbGV2ZWwgZXh0cmFjdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgUGl4ZWxEYXRhIGluc3RhbmNlLlxuICogTGV2ZXJhZ2VzIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIgZm9yIG9wdGltaXplZCAzMi1iaXQgbWVtb3J5IG1vdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IElQaXhlbERhdGEsIHJlY3Q6IFJlY3QpOiBQaXhlbERhdGFcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhKHNvdXJjZTogSVBpeGVsRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogUGl4ZWxEYXRhXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShcbiAgc291cmNlOiBJUGl4ZWxEYXRhLFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IFBpeGVsRGF0YSB7XG4gIGNvbnN0IHsgeCwgeSwgdywgaCB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0J1xuICAgID8gX3hcbiAgICA6IHsgeDogX3gsIHk6IF95ISwgdzogX3chLCBoOiBfaCEgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBQaXhlbERhdGEobmV3IEltYWdlRGF0YSh3LCBoKSlcblxuICBjb25zdCBidWZmZXIgPSBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZSwgeCwgeSwgdywgaClcbiAgcmVzdWx0LmRhdGEzMi5zZXQoYnVmZmVyKVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { IPixelData } from '../_types';\nexport class PixelBuffer32 implements IPixelData {\n readonly data32: Uint32Array;\n constructor(readonly width: number, readonly height: number, data32?: Uint32Array) {\n this.data32 = data32 ?? new Uint32Array(width * height);\n }\n set(width: number, height: number, data32?: Uint32Array): void {\n ;\n (this as any).data32 = data32 ?? new Uint32Array(width * height);\n (this as any).width = width;\n (this as any).height = height;\n }\n copy(): PixelBuffer32 {\n const newData32 = new Uint32Array(this.data32);\n return new PixelBuffer32(this.width, this.height, newData32);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgY2xhc3MgUGl4ZWxCdWZmZXIzMiBpbXBsZW1lbnRzIElQaXhlbERhdGEge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgd2lkdGg6IG51bWJlcixcbiAgICByZWFkb25seSBoZWlnaHQ6IG51bWJlcixcbiAgICBkYXRhMzI/OiBVaW50MzJBcnJheSxcbiAgKSB7XG4gICAgdGhpcy5kYXRhMzIgPSBkYXRhMzIgPz8gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KVxuICB9XG5cbiAgc2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBkYXRhMzI/OiBVaW50MzJBcnJheSk6IHZvaWQge1xuICAgIDsodGhpcyBhcyBhbnkpLmRhdGEzMiA9IGRhdGEzMiA/PyBuZXcgVWludDMyQXJyYXkod2lkdGggKiBoZWlnaHQpXG4gICAgOyh0aGlzIGFzIGFueSkud2lkdGggPSB3aWR0aFxuICAgIDsodGhpcyBhcyBhbnkpLmhlaWdodCA9IGhlaWdodFxuICB9XG5cbiAgY29weSgpOiBQaXhlbEJ1ZmZlcjMyIHtcbiAgICBjb25zdCBuZXdEYXRhMzIgPSBuZXcgVWludDMyQXJyYXkodGhpcy5kYXRhMzIpXG4gICAgcmV0dXJuIG5ldyBQaXhlbEJ1ZmZlcjMyKFxuICAgICAgdGhpcy53aWR0aCxcbiAgICAgIHRoaXMuaGVpZ2h0LFxuICAgICAgbmV3RGF0YTMyLFxuICAgIClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { AlphaMask } from '../_types';\n\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(pixelData: IPixelData): AlphaMask {\n const {\n data32,\n width,\n height\n } = pixelData;\n const len = data32.length;\n const mask = new Uint8Array(width * height) as AlphaMask;\n for (let i = 0; i < len; i++) {\n const val = data32[i];\n\n // Extract the Alpha byte (top 8 bits in ABGR / Little-Endian)\n // Shift right by 24 moves the 4th byte to the 1st position\n mask[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbHBoYU1hc2ssIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnXG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGFscGhhIGNoYW5uZWwgZnJvbSBQaXhlbERhdGEgaW50byBhIHNpbmdsZS1jaGFubmVsIG1hc2suXG4gKiBSZXR1cm5zIGEgVWludDhBcnJheSBicmFuZGVkIGFzIEFscGhhTWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpeGVsRGF0YVRvQWxwaGFNYXNrKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEsXG4pOiBBbHBoYU1hc2sge1xuICBjb25zdCB7XG4gICAgZGF0YTMyLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgfSA9IHBpeGVsRGF0YVxuICBjb25zdCBsZW4gPSBkYXRhMzIubGVuZ3RoXG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCkgYXMgQWxwaGFNYXNrXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHZhbCA9IGRhdGEzMltpXVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgQWxwaGEgYnl0ZSAodG9wIDggYml0cyBpbiBBQkdSIC8gTGl0dGxlLUVuZGlhbilcbiAgICAvLyBTaGlmdCByaWdodCBieSAyNCBtb3ZlcyB0aGUgNHRoIGJ5dGUgdG8gdGhlIDFzdCBwb3NpdGlvblxuICAgIG1hc2tbaV0gPSAodmFsID4+PiAyNCkgJiAweGZmXG4gIH1cblxuICByZXR1cm4gbWFza1xufVxuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function reflectPixelDataHorizontal(pixelData: IPixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n const halfWidth = Math.floor(width / 2);\n for (let y = 0; y < height; y++) {\n const rowOffset = y * width;\n for (let x = 0; x < halfWidth; x++) {\n const leftIdx = rowOffset + x;\n const rightIdx = rowOffset + (width - 1 - x);\n const temp = data[leftIdx];\n data[leftIdx] = data[rightIdx];\n data[rightIdx] = temp;\n }\n }\n}\nexport function reflectPixelDataVertical(pixelData: IPixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n const halfHeight = Math.floor(height / 2);\n for (let y = 0; y < halfHeight; y++) {\n const topRowOffset = y * width;\n const bottomRowOffset = (height - 1 - y) * width;\n for (let x = 0; x < width; x++) {\n const topIdx = topRowOffset + x;\n const bottomIdx = bottomRowOffset + x;\n const temp = data[topIdx];\n data[topIdx] = data[bottomIdx];\n data[bottomIdx] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJUGl4ZWxEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YUhvcml6b250YWwocGl4ZWxEYXRhOiBJUGl4ZWxEYXRhKTogdm9pZCB7XG4gIGNvbnN0IHdpZHRoID0gcGl4ZWxEYXRhLndpZHRoXG4gIGNvbnN0IGhlaWdodCA9IHBpeGVsRGF0YS5oZWlnaHRcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhMzJcbiAgY29uc3QgaGFsZldpZHRoID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IHkgKiB3aWR0aFxuXG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBoYWxmV2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgbGVmdElkeCA9IHJvd09mZnNldCArIHhcbiAgICAgIGNvbnN0IHJpZ2h0SWR4ID0gcm93T2Zmc2V0ICsgKHdpZHRoIC0gMSAtIHgpXG4gICAgICBjb25zdCB0ZW1wID0gZGF0YVtsZWZ0SWR4XVxuXG4gICAgICBkYXRhW2xlZnRJZHhdID0gZGF0YVtyaWdodElkeF1cbiAgICAgIGRhdGFbcmlnaHRJZHhdID0gdGVtcFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YVZlcnRpY2FsKHBpeGVsRGF0YTogSVBpeGVsRGF0YSk6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aFxuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyXG4gIGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoYWxmSGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCB0b3BSb3dPZmZzZXQgPSB5ICogd2lkdGhcbiAgICBjb25zdCBib3R0b21Sb3dPZmZzZXQgPSAoaGVpZ2h0IC0gMSAtIHkpICogd2lkdGhcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgdG9wSWR4ID0gdG9wUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgYm90dG9tSWR4ID0gYm90dG9tUm93T2Zmc2V0ICsgeFxuICAgICAgY29uc3QgdGVtcCA9IGRhdGFbdG9wSWR4XVxuXG4gICAgICBkYXRhW3RvcElkeF0gPSBkYXRhW2JvdHRvbUlkeF1cbiAgICAgIGRhdGFbYm90dG9tSWR4XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { PixelData } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(pixelData: IPixelData, factor: number): PixelData {\n const {\n data,\n width,\n height\n } = resample32(pixelData.data32, pixelData.width, pixelData.height, factor);\n return new PixelData(new ImageData(new Uint8ClampedArray(data.buffer) as ImageDataArray, width, height));\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCBQaXhlbERhdGEgfSBmcm9tICcuLi9pbmRleCdcbmltcG9ydCB7IHJlc2FtcGxlMzIgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNhbXBsZTMyJ1xuXG4vKipcbiAqIFJlc2FtcGxlcyBQaXhlbERhdGEgYnkgYSBzcGVjaWZpYyBmYWN0b3IgdXNpbmcgbmVhcmVzdCBuZWlnaGJvci5cbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlUGl4ZWxEYXRhKFxuICBwaXhlbERhdGE6IElQaXhlbERhdGEsXG4gIGZhY3RvcjogbnVtYmVyLFxuKTogUGl4ZWxEYXRhIHtcbiAgY29uc3QgeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0gPSByZXNhbXBsZTMyKHBpeGVsRGF0YS5kYXRhMzIsIHBpeGVsRGF0YS53aWR0aCwgcGl4ZWxEYXRhLmhlaWdodCwgZmFjdG9yKVxuXG4gIHJldHVybiBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEoXG4gICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEuYnVmZmVyKSBhcyBJbWFnZURhdGFBcnJheSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICkpXG59XG4iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n if (width === height) {\n rotateSquareInPlace(pixelData);\n return;\n }\n const newWidth = height;\n const newHeight = width;\n const newData32 = new Uint32Array(data.length);\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const oldIdx = y * width + x;\n const newX = height - 1 - y;\n const newY = x;\n const newIdx = newY * newWidth + newX;\n newData32[newIdx] = data[oldIdx];\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(new Uint8ClampedArray(newData32.buffer), newWidth, newHeight);\n pixelData.set(newImageData);\n}\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.width;\n const data = pixelData.data32;\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j;\n const right = j * n + (n - 1 - i);\n const bottom = (n - 1 - i) * n + (n - 1 - j);\n const left = (n - 1 - j) * n + i;\n const temp = data[top];\n data[top] = data[left];\n data[left] = data[bottom];\n data[bottom] = data[right];\n data[right] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGl4ZWxEYXRhIH0gZnJvbSAnLi9QaXhlbERhdGEnXG5cbi8qKlxuICogUm90YXRlcyBwaXhlbCBkYXRhIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLlxuICogSWYgdGhlIGltYWdlIGlzIHNxdWFyZSwgaXQgcGVyZm9ybXMgdGhlIHJvdGF0aW9uIGluLXBsYWNlLlxuICogSWYgcmVjdGFuZ3VsYXIsIGl0IHJlcGxhY2VzIHRoZSBpbnRlcm5hbCBJbWFnZURhdGEgd2l0aCBhIG5ldyByb3RhdGVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVQaXhlbERhdGEocGl4ZWxEYXRhOiBQaXhlbERhdGEpOiB2b2lkIHtcbiAgY29uc3Qgd2lkdGggPSBwaXhlbERhdGEud2lkdGhcbiAgY29uc3QgaGVpZ2h0ID0gcGl4ZWxEYXRhLmhlaWdodFxuICBjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGEzMlxuXG4gIGlmICh3aWR0aCA9PT0gaGVpZ2h0KSB7XG4gICAgcm90YXRlU3F1YXJlSW5QbGFjZShwaXhlbERhdGEpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBuZXdXaWR0aCA9IGhlaWdodFxuICBjb25zdCBuZXdIZWlnaHQgPSB3aWR0aFxuICBjb25zdCBuZXdEYXRhMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5sZW5ndGgpXG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3Qgb2xkSWR4ID0geSAqIHdpZHRoICsgeFxuICAgICAgY29uc3QgbmV3WCA9IGhlaWdodCAtIDEgLSB5XG4gICAgICBjb25zdCBuZXdZID0geFxuICAgICAgY29uc3QgbmV3SWR4ID0gbmV3WSAqIG5ld1dpZHRoICsgbmV3WFxuXG4gICAgICBuZXdEYXRhMzJbbmV3SWR4XSA9IGRhdGFbb2xkSWR4XVxuICAgIH1cbiAgfVxuXG4gIC8vIFRvIHVwZGF0ZSBhIHJlY3Rhbmd1bGFyIFBpeGVsRGF0YSwgd2UgbXVzdCBjcmVhdGUgYSBuZXcgSW1hZ2VEYXRhXG4gIC8vIHNpbmNlIHdpZHRoL2hlaWdodCBhcmUgcmVhZC1vbmx5IHByb3BlcnRpZXMgb2YgdGhlIG5hdGl2ZSBvYmplY3QuXG4gIGNvbnN0IG5ld0ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoXG4gICAgbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG5ld0RhdGEzMi5idWZmZXIpLFxuICAgIG5ld1dpZHRoLFxuICAgIG5ld0hlaWdodCxcbiAgKVxuXG4gIHBpeGVsRGF0YS5zZXQobmV3SW1hZ2VEYXRhKVxufVxuXG5mdW5jdGlvbiByb3RhdGVTcXVhcmVJblBsYWNlKHBpeGVsRGF0YTogUGl4ZWxEYXRhKTogdm9pZCB7XG4gIGNvbnN0IG4gPSBwaXhlbERhdGEud2lkdGhcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhMzJcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG4gLyAyOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gaTsgaiA8IG4gLSBpIC0gMTsgaisrKSB7XG4gICAgICBjb25zdCB0b3AgPSBpICogbiArIGpcbiAgICAgIGNvbnN0IHJpZ2h0ID0gaiAqIG4gKyAobiAtIDEgLSBpKVxuICAgICAgY29uc3QgYm90dG9tID0gKG4gLSAxIC0gaSkgKiBuICsgKG4gLSAxIC0gailcbiAgICAgIGNvbnN0IGxlZnQgPSAobiAtIDEgLSBqKSAqIG4gKyBpXG5cbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW3RvcF1cbiAgICAgIGRhdGFbdG9wXSA9IGRhdGFbbGVmdF1cbiAgICAgIGRhdGFbbGVmdF0gPSBkYXRhW2JvdHRvbV1cbiAgICAgIGRhdGFbYm90dG9tXSA9IGRhdGFbcmlnaHRdXG4gICAgICBkYXRhW3JpZ2h0XSA9IHRlbXBcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of a {@link PixelData} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target {@link PixelData} buffer.\n */\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, rect: Rect): void;\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, x: number, y: number, w: number, h: number): void;\nexport function writePixelDataBuffer(target: IPixelData, data: Uint32Array, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data32;\n\n // treat the source buffer as a Source Image starting at 0,0 with size w,h\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * w + srcX;\n dstData.set(data.subarray(srcStart, srcStart + copyW), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltudWxsXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBJUGl4ZWxEYXRhLCB0eXBlIFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnXG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnXG5pbXBvcnQgdHlwZSB7IFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxEYXRhJ1xuXG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKVxuXG4vKipcbiAqIENvcGllcyBhIHBpeGVsIGJ1ZmZlciBpbnRvIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGEge0BsaW5rIFBpeGVsRGF0YX0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBkaXJlY3QgbWVtb3J5IGNvcHkgZnJvbSBhIHtAbGluayBVaW50MzJBcnJheX1cbiAqIGludG8gdGhlIHRhcmdldCB7QGxpbmsgUGl4ZWxEYXRhfSBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgcmVjdDogUmVjdCxcbik6IHZvaWRcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcihcbiAgdGFyZ2V0OiBJUGl4ZWxEYXRhLFxuICBkYXRhOiBVaW50MzJBcnJheSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHc6IG51bWJlcixcbiAgaDogbnVtYmVyLFxuKTogdm9pZFxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGl4ZWxEYXRhQnVmZmVyKFxuICB0YXJnZXQ6IElQaXhlbERhdGEsXG4gIGRhdGE6IFVpbnQzMkFycmF5LFxuICBfeDogUmVjdCB8IG51bWJlcixcbiAgX3k/OiBudW1iZXIsXG4gIF93PzogbnVtYmVyLFxuICBfaD86IG51bWJlcixcbik6IHZvaWQge1xuICBjb25zdCB7IHgsIHksIHcsIGggfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCdcbiAgICA/IF94XG4gICAgOiB7XG4gICAgICB4OiBfeCxcbiAgICAgIHk6IF95ISxcbiAgICAgIHc6IF93ISxcbiAgICAgIGg6IF9oISxcbiAgICB9XG5cbiAgY29uc3QgZHN0VyA9IHRhcmdldC53aWR0aFxuICBjb25zdCBkc3RIID0gdGFyZ2V0LmhlaWdodFxuICBjb25zdCBkc3REYXRhID0gdGFyZ2V0LmRhdGEzMlxuXG4gIC8vIHRyZWF0IHRoZSBzb3VyY2UgYnVmZmVyIGFzIGEgU291cmNlIEltYWdlIHN0YXJ0aW5nIGF0IDAsMCB3aXRoIHNpemUgdyxoXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKFxuICAgIHgsXG4gICAgeSxcbiAgICAwLFxuICAgIDAsXG4gICAgdyxcbiAgICBoLFxuICAgIGRzdFcsXG4gICAgZHN0SCxcbiAgICB3LFxuICAgIGgsXG4gICAgU0NSQVRDSF9CTElULFxuICApXG5cbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm5cblxuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlILFxuICB9ID0gY2xpcFxuXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFhcbiAgICBjb25zdCBzcmNTdGFydCA9IChzcmNZICsgcm93KSAqIHcgKyBzcmNYXG5cbiAgICBkc3REYXRhLnNldChkYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIGNvcHlXKSwgZHN0U3RhcnQpXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ=="],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACmDO,IAAK,WAAL,kBAAKA,cAAL;AAKL,EAAAA,oBAAA;AAKA,EAAAA,oBAAA;AAVU,SAAAA;AAAA,GAAA;;;AC7CL,SAAS,UAAU,GAAW,GAAW,GAAW,GAAoB;AAC7E,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,YAAY,CAAC,WAA4B,WAAW,IAAI;AAC9D,IAAM,cAAc,CAAC,WAA4B,WAAW,IAAI;AAChE,IAAM,aAAa,CAAC,WAA4B,WAAW,KAAK;AAChE,IAAM,cAAc,CAAC,WAA4B,WAAW,KAAK;AACjE,SAAS,YAAY,QAAuB;AACjD,SAAO;AAAA,IACL,GAAG,WAAW,IAAI;AAAA,IAClB,GAAG,WAAW,IAAI;AAAA,IAClB,GAAG,WAAW,KAAK;AAAA,IACnB,GAAG,WAAW,KAAK;AAAA,EACrB;AACF;AACA,IAAM,eAAqB;AAAA,EACzB,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAGO,SAAS,cAAc,QAAiB,UAAU,cAAoB;AAC3E,UAAQ,IAAI,WAAW,IAAI;AAC3B,UAAQ,IAAI,WAAW,IAAI;AAC3B,UAAQ,IAAI,WAAW,KAAK;AAC5B,UAAQ,IAAI,WAAW,KAAK;AAC5B,SAAO;AACT;AACO,SAAS,cAAc,GAAY,GAAoB;AAC5D,QAAM,MAAM,IAAI,QAAS,IAAI;AAC7B,QAAM,MAAM,MAAM,IAAI,QAAS,MAAM,IAAI;AACzC,QAAM,MAAM,MAAM,KAAK,QAAS,MAAM,KAAK;AAC3C,QAAM,MAAM,MAAM,KAAK,QAAS,MAAM,KAAK;AAC3C,SAAO,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAC5C;AAYO,SAAS,YAAY,GAAY,GAAY,GAAoB;AACtE,QAAM,KAAK,IAAI,OAAQ,MAAM,IAAI,QAAS,IAAI;AAC9C,QAAM,KAAK,MAAM,IAAI,OAAQ,MAAM,MAAM,IAAI,QAAS,MAAM,IAAI;AAChE,QAAM,MAAM,MAAM,KAAK,OAAQ,MAAM,MAAM,KAAK,QAAS,MAAM,KAAK;AACpE,QAAM,MAAM,MAAM,KAAK,OAAQ,MAAM,MAAM,KAAK,QAAS,MAAM,KAAK;AACpE,UAAQ,MAAM,KAAK,MAAM,KAAK,KAAK,IAAI,OAAO;AAChD;AAYO,SAAS,gBAAgB,KAAc,KAAc,GAAoB;AAC9E,QAAM,OAAO,MAAM;AAInB,QAAM,MAAM,MAAM,YAAc,KAAK,MAAM,YAAc,SAAS,IAAI;AAItE,QAAM,MAAM,QAAQ,IAAI,YAAc,KAAK,QAAQ,IAAI,YAAc,SAAS,IAAI;AAClF,UAAQ,KAAK,MAAM,OAAO;AAC5B;AAGO,SAAS,aAAa,OAAwB;AACnD,QAAM,KAAK,QAAQ,KAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACrD,QAAM,KAAK,UAAU,IAAI,KAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC3D,QAAM,KAAK,UAAU,KAAK,KAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC5D,QAAM,KAAK,UAAU,KAAK,KAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC5D,SAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC1B;AAMO,SAAS,iBAAiB,OAAwB;AACvD,QAAM,IAAI,QAAQ;AAClB,QAAM,IAAI,UAAU,IAAI;AACxB,QAAM,IAAI,UAAU,KAAK;AACzB,QAAM,IAAI,UAAU,KAAK;AACzB,QAAM,QAAQ,QAAQ,IAAI,KAAK,QAAQ,CAAC,CAAC;AACzC,SAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK;AACrC;;;AC/FO,IAAM,kBAAkB,OAAoB;AAAA,EACjD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,UAAU;AACZ;AACO,IAAM,kBAAkB,OAAoB;AAAA,EACjD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,UAAU;AACZ;AAMO,SAAS,oBAAoB,GAAW,GAAW,GAAW,GAAW,WAAmB,WAAmB,KAA+B;AAEnJ,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AAGA,QAAM,UAAU,KAAK,IAAI,GAAG,YAAY,CAAC;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,YAAY,CAAC;AACzC,MAAI,WAAW,KAAK,WAAW,GAAG;AAChC,QAAI,WAAW;AACf,WAAO;AAAA,EACT;AACA,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,WAAW;AACf,SAAO;AACT;AAOO,SAAS,oBAAoB,GAAW,GAAW,IAAY,IAAY,GAAW,GAAW,MAAc,MAAc,MAAc,MAAc,KAA+B;AAE7L,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,IAAI,GAAG,OAAO,EAAE;AACzB,MAAI,KAAK,IAAI,GAAG,OAAO,EAAE;AAGzB,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC;AACpC,QAAM,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC;AACpC,MAAI,WAAW,KAAK,WAAW,GAAG;AAChC,QAAI,WAAW;AACf,WAAO;AAAA,EACT;AACA,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,WAAW;AACf,SAAO;AACT;;;AC7GA,IAAM,eAAe,gBAAgB;AAsB9B,SAAS,uBAAuB,WAA0B,IAAmB,IAAa,IAAa,IAAgC;AAC5I,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,OAAO,OAAO,WAAW,KAAK;AAAA,IAChC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,IAAI;AAEJ,MAAI,KAAK,KAAK,KAAK,EAAG,QAAO,IAAI,kBAAkB,CAAC;AACpD,QAAM,MAAM,IAAI,kBAAkB,IAAI,IAAI,CAAC;AAC3C,QAAM,OAAO,oBAAoB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,MAAM,YAAY;AACjF,MAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,QAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,SAAS,QAAQ;AACvB,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAM,aAAa,OAAO,OAAO,OAAO,QAAQ;AAChD,UAAM,aAAa,OAAO,OAAO,IAAI,QAAQ;AAG7C,QAAI,IAAI,IAAI,SAAS,UAAU,WAAW,MAAM,GAAG,QAAQ;AAAA,EAC7D;AACA,SAAO;AACT;;;ACzCO,SAAS,YAAY,MAAkB,WAAmB,SAAwB,GAAY,GAAY,GAAwB;AACvI,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,OAAO,YAAY,UAAU;AAC/B,aAAS,QAAQ;AACjB,aAAS,QAAQ;AACjB,aAAS,QAAQ;AACjB,aAAS,QAAQ;AAAA,EACnB,OAAO;AACL,aAAS;AACT,aAAS;AACT,aAAS;AACT,aAAS;AAAA,EACX;AACA,QAAM,MAAM,IAAI,WAAW,SAAS,MAAM;AAC1C,QAAM,OAAO,KAAK,SAAS;AAC3B,WAAS,MAAM,GAAG,MAAM,QAAQ,OAAO;AACrC,UAAM,cAAc,SAAS;AAC7B,QAAI,cAAc,KAAK,eAAe,MAAM;AAC1C;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM;AAChC,UAAM,MAAM,KAAK,IAAI,WAAW,SAAS,MAAM;AAC/C,QAAI,QAAQ,KAAK;AACf,YAAM,YAAY,cAAc,YAAY;AAC5C,YAAM,YAAY,MAAM,UAAU,QAAQ;AAC1C,YAAM,QAAQ,MAAM;AACpB,UAAI,IAAI,KAAK,SAAS,WAAW,YAAY,KAAK,GAAG,SAAS;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;;;ACrCO,SAAS,eAA+C,QAAW,QAAoB;AAC5F,QAAM,YAAY,OAAO;AACzB,QAAM,YAAY,OAAO;AACzB,QAAM,YAAY,OAAO;AACzB,QAAM,eAAe,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC;AAChD,QAAM,eAAe,KAAK,IAAI,OAAO,GAAG,OAAO,CAAC;AAChD,QAAM,kBAAkB,KAAK,IAAI,OAAO,IAAI,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC;AACzE,QAAM,kBAAkB,KAAK,IAAI,OAAO,IAAI,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC;AAGzE,MAAI,mBAAmB,gBAAgB,mBAAmB,cAAc;AACtE,WAAO,IAAI;AACX,WAAO,IAAI;AACX,QAAI,UAAU,UAAU,OAAO,MAAM;AAEnC,aAAO,OAAO,IAAI,WAAW,CAAC;AAAA,IAChC;AACA;AAAA,EACF;AACA,QAAM,eAAe,kBAAkB;AACvC,QAAM,eAAe,kBAAkB;AACvC,QAAM,UAAU,eAAe;AAC/B,QAAM,UAAU,eAAe;AAC/B,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO,IAAI;AACX,MAAI,UAAU,UAAU,OAAO,MAAM;AACnC,UAAM,cAAc,YAAY,OAAO,MAAM,WAAW,SAAS,SAAS,cAAc,YAAY;AACpG,QAAI,OAAO;AACX,QAAI,OAAO;AACX,QAAI,OAAO;AACX,QAAI,OAAO;AAGX,aAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACrC,eAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACrC,YAAI,YAAY,IAAI,eAAe,CAAC,MAAM,GAAG;AAC3C,cAAI,IAAI,KAAM,QAAO;AACrB,cAAI,IAAI,KAAM,QAAO;AACrB,cAAI,IAAI,KAAM,QAAO;AACrB,cAAI,IAAI,KAAM,QAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,IAAI;AACf,aAAO,IAAI;AACX,aAAO,IAAI;AAEX,aAAO,OAAO,IAAI,WAAW,CAAC;AAC9B;AAAA,IACF;AACA,UAAM,SAAS,OAAO,OAAO;AAC7B,UAAM,SAAS,OAAO,OAAO;AAG7B,QAAI,WAAW,gBAAgB,WAAW,cAAc;AACtD,aAAO,OAAO,YAAY,aAAa,cAAc,MAAM,MAAM,QAAQ,MAAM;AAC/E,aAAO,KAAK;AACZ,aAAO,KAAK;AACZ,aAAO,IAAI;AACX,aAAO,IAAI;AAAA,IACb,OAAO;AACL,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACF;;;ACrCO,SAAS,mBAAmB,KAAgC,QAAgB,QAAgB;AAAA,EACjG,aAAa;AAAA,EACb,YAAY;AAAA,EACZ;AACF,IAA+B,CAAC,GAA2B;AACzD,MAAI;AACJ,MAAI;AACJ,MAAI,YAAY,KAAK;AACnB,aAAS,IAAI;AACb,gBAAY,IAAI;AAAA,EAClB,OAAO;AACL,aAAS,IAAI,YAAY,IAAI,KAAK,QAAQ,IAAI,KAAK,YAAY,IAAI,KAAK,cAAc,CAAC;AACvF,gBAAY;AAAA,EACd;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,QAAQ,UAAU;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM,CAAC;AAChC,QAAM,OAAO,KAAK,IAAI,QAAQ,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC;AACtD,QAAM,OAAO,KAAK,IAAI,GAAG,MAAM,CAAC;AAChC,QAAM,OAAO,KAAK,IAAI,SAAS,GAAG,MAAM,IAAI,MAAM,IAAI,CAAC;AACvD,MAAI,SAAS,QAAQ,SAAS,QAAQ,SAAS,QAAQ,SAAS,MAAM;AACpE,WAAO;AAAA,EACT;AACA,QAAM,YAAY,OAAO,SAAS,QAAQ,MAAM;AAChD,MAAI,aAAa;AACjB,QAAM,SAAS,IAAI,YAAY,QAAQ,MAAM;AAC7C,QAAM,SAAS,IAAI,YAAY,QAAQ,MAAM;AAC7C,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,YAAY;AACd,UAAM,UAAU,IAAI,WAAW,QAAQ,MAAM;AAC7C,UAAM,QAAQ,IAAI,YAAY,QAAQ,MAAM;AAC5C,QAAI,WAAW;AACf,UAAM,UAAU,IAAI,UAAU,KAAK;AACnC,YAAQ,SAAS,QAAQ,MAAM,IAAI;AACnC,WAAO,WAAW,GAAG;AACnB,YAAM,MAAM,MAAM,EAAE,QAAQ;AAC5B,YAAM,IAAI,MAAM;AAChB,YAAM,IAAI,QAAQ;AAClB,aAAO,UAAU,IAAI;AACrB,aAAO,UAAU,IAAI;AACrB;AACA,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AACrB,UAAI,IAAI,KAAM,QAAO;AAGrB,UAAI,IAAI,KAAK,MAAM;AACjB,cAAM,MAAM,IAAI,SAAS,IAAI;AAC7B,YAAI,CAAC,QAAQ,GAAG,KAAK,cAAc,OAAO,GAAG,GAAc,SAAS,KAAK,WAAW;AAClF,kBAAQ,GAAG,IAAI;AACf,gBAAM,UAAU,IAAI,KAAK,KAAK,IAAI;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,IAAI,KAAK,MAAM;AACjB,cAAM,MAAM,IAAI,SAAS,IAAI;AAC7B,YAAI,CAAC,QAAQ,GAAG,KAAK,cAAc,OAAO,GAAG,GAAc,SAAS,KAAK,WAAW;AAClF,kBAAQ,GAAG,IAAI;AACf,gBAAM,UAAU,IAAI,KAAK,KAAK,IAAI;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,IAAI,KAAK,MAAM;AACjB,cAAM,OAAO,IAAI,KAAK,QAAQ;AAC9B,YAAI,CAAC,QAAQ,GAAG,KAAK,cAAc,OAAO,GAAG,GAAc,SAAS,KAAK,WAAW;AAClF,kBAAQ,GAAG,IAAI;AACf,gBAAM,UAAU,IAAI,IAAI,KAAK,KAAK;AAAA,QACpC;AAAA,MACF;AAEA,UAAI,IAAI,KAAK,MAAM;AACjB,cAAM,OAAO,IAAI,KAAK,QAAQ;AAC9B,YAAI,CAAC,QAAQ,GAAG,KAAK,cAAc,OAAO,GAAG,GAAc,SAAS,KAAK,WAAW;AAClF,kBAAQ,GAAG,IAAI;AACf,gBAAM,UAAU,IAAI,IAAI,KAAK,KAAK;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,aAAS,IAAI,MAAM,KAAK,MAAM,KAAK;AACjC,eAAS,IAAI,MAAM,KAAK,MAAM,KAAK;AACjC,cAAM,QAAQ,OAAO,IAAI,QAAQ,CAAC;AAClC,YAAI,cAAc,OAAO,SAAS,KAAK,WAAW;AAChD,iBAAO,UAAU,IAAI;AACrB,iBAAO,UAAU,IAAI;AACrB;AACA,cAAI,IAAI,KAAM,QAAO;AACrB,cAAI,IAAI,KAAM,QAAO;AACrB,cAAI,IAAI,KAAM,QAAO;AACrB,cAAI,IAAI,KAAM,QAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,eAAe,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,gBAA+B;AAAA,IACnC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,OAAO,OAAO;AAAA,IACjB,GAAG,OAAO,OAAO;AAAA,IACjB,MAAM,IAAI,YAAY,OAAO,OAAO,MAAM,OAAO,OAAO,EAAE;AAAA,IAC1D;AAAA,EACF;AAIA,QAAM,KAAK,cAAc;AACzB,QAAM,KAAK,cAAc;AACzB,QAAM,YAAY,cAAc;AAChC,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,KAAK,OAAO,CAAC,IAAI,cAAc;AACrC,UAAM,KAAK,OAAO,CAAC,IAAI,cAAc;AACrC,QAAI,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,IAAI;AAC5C,gBAAU,KAAK,KAAK,EAAE,IAAI;AAAA,IAC5B;AAAA,EACF;AAGA,iBAAe,eAAe;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AAGD,QAAM,YAAY,uBAAuB,WAAW,cAAc,GAAG,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AACtH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACF;;;ACnMO,IAAM,gBAAgB;AAAA,EAC3B,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACV;AAKO,IAAM,gBAA8B,CAAC,KAAK,SAAS;AAC1D,cAAc,cAAc;;;AC3BrB,SAAS,sBAA8J,YAAwB,gBAA6C,eAAe,aAAa;AAC7Q,QAAM,cAAc,oBAAI,IAAwB;AAChD,QAAM,eAAe,oBAAI,IAAyB;AAClD,QAAM,cAAsB,CAAC;AAC7B,QAAM,eAA+B,CAAC;AACtC,QAAM,cAAc,CAAC;AACrB,QAAM,cAAc,CAAC;AACrB,QAAM,MAAM,CAAC,MAAY,OAAc,YAA0B;AAC/D,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,YAAM,IAAI,MAAM,UAAU,KAAK,+CAA+C,IAAc,cAAc,KAAK,GAAG;AAAA,IACpH;AACA,QAAI,aAAa,KAAK,GAAG;AACvB,YAAM,IAAI,MAAM,qBAAqB,KAAK,8CAA8C,IAAc,cAAc,KAAK,GAAG;AAAA,IAC9H;AACA,gBAAY,KAAK,IAAI;AACrB,iBAAa,KAAK,IAAI;AACtB,iBAAa,IAAI,SAAS,KAAK;AAC/B,gBAAY,IAAI,SAAS,IAAI;AAC7B,gBAAY,IAAI,IAAI;AACpB,gBAAY,IAAI,IAAI;AAAA,EACtB;AACA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,UAAM,QAAQ,eAAe,KAAc;AAC3C,QAAI,MAAc,OAAgB,KAAK;AAAA,EACzC;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,EACZ;AACF;;;ACpCO,IAAM,gBAAgB;AACtB,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,IAAK,QAAO;AACvB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,QAAQ,KAAK;AAGxB,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,KAAK,KAAK,QAAQ;AAClC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,aAA2B,CAAC,KAAK,QAAQ;AACpD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,eAA6B,CAAC,KAAK,QAAQ;AACtD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AAGpB,QAAM,KAAK,KAAK,MAAM;AACtB,QAAM,KAAK,KAAK,MAAM;AACtB,QAAM,KAAK,KAAK,MAAM;AACtB,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,KAAK,KAAK,QAAQ;AAClC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,OAAO,MAAM,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,KAAK,KAAK,CAAC;AACvF,QAAM,KAAK,OAAO,MAAM,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,KAAK,KAAK,CAAC;AACvF,QAAM,KAAK,OAAO,MAAM,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,KAAK,KAAK,CAAC;AACvF,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAClE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,KAAK,KAAK,QAAQ;AAClC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AAGpB,QAAM,MAAM,KAAK,KAAK;AACtB,QAAM,MAAM,KAAK,KAAK;AACtB,QAAM,MAAM,KAAK,KAAK;AACtB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,aAA2B,CAAC,KAAK,QAAQ;AACpD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AAIpB,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AACzC,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AAIzC,MAAI,IAAI,IAAI;AACZ,MAAI,SAAS,QAAQ;AACnB,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP,OAAO;AACL,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,cAA4B,CAAC,KAAK,QAAQ;AACrD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,KAAK,IAAI,MAAM,KAAM,MAAM,GAAI;AAC1C,QAAM,KAAK,KAAK,IAAI,OAAO,IAAI,KAAM,OAAO,IAAI,GAAI;AACpD,QAAM,KAAK,KAAK,IAAI,OAAO,KAAK,KAAM,OAAO,KAAK,GAAI;AACtD,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAClE,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,OAAO,IAAI;AACtB,QAAM,KAAK,OAAO,KAAK;AAGvB,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAKO,IAAM,aAA2B,CAAC,KAAK,QAAQ;AACpD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,QAAQ,OAAO,MAAM,SAAU,MAAM,OAAO;AACvD,QAAM,KAAK,QAAQ,OAAO,QAAQ,IAAI,SAAU,MAAM,OAAO;AAC7D,QAAM,KAAK,QAAQ,OAAO,QAAQ,KAAK,SAAU,MAAM,OAAO;AAC9D,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AACtE,QAAM,KAAK,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AACtE,QAAM,KAAK,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AACtE,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,kBAAgC,CAAC,KAAK,QAAQ;AACzD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,OAAO,MAAM,OAAQ;AAC3B,QAAM,OAAO,QAAQ,IAAI,OAAQ;AACjC,QAAM,OAAO,QAAQ,KAAK,OAAQ;AAClC,QAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,QAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,QAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,cAA4B,CAAC,KAAK,QAAQ;AACrD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AAIpB,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AACzC,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AAGzC,MAAI,IAAI,IAAI;AACZ,MAAI,SAAS,QAAQ;AACnB,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP,OAAO;AACL,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,cAA4B,CAAC,KAAK,QAAQ;AACrD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,OAAO;AAC/E,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,OAAO;AAC/E,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,OAAO;AAC/E,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,MAAM,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,OAAO;AACxF,QAAM,MAAM,MAAM,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,OAAO;AACxF,QAAM,MAAM,MAAM,OAAO,KAAK,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,MAAM,OAAO,OAAO;AACxF,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,OAAO;AAC/E,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,OAAO;AAC/E,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,OAAO;AAC/E,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAMO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAC1J,QAAM,KAAK,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAC1J,QAAM,KAAK,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC;AAC1J,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,kBAAgC,CAAC,KAAK,QAAQ;AACzD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM;AAC3C,QAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM;AAC3C,QAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM;AAC3C,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,eAA6B,CAAC,KAAK,QAAQ;AACtD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK;AACpF,QAAM,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK;AACpF,QAAM,KAAK,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK;AACpF,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,cAA4B,CAAC,KAAK,QAAQ;AACrD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,IAAI;AAC1K,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,IAAI;AAC1K,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,IAAI;AAC1K,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,OAAO,MAAM,OAAQ;AAC3B,QAAM,OAAO,QAAQ,IAAI,OAAQ;AACjC,QAAM,OAAO,QAAQ,KAAK,OAAQ;AAClC,QAAM,KAAK,MAAM,IAAI,CAAC,MAAM;AAC5B,QAAM,KAAK,MAAM,IAAI,CAAC,MAAM;AAC5B,QAAM,KAAK,MAAM,IAAI,CAAC,MAAM;AAC5B,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM;AACjC,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM;AACjC,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM;AACjC,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,eAA6B,CAAC,KAAK,QAAQ;AACtD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,KAAK;AACjB,QAAM,MAAM,KAAK;AACjB,QAAM,MAAM,KAAK;AACjB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,aAA2B,CAAC,KAAK,QAAQ;AACpD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAC5D,QAAM,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAC5D,QAAM,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI,MAAM,MAAM,KAAK,KAAK,CAAC;AAC5D,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,KAAK,KAAK,KAAK,QAAQ;AACjC,QAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,OAAQ,QAAQ;AACnD,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,iCAA+D;AAAA,EAC1E,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,MAAM,GAAG;AAAA,EACxB,CAAC,cAAc,QAAQ,GAAG;AAAA,EAC1B,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,WAAW,GAAG;AAAA,EAC7B,CAAC,cAAc,OAAO,GAAG;AAAA,EACzB,CAAC,cAAc,MAAM,GAAG;AAAA,EACxB,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,WAAW,GAAG;AAAA,EAC7B,CAAC,cAAc,YAAY,GAAG;AAAA,EAC9B,CAAC,cAAc,OAAO,GAAG;AAAA,EACzB,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,WAAW,GAAG;AAAA,EAC7B,CAAC,cAAc,QAAQ,GAAG;AAAA,EAC1B,CAAC,cAAc,OAAO,GAAG;AAAA,EACzB,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,QAAQ,GAAG;AAAA,EAC1B,CAAC,cAAc,MAAM,GAAG;AAC1B;AACO,SAAS,0BAA0B,OAAO,QAAQ;AACvD,SAAO,sBAAsB,eAAe,gCAAgC,IAAI;AAClF;;;AC3kBO,IAAM,mBAAmB;AACzB,IAAM,oBAAkC,CAAC,KAAK,QAAQ;AAC3D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,IAAK,QAAO;AACvB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,OAAO,MAAM;AAGnB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,kBAAgC,CAAC,KAAK,QAAQ;AACzD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AAGxB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK,KAAK,MAAM,MAAM;AACjC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK,KAAK,MAAM,MAAM;AACjC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK,KAAK,MAAM,MAAM;AAGjC,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,mBAAiC,CAAC,KAAK,QAAQ;AAC1D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AAIxB,QAAM,OAAO,OAAO,MAAM,MAAM,OAAO,IAAI,IAAI,QAAQ,MAAM,MAAM,MAAM,KAAK;AAC9E,QAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,QAAM,OAAO,OAAO,MAAM,MAAM,OAAO,IAAI,IAAI,QAAQ,MAAM,MAAM,MAAM,KAAK;AAC9E,QAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,QAAM,OAAO,OAAO,MAAM,MAAM,OAAO,IAAI,IAAI,QAAQ,MAAM,MAAM,MAAM,KAAK;AAC9E,QAAM,KAAK,OAAO,IAAI,IAAI;AAC1B,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,oBAAkC,CAAC,KAAK,QAAQ;AAC3D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AAGpB,QAAM,MAAM,KAAK,KAAK;AACtB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,MAAM,KAAK,KAAK;AACtB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,MAAM,KAAK,KAAK;AACtB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AAIpB,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AACzC,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AAIzC,MAAI,IAAI,IAAI;AACZ,MAAI,SAAS,QAAQ;AACnB,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP,OAAO;AACL,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,MAAM,OAAQ,KAAK,MAAM,MAAO;AAC5C,QAAM,MAAM,QAAQ,IAAI,OAAQ,KAAK,QAAQ,IAAI,MAAO;AACxD,QAAM,MAAM,QAAQ,KAAK,OAAQ,KAAK,QAAQ,KAAK,MAAO;AAC1D,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAElE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAKO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,QAAQ,OAAO,MAAM,SAAU,MAAM,MAAM,MAAM;AAC5D,QAAM,KAAK,QAAQ,OAAO,QAAQ,IAAI,SAAU,MAAM,MAAM,MAAM;AAClE,QAAM,KAAK,QAAQ,OAAO,QAAQ,KAAK,SAAU,MAAM,MAAM,MAAM;AACnE,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,oBAAkC,CAAC,KAAK,QAAQ;AAC3D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AAIxB,QAAM,OAAO,OAAO,MAAM,MAAM,KAAK,OAAO,MAAM,MAAM;AACxD,QAAM,KAAK,OAAO,MAAM,MAAM;AAC9B,QAAM,OAAO,OAAO,MAAM,MAAM,KAAK,OAAO,MAAM,MAAM;AACxD,QAAM,KAAK,OAAO,MAAM,MAAM;AAC9B,QAAM,OAAO,OAAO,MAAM,MAAM,KAAK,OAAO,MAAM,MAAM;AACxD,QAAM,KAAK,OAAO,MAAM,MAAM;AAC9B,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,qBAAmC,CAAC,KAAK,QAAQ;AAC5D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,OAAO,MAAM,OAAQ;AAC3B,QAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,QAAM,OAAO,QAAQ,IAAI,OAAQ;AACjC,QAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,QAAM,OAAO,QAAQ,KAAK,OAAQ;AAClC,QAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AAIpB,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AACzC,QAAM,SAAS,KAAK,KAAK,KAAK,MAAM,KAAK;AAGzC,MAAI,IAAI,IAAI;AACZ,MAAI,SAAS,QAAQ;AACnB,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP,OAAO;AACL,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,MAAM,MAAM;AACzF,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,MAAM,MAAM;AACzF,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,MAAM,MAAM;AACzF,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,mBAAiC,CAAC,KAAK,QAAQ;AAC1D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK;AAChB,QAAM,OAAO,MAAM,OAAO,MAAM;AAChC,QAAM,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM;AAC/L,QAAM,KAAK,KAAK;AAChB,QAAM,OAAO,MAAM,OAAO,MAAM;AAChC,QAAM,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM;AAC/L,QAAM,KAAK,KAAK;AAChB,QAAM,OAAO,MAAM,OAAO,MAAM;AAChC,QAAM,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,MAAM,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,OAAO,MAAM;AAC/L,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAClE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,mBAAiC,CAAC,KAAK,QAAQ;AAC1D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,MAAM,MAAM;AACzF,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,MAAM,MAAM;AACzF,QAAM,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO,KAAK,MAAM,OAAO,MAAM,MAAM,MAAM;AACzF,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAMO,IAAM,oBAAkC,CAAC,KAAK,QAAQ;AAC3D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,QAAQ,MAAM,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC;AAC5J,QAAM,KAAK,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,QAAQ,MAAM,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC;AAC5J,QAAM,KAAK,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,QAAQ,MAAM,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC;AAC5J,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,qBAAmC,CAAC,KAAK,QAAQ;AAC5D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM;AAC3C,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM;AAC3C,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,MAAM;AAC3C,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,kBAAgC,CAAC,KAAK,QAAQ;AACzD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO;AAC1F,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO;AAC1F,QAAM,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO;AAC1F,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAClE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,iBAA+B,CAAC,KAAK,QAAQ;AACxD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,QAAQ,MAAM,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,IAAI;AAC5K,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,QAAQ,MAAM,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,IAAI;AAC5K,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,IAAI,GAAG,QAAQ,MAAM,MAAM,OAAO,IAAI,MAAM,EAAE,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,KAAK,KAAK,OAAO,KAAK,MAAM,OAAO,CAAC,KAAK,MAAM,IAAI;AAC5K,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,oBAAkC,CAAC,KAAK,QAAQ;AAC3D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AACpC,QAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AACpC,QAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AACpC,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAClE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,mBAAiC,CAAC,KAAK,QAAQ;AAC1D,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,MAAM;AACjB,QAAM,KAAK,QAAQ,IAAI;AACvB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM;AACtD,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM;AACtD,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM;AACtD,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAClE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,kBAAgC,CAAC,KAAK,QAAQ;AACzD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,MAAM,KAAK;AACjB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,MAAM,KAAK;AACjB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,QAAM,MAAM,KAAK;AACjB,QAAM,KAAK,MAAM,IAAI,IAAI;AACzB,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AAGO,IAAM,gBAA8B,CAAC,KAAK,QAAQ;AACvD,QAAM,KAAK,QAAQ,KAAK;AACxB,MAAI,OAAO,EAAG,QAAO;AACrB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,MAAM,KACf,KAAK,QAAQ,IAAI,KACjB,KAAK,QAAQ,KAAK;AACpB,QAAM,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC;AAC3D,QAAM,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC;AAC3D,QAAM,KAAK,OAAO,IAAI,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC;AAC3D,MAAI,OAAO,IAAK,SAAQ,aAAa,MAAM,KAAK,MAAM,IAAI,QAAQ;AAGlE,QAAM,OAAO,MAAM;AACnB,QAAM,KAAK,QAAQ,KAAK;AACxB,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,QAAM,KAAK,MAAM,KAAK,KAAK;AAC3B,QAAM,IAAI,KAAK,KAAK,MAAM,MAAM;AAChC,UAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C;AACO,IAAM,oCAAkE;AAAA,EAC7E,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,MAAM,GAAG;AAAA,EACxB,CAAC,cAAc,QAAQ,GAAG;AAAA,EAC1B,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,WAAW,GAAG;AAAA,EAC7B,CAAC,cAAc,OAAO,GAAG;AAAA,EACzB,CAAC,cAAc,MAAM,GAAG;AAAA,EACxB,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,WAAW,GAAG;AAAA,EAC7B,CAAC,cAAc,YAAY,GAAG;AAAA,EAC9B,CAAC,cAAc,OAAO,GAAG;AAAA,EACzB,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,WAAW,GAAG;AAAA,EAC7B,CAAC,cAAc,QAAQ,GAAG;AAAA,EAC1B,CAAC,cAAc,OAAO,GAAG;AAAA,EACzB,CAAC,cAAc,UAAU,GAAG;AAAA,EAC5B,CAAC,cAAc,SAAS,GAAG;AAAA,EAC3B,CAAC,cAAc,QAAQ,GAAG;AAAA,EAC1B,CAAC,cAAc,MAAM,GAAG;AAC1B;AACO,SAAS,6BAA6B,OAAO,WAAW;AAC7D,SAAO,sBAAsB,eAAe,mCAAmC,IAAI;AACrF;;;AC5sBO,SAAS,wBAAwB,OAAwB;AAC9D,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,OAAO,cAAc,eAAe,KAAK;AAC/C,QAAI,SAAS,OAAW,OAAM,IAAI,MAAM,kBAAkB,KAAK,EAAE;AACjE,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,MAAM,OAAO,OAAO;AAC1B,QAAM,YAAY,YAAY,MAAM,CAAC,OAAO,MAAM,GAAG;AACrD,MAAI,aAAa,OAAO,UAAU,GAAG,GAAG;AACtC,YAAQ,IAAI;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO,UAAU,GAAG;AAAA,IAC7B,CAAC;AACD,UAAM,OAAO,cAAc,eAAe,GAAG;AAC7C,YAAQ,IAAI;AAAA,MACV;AAAA,IACF,CAAC;AACD,QAAI,SAAS,OAAW,OAAM,IAAI,MAAM,kBAAkB,GAAG,EAAE;AAC/D,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,WAAW,eAAe;AAC5B,WAAO;AAAA,MACL,YAAY,cAAc,OAAqC;AAAA,MAC/D,WAAW;AAAA,IACb;AAAA,EACF;AACA,QAAM,IAAI,MAAM,uBAAuB,KAAK,UAAU,KAAK,CAAC,EAAE;AAChE;AACA,IAAM,gBAAgB,CAAC,KAAU,UAAe;AAC9C,aAAW,OAAO,KAAK;AACrB,QAAI,IAAI,GAAG,MAAM,MAAO,QAAO;AAAA,EACjC;AACF;;;AC1CO,IAAM,8BAA8B;AACpC,IAAM,oBAAoB;;;ACY1B,SAAS,gBAAgB,QAAwC;AACtE,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,iBAAiB;AAC3C,MAAI,wBAAwB;AAC5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,GAAW,GAAW;AAC3B,aAAO,QAAQ;AACf,aAAO,SAAS;AAChB,UAAI,wBAAwB;AAAA,IAC9B;AAAA,EACF;AACF;;;ACdO,SAAS,qBAAqB;AACnC,MAAI,SAAmC;AACvC,MAAI,MAAuC;AAC3C,WAASC,KAAI,OAAe,QAAgC;AAC1D,QAAI,WAAW,MAAM;AACnB,eAAS,SAAS,cAAc,QAAQ;AACxC,YAAM,OAAO,WAAW,IAAI;AAC5B,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,iBAAiB;AAAA,IAC7C;AAGA,QAAI,OAAO,UAAU,SAAS,OAAO,WAAW,QAAQ;AACtD,aAAO,QAAQ;AACf,aAAO,SAAS;AAChB,UAAK,wBAAwB;AAAA,IAC/B,OAAO;AAEL,UAAK,UAAU,GAAG,GAAG,OAAO,MAAM;AAAA,IACpC;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,EAAAA,KAAI,QAAQ,MAAM;AAChB,aAAS;AACT,UAAM;AAAA,EACR;AACA,SAAOA;AACT;;;ACpBA,eAAsB,mBAAmB,MAAgC;AACvE,MAAI,SAA6B;AACjC,MAAI;AACF,aAAS,MAAM,kBAAkB,IAAI;AACrC,UAAM,SAAS,IAAI,gBAAgB,OAAO,OAAO,OAAO,MAAM;AAC9D,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AACA,QAAI,UAAU,QAAQ,GAAG,CAAC;AAC1B,WAAO,IAAI,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,EAC3D,UAAE;AACA,YAAQ,MAAM;AAAA,EAChB;AACF;;;ACZA,eAAsB,0BAA0B,gBAAgC;AAC9E,QAAM,QAAQ,gBAAgB,eAAe;AAC7C,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,KAAK,WAAW,QAAQ,GAAG;AAClC,YAAM,OAAO,KAAK,UAAU;AAC5B,UAAI,CAAC,MAAM;AACT;AAAA,MACF;AACA,aAAO,mBAAmB,IAAI;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;;;AChBA,eAAsB,mBAAmB,WAAqC;AAC5E,QAAM,SAAS,IAAI,gBAAgB,UAAU,OAAO,UAAU,MAAM;AACpE,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,MAAI,aAAa,WAAW,GAAG,CAAC;AAChC,SAAO,OAAQ,cAAc;AAAA,IAC3B,MAAM;AAAA,EACR,CAAC;AACH;;;ACvBA,eAAsB,wBAAwB,MAA2B;AACvE,QAAM,OAAO,IAAI,cAAc;AAAA,IAC7B,aAAa;AAAA,EACf,CAAC;AACD,QAAM,UAAU,UAAU,MAAM,CAAC,IAAI,CAAC;AACxC;;;ACSA,eAAsB,0BAA0B,WAAqC;AACnF,QAAM,OAAO,MAAM,mBAAmB,SAAS;AAC/C,SAAO,wBAAwB,IAAI;AACrC;;;AClBO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAAmB,WAAW,IAAI;AAAf;AACjB,SAAK,YAAY,CAAC;AAClB,SAAK,YAAY,CAAC;AAClB,SAAK,YAAY,oBAAI,IAAI;AAAA,EAC3B;AAAA,EAPO;AAAA,EACA;AAAA,EACA;AAAA,EAMP,IAAI,UAAU;AACZ,WAAO,KAAK,UAAU,SAAS;AAAA,EACjC;AAAA,EACA,IAAI,UAAU;AACZ,WAAO,KAAK,UAAU,SAAS;AAAA,EACjC;AAAA,EACA,UAAU,IAAgB;AACxB,SAAK,UAAU,IAAI,EAAE;AACrB,WAAO,MAAM,KAAK,UAAU,OAAO,EAAE;AAAA,EACvC;AAAA,EACA,SAAS;AACP,SAAK,UAAU,QAAQ,QAAM,GAAG,CAAC;AAAA,EACnC;AAAA,EACA,OAAO,QAAuB;AAC5B,SAAK,UAAU,KAAK,MAAM;AAC1B,SAAK,eAAe;AACpB,QAAI,KAAK,UAAU,SAAS,KAAK,UAAU;AACzC,WAAK,UAAU,MAAM,GAAG,UAAU;AAAA,IACpC;AACA,SAAK,OAAO;AAAA,EACd;AAAA,EACA,OAAO;AACL,QAAI,SAAS,KAAK,UAAU,IAAI;AAChC,QAAI,CAAC,OAAQ;AACb,SAAK,UAAU,KAAK,MAAM;AAC1B,WAAO,KAAK;AACZ,SAAK,OAAO;AAAA,EACd;AAAA,EACA,OAAO;AACL,QAAI,SAAS,KAAK,UAAU,IAAI;AAChC,QAAI,CAAC,OAAQ;AACb,SAAK,UAAU,KAAK,MAAM;AAC1B,WAAO,KAAK;AACZ,SAAK,OAAO;AAAA,EACd;AAAA,EACA,iBAAiB;AACf,QAAI,SAAS,KAAK,UAAU;AAC5B,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,UAAI,SAAS,KAAK,UAAU,CAAC;AAC7B,UAAI,QAAQ;AACV,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AACA,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;;;ACvDO,IAAM,YAAN,MAAgB;AAAA,EAErB,YAAmB,IAAmB,IAAmB,IAAY,UAAkB;AAApE;AAAmB;AAAmB;AACvD,SAAK,SAAS,IAAI,YAAY,QAAQ;AAAA,EACxC;AAAA,EAHO;AAIT;AACO,SAAS,gBAAgB,QAAoB,OAAoB,WAAmB,KAAK;AAC9F,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,MAAM,OAAO;AACnB,UAAM,MAAM,KAAK;AACjB,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,OAAO;AACzB,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,SAAS,KAAK,KAAK;AAGzB,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,WAAW,MAAM,CAAC;AACnE,QAAI,aAAa,EAAG;AACpB,aAAS,KAAK,GAAG,KAAK,UAAU,MAAM;AACpC,YAAM,UAAU,SAAS;AAGzB,UAAI,WAAW,UAAW;AAC1B,YAAM,WAAW,UAAU,WAAW;AACtC,YAAM,WAAW,KAAK;AACtB,YAAM,UAAU,IAAI,SAAS,UAAU,WAAW,SAAS;AAC3D,UAAI,IAAI,SAAS,QAAQ;AAAA,IAC3B;AAAA,EACF;AACF;;;AClCO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAmB,QAA6B,QAA2B;AAAxD;AAA6B;AAC9C,SAAK,SAAS,CAAC;AACf,SAAK,cAAc,CAAC;AACpB,SAAK,OAAO,CAAC;AAAA,EACf;AAAA,EAPO;AAAA,EACA;AAAA,EACA;AAAA,EAMP,QAAQ,IAAY,IAAY,IAAuB;AACrD,QAAI,OAAO,KAAK,KAAK,IAAI;AACzB,QAAI,MAAM;AACR,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AACV,aAAO;AAAA,IACT;AACA,WAAO,IAAI,UAAU,IAAI,IAAI,IAAI,KAAK,OAAO,QAAQ;AAAA,EACvD;AAAA,EACA,aAAa,OAAwB;AACnC,UAAM,SAAS,MAAM;AACrB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,OAAO,OAAO,CAAC;AACnB,UAAI,MAAM;AACR,aAAK,KAAK,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AACA,UAAM,QAAQ,MAAM;AACpB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAI,OAAO,MAAM,CAAC;AAClB,UAAI,MAAM;AACR,aAAK,KAAK,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,GAAW,GAAiB;AAC/C,QAAI,SAAS,KAAK;AAClB,QAAI,QAAQ,KAAK,OAAO;AACxB,QAAI,UAAU,OAAO,QAAQ,KAAK,OAAO,YAAY;AACrD,QAAI,KAAK,KAAK;AACd,QAAI,KAAK,KAAK;AACd,QAAI,KAAK,KAAK,UAAU;AACxB,QAAI,OAAO,KAAK,OAAO,EAAE;AACzB,QAAI,CAAC,MAAM;AACT,aAAO,KAAK,QAAQ,IAAI,IAAI,EAAE;AAC9B,WAAK,aAAa,IAAI;AACtB,WAAK,OAAO,EAAE,IAAI;AAClB,WAAK,YAAY,KAAK,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,uBAAuB,GAAW,GAAW,GAAW,GAAW;AACjE,QAAI,SAAS,KAAK;AAClB,QAAI,QAAQ,KAAK,OAAO;AACxB,QAAI,UAAU,OAAO,QAAQ,KAAK,OAAO,YAAY;AACrD,QAAI,SAAS,KAAK;AAClB,QAAI,SAAS,KAAK;AAClB,QAAI,OAAO,IAAI,IAAI,KAAK;AACxB,QAAI,OAAO,IAAI,IAAI,KAAK;AACxB,aAAS,KAAK,QAAQ,MAAM,MAAM,MAAM;AACtC,eAAS,KAAK,QAAQ,MAAM,MAAM,MAAM;AACtC,YAAI,KAAK,KAAK,UAAU;AACxB,YAAI,OAAO,KAAK,OAAO,EAAE;AACzB,YAAI,CAAC,MAAM;AACT,iBAAO,KAAK,QAAQ,IAAI,IAAI,EAAE;AAC9B,eAAK,aAAa,IAAI;AACtB,eAAK,OAAO,EAAE,IAAI;AAClB,eAAK,YAAY,KAAK,IAAI;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa,MAAiB;AAC5B,QAAI,SAAS,KAAK;AAClB,QAAI,YAAY,KAAK,OAAO;AAC5B,QAAI,MAAM,KAAK;AACf,QAAI,MAAM,OAAO;AACjB,QAAI,SAAS,KAAK,KAAK;AACvB,QAAI,SAAS,KAAK,KAAK;AACvB,QAAI,cAAc,OAAO;AACzB,QAAI,eAAe,OAAO;AAC1B,QAAI,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,cAAc,MAAM,CAAC;AACrE,aAAS,KAAK,GAAG,KAAK,WAAW,MAAM;AACrC,UAAI,UAAU,SAAS;AACvB,UAAI,WAAW,KAAK;AACpB,UAAI,UAAU,KAAK,WAAW,gBAAgB,cAAc,GAAG;AAC7D,YAAI,KAAK,GAAG,UAAU,WAAW,SAAS;AAC1C;AAAA,MACF;AACA,UAAI,WAAW,UAAU,cAAc;AACvC,UAAI,UAAU,IAAI,SAAS,UAAU,WAAW,SAAS;AACzD,UAAI,IAAI,SAAS,QAAQ;AACzB,UAAI,YAAY,WAAW;AACzB,YAAI,KAAK,GAAG,WAAW,WAAW,WAAW,SAAS;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAAA,EACA,oBAAiC;AAC/B,QAAI,aAA0B,CAAC;AAC/B,QAAI,SAAS,KAAK,YAAY;AAC9B,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,UAAI,aAAa,KAAK,YAAY,CAAC;AACnC,UAAI,YAAY;AACd,YAAI,YAAY,KAAK,QAAQ,WAAW,IAAI,WAAW,IAAI,WAAW,EAAE;AACxE,aAAK,aAAa,SAAS;AAC3B,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ;AACN,SAAK,SAAS,CAAC;AACf,SAAK,cAAc,CAAC;AAAA,EACtB;AACF;;;AC/HO,IAAM,oBAAN,MAAwB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAChB,YAAY,WAAmB,KAAK;AAElC,SAAK,WAAW,WAAW,OAAO,GAAG;AACnC,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AACA,SAAK,WAAW;AAChB,SAAK,YAAY,KAAK,KAAK,QAAQ;AACnC,SAAK,WAAW,WAAW;AAC3B,SAAK,WAAW,WAAW;AAAA,EAC7B;AACF;;;ACfO,SAAS,0BAA0B,KAAiB,MAAiB,OAAoC,CAAC,GAAS;AACxH,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,OAAO,cAAc;AAAA,IACrB;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,gBAAgB,EAAG;AAGvB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AAC7B,MAAI,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC9B,MAAI,KAAK,EAAG;AACZ,MAAI,KAAK,EAAG;AAGZ,QAAM,SAAS,MAAM;AACrB,MAAI,UAAU,EAAG;AACjB,QAAM,aAAa,KAAK,SAAS,SAAS;AAI1C,QAAM,SAAS,MAAM,IAAI;AACzB,QAAM,SAAS,MAAM,IAAI;AAGzB,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,QAAQ,SAAS,CAAC;AACvC,QAAM,MAAM,KAAK,IAAI,YAAY,SAAS,CAAC;AAC3C,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AAGrB,MAAI,UAAU,EAAG;AACjB,MAAI,UAAU,EAAG;AAIjB,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AACrB,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,UAAU,KAAK;AACrB,QAAM,UAAU,SAAS;AACzB,MAAI,QAAQ,IAAI,UAAU,MAAM,IAAI;AACpC,MAAI,OAAO,MAAM,SAAS;AAC1B,WAAS,KAAK,GAAG,KAAK,GAAG,MAAM;AAC7B,aAAS,KAAK,GAAG,KAAK,GAAG,MAAM;AAC7B,YAAM,OAAO,KAAK,IAAI;AAEtB,YAAM,aAAa,aAAa,MAAM,OAAO;AAC7C,UAAI,SAAS;AACb,UAAI,eAAe,GAAG;AACpB,iBAAS;AAAA,MACX,WAAW,eAAe,KAAK;AAC7B,iBAAS;AAAA,MACX,WAAW,gBAAgB,KAAK;AAC9B,iBAAS;AAAA,MACX,OAAO;AACL,iBAAS,aAAa,cAAc,OAAO;AAAA,MAC7C;AACA,UAAI,WAAW,GAAG;AAEhB,cAAM,IAAI,KAAK,MAAM,IAAI,IAAI,cAAgB;AAAA,MAC/C,WAAW,WAAW,KAAK;AAEzB,cAAM,IAAI,MAAM,IAAI;AACpB,cAAM,KAAK,MAAM;AACjB,YAAI,OAAO,GAAG;AACZ,gBAAM,aAAa,OAAO,MAAM,SAAS,KAAK,SAAS,OAAO;AAC9D,gBAAM,IAAI,KAAK,IAAI,WAAa,cAAc,QAAQ;AAAA,QACxD;AAAA,MACF;AACA;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AC/FA,IAAM,WAAW;AAAA,EACf;AACF;AAEO,IAAM,yBAAyB,CAAC,QAA0B,OAAa,aAAa;AACzF,QAAM;AAAA,IACJ,2BAAAC,6BAA4B,SAAS;AAAA,EACvC,IAAI;AACJ,SAAO;AAAA,IACL,gBAAgB,CAAC,MAAiB,OAAoC,CAAC,MAAM;AAC3E,UAAI,SAAS,OAAO;AACpB,YAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,OAAO,OAAO;AAAA,QAClB,IAAI,OAAO,OAAO;AAAA,MACpB,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAA,2BAA0B,QAAQ,MAAM,IAAI;AAAA,IAC9C;AAAA,EACF;AACF;;;ACnBO,SAAS,2BAA2B,KAAiB,MAAkB,OAAoC,CAAC,GAAS;AAC1H,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,QAAQ;AAAA,IACR;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,UAAU,EAAG;AAGjB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AAC7B,MAAI,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC9B,MAAI,KAAK,EAAG;AACZ,MAAI,KAAK,EAAG;AAGZ,QAAM,SAAS,MAAM;AACrB,MAAI,UAAU,EAAG;AACjB,QAAM,aAAa,KAAK,SAAS,SAAS;AAI1C,QAAM,SAAS,MAAM,IAAI;AACzB,QAAM,SAAS,MAAM,IAAI;AAGzB,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,QAAQ,SAAS,CAAC;AACvC,QAAM,MAAM,KAAK,IAAI,YAAY,SAAS,CAAC;AAC3C,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AAGrB,MAAI,UAAU,EAAG;AACjB,MAAI,UAAU,EAAG;AAIjB,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AACrB,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,UAAU,KAAK;AACrB,QAAM,UAAU,SAAS;AACzB,MAAI,QAAQ,IAAI,UAAU,MAAM,IAAI;AACpC,MAAI,OAAO,MAAM,SAAS;AAC1B,WAAS,KAAK,GAAG,KAAK,GAAG,MAAM;AAC7B,aAAS,KAAK,GAAG,KAAK,GAAG,MAAM;AAC7B,YAAM,OAAO,KAAK,IAAI;AAEtB,YAAM,cAAc,aAAa,SAAS,IAAI,SAAS;AACvD,UAAI,aAAa;AAEf,cAAM,IAAI,KAAK,MAAM,IAAI,IAAI,cAAgB;AAAA,MAC/C,WAAW,UAAU,KAAK;AACxB,cAAM,IAAI,MAAM,IAAI;AACpB,cAAM,KAAK,MAAM;AAGjB,YAAI,OAAO,GAAG;AACZ,gBAAM,aAAa,OAAO,MAAM,QAAQ,KAAK,QAAQ,OAAO;AAC5D,gBAAM,IAAI,KAAK,IAAI,WAAa,cAAc,QAAQ;AAAA,QACxD;AAAA,MACF;AACA;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AC1FA,IAAMC,YAAW;AAAA,EACf;AACF;AAEO,IAAM,0BAA0B,CAAC,QAA0B,OAAaA,cAAa;AAC1F,QAAM;AAAA,IACJ,4BAAAC,8BAA6BD,UAAS;AAAA,EACxC,IAAI;AACJ,SAAO;AAAA,IACL,iBAAiB,CAAC,MAAkB,OAAoC,CAAC,MAAM;AAC7E,UAAI,SAAS,OAAO;AACpB,YAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,OAAO,OAAO;AAAA,QAClB,IAAI,OAAO,OAAO;AAAA,MACpB,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAC,4BAA2B,QAAQ,MAAM,IAAI;AAAA,IAC/C;AAAA,EACF;AACF;;;ACvBO,SAAS,6BAA6B,SAAiB,SAAiB,WAAmB,aAAqB,cAAsB,KAAkB;AAC7J,QAAM,IAAI,YAAY;AACtB,QAAM,YAAY,CAAC,KAAK,KAAK,IAAI,GAAG;AACpC,QAAM,YAAY,KAAK,MAAM,IAAI,GAAG;AAGpC,QAAM,SAAS,KAAK,MAAM,UAAU,SAAS;AAC7C,QAAM,SAAS,KAAK,MAAM,UAAU,SAAS;AAC7C,QAAM,OAAO,KAAK,MAAM,UAAU,SAAS,IAAI;AAC/C,QAAM,OAAO,KAAK,MAAM,UAAU,SAAS,IAAI;AAC/C,QAAM,MAAM,OAAO;AAAA,IACjB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,MAAM;AAClC,QAAM,UAAU,KAAK,IAAI,GAAG,MAAM;AAClC,QAAM,QAAQ,KAAK,IAAI,aAAa,IAAI;AACxC,QAAM,QAAQ,KAAK,IAAI,cAAc,IAAI;AACzC,QAAM,IAAI,QAAQ;AAClB,QAAM,IAAI,QAAQ;AAClB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,IAAI,IAAI,IAAI;AACpB,MAAI,IAAI,IAAI,IAAI,IAAI;AACpB,SAAO;AACT;;;ACRO,SAAS,4BAA4B,QAAoB,OAAgB,SAAiB,SAAiB,WAAmB,QAAQ,KAAK,SAAmC,UAAwB,mBAAmB,QAAqB;AACnP,QAAM,cAAc,OAAO;AAC3B,QAAM,eAAe,OAAO;AAG5B,QAAM,IAAI,UAAU,6BAA6B,SAAS,SAAS,WAAW,aAAa,YAAY;AACvG,MAAI,EAAE,KAAK,KAAK,EAAE,KAAK,EAAG;AAC1B,QAAM,SAAS,OAAO;AACtB,QAAM,IAAI,YAAY;AACtB,QAAM,OAAO,IAAI;AACjB,QAAM,OAAO,IAAI;AACjB,QAAM,eAAe,YAAY,MAAM,IAAI,MAAM;AACjD,QAAM,OAAO,EAAE,IAAI,EAAE;AACrB,QAAM,OAAO,EAAE,IAAI,EAAE;AAGrB,QAAM,WAAW,KAAK,MAAM,OAAO;AACnC,QAAM,WAAW,KAAK,MAAM,OAAO;AACnC,QAAM,eAAe,UAAU;AAC/B,QAAM,WAAW,QAAQ;AACzB,QAAM,WAAW,UAAU;AAC3B,QAAM,cAAe,QAAgB;AACrC,WAAS,KAAK,EAAE,GAAG,KAAK,MAAM,MAAM;AAClC,UAAM,OAAO,KAAK,WAAW;AAC7B,UAAM,QAAQ,OAAO;AACrB,UAAM,YAAY,KAAK;AACvB,aAAS,KAAK,EAAE,GAAG,KAAK,MAAM,MAAM;AAClC,YAAM,OAAO,KAAK,WAAW;AAC7B,YAAM,OAAO,OAAO,OAAO;AAC3B,UAAI,QAAQ,MAAM;AAChB,cAAM,MAAM,YAAY;AACxB,YAAI,SAAS;AACb,cAAM,WAAW,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI;AACnD,cAAM,UAAU,WAAW,MAAM;AACjC,YAAI,YAAY,EAAG;AAGnB,YAAI,UAAU;AACZ,mBAAS;AAAA,QACX,WAAW,YAAY,KAAK;AAC1B,mBAAS,UAAU,QAAQ,OAAO;AAAA,QACpC;AAGA,YAAI,WAAW;AACf,YAAI,SAAS,KAAK;AAChB,gBAAM,IAAI,eAAe,SAAS,OAAO;AACzC,cAAI,MAAM,KAAK,CAAC,YAAa;AAC7B,sBAAY,WAAW,KAAK,QAAQ;AAAA,QACtC;AACA,eAAO,GAAG,IAAI,QAAQ,UAAU,OAAO,GAAG,CAAY;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;;;ACtEA,IAAMC,YAAW;AAAA,EACf;AAAA,EACA;AACF;AAEO,IAAM,2BAA2B,CAAC,QAA0B,OAAaA,cAAa;AAC3F,QAAM;AAAA,IACJ,6BAAAC,+BAA8BD,UAAS;AAAA,IACvC,8BAAAE,gCAA+BF,UAAS;AAAA,EAC1C,IAAI;AACJ,QAAM,YAAkB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,iBAAiB,OAAgB,SAAiB,SAAiB,WAAmB,QAAQ,KAAK,SAAmC,SAAwB;AAC5J,YAAM,SAASE,8BAA6B,SAAS,SAAS,WAAW,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,SAAS;AAC7H,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAD,6BAA4B,OAAO,QAAQ,OAAO,SAAS,SAAS,WAAW,OAAO,SAAS,SAAS,MAAM;AAAA,IAChH;AAAA,EACF;AACF;;;AC5BO,SAAS,iBAAiB,IAAY,IAAY,IAAY,IAAY,UAAgD;AAC/H,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAGhB,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC;AAGjD,MAAI,UAAU,GAAG;AACf,aAAS,IAAI,EAAE;AACf;AAAA,EACF;AACA,QAAM,OAAO,KAAK;AAClB,QAAM,OAAO,KAAK;AAClB,MAAI,OAAO;AACX,MAAI,OAAO;AAGX,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,aAAS,MAAM,IAAI;AACnB,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;ACzBO,SAAS,6BAA6B,KAAiB,OAAgB,MAAiB,MAA6B;AAC1H,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,OAAO,cAAc;AAAA,IACrB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,gBAAgB,KAAK,CAAC,KAAM;AAChC,QAAM,eAAe,UAAU;AAC/B,QAAM,cAAe,QAAgB,eAAe;AACpD,MAAI,iBAAiB,KAAK,CAAC,YAAa;AACxC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC1C,MAAI,WAAW,KAAK,WAAW,EAAG;AAClC,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,SAAS;AACf,MAAI,OAAO,IAAI,KAAK,IAAI;AACxB,MAAI,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM;AAC5C,QAAM,UAAU,KAAK,UAAU;AAC/B,MAAI,UAAU,SAAS,UAAU;AACjC,QAAM,WAAW,gBAAgB;AACjC,QAAM,WAAW,QAAQ;AACzB,WAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,YAAM,OAAO,KAAK,IAAI;AACtB,YAAM,OAAO,aAAa,MAAM,OAAO;AACvC,UAAI,SAAS,GAAG;AACd;AACA;AACA;AAAA,MACF;AACA,UAAI,SAAS;AACb,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX,WAAW,SAAS,KAAK;AACvB,iBAAS,OAAO,cAAc,OAAO;AAAA,MACvC;AACA,UAAI,WAAW,GAAG;AAChB;AACA;AACA;AAAA,MACF;AACA,UAAI,WAAW;AACf,UAAI,SAAS,KAAK;AAChB,cAAM,IAAI,eAAe,SAAS,OAAO;AACzC,YAAI,MAAM,KAAK,CAAC,aAAa;AAC3B;AACA;AACA;AAAA,QACF;AACA,oBAAY,WAAW,KAAK,QAAQ;AAAA,MACtC;AACA,YAAM,IAAI,IAAI,QAAQ,UAAU,MAAM,IAAI,CAAY;AACtD;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AClFO,SAAS,mCAAmC,IAAY,IAAY,IAAY,IAAY,WAAmB,QAAoB;AACxI,QAAM,IAAI,KAAK,KAAK,YAAY,CAAC;AACjC,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,SAAO,IAAI,KAAK,MAAM,IAAI;AAC1B,SAAO,IAAI,KAAK,MAAM,IAAI;AAC1B,SAAO,IAAI,KAAK,KAAK,OAAO,IAAI;AAChC,SAAO,IAAI,KAAK,KAAK,OAAO,IAAI;AAChC,SAAO;AACT;;;ACLA,IAAME,YAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,iCAAiC,CAAC,QAA0B,OAAaA,cAAa;AACjG,QAAM;AAAA,IACJ,kBAAAC,oBAAmBD,UAAS;AAAA,IAC5B,8BAAAE,gCAA+BF,UAAS;AAAA,IACxC,8BAAAG,gCAA+BH,UAAS;AAAA,IACxC,oCAAAI,sCAAqCJ,UAAS;AAAA,EAChD,IAAI;AACJ,QAAM,kBAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,oBAA0B;AAAA,IAC9B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,yBAAgD;AAAA,IACpD,OAAO;AAAA,IACP,SAAS;AAAA,IACT,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,uBAAuB,OAAgB,IAAY,IAAY,IAAY,IAAY,WAAmB,QAAQ,KAAK,SAAmC,UAAwB,mBAAmB;AACnM,YAAM;AAAA,QACJ,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,IAAII,oCAAmC,IAAI,IAAI,IAAI,IAAI,WAAW,eAAe;AACjF,UAAI,MAAM,KAAK,MAAM,EAAG;AACxB,YAAM,OAAO,IAAI,WAAW,KAAK,EAAE;AACnC,YAAM,IAAI,YAAY;AACtB,YAAM,OAAO,IAAI;AACjB,YAAM,OAAO,IAAI;AACjB,YAAM,eAAe,YAAY,MAAM,IAAI,MAAM;AACjD,YAAM,cAAc,OAAO,OAAO;AAClC,YAAM,eAAe,OAAO,OAAO;AACnC,MAAAH,kBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO;AAE3C,cAAM;AAAA,UACJ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL,IAAIE,8BAA6B,IAAI,IAAI,WAAW,aAAa,cAAc,iBAAiB;AAChG,eAAO,YAAY,uBAAuB,KAAK,KAAK,KAAK,GAAG;AAC5D,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,iBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,gBAAM,KAAK,KAAK,MAAM;AACtB,gBAAM,QAAQ,KAAK;AACnB,gBAAM,iBAAiB,KAAK,MAAM;AAClC,mBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,kBAAM,KAAK,KAAK,MAAM;AACtB,kBAAM,OAAO,KAAK,KAAK;AACvB,gBAAI,QAAQ,MAAM;AAChB,oBAAM,UAAU,iBAAiB,KAAK;AACtC,oBAAM,OAAO,KAAK,KAAK,IAAI,IAAI;AAC/B,oBAAM,YAAY,QAAQ,IAAI,IAAI,IAAI,MAAM;AAC5C,kBAAI,YAAY,KAAK,OAAO,GAAG;AAC7B,qBAAK,OAAO,IAAI;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,6BAAuB,UAAU;AACjC,6BAAuB,QAAQ;AAC/B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,MAAAD,8BAA6B,OAAO,QAAQ,OAAO,MAAM,sBAAsB;AAAA,IACjF;AAAA,EACF;AACF;;;AChGO,SAAS,8BAA8B,KAAiB,OAAgB,MAAkB,OAA8B,CAAC,GAAG;AACjI,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,OAAO,cAAc;AAAA,IACrB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,gBAAgB,KAAK,CAAC,KAAM;AAChC,QAAM,eAAe,UAAU;AAC/B,QAAM,cAAe,QAAgB,eAAe;AACpD,MAAI,iBAAiB,KAAK,CAAC,YAAa;AACxC,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC1C,MAAI,WAAW,KAAK,WAAW,EAAG;AAClC,MAAI,2BAA2B;AAC/B,MAAI,cAAc,KAAK;AACrB,UAAM,IAAI,eAAe,cAAc,OAAO;AAC9C,QAAI,MAAM,KAAK,CAAC,YAAa;AAC7B,gCAA4B,QAAQ,WAAa,KAAK,QAAQ;AAAA,EAChE;AACA,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,SAAS;AACf,MAAI,OAAO,IAAI,KAAK,IAAI;AACxB,MAAI,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM;AAC5C,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,UAAU,SAAS,UAAU;AACnC,QAAM,UAAU,aAAa,IAAI;AACjC,WAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,UAAI,KAAK,IAAI,MAAM,SAAS;AAC1B;AACA;AACA;AAAA,MACF;AACA,YAAM,IAAI,IAAI,QAAQ,0BAA0B,MAAM,IAAI,CAAY;AACtE;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AC1DA,IAAMG,YAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,kCAAkC,CAAC,QAA0B,OAAaA,cAAa;AAClG,QAAM;AAAA,IACJ,kBAAAC,oBAAmBD,UAAS;AAAA,IAC5B,+BAAAE,iCAAgCF,UAAS;AAAA,IACzC,oCAAAG,sCAAqCH,UAAS;AAAA,IAC9C,8BAAAI,gCAA+BJ,UAAS;AAAA,EAC1C,IAAI;AACJ,QAAM,kBAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,qBAA2B;AAAA,IAC/B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,yBAAgD;AAAA,IACpD,OAAO;AAAA,IACP,SAAS;AAAA,IACT,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,wBAAwB,OAAgB,IAAY,IAAY,IAAY,IAAY,WAAmB,QAAQ,KAAK,UAAwB,mBAAmB;AACjK,YAAM;AAAA,QACJ,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,IAAIG,oCAAmC,IAAI,IAAI,IAAI,IAAI,WAAW,eAAe;AACjF,UAAI,MAAM,KAAK,MAAM,EAAG;AACxB,YAAM,OAAO,IAAI,WAAW,KAAK,EAAE;AACnC,YAAM,IAAI,YAAY;AACtB,YAAM,OAAO,IAAI;AACjB,YAAM,eAAe,YAAY,MAAM,IAAI,MAAM;AACjD,YAAM,cAAc,OAAO,OAAO;AAClC,YAAM,eAAe,OAAO,OAAO;AACnC,MAAAF,kBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO;AAE3C,cAAM;AAAA,UACJ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL,IAAIG,8BAA6B,IAAI,IAAI,WAAW,aAAa,cAAc,kBAAkB;AACjG,eAAO,YAAY,uBAAuB,KAAK,KAAK,KAAK,GAAG;AAC5D,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,iBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,gBAAM,KAAK,KAAK,MAAM;AACtB,gBAAM,QAAQ,KAAK;AACnB,gBAAM,iBAAiB,KAAK,MAAM;AAClC,mBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,kBAAM,KAAK,KAAK,MAAM;AACtB,kBAAM,OAAO,KAAK,KAAK;AACvB,gBAAI,QAAQ,MAAM;AAChB,oBAAM,UAAU,iBAAiB,KAAK;AACtC,mBAAK,OAAO,IAAI;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,6BAAuB,UAAU;AACjC,6BAAuB,QAAQ;AAC/B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,MAAAF,+BAA8B,OAAO,QAAQ,OAAO,MAAM,sBAAsB;AAAA,IAClF;AAAA,EACF;AACF;;;AC7FO,SAAS,2BAA2B,SAAiB,SAAiB,YAAoB,aAAqB,aAAqB,cAAsB,KAAkB;AACjL,QAAM,SAAS,KAAK,MAAM,UAAU,aAAa,CAAC;AAClD,QAAM,SAAS,KAAK,MAAM,UAAU,cAAc,CAAC;AACnD,QAAM,OAAO,SAAS;AACtB,QAAM,OAAO,SAAS;AACtB,QAAM,MAAM,OAAO;AAAA,IACjB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,MAAM;AAClC,QAAM,UAAU,KAAK,IAAI,GAAG,MAAM;AAClC,QAAM,QAAQ,KAAK,IAAI,aAAa,IAAI;AACxC,QAAM,QAAQ,KAAK,IAAI,cAAc,IAAI;AACzC,QAAM,IAAI,QAAQ;AAClB,QAAM,IAAI,QAAQ;AAClB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,IAAI,IAAI,IAAI;AACpB,MAAI,IAAI,IAAI,IAAI,IAAI;AACpB,SAAO;AACT;;;ACnBO,SAAS,0BAA0B,QAAoB,OAAgB,SAAiB,SAAiB,YAAoB,aAAqB,QAAQ,KAAK,SAAmC,UAAwB,mBAAmB,QAAqB;AACvQ,QAAM,cAAc,OAAO;AAC3B,QAAM,eAAe,OAAO;AAC5B,QAAM,IAAI,UAAU,2BAA2B,SAAS,SAAS,YAAY,aAAa,aAAa,YAAY;AACnH,MAAI,EAAE,KAAK,KAAK,EAAE,KAAK,EAAG;AAC1B,QAAM,SAAS,OAAO;AACtB,QAAM,YAAY,QAAQ;AAC1B,QAAM,eAAe,UAAU;AAC/B,QAAM,WAAW,UAAU;AAC3B,QAAM,WAAW,KAAK,aAAa;AACnC,QAAM,WAAW,KAAK,cAAc;AAGpC,QAAM,gBAAgB,aAAa,MAAM,IAAI,MAAM;AACnD,QAAM,gBAAgB,cAAc,MAAM,IAAI,MAAM;AACpD,QAAM,WAAW,KAAK,MAAM,OAAO;AACnC,QAAM,WAAW,KAAK,MAAM,OAAO;AACnC,QAAM,OAAO,EAAE,IAAI,EAAE;AACrB,QAAM,OAAO,EAAE,IAAI,EAAE;AACrB,QAAM,cAAe,QAAgB;AACrC,WAAS,KAAK,EAAE,GAAG,KAAK,MAAM,MAAM;AAClC,UAAM,YAAY,KAAK;AACvB,UAAM,KAAK,KAAK,IAAI,KAAK,WAAW,aAAa,IAAI;AACrD,aAAS,KAAK,EAAE,GAAG,KAAK,MAAM,MAAM;AAClC,YAAM,MAAM,YAAY;AACxB,YAAM,KAAK,KAAK,IAAI,KAAK,WAAW,aAAa,IAAI;AACrD,YAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,YAAM,WAAW,QAAQ,IAAI;AAC7B,YAAM,UAAU,WAAW,MAAM;AACjC,UAAI,WAAW,EAAG;AAClB,UAAI,SAAS;AACb,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX,WAAW,YAAY,KAAK;AAC1B,iBAAS,UAAU,QAAQ,OAAO;AAAA,MACpC;AACA,UAAI,WAAW;AACf,UAAI,SAAS,KAAK;AAChB,cAAM,IAAI,eAAe,SAAS,OAAO;AACzC,YAAI,MAAM,KAAK,CAAC,YAAa;AAC7B,oBAAY,KAAK,KAAK,eAAe;AAAA,MACvC;AACA,aAAO,GAAG,IAAI,QAAQ,UAAU,OAAO,GAAG,CAAY;AAAA,IACxD;AAAA,EACF;AACF;;;AC7CA,IAAMG,YAAW;AAAA,EACf;AAAA,EACA;AACF;AAEO,IAAM,yBAAyB,CAAC,QAA0B,OAAaA,cAAa;AACzF,QAAM;AAAA,IACJ,2BAAAC,6BAA4BD,UAAS;AAAA,IACrC,4BAAAE,8BAA6BF,UAAS;AAAA,EACxC,IAAI;AACJ,QAAM,YAAkB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,eAAe,OAAgB,SAAiB,SAAiB,YAAoB,aAAqB,QAAQ,KAAK,SAAmC,SAAwB;AAChL,YAAM,SAASE,4BAA2B,SAAS,SAAS,YAAY,aAAa,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,SAAS;AACzI,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAD,2BAA0B,OAAO,QAAQ,OAAO,SAAS,SAAS,YAAY,aAAa,OAAO,SAAS,SAAS,MAAM;AAAA,IAC5H;AAAA,EACF;AACF;;;AChCO,SAAS,iCAAiC,IAAY,IAAY,IAAY,IAAY,YAAoB,aAAqB,QAAoB;AAC5J,QAAM,QAAQ,aAAa;AAC3B,QAAM,QAAQ,cAAc;AAC5B,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,QAAM,OAAO,KAAK,IAAI,IAAI,EAAE,IAAI;AAChC,SAAO,IAAI,KAAK,MAAM,IAAI;AAC1B,SAAO,IAAI,KAAK,MAAM,IAAI;AAC1B,SAAO,IAAI,KAAK,KAAK,OAAO,IAAI;AAChC,SAAO,IAAI,KAAK,KAAK,OAAO,IAAI;AAChC,SAAO;AACT;;;ACNA,IAAME,YAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,+BAA+B,CAAC,QAA0B,OAAaA,cAAa;AAC/F,QAAM;AAAA,IACJ,kBAAAC,oBAAmBD,UAAS;AAAA,IAC5B,8BAAAE,gCAA+BF,UAAS;AAAA,IACxC,4BAAAG,8BAA6BH,UAAS;AAAA,IACtC,kCAAAI,oCAAmCJ,UAAS;AAAA,EAC9C,IAAI;AACJ,QAAM,kBAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,kBAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,yBAA4C;AAAA,IAChD,OAAO;AAAA,IACP,SAAS;AAAA,IACT,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,qBAAqB,OAAgB,IAAY,IAAY,IAAY,IAAY,YAAoB,aAAqB,QAAQ,KAAK,SAAmC,UAAwB,mBAAmB;AACvN,YAAM;AAAA,QACJ,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,IAAII,kCAAiC,IAAI,IAAI,IAAI,IAAI,YAAY,aAAa,eAAe;AAC7F,UAAI,MAAM,KAAK,MAAM,EAAG;AACxB,YAAM,OAAO,IAAI,WAAW,KAAK,EAAE;AACnC,YAAM,QAAQ,aAAa;AAC3B,YAAM,QAAQ,cAAc;AAC5B,YAAM,WAAW,IAAI;AACrB,YAAM,WAAW,IAAI;AAGrB,YAAM,gBAAgB,aAAa,MAAM,IAAI,MAAM;AACnD,YAAM,gBAAgB,cAAc,MAAM,IAAI,MAAM;AACpD,YAAM,cAAc,OAAO,OAAO;AAClC,YAAM,eAAe,OAAO,OAAO;AACnC,MAAAH,kBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO;AAC3C,cAAM;AAAA,UACJ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL,IAAIE,4BAA2B,IAAI,IAAI,YAAY,aAAa,aAAa,cAAc,eAAe;AAC1G,eAAO,YAAY,uBAAuB,KAAK,KAAK,KAAK,GAAG;AAC5D,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AAGxC,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,iBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,gBAAM,KAAK,KAAK,IAAI,KAAK,MAAM,aAAa,IAAI;AAChD,gBAAM,iBAAiB,KAAK,MAAM;AAClC,mBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,kBAAM,KAAK,KAAK,IAAI,KAAK,MAAM,aAAa,IAAI;AAChD,kBAAM,UAAU,iBAAiB,KAAK;AACtC,kBAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,kBAAM,WAAW,QAAS,IAAI;AAC9B,gBAAI,WAAW,GAAG;AAChB,oBAAM,YAAY,WAAW,MAAM;AACnC,kBAAI,YAAY,KAAK,OAAO,GAAG;AAC7B,qBAAK,OAAO,IAAI;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,6BAAuB,UAAU;AACjC,6BAAuB,QAAQ;AAC/B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,MAAAD,8BAA6B,OAAO,QAAQ,OAAO,MAAM,sBAAsB;AAAA,IACjF;AAAA,EACF;AACF;;;ACnGA,IAAMG,YAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA,SAAS,MAAM;AACjB;AAEO,IAAM,0BAA0B,CAAC,QAA0B,OAAaA,cAAa;AAC1F,QAAM;AAAA,IACJ,2BAAAC,6BAA4BD,UAAS;AAAA,IACrC,4BAAAE,8BAA6BF,UAAS;AAAA,IACtC,UAAUA,UAAS;AAAA,EACrB,IAAI;AACJ,QAAM,YAAkB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,gBAAgB,OAAgB,SAAiB,SAAiB,YAAoB,aAAqB,QAAQ,KAAK,SAAwB;AAC9I,YAAM,SAASE,4BAA2B,SAAS,SAAS,YAAY,aAAa,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,SAAS;AACzI,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAD,2BAA0B,OAAO,QAAQ,OAAO,SAAS,SAAS,YAAY,aAAa,OAAO,SAAS,SAAS,MAAM;AAAA,IAC5H;AAAA,EACF;AACF;;;AC5BA,IAAME,YAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,gCAAgC,CAAC,QAA0B,OAAaA,cAAa;AAChG,QAAM;AAAA,IACJ,kBAAAC,oBAAmBD,UAAS;AAAA,IAC5B,+BAAAE,iCAAgCF,UAAS;AAAA,IACzC,4BAAAG,8BAA6BH,UAAS;AAAA,IACtC,kCAAAI,oCAAmCJ,UAAS;AAAA,EAC9C,IAAI;AACJ,QAAM,kBAAwB;AAAA,IAC5B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,mBAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,yBAA4C;AAAA,IAChD,OAAO;AAAA,IACP,SAAS;AAAA,IACT,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,sBAAsB,OAAgB,IAAY,IAAY,IAAY,IAAY,YAAoB,aAAqB,QAAQ,KAAK,UAAwB,mBAAmB;AACrL,YAAM;AAAA,QACJ,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL,IAAII,kCAAiC,IAAI,IAAI,IAAI,IAAI,YAAY,aAAa,eAAe;AAC7F,UAAI,MAAM,KAAK,MAAM,EAAG;AACxB,YAAM,OAAO,IAAI,WAAW,KAAK,EAAE;AACnC,YAAM,QAAQ,aAAa;AAC3B,YAAM,QAAQ,cAAc;AAC5B,YAAM,eAAe,aAAa,MAAM,IAAI,MAAM;AAClD,YAAM,cAAc,OAAO,OAAO;AAClC,YAAM,eAAe,OAAO,OAAO;AACnC,MAAAH,kBAAiB,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO;AAC3C,cAAM;AAAA,UACJ,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL,IAAIE,4BAA2B,IAAI,IAAI,YAAY,aAAa,aAAa,cAAc,gBAAgB;AAC3G,eAAO,YAAY,uBAAuB,KAAK,KAAK,KAAK,GAAG;AAC5D,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,SAAS,KAAK,IAAI,IAAI,GAAG;AAC/B,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,cAAM,OAAO,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG;AACxC,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,cAAM,MAAM,KAAK,MAAM,EAAE;AACzB,iBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,gBAAM,KAAK,KAAK,IAAI,KAAK,MAAM,YAAY;AAC3C,gBAAM,iBAAiB,KAAK,MAAM;AAClC,mBAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,kBAAM,KAAK,KAAK,IAAI,KAAK,MAAM,YAAY;AAC3C,kBAAM,UAAU,iBAAiB,KAAK;AACtC,gBAAI,MAAM,SAAS,MAAM,OAAO;AAC9B,mBAAK,OAAO,IAAI;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,6BAAuB,UAAU;AACjC,6BAAuB,QAAQ;AAC/B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,6BAAuB,IAAI;AAC3B,MAAAD,+BAA8B,OAAO,QAAQ,OAAO,MAAM,sBAAsB;AAAA,IAClF;AAAA,EACF;AACF;;;ACxFO,SAAS,oBAAoB,KAAiB,OAAgB,OAA0B,CAAC,GAAG;AACjG,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,OAAO,cAAc;AAAA,IACrB,UAAU;AAAA,EACZ,IAAI;AACJ,MAAI,gBAAgB,EAAG;AACvB,QAAM,eAAe,UAAU;AAC/B,QAAM,cAAe,QAAgB,eAAe;AACpD,MAAI,iBAAiB,KAAK,CAAC,YAAa;AAGxC,MAAI,IAAI,SACN,IAAI,SACJ,IAAI,OACJ,IAAI;AACN,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC1C,MAAI,WAAW,KAAK,WAAW,EAAG;AAGlC,MAAI,gBAAgB;AACpB,MAAI,cAAc,KAAK;AACrB,UAAM,IAAI,eAAe,cAAc,OAAO;AAC9C,QAAI,MAAM,KAAK,CAAC,YAAa;AAC7B,qBAAiB,QAAQ,WAAa,KAAK,QAAQ;AAAA,EACrD;AACA,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,MAAI,OAAO,IAAI,KAAK,IAAI;AACxB,QAAM,UAAU,KAAK,UAAU;AAC/B,WAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,YAAM,IAAI,IAAI,QAAQ,eAAe,MAAM,IAAI,CAAY;AAC3D;AAAA,IACF;AACA,YAAQ;AAAA,EACV;AACF;;;ACjDA,IAAMG,aAAW;AAAA,EACf;AACF;AAEO,IAAM,qBAAqB,CAAC,QAA0B,OAAaA,eAAa;AACrF,QAAM;AAAA,IACJ,qBAAAC,uBAAsBD,WAAS;AAAA,EACjC,IAAI;AACJ,SAAO;AAAA,IACL,WAAW,OAAgB,OAA0B,CAAC,GAAG;AACvD,YAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,OAAO,OAAO;AAAA,QAClB,IAAI,OAAO,OAAO;AAAA,MACpB,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAC,qBAAoB,OAAO,QAAQ,OAAO,IAAI;AAAA,IAChD;AAAA,EACF;AACF;;;ACpBO,SAAS,kBAAkB,QAA0B;AAC1D,SAAO;AAAA,IACL,WAAW,GAAW,GAAW,OAAgB,QAAgB,KAAK,UAAwB,eAAe;AAC3G,UAAI,SAAS,OAAO;AACpB,UAAI,QAAQ,OAAO;AACnB,UAAI,SAAS,OAAO;AACpB,UAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAQ;AACjD,aAAO,YAAY,qBAAqB,GAAG,CAAC;AAC5C,UAAI,QAAQ,IAAI,QAAQ;AACxB,UAAI,KAAK,OAAO,OAAO,KAAK;AAC5B,UAAI,aAAa;AACjB,UAAI,QAAQ,KAAK;AACf,YAAI,eAAe,UAAU;AAC7B,YAAI,aAAa,eAAe,QAAQ,OAAO;AAC/C,sBAAc,QAAQ,WAAa,cAAc,QAAQ;AAAA,MAC3D;AACA,aAAO,OAAO,KAAK,IAAI,QAAQ,YAAY,EAAE;AAAA,IAC/C;AAAA,EACF;AACF;;;ACJO,SAAS,eAAe,KAAiB,KAAiB,MAAyB;AACxF,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,IAAI,UAAU;AAAA,IACd,IAAI,UAAU;AAAA,IACd,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,OAAO,cAAc;AAAA,IACrB,UAAU;AAAA,EACZ,IAAI;AACJ,MAAI,gBAAgB,EAAG;AACvB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC9B,MAAI,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;AAC/B,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC1C,MAAI,WAAW,KAAK,WAAW,EAAG;AAClC,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AACf,MAAI,OAAO,IAAI,KAAK,IAAI;AACxB,MAAI,OAAO,KAAK,KAAK,KAAK;AAC1B,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,WAAW,gBAAgB;AACjC,QAAM,cAAc,QAAQ;AAC5B,WAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,YAAM,SAAS,MAAM,IAAI;AACzB,YAAM,WAAW,WAAW;AAC5B,UAAI,aAAa,KAAK,CAAC,aAAa;AAClC;AACA;AACA;AAAA,MACF;AACA,UAAI,WAAW;AACf,UAAI,CAAC,UAAU;AACb,cAAM,IAAI,WAAW,cAAc,OAAO;AAC1C,YAAI,MAAM,KAAK,CAAC,aAAa;AAC3B;AACA;AACA;AAAA,QACF;AACA,oBAAY,SAAS,WAAa,KAAK,QAAQ;AAAA,MACjD;AACA,YAAM,IAAI,IAAI,QAAQ,UAAU,MAAM,IAAI,CAAY;AACtD;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AC9FA,IAAMC,aAAW;AAAA,EACf;AACF;AAEO,IAAM,yBAAyB,CAAC,QAA0B,OAAsBA,eAAa;AAClG,QAAM;AAAA,IACJ,gBAAAC,kBAAiBD,WAAS;AAAA,EAC5B,IAAI;AACJ,SAAO;AAAA,IACL,eAAe,KAAiB,MAAyB;AACvD,YAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,IAAI;AAAA,QACR,IAAI,IAAI;AAAA,MACV,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAC,gBAAe,OAAO,QAAQ,KAAK,IAAI;AAAA,IACzC;AAAA,EACF;AACF;;;ACrBA,IAAM,eAAe,gBAAgB;AAoB9B,SAAS,cAAc,KAAiB,OAAgB,IAA6B,IAAa,IAAa,IAAmB;AACvI,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,OAAO,OAAO,UAAU;AAC1B,QAAI,GAAG,KAAK;AACZ,QAAI,GAAG,KAAK;AACZ,QAAI,GAAG,KAAK,IAAI;AAChB,QAAI,GAAG,KAAK,IAAI;AAAA,EAClB,WAAW,OAAO,OAAO,UAAU;AACjC,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAAA,EACN,OAAO;AACL,QAAI;AACJ,QAAI;AACJ,QAAI,IAAI;AACR,QAAI,IAAI;AAAA,EACV;AACA,QAAM,OAAO,oBAAoB,GAAG,GAAG,GAAG,GAAG,IAAI,OAAO,IAAI,QAAQ,YAAY;AAChF,MAAI,CAAC,KAAK,SAAU;AAGpB,QAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AAGf,MAAI,YAAY,MAAM,YAAY,IAAI,UAAU,WAAW,KAAK,WAAW,GAAG;AAC5E,UAAM,KAAK,KAAK;AAChB;AAAA,EACF;AAGA,WAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,UAAM,SAAS,SAAS,MAAM,KAAK;AACnC,UAAM,MAAM,QAAQ;AACpB,UAAM,KAAK,OAAO,OAAO,GAAG;AAAA,EAC9B;AACF;;;ACjEA,IAAMC,aAAW;AAAA,EACf;AACF;AAEO,IAAM,gBAAgB,CAAC,QAA0B,OAAaA,eAAa;AAChF,QAAM;AAAA,IACJ,eAAAC,iBAAgBD,WAAS;AAAA,EAC3B,IAAI;AACJ,SAAO;AAAA,IACL,MAAM,OAAsB,CAAC,GAAG;AAC9B,YAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,OAAO,OAAO;AAAA,QAClB,IAAI,OAAO,OAAO;AAAA,MACpB,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAC,eAAc,OAAO,QAAQ,GAAc,GAAG,GAAG,GAAG,CAAC;AAAA,IACvD;AAAA,EACF;AACF;;;ACpBA,IAAMC,aAAW;AAAA,EACf;AACF;AAEO,IAAM,eAAe,CAAC,QAA0B,OAAaA,eAAa;AAC/E,QAAM;AAAA,IACJ,eAAAC,iBAAgBD,WAAS;AAAA,EAC3B,IAAI;AACJ,SAAO;AAAA,IACL,KAAK,OAAgB,OAAsB,CAAC,GAAG;AAC7C,YAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,OAAO,OAAO;AAAA,QAClB,IAAI,OAAO,OAAO;AAAA,MACpB,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAC,eAAc,OAAO,QAAQ,OAAO,GAAG,GAAG,GAAG,CAAC;AAAA,IAChD;AAAA,EACF;AACF;;;ACrBA,IAAMC,gBAAe,gBAAgB;AAC9B,SAAS,gBAAgB,WAAuB,OAA2B,CAAC,GAAS;AAC1F,QAAM,MAAM;AACZ,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ,UAAU;AAAA,IACrB,GAAG,SAAS,UAAU;AAAA,IACtB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,QAAM,OAAO,oBAAoB,SAAS,SAAS,OAAO,QAAQ,IAAI,OAAO,IAAI,QAAQA,aAAY;AACrG,MAAI,CAAC,KAAK,SAAU;AACpB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,SAAS,MAAM;AACrB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AACf,MAAI,OAAO,IAAI,KAAK;AACpB,MAAI,QAAQ,KAAK,MAAM,UAAU,KAAK;AACtC,QAAM,UAAU,KAAK;AACrB,QAAM,UAAU,SAAS;AAGzB,MAAI,MAAM;AACR,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,eAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,cAAM,OAAO,KAAK,IAAI;AACtB,cAAM,QAAQ,aAAa,SAAS,IAAI,SAAS;AACjD,YAAI,OAAO;AAET,gBAAM,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,QAC9B;AACA;AACA;AAAA,MACF;AACA,cAAQ;AACR,cAAQ;AAAA,IACV;AAAA,EACF,OAAO;AACL,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,eAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,cAAM,IAAI,IAAI,MAAM,IAAI,IAAI;AAC5B;AAAA,MACF;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACxDA,IAAMC,aAAW;AAAA,EACf;AACF;AAEO,IAAM,iBAAiB,CAAC,QAA0B,OAAaA,eAAa;AACjF,QAAM;AAAA,IACJ,iBAAAC,mBAAkBD,WAAS;AAAA,EAC7B,IAAI;AACJ,SAAO;AAAA,IACL,OAAO,OAA2B,CAAC,GAAG;AACpC,YAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,OAAO,OAAO;AAAA,QAClB,IAAI,OAAO,OAAO;AAAA,MACpB,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAC,iBAAgB,OAAO,QAAQ,IAAI;AAAA,IACrC;AAAA,EACF;AACF;;;ACPO,SAAS,qBAAqB,QAA0B;AAC7D,SAAO;AAAA,IACL,GAAG,sBAAsB,MAAM;AAAA,IAC/B,GAAG,uBAAuB,MAAM;AAAA,IAChC,GAAG,sBAAsB,MAAM;AAAA,IAC/B,GAAG,kBAAkB,MAAM;AAAA,IAC3B,GAAG,kBAAkB,MAAM;AAAA,IAC3B,GAAG,YAAY,MAAM;AAAA,IACrB,GAAG,cAAc,MAAM;AAAA,IACvB,GAAG,wBAAwB,MAAM;AAAA,IACjC,GAAG,8BAA8B,MAAM;AAAA,IACvC,GAAG,+BAA+B,MAAM;AAAA,IACxC,GAAG,sBAAsB,MAAM;AAAA,IAC/B,GAAG,4BAA4B,MAAM;AAAA,IACrC,GAAG,uBAAuB,MAAM;AAAA,IAChC,GAAG,6BAA6B,MAAM;AAAA,IACtC,GAAG,aAAa,MAAM;AAAA,EACxB;AACF;;;ACFO,IAAM,cAAN,MAAqB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACG;AAAA,EACD;AAAA,EACT,YAAY,QAAoB,gBAAiD;AAAA,IAC/E,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,iBAAiB,IAAI,eAAe,eAAe;AAAA,EACrD,IAAwB,CAAC,GAAG;AAC1B,SAAK,SAAS;AACd,SAAK,SAAS,IAAI,kBAAkB,QAAQ;AAC5C,SAAK,iBAAiB;AACtB,SAAK,cAAc,IAAI,iBAAiB,QAAQ,KAAK,MAAM;AAC3D,SAAK,UAAU,eAAe,IAAI;AAAA,EACpC;AAAA,EACA,YAAY,IAA0B;AACpC,OAAG,KAAK,OAAO;AACf,SAAK,eAAe;AAAA,EACtB;AAAA,EACA,iBAAiB;AACf,UAAM,cAAc,KAAK,YAAY;AACrC,QAAI,YAAY,WAAW,EAAG;AAC9B,UAAM,aAAa,KAAK,YAAY,kBAAkB;AACtD,UAAM,QAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AACA,UAAM,SAAS,KAAK;AACpB,UAAM,WAAW,KAAK,OAAO;AAC7B,UAAM,cAAc,KAAK;AACzB,UAAM,SAAwB;AAAA,MAC5B,MAAM,MAAM,gBAAgB,QAAQ,MAAM,aAAa,QAAQ;AAAA,MAC/D,MAAM,MAAM,gBAAgB,QAAQ,MAAM,YAAY,QAAQ;AAAA,MAC9D,SAAS,MAAM,YAAY,aAAa,KAAK;AAAA,IAC/C;AACA,SAAK,eAAe,OAAO,MAAM;AACjC,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;;;ACpEA,IAAMC,aAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA,SAAS,MAAM;AACjB;AAEO,IAAM,4BAA4B,CAAC,QAA0B,OAAaA,eAAa;AAC5F,QAAM;AAAA,IACJ,6BAAAC,+BAA8BD,WAAS;AAAA,IACvC,8BAAAE,gCAA+BF,WAAS;AAAA,IACxC,UAAUA,WAAS;AAAA,EACrB,IAAI;AACJ,QAAM,YAAkB;AAAA,IACtB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,SAAO;AAAA,IACL,kBAAkB,OAAgB,SAAiB,SAAiB,WAAmB,QAAQ,KAAK,SAAwB;AAC1H,YAAM,SAASE,8BAA6B,SAAS,SAAS,WAAW,OAAO,OAAO,OAAO,OAAO,OAAO,QAAQ,SAAS;AAC7H,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,aAAO,YAAY,uBAAuB,GAAG,GAAG,GAAG,CAAC;AACpD,MAAAD,6BAA4B,OAAO,QAAQ,OAAO,SAAS,SAAS,WAAW,OAAO,SAAS,SAAS,MAAM;AAAA,IAChH;AAAA,EACF;AACF;;;AClCO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,SAAO,IAAI,UAAU,KAAK,MAAM,GAAG,OAAO,MAAM;AAClD;AACO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAAiC;AAC/B,SAAO;AAAA,IACL,MAAM,KAAK,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;;;ACjBO,SAAS,kBAAkB,OAAe,QAAgB,MAA8B;AAC7F,QAAM,OAAO,QAAQ,SAAS;AAC9B,QAAM,SAAS,OAAO,IAAI,kBAAkB,KAAK,QAAQ,KAAK,YAAY,IAAI,IAAI,IAAI,kBAAkB,IAAI;AAC5G,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;;;ACFO,SAAS,qBAAqB,WAAiC;AACpE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,SAAS,IAAI,YAAY,KAAK,QAAQ,KAAK,YAAY,KAAK,cAAc,CAAC;AACjF,QAAM,MAAM,OAAO;AACnB,QAAM,OAAO,IAAI,WAAW,QAAQ,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,MAAM,OAAO,CAAC;AAGpB,SAAK,CAAC,IAAI,QAAQ,KAAK;AAAA,EACzB;AACA,SAAO;AACT;;;ACvBA,IAAM,MAAM,mBAAmB;AAiBxB,SAAS,mBAAmB,WAA8B;AAC/D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI,IAAI,UAAU,OAAO,UAAU,MAAM;AACzC,MAAI,aAAa,WAAW,GAAG,CAAC;AAChC,SAAO,OAAO,UAAU;AAC1B;AACA,mBAAmB,QAAQ,IAAI;;;ACvBxB,SAAS,uBAAuB,WAAuC;AAC5E,SAAO,IAAI;AAAA,IAAY,UAAU,KAAK;AAAA,IAAQ,UAAU,KAAK;AAAA;AAAA,IAE7D,UAAU,KAAK,cAAc;AAAA,EAAC;AAChC;;;ACPO,SAAS,gBAAgB,WAAsB;AACpD,QAAM,OAAO,UAAU;AACvB,MAAI,SAAS,KAAK;AAClB,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAClC,SAAK,CAAC,IAAI,MAAM,KAAK,CAAC;AACtB,SAAK,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC;AAC9B,SAAK,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC;AAAA,EAChC;AACA,SAAO;AACT;;;ACTA,IAAM,oBAAoB;AAAA,EACxB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV;AAcO,SAAS,WAAW,WAAqC,MAAc,MAAc,QAAkC;AAC5H,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AAC1C,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC;AAC1C,QAAM,UAAU,IAAI,WAAW,OAAO,IAAI;AAG1C,QAAM,SAAS,OAAO;AACtB,QAAM,SAAS,OAAO;AACtB,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,UAAM,OAAO,KAAK,IAAI,OAAO,GAAG,IAAI,SAAS,CAAC;AAC9C,UAAM,eAAe,OAAO;AAC5B,UAAM,eAAe,IAAI;AACzB,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,YAAM,OAAO,KAAK,IAAI,OAAO,GAAG,IAAI,SAAS,CAAC;AAC9C,cAAQ,eAAe,CAAC,IAAI,UAAU,eAAe,IAAI;AAAA,IAC3D;AAAA,EACF;AACA,oBAAkB,OAAO;AACzB,oBAAkB,QAAQ;AAC1B,oBAAkB,SAAS;AAC3B,SAAO;AACT;;;AC7BO,SAAS,kBAAkB,QAAmB,QAA2B;AAC9E,QAAM,QAAQ,IAAI,YAAY,OAAO,KAAK,MAAM;AAChD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,OAAO,OAAO,OAAO,OAAO,QAAQ,MAAM;AACzD,QAAM,oBAAoB,IAAI,kBAAkB,KAAK,MAAM;AAC3D,SAAO,IAAI,UAAU,mBAAmB,OAAO,MAAM;AACvD;;;ACYO,SAAS,gBAAgB,SAAwB,UAAkB,WAAmB,UAAU,GAAG,UAAU,GAAc;AAChI,QAAM,SAAS,IAAI,UAAU,UAAU,SAAS;AAChD,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,IAAI;AACJ,QAAM,UAAU,OAAO;AAGvB,QAAM,KAAK,KAAK,IAAI,GAAG,OAAO;AAC9B,QAAM,KAAK,KAAK,IAAI,GAAG,OAAO;AAC9B,QAAM,KAAK,KAAK,IAAI,UAAU,UAAU,IAAI;AAC5C,QAAM,KAAK,KAAK,IAAI,WAAW,UAAU,IAAI;AAC7C,MAAI,MAAM,MAAM,MAAM,IAAI;AACxB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,KAAK;AACtB,QAAM,UAAU,KAAK,MAAM;AAC3B,WAAS,MAAM,GAAG,MAAM,UAAU,OAAO;AACvC,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,OAAO;AACpB,UAAM,OAAO,KAAK;AAClB,UAAM,YAAY,OAAO,WAAW,MAAM;AAC1C,UAAM,YAAY,OAAO,OAAO,QAAQ;AACxC,YAAQ,IAAI,QAAQ,SAAS,UAAU,WAAW,MAAM,GAAG,QAAQ;AAAA,EACrE;AACA,SAAO;AACT;;;ACnDO,SAAS,wBAAwB;AACtC,MAAI,YAA8B;AASlC,SAAO,SAAS,qBAAqB,OAAe,QAAgB;AAClE,UAAM,cAAc,CAAC,CAAC;AACtB,UAAM,eAAe,eAAe,UAAW,UAAU;AACzD,UAAM,gBAAgB,eAAe,UAAW,WAAW;AAC3D,QAAI,CAAC,gBAAgB,CAAC,eAAe;AACnC,kBAAY,IAAI,UAAU,OAAO,MAAM;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AACF;;;AC1BO,SAAS,wBAAwB,QAAkD;AACxF,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,QAAM,UAAU,IAAI,YAAY,QAAQ;AACxC,QAAM,SAAS,QAAQ,OAAO,KAAK;AACnC,SAAO,KAAK,MAAM;AACpB;AACO,SAAS,wBAAwB,SAAkE;AACxG,QAAM,SAAS,KAAK,OAAO;AAC3B,QAAM,QAAQ,IAAI,kBAAkB,OAAO,MAAM;AACjD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,EAChC;AACA,SAAO;AACT;AAKO,SAAS,mBAA4C,WAAmC;AAC7F,SAAO;AAAA,IACL,OAAO,UAAU;AAAA,IACjB,QAAQ,UAAU;AAAA,IAClB,MAAM,wBAAwB,UAAU,KAAK,MAAM;AAAA,EACrD;AACF;AACO,SAAS,2BAA2D,WAA2D;AACpI,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,mBAAmB,SAAS;AACrC;AACO,SAAS,wBAAuD,YAA8B;AACnG,SAAO;AAAA,IACL,OAAO,WAAW;AAAA,IAClB,QAAQ,WAAW;AAAA,IACnB,MAAM,wBAAwB,WAAW,IAA+B;AAAA,EAC1E;AACF;AACO,SAAS,qBAAoD,YAA0B;AAC5F,QAAM,OAAO,wBAAwB,WAAW,IAA+B;AAC/E,SAAO,IAAI,UAAU,MAAwB,WAAW,OAAO,WAAW,MAAM;AAClF;AACO,SAAS,6BAAmE,YAAkD;AACnI,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,qBAAqB,UAAU;AACxC;;;AC5CO,SAAS,uBAAuB,MAAmB,OAAe,QAA2B;AAClG,QAAM,SAAS,KAAK;AACpB,QAAM,aAAa,KAAK;AACxB,QAAM,aAAa,KAAK;AACxB,QAAM,eAAe,IAAI,kBAAkB,QAAQ,YAAY,UAAU;AACzE,SAAO,IAAI,UAAU,cAAc,OAAO,MAAM;AAClD;AACO,SAAS,2BAA2B,MAAmB,OAAe,QAA+B;AAC1G,QAAM,SAAS,KAAK;AACpB,QAAM,aAAa,KAAK;AACxB,QAAM,aAAa,KAAK;AACxB,QAAM,eAAe,IAAI,kBAAkB,QAAQ,YAAY,UAAU;AACzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;;;ACfA,IAAME,gBAAe,gBAAgB;AAgB9B,SAAS,eAAe,QAAmB,QAAmB,GAAW,GAAW,KAAa,GAAG,KAAa,GAAG,KAAa,OAAO,OAAO,KAAa,OAAO,QAAQ,OAA0B,MAAM,2BAA4C;AAC5P,QAAM,OAAO,OAAO;AACpB,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU,OAAO;AACvB,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU,OAAO;AACvB,QAAM,OAAO,oBAAoB,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,MAAM,MAAM,OAAO,QAAQA,aAAY;AACpG,MAAI,CAAC,KAAK,SAAU;AACpB,QAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,UAAU,CAAC,CAAC;AAClB,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAM,cAAc,OAAO;AAC3B,UAAM,cAAc,OAAO;AAC3B,UAAM,YAAY,cAAc,OAAO,QAAQ;AAC/C,UAAM,YAAY,cAAc,OAAO,QAAQ;AAC/C,QAAI,WAAW,MAAM;AACnB,eAAS,KAAK,GAAG,KAAK,OAAO,MAAM;AACjC,cAAM,KAAK,cAAc,QAAQ,OAAO;AACxC,cAAM,QAAQ,KAAK,EAAE;AACrB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AACA,cAAM,KAAK,WAAW,KAAK;AAC3B,cAAM,KAAK,WAAW,KAAK;AAC3B,YAAI,+BAAgC,UAAU,KAAK;AACjD,kBAAQ,EAAE,IAAI,QAAQ,EAAE;AACxB,kBAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;AAChC,kBAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;AAChC,kBAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC;AAAA,QAClC,OAAO;AACL,gBAAM,IAAI,QAAQ;AAClB,gBAAM,OAAO,IAAI;AACjB,kBAAQ,EAAE,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI;AAC9C,kBAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,IAAI,QAAQ,KAAK,CAAC,IAAI;AAC1D,kBAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,IAAI,QAAQ,KAAK,CAAC,IAAI;AAC1D,kBAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,IAAI,QAAQ,KAAK,CAAC,IAAI;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,UAAU,QAAQ;AACxB,YAAM,MAAM,QAAQ,SAAS,UAAU,WAAW,OAAO;AACzD,cAAQ,IAAI,KAAK,QAAQ;AAAA,IAC3B;AAAA,EACF;AACF;;;ACpEA,IAAMC,gBAAe,gBAAgB;AAuB9B,SAAS,qBAAqB,WAAsB,MAAyB,IAAmB,IAAa,IAAa,IAAmB;AAClJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,OAAO,OAAO,WAAW,KAAK;AAAA,IAChC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,IAAI;AACJ,QAAM,OAAO,oBAAoB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,MAAM,GAAG,GAAGA,aAAY;AACjF,MAAI,CAAC,KAAK,SAAU;AACpB,QAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,SAAS,QAAQ;AACvB,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAM,aAAa,OAAO,OAAO,OAAO,QAAQ;AAChD,UAAM,aAAa,OAAO,OAAO,IAAI,QAAQ;AAC7C,QAAI,IAAI,KAAK,SAAS,UAAU,WAAW,MAAM,GAAG,QAAQ;AAAA,EAC9D;AACF;;;ACnDO,SAAS,2BAA2B,cAAwC;AACjF,QAAM,OAAO,aAAa;AAC1B,QAAM,UAAU,aAAa;AAC7B,QAAM,cAAc,IAAI,WAAW,QAAQ,MAAM;AACjD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,aAAa,KAAK,CAAC;AACzB,gBAAY,UAAU;AAAA,EACxB;AACA,SAAO;AACT;;;ACPO,IAAM,eAAN,MAAM,cAAa;AAAA;AAAA,EAER;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShB,YAAY,OAAe,QAAgB,MAAkB,SAAsB,wBAAgC;AACjH,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,yBAAyB;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,cAAc,WAAoC;AACvD,WAAO,cAAa,QAAQ,UAAU,MAAM,UAAU,OAAO,UAAU,MAAM;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,QAAQ,MAAyB,OAAe,QAA8B;AACnF,UAAM,SAAS,KAAK;AACpB,UAAM,UAAU,IAAI,YAAY,MAAM;AACtC,UAAM,cAAc,IAAI,WAAW,QAAQ,MAAM;AACjD,UAAM,WAAW,oBAAI,IAAoB;AACzC,UAAM,mBAAmB;AACzB,UAAM,yBAAyB;AAG/B,aAAS,IAAI,kBAAkB,sBAAsB;AACrD,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,QAAQ,QAAQ,CAAC;AACvB,YAAM,QAAQ,UAAU,KAAK;AAC7B,YAAM,gBAAgB,UAAU;AAChC,YAAM,WAAW,gBAAgB,mBAAmB,UAAU;AAC9D,UAAI,KAAK,SAAS,IAAI,QAAQ;AAC9B,UAAI,OAAO,QAAW;AACpB,aAAK,SAAS;AACd,iBAAS,IAAI,UAAU,EAAE;AAAA,MAC3B;AACA,kBAAY,CAAC,IAAI;AAAA,IACnB;AACA,UAAM,UAAU,YAAY,KAAK,SAAS,KAAK,CAAC;AAChD,WAAO,IAAI,cAAa,OAAO,QAAQ,aAAa,SAAS,sBAAsB;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAW,GAAW,GAAoB;AAC/C,UAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,UAAM,eAAe,KAAK,KAAK,KAAK;AACpC,WAAO,KAAK,QAAQ,YAAY;AAAA,EAClC;AACF;;;ACjFO,SAAS,2BAA2B,cAA4B,qBAA8B,OAAgB;AACnH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,SAAS,IAAI,YAAY,QAAQ,MAAM;AAG7C,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,KAAK,CAAC;AACjB,WAAO,EAAE;AAAA,EACX;AACA,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,cAAc;AAClB,WAAS,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM;AACzC,UAAM,SAAS,OAAO,EAAE;AACxB,QAAI,WAAW,GAAG;AAChB;AAAA,IACF;AACA,QAAI,CAAC,sBAAsB,OAAO,wBAAwB;AACxD;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,EAAE,MAAO;AAC/B,UAAMC,KAAI,QAAQ;AAClB,UAAMC,KAAI,SAAS,IAAI;AACvB,UAAMC,KAAI,SAAS,KAAK;AACxB,UAAMC,KAAI,SAAS,KAAK;AACxB,YAAQH,KAAI;AACZ,YAAQC,KAAI;AACZ,YAAQC,KAAI;AACZ,YAAQC,KAAI;AACZ,mBAAe;AAAA,EACjB;AACA,MAAI,gBAAgB,GAAG;AACrB,WAAO,UAAU,GAAG,GAAG,GAAG,CAAC;AAAA,EAC7B;AACA,QAAM,IAAI,OAAO,cAAc;AAC/B,QAAM,IAAI,OAAO,cAAc;AAC/B,QAAM,IAAI,OAAO,cAAc;AAC/B,QAAM,IAAI,OAAO,cAAc;AAC/B,SAAO,UAAU,GAAG,GAAG,GAAG,CAAC;AAC7B;;;AClDO,SAAS,wBAAwB,cAAuC;AAC7E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,SAAS,IAAI,UAAU,OAAO,MAAM;AAC1C,QAAM,SAAS,IAAI,YAAY,OAAO,KAAK,MAAM;AACjD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,eAAe,KAAK,CAAC;AAC3B,UAAM,QAAQ,QAAQ,YAAY;AAClC,WAAO,CAAC,IAAI;AAAA,EACd;AACA,SAAO;AACT;;;ACPO,SAAS,qBAAqB,QAAsB,QAA8B;AACvF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,OAAO,MAAM,OAAO,OAAO,OAAO,QAAQ,MAAM;AAC/D,SAAO,IAAI,aAAa,OAAO,QAAQ,MAAM,OAAO,SAAS,OAAO,sBAAsB;AAC5F;;;ACSA,eAAsB,2BAA2B,OAAyC;AACxF,QAAM,SAAS,MAAM;AACrB,QAAM,OAAO,OAAO,QAAQ,CAAC;AAC7B,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,MAAM,gBAAgB,IAAI;AACnC;;;AC3BO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAChD,YAAY,UAAkB;AAC5B,UAAM,aAAa,QAAQ,mCAAmC;AAC9D,SAAK,OAAO;AAAA,EACd;AACF;AA2BA,eAAsB,gBAAgB,MAA0D;AAC9F,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,KAAK,KAAK,WAAW,QAAQ,GAAG;AACnC,UAAM,IAAI,uBAAuB,KAAK,IAAI;AAAA,EAC5C;AACA,MAAI,SAA6B;AACjC,MAAI;AACF,aAAS,MAAM,kBAAkB,IAAI;AACrC,UAAM,SAAS,IAAI,gBAAgB,OAAO,OAAO,OAAO,MAAM;AAC9D,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,2BAA2B;AACrD,QAAI,UAAU,QAAQ,GAAG,CAAC;AAC1B,WAAO,IAAI,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,EAC3D,UAAE;AACA,YAAQ,MAAM;AAAA,EAChB;AACF;;;ACpDA,IAAI,iBAA2C;AAC/C,IAAM,qBAAqB,CAAC,aAAa,cAAc,cAAc,cAAc,aAAa,WAAW;AA2B3G,eAAsB,yBAAyB,cAAc,oBAAuC;AAClG,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,YAAY;AAC9B,UAAM,SAAS,IAAI,gBAAgB,GAAG,CAAC;AACvC,UAAM,UAAU,MAAM,QAAQ,IAAI,YAAY,IAAI,OAAM,SAAQ;AAC9D,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,cAAc;AAAA,UACtC,MAAM;AAAA,QACR,CAAC;AACD,eAAO,KAAK,SAAS,OAAO,OAAO;AAAA,MACrC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC,CAAC;AACF,WAAO,QAAQ,OAAO,CAAC,SAAyB;AAC9C,aAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAIA,mBAAiB,YAAY,EAAE,MAAM,WAAS;AAC5C,qBAAiB;AACjB,UAAM;AAAA,EACR,CAAC;AACD,SAAO;AACT;;;ACzDO,SAAS,2BAA2B,cAAyB,UAAkB,eAA2B,UAAkB,OAAoC,CAAC,GAAS;AAC/K,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,WAAW;AAAA,IACd,GAAG,YAAY;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,YAAY,EAAG;AACnB,MAAI,cAAc,WAAW,EAAG;AAChC,MAAI,YAAY,EAAG;AACnB,QAAM,YAAY,aAAa,SAAS,WAAW;AACnD,QAAM,YAAY,cAAc,SAAS,WAAW;AACpD,MAAI,aAAa,EAAG;AACpB,MAAI,aAAa,EAAG;AACpB,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO;AACjC,QAAM,QAAQ,KAAK,IAAI,GAAG,OAAO;AACjC,QAAM,QAAQ,WAAW,IAAI,KAAK,IAAI,UAAU,UAAU,QAAQ,IAAI;AACtE,QAAM,QAAQ,YAAY,IAAI,KAAK,IAAI,WAAW,UAAU,SAAS,IAAI;AACzE,MAAI,SAAS,MAAO;AACpB,MAAI,SAAS,MAAO;AACpB,QAAM,QAAQ,MAAM,QAAQ;AAC5B,QAAM,QAAQ,MAAM,QAAQ;AAC5B,MAAI,SAAS,SAAU;AACvB,MAAI,SAAS,UAAW;AACxB,MAAI,SAAS,QAAQ,UAAU,EAAG;AAClC,MAAI,SAAS,QAAQ,UAAU,EAAG;AAClC,QAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,WAAW,KAAK;AACtD,QAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,YAAY,KAAK;AACvD,MAAI,SAAS,QAAQ,WAAW;AAChC,MAAI,SAAS,QAAQ,WAAW;AAChC,MAAI,YAAY;AACd,aAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,YAAM,SAAS,SAAS;AACxB,UAAI,IAAI;AACR,UAAI,IAAI;AACR,aAAO,IAAI,QAAQ;AAEjB,YAAI,cAAc,CAAC,MAAM,GAAG;AAC1B,uBAAa,CAAC,IAAI;AAAA,QACpB;AACA;AACA;AAAA,MACF;AACA,gBAAU;AACV,gBAAU;AAAA,IACZ;AAAA,EACF,OAAO;AACL,aAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,YAAM,SAAS,SAAS;AACxB,UAAI,IAAI;AACR,UAAI,IAAI;AACR,aAAO,IAAI,QAAQ;AAEjB,YAAI,cAAc,CAAC,MAAM,GAAG;AAC1B,uBAAa,CAAC,IAAI;AAAA,QACpB;AACA;AACA;AAAA,MACF;AACA,gBAAU;AACV,gBAAU;AAAA,IACZ;AAAA,EACF;AACF;;;AC9DO,SAAS,SAA+B,KAAW;AAExD,SAAO,IAAI,MAAM;AACnB;;;ACJO,SAAS,iBAAiB,KAAuB;AACtD,QAAM,MAAM,IAAI;AAChB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,QAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;AAAA,EAC9B;AACF;AAKO,SAAS,gBAAgB,KAAsB;AACpD,QAAM,MAAM,IAAI;AAChB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,QAAI,CAAC,IAAI,MAAM,IAAI,CAAC;AAAA,EACtB;AACF;;;ACfO,SAAS,gBAAgB,KAAgB,UAAkB,KAAgB,UAAkB,MAAoC;AACtI,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ;AAAA,IACX,GAAG,SAAS;AAAA,IACZ,OAAO,cAAc;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,QAAM,YAAY,IAAI,SAAS,WAAW;AAC1C,QAAM,YAAY,IAAI,SAAS,WAAW;AAC1C,MAAI,SAAS,EAAG;AAChB,MAAI,UAAU,EAAG;AACjB,MAAI,gBAAgB,EAAG;AACvB,QAAM,SAAS,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE;AACxC,QAAM,SAAS,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE;AACxC,QAAM,OAAO,KAAK,IAAI,OAAO,WAAW,SAAS,WAAW,EAAE;AAC9D,QAAM,OAAO,KAAK,IAAI,QAAQ,YAAY,SAAS,YAAY,EAAE;AACjE,MAAI,UAAU,KAAM;AACpB,MAAI,UAAU,KAAM;AACpB,WAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,UAAM,KAAK,UAAU;AACrB,UAAM,KAAK,KAAK;AAChB,QAAI,OAAO,KAAK,WAAW,UAAU;AACrC,QAAI,OAAO,KAAK,WAAW,KAAK;AAChC,aAAS,KAAK,QAAQ,KAAK,MAAM,MAAM;AACrC,YAAM,OAAO,IAAI,IAAI;AAErB,YAAM,aAAa,aAAa,MAAM,OAAO;AAC7C,UAAI,SAAS;AACb,UAAI,eAAe,GAAG;AACpB,iBAAS;AAAA,MACX,WAAW,eAAe,KAAK;AAC7B,iBAAS;AAAA,MACX,WAAW,gBAAgB,KAAK;AAC9B,iBAAS;AAAA,MACX,OAAO;AACL,iBAAS,aAAa,cAAc,OAAO;AAAA,MAC7C;AACA,UAAI,WAAW,KAAK;AAClB,YAAI,WAAW,GAAG;AAChB,cAAI,IAAI,IAAI;AAAA,QACd,OAAO;AACL,gBAAM,KAAK,IAAI,IAAI;AACnB,cAAI,OAAO,KAAK;AACd,gBAAI,IAAI,IAAI;AAAA,UACd,WAAW,OAAO,GAAG;AACnB,gBAAI,IAAI,IAAI,KAAK,SAAS,OAAO;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AACA;AACA;AAAA,IACF;AAAA,EACF;AACF;;;AC5DO,SAAS,iBAAiB,KAAiB,UAAkB,KAAiB,UAAkB,MAAoC;AACzI,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,GAAG,QAAQ;AAAA,IACX,GAAG,SAAS;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,YAAY,EAAG;AACnB,MAAI,YAAY,EAAG;AACnB,QAAM,YAAY,IAAI,SAAS,WAAW;AAC1C,QAAM,YAAY,IAAI,SAAS,WAAW;AAG1C,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,KAAK,IAAI,GAAG,WAAW,CAAC;AAC5B,MAAI,KAAK,IAAI,GAAG,YAAY,CAAC;AAC7B,MAAI,KAAK,EAAG;AACZ,MAAI,KAAK,EAAG;AAGZ,QAAM,SAAS,MAAM,IAAI;AACzB,QAAM,SAAS,MAAM,IAAI;AACzB,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,UAAU,SAAS,CAAC;AACzC,QAAM,MAAM,KAAK,IAAI,WAAW,SAAS,CAAC;AAC1C,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AACrB,MAAI,UAAU,EAAG;AACjB,MAAI,UAAU,EAAG;AAGjB,QAAM,SAAS,MAAM;AACrB,QAAM,SAAS,MAAM;AACrB,QAAM,UAAU,WAAW;AAC3B,QAAM,UAAU,WAAW;AAC3B,MAAI,QAAQ,IAAI,UAAU,YAAY,IAAI;AAC1C,MAAI,OAAO,MAAM,WAAW;AAC5B,WAAS,KAAK,GAAG,KAAK,QAAQ,MAAM;AAClC,aAAS,KAAK,GAAG,KAAK,QAAQ,MAAM;AAClC,YAAM,OAAO,IAAI,IAAI;AAErB,YAAM,cAAc,aAAa,SAAS,IAAI,SAAS;AACvD,UAAI,aAAa;AACf,YAAI,IAAI,IAAI;AAAA,MACd;AACA;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AChEO,IAAM,YAAN,MAAM,WAAqE;AAAA,EACvE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAY,WAAc;AACxB,SAAK,SAAS,uBAAuB,SAAS;AAC9C,SAAK,YAAY;AACjB,SAAK,QAAQ,UAAU;AACvB,SAAK,SAAS,UAAU;AAAA,EAC1B;AAAA,EACA,IAAI,WAAoB;AACtB;AACA,IAAC,KAAa,YAAY;AAC1B,IAAC,KAAa,SAAS,uBAAuB,SAAS;AACvD,IAAC,KAAa,QAAQ,UAAU;AAChC,IAAC,KAAa,SAAS,UAAU;AAAA,EACnC;AAAA;AAAA,EAGA,OAAqB;AACnB,UAAM,OAAO,KAAK,UAAU;AAC5B,UAAM,SAAS,IAAI,kBAAkB,IAAI;AACzC,UAAM,OAAO,KAAK,UAAU;AAC5B,UAAM,cAAc,OAAO,SAAS;AACpC,QAAI;AACJ,QAAI,eAAe,SAAS,QAAQ;AAClC,YAAM,mBAAmB;AACzB,qBAAe,IAAI,iBAAiB,QAAQ,KAAK,OAAO,KAAK,MAAM;AAAA,IACrE,OAAO;AACL,qBAAe;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,MAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,IAAI,WAAa,YAAY;AAAA,EACtC;AACF;;;ACtCO,SAAS,wBAAwB,KAAiB,KAAiB,WAAsB,OAA8B,CAAC,GAAG;AAChI,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,IAAI,UAAU;AAAA,IACd,IAAI,UAAU;AAAA,IACd,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,OAAO,cAAc;AAAA,IACrB,UAAU;AAAA,IACV,KAAK,IAAI;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,gBAAgB,EAAG;AACvB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,IAAI;AACR,MAAI,IAAI;AAGR,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC9B,MAAI,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;AAC/B,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC1C,MAAI,WAAW,KAAK,WAAW,EAAG;AAGlC,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AACf,QAAM,SAAS;AAIf,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI;AAClB,MAAI,OAAO,IAAI,KAAK,IAAI;AACxB,MAAI,OAAO,KAAK,KAAK,KAAK;AAC1B,MAAI,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM;AAC5C,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,UAAU,SAAS,UAAU;AACnC,QAAM,WAAW,gBAAgB;AACjC,QAAM,cAAc,QAAQ,eAAe;AAC3C,WAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,YAAM,OAAO,UAAU,IAAI;AAC3B,YAAM,OAAO,aAAa,MAAM,OAAO;AAGvC,UAAI,SAAS,GAAG;AACd;AACA;AACA;AACA;AAAA,MACF;AACA,YAAM,SAAS,MAAM,IAAI;AACzB,YAAM,WAAW,WAAW;AAG5B,UAAI,aAAa,KAAK,CAAC,aAAa;AAClC;AACA;AACA;AACA;AAAA,MACF;AAGA,UAAI,SAAS;AACb,UAAI,UAAU;AACZ,iBAAS;AAAA,MACX,WAAW,SAAS,KAAK;AACvB,iBAAS,OAAO,cAAc,OAAO;AAAA,MACvC;AAGA,UAAI,WAAW,GAAG;AAChB;AACA;AACA;AACA;AAAA,MACF;AACA,UAAI,WAAW;AACf,UAAI,SAAS,KAAK;AAChB,cAAM,IAAI,WAAW,SAAS,OAAO;AAErC,YAAI,MAAM,KAAK,CAAC,aAAa;AAC3B;AACA;AACA;AACA;AAAA,QACF;AACA,oBAAY,SAAS,WAAa,KAAK,QAAQ;AAAA,MACjD;AACA,YAAM,IAAI,IAAI,QAAQ,UAAU,MAAM,IAAI,CAAY;AACtD;AACA;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AChIO,SAAS,yBAAyB,KAAiB,KAAiB,YAAwB,MAA6B;AAC9H,QAAM;AAAA,IACJ,GAAG,UAAU;AAAA,IACb,GAAG,UAAU;AAAA,IACb,IAAI,UAAU;AAAA,IACd,IAAI,UAAU;AAAA,IACd,GAAG,QAAQ,IAAI;AAAA,IACf,GAAG,SAAS,IAAI;AAAA,IAChB,OAAO,cAAc;AAAA,IACrB,UAAU;AAAA,IACV,KAAK,IAAI;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,aAAa;AAAA,EACf,IAAI;AACJ,MAAI,gBAAgB,EAAG;AACvB,MAAI,IAAI;AACR,MAAI,IAAI;AACR,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,IAAI;AACR,MAAI,IAAI;AAGR,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,GAAG;AACV,SAAK;AACL,SAAK;AACL,SAAK;AAAA,EACP;AACA,MAAI,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE;AAC9B,MAAI,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE;AAG/B,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,MAAI,IAAI,GAAG;AACT,UAAM;AACN,SAAK;AACL,QAAI;AAAA,EACN;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,IAAI,SAAS,CAAC;AAC1C,MAAI,WAAW,KAAK,WAAW,EAAG;AAKlC,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,KAAK,IAAI,UAAU;AACzB,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI;AAClB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI;AACf,QAAM,SAAS;AACf,MAAI,OAAO,IAAI,KAAK,IAAI;AACxB,MAAI,OAAO,KAAK,KAAK,KAAK;AAC1B,MAAI,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM;AAC5C,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,UAAU,KAAK,UAAU;AAC/B,QAAM,UAAU,SAAS,UAAU;AACnC,QAAM,UAAU,aAAa,IAAI;AACjC,QAAM,WAAW,gBAAgB;AACjC,QAAM,cAAc,QAAQ,eAAe;AAC3C,WAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AACnC,aAAS,KAAK,GAAG,KAAK,SAAS,MAAM;AAEnC,UAAI,WAAW,IAAI,MAAM,SAAS;AAChC;AACA;AACA;AACA;AAAA,MACF;AACA,YAAM,SAAS,MAAM,IAAI;AACzB,YAAM,WAAW,WAAW;AAG5B,UAAI,aAAa,KAAK,CAAC,aAAa;AAClC;AACA;AACA;AACA;AAAA,MACF;AACA,UAAI,WAAW;AACf,UAAI,CAAC,UAAU;AAEb,cAAM,IAAI,WAAW,cAAc,OAAO;AAC1C,YAAI,MAAM,KAAK,CAAC,aAAa;AAC3B;AACA;AACA;AACA;AAAA,QACF;AACA,oBAAY,SAAS,WAAa,KAAK,QAAQ;AAAA,MACjD;AACA,YAAM,IAAI,IAAI,QAAQ,UAAU,MAAM,IAAI,CAAY;AACtD;AACA;AACA;AAAA,IACF;AACA,YAAQ;AACR,YAAQ;AACR,YAAQ;AAAA,EACV;AACF;;;AC1GO,SAAS,eAAe,KAAiB,MAA4B;AAC1E,gBAAc,KAAK,GAAc,IAAI;AACvC;;;ACRA,IAAMC,gBAAe,gBAAgB;AAQ9B,SAAS,uBAAuB,QAAoB,IAAmB,IAAa,IAAa,IAA0B;AAChI,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,OAAO,OAAO,WAAW,KAAK;AAAA,IAChC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,OAAO,OAAO;AACpB,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU,OAAO;AAGvB,MAAI,KAAK,KAAK,KAAK,GAAG;AACpB,WAAO,IAAI,YAAY,CAAC;AAAA,EAC1B;AACA,QAAM,UAAU,IAAI,YAAY,IAAI,CAAC;AAMrC,QAAM,OAAO,oBAAoB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,MAAMA,aAAY;AACjF,MAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,QAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,EACL,IAAI;AACJ,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAM,YAAY,OAAO,OAAO,OAAO;AACvC,UAAM,YAAY,OAAO,OAAO,IAAI;AAGpC,UAAM,QAAQ,QAAQ,SAAS,UAAU,WAAW,KAAK;AACzD,YAAQ,IAAI,OAAO,QAAQ;AAAA,EAC7B;AACA,SAAO;AACT;;;AC7CO,SAAS,iBAAiB,QAAoB,IAAmB,IAAa,IAAa,IAAwB;AACxH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,OAAO,OAAO,WAAW,KAAK;AAAA,IAChC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,SAAS,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,CAAC;AAChD,QAAM,SAAS,uBAAuB,QAAQ,GAAG,GAAG,GAAG,CAAC;AACxD,SAAO,OAAO,IAAI,MAAM;AACxB,SAAO;AACT;;;ACxBO,IAAM,gBAAN,MAAM,eAAoC;AAAA,EAE/C,YAAqB,OAAwB,QAAgB,QAAsB;AAA9D;AAAwB;AAC3C,SAAK,SAAS,UAAU,IAAI,YAAY,QAAQ,MAAM;AAAA,EACxD;AAAA,EAHS;AAAA,EAIT,IAAI,OAAe,QAAgB,QAA4B;AAC7D;AACA,IAAC,KAAa,SAAS,UAAU,IAAI,YAAY,QAAQ,MAAM;AAC/D,IAAC,KAAa,QAAQ;AACtB,IAAC,KAAa,SAAS;AAAA,EACzB;AAAA,EACA,OAAsB;AACpB,UAAM,YAAY,IAAI,YAAY,KAAK,MAAM;AAC7C,WAAO,IAAI,eAAc,KAAK,OAAO,KAAK,QAAQ,SAAS;AAAA,EAC7D;AACF;;;ACVO,SAAS,qBAAqB,WAAkC;AACrE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,MAAM,OAAO;AACnB,QAAM,OAAO,IAAI,WAAW,QAAQ,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,MAAM,OAAO,CAAC;AAIpB,SAAK,CAAC,IAAI,QAAQ,KAAK;AAAA,EACzB;AACA,SAAO;AACT;;;ACtBO,SAAS,2BAA2B,WAA6B;AACtE,QAAM,QAAQ,UAAU;AACxB,QAAM,SAAS,UAAU;AACzB,QAAM,OAAO,UAAU;AACvB,QAAM,YAAY,KAAK,MAAM,QAAQ,CAAC;AACtC,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,UAAM,YAAY,IAAI;AACtB,aAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YAAM,UAAU,YAAY;AAC5B,YAAM,WAAW,aAAa,QAAQ,IAAI;AAC1C,YAAM,OAAO,KAAK,OAAO;AACzB,WAAK,OAAO,IAAI,KAAK,QAAQ;AAC7B,WAAK,QAAQ,IAAI;AAAA,IACnB;AAAA,EACF;AACF;AACO,SAAS,yBAAyB,WAA6B;AACpE,QAAM,QAAQ,UAAU;AACxB,QAAM,SAAS,UAAU;AACzB,QAAM,OAAO,UAAU;AACvB,QAAM,aAAa,KAAK,MAAM,SAAS,CAAC;AACxC,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,eAAe,IAAI;AACzB,UAAM,mBAAmB,SAAS,IAAI,KAAK;AAC3C,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,SAAS,eAAe;AAC9B,YAAM,YAAY,kBAAkB;AACpC,YAAM,OAAO,KAAK,MAAM;AACxB,WAAK,MAAM,IAAI,KAAK,SAAS;AAC7B,WAAK,SAAS,IAAI;AAAA,IACpB;AAAA,EACF;AACF;;;ACzBO,SAAS,kBAAkB,WAAuB,QAA2B;AAClF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,WAAW,UAAU,QAAQ,UAAU,OAAO,UAAU,QAAQ,MAAM;AAC1E,SAAO,IAAI,UAAU,IAAI,UAAU,IAAI,kBAAkB,KAAK,MAAM,GAAqB,OAAO,MAAM,CAAC;AACzG;;;ACTO,SAAS,gBAAgB,WAA4B;AAC1D,QAAM,QAAQ,UAAU;AACxB,QAAM,SAAS,UAAU;AACzB,QAAM,OAAO,UAAU;AACvB,MAAI,UAAU,QAAQ;AACpB,wBAAoB,SAAS;AAC7B;AAAA,EACF;AACA,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,YAAY,IAAI,YAAY,KAAK,MAAM;AAC7C,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,SAAS,IAAI,QAAQ;AAC3B,YAAM,OAAO,SAAS,IAAI;AAC1B,YAAM,OAAO;AACb,YAAM,SAAS,OAAO,WAAW;AACjC,gBAAU,MAAM,IAAI,KAAK,MAAM;AAAA,IACjC;AAAA,EACF;AAIA,QAAM,eAAe,IAAI,UAAU,IAAI,kBAAkB,UAAU,MAAM,GAAG,UAAU,SAAS;AAC/F,YAAU,IAAI,YAAY;AAC5B;AACA,SAAS,oBAAoB,WAA4B;AACvD,QAAM,IAAI,UAAU;AACpB,QAAM,OAAO,UAAU;AACvB,WAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,aAAS,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK;AAClC,YAAM,MAAM,IAAI,IAAI;AACpB,YAAM,QAAQ,IAAI,KAAK,IAAI,IAAI;AAC/B,YAAM,UAAU,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI;AAC1C,YAAM,QAAQ,IAAI,IAAI,KAAK,IAAI;AAC/B,YAAM,OAAO,KAAK,GAAG;AACrB,WAAK,GAAG,IAAI,KAAK,IAAI;AACrB,WAAK,IAAI,IAAI,KAAK,MAAM;AACxB,WAAK,MAAM,IAAI,KAAK,KAAK;AACzB,WAAK,KAAK,IAAI;AAAA,IAChB;AAAA,EACF;AACF;;;AC9CA,IAAMC,gBAAe,gBAAgB;AAU9B,SAAS,qBAAqB,QAAoB,MAAmB,IAAmB,IAAa,IAAa,IAAmB;AAC1I,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,OAAO,OAAO,WAAW,KAAK;AAAA,IAChC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,OAAO,OAAO;AACpB,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU,OAAO;AAGvB,QAAM,OAAO,oBAAoB,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM,MAAM,GAAG,GAAGA,aAAY;AACjF,MAAI,CAAC,KAAK,SAAU;AACpB,QAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,EACL,IAAI;AACJ,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAM,YAAY,OAAO,OAAO,OAAO;AACvC,UAAM,YAAY,OAAO,OAAO,IAAI;AACpC,YAAQ,IAAI,KAAK,SAAS,UAAU,WAAW,KAAK,GAAG,QAAQ;AAAA,EACjE;AACF;","names":["MaskType","get","applyAlphaMaskToPixelData","defaults","applyBinaryMaskToPixelData","defaults","applyCircleBrushToPixelData","getCircleBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataAlphaMask","getCircleBrushOrPencilBounds","getCircleBrushOrPencilStrokeBounds","defaults","forEachLinePoint","blendColorPixelDataBinaryMask","getCircleBrushOrPencilStrokeBounds","getCircleBrushOrPencilBounds","defaults","applyRectBrushToPixelData","getRectBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataAlphaMask","getRectBrushOrPencilBounds","getRectBrushOrPencilStrokeBounds","defaults","applyRectBrushToPixelData","getRectBrushOrPencilBounds","defaults","forEachLinePoint","blendColorPixelDataBinaryMask","getRectBrushOrPencilBounds","getRectBrushOrPencilStrokeBounds","defaults","blendColorPixelData","defaults","blendPixelData","defaults","fillPixelData","defaults","fillPixelData","SCRATCH_RECT","defaults","invertPixelData","defaults","applyCircleBrushToPixelData","getCircleBrushOrPencilBounds","SCRATCH_BLIT","SCRATCH_BLIT","r","g","b","a","SCRATCH_BLIT","SCRATCH_BLIT"]}
|