@scanmate/image-fix 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +291 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.esm.js +2786 -0
  5. package/dist/index.esm.js.map +1 -0
  6. package/dist/src/index.d.ts +58 -0
  7. package/dist/src/index.d.ts.map +1 -0
  8. package/dist/src/lib/align.d.ts +136 -0
  9. package/dist/src/lib/align.d.ts.map +1 -0
  10. package/dist/src/lib/analysis/content.d.ts +50 -0
  11. package/dist/src/lib/analysis/content.d.ts.map +1 -0
  12. package/dist/src/lib/analysis/score.d.ts +18 -0
  13. package/dist/src/lib/analysis/score.d.ts.map +1 -0
  14. package/dist/src/lib/estimate/coarse.d.ts +43 -0
  15. package/dist/src/lib/estimate/coarse.d.ts.map +1 -0
  16. package/dist/src/lib/estimate/features.d.ts +72 -0
  17. package/dist/src/lib/estimate/features.d.ts.map +1 -0
  18. package/dist/src/lib/estimate/match.d.ts +38 -0
  19. package/dist/src/lib/estimate/match.d.ts.map +1 -0
  20. package/dist/src/lib/estimate/models.d.ts +41 -0
  21. package/dist/src/lib/estimate/models.d.ts.map +1 -0
  22. package/dist/src/lib/estimate/phaseCorrelation.d.ts +34 -0
  23. package/dist/src/lib/estimate/phaseCorrelation.d.ts.map +1 -0
  24. package/dist/src/lib/estimate/ransac.d.ts +36 -0
  25. package/dist/src/lib/estimate/ransac.d.ts.map +1 -0
  26. package/dist/src/lib/image/codec.d.ts +30 -0
  27. package/dist/src/lib/image/codec.d.ts.map +1 -0
  28. package/dist/src/lib/image/gray.d.ts +67 -0
  29. package/dist/src/lib/image/gray.d.ts.map +1 -0
  30. package/dist/src/lib/image/raster.d.ts +19 -0
  31. package/dist/src/lib/image/raster.d.ts.map +1 -0
  32. package/dist/src/lib/image/resize.d.ts +32 -0
  33. package/dist/src/lib/image/resize.d.ts.map +1 -0
  34. package/dist/src/lib/image/warp.d.ts +28 -0
  35. package/dist/src/lib/image/warp.d.ts.map +1 -0
  36. package/dist/src/lib/math/fft.d.ts +15 -0
  37. package/dist/src/lib/math/fft.d.ts.map +1 -0
  38. package/dist/src/lib/math/linalg.d.ts +34 -0
  39. package/dist/src/lib/math/linalg.d.ts.map +1 -0
  40. package/dist/src/lib/math/matrix.d.ts +75 -0
  41. package/dist/src/lib/math/matrix.d.ts.map +1 -0
  42. package/dist/src/lib/math/random.d.ts +13 -0
  43. package/dist/src/lib/math/random.d.ts.map +1 -0
  44. package/dist/src/lib/regions.d.ts +75 -0
  45. package/dist/src/lib/regions.d.ts.map +1 -0
  46. package/dist/src/lib/testing/synthetic.d.ts +73 -0
  47. package/dist/src/lib/testing/synthetic.d.ts.map +1 -0
  48. package/dist/src/lib/types.d.ts +86 -0
  49. package/dist/src/lib/types.d.ts.map +1 -0
  50. package/package.json +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/lib/analysis/score.ts","../src/lib/image/raster.ts","../src/lib/image/codec.ts","../src/lib/image/gray.ts","../src/lib/image/resize.ts","../src/lib/image/warp.ts","../src/lib/math/matrix.ts","../src/lib/analysis/content.ts","../src/lib/math/fft.ts","../src/lib/estimate/phaseCorrelation.ts","../src/lib/estimate/coarse.ts","../src/lib/math/random.ts","../src/lib/estimate/features.ts","../src/lib/estimate/match.ts","../src/lib/math/linalg.ts","../src/lib/estimate/models.ts","../src/lib/estimate/ransac.ts","../src/lib/align.ts","../src/lib/regions.ts","../src/lib/testing/synthetic.ts"],"sourcesContent":["import type { BinaryImage, GrayImage } from '../types'\n\n/**\n * How well two ink images actually overlap.\n *\n * Every stage of the pipeline proposes a transform; this is the referee. It\n * has to be a *correlation*, not a difference: the scan is darker, or fainter,\n * or contrast-stretched by the scanner's own firmware, and a sum of absolute\n * differences would rank a badly aligned pale scan above a well aligned dark\n * one. Zero-mean normalised cross correlation is invariant to both of those —\n * it only asks whether the ink rises and falls in the same places.\n */\n\n/** Zero-mean normalised cross correlation of two equally sized images, in `[-1, 1]`. */\nexport function correlation (a: GrayImage, b: GrayImage): number {\n if (a.width !== b.width || a.height !== b.height)\n throw new Error('correlation needs two images of the same size')\n\n const n = a.data.length\n if (n === 0) return 0\n\n let sumA = 0\n let sumB = 0\n for (let i = 0; i < n; i++) {\n sumA += a.data[i]\n sumB += b.data[i]\n }\n const meanA = sumA / n\n const meanB = sumB / n\n\n let cov = 0\n let varA = 0\n let varB = 0\n for (let i = 0; i < n; i++) {\n const da = a.data[i] - meanA\n const db = b.data[i] - meanB\n cov += da * db\n varA += da * da\n varB += db * db\n }\n\n const denom = Math.sqrt(varA * varB)\n\n return denom > 1e-12 ? cov / denom : 0\n}\n\n/** Intersection over union of two masks. The pixel-level version of \"did it land on top of it\". */\nexport function intersectionOverUnion (a: BinaryImage, b: BinaryImage): number {\n if (a.width !== b.width || a.height !== b.height)\n throw new Error('intersectionOverUnion needs two masks of the same size')\n\n let intersection = 0\n let union = 0\n for (let i = 0; i < a.data.length; i++) {\n const hit = a.data[i] | b.data[i]\n union += hit\n intersection += a.data[i] & b.data[i]\n }\n\n return union > 0 ? intersection / union : 0\n}\n\n/** Mean of a single channel image. */\nexport function mean (image: GrayImage): number {\n if (image.data.length === 0) return 0\n let total = 0\n for (const value of image.data) total += value\n\n return total / image.data.length\n}\n","import type { BinaryImage, GrayImage, ImageInput, Raster } from '../types'\n\n/** Allocate an opaque RGBA raster, filled with `fill` (white by default). */\nexport function createRaster (width: number, height: number, fill: [number, number, number, number] = [255, 255, 255, 255]): Raster {\n assertDimensions(width, height)\n const data = new Uint8ClampedArray(width * height * 4)\n const [r, g, b, a] = fill\n for (let i = 0; i < data.length; i += 4) {\n data[i] = r\n data[i + 1] = g\n data[i + 2] = b\n data[i + 3] = a\n }\n\n return { width, height, data }\n}\n\nexport function createGray (width: number, height: number): GrayImage {\n assertDimensions(width, height)\n\n return { width, height, data: new Float32Array(width * height) }\n}\n\nexport function createBinary (width: number, height: number): BinaryImage {\n assertDimensions(width, height)\n\n return { width, height, data: new Uint8Array(width * height) }\n}\n\nexport function cloneRaster (image: Raster): Raster {\n return { width: image.width, height: image.height, data: Uint8ClampedArray.from(image.data) }\n}\n\n/**\n * True when the value is already a decoded raster.\n *\n * The check is structural rather than `instanceof` because a raster is a plain\n * object on purpose: callers should be able to hand us a canvas `ImageData`,\n * or something they built themselves, without importing anything from here.\n */\nexport function isRaster (value: unknown): value is Raster {\n if (typeof value !== 'object' || value === null) return false\n const candidate = value as Partial<Raster>\n\n return (\n typeof candidate.width === 'number' &&\n typeof candidate.height === 'number' &&\n ArrayBuffer.isView(candidate.data) &&\n candidate.data.byteLength === candidate.width * candidate.height * 4\n )\n}\n\n/** Narrow any accepted input to the bytes of an encoded image, or `null` if it is already decoded. */\nexport function toBytes (input: ImageInput): Uint8Array | null {\n if (isRaster(input)) return null\n if (input instanceof ArrayBuffer) return new Uint8Array(input)\n if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n\n throw new TypeError('expected a Raster, a Uint8Array/Buffer, or an ArrayBuffer')\n}\n\n/** Wrap bytes as a `Uint8ClampedArray` without copying when the alignment allows it. */\nexport function asClamped (data: Uint8Array): Uint8ClampedArray {\n return data instanceof Uint8ClampedArray\n ? data\n : new Uint8ClampedArray(data.buffer, data.byteOffset, data.byteLength)\n}\n\nfunction assertDimensions (width: number, height: number): void {\n if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width <= 0 || height <= 0)\n throw new RangeError(`image dimensions must be positive integers, got ${width}x${height}`)\n}\n","import { decode as decodeJpeg, encode as encodeJpeg } from 'jpeg-js'\nimport { PNG } from 'pngjs'\n\nimport type { ImageInput, Raster } from '../types'\nimport { asClamped, isRaster, toBytes } from './raster'\n\n/**\n * Encoding and decoding, in pure JavaScript on purpose.\n *\n * `sharp` would be faster, and it is the wrong choice here: it is a native\n * binding to libvips, so the bytes that work on your laptop are not the bytes\n * that run in the function app, and a deployment that skips the rebuild fails\n * at *import* time — after the cold start, in production, with a stack trace\n * about a missing `.node` file. `pngjs` and `jpeg-js` are slower and they are\n * the same JavaScript everywhere, which is the whole point of the constraint\n * this library was written under.\n */\n\nexport type ImageFormat = 'png' | 'jpeg'\n\nexport interface EncodeOptions {\n format?: ImageFormat\n /** JPEG only, 1-100. Ignored for PNG. */\n quality?: number\n}\n\nconst PNG_MAGIC = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]\nconst JPEG_MAGIC = [0xFF, 0xD8, 0xFF]\n\n/** Identify a buffer by its magic bytes. Returns `null` when it is neither PNG nor JPEG. */\nexport function sniffFormat (bytes: Uint8Array): ImageFormat | null {\n if (startsWith(bytes, PNG_MAGIC)) return 'png'\n if (startsWith(bytes, JPEG_MAGIC)) return 'jpeg'\n\n return null\n}\n\n/**\n * Decode PNG or JPEG bytes to RGBA, or pass a {@link Raster} straight through.\n *\n * Passing a raster through untouched is what makes it cheap to align a page\n * against several scans: decode once, reuse.\n */\nexport function decodeImage (input: ImageInput): Raster {\n if (isRaster(input)) return input\n\n const bytes = toBytes(input)\n if (bytes === null || bytes.length === 0) throw new Error('cannot decode an empty image buffer')\n\n const format = sniffFormat(bytes)\n if (format === 'png') {\n const png = PNG.sync.read(Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength))\n\n return { width: png.width, height: png.height, data: asClamped(png.data) }\n }\n\n if (format === 'jpeg') {\n const jpeg = decodeJpeg(bytes, { useTArray: true, formatAsRGBA: true, tolerantDecoding: true })\n\n return { width: jpeg.width, height: jpeg.height, data: asClamped(jpeg.data) }\n }\n\n throw new Error('unsupported image format: expected PNG or JPEG')\n}\n\n/** Encode a raster. PNG by default, because a scan re-encoded as JPEG is a scan with new artefacts. */\nexport function encodeImage (image: Raster, options: EncodeOptions = {}): Uint8Array {\n const { format = 'png', quality = 92 } = options\n\n if (format === 'jpeg') {\n const encoded = encodeJpeg(\n { width: image.width, height: image.height, data: new Uint8Array(image.data.buffer, image.data.byteOffset, image.data.byteLength) },\n quality,\n )\n\n return Uint8Array.from(encoded.data)\n }\n\n const png = new PNG({ width: image.width, height: image.height })\n png.data = Buffer.from(image.data.buffer, image.data.byteOffset, image.data.byteLength)\n\n return Uint8Array.from(PNG.sync.write(png))\n}\n\nfunction startsWith (bytes: Uint8Array, magic: number[]): boolean {\n if (bytes.length < magic.length) return false\n for (const [i, byte] of magic.entries()) if (bytes[i] !== byte) return false\n\n return true\n}\n","import type { BinaryImage, GrayImage, Raster } from '../types'\nimport { createBinary, createGray } from './raster'\n\n/**\n * Turning a photograph of paper into something two images can be compared on.\n *\n * A scan differs from its source in ways that have nothing to do with where\n * the page is: the lamp is brighter in the middle, the phone cast a shadow\n * down one side, the JPEG quantiser smeared the strokes. Comparing raw\n * greyscale means comparing all of that too. So every stage below the codec\n * works on **ink**: greyscale divided by its own slowly-varying background and\n * inverted, which is near zero on paper and near one on print no matter what\n * the lighting did.\n *\n * Think of it as reading a page through a sheet of tracing paper — you lose\n * the tint of the paper and the angle of the lamp, and keep the writing.\n */\n\n/** Rec. 601 luminance, alpha composited over white, scaled to `[0, 1]`. */\nexport function toGrayscale (image: Raster): GrayImage {\n const out = createGray(image.width, image.height)\n const src = image.data\n const dst = out.data\n\n for (let i = 0, p = 0; p < dst.length; i += 4, p++) {\n const a = src[i + 3] / 255\n const r = src[i] * a + 255 * (1 - a)\n const g = src[i + 1] * a + 255 * (1 - a)\n const b = src[i + 2] * a + 255 * (1 - a)\n dst[p] = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n }\n\n return out\n}\n\n/** Render a single channel back to RGBA, for debugging and diff overlays. */\nexport function grayToRaster (image: GrayImage): Raster {\n const data = new Uint8ClampedArray(image.width * image.height * 4)\n for (let p = 0, i = 0; p < image.data.length; p++, i += 4) {\n const v = image.data[p] * 255\n data[i] = v\n data[i + 1] = v\n data[i + 2] = v\n data[i + 3] = 255\n }\n\n return { width: image.width, height: image.height, data }\n}\n\n/** Summed-area table with a zero first row and column, so a window sum is four lookups. */\nexport function integralImage (image: GrayImage): Float64Array {\n const { width, height, data } = image\n const stride = width + 1\n const sum = new Float64Array(stride * (height + 1))\n\n for (let y = 0; y < height; y++) {\n let rowSum = 0\n const srcRow = y * width\n const dstRow = (y + 1) * stride\n const prevRow = y * stride\n for (let x = 0; x < width; x++) {\n rowSum += data[srcRow + x]\n sum[dstRow + x + 1] = sum[prevRow + x + 1] + rowSum\n }\n }\n\n return sum\n}\n\n/**\n * Mean over a `(2 * radius + 1)` square, in time independent of the radius.\n *\n * Border windows are clipped and divided by their real area rather than padded,\n * so the blur never invents dark paper outside the page.\n */\nexport function boxBlur (image: GrayImage, radius: number): GrayImage {\n const r = Math.max(0, Math.round(radius))\n if (r === 0) return { ...image, data: Float32Array.from(image.data) }\n\n const { width, height } = image\n const sum = integralImage(image)\n const stride = width + 1\n const out = createGray(width, height)\n\n for (let y = 0; y < height; y++) {\n const y0 = Math.max(0, y - r)\n const y1 = Math.min(height, y + r + 1)\n const top = y0 * stride\n const bottom = y1 * stride\n\n for (let x = 0; x < width; x++) {\n const x0 = Math.max(0, x - r)\n const x1 = Math.min(width, x + r + 1)\n const total = sum[bottom + x1] - sum[bottom + x0] - sum[top + x1] + sum[top + x0]\n out.data[y * width + x] = total / ((y1 - y0) * (x1 - x0))\n }\n }\n\n return out\n}\n\nexport interface InkOptions {\n /**\n * Background window as a fraction of the shorter side. The window has to be\n * wide enough that no glyph can fill it — otherwise a bold heading becomes\n * its own background and disappears — and narrow enough to follow a shadow.\n */\n backgroundFraction?: number\n /** Ink below this fraction of full black is treated as paper noise and zeroed. */\n floor?: number\n}\n\n/**\n * Greyscale to ink: divide out the local background, invert, clip the noise floor.\n *\n * Division rather than subtraction because illumination is multiplicative —\n * a shadow halves what reaches the sensor, it does not subtract a constant —\n * so dividing restores the same contrast in the shadow as in the light.\n */\nexport function inkMap (gray: GrayImage, options: InkOptions = {}): GrayImage {\n const { backgroundFraction = 1 / 16, floor = 0.06 } = options\n const radius = Math.max(4, Math.round(Math.min(gray.width, gray.height) * backgroundFraction))\n const background = boxBlur(gray, radius)\n const out = createGray(gray.width, gray.height)\n\n for (let p = 0; p < out.data.length; p++) {\n const bg = Math.max(background.data[p], 1e-3)\n const ratio = gray.data[p] / bg\n const ink = 1 - Math.min(1, ratio)\n out.data[p] = ink < floor ? 0 : Math.min(1, (ink - floor) / (1 - floor))\n }\n\n return out\n}\n\n/** Otsu's threshold over a 256-bin histogram of `[0, 1]` values. */\nexport function otsuThreshold (image: GrayImage): number {\n const bins = 256\n const histogram = new Float64Array(bins)\n for (const value of image.data) {\n const bin = Math.min(bins - 1, Math.max(0, Math.round(value * (bins - 1))))\n histogram[bin]++\n }\n\n const total = image.data.length\n let sumAll = 0\n for (let i = 0; i < bins; i++) sumAll += i * histogram[i]\n\n let sumBackground = 0\n let weightBackground = 0\n let best = 0\n let bestVariance = -1\n\n for (let t = 0; t < bins; t++) {\n weightBackground += histogram[t]\n if (weightBackground === 0) continue\n const weightForeground = total - weightBackground\n if (weightForeground === 0) break\n\n sumBackground += t * histogram[t]\n const meanBackground = sumBackground / weightBackground\n const meanForeground = (sumAll - sumBackground) / weightForeground\n const between = weightBackground * weightForeground * (meanBackground - meanForeground) ** 2\n\n if (between > bestVariance) {\n bestVariance = between\n best = t\n }\n }\n\n return best / (bins - 1)\n}\n\n/**\n * Ink to a binary mask.\n *\n * `threshold` defaults to Otsu's, with a floor: a page that is genuinely blank\n * has no bimodal split to find, and Otsu will happily cut its noise in half\n * and report that 50% of the paper is ink.\n */\nexport function binarize (image: GrayImage, threshold?: number): BinaryImage {\n const t = Math.max(threshold ?? otsuThreshold(image), 0.12)\n const out = createBinary(image.width, image.height)\n for (let p = 0; p < out.data.length; p++) out.data[p] = image.data[p] > t ? 1 : 0\n\n return out\n}\n\n/**\n * Morphological dilation by a square, done as two 1D max passes.\n *\n * Used to give the original's ink a tolerance band before asking what is new\n * in the scan: without it, alignment that is half a pixel off reports the edge\n * of every printed character as freshly written.\n */\nexport function dilate (mask: BinaryImage, radius: number): BinaryImage {\n const r = Math.max(0, Math.round(radius))\n if (r === 0) return { ...mask, data: Uint8Array.from(mask.data) }\n\n const { width, height } = mask\n const horizontal = new Uint8Array(width * height)\n\n for (let y = 0; y < height; y++) {\n const row = y * width\n for (let x = 0; x < width; x++) {\n let hit = 0\n const from = Math.max(0, x - r)\n const to = Math.min(width - 1, x + r)\n for (let k = from; k <= to; k++)\n if (mask.data[row + k] === 1) {\n hit = 1\n break\n }\n horizontal[row + x] = hit\n }\n }\n\n const out = createBinary(width, height)\n for (let y = 0; y < height; y++) {\n const from = Math.max(0, y - r)\n const to = Math.min(height - 1, y + r)\n for (let x = 0; x < width; x++) {\n let hit = 0\n for (let k = from; k <= to; k++)\n if (horizontal[k * width + x] === 1) {\n hit = 1\n break\n }\n out.data[y * width + x] = hit\n }\n }\n\n return out\n}\n\n/** Fraction of pixels set in `mask`, restricted to a rectangle when one is given. */\nexport function coverage (mask: BinaryImage, x0 = 0, y0 = 0, x1 = mask.width, y1 = mask.height): number {\n const left = Math.max(0, Math.floor(x0))\n const top = Math.max(0, Math.floor(y0))\n const right = Math.min(mask.width, Math.ceil(x1))\n const bottom = Math.min(mask.height, Math.ceil(y1))\n if (right <= left || bottom <= top) return 0\n\n let hits = 0\n for (let y = top; y < bottom; y++) {\n const row = y * mask.width\n for (let x = left; x < right; x++) hits += mask.data[row + x]\n }\n\n return hits / ((right - left) * (bottom - top))\n}\n","import type { GrayImage, Raster } from '../types'\nimport { createGray } from './raster'\n\n/**\n * Separable resampling: area-average going down, bilinear going up.\n *\n * Going down matters more than it sounds. Point-sampling a 300 dpi scan to\n * half size drops every other row, and on a page of 9pt text that deletes\n * roughly half the strokes — the thumbnail the matcher sees is not a smaller\n * version of the page, it is a different page. Averaging over the exact source\n * footprint of each destination pixel is what keeps the ink where it was.\n */\n\n/** Resize a single channel image to exactly `width x height`. */\nexport function resizeGray (src: GrayImage, width: number, height: number): GrayImage {\n if (width === src.width && height === src.height) return { ...src, data: Float32Array.from(src.data) }\n\n const horizontal = new Float32Array(width * src.height)\n resampleRows(src.data, src.width, src.height, horizontal, width)\n\n const out = createGray(width, height)\n resampleColumns(horizontal, width, src.height, out.data, height)\n\n return out\n}\n\n/**\n * Shrink so the longer side is at most `maxDimension`.\n *\n * Returns the factor applied, because every coordinate the caller recovers in\n * this smaller frame has to be scaled back up by it.\n */\nexport function downscaleGray (src: GrayImage, maxDimension: number): { image: GrayImage, scale: number } {\n const longest = Math.max(src.width, src.height)\n if (longest <= maxDimension) return { image: { ...src, data: Float32Array.from(src.data) }, scale: 1 }\n\n const scale = maxDimension / longest\n const width = Math.max(1, Math.round(src.width * scale))\n const height = Math.max(1, Math.round(src.height * scale))\n\n // The realised scale is what the rounded pixel counts imply, not the request.\n return { image: resizeGray(src, width, height), scale: width / src.width }\n}\n\n/**\n * Box blur an RGBA raster with two sliding-window passes.\n *\n * Lives here rather than with the other blurs because its only caller is the\n * warp prefilter, and because it has to work in bytes: a summed-area table over\n * four channels of a 12 megapixel scan is 400 MB, which is not a thing to\n * allocate inside a function app.\n */\nexport function boxBlurRaster (src: Raster, radius: number): Raster {\n const r = Math.max(0, Math.round(radius))\n if (r === 0) return { ...src, data: Uint8ClampedArray.from(src.data) }\n\n const { width, height } = src\n const temp = new Uint8ClampedArray(width * height * 4)\n const sums = new Int32Array(4)\n\n for (let y = 0; y < height; y++) {\n const row = y * width * 4\n sums.fill(0)\n let count = 0\n for (let x = 0; x <= Math.min(r, width - 1); x++, count++)\n for (let c = 0; c < 4; c++) sums[c] += src.data[row + x * 4 + c]\n\n for (let x = 0; x < width; x++) {\n for (let c = 0; c < 4; c++) temp[row + x * 4 + c] = sums[c] / count\n\n const leaving = x - r\n const entering = x + r + 1\n if (leaving >= 0) {\n for (let c = 0; c < 4; c++) sums[c] -= src.data[row + leaving * 4 + c]\n count--\n }\n if (entering < width) {\n for (let c = 0; c < 4; c++) sums[c] += src.data[row + entering * 4 + c]\n count++\n }\n }\n }\n\n const out = new Uint8ClampedArray(width * height * 4)\n const columnSums = new Int32Array(width * 4)\n let count = 0\n for (let y = 0; y <= Math.min(r, height - 1); y++, count++)\n for (let i = 0; i < width * 4; i++) columnSums[i] += temp[y * width * 4 + i]\n\n for (let y = 0; y < height; y++) {\n const row = y * width * 4\n for (let i = 0; i < width * 4; i++) out[row + i] = columnSums[i] / count\n\n const leaving = y - r\n const entering = y + r + 1\n if (leaving >= 0) {\n for (let i = 0; i < width * 4; i++) columnSums[i] -= temp[leaving * width * 4 + i]\n count--\n }\n if (entering < height) {\n for (let i = 0; i < width * 4; i++) columnSums[i] += temp[entering * width * 4 + i]\n count++\n }\n }\n\n return { width, height, data: out }\n}\n\nfunction resampleRows (\n src: Float32Array,\n srcWidth: number,\n rows: number,\n dst: Float32Array,\n dstWidth: number,\n): void {\n const ratio = srcWidth / dstWidth\n\n if (ratio > 1) {\n for (let y = 0; y < rows; y++) {\n const srcRow = y * srcWidth\n const dstRow = y * dstWidth\n for (let x = 0; x < dstWidth; x++) {\n const start = x * ratio\n const end = start + ratio\n dst[dstRow + x] = areaAverage(src, srcRow, srcWidth, start, end)\n }\n }\n\n return\n }\n\n for (let y = 0; y < rows; y++) {\n const srcRow = y * srcWidth\n const dstRow = y * dstWidth\n for (let x = 0; x < dstWidth; x++) {\n const pos = clamp((x + 0.5) * ratio - 0.5, 0, srcWidth - 1)\n const i0 = Math.floor(pos)\n const i1 = Math.min(srcWidth - 1, i0 + 1)\n const frac = pos - i0\n dst[dstRow + x] = src[srcRow + i0] * (1 - frac) + src[srcRow + i1] * frac\n }\n }\n}\n\nfunction resampleColumns (\n src: Float32Array,\n width: number,\n srcHeight: number,\n dst: Float32Array,\n dstHeight: number,\n): void {\n const ratio = srcHeight / dstHeight\n const column = new Float32Array(srcHeight)\n\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < srcHeight; y++) column[y] = src[y * width + x]\n\n if (ratio > 1)\n for (let y = 0; y < dstHeight; y++) {\n const start = y * ratio\n dst[y * width + x] = areaAverage(column, 0, srcHeight, start, start + ratio)\n }\n else\n for (let y = 0; y < dstHeight; y++) {\n const pos = clamp((y + 0.5) * ratio - 0.5, 0, srcHeight - 1)\n const i0 = Math.floor(pos)\n const i1 = Math.min(srcHeight - 1, i0 + 1)\n const frac = pos - i0\n dst[y * width + x] = column[i0] * (1 - frac) + column[i1] * frac\n }\n }\n}\n\n/** Mean of `src[offset + start .. offset + end)`, weighting the two partially covered ends. */\nfunction areaAverage (src: Float32Array, offset: number, length: number, start: number, end: number): number {\n const from = Math.max(0, Math.floor(start))\n const to = Math.min(length, Math.ceil(end))\n let total = 0\n let weight = 0\n\n for (let i = from; i < to; i++) {\n const w = Math.min(end, i + 1) - Math.max(start, i)\n if (w <= 0) continue\n total += src[offset + i] * w\n weight += w\n }\n\n return weight > 0 ? total / weight : 0\n}\n\nfunction clamp (value: number, min: number, max: number): number {\n return value < min ? min : (Math.min(value, max))\n}\n","import type { GrayImage, Matrix3, Raster } from '../types'\nimport { createGray } from './raster'\nimport { boxBlurRaster } from './resize'\n\n/**\n * Resampling one image onto another image's grid.\n *\n * The matrix maps **destination coordinates to source coordinates** — we stand\n * on each output pixel and reach back into the scan for its colour. Doing it\n * the other way, pushing scan pixels forward, leaves the output full of pinholes\n * wherever the transform stretches, for the same reason a rotated stencil\n * sprays gaps.\n */\n\nexport type Interpolation = 'nearest' | 'bilinear' | 'bicubic'\n\nexport interface WarpOptions {\n /** RGBA fill for destination pixels that fall outside the source. Opaque white by default. */\n background?: [number, number, number, number]\n interpolation?: Interpolation\n /**\n * Low-pass the source before minifying, so shrinking a 300 dpi scan does not\n * alias the text into stripes. On by default; it costs one blur.\n */\n prefilter?: boolean\n}\n\n/** Warp an RGBA raster onto a `width x height` canvas. */\nexport function warpRaster (\n source: Raster,\n matrix: Matrix3,\n width: number,\n height: number,\n options: WarpOptions = {},\n): Raster {\n const {\n background = [255, 255, 255, 255],\n interpolation = 'bilinear',\n prefilter = true,\n } = options\n\n const src = prefilter ? applyPrefilter(source, matrix) : source\n const data = new Uint8ClampedArray(width * height * 4)\n const [m0, m1, m2, m3, m4, m5, m6, m7, m8] = matrix\n\n for (let y = 0; y < height; y++) {\n const dy = y + 0.5\n let i = y * width * 4\n\n for (let x = 0; x < width; x++, i += 4) {\n const dx = x + 0.5\n const w = m6 * dx + m7 * dy + m8\n if (w === 0) {\n writePixel(data, i, background)\n continue\n }\n\n // Continuous source coordinate, then index space: pixel k spans [k, k+1)\n // with its centre at k + 0.5, so the sample index is the centre minus a half.\n const u = (m0 * dx + m1 * dy + m2) / w - 0.5\n const v = (m3 * dx + m4 * dy + m5) / w - 0.5\n\n if (u < -1 || v < -1 || u > src.width || v > src.height) {\n writePixel(data, i, background)\n continue\n }\n\n sampleRaster(src, u, v, interpolation, data, i)\n }\n }\n\n return { width, height, data }\n}\n\n/** Warp a single channel image. Used for scoring, where colour is noise. */\nexport function warpGray (\n source: GrayImage,\n matrix: Matrix3,\n width: number,\n height: number,\n fill = 0,\n): GrayImage {\n const out = createGray(width, height)\n const [m0, m1, m2, m3, m4, m5, m6, m7, m8] = matrix\n\n for (let y = 0; y < height; y++) {\n const dy = y + 0.5\n const row = y * width\n\n for (let x = 0; x < width; x++) {\n const dx = x + 0.5\n const w = m6 * dx + m7 * dy + m8\n if (w === 0) {\n out.data[row + x] = fill\n continue\n }\n\n const u = (m0 * dx + m1 * dy + m2) / w - 0.5\n const v = (m3 * dx + m4 * dy + m5) / w - 0.5\n out.data[row + x] = sampleGrayBilinear(source, u, v, fill)\n }\n }\n\n return out\n}\n\n/** Bilinear read at a fractional index, returning `fill` outside the image. */\nexport function sampleGrayBilinear (image: GrayImage, u: number, v: number, fill = 0): number {\n const { width, height, data } = image\n if (u <= -1 || v <= -1 || u >= width || v >= height) return fill\n\n const x0 = Math.floor(u)\n const y0 = Math.floor(v)\n const fx = u - x0\n const fy = v - y0\n const x1 = x0 + 1\n const y1 = y0 + 1\n\n const cx0 = clampIndex(x0, width)\n const cx1 = clampIndex(x1, width)\n const cy0 = clampIndex(y0, height)\n const cy1 = clampIndex(y1, height)\n\n const p00 = data[cy0 * width + cx0]\n const p10 = data[cy0 * width + cx1]\n const p01 = data[cy1 * width + cx0]\n const p11 = data[cy1 * width + cx1]\n\n return (\n p00 * (1 - fx) * (1 - fy) +\n p10 * fx * (1 - fy) +\n p01 * (1 - fx) * fy +\n p11 * fx * fy\n )\n}\n\n/**\n * Blur the source when the warp is a minification.\n *\n * `sqrt(|det|)` of the linear part is how many source pixels land on one\n * destination pixel along an average direction; when that is comfortably above\n * one, a point sample is reading one of them and discarding the rest.\n */\nfunction applyPrefilter (source: Raster, matrix: Matrix3): Raster {\n const det = Math.abs(matrix[0] * matrix[4] - matrix[1] * matrix[3])\n const scale = Math.sqrt(det)\n if (!Number.isFinite(scale) || scale <= 1.25) return source\n\n return boxBlurRaster(source, (scale - 1) / 2)\n}\n\nfunction sampleRaster (\n src: Raster,\n u: number,\n v: number,\n interpolation: Interpolation,\n out: Uint8ClampedArray,\n at: number,\n): void {\n if (interpolation === 'nearest') {\n const x = clampIndex(Math.round(u), src.width)\n const y = clampIndex(Math.round(v), src.height)\n const i = (y * src.width + x) * 4\n out[at] = src.data[i]\n out[at + 1] = src.data[i + 1]\n out[at + 2] = src.data[i + 2]\n out[at + 3] = src.data[i + 3]\n\n return\n }\n\n if (interpolation === 'bicubic') {\n sampleBicubic(src, u, v, out, at)\n\n return\n }\n\n const x0 = Math.floor(u)\n const y0 = Math.floor(v)\n const fx = u - x0\n const fy = v - y0\n const cx0 = clampIndex(x0, src.width)\n const cx1 = clampIndex(x0 + 1, src.width)\n const cy0 = clampIndex(y0, src.height)\n const cy1 = clampIndex(y0 + 1, src.height)\n\n const i00 = (cy0 * src.width + cx0) * 4\n const i10 = (cy0 * src.width + cx1) * 4\n const i01 = (cy1 * src.width + cx0) * 4\n const i11 = (cy1 * src.width + cx1) * 4\n\n const w00 = (1 - fx) * (1 - fy)\n const w10 = fx * (1 - fy)\n const w01 = (1 - fx) * fy\n const w11 = fx * fy\n\n for (let c = 0; c < 4; c++)\n out[at + c] =\n src.data[i00 + c] * w00 +\n src.data[i10 + c] * w10 +\n src.data[i01 + c] * w01 +\n src.data[i11 + c] * w11\n}\n\n/** Catmull-Rom over a 4x4 neighbourhood: sharper strokes than bilinear when upscaling. */\nfunction sampleBicubic (src: Raster, u: number, v: number, out: Uint8ClampedArray, at: number): void {\n const x0 = Math.floor(u)\n const y0 = Math.floor(v)\n const fx = u - x0\n const fy = v - y0\n\n const wx = catmullRomWeights(fx)\n const wy = catmullRomWeights(fy)\n\n for (let c = 0; c < 4; c++) {\n let total = 0\n for (let j = 0; j < 4; j++) {\n const y = clampIndex(y0 - 1 + j, src.height)\n const row = y * src.width\n let rowTotal = 0\n for (let i = 0; i < 4; i++) {\n const x = clampIndex(x0 - 1 + i, src.width)\n rowTotal += src.data[(row + x) * 4 + c] * wx[i]\n }\n total += rowTotal * wy[j]\n }\n out[at + c] = total\n }\n}\n\nfunction catmullRomWeights (t: number): [number, number, number, number] {\n const t2 = t * t\n const t3 = t2 * t\n\n return [\n 0.5 * (-t3 + 2 * t2 - t),\n 0.5 * (3 * t3 - 5 * t2 + 2),\n 0.5 * (-3 * t3 + 4 * t2 + t),\n 0.5 * (t3 - t2),\n ]\n}\n\nfunction writePixel (data: Uint8ClampedArray, at: number, rgba: [number, number, number, number]): void {\n data[at] = rgba[0]\n data[at + 1] = rgba[1]\n data[at + 2] = rgba[2]\n data[at + 3] = rgba[3]\n}\n\nfunction clampIndex (value: number, length: number): number {\n return value < 0 ? 0 : (value >= length ? length - 1 : value)\n}\n","import type { Matrix3, Point, Rect, TransformModel, TransformSummary } from '../types'\n\n/**\n * 3x3 homogeneous matrix helpers.\n *\n * ## The one convention that matters\n *\n * Every matrix in this library maps **original coordinates to scanned\n * coordinates**, never the other way round. That reads backwards the first\n * time: we are producing an image on the original's canvas, so we walk the\n * output pixel by pixel and ask \"where in the scan does this come from?\".\n * Inverse mapping is what stops the output having holes — forward-splatting a\n * rotated source leaves gaps between the splats, like spray-painting through a\n * rotated stencil.\n *\n * Coordinates are continuous, with the centre of pixel `(i, j)` at\n * `(i + 0.5, j + 0.5)`. Sticking to that is what makes {@link conjugateScale}\n * a plain scale conjugation instead of a scale plus a half-pixel fudge.\n */\n\nexport const IDENTITY: Matrix3 = [1, 0, 0, 0, 1, 0, 0, 0, 1]\n\n/** `a * b` — the transform that applies `b` first, then `a`. */\nexport function multiply (a: Matrix3, b: Matrix3): Matrix3 {\n return [\n a[0] * b[0] + a[1] * b[3] + a[2] * b[6],\n a[0] * b[1] + a[1] * b[4] + a[2] * b[7],\n a[0] * b[2] + a[1] * b[5] + a[2] * b[8],\n\n a[3] * b[0] + a[4] * b[3] + a[5] * b[6],\n a[3] * b[1] + a[4] * b[4] + a[5] * b[7],\n a[3] * b[2] + a[4] * b[5] + a[5] * b[8],\n\n a[6] * b[0] + a[7] * b[3] + a[8] * b[6],\n a[6] * b[1] + a[7] * b[4] + a[8] * b[7],\n a[6] * b[2] + a[7] * b[5] + a[8] * b[8],\n ]\n}\n\nexport function determinant (m: Matrix3): number {\n return (\n m[0] * (m[4] * m[8] - m[5] * m[7]) -\n m[1] * (m[3] * m[8] - m[5] * m[6]) +\n m[2] * (m[3] * m[7] - m[4] * m[6])\n )\n}\n\n/** Throws when `m` is singular — a transform that collapses the page to a line is never a usable answer. */\nexport function invert (m: Matrix3): Matrix3 {\n const det = determinant(m)\n if (!Number.isFinite(det) || Math.abs(det) < 1e-12)\n throw new Error('matrix is singular and cannot be inverted')\n\n const inv = 1 / det\n\n return [\n (m[4] * m[8] - m[5] * m[7]) * inv,\n (m[2] * m[7] - m[1] * m[8]) * inv,\n (m[1] * m[5] - m[2] * m[4]) * inv,\n\n (m[5] * m[6] - m[3] * m[8]) * inv,\n (m[0] * m[8] - m[2] * m[6]) * inv,\n (m[2] * m[3] - m[0] * m[5]) * inv,\n\n (m[3] * m[7] - m[4] * m[6]) * inv,\n (m[1] * m[6] - m[0] * m[7]) * inv,\n (m[0] * m[4] - m[1] * m[3]) * inv,\n ]\n}\n\n/** Divide through by `m8` so two matrices describing the same transform compare equal. */\nexport function normalize (m: Matrix3): Matrix3 {\n const s = m[8]\n if (s === 0 || s === 1) return m\n\n return [m[0] / s, m[1] / s, m[2] / s, m[3] / s, m[4] / s, m[5] / s, m[6] / s, m[7] / s, 1]\n}\n\nexport function applyPoint (m: Matrix3, x: number, y: number): Point {\n const w = m[6] * x + m[7] * y + m[8]\n const iw = w === 0 ? 0 : 1 / w\n\n return { x: (m[0] * x + m[1] * y + m[2]) * iw, y: (m[3] * x + m[4] * y + m[5]) * iw }\n}\n\nexport function translation (tx: number, ty: number): Matrix3 {\n return [1, 0, tx, 0, 1, ty, 0, 0, 1]\n}\n\nexport function scaling (sx: number, sy = sx): Matrix3 {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1]\n}\n\n/**\n * Scale `s` and rotation `angleRad` about `pivot`, then land that pivot on `target`.\n *\n * This is the shape the coarse stage produces: \"the middle of the original's\n * printed content is the middle of the scan's printed content, turned by this\n * much and this many times bigger\".\n */\nexport function similarity (s: number, angleRad: number, pivot: Point, target: Point): Matrix3 {\n const c = Math.cos(angleRad) * s\n const k = Math.sin(angleRad) * s\n\n return [\n c, -k, target.x - c * pivot.x + k * pivot.y,\n k, c, target.y - k * pivot.x - c * pivot.y,\n 0, 0, 1,\n ]\n}\n\n/**\n * Re-express `m` in a coordinate frame scaled by `k`.\n *\n * Fitting runs on downscaled copies because matching 3000x4000 images is a\n * waste; the matrix that comes back speaks in those small pixels. `k` is\n * `working / full`, and the result speaks in full-resolution pixels.\n */\nexport function conjugateScale (m: Matrix3, k: number): Matrix3 {\n return multiply(scaling(1 / k), multiply(m, scaling(k)))\n}\n\n/**\n * Re-express a matrix whose two frames were scaled by different factors.\n *\n * The coarse stage measures on two independently shrunk copies - the original\n * and the scan rarely have the same pixel count, so they rarely shrink by the\n * same factor. `sourceScale` and `targetScale` are each `working / full` for\n * their own side, and the result speaks full-resolution pixels on both.\n */\nexport function rebase (m: Matrix3, sourceScale: number, targetScale: number): Matrix3 {\n return multiply(scaling(1 / targetScale), multiply(m, scaling(sourceScale)))\n}\n\n/** The four corners of `rect` mapped through `m`, clockwise from the top-left. */\nexport function mapRectCorners (m: Matrix3, rect: Rect): Point[] {\n const { x, y, width, height } = rect\n\n return [\n applyPoint(m, x, y),\n applyPoint(m, x + width, y),\n applyPoint(m, x + width, y + height),\n applyPoint(m, x, y + height),\n ]\n}\n\n/**\n * Pull a matrix apart into scale, rotation and shear.\n *\n * The 2x2 linear part is factored as `R(theta) * [[sx, k], [0, sy]]`, which is\n * the order a scanner actually applies them: the page is stretched on the\n * glass, then the whole thing sits at an angle.\n */\nexport function decompose (m: Matrix3, model: TransformModel): TransformSummary {\n const [a, b, , d, e] = m\n const scaleX = Math.hypot(a, d)\n const det = a * e - b * d\n const scaleY = scaleX === 0 ? 0 : det / scaleX\n const shear = scaleX === 0 ? 0 : (a * b + d * e) / scaleX\n const origin = applyPoint(m, 0, 0)\n\n return {\n model,\n scaleX,\n scaleY,\n rotationDeg: (Math.atan2(d, a) * 180) / Math.PI,\n shearDeg: (Math.atan2(shear, scaleY || 1) * 180) / Math.PI,\n translation: origin,\n perspective: { x: m[6], y: m[7] },\n }\n}\n\n/** Euclidean distance between `m * source` and `target`, in target pixels. */\nexport function reprojectionError (m: Matrix3, source: Point, target: Point): number {\n const p = applyPoint(m, source.x, source.y)\n\n return Math.hypot(p.x - target.x, p.y - target.y)\n}\n\n/**\n * True when `m` is a plausible page-to-page transform rather than numerical debris.\n *\n * RANSAC on a minimal sample of near-collinear points loves to return a\n * matrix that folds the page in half. Cheaper to reject it here than to\n * discover it in the output.\n */\nexport function isPlausible (m: Matrix3, maxScaleRatio = 8): boolean {\n if (m.some(v => !Number.isFinite(v))) return false\n\n const [a, b, , d, e] = m\n const det = a * e - b * d\n if (Math.abs(det) <= 1e-9) return false\n // A mirrored page is never a scan of the same page.\n if (det < 0) return false\n\n const sx = Math.hypot(a, d)\n if (sx < 1 / maxScaleRatio || sx > maxScaleRatio) return false\n\n const sy = Math.hypot(b, e)\n\n return !(sy < 1 / maxScaleRatio || sy > maxScaleRatio)\n}\n","import type { GrayImage, Point } from '../types'\n\n/**\n * Where the printing is, and which way up it is.\n *\n * Feature matching needs the two images at roughly the same scale before its\n * descriptors mean anything, and nothing in the file headers tells us the dpi\n * the scanner used. What does tell us is the printing itself: the block of ink\n * on the page is the same physical object in both images, so the ratio of its\n * measured sizes is the ratio of the resolutions. Measuring it needs the skew\n * out of the way first, which is what {@link estimateSkew} is for.\n */\n\nexport interface ContentExtent {\n /** Extent along the rotated axes, in pixels. */\n width: number\n height: number\n /** Centre of the extent, back in unrotated image coordinates. */\n center: Point\n /** The angle the extent was measured at, in radians. */\n angle: number\n /** Mean ink over the whole image. Near zero means there was nothing to measure. */\n density: number\n}\n\nexport interface SkewOptions {\n /** Largest skew to consider, in degrees, in either direction. */\n maxAngleDeg?: number\n /** Longest side of the image the search runs on. Skew does not need detail. */\n workingSize?: number\n}\n\n/**\n * Extent of the ink along axes rotated by `angle`, trimming outliers.\n *\n * `trim` is a fraction of the total ink discarded from each end of each axis.\n * A scanner that clips a black strip down one edge, or a speck of dust, would\n * otherwise set the page boundary — and since this measurement becomes the\n * scale estimate, a 2% error here is a 2% error in every coordinate downstream.\n */\nexport function contentExtent (ink: GrayImage, angle = 0, trim = 0.004): ContentExtent {\n const { width, height, data } = ink\n const cos = Math.cos(angle)\n const sin = Math.sin(angle)\n\n const corners: Point[] = [\n { x: 0, y: 0 },\n { x: width, y: 0 },\n { x: 0, y: height },\n { x: width, y: height },\n ]\n let minU = Infinity\n let maxU = -Infinity\n let minV = Infinity\n let maxV = -Infinity\n for (const c of corners) {\n const u = c.x * cos + c.y * sin\n const v = -c.x * sin + c.y * cos\n minU = Math.min(minU, u)\n maxU = Math.max(maxU, u)\n minV = Math.min(minV, v)\n maxV = Math.max(maxV, v)\n }\n\n const uBins = new Float64Array(Math.ceil(maxU - minU) + 2)\n const vBins = new Float64Array(Math.ceil(maxV - minV) + 2)\n let total = 0\n\n for (let y = 0; y < height; y++) {\n const row = y * width\n const yCos = (y + 0.5) * cos\n const ySin = (y + 0.5) * sin\n for (let x = 0; x < width; x++) {\n const value = data[row + x]\n if (value <= 0) continue\n const px = x + 0.5\n // floor, not round: a pixel centre at x + 0.5 belongs to bucket x.\n uBins[Math.floor(px * cos + ySin - minU)] += value\n vBins[Math.floor(-px * sin + yCos - minV)] += value\n total += value\n }\n }\n\n if (total <= 0) {\n // Nothing printed: report the whole frame rather than an empty box, so the\n // caller falls back to fitting the page frame instead of dividing by zero.\n return {\n width,\n height,\n center: { x: width / 2, y: height / 2 },\n angle,\n density: 0,\n }\n }\n\n const [u0, u1] = trimmedSpan(uBins, total, trim)\n const [v0, v1] = trimmedSpan(vBins, total, trim)\n\n const centerU = minU + (u0 + u1) / 2\n const centerV = minV + (v0 + v1) / 2\n\n return {\n width: Math.max(1, u1 - u0),\n height: Math.max(1, v1 - v0),\n center: { x: centerU * cos - centerV * sin, y: centerU * sin + centerV * cos },\n angle,\n density: total / (width * height),\n }\n}\n\n/**\n * The page's own skew, in radians, from the sharpness of its ink profile.\n *\n * Rotate the page until the rows of text stack up: at the right angle every\n * line of type falls into one bin of the projection histogram and the profile\n * is a comb of tall spikes; a degree off and each line smears across several\n * bins. Sum of squares rewards exactly that concentration — same total ink,\n * fewer bins, bigger number. Searched coarse to fine so the cost stays flat.\n */\nexport function estimateSkew (ink: GrayImage, options: SkewOptions = {}): number {\n const { maxAngleDeg = 12 } = options\n const toRad = Math.PI / 180\n\n let best = 0\n let bestScore = -Infinity\n for (let deg = -maxAngleDeg; deg <= maxAngleDeg; deg += 1) {\n const score = profileSharpness(ink, deg * toRad)\n if (score > bestScore) {\n bestScore = score\n best = deg\n }\n }\n\n for (const [span, step] of [[1, 0.2], [0.2, 0.04]] as const) {\n let localBest = best\n for (let deg = best - span; deg <= best + span + 1e-9; deg += step) {\n const score = profileSharpness(ink, deg * toRad)\n if (score > bestScore) {\n bestScore = score\n localBest = deg\n }\n }\n best = localBest\n }\n\n return best * toRad\n}\n\n/** Sum of squares of the ink profile projected onto the axis perpendicular to `angle`. */\nexport function profileSharpness (ink: GrayImage, angle: number): number {\n const { width, height, data } = ink\n const cos = Math.cos(angle)\n const sin = Math.sin(angle)\n const offset = Math.max(0, -width * sin)\n const bins = new Float64Array(Math.ceil(height * cos + width * Math.abs(sin)) + 2)\n\n for (let y = 0; y < height; y++) {\n const row = y * width\n const yCos = (y + 0.5) * cos + offset\n for (let x = 0; x < width; x++) {\n const value = data[row + x]\n if (value <= 0) continue\n const bin = Math.floor(yCos - (x + 0.5) * sin)\n if (bin >= 0 && bin < bins.length) bins[bin] += value\n }\n }\n\n let score = 0\n for (const value of bins) score += value * value\n\n return score\n}\n\n/** First and last bin holding all but `trim` of the mass at each end. */\nfunction trimmedSpan (bins: Float64Array, total: number, trim: number): [number, number] {\n const cutoff = total * trim\n\n let accumulated = 0\n let low = 0\n for (; low < bins.length; low++) {\n accumulated += bins[low]\n if (accumulated > cutoff) break\n }\n\n accumulated = 0\n let high = bins.length - 1\n for (; high > low; high--) {\n accumulated += bins[high]\n if (accumulated > cutoff) break\n }\n\n return [low, high + 1]\n}\n","/**\n * In-place radix-2 Cooley-Tukey FFT, real and imaginary parts in separate arrays.\n *\n * Only used by phase correlation, which needs a *global* translation estimate\n * that no amount of local feature matching can produce on a page with almost\n * nothing printed on it. Sizes must be powers of two; {@link nextPowerOfTwo}\n * and the caller's zero padding see to that.\n */\n\nexport function nextPowerOfTwo (n: number): number {\n let p = 1\n while (p < n) p *= 2\n\n return p\n}\n\nexport function isPowerOfTwo (n: number): boolean {\n return n > 0 && (n & (n - 1)) === 0\n}\n\n/** Transform `re`/`im` of length `n` in place. `inverse` also divides by `n`. */\nexport function fft1d (re: Float64Array, im: Float64Array, inverse = false): void {\n const n = re.length\n if (!isPowerOfTwo(n)) throw new Error(`fft length must be a power of two, got ${n}`)\n if (n === 1) return\n\n // Bit-reversal permutation: the decimation-in-time butterflies below expect\n // the input already shuffled into the order the recursion would have left it.\n for (let i = 1, j = 0; i < n; i++) {\n let bit = n >> 1\n for (; (j & bit) !== 0; bit >>= 1) j ^= bit\n j ^= bit\n\n if (i < j) {\n let t = re[i]\n re[i] = re[j]\n re[j] = t\n t = im[i]\n im[i] = im[j]\n im[j] = t\n }\n }\n\n const sign = inverse ? 1 : -1\n for (let len = 2; len <= n; len <<= 1) {\n const angle = (sign * 2 * Math.PI) / len\n const wRe = Math.cos(angle)\n const wIm = Math.sin(angle)\n\n for (let start = 0; start < n; start += len) {\n let curRe = 1\n let curIm = 0\n const half = len >> 1\n\n for (let k = 0; k < half; k++) {\n const i = start + k\n const j = i + half\n const evenRe = re[i]\n const evenIm = im[i]\n const oddRe = re[j] * curRe - im[j] * curIm\n const oddIm = re[j] * curIm + im[j] * curRe\n\n re[i] = evenRe + oddRe\n im[i] = evenIm + oddIm\n re[j] = evenRe - oddRe\n im[j] = evenIm - oddIm\n\n const nextRe = curRe * wRe - curIm * wIm\n curIm = curRe * wIm + curIm * wRe\n curRe = nextRe\n }\n }\n }\n\n if (inverse)\n for (let i = 0; i < n; i++) {\n re[i] /= n\n im[i] /= n\n }\n}\n\n/** 2D transform of a `width x height` row-major complex image, rows then columns. */\nexport function fft2d (\n re: Float64Array,\n im: Float64Array,\n width: number,\n height: number,\n inverse = false,\n): void {\n const rowRe = new Float64Array(width)\n const rowIm = new Float64Array(width)\n for (let y = 0; y < height; y++) {\n const off = y * width\n rowRe.set(re.subarray(off, off + width))\n rowIm.set(im.subarray(off, off + width))\n fft1d(rowRe, rowIm, inverse)\n re.set(rowRe, off)\n im.set(rowIm, off)\n }\n\n const colRe = new Float64Array(height)\n const colIm = new Float64Array(height)\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) {\n colRe[y] = re[y * width + x]\n colIm[y] = im[y * width + x]\n }\n fft1d(colRe, colIm, inverse)\n for (let y = 0; y < height; y++) {\n re[y * width + x] = colRe[y]\n im[y * width + x] = colIm[y]\n }\n }\n}\n","import { fft2d, nextPowerOfTwo } from '../math/fft'\nimport type { GrayImage } from '../types'\n\n/**\n * Global translation from the Fourier shift theorem.\n *\n * Shifting an image does not change the magnitude of its spectrum, only the\n * phase — and it changes the phase by an amount proportional to the shift. So\n * divide out the magnitudes entirely, keep the phase difference, transform\n * back, and what comes out is a single spike at the offset between the two\n * images.\n *\n * Its value here is that it does not care what is *on* the page. Feature\n * matching needs corners to match; a mostly blank form does not have enough of\n * them, and neither does a page that scanned faint. Phase correlation uses\n * every pixel at once, which makes it the fallback when features fail, and a\n * good final polish when they succeed.\n *\n * It only finds translation. Rotation and scale have to be dealt with first.\n */\n\nexport interface PhaseCorrelationResult {\n /** Shift that takes `a` onto `b`: a feature at `p` in `a` sits at `p + (dx, dy)` in `b`. */\n dx: number\n dy: number\n /** Height of the correlation spike. Near 1 is a clean single answer; near 0 is noise. */\n peak: number\n}\n\n/**\n * Correlate two equally sized images.\n *\n * Both are Hann-windowed first. Without it the FFT sees the frame edges as a\n * hard discontinuity repeating forever, and that cross pattern in the spectrum\n * can be a stronger signal than the page.\n */\nexport function phaseCorrelate (a: GrayImage, b: GrayImage): PhaseCorrelationResult {\n if (a.width !== b.width || a.height !== b.height)\n throw new Error('phaseCorrelate needs two images of the same size')\n\n const width = nextPowerOfTwo(a.width)\n const height = nextPowerOfTwo(a.height)\n const size = width * height\n\n const aRe = new Float64Array(size)\n const aIm = new Float64Array(size)\n const bRe = new Float64Array(size)\n const bIm = new Float64Array(size)\n\n const windowX = hann(a.width)\n const windowY = hann(a.height)\n\n for (let y = 0; y < a.height; y++) {\n const src = y * a.width\n const dst = y * width\n for (let x = 0; x < a.width; x++) {\n const w = windowX[x] * windowY[y]\n aRe[dst + x] = a.data[src + x] * w\n bRe[dst + x] = b.data[src + x] * w\n }\n }\n\n fft2d(aRe, aIm, width, height)\n fft2d(bRe, bIm, width, height)\n\n // Cross-power spectrum of b against a, normalised to unit magnitude so that\n // every frequency contributes its phase and nothing else.\n for (let i = 0; i < size; i++) {\n const re = bRe[i] * aRe[i] + bIm[i] * aIm[i]\n const im = bIm[i] * aRe[i] - bRe[i] * aIm[i]\n const magnitude = Math.hypot(re, im)\n if (magnitude < 1e-12) {\n bRe[i] = 0\n bIm[i] = 0\n } else {\n bRe[i] = re / magnitude\n bIm[i] = im / magnitude\n }\n }\n\n fft2d(bRe, bIm, width, height, true)\n\n let peakIndex = 0\n let peakValue = -Infinity\n for (let i = 0; i < size; i++)\n if (bRe[i] > peakValue) {\n peakValue = bRe[i]\n peakIndex = i\n }\n\n const px = peakIndex % width\n const py = Math.floor(peakIndex / width)\n\n const dx = wrap(px + parabolic(sample(bRe, width, height, px - 1, py), peakValue, sample(bRe, width, height, px + 1, py)), width)\n const dy = wrap(py + parabolic(sample(bRe, width, height, px, py - 1), peakValue, sample(bRe, width, height, px, py + 1)), height)\n\n return { dx, dy, peak: peakValue }\n}\n\n/**\n * Sub-pixel offset of a peak, by fitting a parabola through it and its neighbours.\n *\n * The correlation surface is sampled on the pixel grid, but the true offset is\n * not a whole number of pixels. Three samples determine a parabola, and its\n * vertex is a better estimate than the middle sample - typically to about a\n * tenth of a pixel.\n */\nfunction parabolic (left: number, center: number, right: number): number {\n const denominator = left - 2 * center + right\n if (Math.abs(denominator) < 1e-12) return 0\n\n const offset = (0.5 * (left - right)) / denominator\n\n return Math.abs(offset) < 1 ? offset : 0\n}\n\nfunction sample (data: Float64Array, width: number, height: number, x: number, y: number): number {\n const cx = ((x % width) + width) % width\n const cy = ((y % height) + height) % height\n\n return data[cy * width + cx]\n}\n\n/** Map an index in `[0, n)` onto a signed shift in `[-n/2, n/2)`. */\nfunction wrap (value: number, n: number): number {\n return value > n / 2 ? value - n : value\n}\n\nfunction hann (n: number): Float64Array {\n const w = new Float64Array(n)\n if (n === 1) {\n w[0] = 1\n\n return w\n }\n for (let i = 0; i < n; i++) w[i] = 0.5 * (1 - Math.cos((2 * Math.PI * i) / (n - 1)))\n\n return w\n}\n","import { contentExtent, estimateSkew } from '../analysis/content'\nimport type { ContentExtent } from '../analysis/content'\nimport { correlation } from '../analysis/score'\nimport { downscaleGray } from '../image/resize'\nimport { warpGray } from '../image/warp'\nimport { isPlausible, multiply, rebase, similarity, translation } from '../math/matrix'\nimport type { GrayImage, Matrix3 } from '../types'\nimport { phaseCorrelate } from './phaseCorrelation'\n\n/**\n * A first, cheap answer good enough to make the expensive one possible.\n *\n * Descriptor matching has a blind spot: BRIEF compares fixed pixel offsets, so\n * a scan at 300 dpi and a page rendered at 150 describe the same corner with\n * two unrelated bit strings. Something has to establish roughly how big the\n * scan is before the matcher runs, and nothing in the file says.\n *\n * So guess, several ways, and let the pixels judge:\n *\n * - **frame** — assume the scan is the whole page, so the frames correspond.\n * - **content** — assume the *printing* corresponds. Robust to a scan with\n * wider margins, which the frame guess gets badly wrong.\n * - **deskew** — measure each page's own skew, and match the printing in the\n * frame where each sits straight. This is the one that usually wins.\n *\n * Each gets a phase-correlation nudge, then all of them are warped and scored\n * on ink correlation. Guessing several times and measuring is far more robust\n * than one clever guess, and at this resolution each attempt costs very little.\n */\n\nexport interface CoarseOptions {\n /** Longest side of the images the search runs on. */\n workingSize?: number\n /** Largest per-page skew considered, in degrees. */\n maxSkewDeg?: number\n /** Largest scale ratio between the two images that will be entertained. */\n maxScaleRatio?: number\n}\n\nexport interface CoarseResult {\n /** Maps full-resolution original coordinates to full-resolution scan coordinates. */\n matrix: Matrix3\n /** Ink correlation achieved by this transform, in `[-1, 1]`. */\n score: number\n /** Which guess won, for diagnostics. */\n strategy: string\n skew: { original: number, scanned: number }\n}\n\ninterface Candidate {\n strategy: string\n matrix: Matrix3\n}\n\nexport function estimateCoarse (\n originalInk: GrayImage,\n scannedInk: GrayImage,\n options: CoarseOptions = {},\n): CoarseResult {\n const { workingSize = 512, maxSkewDeg = 12, maxScaleRatio = 6 } = options\n\n const original = downscaleGray(originalInk, workingSize)\n const scanned = downscaleGray(scannedInk, workingSize)\n\n const originalSkew = estimateSkew(original.image, { maxAngleDeg: maxSkewDeg })\n const scannedSkew = estimateSkew(scanned.image, { maxAngleDeg: maxSkewDeg })\n\n const originalFlat = contentExtent(original.image, 0)\n const scannedFlat = contentExtent(scanned.image, 0)\n const originalTilted = contentExtent(original.image, originalSkew)\n const scannedTilted = contentExtent(scanned.image, scannedSkew)\n\n const candidates: Candidate[] = []\n\n const frameScale = geometricMean(\n scanned.image.width / original.image.width,\n scanned.image.height / original.image.height,\n )\n push(candidates, 'frame', similarity(\n frameScale,\n 0,\n { x: original.image.width / 2, y: original.image.height / 2 },\n { x: scanned.image.width / 2, y: scanned.image.height / 2 },\n ), maxScaleRatio)\n\n if (originalFlat.density > 0 && scannedFlat.density > 0)\n push(candidates, 'content', fromExtents(originalFlat, scannedFlat, 0), maxScaleRatio)\n\n if (originalTilted.density > 0 && scannedTilted.density > 0)\n push(\n candidates,\n 'deskew',\n fromExtents(originalTilted, scannedTilted, scannedSkew - originalSkew),\n maxScaleRatio,\n )\n\n let bestMatrix: Matrix3 = similarity(\n Number.isFinite(frameScale) ? frameScale : 1,\n 0,\n { x: original.image.width / 2, y: original.image.height / 2 },\n { x: scanned.image.width / 2, y: scanned.image.height / 2 },\n )\n let bestScore = -Infinity\n let bestStrategy = 'fallback'\n\n for (const candidate of candidates) {\n for (const variant of withTranslationPolish(candidate, original.image, scanned.image)) {\n const warped = warpGray(scanned.image, variant.matrix, original.image.width, original.image.height, 0)\n const score = correlation(original.image, warped)\n if (score > bestScore) {\n bestMatrix = variant.matrix\n bestScore = score\n bestStrategy = variant.strategy\n }\n }\n }\n\n return {\n // Measured on two independently shrunk copies; hand back full-resolution pixels.\n matrix: rebase(bestMatrix, original.scale, scanned.scale),\n score: bestScore === -Infinity ? 0 : bestScore,\n strategy: bestStrategy,\n skew: { original: originalSkew, scanned: scannedSkew },\n }\n}\n\n/** The coarse matrix, plus a copy nudged by whatever phase correlation says is left over. */\nfunction withTranslationPolish (\n candidate: Candidate,\n original: GrayImage,\n scanned: GrayImage,\n): Candidate[] {\n const warped = warpGray(scanned, candidate.matrix, original.width, original.height, 0)\n\n let shift: { dx: number, dy: number, peak: number }\n try {\n shift = phaseCorrelate(original, warped)\n } catch {\n return [candidate]\n }\n\n if (!Number.isFinite(shift.dx) || !Number.isFinite(shift.dy)) return [candidate]\n if (Math.abs(shift.dx) < 0.25 && Math.abs(shift.dy) < 0.25) return [candidate]\n\n // `warped` sits in the original's frame, so a residual shift of d means the\n // original at p matches the warp at p + d: sample d further along.\n return [\n candidate,\n {\n strategy: `${candidate.strategy}+phase`,\n matrix: multiply(candidate.matrix, translation(shift.dx, shift.dy)),\n },\n ]\n}\n\nfunction fromExtents (original: ContentExtent, scanned: ContentExtent, angle: number): Matrix3 {\n const scale = geometricMean(scanned.width / original.width, scanned.height / original.height)\n\n return similarity(scale, angle, original.center, scanned.center)\n}\n\nfunction push (into: Candidate[], strategy: string, matrix: Matrix3, maxScaleRatio: number): void {\n if (isPlausible(matrix, maxScaleRatio)) into.push({ strategy, matrix })\n}\n\n/**\n * Geometric rather than arithmetic mean of the two axis ratios.\n *\n * The quantity is a ratio, and the mean of a ratio and its reciprocal should be\n * one. Arithmetic mean says 1.25.\n */\nfunction geometricMean (a: number, b: number): number {\n if (Number.isNaN(a) || Number.isNaN(b) || a <= 0 || b <= 0) return NaN\n\n return Math.sqrt(a * b)\n}\n","/**\n * A seeded PRNG, so that two runs on the same bytes give the same matrix.\n *\n * RANSAC samples at random and the BRIEF pattern is drawn at random; with\n * `Math.random` the library would return a slightly different answer every\n * time, which makes a regression test a coin toss and a production bug\n * impossible to reproduce from the inputs alone. mulberry32 is 32 bits of\n * state and passes the statistical tests that matter at this scale.\n */\nexport function createRandom (seed: number): () => number {\n let state = seed >>> 0\n\n return () => {\n state = (state + 0x6D2B79F5) >>> 0\n let t = state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** Box-Muller, used to draw the BRIEF sampling pattern from a Gaussian around the patch centre. */\nexport function gaussian (random: () => number): number {\n const u = Math.max(random(), Number.EPSILON)\n const v = random()\n\n return Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v)\n}\n","import { boxBlur } from '../image/gray'\nimport { resizeGray } from '../image/resize'\nimport { createRandom, gaussian } from '../math/random'\nimport type { GrayImage } from '../types'\n\n/**\n * FAST corners with steered BRIEF descriptors — an ORB, written out.\n *\n * This is the piece OpenCV would normally hand you, and it is here because the\n * deployment target rules out a native binding. The three parts each answer a\n * separate question:\n *\n * - **FAST** answers *where*. A pixel is a corner when a contiguous arc of the\n * 16 pixels on a circle around it is all clearly brighter, or all clearly\n * darker, than it is. On a page that fires on stroke ends, serifs, and the\n * corners of rules and boxes — landmarks that survive being rescanned.\n * - **The intensity centroid** answers *which way up*. The vector from the\n * patch's centre to its centre of mass is a direction the ink itself defines,\n * so it turns with the page.\n * - **BRIEF** answers *what it looks like*, as 256 yes/no questions of the form\n * \"is this pixel darker than that one?\", asked at positions rotated by that\n * angle. Comparing two of those is one XOR and a bit count, which is why\n * brute-force matching thousands of them is affordable.\n *\n * The descriptor is not scale invariant on its own, hence the pyramid: the same\n * corner is described at several sizes so a scan at a different dpi still\n * matches.\n */\n\nexport interface Keypoint {\n /** Coordinates in the *input* image, pixel centres, regardless of the level found at. */\n x: number\n y: number\n score: number\n /** Dominant ink direction in radians. */\n angle: number\n level: number\n /** Pixel size of the patch described, in input pixels. */\n size: number\n}\n\nexport interface FeatureSet {\n keypoints: Keypoint[]\n /** 8 x 32 bits per keypoint, laid out contiguously. */\n descriptors: Uint32Array\n}\n\nexport interface FeatureOptions {\n maxFeatures?: number\n /** Contrast a circle pixel must clear to count, in `[0, 1]` ink units. */\n fastThreshold?: number\n /** Pyramid levels, including the original. */\n levels?: number\n /** Ratio between consecutive levels. */\n scaleFactor?: number\n /** Side of the described patch, in pixels of its own level. */\n patchSize?: number\n /** Cells per axis used to spread keypoints over the page instead of over its densest paragraph. */\n gridSize?: number\n seed?: number\n}\n\nexport const DESCRIPTOR_WORDS = 8\nconst DESCRIPTOR_BITS = DESCRIPTOR_WORDS * 32\n/** Rotation bins for the steered pattern. 32 bins is 11.25 degrees, finer than ORB's own 12. */\nconst ANGLE_BINS = 32\n\n/** The Bresenham circle of radius 3, clockwise from the top. */\nconst CIRCLE: readonly [number, number][] = [\n [0, -3], [1, -3], [2, -2], [3, -1], [3, 0], [3, 1], [2, 2], [1, 3],\n [0, 3], [-1, 3], [-2, 2], [-3, 1], [-3, 0], [-3, -1], [-2, -2], [-1, -3],\n]\nconst ARC = 9\nconst COMPASS_MINIMUM = Math.floor((ARC - 1) / 4)\n\nexport function detectAndDescribe (image: GrayImage, options: FeatureOptions = {}): FeatureSet {\n const {\n maxFeatures = 1200,\n fastThreshold = 0.08,\n levels = 3,\n scaleFactor = 1.3,\n patchSize = 31,\n gridSize = 8,\n seed = 0xB81EF,\n } = options\n\n const patterns = steeredPatterns(patchSize, seed)\n const halfPatch = (patchSize - 1) / 2\n const border = Math.ceil(halfPatch * Math.SQRT2) + 2\n\n const keypoints: Keypoint[] = []\n const descriptorChunks: Uint32Array[] = []\n const perLevel = Math.ceil(maxFeatures / levels)\n\n for (let level = 0; level < levels; level++) {\n const levelScale = scaleFactor ** level\n const width = Math.round(image.width / levelScale)\n const height = Math.round(image.height / levelScale)\n if (width < border * 2 + 8 || height < border * 2 + 8) break\n\n const levelImage = level === 0 ? image : resizeGray(image, width, height)\n // BRIEF compares single pixels, so it is exquisitely sensitive to noise;\n // the smoothing is part of the descriptor, not a preprocessing nicety.\n const smoothed = boxBlur(levelImage, 2)\n\n const found = detectFast(levelImage, fastThreshold, border)\n const kept = distribute(found, width, height, gridSize, perLevel)\n\n for (const corner of kept) {\n const angle = orientation(levelImage, corner.x, corner.y, halfPatch)\n const bin = angleBin(angle)\n const descriptor = describe(smoothed, corner.x, corner.y, patterns[bin])\n if (descriptor === null) continue\n\n descriptorChunks.push(descriptor)\n keypoints.push({\n x: (corner.x + 0.5) * levelScale,\n y: (corner.y + 0.5) * levelScale,\n score: corner.score,\n angle,\n level,\n size: patchSize * levelScale,\n })\n }\n }\n\n const descriptors = new Uint32Array(descriptorChunks.length * DESCRIPTOR_WORDS)\n for (const [i, chunk] of descriptorChunks.entries()) descriptors.set(chunk, i * DESCRIPTOR_WORDS)\n\n return { keypoints, descriptors }\n}\n\ninterface Corner {\n x: number\n y: number\n score: number\n}\n\n/** FAST-9 with a 3x3 non-maximum suppression pass over the corner scores. */\nexport function detectFast (image: GrayImage, threshold: number, border: number): Corner[] {\n const { width, height, data } = image\n const scores = new Float32Array(width * height)\n const ring = new Float64Array(16)\n\n for (let y = border; y < height - border; y++) {\n for (let x = border; x < width - border; x++) {\n const center = data[y * width + x]\n const high = center + threshold\n const low = center - threshold\n\n // Cheap rejection on the four compass points, which sit 4 apart on the\n // ring. Any run of ARC consecutive pixels must contain at least\n // floor((ARC - 1) / 4) of them, so fewer than that cannot be a corner.\n // For ARC = 9 that bound is 2, not the 3 that the widely quoted FAST-12\n // version of this test uses - requiring 3 here silently discards real\n // corners, among them the corner of a plain filled rectangle.\n let bright = 0\n let dark = 0\n for (const k of [0, 4, 8, 12]) {\n const value = data[(y + CIRCLE[k][1]) * width + x + CIRCLE[k][0]]\n if (value > high) bright++\n else if (value < low) dark++\n }\n if (bright < COMPASS_MINIMUM && dark < COMPASS_MINIMUM) continue\n\n for (let k = 0; k < 16; k++) ring[k] = data[(y + CIRCLE[k][1]) * width + x + CIRCLE[k][0]]\n if (!hasArc(ring, high, low)) continue\n\n let brightSum = 0\n let darkSum = 0\n for (let k = 0; k < 16; k++) {\n if (ring[k] > high) brightSum += ring[k] - high\n else if (ring[k] < low) darkSum += low - ring[k]\n }\n scores[y * width + x] = Math.max(brightSum, darkSum)\n }\n }\n\n const corners: Corner[] = []\n for (let y = border; y < height - border; y++) {\n for (let x = border; x < width - border; x++) {\n const score = scores[y * width + x]\n if (score <= 0) continue\n\n let isPeak = true\n for (let dy = -1; isPeak && dy <= 1; dy++)\n for (let dx = -1; dx <= 1; dx++) {\n if (dx === 0 && dy === 0) continue\n\n if (scores[(y + dy) * width + x + dx] > score) {\n isPeak = false\n break\n }\n }\n\n if (isPeak) corners.push({ x, y, score })\n }\n }\n\n return corners\n}\n\n/** True when 9 consecutive ring pixels (wrapping) are all above `high` or all below `low`. */\nfunction hasArc (ring: Float64Array, high: number, low: number): boolean {\n let runBright = 0\n let runDark = 0\n\n for (let k = 0; k < 16 + ARC - 1; k++) {\n const value = ring[k % 16]\n runBright = value > high ? runBright + 1 : 0\n runDark = value < low ? runDark + 1 : 0\n if (runBright >= ARC || runDark >= ARC) return true\n }\n\n return false\n}\n\n/**\n * Keep the strongest corners, but spread over the page.\n *\n * Score alone concentrates every keypoint in the densest block of text, and a\n * transform fitted to correspondences from one corner of the page extrapolates\n * badly to the other three. Filling a grid first, then topping up from what is\n * left, buys coverage without throwing away the best corners.\n */\nfunction distribute (\n corners: Corner[],\n width: number,\n height: number,\n gridSize: number,\n budget: number,\n): Corner[] {\n if (corners.length <= budget) return corners\n\n const cells = new Map<number, Corner[]>()\n const cellWidth = width / gridSize\n const cellHeight = height / gridSize\n\n for (const corner of corners) {\n const cx = Math.min(gridSize - 1, Math.floor(corner.x / cellWidth))\n const cy = Math.min(gridSize - 1, Math.floor(corner.y / cellHeight))\n const key = cy * gridSize + cx\n const bucket = cells.get(key)\n if (bucket === undefined) cells.set(key, [corner])\n else bucket.push(corner)\n }\n\n const perCell = Math.max(1, Math.floor(budget / Math.max(1, cells.size)))\n const kept: Corner[] = []\n const leftovers: Corner[] = []\n\n for (const bucket of cells.values()) {\n bucket.sort((a, b) => b.score - a.score)\n kept.push(...bucket.slice(0, perCell))\n leftovers.push(...bucket.slice(perCell))\n }\n\n if (kept.length < budget) {\n leftovers.sort((a, b) => b.score - a.score)\n kept.push(...leftovers.slice(0, budget - kept.length))\n }\n\n // With more cells than budget the floor above rounds to one per cell, which\n // can overshoot; the budget is a promise, so trim by score.\n if (kept.length > budget) {\n kept.sort((a, b) => b.score - a.score)\n\n return kept.slice(0, budget)\n }\n\n return kept\n}\n\n/**\n * Angle from the patch centre to its centre of intensity mass.\n *\n * On an ink image the mass is the writing, so the angle turns with the page —\n * which is the entire trick that makes a binary descriptor rotation invariant.\n */\nexport function orientation (image: GrayImage, cx: number, cy: number, radius: number): number {\n const { width, height, data } = image\n const r = Math.floor(radius)\n let m10 = 0\n let m01 = 0\n\n for (let dy = -r; dy <= r; dy++) {\n const y = cy + dy\n if (y < 0 || y >= height) continue\n const span = Math.floor(Math.sqrt(r * r - dy * dy))\n const row = y * width\n for (let dx = -span; dx <= span; dx++) {\n const x = cx + dx\n if (x < 0 || x >= width) continue\n const value = data[row + x]\n m10 += dx * value\n m01 += dy * value\n }\n }\n\n return Math.atan2(m01, m10)\n}\n\nfunction angleBin (angle: number): number {\n const twoPi = Math.PI * 2\n const normalized = ((angle % twoPi) + twoPi) % twoPi\n\n return Math.floor((normalized / twoPi) * ANGLE_BINS) % ANGLE_BINS\n}\n\nfunction describe (image: GrayImage, cx: number, cy: number, pattern: Int32Array): Uint32Array | null {\n const { width, height, data } = image\n const out = new Uint32Array(DESCRIPTOR_WORDS)\n\n for (let bit = 0; bit < DESCRIPTOR_BITS; bit++) {\n const base = bit * 4\n const x1 = cx + pattern[base]\n const y1 = cy + pattern[base + 1]\n const x2 = cx + pattern[base + 2]\n const y2 = cy + pattern[base + 3]\n\n if (x1 < 0 || y1 < 0 || x2 < 0 || y2 < 0 || x1 >= width || y1 >= height || x2 >= width || y2 >= height)\n return null\n\n if (data[y1 * width + x1] < data[y2 * width + x2])\n out[bit >> 5] |= 1 << (bit & 31)\n }\n\n return out\n}\n\nconst patternCache = new Map<string, Int32Array[]>()\n\n/**\n * One integer sampling pattern per rotation bin, built once and cached.\n *\n * Rotating 256 point pairs per keypoint would mean a thousand trig calls each;\n * quantising the angle instead turns the whole thing into a table lookup, at a\n * cost of at most half a bin of angular error.\n */\nfunction steeredPatterns (patchSize: number, seed: number): Int32Array[] {\n const key = `${patchSize}:${seed}`\n const cached = patternCache.get(key)\n if (cached !== undefined) return cached\n\n const half = (patchSize - 1) / 2\n const sigma = patchSize / 5\n const random = createRandom(seed)\n const base = new Float64Array(DESCRIPTOR_BITS * 4)\n\n for (let i = 0; i < DESCRIPTOR_BITS * 4; i++)\n base[i] = clamp(Math.round(gaussian(random) * sigma), -half, half)\n\n const patterns: Int32Array[] = []\n for (let bin = 0; bin < ANGLE_BINS; bin++) {\n const angle = (bin / ANGLE_BINS) * Math.PI * 2\n const cos = Math.cos(angle)\n const sin = Math.sin(angle)\n const rotated = new Int32Array(DESCRIPTOR_BITS * 4)\n\n for (let i = 0; i < DESCRIPTOR_BITS * 4; i += 2) {\n const x = base[i]\n const y = base[i + 1]\n rotated[i] = Math.round(cos * x - sin * y)\n rotated[i + 1] = Math.round(sin * x + cos * y)\n }\n patterns.push(rotated)\n }\n\n patternCache.set(key, patterns)\n\n return patterns\n}\n\nfunction clamp (value: number, min: number, max: number): number {\n return value < min ? min : (Math.min(value, max))\n}\n","import type { PointMatch } from '../types'\nimport type { FeatureSet } from './features'\nimport { DESCRIPTOR_WORDS } from './features'\n\n/**\n * Brute-force descriptor matching.\n *\n * Brute force is the right algorithm here, not a concession. A page yields\n * around a thousand keypoints per side; a million 256-bit comparisons is eight\n * million XOR-and-popcount operations, which is milliseconds. Building an index\n * to avoid that would cost more than it saves and would only return\n * approximate neighbours.\n *\n * The filters matter more than the search does:\n *\n * - **Ratio test.** Keep a match only when the best candidate is clearly better\n * than the runner-up. On a page of repeated letterforms the nearest neighbour\n * is often meaningless, and the giveaway is that the second nearest is just\n * as close.\n * - **Cross-check.** Both sides must name each other. One-directional bests are\n * not symmetric, and the asymmetric ones are usually wrong.\n * - **Displacement gate.** The images are already roughly aligned when this\n * runs, so a correspondence that jumps half the page is not a correspondence.\n */\n\nexport interface MatchOptions {\n /** Lowe's ratio. Lower is stricter. */\n ratio?: number\n /** Reject matches further apart than this many bits out of 256. */\n maxDistance?: number\n /** Require both descriptors to pick each other. */\n crossCheck?: boolean\n /** Reject correspondences that move further than this, in pixels. `Infinity` disables the gate. */\n maxDisplacement?: number\n}\n\n/**\n * \"No candidate yet\", as a value an Int32Array can actually hold.\n *\n * `Number.MAX_SAFE_INTEGER` cannot: writing it to an Int32Array truncates it to\n * -1, and every subsequent \"is this closer?\" comparison then answers no.\n */\nconst UNSET = 0x7FFFFFFF\n\nexport function matchFeatures (\n source: FeatureSet,\n target: FeatureSet,\n options: MatchOptions = {},\n): PointMatch[] {\n const {\n ratio = 0.8,\n maxDistance = 96,\n crossCheck = true,\n maxDisplacement = Infinity,\n } = options\n\n const n = source.keypoints.length\n const m = target.keypoints.length\n if (n === 0 || m === 0) return []\n\n const bestForSource = new Int32Array(n).fill(-1)\n const bestDistance = new Int32Array(n).fill(UNSET)\n const secondDistance = new Int32Array(n).fill(UNSET)\n const bestForTarget = new Int32Array(m).fill(-1)\n const bestTargetDistance = new Int32Array(m).fill(UNSET)\n\n const gated = Number.isFinite(maxDisplacement)\n const gate = maxDisplacement * maxDisplacement\n\n for (let i = 0; i < n; i++) {\n const a = source.keypoints[i]\n const offsetA = i * DESCRIPTOR_WORDS\n let first = UNSET\n let second = UNSET\n let firstIndex = -1\n\n for (let j = 0; j < m; j++) {\n const b = target.keypoints[j]\n if (gated) {\n const dx = a.x - b.x\n const dy = a.y - b.y\n if (dx * dx + dy * dy > gate) continue\n }\n\n const distance = hamming(source.descriptors, offsetA, target.descriptors, j * DESCRIPTOR_WORDS)\n\n if (distance < first) {\n second = first\n first = distance\n firstIndex = j\n } else if (distance < second) {\n second = distance\n }\n\n if (distance < bestTargetDistance[j]) {\n bestTargetDistance[j] = distance\n bestForTarget[j] = i\n }\n }\n\n bestForSource[i] = firstIndex\n bestDistance[i] = first\n secondDistance[i] = second\n }\n\n const matches: PointMatch[] = []\n for (let i = 0; i < n; i++) {\n const j = bestForSource[i]\n if (j < 0) continue\n if (bestDistance[i] > maxDistance) continue\n if (secondDistance[i] !== UNSET && bestDistance[i] > ratio * secondDistance[i]) continue\n if (crossCheck && bestForTarget[j] !== i) continue\n\n const a = source.keypoints[i]\n const b = target.keypoints[j]\n matches.push({\n source: { x: a.x, y: a.y },\n target: { x: b.x, y: b.y },\n distance: bestDistance[i],\n })\n }\n\n return matches\n}\n\n/** Hamming distance between two 256-bit descriptors. */\nexport function hamming (a: Uint32Array, offsetA: number, b: Uint32Array, offsetB: number): number {\n let total = 0\n for (let k = 0; k < DESCRIPTOR_WORDS; k++) total += popcount(a[offsetA + k] ^ b[offsetB + k])\n\n return total\n}\n\n/** SWAR bit count: pair off, then nibble off, then one multiply to sum the bytes. */\nexport function popcount (value: number): number {\n let v = value - ((value >> 1) & 0x55555555)\n v = (v & 0x33333333) + ((v >> 2) & 0x33333333)\n v = (v + (v >> 4)) & 0x0F0F0F0F\n\n return (Math.imul(v, 0x01010101) >> 24) & 0xFF\n}\n","/**\n * The two dense solvers the estimators need, and nothing more.\n *\n * Both work on plain row-major `Float64Array`s of a fixed, tiny size (n <= 9),\n * so there is no pivoting strategy worth agonising over and no allocation\n * pressure worth caring about.\n */\n\n/**\n * Solve `A x = b` by Gaussian elimination with partial pivoting.\n *\n * `a` is destroyed. Returns `null` when the system is singular, which for the\n * affine fit means the sample points were collinear — a real, common case, not\n * an exceptional one, so it is a return value rather than a throw.\n */\nexport function solve (a: Float64Array, b: Float64Array, n: number): Float64Array | null {\n const m = Float64Array.from(a)\n const x = Float64Array.from(b)\n\n for (let col = 0; col < n; col++) {\n let pivot = col\n let best = Math.abs(m[col * n + col])\n for (let row = col + 1; row < n; row++) {\n const v = Math.abs(m[row * n + col])\n if (v > best) {\n best = v\n pivot = row\n }\n }\n if (best < 1e-12) return null\n\n if (pivot !== col) {\n for (let k = 0; k < n; k++) {\n const t = m[col * n + k]\n m[col * n + k] = m[pivot * n + k]\n m[pivot * n + k] = t\n }\n const t = x[col]\n x[col] = x[pivot]\n x[pivot] = t\n }\n\n const diag = m[col * n + col]\n for (let row = col + 1; row < n; row++) {\n const factor = m[row * n + col] / diag\n if (factor === 0) continue\n for (let k = col; k < n; k++) m[row * n + k] -= factor * m[col * n + k]\n x[row] -= factor * x[col]\n }\n }\n\n for (let row = n - 1; row >= 0; row--) {\n let sum = x[row]\n for (let k = row + 1; k < n; k++) sum -= m[row * n + k] * x[k]\n x[row] = sum / m[row * n + row]\n }\n\n return x\n}\n\n/**\n * Eigen-decompose a symmetric matrix with the cyclic Jacobi method.\n *\n * Jacobi is the right tool at this size: it is a dozen lines, it is\n * unconditionally stable for symmetric input, and it gives eigenvectors for\n * free. The homography fit needs the eigenvector of `A^T A` belonging to the\n * smallest eigenvalue — the direction the data constrains least, which is the\n * null-space direction we are after.\n *\n * @param input Row-major, `n * n`, symmetric. Not modified.\n * @returns `values[i]` paired with column `i` of `vectors` (`vectors[row * n + i]`).\n */\nexport function jacobiEigen (\n input: Float64Array,\n n: number,\n maxSweeps = 60,\n): { values: Float64Array, vectors: Float64Array } {\n const a = Float64Array.from(input)\n const v = new Float64Array(n * n)\n for (let i = 0; i < n; i++) v[i * n + i] = 1\n\n for (let sweep = 0; sweep < maxSweeps; sweep++) {\n let off = 0\n for (let p = 0; p < n; p++)\n for (let q = p + 1; q < n; q++) off += a[p * n + q] * a[p * n + q]\n\n if (off < 1e-24) break\n\n for (let p = 0; p < n; p++) {\n for (let q = p + 1; q < n; q++) {\n const apq = a[p * n + q]\n if (Math.abs(apq) < 1e-18) continue\n\n const theta = (a[q * n + q] - a[p * n + p]) / (2 * apq)\n const t = Math.sign(theta || 1) / (Math.abs(theta) + Math.sqrt(theta * theta + 1))\n const c = 1 / Math.sqrt(t * t + 1)\n const s = t * c\n\n for (let k = 0; k < n; k++) {\n const akp = a[k * n + p]\n const akq = a[k * n + q]\n a[k * n + p] = c * akp - s * akq\n a[k * n + q] = s * akp + c * akq\n }\n for (let k = 0; k < n; k++) {\n const apk = a[p * n + k]\n const aqk = a[q * n + k]\n a[p * n + k] = c * apk - s * aqk\n a[q * n + k] = s * apk + c * aqk\n }\n for (let k = 0; k < n; k++) {\n const vkp = v[k * n + p]\n const vkq = v[k * n + q]\n v[k * n + p] = c * vkp - s * vkq\n v[k * n + q] = s * vkp + c * vkq\n }\n }\n }\n }\n\n const values = new Float64Array(n)\n for (let i = 0; i < n; i++) values[i] = a[i * n + i]\n\n return { values, vectors: v }\n}\n\n/** The unit eigenvector of a symmetric `n x n` matrix belonging to its smallest eigenvalue. */\nexport function smallestEigenvector (input: Float64Array, n: number): Float64Array {\n const { values, vectors } = jacobiEigen(input, n)\n\n let best = 0\n for (let i = 1; i < n; i++) if (values[i] < values[best]) best = i\n\n const out = new Float64Array(n)\n let norm = 0\n for (let row = 0; row < n; row++) {\n out[row] = vectors[row * n + best]\n norm += out[row] * out[row]\n }\n norm = Math.sqrt(norm)\n if (norm > 0) for (let row = 0; row < n; row++) out[row] /= norm\n\n return out\n}\n","import { smallestEigenvector, solve } from '../math/linalg'\nimport { invert, multiply } from '../math/matrix'\nimport type { Matrix3, PointMatch, TransformModel } from '../types'\n\n/**\n * Fitting a transform to a set of correspondences.\n *\n * Three models, and the choice between them is a bet about what the scan went\n * through. A flatbed scanner moves the page in one plane, so a **similarity**\n * (turn it, resize it, slide it) is the whole story and its four parameters\n * are pinned down by very few points — which is exactly what you want when\n * most of your matches are wrong. A sheet-fed scanner can stretch one axis;\n * that needs **affine**. A photograph taken at an angle needs the full\n * **homography**, and pays for those eight parameters by being far easier to\n * fit to nonsense.\n *\n * Prefer the simplest model the physical situation allows.\n */\n\n/** Correspondences the fitters consume. `distance` is ignored here. */\nexport type Correspondence = Pick<PointMatch, 'source' | 'target'>\n\n/** How many correspondences the model needs before it is determined at all. */\nexport function minimumSamples (model: TransformModel): number {\n switch (model) {\n case 'similarity': { return 2\n }\n case 'affine': { return 3\n }\n case 'homography': { return 4\n }\n }\n}\n\nexport function fitModel (\n model: TransformModel,\n matches: readonly Correspondence[],\n indices?: readonly number[],\n): Matrix3 | null {\n switch (model) {\n case 'similarity': { return fitSimilarity(matches, indices)\n }\n case 'affine': { return fitAffine(matches, indices)\n }\n case 'homography': { return fitHomography(matches, indices)\n }\n }\n}\n\n/**\n * Least-squares similarity, in closed form.\n *\n * No iteration and no matrix inverse: centre both point sets, and the rotation\n * and scale fall out of two dot products. That closed form is why similarity\n * survives a RANSAC sample that affine would choke on.\n */\nexport function fitSimilarity (\n matches: readonly Correspondence[],\n indices?: readonly number[],\n): Matrix3 | null {\n const picked = select(matches, indices)\n if (picked.length < 2) return null\n\n let sx = 0\n let sy = 0\n let tx = 0\n let ty = 0\n for (const m of picked) {\n sx += m.source.x\n sy += m.source.y\n tx += m.target.x\n ty += m.target.y\n }\n const n = picked.length\n sx /= n\n sy /= n\n tx /= n\n ty /= n\n\n let dot = 0\n let cross = 0\n let norm = 0\n for (const m of picked) {\n const px = m.source.x - sx\n const py = m.source.y - sy\n const qx = m.target.x - tx\n const qy = m.target.y - ty\n dot += px * qx + py * qy\n cross += px * qy - py * qx\n norm += px * px + py * py\n }\n\n if (norm < 1e-12) return null\n\n const a = dot / norm\n const b = cross / norm\n if (Math.hypot(a, b) < 1e-9) return null\n\n return [\n a, -b, tx - a * sx + b * sy,\n b, a, ty - b * sx - a * sy,\n 0, 0, 1,\n ]\n}\n\n/** Least-squares affine: two independent 3x3 normal systems sharing one matrix. */\nexport function fitAffine (\n matches: readonly Correspondence[],\n indices?: readonly number[],\n): Matrix3 | null {\n const picked = select(matches, indices)\n if (picked.length < 3) return null\n\n const m = new Float64Array(9)\n const bx = new Float64Array(3)\n const by = new Float64Array(3)\n\n for (const match of picked) {\n const { x, y } = match.source\n const { x: u, y: v } = match.target\n\n m[0] += x * x\n m[1] += x * y\n m[2] += x\n m[4] += y * y\n m[5] += y\n m[8] += 1\n\n bx[0] += x * u\n bx[1] += y * u\n bx[2] += u\n by[0] += x * v\n by[1] += y * v\n by[2] += v\n }\n m[3] = m[1]\n m[6] = m[2]\n m[7] = m[5]\n\n const row0 = solve(m, bx, 3)\n const row1 = solve(m, by, 3)\n if (row0 === null || row1 === null) return null\n\n return [row0[0], row0[1], row0[2], row1[0], row1[1], row1[2], 0, 0, 1]\n}\n\n/**\n * Direct Linear Transform with Hartley normalisation.\n *\n * The normalisation is not optional polish. Raw pixel coordinates put entries\n * like `x * u` (order 10^6) next to a constant 1 in the same row, and the\n * eigen solve then answers a question dominated by the big column. Centring\n * each point set and scaling it to a mean radius of `sqrt(2)` puts every\n * column on the same footing; the result is mapped back afterwards.\n */\nexport function fitHomography (\n matches: readonly Correspondence[],\n indices?: readonly number[],\n): Matrix3 | null {\n const picked = select(matches, indices)\n if (picked.length < 4) return null\n\n const sourceNorm = normalizer(picked.map(m => m.source))\n const targetNorm = normalizer(picked.map(m => m.target))\n if (sourceNorm === null || targetNorm === null) return null\n\n // Accumulate A^T A directly: 9x9 regardless of how many points there are.\n const ata = new Float64Array(81)\n const row = new Float64Array(9)\n\n for (const match of picked) {\n const p = apply(sourceNorm, match.source.x, match.source.y)\n const q = apply(targetNorm, match.target.x, match.target.y)\n\n row.set([-p.x, -p.y, -1, 0, 0, 0, q.x * p.x, q.x * p.y, q.x])\n accumulate(ata, row)\n row.set([0, 0, 0, -p.x, -p.y, -1, q.y * p.x, q.y * p.y, q.y])\n accumulate(ata, row)\n }\n\n const h = smallestEigenvector(ata, 9)\n const normalized: Matrix3 = [h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7], h[8]]\n\n let denormalized: Matrix3\n try {\n denormalized = multiply(invert(targetNorm), multiply(normalized, sourceNorm))\n } catch {\n return null\n }\n\n const scale = denormalized[8]\n if (!Number.isFinite(scale) || Math.abs(scale) < 1e-12) return null\n\n return denormalized.map(v => v / scale) as unknown as Matrix3\n}\n\nfunction accumulate (ata: Float64Array, row: Float64Array): void {\n for (let i = 0; i < 9; i++) {\n const vi = row[i]\n if (vi === 0) continue\n for (let j = 0; j < 9; j++) ata[i * 9 + j] += vi * row[j]\n }\n}\n\n/** Translate to the centroid and scale so the mean distance from it is `sqrt(2)`. */\nfunction normalizer (points: readonly { x: number, y: number }[]): Matrix3 | null {\n let cx = 0\n let cy = 0\n for (const p of points) {\n cx += p.x\n cy += p.y\n }\n cx /= points.length\n cy /= points.length\n\n let distance = 0\n for (const p of points) distance += Math.hypot(p.x - cx, p.y - cy)\n distance /= points.length\n\n // Explicit about NaN: a degenerate point set must fail, not divide.\n if (Number.isNaN(distance) || distance <= 1e-9) return null\n\n const s = Math.SQRT2 / distance\n\n return [s, 0, -s * cx, 0, s, -s * cy, 0, 0, 1]\n}\n\nfunction apply (m: Matrix3, x: number, y: number): { x: number, y: number } {\n return { x: m[0] * x + m[1] * y + m[2], y: m[3] * x + m[4] * y + m[5] }\n}\n\nfunction select (\n matches: readonly Correspondence[],\n indices?: readonly number[],\n): readonly Correspondence[] {\n return indices === undefined ? matches : indices.map(i => matches[i])\n}\n","import { isPlausible, reprojectionError } from '../math/matrix'\nimport { createRandom } from '../math/random'\nimport type { Matrix3, TransformModel } from '../types'\nimport type { Correspondence } from './models'\nimport { fitModel, minimumSamples } from './models'\n\n/**\n * RANSAC: fit the model that the largest number of correspondences agree with.\n *\n * Feature matching on a document produces a lot of confident nonsense, because\n * the page is full of things that genuinely look identical — every lowercase\n * \"e\", every corner of every table cell. Least squares over all of them is\n * dragged wherever the wrong ones point. RANSAC ignores the average: it draws\n * the smallest sample that determines a transform, counts how many of the rest\n * that transform explains, and repeats. A wrong sample agrees with almost\n * nothing; the right one agrees with everything real on the page.\n */\n\nexport interface RansacOptions {\n model: TransformModel\n /** A correspondence is an inlier when it reprojects within this many pixels. */\n threshold: number\n maxIterations?: number\n /** Probability of having drawn at least one all-inlier sample. Drives early exit. */\n confidence?: number\n /** Below this many inliers the answer is rejected outright. */\n minInliers?: number\n seed?: number\n}\n\nexport interface RansacResult {\n matrix: Matrix3\n /** Indices into the input array. */\n inliers: number[]\n inlierRatio: number\n iterations: number\n /** Mean reprojection error over the inliers, in pixels. */\n error: number\n}\n\nexport function ransac (\n matches: readonly Correspondence[],\n options: RansacOptions,\n): RansacResult | null {\n const {\n model,\n threshold,\n maxIterations = 2000,\n confidence = 0.995,\n seed = 0x5CA7F1,\n } = options\n\n const sampleSize = minimumSamples(model)\n const minInliers = options.minInliers ?? Math.max(sampleSize + 2, Math.ceil(matches.length * 0.08))\n if (matches.length < Math.max(sampleSize, minInliers)) return null\n\n const random = createRandom(seed)\n const sample: number[] = Array.from({ length: sampleSize }, () => 0)\n\n let bestInliers: number[] = []\n let bestMatrix: Matrix3 | null = null\n let limit = maxIterations\n let iterations = 0\n\n for (; iterations < limit && iterations < maxIterations; iterations++) {\n drawSample(sample, matches.length, random)\n const candidate = fitModel(model, matches, sample)\n if (candidate === null || !isPlausible(candidate)) continue\n\n const inliers = findInliers(matches, candidate, threshold)\n if (inliers.length <= bestInliers.length) continue\n\n bestInliers = inliers\n bestMatrix = candidate\n\n // Adaptive stopping: once a large fraction agrees, the chance that more\n // draws find something better collapses, and so does the budget.\n const ratio = inliers.length / matches.length\n if (ratio > 0 && ratio < 1) {\n const denominator = Math.log(1 - ratio ** sampleSize)\n if (denominator < 0) limit = Math.min(maxIterations, Math.ceil(Math.log(1 - confidence) / denominator) + 1)\n } else if (ratio >= 1) {\n limit = iterations + 1\n }\n }\n\n if (bestMatrix === null || bestInliers.length < minInliers) return null\n\n // Re-fit on every inlier. The minimal sample only ever located the consensus;\n // the accurate transform comes from all of it.\n let refined = fitModel(model, matches, bestInliers)\n if (refined !== null && isPlausible(refined)) {\n const refinedInliers = findInliers(matches, refined, threshold)\n if (refinedInliers.length >= bestInliers.length) bestInliers = refinedInliers\n else refined = bestMatrix\n } else {\n refined = bestMatrix\n }\n\n const matrix = refined ?? bestMatrix\n let total = 0\n for (const i of bestInliers) total += reprojectionError(matrix, matches[i].source, matches[i].target)\n\n return {\n matrix,\n inliers: bestInliers,\n inlierRatio: bestInliers.length / matches.length,\n iterations,\n error: bestInliers.length > 0 ? total / bestInliers.length : Infinity,\n }\n}\n\nexport function findInliers (\n matches: readonly Correspondence[],\n matrix: Matrix3,\n threshold: number,\n): number[] {\n const inliers: number[] = []\n for (const [i, match] of matches.entries())\n if (reprojectionError(matrix, match.source, match.target) <= threshold) inliers.push(i)\n\n return inliers\n}\n\n/** Distinct indices, drawn without replacement. */\nfunction drawSample (into: number[], count: number, random: () => number): void {\n for (let i = 0; i < into.length; i++) {\n let candidate = 0\n for (let attempt = 0; attempt < 32; attempt++) {\n candidate = Math.min(count - 1, Math.floor(random() * count))\n let duplicate = false\n for (let j = 0; j < i; j++)\n if (into[j] === candidate) {\n duplicate = true\n break\n }\n if (!duplicate) break\n }\n into[i] = candidate\n }\n}\n","import { correlation, intersectionOverUnion } from './analysis/score'\nimport type { ImageFormat } from './image/codec'\nimport { decodeImage, encodeImage } from './image/codec'\nimport type { InkOptions } from './image/gray'\nimport { binarize, inkMap, toGrayscale } from './image/gray'\nimport { downscaleGray } from './image/resize'\nimport type { Interpolation } from './image/warp'\nimport { warpGray, warpRaster } from './image/warp'\nimport { conjugateScale, decompose, invert, multiply, rebase, translation } from './math/matrix'\nimport type { CoarseResult } from './estimate/coarse'\nimport { estimateCoarse } from './estimate/coarse'\nimport { detectAndDescribe } from './estimate/features'\nimport { matchFeatures } from './estimate/match'\nimport { phaseCorrelate } from './estimate/phaseCorrelation'\nimport { ransac } from './estimate/ransac'\nimport type { GrayImage, ImageInput, Matrix3, Raster, TransformModel, TransformSummary } from './types'\n\n/**\n * Align a scan onto the page it was made from.\n *\n * ## What this is for\n *\n * Two questions about a returned form are easy to answer once the scan sits\n * exactly on top of the original, and near-impossible before:\n *\n * 1. *Was anything in the printed text changed?* Run OCR on both and diff.\n * That only works if the two are the same page at the same size, otherwise\n * the OCR engine's own layout analysis is comparing different documents.\n * 2. *Was the box at (x, y) signed?* That is a question about a fixed\n * rectangle, and a fixed rectangle only means something once both images\n * agree on where (x, y) is. See `compareRegions`.\n *\n * ## The pipeline\n *\n * ```text\n * decode ─► ink ─► coarse guess ─► rough warp ─► features ─► RANSAC ─► warp\n * (scale/skew) (ORB) (model)\n * ```\n *\n * The coarse guess exists to make the feature stage possible at all: binary\n * descriptors compare fixed pixel offsets, so they only match between images\n * at comparable scale, and nothing in a JPEG tells you what dpi it was scanned\n * at. Once the scan has been resampled to roughly the right size, matching is\n * easy and RANSAC can throw away the inevitable wrong matches — a page of text\n * is full of genuinely identical-looking corners.\n *\n * If the feature stage comes up short (a nearly blank form has few corners to\n * find), the coarse estimate is returned on its own, and `method` says so.\n *\n * ## Why it is synchronous\n *\n * All of it is CPU-bound with no I/O to wait on. An `async` signature would\n * suggest the event loop is free during the call, and it is not. To align\n * several pages at once, put this in a worker thread.\n */\n\nexport interface AlignOptions {\n /**\n * Transform family to fit.\n *\n * `similarity` (the default) covers a flatbed or sheet-fed scan: the page is\n * flat, so it can only be turned, resized and moved. Use `affine` when one\n * axis is stretched, and `homography` for photographs taken off-axis, where\n * the far edge of the page is genuinely smaller than the near one.\n */\n model?: TransformModel\n /** Longest side used for feature detection. Bigger is more precise and quadratically slower. */\n workingSize?: number\n /** Longest side used for the coarse guess. */\n coarseSize?: number\n maxFeatures?: number\n /** Inlier radius for RANSAC, in working-resolution pixels. */\n ransacThreshold?: number\n /** Fewer surviving correspondences than this and the feature stage is not trusted. */\n minInliers?: number\n /** Largest per-page skew the coarse stage considers, in degrees. */\n maxSkewDeg?: number\n /** Cap on how much bigger or smaller the scan may be than the original. */\n maxScaleRatio?: number\n /** How far a correspondence may move, as a fraction of the page diagonal, after the coarse warp. */\n maxDisplacementRatio?: number\n /** Background/ink separation. The defaults suit printed pages on white. */\n ink?: InkOptions\n interpolation?: Interpolation\n /** RGBA fill where the scan does not cover the original's canvas. */\n background?: [number, number, number, number]\n /** Encoding of `result.image`. `'none'` skips encoding, which is most of the cost on a big page. */\n output?: ImageFormat | 'none'\n /** JPEG quality when `output` is `'jpeg'`. */\n quality?: number\n /** Seeds RANSAC and the descriptor pattern, so the same input gives the same matrix. */\n seed?: number\n}\n\nexport interface AlignDiagnostics {\n coarseScore: number\n coarseStrategy: string\n /** Each page's own skew, in degrees, as measured independently. */\n skewDeg: { original: number, scanned: number }\n features: { original: number, scanned: number }\n matches: number\n inliers: number\n inlierRatio: number\n /** Mean RANSAC reprojection error over the inliers, in working-resolution pixels. */\n reprojectionError: number\n /** Ink correlation after alignment, in `[-1, 1]`. */\n correlation: number\n /** Ink mask overlap after alignment, in `[0, 1]`. */\n intersectionOverUnion: number\n /** Milliseconds spent, end to end. */\n durationMs: number\n}\n\nexport interface AlignResult {\n /** The scan resampled onto the original's canvas, same width and height as the original. */\n raster: Raster\n /** `raster` encoded per `options.output`, or `null` when that was `'none'`. */\n image: Uint8Array | null\n width: number\n height: number\n /** Maps original coordinates to scanned coordinates. */\n matrix: Matrix3\n /** Maps scanned coordinates back to original coordinates. */\n inverse: Matrix3\n transform: TransformSummary\n /**\n * How much to trust the result, in `[0, 1]`.\n *\n * Derived from ink correlation after warping, so it measures agreement in the\n * output rather than confidence in the process. Above ~0.6 is a solid match on\n * a printed page; below ~0.3 treat the alignment as failed.\n */\n confidence: number\n method: 'features' | 'coarse'\n diagnostics: AlignDiagnostics\n}\n\nexport function alignScan (original: ImageInput, scanned: ImageInput, options: AlignOptions = {}): AlignResult {\n const startedAt = Date.now()\n const {\n model = 'similarity',\n workingSize = 1400,\n coarseSize = 512,\n maxFeatures = 1200,\n ransacThreshold = 3,\n minInliers = 12,\n maxSkewDeg = 12,\n maxScaleRatio = 6,\n maxDisplacementRatio = 0.12,\n ink,\n interpolation = 'bilinear',\n background = [255, 255, 255, 255],\n output = 'png',\n quality = 92,\n seed = 0x5CA7F1,\n } = options\n\n const originalRaster = decodeImage(original)\n const scannedRaster = decodeImage(scanned)\n\n const originalInk = inkMap(toGrayscale(originalRaster), ink)\n const scannedInk = inkMap(toGrayscale(scannedRaster), ink)\n\n const coarse = estimateCoarse(originalInk, scannedInk, {\n workingSize: coarseSize,\n maxSkewDeg,\n maxScaleRatio,\n })\n\n const refined = refineWithFeatures(originalInk, scannedInk, coarse, {\n model,\n workingSize,\n maxFeatures,\n ransacThreshold,\n minInliers,\n maxDisplacementRatio,\n seed,\n })\n\n const matrix = refined.matrix\n const raster = warpRaster(scannedRaster, matrix, originalRaster.width, originalRaster.height, {\n background,\n interpolation,\n prefilter: true,\n })\n\n const agreement = measure(originalInk, scannedInk, matrix, workingSize)\n\n return {\n raster,\n image: output === 'none' ? null : encodeImage(raster, { format: output, quality }),\n width: raster.width,\n height: raster.height,\n matrix,\n inverse: invert(matrix),\n transform: decompose(matrix, model),\n confidence: Math.max(0, Math.min(1, agreement.correlation)),\n method: refined.method,\n diagnostics: {\n coarseScore: coarse.score,\n coarseStrategy: coarse.strategy,\n skewDeg: {\n original: (coarse.skew.original * 180) / Math.PI,\n scanned: (coarse.skew.scanned * 180) / Math.PI,\n },\n features: refined.features,\n matches: refined.matches,\n inliers: refined.inliers,\n inlierRatio: refined.inlierRatio,\n reprojectionError: refined.reprojectionError,\n correlation: agreement.correlation,\n intersectionOverUnion: agreement.iou,\n durationMs: Date.now() - startedAt,\n },\n }\n}\n\ninterface RefineOptions {\n model: TransformModel\n workingSize: number\n maxFeatures: number\n ransacThreshold: number\n minInliers: number\n maxDisplacementRatio: number\n seed: number\n}\n\ninterface RefineResult {\n matrix: Matrix3\n method: 'features' | 'coarse'\n features: { original: number, scanned: number }\n matches: number\n inliers: number\n inlierRatio: number\n reprojectionError: number\n}\n\n/**\n * Match features between the original and the *coarsely corrected* scan.\n *\n * Doing it after the coarse warp rather than before is what makes the whole\n * thing work. The two images now sit at the same scale and nearly the same\n * angle, so a fixed-offset binary descriptor describes the same thing on both,\n * and a correspondence that jumps across the page can be rejected on sight.\n * What RANSAC recovers is only the small residual, which is then composed onto\n * the coarse transform.\n */\nfunction refineWithFeatures (\n originalInk: GrayImage,\n scannedInk: GrayImage,\n coarse: CoarseResult,\n options: RefineOptions,\n): RefineResult {\n const fallback: RefineResult = {\n matrix: coarse.matrix,\n method: 'coarse',\n features: { original: 0, scanned: 0 },\n matches: 0,\n inliers: 0,\n inlierRatio: 0,\n reprojectionError: NaN,\n }\n\n const original = downscaleGray(originalInk, options.workingSize)\n const scanned = downscaleGray(scannedInk, options.workingSize)\n\n // The coarse matrix speaks full-resolution pixels; restate it between the two\n // working frames, which were shrunk by different amounts.\n const coarseWork = rebase(coarse.matrix, 1 / original.scale, 1 / scanned.scale)\n const rough = warpGray(scanned.image, coarseWork, original.image.width, original.image.height, 0)\n\n const originalFeatures = detectAndDescribe(original.image, { maxFeatures: options.maxFeatures, seed: options.seed })\n const scannedFeatures = detectAndDescribe(rough, { maxFeatures: options.maxFeatures, seed: options.seed })\n const counts = { original: originalFeatures.keypoints.length, scanned: scannedFeatures.keypoints.length }\n\n const diagonal = Math.hypot(original.image.width, original.image.height)\n const matches = matchFeatures(originalFeatures, scannedFeatures, {\n maxDisplacement: diagonal * options.maxDisplacementRatio,\n })\n\n const consensus = ransac(matches, {\n model: options.model,\n threshold: options.ransacThreshold,\n minInliers: options.minInliers,\n seed: options.seed,\n })\n\n if (consensus === null) return { ...fallback, features: counts, matches: matches.length }\n\n // RANSAC's matrix maps the original's working frame onto the rough warp,\n // which lives in that same frame. Scale it back up, then compose: original ->\n // rough -> scan.\n const residual = conjugateScale(consensus.matrix, original.scale)\n\n return {\n matrix: multiply(coarse.matrix, residual),\n method: 'features',\n features: counts,\n matches: matches.length,\n inliers: consensus.inliers.length,\n inlierRatio: consensus.inlierRatio,\n reprojectionError: consensus.error,\n }\n}\n\n/** Ink correlation and mask overlap after warping, computed at a modest resolution. */\nfunction measure (\n originalInk: GrayImage,\n scannedInk: GrayImage,\n matrix: Matrix3,\n workingSize: number,\n): { correlation: number, iou: number } {\n const original = downscaleGray(originalInk, Math.min(workingSize, 800))\n const scanned = downscaleGray(scannedInk, Math.min(workingSize, 800))\n const work = rebase(matrix, 1 / original.scale, 1 / scanned.scale)\n const warped = warpGray(scanned.image, work, original.image.width, original.image.height, 0)\n\n return {\n correlation: correlation(original.image, warped),\n iou: intersectionOverUnion(binarize(original.image), binarize(warped)),\n }\n}\n\n/**\n * Nudge an existing transform by whatever residual translation is still measurable.\n *\n * Exposed because it is occasionally useful on its own: if you already know the\n * transform from a previous page of the same batch, this re-seats it on the\n * current page for a fraction of the cost of a full alignment.\n */\nexport function polishTranslation (\n originalInk: GrayImage,\n scannedInk: GrayImage,\n matrix: Matrix3,\n workingSize = 512,\n): Matrix3 {\n const original = downscaleGray(originalInk, workingSize)\n const scanned = downscaleGray(scannedInk, workingSize)\n const work = rebase(matrix, 1 / original.scale, 1 / scanned.scale)\n const warped = warpGray(scanned.image, work, original.image.width, original.image.height, 0)\n\n const shift = phaseCorrelate(original.image, warped)\n if (!Number.isFinite(shift.dx) || !Number.isFinite(shift.dy)) return matrix\n\n const corrected = multiply(work, translation(shift.dx, shift.dy))\n const candidate = rebase(corrected, original.scale, scanned.scale)\n\n const before = correlation(original.image, warped)\n const after = correlation(\n original.image,\n warpGray(scanned.image, corrected, original.image.width, original.image.height, 0),\n )\n\n return after > before ? candidate : matrix\n}\n","import { decodeImage } from './image/codec'\nimport type { InkOptions } from './image/gray'\nimport { binarize, coverage, dilate, inkMap, toGrayscale } from './image/gray'\nimport type { BinaryImage, ImageInput, Raster, Rect } from './types'\n\n/**\n * What changed, and where.\n *\n * Once the scan sits on the original's canvas, \"was this box signed?\" stops\n * being an image problem and becomes arithmetic: count the ink inside the\n * rectangle that is present in the scan and absent from the original.\n *\n * The one subtlety is the tolerance band. Alignment is good to a pixel or so,\n * never to zero, and printed text is mostly edges — so a half-pixel shift\n * lights up the outline of every character as \"new ink\". Dilating the\n * original's mask first (fattening every stroke by a couple of pixels) absorbs\n * that, the way a proofreader ignores a letter sitting a hair off the baseline.\n * What it cannot absorb is a signature, which is ink in places the original has\n * none.\n */\n\nexport interface Region {\n id: string\n /** In the *original's* pixel coordinates - the whole point of aligning first. */\n rect: Rect\n /** Fraction of the region that must be new ink before `filled` is true. Overrides the global default. */\n threshold?: number\n}\n\nexport interface RegionOptions {\n ink?: InkOptions\n /**\n * Radius, in pixels, that the original's ink is fattened by before diffing.\n * Raise it if alignment is loose; lower it to catch very fine additions.\n */\n tolerance?: number\n /** Default fraction of new ink that counts as filled. */\n threshold?: number\n}\n\nexport interface RegionReport {\n id: string\n rect: Rect\n /** Ink coverage of the region in the original, in `[0, 1]`. */\n originalInk: number\n /** Ink coverage of the region in the aligned scan. */\n scanInk: number\n /** Coverage that is ink in the scan and not within `tolerance` of ink in the original. */\n added: number\n /** Coverage that is ink in the original and missing from the scan. Mostly a faint-scan warning. */\n removed: number\n filled: boolean\n /** `added` as a multiple of the threshold, clamped to `[0, 1]`. A reportable confidence. */\n score: number\n}\n\nexport interface DocumentDiff {\n /** Page-wide version of {@link RegionReport.added}. */\n added: number\n removed: number\n regions: RegionReport[]\n}\n\n/**\n * Compare an aligned scan against its original over a set of known rectangles.\n *\n * `aligned` must be the output of `alignScan` - or anything else already on the\n * original's canvas. Feeding a raw scan in produces confident nonsense, because\n * every rectangle then names a different part of the page in each image.\n */\nexport function compareRegions (\n original: ImageInput,\n aligned: ImageInput,\n regions: readonly Region[],\n options: RegionOptions = {},\n): RegionReport[] {\n const { tolerance = 2, threshold = 0.02, ink } = options\n const masks = buildMasks(original, aligned, ink, tolerance)\n\n return regions.map(region => report(region, masks, threshold))\n}\n\n/** Page-wide added/removed ink, plus per-region detail for any regions supplied. */\nexport function diffDocument (\n original: ImageInput,\n aligned: ImageInput,\n regions: readonly Region[] = [],\n options: RegionOptions = {},\n): DocumentDiff {\n const { tolerance = 2, threshold = 0.02, ink } = options\n const masks = buildMasks(original, aligned, ink, tolerance)\n const full: Rect = { x: 0, y: 0, width: masks.width, height: masks.height }\n const whole = report({ id: '__document__', rect: full }, masks, threshold)\n\n return {\n added: whole.added,\n removed: whole.removed,\n regions: regions.map(region => report(region, masks, threshold)),\n }\n}\n\n/**\n * An RGBA overlay of the comparison, for looking at with your own eyes.\n *\n * Red is ink the scan added, blue is ink it lost, grey is ink both agree on.\n * A correctly aligned pair of a signed form is almost entirely grey with a red\n * signature; a misaligned one is red and blue confetti along every stroke,\n * which is the fastest way to tell the two failures apart.\n */\nexport function renderDiff (\n original: ImageInput,\n aligned: ImageInput,\n options: RegionOptions = {},\n): Raster {\n const { tolerance = 2, ink } = options\n const masks = buildMasks(original, aligned, ink, tolerance)\n const { width, height } = masks\n const data = new Uint8ClampedArray(width * height * 4)\n\n for (let i = 0, p = 0; p < width * height; p++, i += 4) {\n const inOriginal = masks.original.data[p] === 1\n const inScan = masks.scan.data[p] === 1\n const nearOriginal = masks.originalDilated.data[p] === 1\n\n let r = 255\n let g = 255\n let b = 255\n\n if (inScan && !nearOriginal) {\n r = 220\n g = 30\n b = 40\n } else if (inOriginal && masks.scanDilated.data[p] === 0) {\n r = 40\n g = 90\n b = 220\n } else if (inOriginal || inScan) {\n r = 110\n g = 110\n b = 110\n }\n\n data[i] = r\n data[i + 1] = g\n data[i + 2] = b\n data[i + 3] = 255\n }\n\n return { width, height, data }\n}\n\ninterface Masks {\n width: number\n height: number\n original: BinaryImage\n scan: BinaryImage\n originalDilated: BinaryImage\n scanDilated: BinaryImage\n}\n\nfunction buildMasks (\n original: ImageInput,\n aligned: ImageInput,\n ink: InkOptions | undefined,\n tolerance: number,\n): Masks {\n const originalRaster = decodeImage(original)\n const alignedRaster = decodeImage(aligned)\n\n if (originalRaster.width !== alignedRaster.width || originalRaster.height !== alignedRaster.height)\n throw new Error(\n `compareRegions needs both images on the same canvas: got ${originalRaster.width}x${originalRaster.height} and ${alignedRaster.width}x${alignedRaster.height}. Align the scan first.`,\n )\n\n const originalMask = binarize(inkMap(toGrayscale(originalRaster), ink))\n const scanMask = binarize(inkMap(toGrayscale(alignedRaster), ink))\n\n return {\n width: originalRaster.width,\n height: originalRaster.height,\n original: originalMask,\n scan: scanMask,\n originalDilated: dilate(originalMask, tolerance),\n scanDilated: dilate(scanMask, tolerance),\n }\n}\n\nfunction report (region: Region, masks: Masks, defaultThreshold: number): RegionReport {\n const { x, y, width, height } = region.rect\n const left = Math.max(0, Math.floor(x))\n const top = Math.max(0, Math.floor(y))\n const right = Math.min(masks.width, Math.ceil(x + width))\n const bottom = Math.min(masks.height, Math.ceil(y + height))\n\n if (right <= left || bottom <= top)\n return {\n id: region.id,\n rect: region.rect,\n originalInk: 0,\n scanInk: 0,\n added: 0,\n removed: 0,\n filled: false,\n score: 0,\n }\n\n const threshold = region.threshold ?? defaultThreshold\n let added = 0\n let removed = 0\n for (let row = top; row < bottom; row++) {\n const offset = row * masks.width\n for (let column = left; column < right; column++) {\n const p = offset + column\n if (masks.scan.data[p] === 1 && masks.originalDilated.data[p] === 0) added++\n if (masks.original.data[p] === 1 && masks.scanDilated.data[p] === 0) removed++\n }\n }\n\n const area = (right - left) * (bottom - top)\n const addedRatio = added / area\n\n return {\n id: region.id,\n rect: region.rect,\n originalInk: coverage(masks.original, left, top, right, bottom),\n scanInk: coverage(masks.scan, left, top, right, bottom),\n added: addedRatio,\n removed: removed / area,\n filled: addedRatio >= threshold,\n score: threshold > 0 ? Math.min(1, addedRatio / threshold) : 0,\n }\n}\n","import { boxBlurRaster } from '../image/resize'\nimport { invert, multiply, scaling, translation } from '../math/matrix'\nimport { createRandom } from '../math/random'\nimport { warpRaster } from '../image/warp'\nimport type { Matrix3, Raster, Rect } from '../types'\n\n/**\n * Synthetic pages, and synthetic scans of them.\n *\n * Alignment is awkward to test honestly: with two real images you have no\n * ground truth, only an opinion about whether the output looks right. Generate\n * the page and then the distortion yourself and you know the exact matrix the\n * estimator is supposed to recover, so a test can assert a number of pixels\n * instead of a feeling.\n *\n * It is exported rather than kept in the test folder because the same trick is\n * how you smoke-test a deployment: generate, distort, align, check the error is\n * small, all without shipping sample scans.\n */\n\nexport interface DocumentOptions {\n width?: number\n height?: number\n seed?: number\n /** Where a signature would go. Left empty by {@link createSyntheticDocument}. */\n signatureBox?: Rect\n}\n\nexport interface SyntheticDocument {\n raster: Raster\n /** Rectangles a caller may want to inspect later: the signature box, the tick boxes. */\n regions: Record<string, Rect>\n}\n\nexport interface ScanOptions {\n rotationDeg?: number\n /** Size of the scan relative to the page. `1.5` is roughly 300 dpi against a 200 dpi render. */\n scale?: number\n translateX?: number\n translateY?: number\n /** Standard deviation of additive sensor noise, in `[0, 1]` units. */\n noise?: number\n /** Box blur radius, standing in for an out-of-focus or low-quality scan. */\n blur?: number\n /** Strength of a diagonal lighting ramp, in `[0, 1]`. `0.3` is a pronounced shadow. */\n illumination?: number\n /** Scan canvas. Defaults to the page scaled by `scale`, so the whole page fits. */\n canvas?: { width: number, height: number }\n seed?: number\n}\n\nexport interface SimulatedScan {\n raster: Raster\n /** Ground truth: maps original coordinates to scanned coordinates. */\n matrix: Matrix3\n}\n\n/**\n * A plausible printed form: header rule, paragraphs, a table, tick boxes, a\n * signature box. Deterministic for a given seed.\n */\nexport function createSyntheticDocument (options: DocumentOptions = {}): SyntheticDocument {\n const { width = 850, height = 1100, seed = 42 } = options\n const random = createRandom(seed)\n const page: Raster = { width, height, data: new Uint8ClampedArray(width * height * 4).fill(255) }\n\n // The layout is written once against a nominal 850x1100 page and scaled to\n // whatever was asked for. Laying it out in absolute pixels instead means a\n // smaller page silently loses its last few elements off the bottom edge -\n // including, on a form, the signature box.\n const scale = Math.min(width / 850, height / 1100)\n const unit = (value: number): number => value * scale\n\n const margin = Math.round(unit(76))\n const right = width - margin\n const lineHeight = Math.max(4, unit(21))\n const textHeight = Math.max(2, Math.round(unit(9)))\n let y = margin\n\n fillRect(page, { x: margin, y, width: Math.round((right - margin) * 0.44), height: Math.max(3, unit(26)) }, 20)\n y += unit(54)\n\n drawLine(page, margin, y, right, y, Math.max(1, unit(3)), 40)\n y += unit(34)\n\n // Fixed line counts rather than random ones, so the page always fits.\n for (const lines of [3, 4, 5, 6]) {\n for (let line = 0; line < lines; line++) {\n drawTextLine(page, margin, y, right, textHeight, random)\n y += lineHeight\n }\n y += unit(18)\n }\n\n const tableTop = y\n const rows = 5\n const columns = 4\n const rowHeight = Math.max(6, unit(30))\n const columnWidth = (right - margin) / columns\n const ruleWidth = Math.max(1, unit(2))\n for (let r = 0; r <= rows; r++)\n drawLine(page, margin, tableTop + r * rowHeight, right, tableTop + r * rowHeight, ruleWidth, 60)\n for (let c = 0; c <= columns; c++)\n drawLine(page, margin + c * columnWidth, tableTop, margin + c * columnWidth, tableTop + rows * rowHeight, ruleWidth, 60)\n\n for (let r = 0; r < rows; r++)\n for (let c = 0; c < columns; c++)\n drawTextLine(\n page,\n margin + c * columnWidth + unit(8),\n tableTop + r * rowHeight + rowHeight * 0.36,\n margin + (c + 1) * columnWidth - unit(8),\n textHeight,\n random,\n )\n\n y = tableTop + rows * rowHeight + unit(46)\n\n const regions: Record<string, Rect> = {}\n const boxSize = Math.max(6, Math.round(unit(18)))\n for (let i = 0; i < 3; i++) {\n const box: Rect = { x: margin + i * unit(150), y, width: boxSize, height: boxSize }\n strokeRect(page, box, Math.max(1, unit(2)), 30)\n regions[`tick-${i + 1}`] = box\n }\n y += unit(70)\n\n const signature: Rect = options.signatureBox ?? {\n x: margin,\n y,\n width: Math.round((right - margin) * 0.55),\n height: Math.max(12, Math.round(unit(78))),\n }\n strokeRect(page, signature, Math.max(1, unit(2)), 30)\n regions.signature = signature\n\n regions.stamp = {\n x: right - Math.round(unit(150)),\n y,\n width: Math.round(unit(150)),\n height: signature.height,\n }\n\n return { raster: page, regions }\n}\n\n/** Scribble inside a rectangle, the way a signature crosses a signature box. */\nexport function drawSignature (page: Raster, box: Rect, seed = 7): void {\n const random = createRandom(seed)\n const points = 9\n const baseline = box.y + box.height * 0.62\n let previousX = box.x + box.width * 0.06\n let previousY = baseline\n\n for (let i = 1; i <= points; i++) {\n const x = box.x + box.width * (0.06 + (0.86 * i) / points)\n const y = baseline - box.height * (0.05 + random() * 0.42) * (i % 2 === 0 ? 1 : -0.45)\n drawLine(page, previousX, previousY, x, y, 3, 25)\n previousX = x\n previousY = y\n }\n}\n\n/** Fill a tick box, the way a pen does. */\nexport function drawTick (page: Raster, box: Rect): void {\n const { x, y, width, height } = box\n drawLine(page, x + width * 0.15, y + height * 0.5, x + width * 0.42, y + height * 0.82, 3, 20)\n drawLine(page, x + width * 0.42, y + height * 0.82, x + width * 0.88, y + height * 0.12, 3, 20)\n}\n\n/**\n * Put a page through everything a scanner does to it, and report the matrix used.\n *\n * Order matters and mirrors the physical one: the page is placed on the glass\n * somewhere, at some angle, and sampled at some resolution (the geometry);\n * then the lamp falls off towards one corner, the optics blur, and the sensor\n * adds noise (the photometry). Estimators that only ever see clean geometric\n * distortion pass tests and fail on real scans.\n */\nexport function simulateScan (page: Raster, options: ScanOptions = {}): SimulatedScan {\n const {\n rotationDeg = 0,\n scale = 1,\n translateX = 0,\n translateY = 0,\n noise = 0,\n blur = 0,\n illumination = 0,\n seed = 1234,\n } = options\n\n const canvas = options.canvas ?? {\n width: Math.max(8, Math.round(page.width * scale)),\n height: Math.max(8, Math.round(page.height * scale)),\n }\n\n const angle = (rotationDeg * Math.PI) / 180\n const cos = Math.cos(angle)\n const sin = Math.sin(angle)\n const cx = page.width / 2\n const cy = page.height / 2\n\n // Rotate about the page centre, scale, then place that centre in the middle\n // of the scan canvas plus the requested offset.\n const rotateAboutCentre: Matrix3 = [\n cos, -sin, cx - cos * cx + sin * cy,\n sin, cos, cy - sin * cx - cos * cy,\n 0, 0, 1,\n ]\n const place = translation(\n canvas.width / 2 - cx * scale + translateX,\n canvas.height / 2 - cy * scale + translateY,\n )\n const forward = multiply(place, multiply(scaling(scale), rotateAboutCentre))\n\n let raster = warpRaster(page, invert(forward), canvas.width, canvas.height, {\n background: [255, 255, 255, 255],\n interpolation: 'bilinear',\n prefilter: true,\n })\n\n if (blur > 0) raster = boxBlurRaster(raster, blur)\n if (illumination > 0) applyIllumination(raster, illumination)\n if (noise > 0) applyNoise(raster, noise, seed)\n\n return { raster, matrix: forward }\n}\n\n/** A diagonal ramp plus a soft corner shadow: the two things a phone camera always adds. */\nfunction applyIllumination (raster: Raster, strength: number): void {\n const { width, height, data } = raster\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const u = x / width\n const v = y / height\n const ramp = 1 - strength * (0.35 * u + 0.65 * v)\n const corner = 1 - strength * 0.8 * Math.max(0, 1 - Math.hypot(u, v) * 1.3)\n const factor = ramp * corner\n const i = (y * width + x) * 4\n data[i] *= factor\n data[i + 1] *= factor\n data[i + 2] *= factor\n }\n }\n}\n\nfunction applyNoise (raster: Raster, sigma: number, seed: number): void {\n const random = createRandom(seed)\n const amplitude = sigma * 255\n for (let i = 0; i < raster.data.length; i += 4) {\n const n = (random() + random() + random() - 1.5) * 2 * amplitude\n raster.data[i] += n\n raster.data[i + 1] += n\n raster.data[i + 2] += n\n }\n}\n\n/** One line of \"text\": dark blocks of word-ish widths with gaps between them. */\nfunction drawTextLine (\n page: Raster,\n x0: number,\n y: number,\n x1: number,\n height: number,\n random: () => number,\n): void {\n const unit = height / 9\n let x = x0\n while (x < x1 - 12 * unit) {\n const word = (14 + Math.floor(random() * 46)) * unit\n const end = Math.min(x1, x + word)\n fillRect(page, { x, y, width: end - x, height }, 35 + Math.floor(random() * 40))\n x = end + (6 + Math.floor(random() * 6)) * unit\n }\n}\n\nexport function fillRect (page: Raster, rect: Rect, value: number): void {\n const left = Math.max(0, Math.round(rect.x))\n const top = Math.max(0, Math.round(rect.y))\n const right = Math.min(page.width, Math.round(rect.x + rect.width))\n const bottom = Math.min(page.height, Math.round(rect.y + rect.height))\n\n for (let y = top; y < bottom; y++) {\n let i = (y * page.width + left) * 4\n for (let x = left; x < right; x++, i += 4) {\n page.data[i] = value\n page.data[i + 1] = value\n page.data[i + 2] = value\n page.data[i + 3] = 255\n }\n }\n}\n\nexport function strokeRect (page: Raster, rect: Rect, thickness: number, value: number): void {\n const { x, y, width, height } = rect\n fillRect(page, { x, y, width, height: thickness }, value)\n fillRect(page, { x, y: y + height - thickness, width, height: thickness }, value)\n fillRect(page, { x, y, width: thickness, height }, value)\n fillRect(page, { x: x + width - thickness, y, width: thickness, height }, value)\n}\n\nexport function drawLine (\n page: Raster,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n thickness: number,\n value: number,\n): void {\n const steps = Math.ceil(Math.hypot(x1 - x0, y1 - y0)) + 1\n const half = thickness / 2\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps\n fillRect(\n page,\n { x: x0 + (x1 - x0) * t - half, y: y0 + (y1 - y0) * t - half, width: thickness, height: thickness },\n value,\n )\n }\n}\n"],"names":["correlation","a","b","width","height","Error","n","data","length","sumA","sumB","i","meanA","meanB","cov","varA","varB","da","db","denom","Math","sqrt","intersectionOverUnion","intersection","union","hit","mean","image","total","value","createRaster","fill","assertDimensions","Uint8ClampedArray","r","g","createGray","Float32Array","createBinary","Uint8Array","cloneRaster","from","isRaster","candidate","ArrayBuffer","isView","byteLength","toBytes","input","buffer","byteOffset","TypeError","asClamped","Number","isSafeInteger","RangeError","PNG_MAGIC","JPEG_MAGIC","sniffFormat","bytes","startsWith","decodeImage","format","png","PNG","sync","read","Buffer","jpeg","decodeJpeg","useTArray","formatAsRGBA","tolerantDecoding","encodeImage","options","quality","encoded","encodeJpeg","write","magic","byte","entries","toGrayscale","out","src","dst","p","grayToRaster","v","integralImage","stride","sum","Float64Array","y","rowSum","srcRow","dstRow","prevRow","x","boxBlur","radius","max","round","y0","y1","min","top","bottom","x0","x1","inkMap","gray","backgroundFraction","floor","background","bg","ratio","ink","otsuThreshold","bins","histogram","bin","sumAll","sumBackground","weightBackground","best","bestVariance","t","weightForeground","meanBackground","meanForeground","between","binarize","threshold","dilate","mask","horizontal","row","to","k","coverage","left","right","ceil","hits","resizeGray","resampleRows","resampleColumns","downscaleGray","maxDimension","longest","scale","boxBlurRaster","temp","sums","Int32Array","count","c","leaving","entering","columnSums","srcWidth","rows","dstWidth","start","end","areaAverage","pos","clamp","i0","i1","frac","srcHeight","dstHeight","column","offset","weight","w","warpRaster","source","matrix","interpolation","prefilter","applyPrefilter","m0","m1","m2","m3","m4","m5","m6","m7","m8","dy","dx","writePixel","u","sampleRaster","warpGray","sampleGrayBilinear","fx","fy","cx0","clampIndex","cx1","cy0","cy1","p00","p10","p01","p11","det","abs","isFinite","at","sampleBicubic","i00","i10","i01","i11","w00","w10","w01","w11","wx","catmullRomWeights","wy","j","rowTotal","t2","t3","rgba","IDENTITY","multiply","determinant","m","invert","inv","normalize","s","applyPoint","iw","translation","tx","ty","scaling","sx","sy","similarity","angleRad","pivot","target","cos","sin","conjugateScale","rebase","sourceScale","targetScale","mapRectCorners","rect","decompose","model","d","e","scaleX","hypot","scaleY","shear","origin","rotationDeg","atan2","PI","shearDeg","perspective","reprojectionError","isPlausible","maxScaleRatio","some","contentExtent","angle","trim","corners","minU","Infinity","maxU","minV","maxV","uBins","vBins","yCos","ySin","px","center","density","u0","u1","trimmedSpan","v0","v1","centerU","centerV","estimateSkew","maxAngleDeg","toRad","bestScore","deg","score","profileSharpness","span","step","localBest","cutoff","accumulated","low","high","nextPowerOfTwo","isPowerOfTwo","fft1d","re","im","inverse","bit","sign","len","wRe","wIm","curRe","curIm","half","evenRe","evenIm","oddRe","oddIm","nextRe","fft2d","rowRe","rowIm","off","set","subarray","colRe","colIm","phaseCorrelate","size","aRe","aIm","bRe","bIm","windowX","hann","windowY","magnitude","peakIndex","peakValue","py","wrap","parabolic","sample","peak","denominator","cx","cy","estimateCoarse","originalInk","scannedInk","workingSize","maxSkewDeg","original","scanned","originalSkew","scannedSkew","originalFlat","scannedFlat","originalTilted","scannedTilted","candidates","frameScale","geometricMean","push","fromExtents","bestMatrix","bestStrategy","variant","withTranslationPolish","warped","strategy","skew","shift","into","isNaN","NaN","createRandom","seed","state","imul","gaussian","random","EPSILON","log","DESCRIPTOR_WORDS","DESCRIPTOR_BITS","ANGLE_BINS","CIRCLE","ARC","COMPASS_MINIMUM","detectAndDescribe","maxFeatures","fastThreshold","levels","scaleFactor","patchSize","gridSize","patterns","steeredPatterns","halfPatch","border","SQRT2","keypoints","descriptorChunks","perLevel","level","levelScale","levelImage","smoothed","found","detectFast","kept","distribute","corner","orientation","angleBin","descriptor","describe","descriptors","Uint32Array","chunk","scores","ring","bright","dark","hasArc","brightSum","darkSum","isPeak","runBright","runDark","budget","cells","Map","cellWidth","cellHeight","key","bucket","get","undefined","perCell","leftovers","values","sort","slice","m10","m01","twoPi","normalized","pattern","base","x2","y2","patternCache","cached","sigma","rotated","UNSET","matchFeatures","maxDistance","crossCheck","maxDisplacement","bestForSource","bestDistance","secondDistance","bestForTarget","bestTargetDistance","gated","gate","offsetA","first","second","firstIndex","distance","hamming","matches","offsetB","popcount","solve","col","diag","factor","jacobiEigen","maxSweeps","sweep","q","apq","theta","akp","akq","apk","aqk","vkp","vkq","vectors","smallestEigenvector","norm","minimumSamples","fitModel","indices","fitSimilarity","fitAffine","fitHomography","picked","select","dot","cross","qx","qy","bx","by","match","row0","row1","sourceNorm","normalizer","map","targetNorm","ata","apply","accumulate","h","denormalized","vi","points","ransac","maxIterations","confidence","sampleSize","minInliers","Array","bestInliers","limit","iterations","drawSample","inliers","findInliers","refined","refinedInliers","inlierRatio","error","attempt","duplicate","alignScan","startedAt","Date","now","coarseSize","ransacThreshold","maxDisplacementRatio","output","originalRaster","scannedRaster","coarse","refineWithFeatures","raster","agreement","measure","transform","method","diagnostics","coarseScore","coarseStrategy","skewDeg","features","iou","durationMs","fallback","coarseWork","rough","originalFeatures","scannedFeatures","counts","diagonal","consensus","residual","work","polishTranslation","corrected","before","after","compareRegions","aligned","regions","tolerance","masks","buildMasks","region","report","diffDocument","full","whole","id","added","removed","renderDiff","inOriginal","inScan","scan","nearOriginal","originalDilated","scanDilated","alignedRaster","originalMask","scanMask","defaultThreshold","scanInk","filled","area","addedRatio","createSyntheticDocument","page","unit","margin","lineHeight","textHeight","fillRect","drawLine","lines","line","drawTextLine","tableTop","columns","rowHeight","columnWidth","ruleWidth","boxSize","box","strokeRect","signature","signatureBox","stamp","drawSignature","baseline","previousX","previousY","drawTick","simulateScan","translateX","translateY","noise","blur","illumination","canvas","rotateAboutCentre","place","forward","applyIllumination","applyNoise","strength","ramp","amplitude","word","thickness","steps"],"mappings":";;;;;;;;;;;;;;AAEA;;;;;;;;;AASG,6FAGG,SAAUA,WAAAA,CAAaC,CAAY,EAAEC,CAAY,EAAA;AACrD,IAAA,IAAID,CAAAA,CAAEE,KAAK,KAAKD,CAAAA,CAAEC,KAAK,IAAIF,CAAAA,CAAEG,MAAM,KAAKF,CAAAA,CAAEE,MAAM,EAC9C,MAAM,IAAIC,KAAAA,CAAM,+CAAA,CAAA;AAElB,IAAA,MAAMC,CAAAA,GAAIL,CAAAA,CAAEM,IAAI,CAACC,MAAM;IACvB,IAAIF,CAAAA,KAAM,GAAG,OAAO,CAAA;AAEpB,IAAA,IAAIG,IAAAA,GAAO,CAAA;AACX,IAAA,IAAIC,IAAAA,GAAO,CAAA;AACX,IAAA,IAAK,IAAIC,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK;QAC1BF,IAAAA,IAAQR,CAAAA,CAAEM,IAAI,CAACI,CAAAA,CAAE;QACjBD,IAAAA,IAAQR,CAAAA,CAAEK,IAAI,CAACI,CAAAA,CAAE;AACnB,IAAA;AACA,IAAA,MAAMC,QAAQH,IAAAA,GAAOH,CAAAA;AACrB,IAAA,MAAMO,QAAQH,IAAAA,GAAOJ,CAAAA;AAErB,IAAA,IAAIQ,GAAAA,GAAM,CAAA;AACV,IAAA,IAAIC,IAAAA,GAAO,CAAA;AACX,IAAA,IAAIC,IAAAA,GAAO,CAAA;AACX,IAAA,IAAK,IAAIL,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK;AAC1B,QAAA,MAAMM,EAAAA,GAAKhB,CAAAA,CAAEM,IAAI,CAACI,EAAE,GAAGC,KAAAA;AACvB,QAAA,MAAMM,EAAAA,GAAKhB,CAAAA,CAAEK,IAAI,CAACI,EAAE,GAAGE,KAAAA;AACvBC,QAAAA,GAAAA,IAAOG,EAAAA,GAAKC,EAAAA;AACZH,QAAAA,IAAAA,IAAQE,EAAAA,GAAKA,EAAAA;AACbD,QAAAA,IAAAA,IAAQE,EAAAA,GAAKA,EAAAA;AACf,IAAA;AAEA,IAAA,MAAMC,KAAAA,GAAQC,IAAAA,CAAKC,IAAI,CAACN,IAAAA,GAAOC,IAAAA,CAAAA;IAE/B,OAAOG,KAAAA,GAAQ,KAAA,GAAQL,GAAAA,GAAMK,KAAAA,GAAQ,CAAA;AACvC;AAEA,oGACM,SAAUG,qBAAAA,CAAuBrB,CAAc,EAAEC,CAAc,EAAA;AACnE,IAAA,IAAID,CAAAA,CAAEE,KAAK,KAAKD,CAAAA,CAAEC,KAAK,IAAIF,CAAAA,CAAEG,MAAM,KAAKF,CAAAA,CAAEE,MAAM,EAC9C,MAAM,IAAIC,KAAAA,CAAM,wDAAA,CAAA;AAElB,IAAA,IAAIkB,YAAAA,GAAe,CAAA;AACnB,IAAA,IAAIC,KAAAA,GAAQ,CAAA;IACZ,IAAK,IAAIb,IAAI,CAAA,EAAGA,CAAAA,GAAIV,EAAEM,IAAI,CAACC,MAAM,EAAEG,CAAAA,EAAAA,CAAK;QACtC,MAAMc,GAAAA,GAAMxB,EAAEM,IAAI,CAACI,EAAE,GAAGT,CAAAA,CAAEK,IAAI,CAACI,CAAAA,CAAE;QACjCa,KAAAA,IAASC,GAAAA;QACTF,YAAAA,IAAgBtB,CAAAA,CAAEM,IAAI,CAACI,CAAAA,CAAE,GAAGT,CAAAA,CAAEK,IAAI,CAACI,CAAAA,CAAE;AACvC,IAAA;IAEA,OAAOa,KAAAA,GAAQ,CAAA,GAAID,YAAAA,GAAeC,KAAAA,GAAQ,CAAA;AAC5C;AAEA,uCACM,SAAUE,IAAAA,CAAMC,KAAgB,EAAA;AACpC,IAAA,IAAIA,MAAMpB,IAAI,CAACC,MAAM,KAAK,GAAG,OAAO,CAAA;AACpC,IAAA,IAAIoB,KAAAA,GAAQ,CAAA;AACZ,IAAA,KAAK,MAAMC,KAAAA,IAASF,KAAAA,CAAMpB,IAAI,CAAEqB,KAAAA,IAASC,KAAAA;AAEzC,IAAA,OAAOD,KAAAA,GAAQD,KAAAA,CAAMpB,IAAI,CAACC,MAAM;AAClC;;ACnEA,uFACgBsB,YAAAA,CAAc3B,KAAa,EAAEC,MAAc,EAAE2B,IAAAA,GAAyC;AAAC,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA,GAAA;AAAK,IAAA;AAAI,CAAA,EAAA;AACxHC,IAAAA,gBAAAA,CAAiB7B,KAAAA,EAAOC,MAAAA,CAAAA;AACxB,IAAA,MAAMG,IAAAA,GAAO,IAAI0B,iBAAAA,CAAkB9B,KAAAA,GAAQC,MAAAA,GAAS,CAAA,CAAA;AACpD,IAAA,MAAM,CAAC8B,CAAAA,EAAGC,CAAAA,EAAGjC,CAAAA,EAAGD,EAAE,GAAG8B,IAAAA;IACrB,IAAK,IAAIpB,IAAI,CAAA,EAAGA,CAAAA,GAAIJ,KAAKC,MAAM,EAAEG,KAAK,CAAA,CAAG;QACvCJ,IAAI,CAACI,EAAE,GAAGuB,CAAAA;QACV3B,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAGwB,CAAAA;QACd5B,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAGT,CAAAA;QACdK,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAGV,CAAAA;AAChB,IAAA;IAEA,OAAO;AAAEE,QAAAA,KAAAA;AAAOC,QAAAA,MAAAA;AAAQG,QAAAA;;AAC1B;AAEM,SAAU6B,UAAAA,CAAYjC,KAAa,EAAEC,MAAc,EAAA;AACvD4B,IAAAA,gBAAAA,CAAiB7B,KAAAA,EAAOC,MAAAA,CAAAA;IAExB,OAAO;AAAED,QAAAA,KAAAA;AAAOC,QAAAA,MAAAA;QAAQG,IAAAA,EAAM,IAAI8B,aAAalC,KAAAA,GAAQC,MAAAA;;AACzD;AAEM,SAAUkC,YAAAA,CAAcnC,KAAa,EAAEC,MAAc,EAAA;AACzD4B,IAAAA,gBAAAA,CAAiB7B,KAAAA,EAAOC,MAAAA,CAAAA;IAExB,OAAO;AAAED,QAAAA,KAAAA;AAAOC,QAAAA,MAAAA;QAAQG,IAAAA,EAAM,IAAIgC,WAAWpC,KAAAA,GAAQC,MAAAA;;AACvD;AAEM,SAAUoC,YAAab,KAAa,EAAA;IACxC,OAAO;AAAExB,QAAAA,KAAAA,EAAOwB,MAAMxB,KAAK;AAAEC,QAAAA,MAAAA,EAAQuB,MAAMvB,MAAM;AAAEG,QAAAA,IAAAA,EAAM0B,iBAAAA,CAAkBQ,IAAI,CAACd,KAAAA,CAAMpB,IAAI;AAAC,KAAA;AAC7F;AAEA;;;;;;IAOM,SAAUmC,QAAAA,CAAUb,KAAc,EAAA;AACtC,IAAA,IAAI,OAAOA,KAAAA,KAAU,QAAA,IAAYA,KAAAA,KAAU,MAAM,OAAO,KAAA;AACxD,IAAA,MAAMc,SAAAA,GAAYd,KAAAA;IAElB,OACE,OAAOc,SAAAA,CAAUxC,KAAK,KAAK,QAAA,IAC3B,OAAOwC,SAAAA,CAAUvC,MAAM,KAAK,QAAA,IAC5BwC,WAAAA,CAAYC,MAAM,CAACF,UAAUpC,IAAI,CAAA,IACjCoC,SAAAA,CAAUpC,IAAI,CAACuC,UAAU,KAAKH,SAAAA,CAAUxC,KAAK,GAAGwC,SAAAA,CAAUvC,MAAM,GAAG,CAAA;AAEvE;AAEA,uGACM,SAAU2C,OAAAA,CAASC,KAAiB,EAAA;IACxC,IAAIN,QAAAA,CAASM,QAAQ,OAAO,IAAA;AAC5B,IAAA,IAAIA,KAAAA,YAAiBJ,WAAAA,EAAa,OAAO,IAAIL,UAAAA,CAAWS,KAAAA,CAAAA;AACxD,IAAA,IAAIJ,WAAAA,CAAYC,MAAM,CAACG,KAAAA,CAAAA,EAAQ,OAAO,IAAIT,UAAAA,CAAWS,KAAAA,CAAMC,MAAM,EAAED,KAAAA,CAAME,UAAU,EAAEF,MAAMF,UAAU,CAAA;AAErG,IAAA,MAAM,IAAIK,SAAAA,CAAU,2DAAA,CAAA;AACtB;AAEA,yFACM,SAAUC,SAAAA,CAAW7C,IAAgB,EAAA;AACzC,IAAA,OAAOA,IAAAA,YAAgB0B,iBAAAA,GACnB1B,IAAAA,GACA,IAAI0B,iBAAAA,CAAkB1B,IAAAA,CAAK0C,MAAM,EAAE1C,IAAAA,CAAK2C,UAAU,EAAE3C,IAAAA,CAAKuC,UAAU,CAAA;AACzE;AAEA,SAASd,gBAAAA,CAAkB7B,KAAa,EAAEC,MAAc,EAAA;IACtD,IAAI,CAACiD,OAAOC,aAAa,CAACnD,UAAU,CAACkD,MAAAA,CAAOC,aAAa,CAAClD,MAAAA,CAAAA,IAAWD,KAAAA,IAAS,KAAKC,MAAAA,IAAU,CAAA,EAC3F,MAAM,IAAImD,UAAAA,CAAW,CAAA,gDAAA,EAAmDpD,KAAAA,CAAK,CAAA,EAAIC,MAAAA,CAAAA,CAAQ,CAAA;AAC7F;;AC7CA,MAAMoD,SAAAA,GAAY;AAAC,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA;AAAK,CAAA;AAClE,MAAMC,UAAAA,GAAa;AAAC,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA;AAAK,CAAA;AAErC,6FACM,SAAUC,WAAAA,CAAaC,KAAiB,EAAA;IAC5C,IAAIC,UAAAA,CAAWD,KAAAA,EAAOH,SAAAA,CAAAA,EAAY,OAAO,KAAA;IACzC,IAAII,UAAAA,CAAWD,KAAAA,EAAOF,UAAAA,CAAAA,EAAa,OAAO,MAAA;IAE1C,OAAO,IAAA;AACT;AAEA;;;;;IAMM,SAAUI,WAAAA,CAAab,KAAiB,EAAA;IAC5C,IAAIN,QAAAA,CAASM,QAAQ,OAAOA,KAAAA;AAE5B,IAAA,MAAMW,QAAQZ,OAAAA,CAAQC,KAAAA,CAAAA;IACtB,IAAIW,KAAAA,KAAU,QAAQA,KAAAA,CAAMnD,MAAM,KAAK,CAAA,EAAG,MAAM,IAAIH,KAAAA,CAAM,qCAAA,CAAA;AAE1D,IAAA,MAAMyD,SAASJ,WAAAA,CAAYC,KAAAA,CAAAA;AAC3B,IAAA,IAAIG,WAAW,KAAA,EAAO;AACpB,QAAA,MAAMC,MAAMC,GAAAA,CAAIC,IAAI,CAACC,IAAI,CAACC,MAAAA,CAAO1B,IAAI,CAACkB,KAAAA,CAAMV,MAAM,EAAEU,KAAAA,CAAMT,UAAU,EAAES,MAAMb,UAAU,CAAA,CAAA;QAEtF,OAAO;AAAE3C,YAAAA,KAAAA,EAAO4D,IAAI5D,KAAK;AAAEC,YAAAA,MAAAA,EAAQ2D,IAAI3D,MAAM;YAAEG,IAAAA,EAAM6C,SAAAA,CAAUW,IAAIxD,IAAI;AAAC,SAAA;AAC1E,IAAA;AAEA,IAAA,IAAIuD,WAAW,MAAA,EAAQ;QACrB,MAAMM,IAAAA,GAAOC,OAAWV,KAAAA,EAAO;YAAEW,SAAAA,EAAW,IAAA;YAAMC,YAAAA,EAAc,IAAA;YAAMC,gBAAAA,EAAkB;AAAI,SAAA,CAAA;QAE5F,OAAO;AAAErE,YAAAA,KAAAA,EAAOiE,KAAKjE,KAAK;AAAEC,YAAAA,MAAAA,EAAQgE,KAAKhE,MAAM;YAAEG,IAAAA,EAAM6C,SAAAA,CAAUgB,KAAK7D,IAAI;AAAC,SAAA;AAC7E,IAAA;AAEA,IAAA,MAAM,IAAIF,KAAAA,CAAM,gDAAA,CAAA;AAClB;AAEA,iHACgBoE,WAAAA,CAAa9C,KAAa,EAAE+C,OAAAA,GAAyB,EAAE,EAAA;AACrE,IAAA,MAAM,EAAEZ,MAAAA,GAAS,KAAK,EAAEa,OAAAA,GAAU,EAAE,EAAE,GAAGD,OAAAA;AAEzC,IAAA,IAAIZ,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAMc,UAAUC,MAAAA,CACd;AAAE1E,YAAAA,KAAAA,EAAOwB,MAAMxB,KAAK;AAAEC,YAAAA,MAAAA,EAAQuB,MAAMvB,MAAM;AAAEG,YAAAA,IAAAA,EAAM,IAAIgC,UAAAA,CAAWZ,KAAAA,CAAMpB,IAAI,CAAC0C,MAAM,EAAEtB,KAAAA,CAAMpB,IAAI,CAAC2C,UAAU,EAAEvB,KAAAA,CAAMpB,IAAI,CAACuC,UAAU;WAChI6B,OAAAA,CAAAA;AAGF,QAAA,OAAOpC,UAAAA,CAAWE,IAAI,CAACmC,OAAAA,CAAQrE,IAAI,CAAA;AACrC,IAAA;IAEA,MAAMwD,GAAAA,GAAM,IAAIC,GAAAA,CAAI;AAAE7D,QAAAA,KAAAA,EAAOwB,MAAMxB,KAAK;AAAEC,QAAAA,MAAAA,EAAQuB,MAAMvB;AAAM,KAAA,CAAA;AAC9D2D,IAAAA,GAAAA,CAAIxD,IAAI,GAAG4D,MAAAA,CAAO1B,IAAI,CAACd,KAAAA,CAAMpB,IAAI,CAAC0C,MAAM,EAAEtB,KAAAA,CAAMpB,IAAI,CAAC2C,UAAU,EAAEvB,KAAAA,CAAMpB,IAAI,CAACuC,UAAU,CAAA;AAEtF,IAAA,OAAOP,WAAWE,IAAI,CAACuB,IAAIC,IAAI,CAACa,KAAK,CAACf,GAAAA,CAAAA,CAAAA;AACxC;AAEA,SAASH,UAAAA,CAAYD,KAAiB,EAAEoB,KAAe,EAAA;AACrD,IAAA,IAAIpB,MAAMnD,MAAM,GAAGuE,KAAAA,CAAMvE,MAAM,EAAE,OAAO,KAAA;AACxC,IAAA,KAAK,MAAM,CAACG,CAAAA,EAAGqE,IAAAA,CAAK,IAAID,KAAAA,CAAME,OAAO,EAAA,CAAI,IAAItB,KAAK,CAAChD,CAAAA,CAAE,KAAKqE,MAAM,OAAO,KAAA;IAEvE,OAAO,IAAA;AACT;;ACtFA;;;;;;;;;;;;;AAaG,gFAGG,SAAUE,YAAavD,KAAa,EAAA;AACxC,IAAA,MAAMwD,MAAM/C,UAAAA,CAAWT,KAAAA,CAAMxB,KAAK,EAAEwB,MAAMvB,MAAM,CAAA;IAChD,MAAMgF,GAAAA,GAAMzD,MAAMpB,IAAI;IACtB,MAAM8E,GAAAA,GAAMF,IAAI5E,IAAI;IAEpB,IAAK,IAAII,CAAAA,GAAI,CAAA,EAAG2E,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAID,GAAAA,CAAI7E,MAAM,EAAEG,CAAAA,IAAK,CAAA,EAAG2E,CAAAA,EAAAA,CAAK;AAClD,QAAA,MAAMrF,CAAAA,GAAImF,GAAG,CAACzE,CAAAA,GAAI,EAAE,GAAG,GAAA;QACvB,MAAMuB,CAAAA,GAAIkD,GAAG,CAACzE,CAAAA,CAAE,GAAGV,CAAAA,GAAI,GAAA,IAAO,CAAA,GAAIA,CAAAA,CAAAA;QAClC,MAAMkC,CAAAA,GAAIiD,GAAG,CAACzE,CAAAA,GAAI,CAAA,CAAE,GAAGV,CAAAA,GAAI,GAAA,IAAO,CAAA,GAAIA,CAAAA,CAAAA;QACtC,MAAMC,CAAAA,GAAIkF,GAAG,CAACzE,CAAAA,GAAI,CAAA,CAAE,GAAGV,CAAAA,GAAI,GAAA,IAAO,CAAA,GAAIA,CAAAA,CAAAA;QACtCoF,GAAG,CAACC,CAAAA,CAAE,GAAG,CAAC,KAAA,GAAQpD,CAAAA,GAAI,KAAA,GAAQC,CAAAA,GAAI,KAAA,GAAQjC,CAAAA,IAAK,GAAA;AACjD,IAAA;IAEA,OAAOiF,GAAAA;AACT;AAEA,8EACM,SAAUI,YAAAA,CAAc5D,KAAgB,EAAA;IAC5C,MAAMpB,IAAAA,GAAO,IAAI0B,iBAAAA,CAAkBN,KAAAA,CAAMxB,KAAK,GAAGwB,KAAAA,CAAMvB,MAAM,GAAG,CAAA,CAAA;AAChE,IAAA,IAAK,IAAIkF,CAAAA,GAAI,CAAA,EAAG3E,CAAAA,GAAI,CAAA,EAAG2E,CAAAA,GAAI3D,KAAAA,CAAMpB,IAAI,CAACC,MAAM,EAAE8E,CAAAA,EAAAA,EAAK3E,KAAK,CAAA,CAAG;AACzD,QAAA,MAAM6E,CAAAA,GAAI7D,KAAAA,CAAMpB,IAAI,CAAC+E,EAAE,GAAG,GAAA;QAC1B/E,IAAI,CAACI,EAAE,GAAG6E,CAAAA;QACVjF,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAG6E,CAAAA;QACdjF,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAG6E,CAAAA;QACdjF,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAG,GAAA;AAChB,IAAA;IAEA,OAAO;AAAER,QAAAA,KAAAA,EAAOwB,MAAMxB,KAAK;AAAEC,QAAAA,MAAAA,EAAQuB,MAAMvB,MAAM;AAAEG,QAAAA;;AACrD;AAEA,4FACM,SAAUkF,aAAAA,CAAe9D,KAAgB,EAAA;AAC7C,IAAA,MAAM,EAAExB,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAGoB,KAAAA;AAChC,IAAA,MAAM+D,SAASvF,KAAAA,GAAQ,CAAA;AACvB,IAAA,MAAMwF,MAAM,IAAIC,YAAAA,CAAaF,MAAAA,IAAUtF,SAAS,CAAA,CAAA,CAAA;AAEhD,IAAA,IAAK,IAAIyF,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,IAAIC,MAAAA,GAAS,CAAA;AACb,QAAA,MAAMC,SAASF,CAAAA,GAAI1F,KAAAA;AACnB,QAAA,MAAM6F,MAAAA,GAAUH,CAAAA,CAAAA,GAAI,CAAA,IAAKH,MAAAA;AACzB,QAAA,MAAMO,UAAUJ,CAAAA,GAAIH,MAAAA;AACpB,QAAA,IAAK,IAAIQ,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;YAC9BJ,MAAAA,IAAUvF,IAAI,CAACwF,MAAAA,GAASG,CAAAA,CAAE;YAC1BP,GAAG,CAACK,MAAAA,GAASE,CAAAA,GAAI,CAAA,CAAE,GAAGP,GAAG,CAACM,OAAAA,GAAUC,CAAAA,GAAI,CAAA,CAAE,GAAGJ,MAAAA;AAC/C,QAAA;AACF,IAAA;IAEA,OAAOH,GAAAA;AACT;AAEA;;;;;AAKG,IACG,SAAUQ,OAAAA,CAASxE,KAAgB,EAAEyE,MAAc,EAAA;AACvD,IAAA,MAAMlE,IAAId,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAKkF,KAAK,CAACF,MAAAA,CAAAA,CAAAA;IACjC,IAAIlE,CAAAA,KAAM,CAAA,EAAG,OAAO,QAAA,CAAA,EAAA,EAAKP,KAAAA,EAAAA;AAAOpB,QAAAA,IAAAA,EAAM8B,YAAAA,CAAaI,IAAI,CAACd,KAAAA,CAAMpB,IAAI;;AAElE,IAAA,MAAM,EAAEJ,KAAK,EAAEC,MAAM,EAAE,GAAGuB,KAAAA;AAC1B,IAAA,MAAMgE,MAAMF,aAAAA,CAAc9D,KAAAA,CAAAA;AAC1B,IAAA,MAAM+D,SAASvF,KAAAA,GAAQ,CAAA;IACvB,MAAMgF,GAAAA,GAAM/C,WAAWjC,KAAAA,EAAOC,MAAAA,CAAAA;AAE9B,IAAA,IAAK,IAAIyF,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAMU,EAAAA,GAAKnF,IAAAA,CAAKiF,GAAG,CAAC,GAAGR,CAAAA,GAAI3D,CAAAA,CAAAA;AAC3B,QAAA,MAAMsE,KAAKpF,IAAAA,CAAKqF,GAAG,CAACrG,MAAAA,EAAQyF,IAAI3D,CAAAA,GAAI,CAAA,CAAA;AACpC,QAAA,MAAMwE,MAAMH,EAAAA,GAAKb,MAAAA;AACjB,QAAA,MAAMiB,SAASH,EAAAA,GAAKd,MAAAA;AAEpB,QAAA,IAAK,IAAIQ,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,MAAMU,EAAAA,GAAKxF,IAAAA,CAAKiF,GAAG,CAAC,GAAGH,CAAAA,GAAIhE,CAAAA,CAAAA;AAC3B,YAAA,MAAM2E,KAAKzF,IAAAA,CAAKqF,GAAG,CAACtG,KAAAA,EAAO+F,IAAIhE,CAAAA,GAAI,CAAA,CAAA;AACnC,YAAA,MAAMN,QAAQ+D,GAAG,CAACgB,SAASE,EAAAA,CAAG,GAAGlB,GAAG,CAACgB,MAAAA,GAASC,GAAG,GAAGjB,GAAG,CAACe,GAAAA,GAAMG,EAAAA,CAAG,GAAGlB,GAAG,CAACe,MAAME,EAAAA,CAAG;AACjFzB,YAAAA,GAAAA,CAAI5E,IAAI,CAACsF,CAAAA,GAAI1F,KAAAA,GAAQ+F,CAAAA,CAAE,GAAGtE,KAAAA,IAAS,CAAC4E,KAAKD,EAAA,KAAOM,EAAAA,GAAKD,EAAA,CAAE,CAAA;AACzD,QAAA;AACF,IAAA;IAEA,OAAOzB,GAAAA;AACT;AAaA;;;;;;AAMG,aACa2B,MAAAA,CAAQC,IAAe,EAAErC,OAAAA,GAAsB,EAAE,EAAA;IAC/D,MAAM,EAAEsC,qBAAqB,CAAA,GAAI,EAAE,EAAEC,KAAAA,GAAQ,IAAI,EAAE,GAAGvC,OAAAA;AACtD,IAAA,MAAM0B,SAAShF,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,KAAKkF,KAAK,CAAClF,IAAAA,CAAKqF,GAAG,CAACM,IAAAA,CAAK5G,KAAK,EAAE4G,IAAAA,CAAK3G,MAAM,CAAA,GAAI4G,kBAAAA,CAAAA,CAAAA;IAC1E,MAAME,UAAAA,GAAaf,QAAQY,IAAAA,EAAMX,MAAAA,CAAAA;AACjC,IAAA,MAAMjB,MAAM/C,UAAAA,CAAW2E,IAAAA,CAAK5G,KAAK,EAAE4G,KAAK3G,MAAM,CAAA;IAE9C,IAAK,IAAIkF,IAAI,CAAA,EAAGA,CAAAA,GAAIH,IAAI5E,IAAI,CAACC,MAAM,EAAE8E,CAAAA,EAAAA,CAAK;QACxC,MAAM6B,EAAAA,GAAK/F,KAAKiF,GAAG,CAACa,WAAW3G,IAAI,CAAC+E,EAAE,EAAE,IAAA,CAAA;AACxC,QAAA,MAAM8B,KAAAA,GAAQL,IAAAA,CAAKxG,IAAI,CAAC+E,EAAE,GAAG6B,EAAAA;AAC7B,QAAA,MAAME,GAAAA,GAAM,CAAA,GAAIjG,IAAAA,CAAKqF,GAAG,CAAC,CAAA,EAAGW,KAAAA,CAAAA;AAC5BjC,QAAAA,GAAAA,CAAI5E,IAAI,CAAC+E,CAAAA,CAAE,GAAG+B,GAAAA,GAAMJ,KAAAA,GAAQ,IAAI7F,IAAAA,CAAKqF,GAAG,CAAC,CAAA,EAAG,CAACY,GAAAA,GAAMJ,KAAA,KAAU,IAAIA,KAAA,CAAA,CAAA;AACnE,IAAA;IAEA,OAAO9B,GAAAA;AACT;AAEA,qEACM,SAAUmC,aAAAA,CAAe3F,KAAgB,EAAA;AAC7C,IAAA,MAAM4F,IAAAA,GAAO,GAAA;IACb,MAAMC,SAAAA,GAAY,IAAI5B,YAAAA,CAAa2B,IAAAA,CAAAA;AACnC,IAAA,KAAK,MAAM1F,KAAAA,IAASF,KAAAA,CAAMpB,IAAI,CAAE;AAC9B,QAAA,MAAMkH,MAAMrG,IAAAA,CAAKqF,GAAG,CAACc,IAAAA,GAAO,GAAGnG,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,KAAKkF,KAAK,CAACzE,KAAAA,IAAS0F,OAAO,CAAA,CAAA,CAAA,CAAA,CAAA;AACtEC,QAAAA,SAAS,CAACC,GAAAA,CAAI,EAAA;AAChB,IAAA;AAEA,IAAA,MAAM7F,KAAAA,GAAQD,KAAAA,CAAMpB,IAAI,CAACC,MAAM;AAC/B,IAAA,IAAIkH,MAAAA,GAAS,CAAA;IACb,IAAK,IAAI/G,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI4G,IAAAA,EAAM5G,IAAK+G,MAAAA,IAAU/G,CAAAA,GAAI6G,SAAS,CAAC7G,CAAAA,CAAE;AAEzD,IAAA,IAAIgH,aAAAA,GAAgB,CAAA;AACpB,IAAA,IAAIC,gBAAAA,GAAmB,CAAA;AACvB,IAAA,IAAIC,IAAAA,GAAO,CAAA;AACX,IAAA,IAAIC,eAAe,EAAC;AAEpB,IAAA,IAAK,IAAIC,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIR,MAAMQ,CAAAA,EAAAA,CAAK;QAC7BH,gBAAAA,IAAoBJ,SAAS,CAACO,CAAAA,CAAE;AAChC,QAAA,IAAIH,qBAAqB,CAAA,EAAG;AAC5B,QAAA,MAAMI,mBAAmBpG,KAAAA,GAAQgG,gBAAAA;AACjC,QAAA,IAAII,qBAAqB,CAAA,EAAG;QAE5BL,aAAAA,IAAiBI,CAAAA,GAAIP,SAAS,CAACO,CAAAA,CAAE;AACjC,QAAA,MAAME,iBAAiBN,aAAAA,GAAgBC,gBAAAA;AACvC,QAAA,MAAMM,cAAAA,GAAkBR,CAAAA,MAAAA,GAASC,aAAA,IAAiBK,gBAAAA;AAClD,QAAA,MAAMG,UAAUP,gBAAAA,GAAmBI,gBAAAA,GAAmB,CAACC,cAAAA,GAAiBC,cAAA,KAAmB,CAAA;AAE3F,QAAA,IAAIC,UAAUL,YAAAA,EAAc;YAC1BA,YAAAA,GAAeK,OAAAA;YACfN,IAAAA,GAAOE,CAAAA;AACT,QAAA;AACF,IAAA;IAEA,OAAOF,IAAAA,IAAQN,IAAAA,GAAO,CAAA,CAAA;AACxB;AAEA;;;;;;AAMG,IACG,SAAUa,QAAAA,CAAUzG,KAAgB,EAAE0G,SAAkB,EAAA;AAC5D,IAAA,MAAMN,IAAI3G,IAAAA,CAAKiF,GAAG,CAACgC,SAAAA,IAAAA,IAAAA,GAAAA,SAAAA,GAAaf,cAAc3F,KAAAA,CAAAA,EAAQ,IAAA,CAAA;AACtD,IAAA,MAAMwD,MAAM7C,YAAAA,CAAaX,KAAAA,CAAMxB,KAAK,EAAEwB,MAAMvB,MAAM,CAAA;IAClD,IAAK,IAAIkF,IAAI,CAAA,EAAGA,CAAAA,GAAIH,IAAI5E,IAAI,CAACC,MAAM,EAAE8E,CAAAA,EAAAA,CAAKH,IAAI5E,IAAI,CAAC+E,EAAE,GAAG3D,KAAAA,CAAMpB,IAAI,CAAC+E,CAAAA,CAAE,GAAGyC,CAAAA,GAAI,CAAA,GAAI,CAAA;IAEhF,OAAO5C,GAAAA;AACT;AAEA;;;;;;AAMG,IACG,SAAUmD,MAAAA,CAAQC,IAAiB,EAAEnC,MAAc,EAAA;AACvD,IAAA,MAAMlE,IAAId,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAKkF,KAAK,CAACF,MAAAA,CAAAA,CAAAA;IACjC,IAAIlE,CAAAA,KAAM,CAAA,EAAG,OAAO,QAAA,CAAA,EAAA,EAAKqG,IAAAA,EAAAA;AAAMhI,QAAAA,IAAAA,EAAMgC,UAAAA,CAAWE,IAAI,CAAC8F,IAAAA,CAAKhI,IAAI;;AAE9D,IAAA,MAAM,EAAEJ,KAAK,EAAEC,MAAM,EAAE,GAAGmI,IAAAA;IAC1B,MAAMC,UAAAA,GAAa,IAAIjG,UAAAA,CAAWpC,KAAAA,GAAQC,MAAAA,CAAAA;AAE1C,IAAA,IAAK,IAAIyF,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAM4C,MAAM5C,CAAAA,GAAI1F,KAAAA;AAChB,QAAA,IAAK,IAAI+F,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,IAAIzE,GAAAA,GAAM,CAAA;AACV,YAAA,MAAMgB,IAAAA,GAAOrB,IAAAA,CAAKiF,GAAG,CAAC,GAAGH,CAAAA,GAAIhE,CAAAA,CAAAA;AAC7B,YAAA,MAAMwG,KAAKtH,IAAAA,CAAKqF,GAAG,CAACtG,KAAAA,GAAQ,GAAG+F,CAAAA,GAAIhE,CAAAA,CAAAA;AACnC,YAAA,IAAK,IAAIyG,CAAAA,GAAIlG,IAAAA,EAAMkG,CAAAA,IAAKD,EAAAA,EAAIC,CAAAA,EAAAA,CAC1B,IAAIJ,IAAAA,CAAKhI,IAAI,CAACkI,GAAAA,GAAME,CAAAA,CAAE,KAAK,CAAA,EAAG;gBAC5BlH,GAAAA,GAAM,CAAA;AACN,gBAAA;AACF,YAAA;YACF+G,UAAU,CAACC,GAAAA,GAAMvC,CAAAA,CAAE,GAAGzE,GAAAA;AACxB,QAAA;AACF,IAAA;IAEA,MAAM0D,GAAAA,GAAM7C,aAAanC,KAAAA,EAAOC,MAAAA,CAAAA;AAChC,IAAA,IAAK,IAAIyF,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAMpD,IAAAA,GAAOrB,IAAAA,CAAKiF,GAAG,CAAC,GAAGR,CAAAA,GAAI3D,CAAAA,CAAAA;AAC7B,QAAA,MAAMwG,KAAKtH,IAAAA,CAAKqF,GAAG,CAACrG,MAAAA,GAAS,GAAGyF,CAAAA,GAAI3D,CAAAA,CAAAA;AACpC,QAAA,IAAK,IAAIgE,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,IAAIzE,GAAAA,GAAM,CAAA;AACV,YAAA,IAAK,IAAIkH,CAAAA,GAAIlG,IAAAA,EAAMkG,CAAAA,IAAKD,EAAAA,EAAIC,CAAAA,EAAAA,CAC1B,IAAIH,UAAU,CAACG,CAAAA,GAAIxI,KAAAA,GAAQ+F,CAAAA,CAAE,KAAK,CAAA,EAAG;gBACnCzE,GAAAA,GAAM,CAAA;AACN,gBAAA;AACF,YAAA;AACF0D,YAAAA,GAAAA,CAAI5E,IAAI,CAACsF,CAAAA,GAAI1F,KAAAA,GAAQ+F,EAAE,GAAGzE,GAAAA;AAC5B,QAAA;AACF,IAAA;IAEA,OAAO0D,GAAAA;AACT;AAEA,sFACM,SAAUyD,SAAUL,IAAiB,EAAE3B,KAAK,CAAC,EAAEL,EAAAA,GAAK,CAAC,EAAEM,EAAAA,GAAK0B,IAAAA,CAAKpI,KAAK,EAAEqG,EAAAA,GAAK+B,KAAKnI,MAAM,EAAA;AAC5F,IAAA,MAAMyI,OAAOzH,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAK6F,KAAK,CAACL,EAAAA,CAAAA,CAAAA;AACpC,IAAA,MAAMF,MAAMtF,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAK6F,KAAK,CAACV,EAAAA,CAAAA,CAAAA;IACnC,MAAMuC,KAAAA,GAAQ1H,KAAKqF,GAAG,CAAC8B,KAAKpI,KAAK,EAAEiB,IAAAA,CAAK2H,IAAI,CAAClC,EAAAA,CAAAA,CAAAA;IAC7C,MAAMF,MAAAA,GAASvF,KAAKqF,GAAG,CAAC8B,KAAKnI,MAAM,EAAEgB,IAAAA,CAAK2H,IAAI,CAACvC,EAAAA,CAAAA,CAAAA;AAC/C,IAAA,IAAIsC,KAAAA,IAASD,IAAAA,IAAQlC,MAAAA,IAAUD,GAAAA,EAAK,OAAO,CAAA;AAE3C,IAAA,IAAIsC,IAAAA,GAAO,CAAA;AACX,IAAA,IAAK,IAAInD,CAAAA,GAAIa,GAAAA,EAAKb,CAAAA,GAAIc,QAAQd,CAAAA,EAAAA,CAAK;QACjC,MAAM4C,GAAAA,GAAM5C,CAAAA,GAAI0C,IAAAA,CAAKpI,KAAK;QAC1B,IAAK,IAAI+F,CAAAA,GAAI2C,IAAAA,EAAM3C,CAAAA,GAAI4C,KAAAA,EAAO5C,CAAAA,EAAAA,CAAK8C,IAAAA,IAAQT,IAAAA,CAAKhI,IAAI,CAACkI,GAAAA,GAAMvC,CAAAA,CAAE;AAC/D,IAAA;IAEA,OAAO8C,IAAAA,IAASF,CAAAA,KAAAA,GAAQD,IAAA,KAASlC,MAAAA,GAASD,GAAA,CAAG,CAAA;AAC/C;;ACvPA;;;;;;;;+EAWgBuC,WAAY7D,GAAc,EAAEjF,KAAa,EAAEC,MAAc,EAAA;IACvE,IAAID,KAAAA,KAAUiF,IAAIjF,KAAK,IAAIC,WAAWgF,GAAAA,CAAIhF,MAAM,EAAE,OAAO,QAAA,CAAA,EAAA,EAAKgF,GAAAA,EAAAA;AAAK7E,QAAAA,IAAAA,EAAM8B,YAAAA,CAAaI,IAAI,CAAC2C,GAAAA,CAAI7E,IAAI;;AAEnG,IAAA,MAAMiI,UAAAA,GAAa,IAAInG,YAAAA,CAAalC,KAAAA,GAAQiF,IAAIhF,MAAM,CAAA;IACtD8I,YAAAA,CAAa9D,GAAAA,CAAI7E,IAAI,EAAE6E,GAAAA,CAAIjF,KAAK,EAAEiF,GAAAA,CAAIhF,MAAM,EAAEoI,UAAAA,EAAYrI,KAAAA,CAAAA;IAE1D,MAAMgF,GAAAA,GAAM/C,WAAWjC,KAAAA,EAAOC,MAAAA,CAAAA;AAC9B+I,IAAAA,eAAAA,CAAgBX,YAAYrI,KAAAA,EAAOiF,GAAAA,CAAIhF,MAAM,EAAE+E,GAAAA,CAAI5E,IAAI,EAAEH,MAAAA,CAAAA;IAEzD,OAAO+E,GAAAA;AACT;AAEA;;;;;AAKG,IACG,SAAUiE,aAAAA,CAAehE,GAAc,EAAEiE,YAAoB,EAAA;IACjE,MAAMC,OAAAA,GAAUlI,KAAKiF,GAAG,CAACjB,IAAIjF,KAAK,EAAEiF,IAAIhF,MAAM,CAAA;IAC9C,IAAIkJ,OAAAA,IAAWD,cAAc,OAAO;AAAE1H,QAAAA,KAAAA,EAAO,QAAA,CAAA,EAAA,EAAKyD,GAAAA,EAAAA;AAAK7E,YAAAA,IAAAA,EAAM8B,YAAAA,CAAaI,IAAI,CAAC2C,GAAAA,CAAI7E,IAAI;;QAAKgJ,KAAAA,EAAO;AAAC,KAAA;AAEpG,IAAA,MAAMA,QAAQF,YAAAA,GAAeC,OAAAA;IAC7B,MAAMnJ,KAAAA,GAAQiB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,KAAKkF,KAAK,CAAClB,GAAAA,CAAIjF,KAAK,GAAGoJ,KAAAA,CAAAA,CAAAA;IACjD,MAAMnJ,MAAAA,GAASgB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,KAAKkF,KAAK,CAAClB,GAAAA,CAAIhF,MAAM,GAAGmJ,KAAAA,CAAAA,CAAAA;;IAGnD,OAAO;QAAE5H,KAAAA,EAAOsH,UAAAA,CAAW7D,KAAKjF,KAAAA,EAAOC,MAAAA,CAAAA;QAASmJ,KAAAA,EAAOpJ,KAAAA,GAAQiF,IAAIjF;;AACrE;AAEA;;;;;;;AAOG,IACG,SAAUqJ,aAAAA,CAAepE,GAAW,EAAEgB,MAAc,EAAA;AACxD,IAAA,MAAMlE,IAAId,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAKkF,KAAK,CAACF,MAAAA,CAAAA,CAAAA;IACjC,IAAIlE,CAAAA,KAAM,CAAA,EAAG,OAAO,QAAA,CAAA,EAAA,EAAKkD,GAAAA,EAAAA;AAAK7E,QAAAA,IAAAA,EAAM0B,iBAAAA,CAAkBQ,IAAI,CAAC2C,GAAAA,CAAI7E,IAAI;;AAEnE,IAAA,MAAM,EAAEJ,KAAK,EAAEC,MAAM,EAAE,GAAGgF,GAAAA;AAC1B,IAAA,MAAMqE,IAAAA,GAAO,IAAIxH,iBAAAA,CAAkB9B,KAAAA,GAAQC,MAAAA,GAAS,CAAA,CAAA;IACpD,MAAMsJ,IAAAA,GAAO,IAAIC,UAAAA,CAAW,CAAA,CAAA;AAE5B,IAAA,IAAK,IAAI9D,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;QAC/B,MAAM4C,GAAAA,GAAM5C,IAAI1F,KAAAA,GAAQ,CAAA;AACxBuJ,QAAAA,IAAAA,CAAK3H,IAAI,CAAC,CAAA,CAAA;AACV,QAAA,IAAI6H,KAAAA,GAAQ,CAAA;AACZ,QAAA,IAAK,IAAI1D,CAAAA,GAAI,CAAA,EAAGA,CAAAA,IAAK9E,IAAAA,CAAKqF,GAAG,CAACvE,CAAAA,EAAG/B,KAAAA,GAAQ,CAAA,CAAA,EAAI+F,CAAAA,EAAAA,EAAK0D,KAAAA,EAAAA,CAChD,IAAK,IAAIC,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,CAAA,EAAGA,CAAAA,EAAAA,CAAKH,IAAI,CAACG,CAAAA,CAAE,IAAIzE,GAAAA,CAAI7E,IAAI,CAACkI,GAAAA,GAAMvC,CAAAA,GAAI,IAAI2D,CAAAA,CAAE;AAElE,QAAA,IAAK,IAAI3D,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,IAAK,IAAI2D,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,CAAA,EAAGA,IAAKJ,IAAI,CAAChB,GAAAA,GAAMvC,CAAAA,GAAI,IAAI2D,CAAAA,CAAE,GAAGH,IAAI,CAACG,EAAE,GAAGD,KAAAA;AAE9D,YAAA,MAAME,UAAU5D,CAAAA,GAAIhE,CAAAA;YACpB,MAAM6H,QAAAA,GAAW7D,IAAIhE,CAAAA,GAAI,CAAA;AACzB,YAAA,IAAI4H,WAAW,CAAA,EAAG;AAChB,gBAAA,IAAK,IAAID,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,CAAA,EAAGA,IAAKH,IAAI,CAACG,CAAAA,CAAE,IAAIzE,IAAI7E,IAAI,CAACkI,GAAAA,GAAMqB,OAAAA,GAAU,IAAID,CAAAA,CAAE;AACtED,gBAAAA,KAAAA,EAAAA;AACF,YAAA;AACA,YAAA,IAAIG,WAAW5J,KAAAA,EAAO;AACpB,gBAAA,IAAK,IAAI0J,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,CAAA,EAAGA,IAAKH,IAAI,CAACG,CAAAA,CAAE,IAAIzE,IAAI7E,IAAI,CAACkI,GAAAA,GAAMsB,QAAAA,GAAW,IAAIF,CAAAA,CAAE;AACvED,gBAAAA,KAAAA,EAAAA;AACF,YAAA;AACF,QAAA;AACF,IAAA;AAEA,IAAA,MAAMzE,GAAAA,GAAM,IAAIlD,iBAAAA,CAAkB9B,KAAAA,GAAQC,MAAAA,GAAS,CAAA,CAAA;IACnD,MAAM4J,UAAAA,GAAa,IAAIL,UAAAA,CAAWxJ,KAAAA,GAAQ,CAAA,CAAA;AAC1C,IAAA,IAAIyJ,KAAAA,GAAQ,CAAA;AACZ,IAAA,IAAK,IAAI/D,CAAAA,GAAI,CAAA,EAAGA,CAAAA,IAAKzE,IAAAA,CAAKqF,GAAG,CAACvE,CAAAA,EAAG9B,MAAAA,GAAS,CAAA,CAAA,EAAIyF,CAAAA,EAAAA,EAAK+D,KAAAA,EAAAA,CACjD,IAAK,IAAIjJ,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIR,KAAAA,GAAQ,CAAA,EAAGQ,CAAAA,EAAAA,CAAKqJ,UAAU,CAACrJ,CAAAA,CAAE,IAAI8I,IAAI,CAAC5D,CAAAA,GAAI1F,KAAAA,GAAQ,IAAIQ,CAAAA,CAAE;AAE9E,IAAA,IAAK,IAAIkF,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;QAC/B,MAAM4C,GAAAA,GAAM5C,IAAI1F,KAAAA,GAAQ,CAAA;AACxB,QAAA,IAAK,IAAIQ,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIR,QAAQ,CAAA,EAAGQ,CAAAA,EAAAA,CAAKwE,GAAG,CAACsD,MAAM9H,CAAAA,CAAE,GAAGqJ,UAAU,CAACrJ,EAAE,GAAGiJ,KAAAA;AAEnE,QAAA,MAAME,UAAUjE,CAAAA,GAAI3D,CAAAA;QACpB,MAAM6H,QAAAA,GAAWlE,IAAI3D,CAAAA,GAAI,CAAA;AACzB,QAAA,IAAI4H,WAAW,CAAA,EAAG;AAChB,YAAA,IAAK,IAAInJ,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIR,KAAAA,GAAQ,GAAGQ,CAAAA,EAAAA,CAAKqJ,UAAU,CAACrJ,CAAAA,CAAE,IAAI8I,IAAI,CAACK,OAAAA,GAAU3J,KAAAA,GAAQ,IAAIQ,CAAAA,CAAE;AAClFiJ,YAAAA,KAAAA,EAAAA;AACF,QAAA;AACA,QAAA,IAAIG,WAAW3J,MAAAA,EAAQ;AACrB,YAAA,IAAK,IAAIO,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIR,KAAAA,GAAQ,GAAGQ,CAAAA,EAAAA,CAAKqJ,UAAU,CAACrJ,CAAAA,CAAE,IAAI8I,IAAI,CAACM,QAAAA,GAAW5J,KAAAA,GAAQ,IAAIQ,CAAAA,CAAE;AACnFiJ,YAAAA,KAAAA,EAAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAO;AAAEzJ,QAAAA,KAAAA;AAAOC,QAAAA,MAAAA;QAAQG,IAAAA,EAAM4E;AAAG,KAAA;AACnC;AAEA,SAAS+D,YAAAA,CACP9D,GAAiB,EACjB6E,QAAgB,EAChBC,IAAY,EACZ7E,GAAiB,EACjB8E,QAAgB,EAAA;AAEhB,IAAA,MAAM/C,QAAQ6C,QAAAA,GAAWE,QAAAA;AAEzB,IAAA,IAAI/C,QAAQ,CAAA,EAAG;AACb,QAAA,IAAK,IAAIvB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIqE,MAAMrE,CAAAA,EAAAA,CAAK;AAC7B,YAAA,MAAME,SAASF,CAAAA,GAAIoE,QAAAA;AACnB,YAAA,MAAMjE,SAASH,CAAAA,GAAIsE,QAAAA;AACnB,YAAA,IAAK,IAAIjE,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIiE,UAAUjE,CAAAA,EAAAA,CAAK;AACjC,gBAAA,MAAMkE,QAAQlE,CAAAA,GAAIkB,KAAAA;AAClB,gBAAA,MAAMiD,MAAMD,KAAAA,GAAQhD,KAAAA;gBACpB/B,GAAG,CAACW,SAASE,CAAAA,CAAE,GAAGoE,YAAYlF,GAAAA,EAAKW,MAAAA,EAAQkE,UAAUG,KAAAA,EAAOC,GAAAA,CAAAA;AAC9D,YAAA;AACF,QAAA;AAEA,QAAA;AACF,IAAA;AAEA,IAAA,IAAK,IAAIxE,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIqE,MAAMrE,CAAAA,EAAAA,CAAK;AAC7B,QAAA,MAAME,SAASF,CAAAA,GAAIoE,QAAAA;AACnB,QAAA,MAAMjE,SAASH,CAAAA,GAAIsE,QAAAA;AACnB,QAAA,IAAK,IAAIjE,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIiE,UAAUjE,CAAAA,EAAAA,CAAK;YACjC,MAAMqE,GAAAA,GAAMC,OAAAA,CAAOtE,CAAAA,CAAAA,GAAI,OAAOkB,KAAAA,GAAQ,GAAA,EAAK,CAAA,EAAG6C,QAAAA,GAAW,CAAA,CAAA;YACzD,MAAMQ,EAAAA,GAAKrJ,IAAAA,CAAK6F,KAAK,CAACsD,GAAAA,CAAAA;AACtB,YAAA,MAAMG,KAAKtJ,IAAAA,CAAKqF,GAAG,CAACwD,QAAAA,GAAW,GAAGQ,EAAAA,GAAK,CAAA,CAAA;AACvC,YAAA,MAAME,OAAOJ,GAAAA,GAAME,EAAAA;AACnBpF,YAAAA,GAAG,CAACW,MAAAA,GAASE,CAAAA,CAAE,GAAGd,GAAG,CAACW,MAAAA,GAAS0E,EAAAA,CAAG,IAAI,IAAIE,IAAA,CAAA,GAAQvF,GAAG,CAACW,MAAAA,GAAS2E,GAAG,GAAGC,IAAAA;AACvE,QAAA;AACF,IAAA;AACF;AAEA,SAASxB,eAAAA,CACP/D,GAAiB,EACjBjF,KAAa,EACbyK,SAAiB,EACjBvF,GAAiB,EACjBwF,SAAiB,EAAA;AAEjB,IAAA,MAAMzD,QAAQwD,SAAAA,GAAYC,SAAAA;IAC1B,MAAMC,MAAAA,GAAS,IAAIzI,YAAAA,CAAauI,SAAAA,CAAAA;AAEhC,IAAA,IAAK,IAAI1E,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,QAAA,IAAK,IAAIL,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI+E,WAAW/E,CAAAA,EAAAA,CAAKiF,MAAM,CAACjF,CAAAA,CAAE,GAAGT,GAAG,CAACS,CAAAA,GAAI1F,QAAQ+F,CAAAA,CAAE;QAElE,IAAIkB,KAAAA,GAAQ,GACV,IAAK,IAAIvB,IAAI,CAAA,EAAGA,CAAAA,GAAIgF,WAAWhF,CAAAA,EAAAA,CAAK;AAClC,YAAA,MAAMuE,QAAQvE,CAAAA,GAAIuB,KAAAA;YAClB/B,GAAG,CAACQ,CAAAA,GAAI1F,KAAAA,GAAQ+F,CAAAA,CAAE,GAAGoE,YAAYQ,MAAAA,EAAQ,CAAA,EAAGF,SAAAA,EAAWR,KAAAA,EAAOA,KAAAA,GAAQhD,KAAAA,CAAAA;AACxE,QAAA;AAEA,aAAA,IAAK,IAAIvB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIgF,WAAWhF,CAAAA,EAAAA,CAAK;YAClC,MAAM0E,GAAAA,GAAMC,OAAAA,CAAO3E,CAAAA,CAAAA,GAAI,OAAOuB,KAAAA,GAAQ,GAAA,EAAK,CAAA,EAAGwD,SAAAA,GAAY,CAAA,CAAA;YAC1D,MAAMH,EAAAA,GAAKrJ,IAAAA,CAAK6F,KAAK,CAACsD,GAAAA,CAAAA;AACtB,YAAA,MAAMG,KAAKtJ,IAAAA,CAAKqF,GAAG,CAACmE,SAAAA,GAAY,GAAGH,EAAAA,GAAK,CAAA,CAAA;AACxC,YAAA,MAAME,OAAOJ,GAAAA,GAAME,EAAAA;AACnBpF,YAAAA,GAAG,CAACQ,CAAAA,GAAI1F,KAAAA,GAAQ+F,CAAAA,CAAE,GAAG4E,MAAM,CAACL,EAAAA,CAAG,IAAI,IAAIE,IAAA,CAAA,GAAQG,MAAM,CAACJ,GAAG,GAAGC,IAAAA;AAC9D,QAAA;AACJ,IAAA;AACF;AAEA,gGACA,SAASL,WAAAA,CAAalF,GAAiB,EAAE2F,MAAc,EAAEvK,MAAc,EAAE4J,KAAa,EAAEC,GAAW,EAAA;AACjG,IAAA,MAAM5H,OAAOrB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAK6F,KAAK,CAACmD,KAAAA,CAAAA,CAAAA;AACpC,IAAA,MAAM1B,KAAKtH,IAAAA,CAAKqF,GAAG,CAACjG,MAAAA,EAAQY,IAAAA,CAAK2H,IAAI,CAACsB,GAAAA,CAAAA,CAAAA;AACtC,IAAA,IAAIzI,KAAAA,GAAQ,CAAA;AACZ,IAAA,IAAIoJ,MAAAA,GAAS,CAAA;AAEb,IAAA,IAAK,IAAIrK,CAAAA,GAAI8B,IAAAA,EAAM9B,CAAAA,GAAI+H,IAAI/H,CAAAA,EAAAA,CAAK;QAC9B,MAAMsK,CAAAA,GAAI7J,IAAAA,CAAKqF,GAAG,CAAC4D,GAAAA,EAAK1J,IAAI,CAAA,CAAA,GAAKS,IAAAA,CAAKiF,GAAG,CAAC+D,KAAAA,EAAOzJ,CAAAA,CAAAA;AACjD,QAAA,IAAIsK,KAAK,CAAA,EAAG;AACZrJ,QAAAA,KAAAA,IAASwD,GAAG,CAAC2F,MAAAA,GAASpK,CAAAA,CAAE,GAAGsK,CAAAA;QAC3BD,MAAAA,IAAUC,CAAAA;AACZ,IAAA;IAEA,OAAOD,MAAAA,GAAS,CAAA,GAAIpJ,KAAAA,GAAQoJ,MAAAA,GAAS,CAAA;AACvC;AAEA,SAASR,OAAAA,CAAO3I,KAAa,EAAE4E,GAAW,EAAEJ,GAAW,EAAA;AACrD,IAAA,OAAOxE,QAAQ4E,GAAAA,GAAMA,GAAAA,GAAOrF,IAAAA,CAAKqF,GAAG,CAAC5E,KAAAA,EAAOwE,GAAAA,CAAAA;AAC9C;;ACrKA,2DACM,SAAU6E,UAAAA,CACdC,MAAc,EACdC,MAAe,EACfjL,KAAa,EACbC,MAAc,EACdsE,OAAAA,GAAuB,EAAE,EAAA;AAEzB,IAAA,MAAM,EACJwC,UAAAA,GAAa;AAAC,QAAA,GAAA;AAAK,QAAA,GAAA;AAAK,QAAA,GAAA;AAAK,QAAA;AAAI,KAAA,EACjCmE,gBAAgB,UAAU,EAC1BC,SAAAA,GAAY,IAAI,EACjB,GAAG5G,OAAAA;AAEJ,IAAA,MAAMU,GAAAA,GAAMkG,SAAAA,GAAYC,cAAAA,CAAeJ,MAAAA,EAAQC,MAAAA,CAAAA,GAAUD,MAAAA;AACzD,IAAA,MAAM5K,IAAAA,GAAO,IAAI0B,iBAAAA,CAAkB9B,KAAAA,GAAQC,MAAAA,GAAS,CAAA,CAAA;IACpD,MAAM,CAACoL,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,EAAIC,IAAIC,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,CAAG,GAAGZ,MAAAA;AAE7C,IAAA,IAAK,IAAIvF,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAMoG,KAAKpG,CAAAA,GAAI,GAAA;QACf,IAAIlF,CAAAA,GAAIkF,IAAI1F,KAAAA,GAAQ,CAAA;AAEpB,QAAA,IAAK,IAAI+F,CAAAA,GAAI,CAAA,EAAGA,IAAI/F,KAAAA,EAAO+F,CAAAA,EAAAA,EAAKvF,KAAK,CAAA,CAAG;AACtC,YAAA,MAAMuL,KAAKhG,CAAAA,GAAI,GAAA;AACf,YAAA,MAAM+E,CAAAA,GAAIa,EAAAA,GAAKI,EAAAA,GAAKH,EAAAA,GAAKE,EAAAA,GAAKD,EAAAA;AAC9B,YAAA,IAAIf,MAAM,CAAA,EAAG;AACXkB,gBAAAA,UAAAA,CAAW5L,MAAMI,CAAAA,EAAGuG,UAAAA,CAAAA;AACpB,gBAAA;AACF,YAAA;;;YAIA,MAAMkF,CAAAA,GAAI,CAACZ,EAAAA,GAAKU,KAAKT,EAAAA,GAAKQ,EAAAA,GAAKP,EAAA,IAAMT,CAAAA,GAAI,GAAA;YACzC,MAAMzF,CAAAA,GAAI,CAACmG,EAAAA,GAAKO,KAAKN,EAAAA,GAAKK,EAAAA,GAAKJ,EAAA,IAAMZ,CAAAA,GAAI,GAAA;AAEzC,YAAA,IAAImB,CAAAA,GAAI,EAAC,IAAK5G,CAAAA,GAAI,EAAC,IAAK4G,CAAAA,GAAIhH,GAAAA,CAAIjF,KAAK,IAAIqF,CAAAA,GAAIJ,GAAAA,CAAIhF,MAAM,EAAE;AACvD+L,gBAAAA,UAAAA,CAAW5L,MAAMI,CAAAA,EAAGuG,UAAAA,CAAAA;AACpB,gBAAA;AACF,YAAA;AAEAmF,YAAAA,YAAAA,CAAajH,GAAAA,EAAKgH,CAAAA,EAAG5G,CAAAA,EAAG6F,aAAAA,EAAe9K,IAAAA,EAAMI,CAAAA,CAAAA;AAC/C,QAAA;AACF,IAAA;IAEA,OAAO;AAAER,QAAAA,KAAAA;AAAOC,QAAAA,MAAAA;AAAQG,QAAAA;;AAC1B;AAEA,6EACM,SAAU+L,QAAAA,CACdnB,MAAiB,EACjBC,MAAe,EACfjL,KAAa,EACbC,MAAc,EACd2B,OAAO,CAAC,EAAA;IAER,MAAMoD,GAAAA,GAAM/C,WAAWjC,KAAAA,EAAOC,MAAAA,CAAAA;IAC9B,MAAM,CAACoL,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,EAAIC,IAAIC,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,EAAIC,EAAAA,CAAG,GAAGZ,MAAAA;AAE7C,IAAA,IAAK,IAAIvF,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAMoG,KAAKpG,CAAAA,GAAI,GAAA;AACf,QAAA,MAAM4C,MAAM5C,CAAAA,GAAI1F,KAAAA;AAEhB,QAAA,IAAK,IAAI+F,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,MAAMgG,KAAKhG,CAAAA,GAAI,GAAA;AACf,YAAA,MAAM+E,CAAAA,GAAIa,EAAAA,GAAKI,EAAAA,GAAKH,EAAAA,GAAKE,EAAAA,GAAKD,EAAAA;AAC9B,YAAA,IAAIf,MAAM,CAAA,EAAG;AACX9F,gBAAAA,GAAAA,CAAI5E,IAAI,CAACkI,GAAAA,GAAMvC,CAAAA,CAAE,GAAGnE,IAAAA;AACpB,gBAAA;AACF,YAAA;YAEA,MAAMqK,CAAAA,GAAI,CAACZ,EAAAA,GAAKU,KAAKT,EAAAA,GAAKQ,EAAAA,GAAKP,EAAA,IAAMT,CAAAA,GAAI,GAAA;YACzC,MAAMzF,CAAAA,GAAI,CAACmG,EAAAA,GAAKO,KAAKN,EAAAA,GAAKK,EAAAA,GAAKJ,EAAA,IAAMZ,CAAAA,GAAI,GAAA;YACzC9F,GAAAA,CAAI5E,IAAI,CAACkI,GAAAA,GAAMvC,CAAAA,CAAE,GAAGqG,kBAAAA,CAAmBpB,MAAAA,EAAQiB,GAAG5G,CAAAA,EAAGzD,IAAAA,CAAAA;AACvD,QAAA;AACF,IAAA;IAEA,OAAOoD,GAAAA;AACT;AAEA,gFACM,SAAUoH,kBAAAA,CAAoB5K,KAAgB,EAAEyK,CAAS,EAAE5G,CAAS,EAAEzD,IAAAA,GAAO,CAAC,EAAA;AAClF,IAAA,MAAM,EAAE5B,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAGoB,KAAAA;IAChC,IAAIyK,CAAAA,IAAK,EAAC,IAAK5G,CAAAA,IAAK,MAAM4G,CAAAA,IAAKjM,KAAAA,IAASqF,CAAAA,IAAKpF,MAAAA,EAAQ,OAAO2B,IAAAA;IAE5D,MAAM6E,EAAAA,GAAKxF,IAAAA,CAAK6F,KAAK,CAACmF,CAAAA,CAAAA;IACtB,MAAM7F,EAAAA,GAAKnF,IAAAA,CAAK6F,KAAK,CAACzB,CAAAA,CAAAA;AACtB,IAAA,MAAMgH,KAAKJ,CAAAA,GAAIxF,EAAAA;AACf,IAAA,MAAM6F,KAAKjH,CAAAA,GAAIe,EAAAA;AACf,IAAA,MAAMM,KAAKD,EAAAA,GAAK,CAAA;AAChB,IAAA,MAAMJ,KAAKD,EAAAA,GAAK,CAAA;IAEhB,MAAMmG,GAAAA,GAAMC,WAAW/F,EAAAA,EAAIzG,KAAAA,CAAAA;IAC3B,MAAMyM,GAAAA,GAAMD,WAAW9F,EAAAA,EAAI1G,KAAAA,CAAAA;IAC3B,MAAM0M,GAAAA,GAAMF,WAAWpG,EAAAA,EAAInG,MAAAA,CAAAA;IAC3B,MAAM0M,GAAAA,GAAMH,WAAWnG,EAAAA,EAAIpG,MAAAA,CAAAA;AAE3B,IAAA,MAAM2M,GAAAA,GAAMxM,IAAI,CAACsM,GAAAA,GAAM1M,QAAQuM,GAAAA,CAAI;AACnC,IAAA,MAAMM,GAAAA,GAAMzM,IAAI,CAACsM,GAAAA,GAAM1M,QAAQyM,GAAAA,CAAI;AACnC,IAAA,MAAMK,GAAAA,GAAM1M,IAAI,CAACuM,GAAAA,GAAM3M,QAAQuM,GAAAA,CAAI;AACnC,IAAA,MAAMQ,GAAAA,GAAM3M,IAAI,CAACuM,GAAAA,GAAM3M,QAAQyM,GAAAA,CAAI;IAEnC,OACEG,GAAAA,IAAO,CAAA,GAAIP,EAAA,KAAO,CAAA,GAAIC,MACtBO,GAAAA,GAAMR,EAAAA,IAAM,CAAA,GAAIC,MAChBQ,GAAAA,IAAO,IAAIT,EAAA,CAAA,GAAMC,EAAAA,GACjBS,GAAAA,GAAMV,EAAAA,GAAKC,EAAAA;AAEf;AAEA;;;;;;AAMG,IACH,SAASlB,cAAAA,CAAgBJ,MAAc,EAAEC,MAAe,EAAA;AACtD,IAAA,MAAM+B,MAAM/L,IAAAA,CAAKgM,GAAG,CAAChC,MAAM,CAAC,EAAE,GAAGA,MAAM,CAAC,CAAA,CAAE,GAAGA,MAAM,CAAC,EAAE,GAAGA,MAAM,CAAC,CAAA,CAAE,CAAA;IAClE,MAAM7B,KAAAA,GAAQnI,IAAAA,CAAKC,IAAI,CAAC8L,GAAAA,CAAAA;AACxB,IAAA,IAAI,CAAC9J,MAAAA,CAAOgK,QAAQ,CAAC9D,KAAAA,CAAAA,IAAUA,KAAAA,IAAS,MAAM,OAAO4B,MAAAA;AAErD,IAAA,OAAO3B,cAAc2B,MAAAA,EAAS5B,CAAAA,KAAAA,GAAQ,CAAA,IAAK,CAAA,CAAA;AAC7C;AAEA,SAAS8C,YAAAA,CACPjH,GAAW,EACXgH,CAAS,EACT5G,CAAS,EACT6F,aAA4B,EAC5BlG,GAAsB,EACtBmI,EAAU,EAAA;AAEV,IAAA,IAAIjC,kBAAkB,SAAA,EAAW;AAC/B,QAAA,MAAMnF,IAAIyG,UAAAA,CAAWvL,IAAAA,CAAKkF,KAAK,CAAC8F,CAAAA,CAAAA,EAAIhH,IAAIjF,KAAK,CAAA;AAC7C,QAAA,MAAM0F,IAAI8G,UAAAA,CAAWvL,IAAAA,CAAKkF,KAAK,CAACd,CAAAA,CAAAA,EAAIJ,IAAIhF,MAAM,CAAA;QAC9C,MAAMO,CAAAA,GAAI,CAACkF,CAAAA,GAAIT,IAAIjF,KAAK,GAAG+F,CAAAA,IAAK,CAAA;AAChCf,QAAAA,GAAG,CAACmI,EAAAA,CAAG,GAAGlI,GAAAA,CAAI7E,IAAI,CAACI,CAAAA,CAAE;QACrBwE,GAAG,CAACmI,KAAK,CAAA,CAAE,GAAGlI,IAAI7E,IAAI,CAACI,IAAI,CAAA,CAAE;QAC7BwE,GAAG,CAACmI,KAAK,CAAA,CAAE,GAAGlI,IAAI7E,IAAI,CAACI,IAAI,CAAA,CAAE;QAC7BwE,GAAG,CAACmI,KAAK,CAAA,CAAE,GAAGlI,IAAI7E,IAAI,CAACI,IAAI,CAAA,CAAE;AAE7B,QAAA;AACF,IAAA;AAEA,IAAA,IAAI0K,kBAAkB,SAAA,EAAW;QAC/BkC,aAAAA,CAAcnI,GAAAA,EAAKgH,CAAAA,EAAG5G,CAAAA,EAAGL,GAAAA,EAAKmI,EAAAA,CAAAA;AAE9B,QAAA;AACF,IAAA;IAEA,MAAM1G,EAAAA,GAAKxF,IAAAA,CAAK6F,KAAK,CAACmF,CAAAA,CAAAA;IACtB,MAAM7F,EAAAA,GAAKnF,IAAAA,CAAK6F,KAAK,CAACzB,CAAAA,CAAAA;AACtB,IAAA,MAAMgH,KAAKJ,CAAAA,GAAIxF,EAAAA;AACf,IAAA,MAAM6F,KAAKjH,CAAAA,GAAIe,EAAAA;AACf,IAAA,MAAMmG,GAAAA,GAAMC,UAAAA,CAAW/F,EAAAA,EAAIxB,GAAAA,CAAIjF,KAAK,CAAA;AACpC,IAAA,MAAMyM,GAAAA,GAAMD,UAAAA,CAAW/F,EAAAA,GAAK,CAAA,EAAGxB,IAAIjF,KAAK,CAAA;AACxC,IAAA,MAAM0M,GAAAA,GAAMF,UAAAA,CAAWpG,EAAAA,EAAInB,GAAAA,CAAIhF,MAAM,CAAA;AACrC,IAAA,MAAM0M,GAAAA,GAAMH,UAAAA,CAAWpG,EAAAA,GAAK,CAAA,EAAGnB,IAAIhF,MAAM,CAAA;IAEzC,MAAMoN,GAAAA,GAAM,CAACX,GAAAA,GAAMzH,IAAIjF,KAAK,GAAGuM,GAAA,IAAO,CAAA;IACtC,MAAMe,GAAAA,GAAM,CAACZ,GAAAA,GAAMzH,IAAIjF,KAAK,GAAGyM,GAAA,IAAO,CAAA;IACtC,MAAMc,GAAAA,GAAM,CAACZ,GAAAA,GAAM1H,IAAIjF,KAAK,GAAGuM,GAAA,IAAO,CAAA;IACtC,MAAMiB,GAAAA,GAAM,CAACb,GAAAA,GAAM1H,IAAIjF,KAAK,GAAGyM,GAAA,IAAO,CAAA;IAEtC,MAAMgB,GAAAA,GAAM,CAAC,CAAA,GAAIpB,EAAA,KAAO,IAAIC,EAAA,CAAA;AAC5B,IAAA,MAAMoB,GAAAA,GAAMrB,EAAAA,IAAM,CAAA,GAAIC,EAAA,CAAA;AACtB,IAAA,MAAMqB,GAAAA,GAAO,CAAA,CAAA,GAAItB,EAAA,IAAMC,EAAAA;AACvB,IAAA,MAAMsB,MAAMvB,EAAAA,GAAKC,EAAAA;AAEjB,IAAA,IAAK,IAAI5C,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,CAAA,EAAGA,IACrB1E,GAAG,CAACmI,EAAAA,GAAKzD,CAAAA,CAAE,GACTzE,GAAAA,CAAI7E,IAAI,CAACiN,GAAAA,GAAM3D,EAAE,GAAG+D,GAAAA,GACpBxI,GAAAA,CAAI7E,IAAI,CAACkN,GAAAA,GAAM5D,CAAAA,CAAE,GAAGgE,GAAAA,GACpBzI,IAAI7E,IAAI,CAACmN,GAAAA,GAAM7D,CAAAA,CAAE,GAAGiE,GAAAA,GACpB1I,GAAAA,CAAI7E,IAAI,CAACoN,GAAAA,GAAM9D,EAAE,GAAGkE,GAAAA;AAC1B;AAEA,2FACA,SAASR,aAAAA,CAAenI,GAAW,EAAEgH,CAAS,EAAE5G,CAAS,EAAEL,GAAsB,EAAEmI,EAAU,EAAA;IAC3F,MAAM1G,EAAAA,GAAKxF,IAAAA,CAAK6F,KAAK,CAACmF,CAAAA,CAAAA;IACtB,MAAM7F,EAAAA,GAAKnF,IAAAA,CAAK6F,KAAK,CAACzB,CAAAA,CAAAA;AACtB,IAAA,MAAMgH,KAAKJ,CAAAA,GAAIxF,EAAAA;AACf,IAAA,MAAM6F,KAAKjH,CAAAA,GAAIe,EAAAA;AAEf,IAAA,MAAMyH,KAAKC,iBAAAA,CAAkBzB,EAAAA,CAAAA;AAC7B,IAAA,MAAM0B,KAAKD,iBAAAA,CAAkBxB,EAAAA,CAAAA;AAE7B,IAAA,IAAK,IAAI5C,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,GAAGA,CAAAA,EAAAA,CAAK;AAC1B,QAAA,IAAIjI,KAAAA,GAAQ,CAAA;AACZ,QAAA,IAAK,IAAIuM,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,GAAGA,CAAAA,EAAAA,CAAK;AAC1B,YAAA,MAAMtI,IAAI8G,UAAAA,CAAWpG,EAAAA,GAAK,CAAA,GAAI4H,CAAAA,EAAG/I,IAAIhF,MAAM,CAAA;YAC3C,MAAMqI,GAAAA,GAAM5C,CAAAA,GAAIT,GAAAA,CAAIjF,KAAK;AACzB,YAAA,IAAIiO,QAAAA,GAAW,CAAA;AACf,YAAA,IAAK,IAAIzN,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,GAAGA,CAAAA,EAAAA,CAAK;AAC1B,gBAAA,MAAMuF,IAAIyG,UAAAA,CAAW/F,EAAAA,GAAK,CAAA,GAAIjG,CAAAA,EAAGyE,IAAIjF,KAAK,CAAA;AAC1CiO,gBAAAA,QAAAA,IAAYhJ,GAAAA,CAAI7E,IAAI,CAAEkI,CAAAA,GAAAA,GAAMvC,CAAAA,IAAK,CAAA,GAAI2D,CAAAA,CAAE,GAAGmE,EAAE,CAACrN,CAAAA,CAAE;AACjD,YAAA;YACAiB,KAAAA,IAASwM,QAAAA,GAAWF,EAAE,CAACC,CAAAA,CAAE;AAC3B,QAAA;QACAhJ,GAAG,CAACmI,EAAAA,GAAKzD,CAAAA,CAAE,GAAGjI,KAAAA;AAChB,IAAA;AACF;AAEA,SAASqM,kBAAmBlG,CAAS,EAAA;AACnC,IAAA,MAAMsG,KAAKtG,CAAAA,GAAIA,CAAAA;AACf,IAAA,MAAMuG,KAAKD,EAAAA,GAAKtG,CAAAA;IAEhB,OAAO;AACL,QAAA,GAAA,IAAO,CAACuG,EAAAA,GAAK,CAAA,GAAID,KAAKtG,CAAAA,CAAAA;AACtB,QAAA,GAAA,IAAO,CAAA,GAAIuG,EAAAA,GAAK,CAAA,GAAID,KAAK,CAAA,CAAA;AACzB,QAAA,GAAA,IAAO,EAAC,GAAIC,EAAAA,GAAK,CAAA,GAAID,KAAKtG,CAAAA,CAAAA;QAC1B,GAAA,IAAOuG,KAAKD;AACb,KAAA;AACH;AAEA,SAASlC,UAAAA,CAAY5L,IAAuB,EAAE+M,EAAU,EAAEiB,IAAsC,EAAA;AAC9FhO,IAAAA,IAAI,CAAC+M,EAAAA,CAAG,GAAGiB,IAAI,CAAC,CAAA,CAAE;AAClBhO,IAAAA,IAAI,CAAC+M,EAAAA,GAAK,CAAA,CAAE,GAAGiB,IAAI,CAAC,CAAA,CAAE;AACtBhO,IAAAA,IAAI,CAAC+M,EAAAA,GAAK,CAAA,CAAE,GAAGiB,IAAI,CAAC,CAAA,CAAE;AACtBhO,IAAAA,IAAI,CAAC+M,EAAAA,GAAK,CAAA,CAAE,GAAGiB,IAAI,CAAC,CAAA,CAAE;AACxB;AAEA,SAAS5B,UAAAA,CAAY9K,KAAa,EAAErB,MAAc,EAAA;AAChD,IAAA,OAAOqB,QAAQ,CAAA,GAAI,CAAA,GAAKA,KAAAA,IAASrB,MAAAA,GAASA,SAAS,CAAA,GAAIqB,KAAAA;AACzD;;ACzPA;;;;;;;;;;;;;;;;UAkBa2M,QAAAA,GAAoB;AAAC,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA;;AAE1D,iEACM,SAAUC,QAAAA,CAAUxO,CAAU,EAAEC,CAAU,EAAA;IAC9C,OAAO;QACLD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QACvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QACvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QAEvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QACvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QACvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QAEvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QACvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA,CAAE;QACvCD,CAAC,CAAC,EAAE,GAAGC,CAAC,CAAC,CAAA,CAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,CAAA,CAAE,GAAGC,CAAC,CAAC,CAAA;AACtC,KAAA;AACH;AAEM,SAAUwO,YAAaC,CAAU,EAAA;AACrC,IAAA,OACEA,CAAC,CAAC,CAAA,CAAE,IAAIA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAC,CAAA,GAChCA,CAAC,CAAC,CAAA,CAAE,IAAIA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,CAAD,GAChCA,CAAC,CAAC,EAAE,IAAIA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,CAAD;AAEpC;AAEA,6GACM,SAAUC,MAAAA,CAAQD,CAAU,EAAA;AAChC,IAAA,MAAMxB,MAAMuB,WAAAA,CAAYC,CAAAA,CAAAA;AACxB,IAAA,IAAI,CAACtL,MAAAA,CAAOgK,QAAQ,CAACF,GAAAA,CAAAA,IAAQ/L,IAAAA,CAAKgM,GAAG,CAACD,GAAAA,CAAAA,GAAO,KAAA,EAC3C,MAAM,IAAI9M,KAAAA,CAAM,2CAAA,CAAA;AAElB,IAAA,MAAMwO,MAAM,CAAA,GAAI1B,GAAAA;IAEhB,OAAO;AACJwB,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAC7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAC7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAE7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAC7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAC7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAE7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAC7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE,GAAAA;AAC7BF,QAAAA,CAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,EAAE,GAAGA,CAAC,CAAC,CAAA,CAAE,IAAIE;AAC/B,KAAA;AACH;AAEA,2FACM,SAAUC,SAAAA,CAAWH,CAAU,EAAA;IACnC,MAAMI,CAAAA,GAAIJ,CAAC,CAAC,CAAA,CAAE;AACd,IAAA,IAAII,CAAAA,KAAM,CAAA,IAAKA,CAAAA,KAAM,CAAA,EAAG,OAAOJ,CAAAA;IAE/B,OAAO;QAACA,CAAC,CAAC,EAAE,GAAGI,CAAAA;QAAGJ,CAAC,CAAC,EAAE,GAAGI,CAAAA;QAAGJ,CAAC,CAAC,EAAE,GAAGI,CAAAA;QAAGJ,CAAC,CAAC,EAAE,GAAGI,CAAAA;QAAGJ,CAAC,CAAC,EAAE,GAAGI,CAAAA;QAAGJ,CAAC,CAAC,EAAE,GAAGI,CAAAA;QAAGJ,CAAC,CAAC,EAAE,GAAGI,CAAAA;QAAGJ,CAAC,CAAC,EAAE,GAAGI,CAAAA;AAAG,QAAA;AAAE,KAAA;AAC5F;SAEgBC,UAAAA,CAAYL,CAAU,EAAEzI,CAAS,EAAEL,CAAS,EAAA;AAC1D,IAAA,MAAMoF,CAAAA,GAAI0D,CAAC,CAAC,CAAA,CAAE,GAAGzI,CAAAA,GAAIyI,CAAC,CAAC,CAAA,CAAE,GAAG9I,CAAAA,GAAI8I,CAAC,CAAC,CAAA,CAAE;AACpC,IAAA,MAAMM,EAAAA,GAAKhE,CAAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAIA,CAAAA;IAE7B,OAAO;AAAE/E,QAAAA,CAAAA,EAAG,CAACyI,CAAC,CAAC,CAAA,CAAE,GAAGzI,CAAAA,GAAIyI,CAAC,CAAC,CAAA,CAAE,GAAG9I,CAAAA,GAAI8I,CAAC,CAAC,CAAA,CAAE,IAAIM,EAAAA;AAAIpJ,QAAAA,CAAAA,EAAG,CAAC8I,CAAC,CAAC,CAAA,CAAE,GAAGzI,CAAAA,GAAIyI,CAAC,CAAC,CAAA,CAAE,GAAG9I,CAAAA,GAAI8I,CAAC,CAAC,CAAA,CAAE,IAAIM;AAAE,KAAA;AACrF;AAEM,SAAUC,WAAAA,CAAaC,EAAU,EAAEC,EAAU,EAAA;IACjD,OAAO;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAGD,QAAAA,EAAAA;AAAI,QAAA,CAAA;AAAG,QAAA,CAAA;AAAGC,QAAAA,EAAAA;AAAI,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AACtC;SAEgBC,OAAAA,CAASC,EAAU,EAAEC,KAAKD,EAAE,EAAA;IAC1C,OAAO;AAACA,QAAAA,EAAAA;AAAI,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAGC,QAAAA,EAAAA;AAAI,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AACtC;AAEA;;;;;;IAOM,SAAUC,UAAAA,CAAYT,CAAS,EAAEU,QAAgB,EAAEC,KAAY,EAAEC,MAAa,EAAA;AAClF,IAAA,MAAM9F,CAAAA,GAAIzI,IAAAA,CAAKwO,GAAG,CAACH,QAAAA,CAAAA,GAAYV,CAAAA;AAC/B,IAAA,MAAMpG,CAAAA,GAAIvH,IAAAA,CAAKyO,GAAG,CAACJ,QAAAA,CAAAA,GAAYV,CAAAA;IAE/B,OAAO;AACLlF,QAAAA,CAAAA;QAAG,CAAClB,CAAAA;QAAGgH,MAAAA,CAAOzJ,CAAC,GAAG2D,CAAAA,GAAI6F,KAAAA,CAAMxJ,CAAC,GAAGyC,CAAAA,GAAI+G,MAAM7J,CAAC;AAC3C8C,QAAAA,CAAAA;AAAGkB,QAAAA,CAAAA;QAAG8F,MAAAA,CAAO9J,CAAC,GAAG8C,CAAAA,GAAI+G,KAAAA,CAAMxJ,CAAC,GAAG2D,CAAAA,GAAI6F,MAAM7J,CAAC;AAC1C,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AACP,KAAA;AACH;AAEA;;;;;;AAMG,IACG,SAAUiK,cAAAA,CAAgBnB,CAAU,EAAEhG,CAAS,EAAA;AACnD,IAAA,OAAO8F,SAASY,OAAAA,CAAQ,CAAA,GAAI1G,CAAAA,CAAAA,EAAI8F,QAAAA,CAASE,GAAGU,OAAAA,CAAQ1G,CAAAA,CAAAA,CAAAA,CAAAA;AACtD;AAEA;;;;;;;AAOG,aACaoH,MAAAA,CAAQpB,CAAU,EAAEqB,WAAmB,EAAEC,WAAmB,EAAA;AAC1E,IAAA,OAAOxB,SAASY,OAAAA,CAAQ,CAAA,GAAIY,WAAAA,CAAAA,EAAcxB,QAAAA,CAASE,GAAGU,OAAAA,CAAQW,WAAAA,CAAAA,CAAAA,CAAAA;AAChE;AAEA,mFACM,SAAUE,cAAAA,CAAgBvB,CAAU,EAAEwB,IAAU,EAAA;IACpD,MAAM,EAAEjK,CAAC,EAAEL,CAAC,EAAE1F,KAAK,EAAEC,MAAM,EAAE,GAAG+P,IAAAA;IAEhC,OAAO;AACLnB,QAAAA,UAAAA,CAAWL,GAAGzI,CAAAA,EAAGL,CAAAA,CAAAA;QACjBmJ,UAAAA,CAAWL,CAAAA,EAAGzI,IAAI/F,KAAAA,EAAO0F,CAAAA,CAAAA;QACzBmJ,UAAAA,CAAWL,CAAAA,EAAGzI,CAAAA,GAAI/F,KAAAA,EAAO0F,CAAAA,GAAIzF,MAAAA,CAAAA;QAC7B4O,UAAAA,CAAWL,CAAAA,EAAGzI,GAAGL,CAAAA,GAAIzF,MAAAA;AACtB,KAAA;AACH;AAEA;;;;;;AAMG,IACG,SAAUgQ,SAAAA,CAAWzB,CAAU,EAAE0B,KAAqB,EAAA;AAC1D,IAAA,MAAM,CAACpQ,CAAAA,EAAGC,CAAAA,IAAKoQ,CAAAA,EAAGC,EAAE,GAAG5B,CAAAA;AACvB,IAAA,MAAM6B,MAAAA,GAASpP,IAAAA,CAAKqP,KAAK,CAACxQ,CAAAA,EAAGqQ,CAAAA,CAAAA;IAC7B,MAAMnD,GAAAA,GAAMlN,CAAAA,GAAIsQ,CAAAA,GAAIrQ,CAAAA,GAAIoQ,CAAAA;AACxB,IAAA,MAAMI,MAAAA,GAASF,MAAAA,KAAW,CAAA,GAAI,CAAA,GAAIrD,GAAAA,GAAMqD,MAAAA;IACxC,MAAMG,KAAAA,GAAQH,MAAAA,KAAW,CAAA,GAAI,CAAA,GAAKvQ,CAAAA,CAAAA,GAAIC,CAAAA,GAAIoQ,CAAAA,GAAIC,CAAAA,IAAKC,MAAAA;IACnD,MAAMI,MAAAA,GAAS5B,UAAAA,CAAWL,CAAAA,EAAG,CAAA,EAAG,CAAA,CAAA;IAEhC,OAAO;AACL0B,QAAAA,KAAAA;AACAG,QAAAA,MAAAA;AACAE,QAAAA,MAAAA;QACAG,WAAAA,EAAczP,KAAK0P,KAAK,CAACR,GAAGrQ,CAAAA,CAAAA,GAAK,GAAA,GAAOmB,KAAK2P,EAAE;QAC/CC,QAAAA,EAAc5P,KAAK0P,KAAK,CAACH,OAAOD,MAAAA,IAAU,CAAA,CAAA,GAAK,GAAA,GAAOtP,IAAAA,CAAK2P,EAAE;QAC7D7B,WAAAA,EAAa0B,MAAAA;QACbK,WAAAA,EAAa;YAAE/K,CAAAA,EAAGyI,CAAC,CAAC,CAAA,CAAE;YAAE9I,CAAAA,EAAG8I,CAAC,CAAC,CAAA;AAAE;;AAEnC;AAEA,wFACgBuC,iBAAAA,CAAmBvC,CAAU,EAAExD,MAAa,EAAEwE,MAAa,EAAA;AACzE,IAAA,MAAMrK,IAAI0J,UAAAA,CAAWL,CAAAA,EAAGxD,OAAOjF,CAAC,EAAEiF,OAAOtF,CAAC,CAAA;AAE1C,IAAA,OAAOzE,IAAAA,CAAKqP,KAAK,CAACnL,CAAAA,CAAEY,CAAC,GAAGyJ,MAAAA,CAAOzJ,CAAC,EAAEZ,CAAAA,CAAEO,CAAC,GAAG8J,OAAO9J,CAAC,CAAA;AAClD;AAEA;;;;;;AAMG,aACasL,WAAAA,CAAaxC,CAAU,EAAEyC,gBAAgB,CAAC,EAAA;IACxD,IAAIzC,CAAAA,CAAE0C,IAAI,CAAC7L,CAAAA,CAAAA,GAAK,CAACnC,MAAAA,CAAOgK,QAAQ,CAAC7H,CAAAA,CAAAA,CAAAA,EAAK,OAAO,KAAA;AAE7C,IAAA,MAAM,CAACvF,CAAAA,EAAGC,CAAAA,IAAKoQ,CAAAA,EAAGC,EAAE,GAAG5B,CAAAA;IACvB,MAAMxB,GAAAA,GAAMlN,CAAAA,GAAIsQ,CAAAA,GAAIrQ,CAAAA,GAAIoQ,CAAAA;AACxB,IAAA,IAAIlP,IAAAA,CAAKgM,GAAG,CAACD,GAAAA,CAAAA,IAAQ,MAAM,OAAO,KAAA;;IAElC,IAAIA,GAAAA,GAAM,GAAG,OAAO,KAAA;AAEpB,IAAA,MAAMmC,EAAAA,GAAKlO,IAAAA,CAAKqP,KAAK,CAACxQ,CAAAA,EAAGqQ,CAAAA,CAAAA;AACzB,IAAA,IAAIhB,EAAAA,GAAK,CAAA,GAAI8B,aAAAA,IAAiB9B,EAAAA,GAAK8B,eAAe,OAAO,KAAA;AAEzD,IAAA,MAAM7B,EAAAA,GAAKnO,IAAAA,CAAKqP,KAAK,CAACvQ,CAAAA,EAAGqQ,CAAAA,CAAAA;AAEzB,IAAA,OAAO,EAAEhB,EAAAA,GAAK,CAAA,GAAI6B,aAAAA,IAAiB7B,KAAK6B,aAAA,CAAA;AAC1C;;ACzKA;;;;;;;IAQM,SAAUE,aAAAA,CAAejK,GAAc,EAAEkK,KAAAA,GAAQ,CAAC,EAAEC,IAAAA,GAAO,KAAK,EAAA;AACpE,IAAA,MAAM,EAAErR,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAG8G,GAAAA;IAChC,MAAMuI,GAAAA,GAAMxO,IAAAA,CAAKwO,GAAG,CAAC2B,KAAAA,CAAAA;IACrB,MAAM1B,GAAAA,GAAMzO,IAAAA,CAAKyO,GAAG,CAAC0B,KAAAA,CAAAA;AAErB,IAAA,MAAME,OAAAA,GAAmB;AACvB,QAAA;YAAEvL,CAAAA,EAAG,CAAA;YAAGL,CAAAA,EAAG;AAAC,SAAA;AACZ,QAAA;YAAEK,CAAAA,EAAG/F,KAAAA;YAAO0F,CAAAA,EAAG;AAAC,SAAA;AAChB,QAAA;YAAEK,CAAAA,EAAG,CAAA;YAAGL,CAAAA,EAAGzF;AAAM,SAAA;AACjB,QAAA;YAAE8F,CAAAA,EAAG/F,KAAAA;YAAO0F,CAAAA,EAAGzF;AAAM;AACtB,KAAA;AACD,IAAA,IAAIsR,IAAAA,GAAOC,QAAAA;AACX,IAAA,IAAIC,OAAO,CAACD,QAAAA;AACZ,IAAA,IAAIE,IAAAA,GAAOF,QAAAA;AACX,IAAA,IAAIG,OAAO,CAACH,QAAAA;IACZ,KAAK,MAAM9H,KAAK4H,OAAAA,CAAS;AACvB,QAAA,MAAMrF,IAAIvC,CAAAA,CAAE3D,CAAC,GAAG0J,GAAAA,GAAM/F,CAAAA,CAAEhE,CAAC,GAAGgK,GAAAA;QAC5B,MAAMrK,CAAAA,GAAI,CAACqE,CAAAA,CAAE3D,CAAC,GAAG2J,GAAAA,GAAMhG,CAAAA,CAAEhE,CAAC,GAAG+J,GAAAA;QAC7B8B,IAAAA,GAAOtQ,IAAAA,CAAKqF,GAAG,CAACiL,IAAAA,EAAMtF,CAAAA,CAAAA;QACtBwF,IAAAA,GAAOxQ,IAAAA,CAAKiF,GAAG,CAACuL,IAAAA,EAAMxF,CAAAA,CAAAA;QACtByF,IAAAA,GAAOzQ,IAAAA,CAAKqF,GAAG,CAACoL,IAAAA,EAAMrM,CAAAA,CAAAA;QACtBsM,IAAAA,GAAO1Q,IAAAA,CAAKiF,GAAG,CAACyL,IAAAA,EAAMtM,CAAAA,CAAAA;AACxB,IAAA;AAEA,IAAA,MAAMuM,QAAQ,IAAInM,YAAAA,CAAaxE,KAAK2H,IAAI,CAAC6I,OAAOF,IAAAA,CAAAA,GAAQ,CAAA,CAAA;AACxD,IAAA,MAAMM,QAAQ,IAAIpM,YAAAA,CAAaxE,KAAK2H,IAAI,CAAC+I,OAAOD,IAAAA,CAAAA,GAAQ,CAAA,CAAA;AACxD,IAAA,IAAIjQ,KAAAA,GAAQ,CAAA;AAEZ,IAAA,IAAK,IAAIiE,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAM4C,MAAM5C,CAAAA,GAAI1F,KAAAA;AAChB,QAAA,MAAM8R,IAAAA,GAAQpM,CAAAA,CAAAA,GAAI,GAAA,IAAO+J,GAAAA;AACzB,QAAA,MAAMsC,IAAAA,GAAQrM,CAAAA,CAAAA,GAAI,GAAA,IAAOgK,GAAAA;AACzB,QAAA,IAAK,IAAI3J,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,MAAMrE,KAAAA,GAAQtB,IAAI,CAACkI,GAAAA,GAAMvC,CAAAA,CAAE;AAC3B,YAAA,IAAIrE,SAAS,CAAA,EAAG;AAChB,YAAA,MAAMsQ,KAAKjM,CAAAA,GAAI,GAAA;;YAEf6L,KAAK,CAAC3Q,KAAK6F,KAAK,CAACkL,KAAKvC,GAAAA,GAAMsC,IAAAA,GAAOR,MAAM,IAAI7P,KAAAA;YAC7CmQ,KAAK,CAAC5Q,KAAK6F,KAAK,CAAC,CAACkL,EAAAA,GAAKtC,GAAAA,GAAMoC,IAAAA,GAAOJ,IAAAA,CAAAA,CAAM,IAAIhQ,KAAAA;YAC9CD,KAAAA,IAASC,KAAAA;AACX,QAAA;AACF,IAAA;AAEA,IAAA,IAAID,SAAS,CAAA,EAAG;;;QAGd,OAAO;AACLzB,YAAAA,KAAAA;AACAC,YAAAA,MAAAA;YACAgS,MAAAA,EAAS;AAAElM,gBAAAA,CAAAA,EAAG/F,KAAAA,GAAQ,CAAA;AAAG0F,gBAAAA,CAAAA,EAAGzF,MAAAA,GAAS;AAAC,aAAA;AACtCmR,YAAAA,KAAAA;YACAc,OAAAA,EAAS;;AAEb,IAAA;AAEA,IAAA,MAAM,CAACC,EAAAA,EAAIC,EAAAA,CAAG,GAAGC,WAAAA,CAAYT,OAAOnQ,KAAAA,EAAO4P,IAAAA,CAAAA;AAC3C,IAAA,MAAM,CAACiB,EAAAA,EAAIC,EAAAA,CAAG,GAAGF,WAAAA,CAAYR,OAAOpQ,KAAAA,EAAO4P,IAAAA,CAAAA;AAE3C,IAAA,MAAMmB,UAAUjB,IAAAA,GAAQY,CAAAA,EAAAA,GAAKC,EAAA,IAAM,CAAA;AACnC,IAAA,MAAMK,UAAUf,IAAAA,GAAQY,CAAAA,EAAAA,GAAKC,EAAA,IAAM,CAAA;IAEnC,OAAO;AACLvS,QAAAA,KAAAA,EAASiB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGkM,EAAAA,GAAKD,EAAAA,CAAAA;AAC1BlS,QAAAA,MAAAA,EAASgB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGqM,EAAAA,GAAKD,EAAAA,CAAAA;QAC1BL,MAAAA,EAAS;YAAElM,CAAAA,EAAGyM,OAAAA,GAAU/C,MAAMgD,OAAAA,GAAU/C,GAAAA;YAAKhK,CAAAA,EAAG8M,OAAAA,GAAU9C,MAAM+C,OAAAA,GAAUhD;AAAG,SAAA;AAC7E2B,QAAAA,KAAAA;QACAc,OAAAA,EAASzQ,KAAAA,IAASzB,KAAAA,GAAQC;;AAE9B;AAEA;;;;;;;;AAQG,aACayS,YAAAA,CAAcxL,GAAc,EAAE3C,OAAAA,GAAuB,EAAE,EAAA;AACrE,IAAA,MAAM,EAAEoO,WAAAA,GAAc,EAAE,EAAE,GAAGpO,OAAAA;IAC7B,MAAMqO,KAAAA,GAAQ3R,IAAAA,CAAK2P,EAAE,GAAG,GAAA;AAExB,IAAA,IAAIlJ,IAAAA,GAAO,CAAA;AACX,IAAA,IAAImL,YAAY,CAACrB,QAAAA;AACjB,IAAA,IAAK,IAAIsB,GAAAA,GAAM,CAACH,aAAaG,GAAAA,IAAOH,WAAAA,EAAaG,OAAO,CAAA,CAAG;QACzD,MAAMC,KAAAA,GAAQC,gBAAAA,CAAiB9L,GAAAA,EAAK4L,GAAAA,GAAMF,KAAAA,CAAAA;AAC1C,QAAA,IAAIG,QAAQF,SAAAA,EAAW;YACrBA,SAAAA,GAAYE,KAAAA;YACZrL,IAAAA,GAAOoL,GAAAA;AACT,QAAA;AACF,IAAA;AAEA,IAAA,KAAK,MAAM,CAACG,IAAAA,EAAMC,IAAAA,CAAK,IAAI;AAAC,QAAA;AAAC,YAAA,CAAA;AAAG,YAAA;AAAI,SAAA;AAAE,QAAA;AAAC,YAAA,GAAA;AAAK,YAAA;AAAK;KAAU,CAAE;AAC3D,QAAA,IAAIC,SAAAA,GAAYzL,IAAAA;QAChB,IAAK,IAAIoL,MAAMpL,IAAAA,GAAOuL,IAAAA,EAAMH,OAAOpL,IAAAA,GAAOuL,IAAAA,GAAO,IAAA,EAAMH,GAAAA,IAAOI,IAAAA,CAAM;YAClE,MAAMH,KAAAA,GAAQC,gBAAAA,CAAiB9L,GAAAA,EAAK4L,GAAAA,GAAMF,KAAAA,CAAAA;AAC1C,YAAA,IAAIG,QAAQF,SAAAA,EAAW;gBACrBA,SAAAA,GAAYE,KAAAA;gBACZI,SAAAA,GAAYL,GAAAA;AACd,YAAA;AACF,QAAA;QACApL,IAAAA,GAAOyL,SAAAA;AACT,IAAA;AAEA,IAAA,OAAOzL,IAAAA,GAAOkL,KAAAA;AAChB;AAEA,2FACM,SAAUI,gBAAAA,CAAkB9L,GAAc,EAAEkK,KAAa,EAAA;AAC7D,IAAA,MAAM,EAAEpR,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAG8G,GAAAA;IAChC,MAAMuI,GAAAA,GAAMxO,IAAAA,CAAKwO,GAAG,CAAC2B,KAAAA,CAAAA;IACrB,MAAM1B,GAAAA,GAAMzO,IAAAA,CAAKyO,GAAG,CAAC0B,KAAAA,CAAAA;AACrB,IAAA,MAAMxG,SAAS3J,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAG,CAAClG,KAAAA,GAAQ0P,GAAAA,CAAAA;AACpC,IAAA,MAAMtI,IAAAA,GAAO,IAAI3B,YAAAA,CAAaxE,IAAAA,CAAK2H,IAAI,CAAC3I,MAAAA,GAASwP,GAAAA,GAAMzP,KAAAA,GAAQiB,IAAAA,CAAKgM,GAAG,CAACyC,GAAAA,CAAAA,CAAAA,GAAQ,CAAA,CAAA;AAEhF,IAAA,IAAK,IAAIhK,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAM4C,MAAM5C,CAAAA,GAAI1F,KAAAA;AAChB,QAAA,MAAM8R,OAAO,CAACpM,CAAAA,GAAI,GAAA,IAAO+J,GAAAA,GAAM7E,MAAAA;AAC/B,QAAA,IAAK,IAAI7E,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,MAAMrE,KAAAA,GAAQtB,IAAI,CAACkI,GAAAA,GAAMvC,CAAAA,CAAE;AAC3B,YAAA,IAAIrE,SAAS,CAAA,EAAG;YAChB,MAAM4F,GAAAA,GAAMrG,KAAK6F,KAAK,CAACgL,OAAO,CAAC/L,CAAAA,GAAI,GAAA,IAAO2J,GAAAA,CAAAA;YAC1C,IAAIpI,GAAAA,IAAO,KAAKA,GAAAA,GAAMF,IAAAA,CAAK/G,MAAM,EAAE+G,IAAI,CAACE,GAAAA,CAAI,IAAI5F,KAAAA;AAClD,QAAA;AACF,IAAA;AAEA,IAAA,IAAIqR,KAAAA,GAAQ,CAAA;AACZ,IAAA,KAAK,MAAMrR,KAAAA,IAAS0F,IAAAA,CAAM2L,KAAAA,IAASrR,KAAAA,GAAQA,KAAAA;IAE3C,OAAOqR,KAAAA;AACT;AAEA,0EACA,SAASV,WAAAA,CAAajL,IAAkB,EAAE3F,KAAa,EAAE4P,IAAY,EAAA;AACnE,IAAA,MAAM+B,SAAS3R,KAAAA,GAAQ4P,IAAAA;AAEvB,IAAA,IAAIgC,WAAAA,GAAc,CAAA;AAClB,IAAA,IAAIC,GAAAA,GAAM,CAAA;AACV,IAAA,MAAOA,GAAAA,GAAMlM,IAAAA,CAAK/G,MAAM,EAAEiT,GAAAA,EAAAA,CAAO;QAC/BD,WAAAA,IAAejM,IAAI,CAACkM,GAAAA,CAAI;AACxB,QAAA,IAAID,cAAcD,MAAAA,EAAQ;AAC5B,IAAA;IAEAC,WAAAA,GAAc,CAAA;IACd,IAAIE,IAAAA,GAAOnM,IAAAA,CAAK/G,MAAM,GAAG,CAAA;IACzB,MAAOkT,IAAAA,GAAOD,KAAKC,IAAAA,EAAAA,CAAQ;QACzBF,WAAAA,IAAejM,IAAI,CAACmM,IAAAA,CAAK;AACzB,QAAA,IAAIF,cAAcD,MAAAA,EAAQ;AAC5B,IAAA;IAEA,OAAO;AAACE,QAAAA,GAAAA;QAAKC,IAAAA,GAAO;AAAE,KAAA;AACxB;;AChMA;;;;;;;IASM,SAAUC,cAAAA,CAAgBrT,CAAS,EAAA;AACvC,IAAA,IAAIgF,CAAAA,GAAI,CAAA;IACR,MAAOA,CAAAA,GAAIhF,EAAGgF,CAAAA,IAAK,CAAA;IAEnB,OAAOA,CAAAA;AACT;AAEM,SAAUsO,aAActT,CAAS,EAAA;AACrC,IAAA,OAAOA,IAAI,CAAA,IAAMA,CAAAA,CAAAA,GAAKA,CAAAA,GAAI,CAAC,MAAO,CAAA;AACpC;AAEA,kFACM,SAAUuT,KAAAA,CAAOC,EAAgB,EAAEC,EAAgB,EAAEC,OAAAA,GAAU,KAAK,EAAA;IACxE,MAAM1T,CAAAA,GAAIwT,GAAGtT,MAAM;IACnB,IAAI,CAACoT,aAAatT,CAAAA,CAAAA,EAAI,MAAM,IAAID,KAAAA,CAAM,0CAA0CC,CAAAA,CAAAA,CAAG,CAAA;AACnF,IAAA,IAAIA,MAAM,CAAA,EAAG;;;AAIb,IAAA,IAAK,IAAIK,CAAAA,GAAI,CAAA,EAAGwN,IAAI,CAAA,EAAGxN,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK;AACjC,QAAA,IAAIsT,MAAM3T,CAAAA,IAAK,CAAA;QACf,MAAQ6N,CAAAA,CAAAA,GAAI8F,GAAA,MAAS,CAAA,EAAGA,GAAAA,KAAQ,EAAG9F,CAAAA,IAAK8F,GAAAA;QACxC9F,CAAAA,IAAK8F,GAAAA;AAEL,QAAA,IAAItT,IAAIwN,CAAAA,EAAG;YACT,IAAIpG,CAAAA,GAAI+L,EAAE,CAACnT,CAAAA,CAAE;AACbmT,YAAAA,EAAE,CAACnT,CAAAA,CAAE,GAAGmT,EAAE,CAAC3F,CAAAA,CAAE;YACb2F,EAAE,CAAC3F,EAAE,GAAGpG,CAAAA;YACRA,CAAAA,GAAIgM,EAAE,CAACpT,CAAAA,CAAE;AACToT,YAAAA,EAAE,CAACpT,CAAAA,CAAE,GAAGoT,EAAE,CAAC5F,CAAAA,CAAE;YACb4F,EAAE,CAAC5F,EAAE,GAAGpG,CAAAA;AACV,QAAA;AACF,IAAA;IAEA,MAAMmM,IAAAA,GAAOF,OAAAA,GAAU,CAAA,GAAI,EAAC;AAC5B,IAAA,IAAK,IAAIG,GAAAA,GAAM,CAAA,EAAGA,GAAAA,IAAO7T,CAAAA,EAAG6T,QAAQ,CAAA,CAAG;AACrC,QAAA,MAAM5C,QAAQ,IAAC2C,GAAO,CAAA,GAAI9S,IAAAA,CAAK2P,EAAE,GAAIoD,GAAAA;QACrC,MAAMC,GAAAA,GAAMhT,IAAAA,CAAKwO,GAAG,CAAC2B,KAAAA,CAAAA;QACrB,MAAM8C,GAAAA,GAAMjT,IAAAA,CAAKyO,GAAG,CAAC0B,KAAAA,CAAAA;AAErB,QAAA,IAAK,IAAInH,KAAAA,GAAQ,CAAA,EAAGA,KAAAA,GAAQ9J,CAAAA,EAAG8J,SAAS+J,GAAAA,CAAK;AAC3C,YAAA,IAAIG,KAAAA,GAAQ,CAAA;AACZ,YAAA,IAAIC,KAAAA,GAAQ,CAAA;AACZ,YAAA,MAAMC,OAAOL,GAAAA,IAAO,CAAA;AAEpB,YAAA,IAAK,IAAIxL,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI6L,MAAM7L,CAAAA,EAAAA,CAAK;AAC7B,gBAAA,MAAMhI,IAAIyJ,KAAAA,GAAQzB,CAAAA;AAClB,gBAAA,MAAMwF,IAAIxN,CAAAA,GAAI6T,IAAAA;gBACd,MAAMC,MAAAA,GAASX,EAAE,CAACnT,CAAAA,CAAE;gBACpB,MAAM+T,MAAAA,GAASX,EAAE,CAACpT,CAAAA,CAAE;gBACpB,MAAMgU,KAAAA,GAAQb,EAAE,CAAC3F,CAAAA,CAAE,GAAGmG,KAAAA,GAAQP,EAAE,CAAC5F,CAAAA,CAAE,GAAGoG,KAAAA;gBACtC,MAAMK,KAAAA,GAAQd,EAAE,CAAC3F,CAAAA,CAAE,GAAGoG,KAAAA,GAAQR,EAAE,CAAC5F,CAAAA,CAAE,GAAGmG,KAAAA;gBAEtCR,EAAE,CAACnT,CAAAA,CAAE,GAAG8T,MAAAA,GAASE,KAAAA;gBACjBZ,EAAE,CAACpT,CAAAA,CAAE,GAAG+T,MAAAA,GAASE,KAAAA;gBACjBd,EAAE,CAAC3F,CAAAA,CAAE,GAAGsG,MAAAA,GAASE,KAAAA;gBACjBZ,EAAE,CAAC5F,CAAAA,CAAE,GAAGuG,MAAAA,GAASE,KAAAA;gBAEjB,MAAMC,MAAAA,GAASP,KAAAA,GAAQF,GAAAA,GAAMG,KAAAA,GAAQF,GAAAA;gBACrCE,KAAAA,GAAQD,KAAAA,GAAQD,MAAME,KAAAA,GAAQH,GAAAA;gBAC9BE,KAAAA,GAAQO,MAAAA;AACV,YAAA;AACF,QAAA;AACF,IAAA;AAEA,IAAA,IAAIb,SACF,IAAK,IAAIrT,IAAI,CAAA,EAAGA,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK;QAC1BmT,EAAE,CAACnT,EAAE,IAAIL,CAAAA;QACTyT,EAAE,CAACpT,EAAE,IAAIL,CAAAA;AACX,IAAA;AACJ;AAEA,sFACM,SAAUwU,KAAAA,CACdhB,EAAgB,EAChBC,EAAgB,EAChB5T,KAAa,EACbC,MAAc,EACd4T,UAAU,KAAK,EAAA;IAEf,MAAMe,KAAAA,GAAQ,IAAInP,YAAAA,CAAazF,KAAAA,CAAAA;IAC/B,MAAM6U,KAAAA,GAAQ,IAAIpP,YAAAA,CAAazF,KAAAA,CAAAA;AAC/B,IAAA,IAAK,IAAI0F,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAMoP,MAAMpP,CAAAA,GAAI1F,KAAAA;AAChB4U,QAAAA,KAAAA,CAAMG,GAAG,CAACpB,EAAAA,CAAGqB,QAAQ,CAACF,KAAKA,GAAAA,GAAM9U,KAAAA,CAAAA,CAAAA;AACjC6U,QAAAA,KAAAA,CAAME,GAAG,CAACnB,EAAAA,CAAGoB,QAAQ,CAACF,KAAKA,GAAAA,GAAM9U,KAAAA,CAAAA,CAAAA;AACjC0T,QAAAA,KAAAA,CAAMkB,OAAOC,KAAAA,EAAOhB,OAAAA,CAAAA;QACpBF,EAAAA,CAAGoB,GAAG,CAACH,KAAAA,EAAOE,GAAAA,CAAAA;QACdlB,EAAAA,CAAGmB,GAAG,CAACF,KAAAA,EAAOC,GAAAA,CAAAA;AAChB,IAAA;IAEA,MAAMG,KAAAA,GAAQ,IAAIxP,YAAAA,CAAaxF,MAAAA,CAAAA;IAC/B,MAAMiV,KAAAA,GAAQ,IAAIzP,YAAAA,CAAaxF,MAAAA,CAAAA;AAC/B,IAAA,IAAK,IAAI8F,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,QAAA,IAAK,IAAIL,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/BuP,YAAAA,KAAK,CAACvP,CAAAA,CAAE,GAAGiO,EAAE,CAACjO,CAAAA,GAAI1F,QAAQ+F,CAAAA,CAAE;AAC5BmP,YAAAA,KAAK,CAACxP,CAAAA,CAAE,GAAGkO,EAAE,CAAClO,CAAAA,GAAI1F,QAAQ+F,CAAAA,CAAE;AAC9B,QAAA;AACA2N,QAAAA,KAAAA,CAAMuB,OAAOC,KAAAA,EAAOrB,OAAAA,CAAAA;AACpB,QAAA,IAAK,IAAInO,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/BiO,YAAAA,EAAE,CAACjO,CAAAA,GAAI1F,KAAAA,GAAQ+F,EAAE,GAAGkP,KAAK,CAACvP,CAAAA,CAAE;AAC5BkO,YAAAA,EAAE,CAAClO,CAAAA,GAAI1F,KAAAA,GAAQ+F,EAAE,GAAGmP,KAAK,CAACxP,CAAAA,CAAE;AAC9B,QAAA;AACF,IAAA;AACF;;ACpFA;;;;;;AAMG,IACG,SAAUyP,cAAAA,CAAgBrV,CAAY,EAAEC,CAAY,EAAA;AACxD,IAAA,IAAID,CAAAA,CAAEE,KAAK,KAAKD,CAAAA,CAAEC,KAAK,IAAIF,CAAAA,CAAEG,MAAM,KAAKF,CAAAA,CAAEE,MAAM,EAC9C,MAAM,IAAIC,KAAAA,CAAM,kDAAA,CAAA;IAElB,MAAMF,KAAAA,GAAQwT,cAAAA,CAAe1T,CAAAA,CAAEE,KAAK,CAAA;IACpC,MAAMC,MAAAA,GAASuT,cAAAA,CAAe1T,CAAAA,CAAEG,MAAM,CAAA;AACtC,IAAA,MAAMmV,OAAOpV,KAAAA,GAAQC,MAAAA;IAErB,MAAMoV,GAAAA,GAAM,IAAI5P,YAAAA,CAAa2P,IAAAA,CAAAA;IAC7B,MAAME,GAAAA,GAAM,IAAI7P,YAAAA,CAAa2P,IAAAA,CAAAA;IAC7B,MAAMG,GAAAA,GAAM,IAAI9P,YAAAA,CAAa2P,IAAAA,CAAAA;IAC7B,MAAMI,GAAAA,GAAM,IAAI/P,YAAAA,CAAa2P,IAAAA,CAAAA;IAE7B,MAAMK,OAAAA,GAAUC,IAAAA,CAAK5V,CAAAA,CAAEE,KAAK,CAAA;IAC5B,MAAM2V,OAAAA,GAAUD,IAAAA,CAAK5V,CAAAA,CAAEG,MAAM,CAAA;AAE7B,IAAA,IAAK,IAAIyF,CAAAA,GAAI,CAAA,EAAGA,IAAI5F,CAAAA,CAAEG,MAAM,EAAEyF,CAAAA,EAAAA,CAAK;QACjC,MAAMT,GAAAA,GAAMS,CAAAA,GAAI5F,CAAAA,CAAEE,KAAK;AACvB,QAAA,MAAMkF,MAAMQ,CAAAA,GAAI1F,KAAAA;AAChB,QAAA,IAAK,IAAI+F,CAAAA,GAAI,CAAA,EAAGA,IAAIjG,CAAAA,CAAEE,KAAK,EAAE+F,CAAAA,EAAAA,CAAK;AAChC,YAAA,MAAM+E,IAAI2K,OAAO,CAAC1P,EAAE,GAAG4P,OAAO,CAACjQ,CAAAA,CAAE;YACjC2P,GAAG,CAACnQ,MAAMa,CAAAA,CAAE,GAAGjG,EAAEM,IAAI,CAAC6E,GAAAA,GAAMc,CAAAA,CAAE,GAAG+E,CAAAA;YACjCyK,GAAG,CAACrQ,MAAMa,CAAAA,CAAE,GAAGhG,EAAEK,IAAI,CAAC6E,GAAAA,GAAMc,CAAAA,CAAE,GAAG+E,CAAAA;AACnC,QAAA;AACF,IAAA;IAEA6J,KAAAA,CAAMU,GAAAA,EAAKC,KAAKtV,KAAAA,EAAOC,MAAAA,CAAAA;IACvB0U,KAAAA,CAAMY,GAAAA,EAAKC,KAAKxV,KAAAA,EAAOC,MAAAA,CAAAA;;;AAIvB,IAAA,IAAK,IAAIO,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI4U,MAAM5U,CAAAA,EAAAA,CAAK;AAC7B,QAAA,MAAMmT,EAAAA,GAAK4B,GAAG,CAAC/U,CAAAA,CAAE,GAAG6U,GAAG,CAAC7U,CAAAA,CAAE,GAAGgV,GAAG,CAAChV,CAAAA,CAAE,GAAG8U,GAAG,CAAC9U,CAAAA,CAAE;AAC5C,QAAA,MAAMoT,EAAAA,GAAK4B,GAAG,CAAChV,CAAAA,CAAE,GAAG6U,GAAG,CAAC7U,CAAAA,CAAE,GAAG+U,GAAG,CAAC/U,CAAAA,CAAE,GAAG8U,GAAG,CAAC9U,CAAAA,CAAE;AAC5C,QAAA,MAAMoV,SAAAA,GAAY3U,IAAAA,CAAKqP,KAAK,CAACqD,EAAAA,EAAIC,EAAAA,CAAAA;AACjC,QAAA,IAAIgC,YAAY,KAAA,EAAO;YACrBL,GAAG,CAAC/U,EAAE,GAAG,CAAA;YACTgV,GAAG,CAAChV,EAAE,GAAG,CAAA;QACX,CAAA,MAAO;YACL+U,GAAG,CAAC/U,CAAAA,CAAE,GAAGmT,EAAAA,GAAKiC,SAAAA;YACdJ,GAAG,CAAChV,CAAAA,CAAE,GAAGoT,EAAAA,GAAKgC,SAAAA;AAChB,QAAA;AACF,IAAA;IAEAjB,KAAAA,CAAMY,GAAAA,EAAKC,GAAAA,EAAKxV,KAAAA,EAAOC,MAAAA,EAAQ,IAAA,CAAA;AAE/B,IAAA,IAAI4V,SAAAA,GAAY,CAAA;AAChB,IAAA,IAAIC,YAAY,CAACtE,QAAAA;IACjB,IAAK,IAAIhR,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI4U,IAAAA,EAAM5U,CAAAA,EAAAA,CACxB,IAAI+U,GAAG,CAAC/U,CAAAA,CAAE,GAAGsV,SAAAA,EAAW;QACtBA,SAAAA,GAAYP,GAAG,CAAC/U,CAAAA,CAAE;QAClBqV,SAAAA,GAAYrV,CAAAA;AACd,IAAA;AAEF,IAAA,MAAMwR,KAAK6D,SAAAA,GAAY7V,KAAAA;AACvB,IAAA,MAAM+V,EAAAA,GAAK9U,IAAAA,CAAK6F,KAAK,CAAC+O,SAAAA,GAAY7V,KAAAA,CAAAA;AAElC,IAAA,MAAM+L,KAAKiK,IAAAA,CAAKhE,EAAAA,GAAKiE,UAAUC,MAAAA,CAAOX,GAAAA,EAAKvV,OAAOC,MAAAA,EAAQ+R,EAAAA,GAAK,CAAA,EAAG+D,EAAAA,CAAAA,EAAKD,WAAWI,MAAAA,CAAOX,GAAAA,EAAKvV,OAAOC,MAAAA,EAAQ+R,EAAAA,GAAK,GAAG+D,EAAAA,CAAAA,CAAAA,EAAM/V,KAAAA,CAAAA;AAC3H,IAAA,MAAM8L,KAAKkK,IAAAA,CAAKD,EAAAA,GAAKE,UAAUC,MAAAA,CAAOX,GAAAA,EAAKvV,OAAOC,MAAAA,EAAQ+R,EAAAA,EAAI+D,EAAAA,GAAK,CAAA,CAAA,EAAID,WAAWI,MAAAA,CAAOX,GAAAA,EAAKvV,OAAOC,MAAAA,EAAQ+R,EAAAA,EAAI+D,KAAK,CAAA,CAAA,CAAA,EAAK9V,MAAAA,CAAAA;IAE3H,OAAO;AAAE8L,QAAAA,EAAAA;AAAID,QAAAA,EAAAA;QAAIqK,IAAAA,EAAML;AAAS,KAAA;AAClC;AAEA;;;;;;;AAOG,IACH,SAASG,SAAAA,CAAWvN,IAAY,EAAEuJ,MAAc,EAAEtJ,KAAa,EAAA;IAC7D,MAAMyN,WAAAA,GAAc1N,IAAAA,GAAO,CAAA,GAAIuJ,MAAAA,GAAStJ,KAAAA;AACxC,IAAA,IAAI1H,IAAAA,CAAKgM,GAAG,CAACmJ,WAAAA,CAAAA,GAAe,OAAO,OAAO,CAAA;AAE1C,IAAA,MAAMxL,SAAS,GAAC,IAAOlC,IAAAA,GAAOC,KAAA,CAAA,GAAUyN,WAAAA;AAExC,IAAA,OAAOnV,IAAAA,CAAKgM,GAAG,CAACrC,MAAAA,CAAAA,GAAU,IAAIA,MAAAA,GAAS,CAAA;AACzC;AAEA,SAASsL,MAAAA,CAAQ9V,IAAkB,EAAEJ,KAAa,EAAEC,MAAc,EAAE8F,CAAS,EAAEL,CAAS,EAAA;AACtF,IAAA,MAAM2Q,KAAK,CAAC,CAACtQ,GAAI/F,KAAAA,GAASA,KAAA,IAASA,KAAAA;AACnC,IAAA,MAAMsW,KAAK,CAAC,CAAC5Q,GAAIzF,MAAAA,GAAUA,MAAA,IAAUA,MAAAA;AAErC,IAAA,OAAOG,IAAI,CAACkW,EAAAA,GAAKtW,KAAAA,GAAQqW,EAAAA,CAAG;AAC9B;AAEA,sEACA,SAASL,IAAAA,CAAMtU,KAAa,EAAEvB,CAAS,EAAA;AACrC,IAAA,OAAOuB,KAAAA,GAAQvB,CAAAA,GAAI,CAAA,GAAIuB,KAAAA,GAAQvB,CAAAA,GAAIuB,KAAAA;AACrC;AAEA,SAASgU,KAAMvV,CAAS,EAAA;IACtB,MAAM2K,CAAAA,GAAI,IAAIrF,YAAAA,CAAatF,CAAAA,CAAAA;AAC3B,IAAA,IAAIA,MAAM,CAAA,EAAG;QACX2K,CAAC,CAAC,EAAE,GAAG,CAAA;QAEP,OAAOA,CAAAA;AACT,IAAA;IACA,IAAK,IAAItK,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,CAAAA,EAAGK,IAAKsK,CAAC,CAACtK,CAAAA,CAAE,GAAG,GAAA,IAAO,IAAIS,IAAAA,CAAKwO,GAAG,CAAE,CAAA,GAAIxO,IAAAA,CAAK2P,EAAE,GAAGpQ,CAAAA,IAAML,CAAAA,GAAI,CAAA,CAAA,CAAE,CAAA;IAElF,OAAO2K,CAAAA;AACT;;ACpFM,SAAUyL,eACdC,WAAsB,EACtBC,UAAqB,EACrBlS,OAAAA,GAAyB,EAAE,EAAA;IAE3B,MAAM,EAAEmS,WAAAA,GAAc,GAAG,EAAEC,UAAAA,GAAa,EAAE,EAAE1F,aAAAA,GAAgB,CAAC,EAAE,GAAG1M,OAAAA;IAElE,MAAMqS,QAAAA,GAAW3N,cAAcuN,WAAAA,EAAaE,WAAAA,CAAAA;IAC5C,MAAMG,OAAAA,GAAU5N,cAAcwN,UAAAA,EAAYC,WAAAA,CAAAA;AAE1C,IAAA,MAAMI,YAAAA,GAAepE,YAAAA,CAAakE,QAAAA,CAASpV,KAAK,EAAE;QAAEmR,WAAAA,EAAagE;AAAU,KAAA,CAAA;AAC3E,IAAA,MAAMI,WAAAA,GAAcrE,YAAAA,CAAamE,OAAAA,CAAQrV,KAAK,EAAE;QAAEmR,WAAAA,EAAagE;AAAU,KAAA,CAAA;AAEzE,IAAA,MAAMK,YAAAA,GAAe7F,aAAAA,CAAcyF,QAAAA,CAASpV,KAAK,EAAE,CAAA,CAAA;AACnD,IAAA,MAAMyV,WAAAA,GAAc9F,aAAAA,CAAc0F,OAAAA,CAAQrV,KAAK,EAAE,CAAA,CAAA;AACjD,IAAA,MAAM0V,cAAAA,GAAiB/F,aAAAA,CAAcyF,QAAAA,CAASpV,KAAK,EAAEsV,YAAAA,CAAAA;AACrD,IAAA,MAAMK,aAAAA,GAAgBhG,aAAAA,CAAc0F,OAAAA,CAAQrV,KAAK,EAAEuV,WAAAA,CAAAA;AAEnD,IAAA,MAAMK,aAA0B,EAAE;IAElC,MAAMC,UAAAA,GAAaC,cACjBT,OAAAA,CAAQrV,KAAK,CAACxB,KAAK,GAAG4W,SAASpV,KAAK,CAACxB,KAAK,EAC1C6W,OAAAA,CAAQrV,KAAK,CAACvB,MAAM,GAAG2W,QAAAA,CAASpV,KAAK,CAACvB,MAAM,CAAA;AAE9CsX,IAAAA,IAAAA,CAAKH,UAAAA,EAAY,OAAA,EAAS/H,UAAAA,CACxBgI,UAAAA,EACA,CAAA,EACA;AAAEtR,QAAAA,CAAAA,EAAG6Q,QAAAA,CAASpV,KAAK,CAACxB,KAAK,GAAG,CAAA;AAAG0F,QAAAA,CAAAA,EAAGkR,QAAAA,CAASpV,KAAK,CAACvB,MAAM,GAAG;KAAC,EAC3D;AAAE8F,QAAAA,CAAAA,EAAG8Q,OAAAA,CAAQrV,KAAK,CAACxB,KAAK,GAAG,CAAA;AAAG0F,QAAAA,CAAAA,EAAGmR,OAAAA,CAAQrV,KAAK,CAACvB,MAAM,GAAG;KAAC,CAAA,EACxDgR,aAAAA,CAAAA;AAEH,IAAA,IAAI+F,YAAAA,CAAa9E,OAAO,GAAG,CAAA,IAAK+E,YAAY/E,OAAO,GAAG,CAAA,EACpDqF,IAAAA,CAAKH,UAAAA,EAAY,SAAA,EAAWI,WAAAA,CAAYR,YAAAA,EAAcC,aAAa,CAAA,CAAA,EAAIhG,aAAAA,CAAAA;AAEzE,IAAA,IAAIiG,cAAAA,CAAehF,OAAO,GAAG,CAAA,IAAKiF,cAAcjF,OAAO,GAAG,CAAA,EACxDqF,IAAAA,CACEH,YACA,QAAA,EACAI,WAAAA,CAAYN,cAAAA,EAAgBC,aAAAA,EAAeJ,cAAcD,YAAAA,CAAAA,EACzD7F,aAAAA,CAAAA;IAGJ,IAAIwG,UAAAA,GAAsBpI,WACxBnM,MAAAA,CAAOgK,QAAQ,CAACmK,UAAAA,CAAAA,GAAcA,UAAAA,GAAa,GAC3C,CAAA,EACA;AAAEtR,QAAAA,CAAAA,EAAG6Q,QAAAA,CAASpV,KAAK,CAACxB,KAAK,GAAG,CAAA;AAAG0F,QAAAA,CAAAA,EAAGkR,QAAAA,CAASpV,KAAK,CAACvB,MAAM,GAAG;KAAC,EAC3D;AAAE8F,QAAAA,CAAAA,EAAG8Q,OAAAA,CAAQrV,KAAK,CAACxB,KAAK,GAAG,CAAA;AAAG0F,QAAAA,CAAAA,EAAGmR,OAAAA,CAAQrV,KAAK,CAACvB,MAAM,GAAG;AAAC,KAAA,CAAA;AAE3D,IAAA,IAAI4S,YAAY,CAACrB,QAAAA;AACjB,IAAA,IAAIkG,YAAAA,GAAe,UAAA;IAEnB,KAAK,MAAMlV,aAAa4U,UAAAA,CAAY;QAClC,KAAK,MAAMO,WAAWC,qBAAAA,CAAsBpV,SAAAA,EAAWoU,SAASpV,KAAK,EAAEqV,OAAAA,CAAQrV,KAAK,CAAA,CAAG;AACrF,YAAA,MAAMqW,SAAS1L,QAAAA,CAAS0K,OAAAA,CAAQrV,KAAK,EAAEmW,QAAQ1M,MAAM,EAAE2L,QAAAA,CAASpV,KAAK,CAACxB,KAAK,EAAE4W,SAASpV,KAAK,CAACvB,MAAM,EAAE,CAAA,CAAA;AACpG,YAAA,MAAM8S,KAAAA,GAAQlT,WAAAA,CAAY+W,QAAAA,CAASpV,KAAK,EAAEqW,MAAAA,CAAAA;AAC1C,YAAA,IAAI9E,QAAQF,SAAAA,EAAW;AACrB4E,gBAAAA,UAAAA,GAAaE,QAAQ1M,MAAM;gBAC3B4H,SAAAA,GAAYE,KAAAA;AACZ2E,gBAAAA,YAAAA,GAAeC,QAAQG,QAAQ;AACjC,YAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAO;;AAEL7M,QAAAA,MAAAA,EAAU2E,OAAO6H,UAAAA,EAAYb,QAAAA,CAASxN,KAAK,EAAEyN,QAAQzN,KAAK,CAAA;QAC1D2J,KAAAA,EAAUF,SAAAA,KAAc,CAACrB,QAAAA,GAAW,CAAA,GAAIqB,SAAAA;QACxCiF,QAAAA,EAAUJ,YAAAA;QACVK,IAAAA,EAAU;YAAEnB,QAAAA,EAAUE,YAAAA;YAAcD,OAAAA,EAASE;AAAW;;AAE5D;AAEA,8FACA,SAASa,qBAAAA,CACPpV,SAAoB,EACpBoU,QAAmB,EACnBC,OAAkB,EAAA;IAElB,MAAMgB,MAAAA,GAAS1L,QAAAA,CAAS0K,OAAAA,EAASrU,SAAAA,CAAUyI,MAAM,EAAE2L,QAAAA,CAAS5W,KAAK,EAAE4W,QAAAA,CAAS3W,MAAM,EAAE,CAAA,CAAA;IAEpF,IAAI+X,KAAAA;IACJ,IAAI;AACFA,QAAAA,KAAAA,GAAQ7C,eAAeyB,QAAAA,EAAUiB,MAAAA,CAAAA;AACnC,IAAA,CAAA,CAAE,OAAA,MAAA,EAAM;QACN,OAAO;AAACrV,YAAAA;AAAU,SAAA;AACpB,IAAA;AAEA,IAAA,IAAI,CAACU,MAAAA,CAAOgK,QAAQ,CAAC8K,MAAMjM,EAAE,CAAA,IAAK,CAAC7I,MAAAA,CAAOgK,QAAQ,CAAC8K,KAAAA,CAAMlM,EAAE,GAAG,OAAO;AAACtJ,QAAAA;AAAU,KAAA;AAChF,IAAA,IAAIvB,IAAAA,CAAKgM,GAAG,CAAC+K,KAAAA,CAAMjM,EAAE,CAAA,GAAI,IAAA,IAAQ9K,IAAAA,CAAKgM,GAAG,CAAC+K,KAAAA,CAAMlM,EAAE,CAAA,GAAI,MAAM,OAAO;AAACtJ,QAAAA;AAAU,KAAA;;;IAI9E,OAAO;AACLA,QAAAA,SAAAA;AACA,QAAA;AACEsV,YAAAA,QAAAA,EAAU,CAAA,EAAGtV,SAAAA,CAAUsV,QAAQ,CAAA,MAAA,CAAQ;YACvC7M,MAAAA,EAAUqD,QAAAA,CAAS9L,UAAUyI,MAAM,EAAE8D,YAAYiJ,KAAAA,CAAMjM,EAAE,EAAEiM,KAAAA,CAAMlM,EAAE,CAAA;AACpE;AACF,KAAA;AACH;AAEA,SAAS0L,WAAAA,CAAaZ,QAAuB,EAAEC,OAAsB,EAAEzF,KAAa,EAAA;AAClF,IAAA,MAAMhI,KAAAA,GAAQkO,aAAAA,CAAcT,OAAAA,CAAQ7W,KAAK,GAAG4W,QAAAA,CAAS5W,KAAK,EAAE6W,OAAAA,CAAQ5W,MAAM,GAAG2W,QAAAA,CAAS3W,MAAM,CAAA;AAE5F,IAAA,OAAOoP,WAAWjG,KAAAA,EAAOgI,KAAAA,EAAOwF,SAAS3E,MAAM,EAAE4E,QAAQ5E,MAAM,CAAA;AACjE;AAEA,SAASsF,KAAMU,IAAiB,EAAEH,QAAgB,EAAE7M,MAAe,EAAEgG,aAAqB,EAAA;AACxF,IAAA,IAAID,WAAAA,CAAY/F,MAAAA,EAAQgG,aAAAA,CAAAA,EAAgBgH,IAAAA,CAAKV,IAAI,CAAC;AAAEO,QAAAA,QAAAA;AAAU7M,QAAAA;AAAM,KAAA,CAAA;AACtE;AAEA;;;;;AAKG,IACH,SAASqM,aAAAA,CAAexX,CAAS,EAAEC,CAAS,EAAA;AAC1C,IAAA,IAAImD,MAAAA,CAAOgV,KAAK,CAACpY,CAAAA,CAAAA,IAAMoD,MAAAA,CAAOgV,KAAK,CAACnY,CAAAA,CAAAA,IAAMD,CAAAA,IAAK,CAAA,IAAKC,CAAAA,IAAK,CAAA,EAAG,OAAOoY,GAAAA;IAEnE,OAAOlX,IAAAA,CAAKC,IAAI,CAACpB,CAAAA,GAAIC,CAAAA,CAAAA;AACvB;;AC/KA;;;;;;;;IASM,SAAUqY,YAAAA,CAAcC,IAAY,EAAA;AACxC,IAAA,IAAIC,QAAQD,IAAAA,KAAS,CAAA;IAErB,OAAO,IAAA;QACLC,KAAAA,GAASA,QAAQ,UAAA,KAAgB,CAAA;AACjC,QAAA,IAAI1Q,CAAAA,GAAI0Q,KAAAA;AACR1Q,QAAAA,CAAAA,GAAI3G,KAAKsX,IAAI,CAAC3Q,CAAAA,GAAKA,CAAAA,KAAM,IAAKA,CAAAA,GAAI,CAAA,CAAA;AAClCA,QAAAA,CAAAA,IAAKA,IAAI3G,IAAAA,CAAKsX,IAAI,CAAC3Q,CAAAA,GAAKA,CAAAA,KAAM,GAAIA,CAAAA,GAAI,EAAA,CAAA;QAEtC,OAAQ,CAAA,CAACA,IAAKA,CAAAA,KAAM,EAAE,MAAO,CAAA,IAAK,UAAA;AACpC,IAAA,CAAA;AACF;AAEA,oGACM,SAAU4Q,QAAAA,CAAUC,MAAoB,EAAA;AAC5C,IAAA,MAAMxM,IAAIhL,IAAAA,CAAKiF,GAAG,CAACuS,MAAAA,EAAAA,EAAUvV,OAAOwV,OAAO,CAAA;AAC3C,IAAA,MAAMrT,CAAAA,GAAIoT,MAAAA,EAAAA;AAEV,IAAA,OAAOxX,IAAAA,CAAKC,IAAI,CAAC,KAAKD,IAAAA,CAAK0X,GAAG,CAAC1M,CAAAA,CAAAA,CAAAA,GAAMhL,KAAKwO,GAAG,CAAC,CAAA,GAAIxO,IAAAA,CAAK2P,EAAE,GAAGvL,CAAAA,CAAAA;AAC9D;;ACkCO,MAAMuT,mBAAmB,CAAA;AAChC,MAAMC,kBAAkBD,gBAAAA,GAAmB,EAAA;AAC3C,iGACA,MAAME,UAAAA,GAAa,EAAA;AAEnB,iEACA,MAAMC,MAAAA,GAAsC;AAC1C,IAAA;AAAC,QAAA,CAAA;QAAG;AAAG,KAAA;AAAE,IAAA;AAAC,QAAA,CAAA;QAAG;AAAG,KAAA;AAAE,IAAA;AAAC,QAAA,CAAA;QAAG;AAAG,KAAA;AAAE,IAAA;AAAC,QAAA,CAAA;QAAG;AAAG,KAAA;AAAE,IAAA;AAAC,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;AAAC,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;AAAC,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;AAAC,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AAClE,IAAA;AAAC,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;QAAC,EAAC;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;QAAC,EAAC;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;QAAC,EAAC;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;QAAC,EAAC;AAAG,QAAA;AAAE,KAAA;AAAE,IAAA;QAAC,EAAC;QAAG;AAAG,KAAA;AAAE,IAAA;QAAC,EAAC;QAAG;AAAG,KAAA;AAAE,IAAA;QAAC,EAAC;QAAG;AAAG;AACzE,CAAA;AACD,MAAMC,GAAAA,GAAM,CAAA;AACZ,MAAMC,eAAAA,GAAkBhY,KAAK6F,KAAK,CAAC,CAACkS,GAAAA,GAAM,CAAA,IAAK,CAAA,CAAA;SAE/BE,iBAAAA,CAAmB1X,KAAgB,EAAE+C,OAAAA,GAA0B,EAAE,EAAA;IAC/E,MAAM,EACJ4U,cAAc,IAAI,EAClBC,gBAAgB,IAAI,EACpBC,MAAAA,GAAS,CAAC,EACVC,WAAAA,GAAc,GAAG,EACjBC,SAAAA,GAAY,EAAE,EACdC,QAAAA,GAAW,CAAC,EACZnB,IAAAA,GAAO,OAAO,EACf,GAAG9T,OAAAA;IAEJ,MAAMkV,QAAAA,GAAWC,gBAAgBH,SAAAA,EAAWlB,IAAAA,CAAAA;AAC5C,IAAA,MAAMsB,SAAAA,GAAaJ,CAAAA,SAAAA,GAAY,CAAA,IAAK,CAAA;AACpC,IAAA,MAAMK,SAAS3Y,IAAAA,CAAK2H,IAAI,CAAC+Q,SAAAA,GAAY1Y,IAAAA,CAAK4Y,KAAK,CAAA,GAAI,CAAA;AAEnD,IAAA,MAAMC,YAAwB,EAAE;AAChC,IAAA,MAAMC,mBAAkC,EAAE;AAC1C,IAAA,MAAMC,QAAAA,GAAW/Y,IAAAA,CAAK2H,IAAI,CAACuQ,WAAAA,GAAcE,MAAAA,CAAAA;AAEzC,IAAA,IAAK,IAAIY,KAAAA,GAAQ,CAAA,EAAGA,KAAAA,GAAQZ,QAAQY,KAAAA,EAAAA,CAAS;AAC3C,QAAA,MAAMC,aAAaZ,WAAAA,IAAeW,KAAAA;AAClC,QAAA,MAAMja,QAAQiB,IAAAA,CAAKkF,KAAK,CAAC3E,KAAAA,CAAMxB,KAAK,GAAGka,UAAAA,CAAAA;AACvC,QAAA,MAAMja,SAASgB,IAAAA,CAAKkF,KAAK,CAAC3E,KAAAA,CAAMvB,MAAM,GAAGia,UAAAA,CAAAA;AACzC,QAAA,IAAIla,QAAQ4Z,MAAAA,GAAS,CAAA,GAAI,KAAK3Z,MAAAA,GAAS2Z,MAAAA,GAAS,IAAI,CAAA,EAAG;AAEvD,QAAA,MAAMO,aAAaF,KAAAA,KAAU,CAAA,GAAIzY,KAAAA,GAAQsH,UAAAA,CAAWtH,OAAOxB,KAAAA,EAAOC,MAAAA,CAAAA;;;QAGlE,MAAMma,QAAAA,GAAWpU,QAAQmU,UAAAA,EAAY,CAAA,CAAA;QAErC,MAAME,KAAAA,GAAQC,UAAAA,CAAWH,UAAAA,EAAYf,aAAAA,EAAeQ,MAAAA,CAAAA;AACpD,QAAA,MAAMW,IAAAA,GAAOC,UAAAA,CAAWH,KAAAA,EAAOra,KAAAA,EAAOC,QAAQuZ,QAAAA,EAAUQ,QAAAA,CAAAA;QAExD,KAAK,MAAMS,UAAUF,IAAAA,CAAM;YACzB,MAAMnJ,KAAAA,GAAQsJ,YAAYP,UAAAA,EAAYM,MAAAA,CAAO1U,CAAC,EAAE0U,MAAAA,CAAO/U,CAAC,EAAEiU,SAAAA,CAAAA;AAC1D,YAAA,MAAMrS,MAAMqT,QAAAA,CAASvJ,KAAAA,CAAAA;YACrB,MAAMwJ,UAAAA,GAAaC,QAAAA,CAAST,QAAAA,EAAUK,MAAAA,CAAO1U,CAAC,EAAE0U,MAAAA,CAAO/U,CAAC,EAAE+T,QAAQ,CAACnS,GAAAA,CAAI,CAAA;AACvE,YAAA,IAAIsT,eAAe,IAAA,EAAM;AAEzBb,YAAAA,gBAAAA,CAAiBxC,IAAI,CAACqD,UAAAA,CAAAA;AACtBd,YAAAA,SAAAA,CAAUvC,IAAI,CAAC;AACbxR,gBAAAA,CAAAA,EAAO,CAAC0U,MAAAA,CAAO1U,CAAC,GAAG,GAAA,IAAOmU,UAAAA;AAC1BxU,gBAAAA,CAAAA,EAAO,CAAC+U,MAAAA,CAAO/U,CAAC,GAAG,GAAA,IAAOwU,UAAAA;AAC1BnH,gBAAAA,KAAAA,EAAO0H,OAAO1H,KAAK;AACnB3B,gBAAAA,KAAAA;AACA6I,gBAAAA,KAAAA;AACA7E,gBAAAA,IAAAA,EAAOmE,SAAAA,GAAYW;AACpB,aAAA,CAAA;AACH,QAAA;AACF,IAAA;AAEA,IAAA,MAAMY,WAAAA,GAAc,IAAIC,WAAAA,CAAYhB,gBAAAA,CAAiB1Z,MAAM,GAAGuY,gBAAAA,CAAAA;AAC9D,IAAA,KAAK,MAAM,CAACpY,CAAAA,EAAGwa,KAAAA,CAAM,IAAIjB,gBAAAA,CAAiBjV,OAAO,EAAA,CAAIgW,WAAAA,CAAY/F,GAAG,CAACiG,KAAAA,EAAOxa,CAAAA,GAAIoY,gBAAAA,CAAAA;IAEhF,OAAO;AAAEkB,QAAAA,SAAAA;AAAWgB,QAAAA;;AACtB;AAQA,uFACgBR,UAAAA,CAAY9Y,KAAgB,EAAE0G,SAAiB,EAAE0R,MAAc,EAAA;AAC7E,IAAA,MAAM,EAAE5Z,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAGoB,KAAAA;IAChC,MAAMyZ,MAAAA,GAAS,IAAI/Y,YAAAA,CAAalC,KAAAA,GAAQC,MAAAA,CAAAA;IACxC,MAAMib,IAAAA,GAAO,IAAIzV,YAAAA,CAAa,EAAA,CAAA;AAE9B,IAAA,IAAK,IAAIC,CAAAA,GAAIkU,MAAAA,EAAQlU,CAAAA,GAAIzF,MAAAA,GAAS2Z,QAAQlU,CAAAA,EAAAA,CAAK;AAC7C,QAAA,IAAK,IAAIK,CAAAA,GAAI6T,MAAAA,EAAQ7T,CAAAA,GAAI/F,KAAAA,GAAQ4Z,QAAQ7T,CAAAA,EAAAA,CAAK;AAC5C,YAAA,MAAMkM,MAAAA,GAAS7R,IAAI,CAACsF,CAAAA,GAAI1F,QAAQ+F,CAAAA,CAAE;AAClC,YAAA,MAAMwN,OAAOtB,MAAAA,GAAS/J,SAAAA;AACtB,YAAA,MAAMoL,MAAMrB,MAAAA,GAAS/J,SAAAA;;;;;;;AAQrB,YAAA,IAAIiT,MAAAA,GAAS,CAAA;AACb,YAAA,IAAIC,IAAAA,GAAO,CAAA;AACX,YAAA,KAAK,MAAM5S,CAAAA,IAAK;AAAC,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA,CAAA;AAAG,gBAAA;aAAG,CAAE;gBAC7B,MAAM9G,KAAAA,GAAQtB,IAAI,CAAEsF,CAAAA,CAAAA,GAAIqT,MAAM,CAACvQ,CAAAA,CAAE,CAAC,EAAE,IAAIxI,QAAQ+F,CAAAA,GAAIgT,MAAM,CAACvQ,CAAAA,CAAE,CAAC,EAAE,CAAC;AACjE,gBAAA,IAAI9G,QAAQ6R,IAAAA,EAAM4H,MAAAA,EAAAA;AACb,qBAAA,IAAIzZ,QAAQ4R,GAAAA,EAAK8H,IAAAA,EAAAA;AACxB,YAAA;YACA,IAAID,MAAAA,GAASlC,eAAAA,IAAmBmC,IAAAA,GAAOnC,eAAAA,EAAiB;AAExD,YAAA,IAAK,IAAIzQ,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,EAAA,EAAIA,CAAAA,EAAAA,CAAK0S,IAAI,CAAC1S,CAAAA,CAAE,GAAGpI,IAAI,CAAC,CAACsF,CAAAA,GAAIqT,MAAM,CAACvQ,CAAAA,CAAE,CAAC,CAAA,CAAE,IAAIxI,KAAAA,GAAQ+F,CAAAA,GAAIgT,MAAM,CAACvQ,CAAAA,CAAE,CAAC,EAAE,CAAC;AAC1F,YAAA,IAAI,CAAC6S,MAAAA,CAAOH,IAAAA,EAAM3H,IAAAA,EAAMD,GAAAA,CAAAA,EAAM;AAE9B,YAAA,IAAIgI,SAAAA,GAAY,CAAA;AAChB,YAAA,IAAIC,OAAAA,GAAU,CAAA;AACd,YAAA,IAAK,IAAI/S,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,IAAIA,CAAAA,EAAAA,CAAK;gBAC3B,IAAI0S,IAAI,CAAC1S,CAAAA,CAAE,GAAG+K,MAAM+H,SAAAA,IAAaJ,IAAI,CAAC1S,CAAAA,CAAE,GAAG+K,IAAAA;qBACtC,IAAI2H,IAAI,CAAC1S,CAAAA,CAAE,GAAG8K,KAAKiI,OAAAA,IAAWjI,GAAAA,GAAM4H,IAAI,CAAC1S,CAAAA,CAAE;AAClD,YAAA;YACAyS,MAAM,CAACvV,IAAI1F,KAAAA,GAAQ+F,CAAAA,CAAE,GAAG9E,IAAAA,CAAKiF,GAAG,CAACoV,SAAAA,EAAWC,OAAAA,CAAAA;AAC9C,QAAA;AACF,IAAA;AAEA,IAAA,MAAMjK,UAAoB,EAAE;AAC5B,IAAA,IAAK,IAAI5L,CAAAA,GAAIkU,MAAAA,EAAQlU,CAAAA,GAAIzF,MAAAA,GAAS2Z,QAAQlU,CAAAA,EAAAA,CAAK;AAC7C,QAAA,IAAK,IAAIK,CAAAA,GAAI6T,MAAAA,EAAQ7T,CAAAA,GAAI/F,KAAAA,GAAQ4Z,QAAQ7T,CAAAA,EAAAA,CAAK;AAC5C,YAAA,MAAMgN,KAAAA,GAAQkI,MAAM,CAACvV,CAAAA,GAAI1F,QAAQ+F,CAAAA,CAAE;AACnC,YAAA,IAAIgN,SAAS,CAAA,EAAG;AAEhB,YAAA,IAAIyI,MAAAA,GAAS,IAAA;AACb,YAAA,IAAK,IAAI1P,EAAAA,GAAK,EAAC,EAAG0P,UAAU1P,EAAAA,IAAM,CAAA,EAAGA,EAAAA,EAAAA,CACnC,IAAK,IAAIC,EAAAA,GAAK,EAAC,EAAGA,EAAAA,IAAM,GAAGA,EAAAA,EAAAA,CAAM;gBAC/B,IAAIA,EAAAA,KAAO,CAAA,IAAKD,EAAAA,KAAO,CAAA,EAAG;gBAE1B,IAAImP,MAAM,CAAEvV,CAAAA,CAAAA,GAAIoG,MAAM9L,KAAAA,GAAQ+F,CAAAA,GAAIgG,EAAAA,CAAG,GAAGgH,KAAAA,EAAO;oBAC7CyI,MAAAA,GAAS,KAAA;AACT,oBAAA;AACF,gBAAA;AACF,YAAA;YAEF,IAAIA,MAAAA,EAAQlK,OAAAA,CAAQiG,IAAI,CAAC;AAAExR,gBAAAA,CAAAA;AAAGL,gBAAAA,CAAAA;AAAGqN,gBAAAA;AAAK,aAAA,CAAA;AACxC,QAAA;AACF,IAAA;IAEA,OAAOzB,OAAAA;AACT;AAEA,+FACA,SAAS+J,MAAAA,CAAQH,IAAkB,EAAE3H,IAAY,EAAED,GAAW,EAAA;AAC5D,IAAA,IAAImI,SAAAA,GAAY,CAAA;AAChB,IAAA,IAAIC,OAAAA,GAAU,CAAA;AAEd,IAAA,IAAK,IAAIlT,CAAAA,GAAI,CAAA,EAAGA,IAAI,EAAA,GAAKwQ,GAAAA,GAAM,GAAGxQ,CAAAA,EAAAA,CAAK;AACrC,QAAA,MAAM9G,KAAAA,GAAQwZ,IAAI,CAAC1S,CAAAA,GAAI,EAAA,CAAG;QAC1BiT,SAAAA,GAAY/Z,KAAAA,GAAQ6R,IAAAA,GAAOkI,SAAAA,GAAY,CAAA,GAAI,CAAA;QAC3CC,OAAAA,GAAUha,KAAAA,GAAQ4R,GAAAA,GAAMoI,OAAAA,GAAU,CAAA,GAAI,CAAA;AACtC,QAAA,IAAID,SAAAA,IAAazC,GAAAA,IAAO0C,OAAAA,IAAW1C,GAAAA,EAAK,OAAO,IAAA;AACjD,IAAA;IAEA,OAAO,KAAA;AACT;AAEA;;;;;;;IAQA,SAASwB,UAAAA,CACPlJ,OAAiB,EACjBtR,KAAa,EACbC,MAAc,EACduZ,QAAgB,EAChBmC,MAAc,EAAA;AAEd,IAAA,IAAIrK,OAAAA,CAAQjR,MAAM,IAAIsb,MAAAA,EAAQ,OAAOrK,OAAAA;AAErC,IAAA,MAAMsK,QAAQ,IAAIC,GAAAA,EAAAA;AAClB,IAAA,MAAMC,YAAY9b,KAAAA,GAAQwZ,QAAAA;AAC1B,IAAA,MAAMuC,aAAa9b,MAAAA,GAASuZ,QAAAA;IAE5B,KAAK,MAAMiB,UAAUnJ,OAAAA,CAAS;QAC5B,MAAM+E,EAAAA,GAAKpV,IAAAA,CAAKqF,GAAG,CAACkT,QAAAA,GAAW,CAAA,EAAGvY,IAAAA,CAAK6F,KAAK,CAAC2T,MAAAA,CAAO1U,CAAC,GAAG+V,SAAAA,CAAAA,CAAAA;QACxD,MAAMxF,EAAAA,GAAKrV,IAAAA,CAAKqF,GAAG,CAACkT,QAAAA,GAAW,CAAA,EAAGvY,IAAAA,CAAK6F,KAAK,CAAC2T,MAAAA,CAAO/U,CAAC,GAAGqW,UAAAA,CAAAA,CAAAA;QACxD,MAAMC,GAAAA,GAAM1F,KAAKkD,QAAAA,GAAWnD,EAAAA;QAC5B,MAAM4F,MAAAA,GAASL,KAAAA,CAAMM,GAAG,CAACF,GAAAA,CAAAA;AACzB,QAAA,IAAIC,MAAAA,KAAWE,SAAAA,EAAWP,KAAAA,CAAM7G,GAAG,CAACiH,GAAAA,EAAK;AAACvB,YAAAA;AAAO,SAAA,CAAA;AAC5CwB,aAAAA,MAAAA,CAAO1E,IAAI,CAACkD,MAAAA,CAAAA;AACnB,IAAA;AAEA,IAAA,MAAM2B,OAAAA,GAAUnb,IAAAA,CAAKiF,GAAG,CAAC,GAAGjF,IAAAA,CAAK6F,KAAK,CAAC6U,MAAAA,GAAS1a,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAG0V,MAAMxG,IAAI,CAAA,CAAA,CAAA;AACtE,IAAA,MAAMmF,OAAiB,EAAE;AACzB,IAAA,MAAM8B,YAAsB,EAAE;AAE9B,IAAA,KAAK,MAAMJ,MAAAA,IAAUL,KAAAA,CAAMU,MAAM,EAAA,CAAI;QACnCL,MAAAA,CAAOM,IAAI,CAAC,CAACzc,CAAAA,EAAGC,IAAMA,CAAAA,CAAEgT,KAAK,GAAGjT,CAAAA,CAAEiT,KAAK,CAAA;AACvCwH,QAAAA,IAAAA,CAAKhD,IAAI,CAAA,GAAI0E,MAAAA,CAAOO,KAAK,CAAC,CAAA,EAAGJ,OAAAA,CAAAA,CAAAA;AAC7BC,QAAAA,SAAAA,CAAU9E,IAAI,CAAA,GAAI0E,MAAAA,CAAOO,KAAK,CAACJ,OAAAA,CAAAA,CAAAA;AACjC,IAAA;IAEA,IAAI7B,IAAAA,CAAKla,MAAM,GAAGsb,MAAAA,EAAQ;QACxBU,SAAAA,CAAUE,IAAI,CAAC,CAACzc,CAAAA,EAAGC,IAAMA,CAAAA,CAAEgT,KAAK,GAAGjT,CAAAA,CAAEiT,KAAK,CAAA;QAC1CwH,IAAAA,CAAKhD,IAAI,IAAI8E,SAAAA,CAAUG,KAAK,CAAC,CAAA,EAAGb,MAAAA,GAASpB,KAAKla,MAAM,CAAA,CAAA;AACtD,IAAA;;;IAIA,IAAIka,IAAAA,CAAKla,MAAM,GAAGsb,MAAAA,EAAQ;QACxBpB,IAAAA,CAAKgC,IAAI,CAAC,CAACzc,CAAAA,EAAGC,IAAMA,CAAAA,CAAEgT,KAAK,GAAGjT,CAAAA,CAAEiT,KAAK,CAAA;QAErC,OAAOwH,IAAAA,CAAKiC,KAAK,CAAC,CAAA,EAAGb,MAAAA,CAAAA;AACvB,IAAA;IAEA,OAAOpB,IAAAA;AACT;AAEA;;;;;IAMM,SAAUG,WAAAA,CAAalZ,KAAgB,EAAE6U,EAAU,EAAEC,EAAU,EAAErQ,MAAc,EAAA;AACnF,IAAA,MAAM,EAAEjG,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAGoB,KAAAA;IAChC,MAAMO,CAAAA,GAAId,IAAAA,CAAK6F,KAAK,CAACb,MAAAA,CAAAA;AACrB,IAAA,IAAIwW,GAAAA,GAAM,CAAA;AACV,IAAA,IAAIC,GAAAA,GAAM,CAAA;AAEV,IAAA,IAAK,IAAI5Q,EAAAA,GAAK,CAAC/J,CAAAA,EAAG+J,EAAAA,IAAM/J,GAAG+J,EAAAA,EAAAA,CAAM;AAC/B,QAAA,MAAMpG,IAAI4Q,EAAAA,GAAKxK,EAAAA;QACf,IAAIpG,CAAAA,GAAI,CAAA,IAAKA,CAAAA,IAAKzF,MAAAA,EAAQ;QAC1B,MAAMgT,IAAAA,GAAOhS,KAAK6F,KAAK,CAAC7F,KAAKC,IAAI,CAACa,CAAAA,GAAIA,CAAAA,GAAI+J,EAAAA,GAAKA,EAAAA,CAAAA,CAAAA;AAC/C,QAAA,MAAMxD,MAAM5C,CAAAA,GAAI1F,KAAAA;AAChB,QAAA,IAAK,IAAI+L,EAAAA,GAAK,CAACkH,IAAAA,EAAMlH,EAAAA,IAAMkH,MAAMlH,EAAAA,EAAAA,CAAM;AACrC,YAAA,MAAMhG,IAAIsQ,EAAAA,GAAKtK,EAAAA;YACf,IAAIhG,CAAAA,GAAI,CAAA,IAAKA,CAAAA,IAAK/F,KAAAA,EAAO;AACzB,YAAA,MAAM0B,KAAAA,GAAQtB,IAAI,CAACkI,GAAAA,GAAMvC,CAAAA,CAAE;AAC3B0W,YAAAA,GAAAA,IAAO1Q,EAAAA,GAAKrK,KAAAA;AACZgb,YAAAA,GAAAA,IAAO5Q,EAAAA,GAAKpK,KAAAA;AACd,QAAA;AACF,IAAA;IAEA,OAAOT,IAAAA,CAAK0P,KAAK,CAAC+L,GAAAA,EAAKD,GAAAA,CAAAA;AACzB;AAEA,SAAS9B,SAAUvJ,KAAa,EAAA;IAC9B,MAAMuL,KAAAA,GAAQ1b,IAAAA,CAAK2P,EAAE,GAAG,CAAA;AACxB,IAAA,MAAMgM,aAAa,CAAC,KAACxL,GAAQuL,KAAAA,GAASA,KAAA,IAASA,KAAAA;AAE/C,IAAA,OAAO1b,KAAK6F,KAAK,CAAC,UAAC8V,GAAaD,QAAS7D,UAAAA,CAAAA,GAAcA,UAAAA;AACzD;AAEA,SAAS+B,SAAUrZ,KAAgB,EAAE6U,EAAU,EAAEC,EAAU,EAAEuG,OAAmB,EAAA;AAC9E,IAAA,MAAM,EAAE7c,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAGoB,KAAAA;IAChC,MAAMwD,GAAAA,GAAM,IAAI+V,WAAAA,CAAYnC,gBAAAA,CAAAA;AAE5B,IAAA,IAAK,IAAI9E,GAAAA,GAAM,CAAA,EAAGA,GAAAA,GAAM+E,iBAAiB/E,GAAAA,EAAAA,CAAO;AAC9C,QAAA,MAAMgJ,OAAOhJ,GAAAA,GAAM,CAAA;AACnB,QAAA,MAAMpN,EAAAA,GAAK2P,EAAAA,GAAKwG,OAAO,CAACC,IAAAA,CAAK;AAC7B,QAAA,MAAMzW,EAAAA,GAAKiQ,EAAAA,GAAKuG,OAAO,CAACC,OAAO,CAAA,CAAE;AACjC,QAAA,MAAMC,EAAAA,GAAK1G,EAAAA,GAAKwG,OAAO,CAACC,OAAO,CAAA,CAAE;AACjC,QAAA,MAAME,EAAAA,GAAK1G,EAAAA,GAAKuG,OAAO,CAACC,OAAO,CAAA,CAAE;AAEjC,QAAA,IAAIpW,KAAK,CAAA,IAAKL,EAAAA,GAAK,CAAA,IAAK0W,EAAAA,GAAK,KAAKC,EAAAA,GAAK,CAAA,IAAKtW,EAAAA,IAAM1G,KAAAA,IAASqG,MAAMpG,MAAAA,IAAU8c,EAAAA,IAAM/c,KAAAA,IAASgd,EAAAA,IAAM/c,QAC9F,OAAO,IAAA;QAET,IAAIG,IAAI,CAACiG,EAAAA,GAAKrG,KAAAA,GAAQ0G,GAAG,GAAGtG,IAAI,CAAC4c,EAAAA,GAAKhd,KAAAA,GAAQ+c,GAAG,EAC/C/X,GAAG,CAAC8O,GAAAA,IAAO,CAAA,CAAE,IAAI,CAAA,KAAMA,MAAM,EAAA,CAAA;AACjC,IAAA;IAEA,OAAO9O,GAAAA;AACT;AAEA,MAAMiY,eAAe,IAAIpB,GAAAA,EAAAA;AAEzB;;;;;;AAMG,IACH,SAASnC,eAAAA,CAAiBH,SAAiB,EAAElB,IAAY,EAAA;AACvD,IAAA,MAAM2D,GAAAA,GAAM,CAAA,EAAGzC,SAAAA,CAAS,CAAA,EAAIlB,IAAAA,CAAAA,CAAM;IAClC,MAAM6E,MAAAA,GAASD,YAAAA,CAAaf,GAAG,CAACF,GAAAA,CAAAA;IAChC,IAAIkB,MAAAA,KAAWf,WAAW,OAAOe,MAAAA;AAEjC,IAAA,MAAM7I,IAAAA,GAAQkF,CAAAA,SAAAA,GAAY,CAAA,IAAK,CAAA;AAC/B,IAAA,MAAM4D,QAAQ5D,SAAAA,GAAY,CAAA;AAC1B,IAAA,MAAMd,SAASL,YAAAA,CAAaC,IAAAA,CAAAA;IAC5B,MAAMyE,IAAAA,GAAO,IAAIrX,YAAAA,CAAaoT,eAAAA,GAAkB,CAAA,CAAA;AAEhD,IAAA,IAAK,IAAIrY,CAAAA,GAAI,CAAA,EAAGA,IAAIqY,eAAAA,GAAkB,CAAA,EAAGrY,IACvCsc,IAAI,CAACtc,EAAE,GAAG6J,KAAAA,CAAMpJ,KAAKkF,KAAK,CAACqS,SAASC,MAAAA,CAAAA,GAAU0E,KAAAA,CAAAA,EAAQ,CAAC9I,IAAAA,EAAMA,IAAAA,CAAAA;AAE/D,IAAA,MAAMoF,WAAyB,EAAE;AACjC,IAAA,IAAK,IAAInS,GAAAA,GAAM,CAAA,EAAGA,GAAAA,GAAMwR,YAAYxR,GAAAA,EAAAA,CAAO;AACzC,QAAA,MAAM8J,QAAQ,GAAC9J,GAAMwR,UAAAA,GAAc7X,IAAAA,CAAK2P,EAAE,GAAG,CAAA;QAC7C,MAAMnB,GAAAA,GAAMxO,IAAAA,CAAKwO,GAAG,CAAC2B,KAAAA,CAAAA;QACrB,MAAM1B,GAAAA,GAAMzO,IAAAA,CAAKyO,GAAG,CAAC0B,KAAAA,CAAAA;QACrB,MAAMgM,OAAAA,GAAU,IAAI5T,UAAAA,CAAWqP,eAAAA,GAAkB,CAAA,CAAA;AAEjD,QAAA,IAAK,IAAIrY,CAAAA,GAAI,CAAA,EAAGA,IAAIqY,eAAAA,GAAkB,CAAA,EAAGrY,KAAK,CAAA,CAAG;YAC/C,MAAMuF,CAAAA,GAAI+W,IAAI,CAACtc,CAAAA,CAAE;AACjB,YAAA,MAAMkF,CAAAA,GAAIoX,IAAI,CAACtc,CAAAA,GAAI,CAAA,CAAE;YACrB4c,OAAO,CAAC5c,EAAE,GAAGS,IAAAA,CAAKkF,KAAK,CAACsJ,GAAAA,GAAM1J,IAAI2J,GAAAA,GAAMhK,CAAAA,CAAAA;YACxC0X,OAAO,CAAC5c,IAAI,CAAA,CAAE,GAAGS,KAAKkF,KAAK,CAACuJ,GAAAA,GAAM3J,CAAAA,GAAI0J,GAAAA,GAAM/J,CAAAA,CAAAA;AAC9C,QAAA;AACA+T,QAAAA,QAAAA,CAASlC,IAAI,CAAC6F,OAAAA,CAAAA;AAChB,IAAA;IAEAH,YAAAA,CAAalI,GAAG,CAACiH,GAAAA,EAAKvC,QAAAA,CAAAA;IAEtB,OAAOA,QAAAA;AACT;AAEA,SAASpP,KAAAA,CAAO3I,KAAa,EAAE4E,GAAW,EAAEJ,GAAW,EAAA;AACrD,IAAA,OAAOxE,QAAQ4E,GAAAA,GAAMA,GAAAA,GAAOrF,IAAAA,CAAKqF,GAAG,CAAC5E,KAAAA,EAAOwE,GAAAA,CAAAA;AAC9C;;ACnVA;;;;;AAKG,IACH,MAAMmX,KAAAA,GAAQ,UAAA;AAER,SAAUC,cACdtS,MAAkB,EAClBwE,MAAkB,EAClBjL,OAAAA,GAAwB,EAAE,EAAA;AAE1B,IAAA,MAAM,EACJ0C,KAAAA,GAAQ,GAAG,EACXsW,WAAAA,GAAc,EAAE,EAChBC,UAAAA,GAAa,IAAI,EACjBC,eAAAA,GAAkBjM,QAAQ,EAC3B,GAAGjN,OAAAA;AAEJ,IAAA,MAAMpE,CAAAA,GAAI6K,MAAAA,CAAO8O,SAAS,CAACzZ,MAAM;AACjC,IAAA,MAAMmO,CAAAA,GAAIgB,MAAAA,CAAOsK,SAAS,CAACzZ,MAAM;AACjC,IAAA,IAAIF,CAAAA,KAAM,CAAA,IAAKqO,CAAAA,KAAM,CAAA,EAAG,OAAO,EAAE;AAEjC,IAAA,MAAMkP,gBAAgB,IAAIlU,UAAAA,CAAWrJ,CAAAA,CAAAA,CAAGyB,IAAI,CAAC,EAAC,CAAA;AAC9C,IAAA,MAAM+b,YAAAA,GAAe,IAAInU,UAAAA,CAAWrJ,CAAAA,CAAAA,CAAGyB,IAAI,CAACyb,KAAAA,CAAAA;AAC5C,IAAA,MAAMO,cAAAA,GAAiB,IAAIpU,UAAAA,CAAWrJ,CAAAA,CAAAA,CAAGyB,IAAI,CAACyb,KAAAA,CAAAA;AAC9C,IAAA,MAAMQ,gBAAgB,IAAIrU,UAAAA,CAAWgF,CAAAA,CAAAA,CAAG5M,IAAI,CAAC,EAAC,CAAA;AAC9C,IAAA,MAAMkc,kBAAAA,GAAqB,IAAItU,UAAAA,CAAWgF,CAAAA,CAAAA,CAAG5M,IAAI,CAACyb,KAAAA,CAAAA;IAElD,MAAMU,KAAAA,GAAQ7a,MAAAA,CAAOgK,QAAQ,CAACuQ,eAAAA,CAAAA;AAC9B,IAAA,MAAMO,OAAOP,eAAAA,GAAkBA,eAAAA;AAE/B,IAAA,IAAK,IAAIjd,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK;AAC1B,QAAA,MAAMV,CAAAA,GAAIkL,MAAAA,CAAO8O,SAAS,CAACtZ,CAAAA,CAAE;AAC7B,QAAA,MAAMyd,UAAUzd,CAAAA,GAAIoY,gBAAAA;AACpB,QAAA,IAAIsF,KAAAA,GAAQb,KAAAA;AACZ,QAAA,IAAIc,MAAAA,GAASd,KAAAA;AACb,QAAA,IAAIe,aAAa,EAAC;AAElB,QAAA,IAAK,IAAIpQ,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIQ,GAAGR,CAAAA,EAAAA,CAAK;AAC1B,YAAA,MAAMjO,CAAAA,GAAIyP,MAAAA,CAAOsK,SAAS,CAAC9L,CAAAA,CAAE;AAC7B,YAAA,IAAI+P,KAAAA,EAAO;AACT,gBAAA,MAAMhS,EAAAA,GAAKjM,CAAAA,CAAEiG,CAAC,GAAGhG,EAAEgG,CAAC;AACpB,gBAAA,MAAM+F,EAAAA,GAAKhM,CAAAA,CAAE4F,CAAC,GAAG3F,EAAE2F,CAAC;AACpB,gBAAA,IAAIqG,EAAAA,GAAKA,EAAAA,GAAKD,EAAAA,GAAKA,EAAAA,GAAKkS,IAAAA,EAAM;AAChC,YAAA;YAEA,MAAMK,QAAAA,GAAWC,QAAQtT,MAAAA,CAAO8P,WAAW,EAAEmD,OAAAA,EAASzO,MAAAA,CAAOsL,WAAW,EAAE9M,CAAAA,GAAI4K,gBAAAA,CAAAA;AAE9E,YAAA,IAAIyF,WAAWH,KAAAA,EAAO;gBACpBC,MAAAA,GAASD,KAAAA;gBACTA,KAAAA,GAAQG,QAAAA;gBACRD,UAAAA,GAAapQ,CAAAA;YACf,CAAA,MAAO,IAAIqQ,WAAWF,MAAAA,EAAQ;gBAC5BA,MAAAA,GAASE,QAAAA;AACX,YAAA;AAEA,YAAA,IAAIA,QAAAA,GAAWP,kBAAkB,CAAC9P,CAAAA,CAAE,EAAE;gBACpC8P,kBAAkB,CAAC9P,EAAE,GAAGqQ,QAAAA;gBACxBR,aAAa,CAAC7P,EAAE,GAAGxN,CAAAA;AACrB,YAAA;AACF,QAAA;QAEAkd,aAAa,CAACld,EAAE,GAAG4d,UAAAA;QACnBT,YAAY,CAACnd,EAAE,GAAG0d,KAAAA;QAClBN,cAAc,CAACpd,EAAE,GAAG2d,MAAAA;AACtB,IAAA;AAEA,IAAA,MAAMI,UAAwB,EAAE;AAChC,IAAA,IAAK,IAAI/d,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK;QAC1B,MAAMwN,CAAAA,GAAI0P,aAAa,CAACld,CAAAA,CAAE;AAC1B,QAAA,IAAIwN,IAAI,CAAA,EAAG;AACX,QAAA,IAAI2P,YAAY,CAACnd,CAAAA,CAAE,GAAG+c,WAAAA,EAAa;AACnC,QAAA,IAAIK,cAAc,CAACpd,CAAAA,CAAE,KAAK6c,KAAAA,IAASM,YAAY,CAACnd,CAAAA,CAAE,GAAGyG,KAAAA,GAAQ2W,cAAc,CAACpd,EAAE,EAAE;AAChF,QAAA,IAAIgd,UAAAA,IAAcK,aAAa,CAAC7P,CAAAA,CAAE,KAAKxN,CAAAA,EAAG;AAE1C,QAAA,MAAMV,CAAAA,GAAIkL,MAAAA,CAAO8O,SAAS,CAACtZ,CAAAA,CAAE;AAC7B,QAAA,MAAMT,CAAAA,GAAIyP,MAAAA,CAAOsK,SAAS,CAAC9L,CAAAA,CAAE;AAC7BuQ,QAAAA,OAAAA,CAAQhH,IAAI,CAAC;YACXvM,MAAAA,EAAU;AAAEjF,gBAAAA,CAAAA,EAAGjG,EAAEiG,CAAC;AAAEL,gBAAAA,CAAAA,EAAG5F,EAAE4F;AAAC,aAAA;YAC1B8J,MAAAA,EAAU;AAAEzJ,gBAAAA,CAAAA,EAAGhG,EAAEgG,CAAC;AAAEL,gBAAAA,CAAAA,EAAG3F,EAAE2F;AAAC,aAAA;YAC1B2Y,QAAAA,EAAUV,YAAY,CAACnd,CAAAA;AACxB,SAAA,CAAA;AACH,IAAA;IAEA,OAAO+d,OAAAA;AACT;AAEA,yDACM,SAAUD,OAAAA,CAASxe,CAAc,EAAEme,OAAe,EAAEle,CAAc,EAAEye,OAAe,EAAA;AACvF,IAAA,IAAI/c,KAAAA,GAAQ,CAAA;AACZ,IAAA,IAAK,IAAI+G,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIoQ,gBAAAA,EAAkBpQ,IAAK/G,KAAAA,IAASgd,QAAAA,CAAS3e,CAAC,CAACme,UAAUzV,CAAAA,CAAE,GAAGzI,CAAC,CAACye,UAAUhW,CAAAA,CAAE,CAAA;IAE5F,OAAO/G,KAAAA;AACT;AAEA,sFACM,SAAUgd,QAAAA,CAAU/c,KAAa,EAAA;AACrC,IAAA,IAAI2D,IAAI3D,KAAAA,IAAS,KAACA,IAAS,IAAK,UAAA,CAAA;IAChC2D,CAAAA,GAAKA,CAAAA,CAAAA,GAAI,UAAA,KAAgBA,CAAAA,IAAK,CAAA,GAAK,UAAA,CAAA;AACnCA,IAAAA,CAAAA,GAAI,CAACA,IAAKA,CAAAA,IAAK,CAAA,CAAA,GAAM,UAAA;AAErB,IAAA,OAAO,IAACpE,CAAKsX,IAAI,CAAClT,CAAAA,EAAG,eAAe,EAAA,GAAM,IAAA;AAC5C;;AC5IA;;;;;;;;;;;;AAcG,aACaqZ,KAAAA,CAAO5e,CAAe,EAAEC,CAAe,EAAEI,CAAS,EAAA;IAChE,MAAMqO,CAAAA,GAAI/I,YAAAA,CAAanD,IAAI,CAACxC,CAAAA,CAAAA;IAC5B,MAAMiG,CAAAA,GAAIN,YAAAA,CAAanD,IAAI,CAACvC,CAAAA,CAAAA;AAE5B,IAAA,IAAK,IAAI4e,GAAAA,GAAM,CAAA,EAAGA,GAAAA,GAAMxe,GAAGwe,GAAAA,EAAAA,CAAO;AAChC,QAAA,IAAIpP,KAAAA,GAAQoP,GAAAA;QACZ,IAAIjX,IAAAA,GAAOzG,KAAKgM,GAAG,CAACuB,CAAC,CAACmQ,GAAAA,GAAMxe,IAAIwe,GAAAA,CAAI,CAAA;AACpC,QAAA,IAAK,IAAIrW,GAAAA,GAAMqW,GAAAA,GAAM,CAAA,EAAGrW,GAAAA,GAAMnI,GAAGmI,GAAAA,EAAAA,CAAO;YACtC,MAAMjD,CAAAA,GAAIpE,KAAKgM,GAAG,CAACuB,CAAC,CAAClG,GAAAA,GAAMnI,IAAIwe,GAAAA,CAAI,CAAA;AACnC,YAAA,IAAItZ,IAAIqC,IAAAA,EAAM;gBACZA,IAAAA,GAAOrC,CAAAA;gBACPkK,KAAAA,GAAQjH,GAAAA;AACV,YAAA;AACF,QAAA;QACA,IAAIZ,IAAAA,GAAO,OAAO,OAAO,IAAA;AAEzB,QAAA,IAAI6H,UAAUoP,GAAAA,EAAK;AACjB,YAAA,IAAK,IAAInW,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIrI,GAAGqI,CAAAA,EAAAA,CAAK;AAC1B,gBAAA,MAAMZ,CAAAA,GAAI4G,CAAC,CAACmQ,GAAAA,GAAMxe,IAAIqI,CAAAA,CAAE;gBACxBgG,CAAC,CAACmQ,MAAMxe,CAAAA,GAAIqI,CAAAA,CAAE,GAAGgG,CAAC,CAACe,KAAAA,GAAQpP,CAAAA,GAAIqI,CAAAA,CAAE;AACjCgG,gBAAAA,CAAC,CAACe,KAAAA,GAAQpP,CAAAA,GAAIqI,CAAAA,CAAE,GAAGZ,CAAAA;AACrB,YAAA;YACA,MAAMA,CAAAA,GAAI7B,CAAC,CAAC4Y,GAAAA,CAAI;AAChB5Y,YAAAA,CAAC,CAAC4Y,GAAAA,CAAI,GAAG5Y,CAAC,CAACwJ,KAAAA,CAAM;YACjBxJ,CAAC,CAACwJ,MAAM,GAAG3H,CAAAA;AACb,QAAA;AAEA,QAAA,MAAMgX,IAAAA,GAAOpQ,CAAC,CAACmQ,GAAAA,GAAMxe,IAAIwe,GAAAA,CAAI;AAC7B,QAAA,IAAK,IAAIrW,GAAAA,GAAMqW,GAAAA,GAAM,CAAA,EAAGrW,GAAAA,GAAMnI,GAAGmI,GAAAA,EAAAA,CAAO;AACtC,YAAA,MAAMuW,SAASrQ,CAAC,CAAClG,GAAAA,GAAMnI,CAAAA,GAAIwe,IAAI,GAAGC,IAAAA;AAClC,YAAA,IAAIC,WAAW,CAAA,EAAG;AAClB,YAAA,IAAK,IAAIrW,CAAAA,GAAImW,GAAAA,EAAKnW,CAAAA,GAAIrI,CAAAA,EAAGqI,IAAKgG,CAAC,CAAClG,GAAAA,GAAMnI,CAAAA,GAAIqI,EAAE,IAAIqW,MAAAA,GAASrQ,CAAC,CAACmQ,GAAAA,GAAMxe,IAAIqI,CAAAA,CAAE;AACvEzC,YAAAA,CAAC,CAACuC,GAAAA,CAAI,IAAIuW,MAAAA,GAAS9Y,CAAC,CAAC4Y,GAAAA,CAAI;AAC3B,QAAA;AACF,IAAA;AAEA,IAAA,IAAK,IAAIrW,GAAAA,GAAMnI,CAAAA,GAAI,CAAA,EAAGmI,GAAAA,IAAO,GAAGA,GAAAA,EAAAA,CAAO;QACrC,IAAI9C,GAAAA,GAAMO,CAAC,CAACuC,GAAAA,CAAI;AAChB,QAAA,IAAK,IAAIE,CAAAA,GAAIF,GAAAA,GAAM,CAAA,EAAGE,CAAAA,GAAIrI,GAAGqI,CAAAA,EAAAA,CAAKhD,GAAAA,IAAOgJ,CAAC,CAAClG,MAAMnI,CAAAA,GAAIqI,CAAAA,CAAE,GAAGzC,CAAC,CAACyC,CAAAA,CAAE;QAC9DzC,CAAC,CAACuC,IAAI,GAAG9C,GAAAA,GAAMgJ,CAAC,CAAClG,GAAAA,GAAMnI,IAAImI,GAAAA,CAAI;AACjC,IAAA;IAEA,OAAOvC,CAAAA;AACT;AAEA;;;;;;;;;;;IAYM,SAAU+Y,WAAAA,CACdjc,KAAmB,EACnB1C,CAAS,EACT4e,YAAY,EAAE,EAAA;IAEd,MAAMjf,CAAAA,GAAI2F,YAAAA,CAAanD,IAAI,CAACO,KAAAA,CAAAA;IAC5B,MAAMwC,CAAAA,GAAI,IAAII,YAAAA,CAAatF,CAAAA,GAAIA,CAAAA,CAAAA;IAC/B,IAAK,IAAIK,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,CAAAA,EAAGK,CAAAA,EAAAA,CAAK6E,CAAC,CAAC7E,CAAAA,GAAIL,CAAAA,GAAIK,CAAAA,CAAE,GAAG,CAAA;AAE3C,IAAA,IAAK,IAAIwe,KAAAA,GAAQ,CAAA,EAAGA,KAAAA,GAAQD,WAAWC,KAAAA,EAAAA,CAAS;AAC9C,QAAA,IAAIlK,GAAAA,GAAM,CAAA;QACV,IAAK,IAAI3P,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIhF,CAAAA,EAAGgF,IACrB,IAAK,IAAI8Z,CAAAA,GAAI9Z,CAAAA,GAAI,CAAA,EAAG8Z,CAAAA,GAAI9e,GAAG8e,CAAAA,EAAAA,CAAKnK,GAAAA,IAAOhV,CAAC,CAACqF,CAAAA,GAAIhF,CAAAA,GAAI8e,CAAAA,CAAE,GAAGnf,CAAC,CAACqF,CAAAA,GAAIhF,CAAAA,GAAI8e,CAAAA,CAAE;AAEpE,QAAA,IAAInK,MAAM,KAAA,EAAO;AAEjB,QAAA,IAAK,IAAI3P,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIhF,GAAGgF,CAAAA,EAAAA,CAAK;AAC1B,YAAA,IAAK,IAAI8Z,CAAAA,GAAI9Z,CAAAA,GAAI,CAAA,EAAG8Z,CAAAA,GAAI9e,GAAG8e,CAAAA,EAAAA,CAAK;AAC9B,gBAAA,MAAMC,GAAAA,GAAMpf,CAAC,CAACqF,CAAAA,GAAIhF,IAAI8e,CAAAA,CAAE;AACxB,gBAAA,IAAIhe,IAAAA,CAAKgM,GAAG,CAACiS,GAAAA,CAAAA,GAAO,KAAA,EAAO;AAE3B,gBAAA,MAAMC,QAAQ,CAACrf,CAAC,CAACmf,CAAAA,GAAI9e,IAAI8e,CAAAA,CAAE,GAAGnf,CAAC,CAACqF,IAAIhF,CAAAA,GAAIgF,CAAAA,CAAE,KAAK,IAAI+Z,GAAA,CAAA;AACnD,gBAAA,MAAMtX,IAAI3G,IAAAA,CAAK8S,IAAI,CAACoL,KAAAA,IAAS,MAAMle,IAAAA,CAAKgM,GAAG,CAACkS,SAASle,IAAAA,CAAKC,IAAI,CAACie,KAAAA,GAAQA,QAAQ,CAAA,CAAC,CAAA;AAChF,gBAAA,MAAMzV,IAAI,CAAA,GAAIzI,IAAAA,CAAKC,IAAI,CAAC0G,IAAIA,CAAAA,GAAI,CAAA,CAAA;AAChC,gBAAA,MAAMgH,IAAIhH,CAAAA,GAAI8B,CAAAA;AAEd,gBAAA,IAAK,IAAIlB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIrI,GAAGqI,CAAAA,EAAAA,CAAK;AAC1B,oBAAA,MAAM4W,GAAAA,GAAMtf,CAAC,CAAC0I,CAAAA,GAAIrI,IAAIgF,CAAAA,CAAE;AACxB,oBAAA,MAAMka,GAAAA,GAAMvf,CAAC,CAAC0I,CAAAA,GAAIrI,IAAI8e,CAAAA,CAAE;AACxBnf,oBAAAA,CAAC,CAAC0I,CAAAA,GAAIrI,CAAAA,GAAIgF,EAAE,GAAGuE,CAAAA,GAAI0V,MAAMxQ,CAAAA,GAAIyQ,GAAAA;AAC7Bvf,oBAAAA,CAAC,CAAC0I,CAAAA,GAAIrI,CAAAA,GAAI8e,EAAE,GAAGrQ,CAAAA,GAAIwQ,MAAM1V,CAAAA,GAAI2V,GAAAA;AAC/B,gBAAA;AACA,gBAAA,IAAK,IAAI7W,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIrI,GAAGqI,CAAAA,EAAAA,CAAK;AAC1B,oBAAA,MAAM8W,GAAAA,GAAMxf,CAAC,CAACqF,CAAAA,GAAIhF,IAAIqI,CAAAA,CAAE;AACxB,oBAAA,MAAM+W,GAAAA,GAAMzf,CAAC,CAACmf,CAAAA,GAAI9e,IAAIqI,CAAAA,CAAE;AACxB1I,oBAAAA,CAAC,CAACqF,CAAAA,GAAIhF,CAAAA,GAAIqI,EAAE,GAAGkB,CAAAA,GAAI4V,MAAM1Q,CAAAA,GAAI2Q,GAAAA;AAC7Bzf,oBAAAA,CAAC,CAACmf,CAAAA,GAAI9e,CAAAA,GAAIqI,EAAE,GAAGoG,CAAAA,GAAI0Q,MAAM5V,CAAAA,GAAI6V,GAAAA;AAC/B,gBAAA;AACA,gBAAA,IAAK,IAAI/W,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIrI,GAAGqI,CAAAA,EAAAA,CAAK;AAC1B,oBAAA,MAAMgX,GAAAA,GAAMna,CAAC,CAACmD,CAAAA,GAAIrI,IAAIgF,CAAAA,CAAE;AACxB,oBAAA,MAAMsa,GAAAA,GAAMpa,CAAC,CAACmD,CAAAA,GAAIrI,IAAI8e,CAAAA,CAAE;AACxB5Z,oBAAAA,CAAC,CAACmD,CAAAA,GAAIrI,CAAAA,GAAIgF,EAAE,GAAGuE,CAAAA,GAAI8V,MAAM5Q,CAAAA,GAAI6Q,GAAAA;AAC7Bpa,oBAAAA,CAAC,CAACmD,CAAAA,GAAIrI,CAAAA,GAAI8e,EAAE,GAAGrQ,CAAAA,GAAI4Q,MAAM9V,CAAAA,GAAI+V,GAAAA;AAC/B,gBAAA;AACF,YAAA;AACF,QAAA;AACF,IAAA;IAEA,MAAMnD,MAAAA,GAAS,IAAI7W,YAAAA,CAAatF,CAAAA,CAAAA;AAChC,IAAA,IAAK,IAAIK,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK8b,MAAM,CAAC9b,CAAAA,CAAE,GAAGV,CAAC,CAACU,CAAAA,GAAIL,IAAIK,CAAAA,CAAE;IAEpD,OAAO;AAAE8b,QAAAA,MAAAA;QAAQoD,OAAAA,EAASra;;AAC5B;AAEA,gGACM,SAAUsa,mBAAAA,CAAqB9c,KAAmB,EAAE1C,CAAS,EAAA;AACjE,IAAA,MAAM,EAAEmc,MAAM,EAAEoD,OAAO,EAAE,GAAGZ,YAAYjc,KAAAA,EAAO1C,CAAAA,CAAAA;AAE/C,IAAA,IAAIuH,IAAAA,GAAO,CAAA;AACX,IAAA,IAAK,IAAIlH,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIL,GAAGK,CAAAA,EAAAA,CAAK,IAAI8b,MAAM,CAAC9b,EAAE,GAAG8b,MAAM,CAAC5U,IAAAA,CAAK,EAAEA,IAAAA,GAAOlH,CAAAA;IAEjE,MAAMwE,GAAAA,GAAM,IAAIS,YAAAA,CAAatF,CAAAA,CAAAA;AAC7B,IAAA,IAAIyf,IAAAA,GAAO,CAAA;AACX,IAAA,IAAK,IAAItX,GAAAA,GAAM,CAAA,EAAGA,GAAAA,GAAMnI,GAAGmI,GAAAA,EAAAA,CAAO;AAChCtD,QAAAA,GAAG,CAACsD,GAAAA,CAAI,GAAGoX,OAAO,CAACpX,GAAAA,GAAMnI,IAAIuH,IAAAA,CAAK;AAClCkY,QAAAA,IAAAA,IAAQ5a,GAAG,CAACsD,GAAAA,CAAI,GAAGtD,GAAG,CAACsD,GAAAA,CAAI;AAC7B,IAAA;IACAsX,IAAAA,GAAO3e,IAAAA,CAAKC,IAAI,CAAC0e,IAAAA,CAAAA;AACjB,IAAA,IAAIA,IAAAA,GAAO,CAAA,EAAG,IAAK,IAAItX,GAAAA,GAAM,CAAA,EAAGA,GAAAA,GAAMnI,CAAAA,EAAGmI,GAAAA,EAAAA,CAAOtD,GAAG,CAACsD,GAAAA,CAAI,IAAIsX,IAAAA;IAE5D,OAAO5a,GAAAA;AACT;;ACzHA,gFACM,SAAU6a,cAAAA,CAAgB3P,KAAqB,EAAA;IACnD,OAAQA,KAAAA;QACN,KAAK,YAAA;AAAc,YAAA;gBAAE,OAAO,CAAA;AAC5B,YAAA;QACA,KAAK,QAAA;AAAU,YAAA;gBAAE,OAAO,CAAA;AACxB,YAAA;QACA,KAAK,YAAA;AAAc,YAAA;gBAAE,OAAO,CAAA;AAC5B,YAAA;AACF;AACF;SAEgB4P,QAAAA,CACd5P,KAAqB,EACrBqO,OAAkC,EAClCwB,OAA2B,EAAA;IAE3B,OAAQ7P,KAAAA;QACN,KAAK,YAAA;AAAc,YAAA;AAAE,gBAAA,OAAO8P,cAAczB,OAAAA,EAASwB,OAAAA,CAAAA;AACnD,YAAA;QACA,KAAK,QAAA;AAAU,YAAA;AAAE,gBAAA,OAAOE,UAAU1B,OAAAA,EAASwB,OAAAA,CAAAA;AAC3C,YAAA;QACA,KAAK,YAAA;AAAc,YAAA;AAAE,gBAAA,OAAOG,cAAc3B,OAAAA,EAASwB,OAAAA,CAAAA;AACnD,YAAA;AACF;AACF;AAEA;;;;;;AAMG,IACG,SAAUC,aAAAA,CACdzB,OAAkC,EAClCwB,OAA2B,EAAA;IAE3B,MAAMI,MAAAA,GAASC,OAAO7B,OAAAA,EAASwB,OAAAA,CAAAA;AAC/B,IAAA,IAAII,MAAAA,CAAO9f,MAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AAE9B,IAAA,IAAI8O,EAAAA,GAAK,CAAA;AACT,IAAA,IAAIC,EAAAA,GAAK,CAAA;AACT,IAAA,IAAIJ,EAAAA,GAAK,CAAA;AACT,IAAA,IAAIC,EAAAA,GAAK,CAAA;IACT,KAAK,MAAMT,KAAK2R,MAAAA,CAAQ;QACtBhR,EAAAA,IAAMX,CAAAA,CAAExD,MAAM,CAACjF,CAAC;QAChBqJ,EAAAA,IAAMZ,CAAAA,CAAExD,MAAM,CAACtF,CAAC;QAChBsJ,EAAAA,IAAMR,CAAAA,CAAEgB,MAAM,CAACzJ,CAAC;QAChBkJ,EAAAA,IAAMT,CAAAA,CAAEgB,MAAM,CAAC9J,CAAC;AAClB,IAAA;IACA,MAAMvF,CAAAA,GAAIggB,OAAO9f,MAAM;IACvB8O,EAAAA,IAAMhP,CAAAA;IACNiP,EAAAA,IAAMjP,CAAAA;IACN6O,EAAAA,IAAM7O,CAAAA;IACN8O,EAAAA,IAAM9O,CAAAA;AAEN,IAAA,IAAIkgB,GAAAA,GAAM,CAAA;AACV,IAAA,IAAIC,KAAAA,GAAQ,CAAA;AACZ,IAAA,IAAIV,IAAAA,GAAO,CAAA;IACX,KAAK,MAAMpR,KAAK2R,MAAAA,CAAQ;AACtB,QAAA,MAAMnO,EAAAA,GAAKxD,CAAAA,CAAExD,MAAM,CAACjF,CAAC,GAAGoJ,EAAAA;AACxB,QAAA,MAAM4G,EAAAA,GAAKvH,CAAAA,CAAExD,MAAM,CAACtF,CAAC,GAAG0J,EAAAA;AACxB,QAAA,MAAMmR,EAAAA,GAAK/R,CAAAA,CAAEgB,MAAM,CAACzJ,CAAC,GAAGiJ,EAAAA;AACxB,QAAA,MAAMwR,EAAAA,GAAKhS,CAAAA,CAAEgB,MAAM,CAAC9J,CAAC,GAAGuJ,EAAAA;QACxBoR,GAAAA,IAAOrO,EAAAA,GAAKuO,KAAKxK,EAAAA,GAAKyK,EAAAA;QACtBF,KAAAA,IAAStO,EAAAA,GAAKwO,KAAKzK,EAAAA,GAAKwK,EAAAA;QACxBX,IAAAA,IAAQ5N,EAAAA,GAAKA,KAAK+D,EAAAA,GAAKA,EAAAA;AACzB,IAAA;IAEA,IAAI6J,IAAAA,GAAO,OAAO,OAAO,IAAA;AAEzB,IAAA,MAAM9f,IAAIugB,GAAAA,GAAMT,IAAAA;AAChB,IAAA,MAAM7f,IAAIugB,KAAAA,GAAQV,IAAAA;AAClB,IAAA,IAAI3e,KAAKqP,KAAK,CAACxQ,CAAAA,EAAGC,CAAAA,CAAAA,GAAK,MAAM,OAAO,IAAA;IAEpC,OAAO;AACLD,QAAAA,CAAAA;QAAG,CAACC,CAAAA;QAAGiP,EAAAA,GAAKlP,CAAAA,GAAIqP,KAAKpP,CAAAA,GAAIqP,EAAAA;AACzBrP,QAAAA,CAAAA;AAAGD,QAAAA,CAAAA;QAAGmP,EAAAA,GAAKlP,CAAAA,GAAIoP,KAAKrP,CAAAA,GAAIsP,EAAAA;AACxB,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AACP,KAAA;AACH;AAEA,oFACM,SAAU6Q,SAAAA,CACd1B,OAAkC,EAClCwB,OAA2B,EAAA;IAE3B,MAAMI,MAAAA,GAASC,OAAO7B,OAAAA,EAASwB,OAAAA,CAAAA;AAC/B,IAAA,IAAII,MAAAA,CAAO9f,MAAM,GAAG,CAAA,EAAG,OAAO,IAAA;IAE9B,MAAMmO,CAAAA,GAAI,IAAI/I,YAAAA,CAAa,CAAA,CAAA;IAC3B,MAAMgb,EAAAA,GAAK,IAAIhb,YAAAA,CAAa,CAAA,CAAA;IAC5B,MAAMib,EAAAA,GAAK,IAAIjb,YAAAA,CAAa,CAAA,CAAA;IAE5B,KAAK,MAAMkb,SAASR,MAAAA,CAAQ;AAC1B,QAAA,MAAM,EAAEpa,CAAC,EAAEL,CAAC,EAAE,GAAGib,MAAM3V,MAAM;QAC7B,MAAM,EAAEjF,GAAGkG,CAAC,EAAEvG,GAAGL,CAAC,EAAE,GAAGsb,KAAAA,CAAMnR,MAAM;QAEnChB,CAAC,CAAC,CAAA,CAAE,IAAIzI,CAAAA,GAAIA,CAAAA;QACZyI,CAAC,CAAC,CAAA,CAAE,IAAIzI,CAAAA,GAAIL,CAAAA;QACZ8I,CAAC,CAAC,EAAE,IAAIzI,CAAAA;QACRyI,CAAC,CAAC,CAAA,CAAE,IAAI9I,CAAAA,GAAIA,CAAAA;QACZ8I,CAAC,CAAC,EAAE,IAAI9I,CAAAA;QACR8I,CAAC,CAAC,EAAE,IAAI,CAAA;QAERiS,EAAE,CAAC,CAAA,CAAE,IAAI1a,CAAAA,GAAIkG,CAAAA;QACbwU,EAAE,CAAC,CAAA,CAAE,IAAI/a,CAAAA,GAAIuG,CAAAA;QACbwU,EAAE,CAAC,EAAE,IAAIxU,CAAAA;QACTyU,EAAE,CAAC,CAAA,CAAE,IAAI3a,CAAAA,GAAIV,CAAAA;QACbqb,EAAE,CAAC,CAAA,CAAE,IAAIhb,CAAAA,GAAIL,CAAAA;QACbqb,EAAE,CAAC,EAAE,IAAIrb,CAAAA;AACX,IAAA;AACAmJ,IAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE;AACXA,IAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE;AACXA,IAAAA,CAAC,CAAC,CAAA,CAAE,GAAGA,CAAC,CAAC,CAAA,CAAE;IAEX,MAAMoS,IAAAA,GAAOlC,KAAAA,CAAMlQ,CAAAA,EAAGiS,EAAAA,EAAI,CAAA,CAAA;IAC1B,MAAMI,IAAAA,GAAOnC,KAAAA,CAAMlQ,CAAAA,EAAGkS,EAAAA,EAAI,CAAA,CAAA;AAC1B,IAAA,IAAIE,IAAAA,KAAS,IAAA,IAAQC,IAAAA,KAAS,IAAA,EAAM,OAAO,IAAA;IAE3C,OAAO;AAACD,QAAAA,IAAI,CAAC,CAAA,CAAE;AAAEA,QAAAA,IAAI,CAAC,CAAA,CAAE;AAAEA,QAAAA,IAAI,CAAC,CAAA,CAAE;AAAEC,QAAAA,IAAI,CAAC,CAAA,CAAE;AAAEA,QAAAA,IAAI,CAAC,CAAA,CAAE;AAAEA,QAAAA,IAAI,CAAC,CAAA,CAAE;AAAE,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AACxE;AAEA;;;;;;;;AAQG,IACG,SAAUX,aAAAA,CACd3B,OAAkC,EAClCwB,OAA2B,EAAA;IAE3B,MAAMI,MAAAA,GAASC,OAAO7B,OAAAA,EAASwB,OAAAA,CAAAA;AAC/B,IAAA,IAAII,MAAAA,CAAO9f,MAAM,GAAG,CAAA,EAAG,OAAO,IAAA;IAE9B,MAAMygB,UAAAA,GAAaC,WAAWZ,MAAAA,CAAOa,GAAG,CAACxS,CAAAA,CAAAA,GAAKA,EAAExD,MAAM,CAAA,CAAA;IACtD,MAAMiW,UAAAA,GAAaF,WAAWZ,MAAAA,CAAOa,GAAG,CAACxS,CAAAA,CAAAA,GAAKA,EAAEgB,MAAM,CAAA,CAAA;AACtD,IAAA,IAAIsR,UAAAA,KAAe,IAAA,IAAQG,UAAAA,KAAe,IAAA,EAAM,OAAO,IAAA;;IAGvD,MAAMC,GAAAA,GAAM,IAAIzb,YAAAA,CAAa,EAAA,CAAA;IAC7B,MAAM6C,GAAAA,GAAM,IAAI7C,YAAAA,CAAa,CAAA,CAAA;IAE7B,KAAK,MAAMkb,SAASR,MAAAA,CAAQ;QAC1B,MAAMhb,CAAAA,GAAIgc,KAAAA,CAAML,UAAAA,EAAYH,KAAAA,CAAM3V,MAAM,CAACjF,CAAC,EAAE4a,KAAAA,CAAM3V,MAAM,CAACtF,CAAC,CAAA;QAC1D,MAAMuZ,CAAAA,GAAIkC,KAAAA,CAAMF,UAAAA,EAAYN,KAAAA,CAAMnR,MAAM,CAACzJ,CAAC,EAAE4a,KAAAA,CAAMnR,MAAM,CAAC9J,CAAC,CAAA;AAE1D4C,QAAAA,GAAAA,CAAIyM,GAAG,CAAC;AAAC,YAAA,CAAC5P,EAAEY,CAAC;AAAE,YAAA,CAACZ,EAAEO,CAAC;YAAE,EAAC;AAAG,YAAA,CAAA;AAAG,YAAA,CAAA;AAAG,YAAA,CAAA;YAAGuZ,CAAAA,CAAElZ,CAAC,GAAGZ,CAAAA,CAAEY,CAAC;YAAEkZ,CAAAA,CAAElZ,CAAC,GAAGZ,CAAAA,CAAEO,CAAC;AAAEuZ,YAAAA,CAAAA,CAAElZ;AAAE,SAAA,CAAA;AAC5Dqb,QAAAA,UAAAA,CAAWF,GAAAA,EAAK5Y,GAAAA,CAAAA;AAChBA,QAAAA,GAAAA,CAAIyM,GAAG,CAAC;AAAC,YAAA,CAAA;AAAG,YAAA,CAAA;AAAG,YAAA,CAAA;AAAG,YAAA,CAAC5P,EAAEY,CAAC;AAAE,YAAA,CAACZ,EAAEO,CAAC;YAAE,EAAC;YAAGuZ,CAAAA,CAAEvZ,CAAC,GAAGP,CAAAA,CAAEY,CAAC;YAAEkZ,CAAAA,CAAEvZ,CAAC,GAAGP,CAAAA,CAAEO,CAAC;AAAEuZ,YAAAA,CAAAA,CAAEvZ;AAAE,SAAA,CAAA;AAC5D0b,QAAAA,UAAAA,CAAWF,GAAAA,EAAK5Y,GAAAA,CAAAA;AAClB,IAAA;IAEA,MAAM+Y,CAAAA,GAAI1B,oBAAoBuB,GAAAA,EAAK,CAAA,CAAA;AACnC,IAAA,MAAMtE,UAAAA,GAAsB;AAACyE,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA,CAAE;AAAEA,QAAAA,CAAC,CAAC,CAAA;AAAG,KAAA;IAElF,IAAIC,YAAAA;IACJ,IAAI;AACFA,QAAAA,YAAAA,GAAehT,QAAAA,CAASG,MAAAA,CAAOwS,UAAAA,CAAAA,EAAa3S,QAAAA,CAASsO,UAAAA,EAAYkE,UAAAA,CAAAA,CAAAA;AACnE,IAAA,CAAA,CAAE,OAAA,MAAA,EAAM;QACN,OAAO,IAAA;AACT,IAAA;IAEA,MAAM1X,KAAAA,GAAQkY,YAAY,CAAC,CAAA,CAAE;IAC7B,IAAI,CAACpe,MAAAA,CAAOgK,QAAQ,CAAC9D,KAAAA,CAAAA,IAAUnI,KAAKgM,GAAG,CAAC7D,KAAAA,CAAAA,GAAS,KAAA,EAAO,OAAO,IAAA;AAE/D,IAAA,OAAOkY,YAAAA,CAAaN,GAAG,CAAC3b,CAAAA,IAAKA,CAAAA,GAAI+D,KAAAA,CAAAA;AACnC;AAEA,SAASgY,UAAAA,CAAYF,GAAiB,EAAE5Y,GAAiB,EAAA;AACvD,IAAA,IAAK,IAAI9H,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,GAAGA,CAAAA,EAAAA,CAAK;QAC1B,MAAM+gB,EAAAA,GAAKjZ,GAAG,CAAC9H,CAAAA,CAAE;AACjB,QAAA,IAAI+gB,OAAO,CAAA,EAAG;AACd,QAAA,IAAK,IAAIvT,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,GAAGA,CAAAA,EAAAA,CAAKkT,GAAG,CAAC1gB,CAAAA,GAAI,IAAIwN,CAAAA,CAAE,IAAIuT,EAAAA,GAAKjZ,GAAG,CAAC0F,CAAAA,CAAE;AAC3D,IAAA;AACF;AAEA,sFACA,SAAS+S,UAAAA,CAAYS,MAA2C,EAAA;AAC9D,IAAA,IAAInL,EAAAA,GAAK,CAAA;AACT,IAAA,IAAIC,EAAAA,GAAK,CAAA;IACT,KAAK,MAAMnR,KAAKqc,MAAAA,CAAQ;AACtBnL,QAAAA,EAAAA,IAAMlR,EAAEY,CAAC;AACTuQ,QAAAA,EAAAA,IAAMnR,EAAEO,CAAC;AACX,IAAA;AACA2Q,IAAAA,EAAAA,IAAMmL,OAAOnhB,MAAM;AACnBiW,IAAAA,EAAAA,IAAMkL,OAAOnhB,MAAM;AAEnB,IAAA,IAAIge,QAAAA,GAAW,CAAA;AACf,IAAA,KAAK,MAAMlZ,CAAAA,IAAKqc,MAAAA,CAAQnD,QAAAA,IAAYpd,IAAAA,CAAKqP,KAAK,CAACnL,CAAAA,CAAEY,CAAC,GAAGsQ,EAAAA,EAAIlR,CAAAA,CAAEO,CAAC,GAAG4Q,EAAAA,CAAAA;AAC/D+H,IAAAA,QAAAA,IAAYmD,OAAOnhB,MAAM;;AAGzB,IAAA,IAAI6C,OAAOgV,KAAK,CAACmG,QAAAA,CAAAA,IAAaA,QAAAA,IAAY,MAAM,OAAO,IAAA;IAEvD,MAAMzP,CAAAA,GAAI3N,IAAAA,CAAK4Y,KAAK,GAAGwE,QAAAA;IAEvB,OAAO;AAACzP,QAAAA,CAAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAACA,CAAAA,GAAIyH,EAAAA;AAAI,QAAA,CAAA;AAAGzH,QAAAA,CAAAA;AAAG,QAAA,CAACA,CAAAA,GAAI0H,EAAAA;AAAI,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA;AAChD;AAEA,SAAS6K,KAAAA,CAAO3S,CAAU,EAAEzI,CAAS,EAAEL,CAAS,EAAA;IAC9C,OAAO;AAAEK,QAAAA,CAAAA,EAAGyI,CAAC,CAAC,CAAA,CAAE,GAAGzI,CAAAA,GAAIyI,CAAC,CAAC,CAAA,CAAE,GAAG9I,CAAAA,GAAI8I,CAAC,CAAC,CAAA,CAAE;AAAE9I,QAAAA,CAAAA,EAAG8I,CAAC,CAAC,CAAA,CAAE,GAAGzI,CAAAA,GAAIyI,CAAC,CAAC,CAAA,CAAE,GAAG9I,CAAAA,GAAI8I,CAAC,CAAC,CAAA;;AACrE;AAEA,SAAS4R,MAAAA,CACP7B,OAAkC,EAClCwB,OAA2B,EAAA;IAE3B,OAAOA,OAAAA,KAAY5D,SAAAA,GAAYoC,OAAAA,GAAUwB,OAAAA,CAAQiB,GAAG,CAACxgB,CAAAA,CAAAA,GAAK+d,OAAO,CAAC/d,CAAAA,CAAE,CAAA;AACtE;;ACpMM,SAAUihB,MAAAA,CACdlD,OAAkC,EAClCha,OAAsB,EAAA;AAWHA,IAAAA,IAAAA,mBAAAA;AATnB,IAAA,MAAM,EACJ2L,KAAK,EACLhI,SAAS,EACTwZ,aAAAA,GAAgB,IAAI,EACpBC,UAAAA,GAAa,KAAK,EAClBtJ,IAAAA,GAAO,QAAQ,EAChB,GAAG9T,OAAAA;AAEJ,IAAA,MAAMqd,aAAa/B,cAAAA,CAAe3P,KAAAA,CAAAA;AAClC,IAAA,MAAM2R,cAAatd,mBAAAA,GAAAA,OAAAA,CAAQsd,UAAU,KAAA,IAAA,GAAlBtd,sBAAsBtD,IAAAA,CAAKiF,GAAG,CAAC0b,UAAAA,GAAa,GAAG3gB,IAAAA,CAAK2H,IAAI,CAAC2V,OAAAA,CAAQle,MAAM,GAAG,IAAA,CAAA,CAAA;IAC7F,IAAIke,OAAAA,CAAQle,MAAM,GAAGY,IAAAA,CAAKiF,GAAG,CAAC0b,UAAAA,EAAYC,aAAa,OAAO,IAAA;AAE9D,IAAA,MAAMpJ,SAASL,YAAAA,CAAaC,IAAAA,CAAAA;IAC5B,MAAMnC,MAAAA,GAAmB4L,KAAAA,CAAMxf,IAAI,CAAC;QAAEjC,MAAAA,EAAQuhB;OAAc,IAAM,CAAA,CAAA;AAElE,IAAA,IAAIG,cAAwB,EAAE;AAC9B,IAAA,IAAItK,UAAAA,GAA6B,IAAA;AACjC,IAAA,IAAIuK,KAAAA,GAAQN,aAAAA;AACZ,IAAA,IAAIO,UAAAA,GAAa,CAAA;AAEjB,IAAA,MAAOA,UAAAA,GAAaD,KAAAA,IAASC,UAAAA,GAAaP,aAAAA,EAAeO,UAAAA,EAAAA,CAAc;QACrEC,UAAAA,CAAWhM,MAAAA,EAAQqI,OAAAA,CAAQle,MAAM,EAAEoY,MAAAA,CAAAA;QACnC,MAAMjW,SAAAA,GAAYsd,QAAAA,CAAS5P,KAAAA,EAAOqO,OAAAA,EAASrI,MAAAA,CAAAA;AAC3C,QAAA,IAAI1T,SAAAA,KAAc,IAAA,IAAQ,CAACwO,WAAAA,CAAYxO,SAAAA,CAAAA,EAAY;QAEnD,MAAM2f,OAAAA,GAAUC,WAAAA,CAAY7D,OAAAA,EAAS/b,SAAAA,EAAW0F,SAAAA,CAAAA;AAChD,QAAA,IAAIia,OAAAA,CAAQ9hB,MAAM,IAAI0hB,WAAAA,CAAY1hB,MAAM,EAAE;QAE1C0hB,WAAAA,GAAcI,OAAAA;QACd1K,UAAAA,GAAajV,SAAAA;;;AAIb,QAAA,MAAMyE,KAAAA,GAAQkb,OAAAA,CAAQ9hB,MAAM,GAAGke,QAAQle,MAAM;QAC7C,IAAI4G,KAAAA,GAAQ,CAAA,IAAKA,KAAAA,GAAQ,CAAA,EAAG;AAC1B,YAAA,MAAMmP,WAAAA,GAAcnV,IAAAA,CAAK0X,GAAG,CAAC,IAAI1R,KAAAA,IAAS2a,UAAAA,CAAAA;AAC1C,YAAA,IAAIxL,WAAAA,GAAc,CAAA,EAAG4L,KAAAA,GAAQ/gB,IAAAA,CAAKqF,GAAG,CAACob,aAAAA,EAAezgB,IAAAA,CAAK2H,IAAI,CAAC3H,IAAAA,CAAK0X,GAAG,CAAC,CAAA,GAAIgJ,cAAcvL,WAAAA,CAAAA,GAAe,CAAA,CAAA;QAC3G,CAAA,MAAO,IAAInP,SAAS,CAAA,EAAG;AACrB+a,YAAAA,KAAAA,GAAQC,UAAAA,GAAa,CAAA;AACvB,QAAA;AACF,IAAA;AAEA,IAAA,IAAIxK,eAAe,IAAA,IAAQsK,WAAAA,CAAY1hB,MAAM,GAAGwhB,YAAY,OAAO,IAAA;;;IAInE,IAAIQ,OAAAA,GAAUvC,QAAAA,CAAS5P,KAAAA,EAAOqO,OAAAA,EAASwD,WAAAA,CAAAA;IACvC,IAAIM,OAAAA,KAAY,IAAA,IAAQrR,WAAAA,CAAYqR,OAAAA,CAAAA,EAAU;QAC5C,MAAMC,cAAAA,GAAiBF,WAAAA,CAAY7D,OAAAA,EAAS8D,OAAAA,EAASna,SAAAA,CAAAA;AACrD,QAAA,IAAIoa,eAAejiB,MAAM,IAAI0hB,WAAAA,CAAY1hB,MAAM,EAAE0hB,WAAAA,GAAcO,cAAAA;aAC1DD,OAAAA,GAAU5K,UAAAA;IACjB,CAAA,MAAO;QACL4K,OAAAA,GAAU5K,UAAAA;AACZ,IAAA;IAEA,MAAMxM,MAAAA,GAASoX,kBAAAA,OAAAA,GAAW5K,UAAAA;AAC1B,IAAA,IAAIhW,KAAAA,GAAQ,CAAA;AACZ,IAAA,KAAK,MAAMjB,CAAAA,IAAKuhB,WAAAA,CAAatgB,KAAAA,IAASsP,iBAAAA,CAAkB9F,QAAQsT,OAAO,CAAC/d,CAAAA,CAAE,CAACwK,MAAM,EAAEuT,OAAO,CAAC/d,CAAAA,CAAE,CAACgP,MAAM,CAAA;IAEpG,OAAO;AACLvE,QAAAA,MAAAA;QACAkX,OAAAA,EAAaJ,WAAAA;AACbQ,QAAAA,WAAAA,EAAaR,WAAAA,CAAY1hB,MAAM,GAAGke,OAAAA,CAAQle,MAAM;AAChD4hB,QAAAA,UAAAA;AACAO,QAAAA,KAAAA,EAAaT,YAAY1hB,MAAM,GAAG,IAAIoB,KAAAA,GAAQsgB,WAAAA,CAAY1hB,MAAM,GAAGmR;;AAEvE;SAEgB4Q,WAAAA,CACd7D,OAAkC,EAClCtT,MAAe,EACf/C,SAAiB,EAAA;AAEjB,IAAA,MAAMia,UAAoB,EAAE;IAC5B,KAAK,MAAM,CAAC3hB,CAAAA,EAAGmgB,KAAAA,CAAM,IAAIpC,OAAAA,CAAQzZ,OAAO,GACtC,IAAIiM,iBAAAA,CAAkB9F,QAAQ0V,KAAAA,CAAM3V,MAAM,EAAE2V,KAAAA,CAAMnR,MAAM,KAAKtH,SAAAA,EAAWia,OAAAA,CAAQ5K,IAAI,CAAC/W,CAAAA,CAAAA;IAEvF,OAAO2hB,OAAAA;AACT;AAEA,oDACA,SAASD,UAAAA,CAAYjK,IAAc,EAAExO,KAAa,EAAEgP,MAAoB,EAAA;AACtE,IAAA,IAAK,IAAIjY,CAAAA,GAAI,CAAA,EAAGA,IAAIyX,IAAAA,CAAK5X,MAAM,EAAEG,CAAAA,EAAAA,CAAK;AACpC,QAAA,IAAIgC,SAAAA,GAAY,CAAA;AAChB,QAAA,IAAK,IAAIigB,OAAAA,GAAU,CAAA,EAAGA,OAAAA,GAAU,IAAIA,OAAAA,EAAAA,CAAW;YAC7CjgB,SAAAA,GAAYvB,IAAAA,CAAKqF,GAAG,CAACmD,KAAAA,GAAQ,GAAGxI,IAAAA,CAAK6F,KAAK,CAAC2R,MAAAA,EAAAA,GAAWhP,KAAAA,CAAAA,CAAAA;AACtD,YAAA,IAAIiZ,SAAAA,GAAY,KAAA;YAChB,IAAK,IAAI1U,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIxN,CAAAA,EAAGwN,CAAAA,EAAAA,CACrB,IAAIiK,IAAI,CAACjK,CAAAA,CAAE,KAAKxL,SAAAA,EAAW;gBACzBkgB,SAAAA,GAAY,IAAA;AACZ,gBAAA;AACF,YAAA;AACF,YAAA,IAAI,CAACA,SAAAA,EAAW;AAClB,QAAA;QACAzK,IAAI,CAACzX,EAAE,GAAGgC,SAAAA;AACZ,IAAA;AACF;;ACHM,SAAUmgB,UAAW/L,QAAoB,EAAEC,OAAmB,EAAEtS,OAAAA,GAAwB,EAAE,EAAA;IAC9F,MAAMqe,SAAAA,GAAYC,KAAKC,GAAG,EAAA;AAC1B,IAAA,MAAM,EACJ5S,KAAAA,GAAQ,YAAY,EACpBwG,cAAc,IAAI,EAClBqM,UAAAA,GAAa,GAAG,EAChB5J,WAAAA,GAAc,IAAI,EAClB6J,kBAAkB,CAAC,EACnBnB,UAAAA,GAAa,EAAE,EACflL,UAAAA,GAAa,EAAE,EACf1F,gBAAgB,CAAC,EACjBgS,oBAAAA,GAAuB,IAAI,EAC3B/b,GAAG,EACHgE,aAAAA,GAAgB,UAAU,EAC1BnE,UAAAA,GAAa;AAAC,QAAA,GAAA;AAAK,QAAA,GAAA;AAAK,QAAA,GAAA;AAAK,QAAA;KAAI,EACjCmc,MAAAA,GAAS,KAAK,EACd1e,OAAAA,GAAU,EAAE,EACZ6T,IAAAA,GAAO,QAAQ,EAChB,GAAG9T,OAAAA;AAEJ,IAAA,MAAM4e,iBAAiBzf,WAAAA,CAAYkT,QAAAA,CAAAA;AACnC,IAAA,MAAMwM,gBAAgB1f,WAAAA,CAAYmT,OAAAA,CAAAA;IAElC,MAAML,WAAAA,GAAc7P,MAAAA,CAAO5B,WAAAA,CAAYoe,cAAAA,CAAAA,EAAiBjc,GAAAA,CAAAA;IACxD,MAAMuP,UAAAA,GAAa9P,MAAAA,CAAO5B,WAAAA,CAAYqe,aAAAA,CAAAA,EAAgBlc,GAAAA,CAAAA;IAEtD,MAAMmc,MAAAA,GAAS9M,cAAAA,CAAeC,WAAAA,EAAaC,UAAAA,EAAY;QACrDC,WAAAA,EAAaqM,UAAAA;AACbpM,QAAAA,UAAAA;AACA1F,QAAAA;AACD,KAAA,CAAA;AAED,IAAA,MAAMoR,OAAAA,GAAUiB,kBAAAA,CAAmB9M,WAAAA,EAAaC,UAAAA,EAAY4M,MAAAA,EAAQ;AAClEnT,QAAAA,KAAAA;AACAwG,QAAAA,WAAAA;AACAyC,QAAAA,WAAAA;AACA6J,QAAAA,eAAAA;AACAnB,QAAAA,UAAAA;AACAoB,QAAAA,oBAAAA;AACA5K,QAAAA;AACD,KAAA,CAAA;IAED,MAAMpN,MAAAA,GAASoX,QAAQpX,MAAM;IAC7B,MAAMsY,MAAAA,GAASxY,WAAWqY,aAAAA,EAAenY,MAAAA,EAAQkY,eAAenjB,KAAK,EAAEmjB,cAAAA,CAAeljB,MAAM,EAAE;AAC5F8G,QAAAA,UAAAA;AACAmE,QAAAA,aAAAA;QACAC,SAAAA,EAAW;AACZ,KAAA,CAAA;AAED,IAAA,MAAMqY,SAAAA,GAAYC,OAAAA,CAAQjN,WAAAA,EAAaC,UAAAA,EAAYxL,MAAAA,EAAQyL,WAAAA,CAAAA;IAE3D,OAAO;AACL6M,QAAAA,MAAAA;AACA/hB,QAAAA,KAAAA,EAAa0hB,MAAAA,KAAW,MAAA,GAAS,IAAA,GAAO5e,WAAAA,CAAYif,MAAAA,EAAQ;YAAE5f,MAAAA,EAAQuf,MAAAA;AAAQ1e,YAAAA;AAAO,SAAA,CAAA;AACrFxE,QAAAA,KAAAA,EAAaujB,OAAOvjB,KAAK;AACzBC,QAAAA,MAAAA,EAAasjB,OAAOtjB,MAAM;AAC1BgL,QAAAA,MAAAA;AACA4I,QAAAA,OAAAA,EAAapF,MAAAA,CAAOxD,MAAAA,CAAAA;AACpByY,QAAAA,SAAAA,EAAazT,UAAUhF,MAAAA,EAAQiF,KAAAA,CAAAA;QAC/ByR,UAAAA,EAAa1gB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,KAAKqF,GAAG,CAAC,CAAA,EAAGkd,SAAAA,CAAU3jB,WAAW,CAAA,CAAA;AAC1D8jB,QAAAA,MAAAA,EAAatB,QAAQsB,MAAM;QAC3BC,WAAAA,EAAa;AACXC,YAAAA,WAAAA,EAAgBR,OAAOtQ,KAAK;AAC5B+Q,YAAAA,cAAAA,EAAgBT,OAAOvL,QAAQ;YAC/BiM,OAAAA,EAAgB;gBACdnN,QAAAA,EAAWyM,OAAOtL,IAAI,CAACnB,QAAQ,GAAG,GAAA,GAAO3V,KAAK2P,EAAE;gBAChDiG,OAAAA,EAAWwM,OAAOtL,IAAI,CAAClB,OAAO,GAAG,GAAA,GAAO5V,KAAK2P;AAC9C,aAAA;AACDoT,YAAAA,QAAAA,EAAuB3B,QAAQ2B,QAAQ;AACvCzF,YAAAA,OAAAA,EAAuB8D,QAAQ9D,OAAO;AACtC4D,YAAAA,OAAAA,EAAuBE,QAAQF,OAAO;AACtCI,YAAAA,WAAAA,EAAuBF,QAAQE,WAAW;AAC1CxR,YAAAA,iBAAAA,EAAuBsR,QAAQtR,iBAAiB;AAChDlR,YAAAA,WAAAA,EAAuB2jB,UAAU3jB,WAAW;AAC5CsB,YAAAA,qBAAAA,EAAuBqiB,UAAUS,GAAG;YACpCC,UAAAA,EAAuBrB,IAAAA,CAAKC,GAAG,EAAA,GAAKF;AACrC;;AAEL;AAsBA;;;;;;;;;IAUA,SAASU,mBACP9M,WAAsB,EACtBC,UAAqB,EACrB4M,MAAoB,EACpB9e,OAAsB,EAAA;AAEtB,IAAA,MAAM4f,QAAAA,GAAyB;AAC7BlZ,QAAAA,MAAAA,EAAmBoY,OAAOpY,MAAM;QAChC0Y,MAAAA,EAAmB,QAAA;QACnBK,QAAAA,EAAmB;YAAEpN,QAAAA,EAAU,CAAA;YAAGC,OAAAA,EAAS;AAAC,SAAA;QAC5C0H,OAAAA,EAAmB,CAAA;QACnB4D,OAAAA,EAAmB,CAAA;QACnBI,WAAAA,EAAmB,CAAA;QACnBxR,iBAAAA,EAAmBoH;;AAGrB,IAAA,MAAMvB,QAAAA,GAAW3N,aAAAA,CAAcuN,WAAAA,EAAajS,OAAAA,CAAQmS,WAAW,CAAA;AAC/D,IAAA,MAAMG,OAAAA,GAAU5N,aAAAA,CAAcwN,UAAAA,EAAYlS,OAAAA,CAAQmS,WAAW,CAAA;;;IAI7D,MAAM0N,UAAAA,GAAaxU,MAAAA,CAAOyT,MAAAA,CAAOpY,MAAM,EAAE,CAAA,GAAI2L,QAAAA,CAASxN,KAAK,EAAE,CAAA,GAAIyN,OAAAA,CAAQzN,KAAK,CAAA;AAC9E,IAAA,MAAMib,KAAAA,GAAQlY,QAAAA,CAAS0K,OAAAA,CAAQrV,KAAK,EAAE4iB,UAAAA,EAAYxN,QAAAA,CAASpV,KAAK,CAACxB,KAAK,EAAE4W,QAAAA,CAASpV,KAAK,CAACvB,MAAM,EAAE,CAAA,CAAA;AAE/F,IAAA,MAAMqkB,gBAAAA,GAAmBpL,iBAAAA,CAAkBtC,QAAAA,CAASpV,KAAK,EAAE;AAAE2X,QAAAA,WAAAA,EAAa5U,QAAQ4U,WAAW;AAAEd,QAAAA,IAAAA,EAAM9T,QAAQ8T;AAAI,KAAA,CAAA;IACjH,MAAMkM,eAAAA,GAAkBrL,kBAAkBmL,KAAAA,EAAO;AAAElL,QAAAA,WAAAA,EAAa5U,QAAQ4U,WAAW;AAAEd,QAAAA,IAAAA,EAAM9T,QAAQ8T;AAAI,KAAA,CAAA;AACvG,IAAA,MAAMmM,MAAAA,GAAS;QAAE5N,QAAAA,EAAU0N,gBAAAA,CAAiBxK,SAAS,CAACzZ,MAAM;QAAEwW,OAAAA,EAAS0N,eAAAA,CAAgBzK,SAAS,CAACzZ;;AAEjG,IAAA,MAAMokB,QAAAA,GAAWxjB,IAAAA,CAAKqP,KAAK,CAACsG,QAAAA,CAASpV,KAAK,CAACxB,KAAK,EAAE4W,QAAAA,CAASpV,KAAK,CAACvB,MAAM,CAAA;IACvE,MAAMse,OAAAA,GAAUjB,aAAAA,CAAcgH,gBAAAA,EAAkBC,eAAAA,EAAiB;QAC/D9G,eAAAA,EAAiBgH,QAAAA,GAAWlgB,QAAQ0e;AACrC,KAAA,CAAA;IAED,MAAMyB,SAAAA,GAAYjD,OAAOlD,OAAAA,EAAS;AAChCrO,QAAAA,KAAAA,EAAY3L,QAAQ2L,KAAK;AACzBhI,QAAAA,SAAAA,EAAY3D,QAAQye,eAAe;AACnCnB,QAAAA,UAAAA,EAAYtd,QAAQsd,UAAU;AAC9BxJ,QAAAA,IAAAA,EAAY9T,QAAQ8T;AACrB,KAAA,CAAA;IAED,IAAIqM,SAAAA,KAAc,IAAA,EAAM,OAAO,QAAA,CAAA,EAAA,EAAKP,QAAAA,EAAAA;QAAUH,QAAAA,EAAUQ,MAAAA;AAAQjG,QAAAA,OAAAA,EAASA,QAAQle;;;;;AAKjF,IAAA,MAAMskB,WAAWhV,cAAAA,CAAe+U,SAAAA,CAAUzZ,MAAM,EAAE2L,SAASxN,KAAK,CAAA;IAEhE,OAAO;QACL6B,MAAAA,EAAmBqD,QAAAA,CAAS+U,MAAAA,CAAOpY,MAAM,EAAE0Z,QAAAA,CAAAA;QAC3ChB,MAAAA,EAAmB,UAAA;QACnBK,QAAAA,EAAmBQ,MAAAA;AACnBjG,QAAAA,OAAAA,EAAmBA,QAAQle,MAAM;QACjC8hB,OAAAA,EAAmBuC,SAAAA,CAAUvC,OAAO,CAAC9hB,MAAM;AAC3CkiB,QAAAA,WAAAA,EAAmBmC,UAAUnC,WAAW;AACxCxR,QAAAA,iBAAAA,EAAmB2T,UAAUlC;;AAEjC;AAEA,wFACA,SAASiB,OAAAA,CACPjN,WAAsB,EACtBC,UAAqB,EACrBxL,MAAe,EACfyL,WAAmB,EAAA;AAEnB,IAAA,MAAME,WAAW3N,aAAAA,CAAcuN,WAAAA,EAAavV,IAAAA,CAAKqF,GAAG,CAACoQ,WAAAA,EAAa,GAAA,CAAA,CAAA;AAClE,IAAA,MAAMG,UAAU5N,aAAAA,CAAcwN,UAAAA,EAAYxV,IAAAA,CAAKqF,GAAG,CAACoQ,WAAAA,EAAa,GAAA,CAAA,CAAA;IAChE,MAAMkO,IAAAA,GAAOhV,OAAO3E,MAAAA,EAAQ,CAAA,GAAI2L,SAASxN,KAAK,EAAE,CAAA,GAAIyN,OAAAA,CAAQzN,KAAK,CAAA;AACjE,IAAA,MAAMyO,MAAAA,GAAS1L,QAAAA,CAAS0K,OAAAA,CAAQrV,KAAK,EAAEojB,IAAAA,EAAMhO,QAAAA,CAASpV,KAAK,CAACxB,KAAK,EAAE4W,QAAAA,CAASpV,KAAK,CAACvB,MAAM,EAAE,CAAA,CAAA;IAE1F,OAAO;QACLJ,WAAAA,EAAaA,WAAAA,CAAY+W,QAAAA,CAASpV,KAAK,EAAEqW,MAAAA,CAAAA;AACzCoM,QAAAA,GAAAA,EAAa9iB,qBAAAA,CAAsB8G,QAAAA,CAAS2O,QAAAA,CAASpV,KAAK,GAAGyG,QAAAA,CAAS4P,MAAAA,CAAAA;;AAE1E;AAEA;;;;;;IAOM,SAAUgN,iBAAAA,CACdrO,WAAsB,EACtBC,UAAqB,EACrBxL,MAAe,EACfyL,WAAAA,GAAc,GAAG,EAAA;IAEjB,MAAME,QAAAA,GAAW3N,cAAcuN,WAAAA,EAAaE,WAAAA,CAAAA;IAC5C,MAAMG,OAAAA,GAAU5N,cAAcwN,UAAAA,EAAYC,WAAAA,CAAAA;IAC1C,MAAMkO,IAAAA,GAAOhV,OAAO3E,MAAAA,EAAQ,CAAA,GAAI2L,SAASxN,KAAK,EAAE,CAAA,GAAIyN,OAAAA,CAAQzN,KAAK,CAAA;AACjE,IAAA,MAAMyO,MAAAA,GAAS1L,QAAAA,CAAS0K,OAAAA,CAAQrV,KAAK,EAAEojB,IAAAA,EAAMhO,QAAAA,CAASpV,KAAK,CAACxB,KAAK,EAAE4W,QAAAA,CAASpV,KAAK,CAACvB,MAAM,EAAE,CAAA,CAAA;AAE1F,IAAA,MAAM+X,KAAAA,GAAQ7C,cAAAA,CAAeyB,QAAAA,CAASpV,KAAK,EAAEqW,MAAAA,CAAAA;AAC7C,IAAA,IAAI,CAAC3U,MAAAA,CAAOgK,QAAQ,CAAC8K,MAAMjM,EAAE,CAAA,IAAK,CAAC7I,MAAAA,CAAOgK,QAAQ,CAAC8K,KAAAA,CAAMlM,EAAE,GAAG,OAAOb,MAAAA;IAErE,MAAM6Z,SAAAA,GAAYxW,SAASsW,IAAAA,EAAM7V,WAAAA,CAAYiJ,MAAMjM,EAAE,EAAEiM,MAAMlM,EAAE,CAAA,CAAA;AAC/D,IAAA,MAAMtJ,YAAYoN,MAAAA,CAAOkV,SAAAA,EAAWlO,SAASxN,KAAK,EAAEyN,QAAQzN,KAAK,CAAA;AAEjE,IAAA,MAAM2b,MAAAA,GAASllB,WAAAA,CAAY+W,QAAAA,CAASpV,KAAK,EAAEqW,MAAAA,CAAAA;AAC3C,IAAA,MAAMmN,QAAQnlB,WAAAA,CACZ+W,QAAAA,CAASpV,KAAK,EACd2K,QAAAA,CAAS0K,QAAQrV,KAAK,EAAEsjB,WAAWlO,QAAAA,CAASpV,KAAK,CAACxB,KAAK,EAAE4W,SAASpV,KAAK,CAACvB,MAAM,EAAE,CAAA,CAAA,CAAA;IAGlF,OAAO+kB,KAAAA,GAAQD,SAASviB,SAAAA,GAAYyI,MAAAA;AACtC;;ACnSA;;;;;;IAOM,SAAUga,cAAAA,CACdrO,QAAoB,EACpBsO,OAAmB,EACnBC,OAA0B,EAC1B5gB,OAAAA,GAAyB,EAAE,EAAA;IAE3B,MAAM,EAAE6gB,YAAY,CAAC,EAAEld,YAAY,IAAI,EAAEhB,GAAG,EAAE,GAAG3C,OAAAA;AACjD,IAAA,MAAM8gB,KAAAA,GAAQC,UAAAA,CAAW1O,QAAAA,EAAUsO,OAAAA,EAAShe,GAAAA,EAAKke,SAAAA,CAAAA;AAEjD,IAAA,OAAOD,QAAQnE,GAAG,CAACuE,CAAAA,MAAAA,GAAUC,MAAAA,CAAOD,QAAQF,KAAAA,EAAOnd,SAAAA,CAAAA,CAAAA;AACrD;AAEA,qFACM,SAAUud,YAAAA,CACd7O,QAAoB,EACpBsO,OAAmB,EACnBC,OAAAA,GAA6B,EAAE,EAC/B5gB,OAAAA,GAAyB,EAAE,EAAA;IAE3B,MAAM,EAAE6gB,YAAY,CAAC,EAAEld,YAAY,IAAI,EAAEhB,GAAG,EAAE,GAAG3C,OAAAA;AACjD,IAAA,MAAM8gB,KAAAA,GAAQC,UAAAA,CAAW1O,QAAAA,EAAUsO,OAAAA,EAAShe,GAAAA,EAAKke,SAAAA,CAAAA;AACjD,IAAA,MAAMM,IAAAA,GAAa;QAAE3f,CAAAA,EAAG,CAAA;QAAGL,CAAAA,EAAG,CAAA;AAAG1F,QAAAA,KAAAA,EAAOqlB,MAAMrlB,KAAK;AAAEC,QAAAA,MAAAA,EAAQolB,MAAMplB;AAAM,KAAA;AACzE,IAAA,MAAM0lB,QAAQH,MAAAA,CAAO;QAAEI,EAAAA,EAAI,cAAA;QAAgB5V,IAAAA,EAAM0V;AAAI,KAAA,EAAIL,KAAAA,EAAOnd,SAAAA,CAAAA;IAEhE,OAAO;AACL2d,QAAAA,KAAAA,EAASF,MAAME,KAAK;AACpBC,QAAAA,OAAAA,EAASH,MAAMG,OAAO;AACtBX,QAAAA,OAAAA,EAASA,QAAQnE,GAAG,CAACuE,CAAAA,MAAAA,GAAUC,MAAAA,CAAOD,QAAQF,KAAAA,EAAOnd,SAAAA,CAAAA;;AAEzD;AAEA;;;;;;;IAQM,SAAU6d,UAAAA,CACdnP,QAAoB,EACpBsO,OAAmB,EACnB3gB,OAAAA,GAAyB,EAAE,EAAA;AAE3B,IAAA,MAAM,EAAE6gB,SAAAA,GAAY,CAAC,EAAEle,GAAG,EAAE,GAAG3C,OAAAA;AAC/B,IAAA,MAAM8gB,KAAAA,GAAQC,UAAAA,CAAW1O,QAAAA,EAAUsO,OAAAA,EAAShe,GAAAA,EAAKke,SAAAA,CAAAA;AACjD,IAAA,MAAM,EAAEplB,KAAK,EAAEC,MAAM,EAAE,GAAGolB,KAAAA;AAC1B,IAAA,MAAMjlB,IAAAA,GAAO,IAAI0B,iBAAAA,CAAkB9B,KAAAA,GAAQC,MAAAA,GAAS,CAAA,CAAA;IAEpD,IAAK,IAAIO,CAAAA,GAAI,CAAA,EAAG2E,CAAAA,GAAI,CAAA,EAAGA,IAAInF,KAAAA,GAAQC,MAAAA,EAAQkF,CAAAA,EAAAA,EAAK3E,CAAAA,IAAK,CAAA,CAAG;AACtD,QAAA,MAAMwlB,aAAaX,KAAAA,CAAMzO,QAAQ,CAACxW,IAAI,CAAC+E,EAAE,KAAK,CAAA;AAC9C,QAAA,MAAM8gB,SAASZ,KAAAA,CAAMa,IAAI,CAAC9lB,IAAI,CAAC+E,EAAE,KAAK,CAAA;AACtC,QAAA,MAAMghB,eAAed,KAAAA,CAAMe,eAAe,CAAChmB,IAAI,CAAC+E,EAAE,KAAK,CAAA;AAEvD,QAAA,IAAIpD,CAAAA,GAAI,GAAA;AACR,QAAA,IAAIC,CAAAA,GAAI,GAAA;AACR,QAAA,IAAIjC,CAAAA,GAAI,GAAA;QAER,IAAIkmB,MAAAA,IAAU,CAACE,YAAAA,EAAc;YAC3BpkB,CAAAA,GAAI,GAAA;YACJC,CAAAA,GAAI,EAAA;YACJjC,CAAAA,GAAI,EAAA;QACN,CAAA,MAAO,IAAIimB,cAAcX,KAAAA,CAAMgB,WAAW,CAACjmB,IAAI,CAAC+E,CAAAA,CAAE,KAAK,CAAA,EAAG;YACxDpD,CAAAA,GAAI,EAAA;YACJC,CAAAA,GAAI,EAAA;YACJjC,CAAAA,GAAI,GAAA;QACN,CAAA,MAAO,IAAIimB,cAAcC,MAAAA,EAAQ;YAC/BlkB,CAAAA,GAAI,GAAA;YACJC,CAAAA,GAAI,GAAA;YACJjC,CAAAA,GAAI,GAAA;AACN,QAAA;QAEAK,IAAI,CAACI,EAAE,GAAGuB,CAAAA;QACV3B,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAGwB,CAAAA;QACd5B,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAGT,CAAAA;QACdK,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAG,GAAA;AAChB,IAAA;IAEA,OAAO;AAAER,QAAAA,KAAAA;AAAOC,QAAAA,MAAAA;AAAQG,QAAAA;;AAC1B;AAWA,SAASklB,WACP1O,QAAoB,EACpBsO,OAAmB,EACnBhe,GAA2B,EAC3Bke,SAAiB,EAAA;AAEjB,IAAA,MAAMjC,iBAAiBzf,WAAAA,CAAYkT,QAAAA,CAAAA;AACnC,IAAA,MAAM0P,gBAAgB5iB,WAAAA,CAAYwhB,OAAAA,CAAAA;AAElC,IAAA,IAAI/B,eAAenjB,KAAK,KAAKsmB,aAAAA,CAActmB,KAAK,IAAImjB,cAAAA,CAAeljB,MAAM,KAAKqmB,aAAAA,CAAcrmB,MAAM,EAChG,MAAM,IAAIC,KAAAA,CACR,CAAA,yDAAA,EAA4DijB,cAAAA,CAAenjB,KAAK,IAAImjB,cAAAA,CAAeljB,MAAM,CAAA,KAAA,EAAQqmB,aAAAA,CAActmB,KAAK,CAAA,CAAA,EAAIsmB,cAAcrmB,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAGzL,IAAA,MAAMsmB,YAAAA,GAAete,QAAAA,CAAStB,MAAAA,CAAO5B,WAAAA,CAAYoe,cAAAA,CAAAA,EAAiBjc,GAAAA,CAAAA,CAAAA;AAClE,IAAA,MAAMsf,QAAAA,GAAWve,QAAAA,CAAStB,MAAAA,CAAO5B,WAAAA,CAAYuhB,aAAAA,CAAAA,EAAgBpf,GAAAA,CAAAA,CAAAA;IAE7D,OAAO;AACLlH,QAAAA,KAAAA,EAAiBmjB,eAAenjB,KAAK;AACrCC,QAAAA,MAAAA,EAAiBkjB,eAAeljB,MAAM;QACtC2W,QAAAA,EAAiB2P,YAAAA;QACjBL,IAAAA,EAAiBM,QAAAA;AACjBJ,QAAAA,eAAAA,EAAiBje,OAAOoe,YAAAA,EAAcnB,SAAAA,CAAAA;AACtCiB,QAAAA,WAAAA,EAAiBle,OAAOqe,QAAAA,EAAUpB,SAAAA;;AAEtC;AAEA,SAASI,MAAAA,CAAQD,MAAc,EAAEF,KAAY,EAAEoB,gBAAwB,EAAA;AAmBnDlB,IAAAA,IAAAA,iBAAAA;IAlBlB,MAAM,EAAExf,CAAC,EAAEL,CAAC,EAAE1F,KAAK,EAAEC,MAAM,EAAE,GAAGslB,MAAAA,CAAOvV,IAAI;AAC3C,IAAA,MAAMtH,OAAOzH,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAK6F,KAAK,CAACf,CAAAA,CAAAA,CAAAA;AACpC,IAAA,MAAMQ,MAAMtF,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,IAAAA,CAAK6F,KAAK,CAACpB,CAAAA,CAAAA,CAAAA;IACnC,MAAMiD,KAAAA,GAAQ1H,IAAAA,CAAKqF,GAAG,CAAC+e,KAAAA,CAAMrlB,KAAK,EAAEiB,IAAAA,CAAK2H,IAAI,CAAC7C,CAAAA,GAAI/F,KAAAA,CAAAA,CAAAA;IAClD,MAAMwG,MAAAA,GAASvF,IAAAA,CAAKqF,GAAG,CAAC+e,KAAAA,CAAMplB,MAAM,EAAEgB,IAAAA,CAAK2H,IAAI,CAAClD,CAAAA,GAAIzF,MAAAA,CAAAA,CAAAA;AAEpD,IAAA,IAAI0I,KAAAA,IAASD,IAAAA,IAAQlC,MAAAA,IAAUD,GAAAA,EAC7B,OAAO;AACLqf,QAAAA,EAAAA,EAAaL,OAAOK,EAAE;AACtB5V,QAAAA,IAAAA,EAAauV,OAAOvV,IAAI;QACxBwG,WAAAA,EAAa,CAAA;QACbkQ,OAAAA,EAAa,CAAA;QACbb,KAAAA,EAAa,CAAA;QACbC,OAAAA,EAAa,CAAA;QACba,MAAAA,EAAa,KAAA;QACb5T,KAAAA,EAAa;;AAGjB,IAAA,MAAM7K,SAAAA,GAAAA,CAAYqd,iBAAAA,GAAAA,MAAAA,CAAOrd,SAAS,YAAhBqd,iBAAAA,GAAoBkB,gBAAAA;AACtC,IAAA,IAAIZ,KAAAA,GAAQ,CAAA;AACZ,IAAA,IAAIC,OAAAA,GAAU,CAAA;AACd,IAAA,IAAK,IAAIxd,GAAAA,GAAM/B,GAAAA,EAAK+B,GAAAA,GAAM9B,QAAQ8B,GAAAA,EAAAA,CAAO;QACvC,MAAMsC,MAAAA,GAAStC,GAAAA,GAAM+c,KAAAA,CAAMrlB,KAAK;AAChC,QAAA,IAAK,IAAI2K,MAAAA,GAASjC,IAAAA,EAAMiC,MAAAA,GAAShC,OAAOgC,MAAAA,EAAAA,CAAU;AAChD,YAAA,MAAMxF,IAAIyF,MAAAA,GAASD,MAAAA;AACnB,YAAA,IAAI0a,KAAAA,CAAMa,IAAI,CAAC9lB,IAAI,CAAC+E,CAAAA,CAAE,KAAK,CAAA,IAAKkgB,KAAAA,CAAMe,eAAe,CAAChmB,IAAI,CAAC+E,CAAAA,CAAE,KAAK,CAAA,EAAG0gB,KAAAA,EAAAA;AACrE,YAAA,IAAIR,KAAAA,CAAMzO,QAAQ,CAACxW,IAAI,CAAC+E,CAAAA,CAAE,KAAK,CAAA,IAAKkgB,KAAAA,CAAMgB,WAAW,CAACjmB,IAAI,CAAC+E,CAAAA,CAAE,KAAK,CAAA,EAAG2gB,OAAAA,EAAAA;AACvE,QAAA;AACF,IAAA;IAEA,MAAMc,IAAAA,GAAO,CAACje,KAAAA,GAAQD,IAAA,KAASlC,SAASD,GAAA,CAAA;AACxC,IAAA,MAAMsgB,aAAahB,KAAAA,GAAQe,IAAAA;IAE3B,OAAO;AACLhB,QAAAA,EAAAA,EAAaL,OAAOK,EAAE;AACtB5V,QAAAA,IAAAA,EAAauV,OAAOvV,IAAI;AACxBwG,QAAAA,WAAAA,EAAa/N,SAAS4c,KAAAA,CAAMzO,QAAQ,EAAElO,IAAAA,EAAMnC,KAAKoC,KAAAA,EAAOnC,MAAAA,CAAAA;AACxDkgB,QAAAA,OAAAA,EAAaje,SAAS4c,KAAAA,CAAMa,IAAI,EAAExd,IAAAA,EAAMnC,KAAKoC,KAAAA,EAAOnC,MAAAA,CAAAA;QACpDqf,KAAAA,EAAagB,UAAAA;AACbf,QAAAA,OAAAA,EAAaA,OAAAA,GAAUc,IAAAA;AACvBD,QAAAA,MAAAA,EAAaE,UAAAA,IAAc3e,SAAAA;AAC3B6K,QAAAA,KAAAA,EAAa7K,YAAY,CAAA,GAAIjH,IAAAA,CAAKqF,GAAG,CAAC,CAAA,EAAGugB,aAAa3e,SAAAA,CAAAA,GAAa;;AAEvE;;AC9KA;;;AAGG,IACG,SAAU4e,uBAAAA,CAAyBviB,OAAAA,GAA2B,EAAE,EAAA;AAkE5CA,IAAAA,IAAAA,qBAAAA;IAjExB,MAAM,EAAEvE,KAAAA,GAAQ,GAAG,EAAEC,MAAAA,GAAS,IAAI,EAAEoY,IAAAA,GAAO,EAAE,EAAE,GAAG9T,OAAAA;AAClD,IAAA,MAAMkU,SAASL,YAAAA,CAAaC,IAAAA,CAAAA;AAC5B,IAAA,MAAM0O,IAAAA,GAAe;AAAE/mB,QAAAA,KAAAA;AAAOC,QAAAA,MAAAA;AAAQG,QAAAA,IAAAA,EAAM,IAAI0B,iBAAAA,CAAkB9B,KAAAA,GAAQC,MAAAA,GAAS,CAAA,CAAA,CAAG2B,IAAI,CAAC,GAAA;AAAI,KAAA;;;;;AAM/F,IAAA,MAAMwH,QAAQnI,IAAAA,CAAKqF,GAAG,CAACtG,KAAAA,GAAQ,KAAKC,MAAAA,GAAS,IAAA,CAAA;IAC7C,MAAM+mB,IAAAA,GAAO,CAACtlB,KAAAA,GAA0BA,KAAAA,GAAQ0H,KAAAA;AAEhD,IAAA,MAAM6d,MAAAA,GAAShmB,IAAAA,CAAKkF,KAAK,CAAC6gB,IAAAA,CAAK,EAAA,CAAA,CAAA;AAC/B,IAAA,MAAMre,QAAQ3I,KAAAA,GAAQinB,MAAAA;AACtB,IAAA,MAAMC,UAAAA,GAAajmB,IAAAA,CAAKiF,GAAG,CAAC,GAAG8gB,IAAAA,CAAK,EAAA,CAAA,CAAA;IACpC,MAAMG,UAAAA,GAAalmB,KAAKiF,GAAG,CAAC,GAAGjF,IAAAA,CAAKkF,KAAK,CAAC6gB,IAAAA,CAAK,CAAA,CAAA,CAAA,CAAA;AAC/C,IAAA,IAAIthB,CAAAA,GAAIuhB,MAAAA;AAERG,IAAAA,QAAAA,CAASL,IAAAA,EAAM;QAAEhhB,CAAAA,EAAGkhB,MAAAA;AAAQvhB,QAAAA,CAAAA;AAAG1F,QAAAA,KAAAA,EAAOiB,KAAKkF,KAAK,CAAC,CAACwC,KAAAA,GAAQse,MAAA,IAAU,IAAA,CAAA;AAAOhnB,QAAAA,MAAAA,EAAQgB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAG8gB,IAAAA,CAAK,EAAA,CAAA;OAAQ,EAAA,CAAA;AAC5GthB,IAAAA,CAAAA,IAAKshB,IAAAA,CAAK,EAAA,CAAA;IAEVK,QAAAA,CAASN,IAAAA,EAAME,MAAAA,EAAQvhB,CAAAA,EAAGiD,KAAAA,EAAOjD,CAAAA,EAAGzE,KAAKiF,GAAG,CAAC,CAAA,EAAG8gB,IAAAA,CAAK,CAAA,CAAA,CAAA,EAAK,EAAA,CAAA;AAC1DthB,IAAAA,CAAAA,IAAKshB,IAAAA,CAAK,EAAA,CAAA;;AAGV,IAAA,KAAK,MAAMM,KAAAA,IAAS;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;KAAE,CAAE;AAChC,QAAA,IAAK,IAAIC,IAAAA,GAAO,CAAA,EAAGA,IAAAA,GAAOD,OAAOC,IAAAA,EAAAA,CAAQ;AACvCC,YAAAA,YAAAA,CAAaT,IAAAA,EAAME,MAAAA,EAAQvhB,CAAAA,EAAGiD,KAAAA,EAAOwe,UAAAA,EAAY1O,MAAAA,CAAAA;YACjD/S,CAAAA,IAAKwhB,UAAAA;AACP,QAAA;AACAxhB,QAAAA,CAAAA,IAAKshB,IAAAA,CAAK,EAAA,CAAA;AACZ,IAAA;AAEA,IAAA,MAAMS,QAAAA,GAAW/hB,CAAAA;AACjB,IAAA,MAAMqE,IAAAA,GAAO,CAAA;AACb,IAAA,MAAM2d,OAAAA,GAAU,CAAA;AAChB,IAAA,MAAMC,SAAAA,GAAY1mB,IAAAA,CAAKiF,GAAG,CAAC,GAAG8gB,IAAAA,CAAK,EAAA,CAAA,CAAA;AACnC,IAAA,MAAMY,WAAAA,GAAejf,CAAAA,KAAAA,GAAQse,MAAA,IAAUS,OAAAA;AACvC,IAAA,MAAMG,SAAAA,GAAY5mB,IAAAA,CAAKiF,GAAG,CAAC,GAAG8gB,IAAAA,CAAK,CAAA,CAAA,CAAA;AACnC,IAAA,IAAK,IAAIjlB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,IAAKgI,IAAAA,EAAMhI,IACzBslB,QAAAA,CAASN,IAAAA,EAAME,MAAAA,EAAQQ,QAAAA,GAAW1lB,IAAI4lB,SAAAA,EAAWhf,KAAAA,EAAO8e,QAAAA,GAAW1lB,CAAAA,GAAI4lB,WAAWE,SAAAA,EAAW,EAAA,CAAA;AAC/F,IAAA,IAAK,IAAIne,CAAAA,GAAI,CAAA,EAAGA,KAAKge,OAAAA,EAAShe,CAAAA,EAAAA,CAC5B2d,SAASN,IAAAA,EAAME,MAAAA,GAASvd,CAAAA,GAAIke,WAAAA,EAAaH,UAAUR,MAAAA,GAASvd,CAAAA,GAAIke,aAAaH,QAAAA,GAAW1d,IAAAA,GAAO4d,WAAWE,SAAAA,EAAW,EAAA,CAAA;AAEvH,IAAA,IAAK,IAAI9lB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIgI,MAAMhI,CAAAA,EAAAA,CACxB,IAAK,IAAI2H,CAAAA,GAAI,GAAGA,CAAAA,GAAIge,OAAAA,EAAShe,CAAAA,EAAAA,CAC3B8d,YAAAA,CACET,MACAE,MAAAA,GAASvd,CAAAA,GAAIke,WAAAA,GAAcZ,IAAAA,CAAK,CAAA,CAAA,EAChCS,QAAAA,GAAW1lB,CAAAA,GAAI4lB,SAAAA,GAAYA,YAAY,IAAA,EACvCV,MAAAA,GAAS,CAACvd,IAAI,CAAA,IAAKke,WAAAA,GAAcZ,IAAAA,CAAK,IACtCG,UAAAA,EACA1O,MAAAA,CAAAA;IAGN/S,CAAAA,GAAI+hB,QAAAA,GAAW1d,IAAAA,GAAO4d,SAAAA,GAAYX,IAAAA,CAAK,EAAA,CAAA;AAEvC,IAAA,MAAM7B,UAAgC,EAAA;IACtC,MAAM2C,OAAAA,GAAU7mB,KAAKiF,GAAG,CAAC,GAAGjF,IAAAA,CAAKkF,KAAK,CAAC6gB,IAAAA,CAAK,EAAA,CAAA,CAAA,CAAA;AAC5C,IAAA,IAAK,IAAIxmB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI,GAAGA,CAAAA,EAAAA,CAAK;AAC1B,QAAA,MAAMunB,GAAAA,GAAY;YAAEhiB,CAAAA,EAAGkhB,MAAAA,GAASzmB,IAAIwmB,IAAAA,CAAK,GAAA,CAAA;AAAMthB,YAAAA,CAAAA;YAAG1F,KAAAA,EAAO8nB,OAAAA;YAAS7nB,MAAAA,EAAQ6nB;AAAO,SAAA;AACjFE,QAAAA,UAAAA,CAAWjB,MAAMgB,GAAAA,EAAK9mB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAG8gB,KAAK,CAAA,CAAA,CAAA,EAAK,EAAA,CAAA;AAC5C7B,QAAAA,OAAO,CAAC,QAAQ3kB,CAAAA,GAAI,CAAA,CAAA,CAAG,CAAC,GAAGunB,GAAAA;AAC7B,IAAA;AACAriB,IAAAA,CAAAA,IAAKshB,IAAAA,CAAK,EAAA,CAAA;AAEV,IAAA,MAAMiB,SAAAA,GAAAA,CAAkB1jB,qBAAAA,GAAAA,OAAAA,CAAQ2jB,YAAY,YAApB3jB,qBAAAA,GAAwB;QAC9CwB,CAAAA,EAAQkhB,MAAAA;AACRvhB,QAAAA,CAAAA;AACA1F,QAAAA,KAAAA,EAAQiB,KAAKkF,KAAK,CAAC,CAACwC,KAAAA,GAAQse,MAAA,IAAU,IAAA,CAAA;AACtChnB,QAAAA,MAAAA,EAAQgB,KAAKiF,GAAG,CAAC,IAAIjF,IAAAA,CAAKkF,KAAK,CAAC6gB,IAAAA,CAAK,EAAA,CAAA,CAAA;;AAEvCgB,IAAAA,UAAAA,CAAWjB,MAAMkB,SAAAA,EAAWhnB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAG8gB,KAAK,CAAA,CAAA,CAAA,EAAK,EAAA,CAAA;AAClD7B,IAAAA,OAAAA,CAAQ8C,SAAS,GAAGA,SAAAA;AAEpB9C,IAAAA,OAAAA,CAAQgD,KAAK,GAAG;AACdpiB,QAAAA,CAAAA,EAAQ4C,KAAAA,GAAQ1H,IAAAA,CAAKkF,KAAK,CAAC6gB,IAAAA,CAAK,GAAA,CAAA,CAAA;AAChCthB,QAAAA,CAAAA;QACA1F,KAAAA,EAAQiB,IAAAA,CAAKkF,KAAK,CAAC6gB,IAAAA,CAAK,GAAA,CAAA,CAAA;AACxB/mB,QAAAA,MAAAA,EAAQgoB,UAAUhoB;;IAGpB,OAAO;QAAEsjB,MAAAA,EAAQwD,IAAAA;AAAM5B,QAAAA;;AACzB;AAEA,iFACM,SAAUiD,aAAAA,CAAerB,IAAY,EAAEgB,GAAS,EAAE1P,IAAAA,GAAO,CAAC,EAAA;AAC9D,IAAA,MAAMI,SAASL,YAAAA,CAAaC,IAAAA,CAAAA;AAC5B,IAAA,MAAMmJ,MAAAA,GAAS,CAAA;AACf,IAAA,MAAM6G,WAAWN,GAAAA,CAAIriB,CAAC,GAAGqiB,GAAAA,CAAI9nB,MAAM,GAAG,IAAA;AACtC,IAAA,IAAIqoB,YAAYP,GAAAA,CAAIhiB,CAAC,GAAGgiB,GAAAA,CAAI/nB,KAAK,GAAG,IAAA;AACpC,IAAA,IAAIuoB,SAAAA,GAAYF,QAAAA;AAEhB,IAAA,IAAK,IAAI7nB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,IAAKghB,QAAQhhB,CAAAA,EAAAA,CAAK;AAChC,QAAA,MAAMuF,CAAAA,GAAIgiB,GAAAA,CAAIhiB,CAAC,GAAGgiB,GAAAA,CAAI/nB,KAAK,IAAI,IAAA,GAAQ,IAAA,GAAOQ,CAAAA,GAAKghB,MAAA,CAAA;AACnD,QAAA,MAAM9b,IAAI2iB,QAAAA,GAAWN,GAAAA,CAAI9nB,MAAM,IAAI,IAAA,GAAOwY,MAAAA,EAAAA,GAAW,IAAA,CAAA,IAASjY,CAAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,KAAC,CAAA;AACjF6mB,QAAAA,QAAAA,CAASN,IAAAA,EAAMuB,SAAAA,EAAWC,SAAAA,EAAWxiB,CAAAA,EAAGL,GAAG,CAAA,EAAG,EAAA,CAAA;QAC9C4iB,SAAAA,GAAYviB,CAAAA;QACZwiB,SAAAA,GAAY7iB,CAAAA;AACd,IAAA;AACF;AAEA,4CACM,SAAU8iB,QAAAA,CAAUzB,IAAY,EAAEgB,GAAS,EAAA;IAC/C,MAAM,EAAEhiB,CAAC,EAAEL,CAAC,EAAE1F,KAAK,EAAEC,MAAM,EAAE,GAAG8nB,GAAAA;AAChCV,IAAAA,QAAAA,CAASN,IAAAA,EAAMhhB,CAAAA,GAAI/F,KAAAA,GAAQ,IAAA,EAAM0F,CAAAA,GAAIzF,MAAAA,GAAS,GAAA,EAAK8F,CAAAA,GAAI/F,KAAAA,GAAQ,IAAA,EAAM0F,CAAAA,GAAIzF,MAAAA,GAAS,MAAM,CAAA,EAAG,EAAA,CAAA;AAC3FonB,IAAAA,QAAAA,CAASN,IAAAA,EAAMhhB,CAAAA,GAAI/F,KAAAA,GAAQ,IAAA,EAAM0F,CAAAA,GAAIzF,MAAAA,GAAS,IAAA,EAAM8F,CAAAA,GAAI/F,KAAAA,GAAQ,IAAA,EAAM0F,CAAAA,GAAIzF,MAAAA,GAAS,MAAM,CAAA,EAAG,EAAA,CAAA;AAC9F;AAEA;;;;;;;;AAQG,aACawoB,YAAAA,CAAc1B,IAAY,EAAExiB,OAAAA,GAAuB,EAAE,EAAA;AAYpDA,IAAAA,IAAAA,eAAAA;IAXf,MAAM,EACJmM,WAAAA,GAAc,CAAC,EACftH,KAAAA,GAAQ,CAAC,EACTsf,UAAAA,GAAa,CAAC,EACdC,UAAAA,GAAa,CAAC,EACdC,KAAAA,GAAQ,CAAC,EACTC,IAAAA,GAAO,CAAC,EACRC,YAAAA,GAAe,CAAC,EAChBzQ,IAAAA,GAAO,IAAI,EACZ,GAAG9T,OAAAA;AAEJ,IAAA,MAAMwkB,MAAAA,GAAAA,CAASxkB,eAAAA,GAAAA,OAAAA,CAAQwkB,MAAM,YAAdxkB,eAAAA,GAAkB;QAC/BvE,KAAAA,EAAQiB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,KAAKkF,KAAK,CAAC4gB,IAAAA,CAAK/mB,KAAK,GAAGoJ,KAAAA,CAAAA,CAAAA;QAC5CnJ,MAAAA,EAAQgB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAGjF,KAAKkF,KAAK,CAAC4gB,IAAAA,CAAK9mB,MAAM,GAAGmJ,KAAAA,CAAAA;;AAG/C,IAAA,MAAMgI,KAAAA,GAASV,WAAAA,GAAczP,IAAAA,CAAK2P,EAAE,GAAI,GAAA;IACxC,MAAMnB,GAAAA,GAAMxO,IAAAA,CAAKwO,GAAG,CAAC2B,KAAAA,CAAAA;IACrB,MAAM1B,GAAAA,GAAMzO,IAAAA,CAAKyO,GAAG,CAAC0B,KAAAA,CAAAA;IACrB,MAAMiF,EAAAA,GAAK0Q,IAAAA,CAAK/mB,KAAK,GAAG,CAAA;IACxB,MAAMsW,EAAAA,GAAKyQ,IAAAA,CAAK9mB,MAAM,GAAG,CAAA;;;AAIzB,IAAA,MAAM+oB,iBAAAA,GAA6B;AACjCvZ,QAAAA,GAAAA;QAAK,CAACC,GAAAA;QAAK2G,EAAAA,GAAK5G,GAAAA,GAAM4G,KAAK3G,GAAAA,GAAM4G,EAAAA;AACjC5G,QAAAA,GAAAA;AAAKD,QAAAA,GAAAA;QAAK6G,EAAAA,GAAK5G,GAAAA,GAAM2G,KAAK5G,GAAAA,GAAM6G,EAAAA;AAChC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AACP,KAAA;AACD,IAAA,MAAM2S,KAAAA,GAAQla,WAAAA,CACZga,MAAAA,CAAO/oB,KAAK,GAAG,CAAA,GAAIqW,EAAAA,GAAKjN,KAAAA,GAAQsf,UAAAA,EAChCK,MAAAA,CAAO9oB,MAAM,GAAG,CAAA,GAAIqW,KAAKlN,KAAAA,GAAQuf,UAAAA,CAAAA;AAEnC,IAAA,MAAMO,OAAAA,GAAU5a,QAAAA,CAAS2a,KAAAA,EAAO3a,QAAAA,CAASY,QAAQ9F,KAAAA,CAAAA,EAAQ4f,iBAAAA,CAAAA,CAAAA;IAEzD,IAAIzF,MAAAA,GAASxY,UAAAA,CAAWgc,IAAAA,EAAMtY,MAAAA,CAAOya,OAAAA,CAAAA,EAAUH,OAAO/oB,KAAK,EAAE+oB,MAAAA,CAAO9oB,MAAM,EAAE;QAC1E8G,UAAAA,EAAe;AAAC,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA,GAAA;AAAK,YAAA;AAAI,SAAA;QACnCmE,aAAAA,EAAe,UAAA;QACfC,SAAAA,EAAe;AAChB,KAAA,CAAA;AAED,IAAA,IAAI0d,IAAAA,GAAO,CAAA,EAAGtF,MAAAA,GAASla,aAAAA,CAAcka,MAAAA,EAAQsF,IAAAA,CAAAA;IAC7C,IAAIC,YAAAA,GAAe,CAAA,EAAGK,iBAAAA,CAAkB5F,MAAAA,EAAQuF,YAAAA,CAAAA;AAChD,IAAA,IAAIF,KAAAA,GAAQ,CAAA,EAAGQ,UAAAA,CAAW7F,MAAAA,EAAQqF,KAAAA,EAAOvQ,IAAAA,CAAAA;IAEzC,OAAO;AAAEkL,QAAAA,MAAAA;QAAQtY,MAAAA,EAAQie;;AAC3B;AAEA,6FACA,SAASC,iBAAAA,CAAmB5F,MAAc,EAAE8F,QAAgB,EAAA;AAC1D,IAAA,MAAM,EAAErpB,KAAK,EAAEC,MAAM,EAAEG,IAAI,EAAE,GAAGmjB,MAAAA;AAChC,IAAA,IAAK,IAAI7d,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIzF,QAAQyF,CAAAA,EAAAA,CAAK;AAC/B,QAAA,IAAK,IAAIK,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI/F,OAAO+F,CAAAA,EAAAA,CAAK;AAC9B,YAAA,MAAMkG,IAAIlG,CAAAA,GAAI/F,KAAAA;AACd,YAAA,MAAMqF,IAAIK,CAAAA,GAAIzF,MAAAA;AACd,YAAA,MAAMqpB,OAAO,CAAA,GAAID,QAAAA,IAAY,IAAA,GAAOpd,CAAAA,GAAI,OAAO5G,CAAAA,CAAAA;AAC/C,YAAA,MAAMoV,MAAAA,GAAS,CAAA,GAAI4O,QAAAA,GAAW,GAAA,GAAMpoB,IAAAA,CAAKiF,GAAG,CAAC,CAAA,EAAG,CAAA,GAAIjF,IAAAA,CAAKqP,KAAK,CAACrE,GAAG5G,CAAAA,CAAAA,GAAK,GAAA,CAAA;AACvE,YAAA,MAAMwZ,SAASyK,IAAAA,GAAO7O,MAAAA;AACtB,YAAA,MAAMja,IAAI,CAACkF,CAAAA,GAAI1F,KAAAA,GAAQ+F,CAAAA,IAAK,CAAA;YAC5B3F,IAAI,CAACI,EAAE,IAAIqe,MAAAA;YACXze,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,IAAIqe,MAAAA;YACfze,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,IAAIqe,MAAAA;AACjB,QAAA;AACF,IAAA;AACF;AAEA,SAASuK,UAAAA,CAAY7F,MAAc,EAAEpG,KAAa,EAAE9E,IAAY,EAAA;AAC9D,IAAA,MAAMI,SAASL,YAAAA,CAAaC,IAAAA,CAAAA;AAC5B,IAAA,MAAMkR,YAAYpM,KAAAA,GAAQ,GAAA;IAC1B,IAAK,IAAI3c,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAI+iB,MAAAA,CAAOnjB,IAAI,CAACC,MAAM,EAAEG,CAAAA,IAAK,CAAA,CAAG;QAC9C,MAAML,CAAAA,GAAI,CAACsY,MAAAA,EAAAA,GAAWA,WAAWA,MAAAA,EAAAA,GAAW,GAAA,IAAO,CAAA,GAAI8Q,SAAAA;QACvDhG,MAAAA,CAAOnjB,IAAI,CAACI,CAAAA,CAAE,IAAIL,CAAAA;AAClBojB,QAAAA,MAAAA,CAAOnjB,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,IAAIL,CAAAA;AACtBojB,QAAAA,MAAAA,CAAOnjB,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,IAAIL,CAAAA;AACxB,IAAA;AACF;AAEA,kFACA,SAASqnB,YAAAA,CACPT,IAAY,EACZtgB,EAAU,EACVf,CAAS,EACTgB,EAAU,EACVzG,MAAc,EACdwY,MAAoB,EAAA;AAEpB,IAAA,MAAMuO,OAAO/mB,MAAAA,GAAS,CAAA;AACtB,IAAA,IAAI8F,CAAAA,GAAIU,EAAAA;IACR,MAAOV,CAAAA,GAAIW,EAAAA,GAAK,EAAA,GAAKsgB,IAAAA,CAAM;QACzB,MAAMwC,IAAAA,GAAO,CAAC,EAAA,GAAKvoB,KAAK6F,KAAK,CAAC2R,MAAAA,EAAAA,GAAW,EAAA,CAAE,IAAKuO,IAAAA;AAChD,QAAA,MAAM9c,GAAAA,GAAMjJ,IAAAA,CAAKqF,GAAG,CAACI,IAAIX,CAAAA,GAAIyjB,IAAAA,CAAAA;AAC7BpC,QAAAA,QAAAA,CAASL,IAAAA,EAAM;AAAEhhB,YAAAA,CAAAA;AAAGL,YAAAA,CAAAA;AAAG1F,YAAAA,KAAAA,EAAOkK,GAAAA,GAAMnE,CAAAA;AAAG9F,YAAAA;AAAM,SAAA,EAAI,EAAA,GAAKgB,IAAAA,CAAK6F,KAAK,CAAC2R,MAAAA,EAAAA,GAAW,EAAA,CAAA,CAAA;QAC5E1S,CAAAA,GAAImE,GAAAA,GAAM,CAAC,CAAA,GAAIjJ,KAAK6F,KAAK,CAAC2R,MAAAA,EAAAA,GAAW,CAAA,CAAC,IAAKuO,IAAAA;AAC7C,IAAA;AACF;SAEgBI,QAAAA,CAAUL,IAAY,EAAE/W,IAAU,EAAEtO,KAAa,EAAA;IAC/D,MAAMgH,IAAAA,GAAOzH,KAAKiF,GAAG,CAAC,GAAGjF,IAAAA,CAAKkF,KAAK,CAAC6J,IAAAA,CAAKjK,CAAC,CAAA,CAAA;IAC1C,MAAMQ,GAAAA,GAAMtF,KAAKiF,GAAG,CAAC,GAAGjF,IAAAA,CAAKkF,KAAK,CAAC6J,IAAAA,CAAKtK,CAAC,CAAA,CAAA;AACzC,IAAA,MAAMiD,KAAAA,GAAQ1H,IAAAA,CAAKqF,GAAG,CAACygB,KAAK/mB,KAAK,EAAEiB,IAAAA,CAAKkF,KAAK,CAAC6J,IAAAA,CAAKjK,CAAC,GAAGiK,KAAKhQ,KAAK,CAAA,CAAA;AACjE,IAAA,MAAMwG,MAAAA,GAASvF,IAAAA,CAAKqF,GAAG,CAACygB,KAAK9mB,MAAM,EAAEgB,IAAAA,CAAKkF,KAAK,CAAC6J,IAAAA,CAAKtK,CAAC,GAAGsK,KAAK/P,MAAM,CAAA,CAAA;AAEpE,IAAA,IAAK,IAAIyF,CAAAA,GAAIa,GAAAA,EAAKb,CAAAA,GAAIc,QAAQd,CAAAA,EAAAA,CAAK;QACjC,IAAIlF,CAAAA,GAAI,CAACkF,CAAAA,GAAIqhB,KAAK/mB,KAAK,GAAG0I,IAAA,IAAQ,CAAA;AAClC,QAAA,IAAK,IAAI3C,CAAAA,GAAI2C,IAAAA,EAAM3C,IAAI4C,KAAAA,EAAO5C,CAAAA,EAAAA,EAAKvF,KAAK,CAAA,CAAG;YACzCumB,IAAAA,CAAK3mB,IAAI,CAACI,CAAAA,CAAE,GAAGkB,KAAAA;AACfqlB,YAAAA,IAAAA,CAAK3mB,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAGkB,KAAAA;AACnBqlB,YAAAA,IAAAA,CAAK3mB,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAGkB,KAAAA;AACnBqlB,YAAAA,IAAAA,CAAK3mB,IAAI,CAACI,CAAAA,GAAI,CAAA,CAAE,GAAG,GAAA;AACrB,QAAA;AACF,IAAA;AACF;AAEM,SAAUwnB,WAAYjB,IAAY,EAAE/W,IAAU,EAAEyZ,SAAiB,EAAE/nB,KAAa,EAAA;IACpF,MAAM,EAAEqE,CAAC,EAAEL,CAAC,EAAE1F,KAAK,EAAEC,MAAM,EAAE,GAAG+P,IAAAA;AAChCoX,IAAAA,QAAAA,CAASL,IAAAA,EAAM;AAAEhhB,QAAAA,CAAAA;AAAGL,QAAAA,CAAAA;AAAG1F,QAAAA,KAAAA;QAAOC,MAAAA,EAAQwpB;OAAa/nB,KAAAA,CAAAA;AACnD0lB,IAAAA,QAAAA,CAASL,IAAAA,EAAM;AAAEhhB,QAAAA,CAAAA;AAAGL,QAAAA,CAAAA,EAAGA,IAAIzF,MAAAA,GAASwpB,SAAAA;AAAWzpB,QAAAA,KAAAA;QAAOC,MAAAA,EAAQwpB;KAAS,EAAI/nB,KAAAA,CAAAA;AAC3E0lB,IAAAA,QAAAA,CAASL,IAAAA,EAAM;AAAEhhB,QAAAA,CAAAA;AAAGL,QAAAA,CAAAA;QAAG1F,KAAAA,EAAOypB,SAAAA;AAAWxpB,QAAAA;OAAUyB,KAAAA,CAAAA;AACnD0lB,IAAAA,QAAAA,CAASL,IAAAA,EAAM;AAAEhhB,QAAAA,CAAAA,EAAGA,IAAI/F,KAAAA,GAAQypB,SAAAA;AAAW/jB,QAAAA,CAAAA;QAAG1F,KAAAA,EAAOypB,SAAAA;AAAWxpB,QAAAA;KAAM,EAAIyB,KAAAA,CAAAA;AAC5E;AAEM,SAAU2lB,QAAAA,CACdN,IAAY,EACZtgB,EAAU,EACVL,EAAU,EACVM,EAAU,EACVL,EAAU,EACVojB,SAAiB,EACjB/nB,KAAa,EAAA;IAEb,MAAMgoB,KAAAA,GAAQzoB,IAAAA,CAAK2H,IAAI,CAAC3H,IAAAA,CAAKqP,KAAK,CAAC5J,EAAAA,GAAKD,EAAAA,EAAIJ,EAAAA,GAAKD,EAAAA,CAAAA,CAAAA,GAAO,CAAA;AACxD,IAAA,MAAMiO,OAAOoV,SAAAA,GAAY,CAAA;AAEzB,IAAA,IAAK,IAAIjpB,CAAAA,GAAI,CAAA,EAAGA,CAAAA,IAAKkpB,OAAOlpB,CAAAA,EAAAA,CAAK;AAC/B,QAAA,MAAMoH,IAAIpH,CAAAA,GAAIkpB,KAAAA;AACdtC,QAAAA,QAAAA,CACEL,IAAAA,EACA;AAAEhhB,YAAAA,CAAAA,EAAGU,KAAK,CAACC,EAAAA,GAAKD,EAAA,IAAMmB,CAAAA,GAAIyM,IAAAA;AAAM3O,YAAAA,CAAAA,EAAGU,KAAK,CAACC,EAAAA,GAAKD,EAAA,IAAMwB,CAAAA,GAAIyM,IAAAA;YAAMrU,KAAAA,EAAOypB,SAAAA;YAAWxpB,MAAAA,EAAQwpB;WACxF/nB,KAAAA,CAAAA;AAEJ,IAAA;AACF;;"}