{"version":3,"file":"index-DUZqURr9.cjs","sources":["../node_modules/.pnpm/p-map@7.0.4/node_modules/p-map/index.js","../node_modules/.pnpm/ts-error@1.0.6/node_modules/ts-error/lib/es.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/errors.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/convertWildcardToRegex.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/escapeRegexString.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/parseRegex.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/createStringTest.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/testComparisonRange.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/testRange.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/internalFilter.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/filter.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/highlight.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/isSafeUnquotedExpression.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/grammar.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/isSafePath.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/createGetValueFunctionBody.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/hydrateAst.js","../node_modules/.pnpm/nearley@2.20.1/node_modules/nearley/lib/nearley.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/parse.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/serialize.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/test.js","../node_modules/.pnpm/liqe@3.8.4/node_modules/liqe/dist/src/Liqe.js","../src/private/lucene_to_lucid_translator.ts","../src/private/utils/weak_cache_service.ts","../src/private/router_macro/utils/relationships.ts","../src/private/open_api_schema_service.ts","../src/private/mixin.ts","../src/private/prepare_consume_chain_builder.ts","../src/private/decorator_schemas.ts","../src/private/decorators.ts","../src/private/router_macro/utils/openapi_validation_schemas.ts","../src/private/router_macro/utils/type_guards.ts","../src/private/router_macro/utils/xml.ts","../src/private/router_macro/controllers/resourceful_model_controller.ts","../node_modules/.pnpm/dot-object@2.1.5/node_modules/dot-object/index.js","../src/private/router_macro/services/resourceful_router_options_service.ts","../node_modules/.pnpm/@nhtio+middleware@1.20251213.1/node_modules/@nhtio/middleware/index.mjs","../src/private/router_macro/services/resourceful_router_choices_service.ts","../src/private/router_macro/services/resourceful_router_model_resolver_service.ts","../src/private/router_macro/services/resourceful_router_openapi_document_service.ts","../src/private/router_macro/services/resourceful_router_model_options_service.ts","../src/private/router_macro/index.ts","../src/private/odata_macro/utils/odata.ts","../src/private/helpers.ts","../src/private/odata_macro/services/odata_metadata_service.ts","../src/private/odata_to_lucid_translator.ts","../src/private/odata_macro/controllers/resourceful_model_controller.ts","../src/private/odata_macro/index.ts","../src/integration/configure.ts","../src/index.ts"],"sourcesContent":["export default async function pMap(\n\titerable,\n\tmapper,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tstopOnError = true,\n\t\tsignal,\n\t} = {},\n) {\n\treturn new Promise((resolve_, reject_) => {\n\t\tif (iterable[Symbol.iterator] === undefined && iterable[Symbol.asyncIterator] === undefined) {\n\t\t\tthrow new TypeError(`Expected \\`input\\` to be either an \\`Iterable\\` or \\`AsyncIterable\\`, got (${typeof iterable})`);\n\t\t}\n\n\t\tif (typeof mapper !== 'function') {\n\t\t\tthrow new TypeError('Mapper function is required');\n\t\t}\n\n\t\tif (!((Number.isSafeInteger(concurrency) && concurrency >= 1) || concurrency === Number.POSITIVE_INFINITY)) {\n\t\t\tthrow new TypeError(`Expected \\`concurrency\\` to be an integer from 1 and up or \\`Infinity\\`, got \\`${concurrency}\\` (${typeof concurrency})`);\n\t\t}\n\n\t\tconst result = [];\n\t\tconst errors = [];\n\t\tconst skippedIndexesMap = new Map();\n\t\tlet isRejected = false;\n\t\tlet isResolved = false;\n\t\tlet isIterableDone = false;\n\t\tlet resolvingCount = 0;\n\t\tlet currentIndex = 0;\n\t\tconst iterator = iterable[Symbol.iterator] === undefined ? iterable[Symbol.asyncIterator]() : iterable[Symbol.iterator]();\n\n\t\tconst signalListener = () => {\n\t\t\treject(signal.reason);\n\t\t};\n\n\t\tconst cleanup = () => {\n\t\t\tsignal?.removeEventListener('abort', signalListener);\n\t\t};\n\n\t\tconst resolve = value => {\n\t\t\tresolve_(value);\n\t\t\tcleanup();\n\t\t};\n\n\t\tconst reject = reason => {\n\t\t\tisRejected = true;\n\t\t\tisResolved = true;\n\t\t\treject_(reason);\n\t\t\tcleanup();\n\t\t};\n\n\t\tif (signal) {\n\t\t\tif (signal.aborted) {\n\t\t\t\treject(signal.reason);\n\t\t\t}\n\n\t\t\tsignal.addEventListener('abort', signalListener, {once: true});\n\t\t}\n\n\t\tconst next = async () => {\n\t\t\tif (isResolved) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextItem = await iterator.next();\n\n\t\t\tconst index = currentIndex;\n\t\t\tcurrentIndex++;\n\n\t\t\t// Note: `iterator.next()` can be called many times in parallel.\n\t\t\t// This can cause multiple calls to this `next()` function to\n\t\t\t// receive a `nextItem` with `done === true`.\n\t\t\t// The shutdown logic that rejects/resolves must be protected\n\t\t\t// so it runs only one time as the `skippedIndex` logic is\n\t\t\t// non-idempotent.\n\t\t\tif (nextItem.done) {\n\t\t\t\tisIterableDone = true;\n\n\t\t\t\tif (resolvingCount === 0 && !isResolved) {\n\t\t\t\t\tif (!stopOnError && errors.length > 0) {\n\t\t\t\t\t\treject(new AggregateError(errors)); // eslint-disable-line unicorn/error-message\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tisResolved = true;\n\n\t\t\t\t\tif (skippedIndexesMap.size === 0) {\n\t\t\t\t\t\tresolve(result);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst pureResult = [];\n\n\t\t\t\t\t// Support multiple `pMapSkip`'s.\n\t\t\t\t\tfor (const [index, value] of result.entries()) {\n\t\t\t\t\t\tif (skippedIndexesMap.get(index) === pMapSkip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpureResult.push(value);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(pureResult);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresolvingCount++;\n\n\t\t\t// Intentionally detached\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst element = await nextItem.value;\n\n\t\t\t\t\tif (isResolved) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst value = await mapper(element, index);\n\n\t\t\t\t\t// Use Map to stage the index of the element.\n\t\t\t\t\tif (value === pMapSkip) {\n\t\t\t\t\t\tskippedIndexesMap.set(index, value);\n\t\t\t\t\t}\n\n\t\t\t\t\tresult[index] = value;\n\n\t\t\t\t\tresolvingCount--;\n\t\t\t\t\tawait next();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (stopOnError) {\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors.push(error);\n\t\t\t\t\t\tresolvingCount--;\n\n\t\t\t\t\t\t// In that case we can't really continue regardless of `stopOnError` state\n\t\t\t\t\t\t// since an iterable is likely to continue throwing after it throws once.\n\t\t\t\t\t\t// If we continue calling `next()` indefinitely we will likely end up\n\t\t\t\t\t\t// in an infinite loop of failed iteration.\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait next();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})();\n\t\t};\n\n\t\t// Create the concurrent runners in a detached (non-awaited)\n\t\t// promise. We need this so we can await the `next()` calls\n\t\t// to stop creating runners before hitting the concurrency limit\n\t\t// if the iterable has already been marked as done.\n\t\t// NOTE: We *must* do this for async iterators otherwise we'll spin up\n\t\t// infinite `next()` calls by default and never start the event loop.\n\t\t(async () => {\n\t\t\tfor (let index = 0; index < concurrency; index++) {\n\t\t\t\ttry {\n\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\tawait next();\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (isIterableDone || isRejected) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t});\n}\n\nexport function pMapIterable(\n\titerable,\n\tmapper,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tbackpressure = concurrency,\n\t} = {},\n) {\n\tif (iterable[Symbol.iterator] === undefined && iterable[Symbol.asyncIterator] === undefined) {\n\t\tthrow new TypeError(`Expected \\`input\\` to be either an \\`Iterable\\` or \\`AsyncIterable\\`, got (${typeof iterable})`);\n\t}\n\n\tif (typeof mapper !== 'function') {\n\t\tthrow new TypeError('Mapper function is required');\n\t}\n\n\tif (!((Number.isSafeInteger(concurrency) && concurrency >= 1) || concurrency === Number.POSITIVE_INFINITY)) {\n\t\tthrow new TypeError(`Expected \\`concurrency\\` to be an integer from 1 and up or \\`Infinity\\`, got \\`${concurrency}\\` (${typeof concurrency})`);\n\t}\n\n\tif (!((Number.isSafeInteger(backpressure) && backpressure >= concurrency) || backpressure === Number.POSITIVE_INFINITY)) {\n\t\tthrow new TypeError(`Expected \\`backpressure\\` to be an integer from \\`concurrency\\` (${concurrency}) and up or \\`Infinity\\`, got \\`${backpressure}\\` (${typeof backpressure})`);\n\t}\n\n\treturn {\n\t\tasync * [Symbol.asyncIterator]() {\n\t\t\tconst iterator = iterable[Symbol.asyncIterator] === undefined ? iterable[Symbol.iterator]() : iterable[Symbol.asyncIterator]();\n\n\t\t\tconst promises = [];\n\t\t\tlet pendingPromisesCount = 0;\n\t\t\tlet isDone = false;\n\t\t\tlet index = 0;\n\n\t\t\tfunction trySpawn() {\n\t\t\t\tif (isDone || !(pendingPromisesCount < concurrency && promises.length < backpressure)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tpendingPromisesCount++;\n\n\t\t\t\tconst promise = (async () => {\n\t\t\t\t\tconst {done, value} = await iterator.next();\n\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\tpendingPromisesCount--;\n\t\t\t\t\t\treturn {done: true};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Spawn if still below concurrency and backpressure limit\n\t\t\t\t\ttrySpawn();\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst returnValue = await mapper(await value, index++);\n\n\t\t\t\t\t\tpendingPromisesCount--;\n\n\t\t\t\t\t\tif (returnValue === pMapSkip) {\n\t\t\t\t\t\t\tconst index = promises.indexOf(promise);\n\n\t\t\t\t\t\t\tif (index > 0) {\n\t\t\t\t\t\t\t\tpromises.splice(index, 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Spawn if still below backpressure limit and just dropped below concurrency limit\n\t\t\t\t\t\ttrySpawn();\n\n\t\t\t\t\t\treturn {done: false, value: returnValue};\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tpendingPromisesCount--;\n\t\t\t\t\t\tisDone = true;\n\t\t\t\t\t\treturn {error};\n\t\t\t\t\t}\n\t\t\t\t})();\n\n\t\t\t\tpromises.push(promise);\n\t\t\t}\n\n\t\t\ttrySpawn();\n\n\t\t\twhile (promises.length > 0) {\n\t\t\t\tconst {error, done, value} = await promises[0]; // eslint-disable-line no-await-in-loop\n\n\t\t\t\tpromises.shift();\n\n\t\t\t\tif (error) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\n\t\t\t\tif (done) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Spawn if just dropped below backpressure limit and below the concurrency limit\n\t\t\t\ttrySpawn();\n\n\t\t\t\tif (value === pMapSkip) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tyield value;\n\t\t\t}\n\t\t},\n\t};\n}\n\nexport const pMapSkip = Symbol('skip');\n","export class ExtendableError extends Error {\n  constructor(...params) {\n    super(...params);\n    var message =\n      params.length > 0 && typeof params[0] === \"string\" ? params[0] : \"\";\n\n    // Replace Error with ClassName of the constructor, if it has not been overwritten already\n    if (this.name === undefined || this.name === \"Error\") {\n      Object.defineProperty(this, \"name\", {\n        configurable: true,\n        enumerable: false,\n        value: this.constructor.name,\n        writable: true,\n      });\n    }\n\n    Object.defineProperty(this, \"message\", {\n      configurable: true,\n      enumerable: false,\n      value: message,\n      writable: true,\n    });\n\n    Object.defineProperty(this, \"stack\", {\n      configurable: true,\n      enumerable: false,\n      value: \"\",\n      writable: true,\n    });\n\n    // Maintains proper stack trace for where our error was thrown (only available on V8)\n    if (Error.captureStackTrace) {\n      Error.captureStackTrace(this, this.constructor);\n    } else if (this.stack === \"\") {\n      this.stack = new Error(message).stack;\n    }\n  }\n}\n\nexport default ExtendableError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SyntaxError = exports.LiqeError = void 0;\nconst ts_error_1 = require(\"ts-error\");\nclass LiqeError extends ts_error_1.ExtendableError {\n}\nexports.LiqeError = LiqeError;\nclass SyntaxError extends LiqeError {\n    constructor(message, offset, line, column) {\n        super(message);\n        this.message = message;\n        this.offset = offset;\n        this.line = line;\n        this.column = column;\n    }\n}\nexports.SyntaxError = SyntaxError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.convertWildcardToRegex = void 0;\nconst WILDCARD_RULE = /(\\*+)|(\\?)/g;\nconst convertWildcardToRegex = (pattern) => {\n    return new RegExp(pattern.replaceAll(WILDCARD_RULE, (_match, p1) => {\n        return p1 ? '(.+?)' : '(.)';\n    }));\n};\nexports.convertWildcardToRegex = convertWildcardToRegex;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.escapeRegexString = void 0;\nconst ESCAPE_RULE = /[$()*+.?[\\\\\\]^{|}]/g;\nconst DASH_RULE = /-/g;\nconst escapeRegexString = (subject) => {\n    return subject.replaceAll(ESCAPE_RULE, '\\\\$&').replaceAll(DASH_RULE, '\\\\x2d');\n};\nexports.escapeRegexString = escapeRegexString;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseRegex = void 0;\nconst RegExpRule = /(\\/?)(.+)\\1([a-z]*)/;\nconst FlagRule = /^(?!.*?(.).*?\\1)[AJUXgimsux]+$/;\nconst parseRegex = (subject) => {\n    const match = RegExpRule.exec(subject);\n    if (!match) {\n        throw new Error('Invalid RegExp.');\n    }\n    if (match[3] && !FlagRule.test(match[3])) {\n        return new RegExp(subject);\n    }\n    return new RegExp(match[2], match[3]);\n};\nexports.parseRegex = parseRegex;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createStringTest = void 0;\nconst convertWildcardToRegex_1 = require(\"./convertWildcardToRegex\");\nconst escapeRegexString_1 = require(\"./escapeRegexString\");\nconst parseRegex_1 = require(\"./parseRegex\");\nconst createRegexTest = (regexCache, regex) => {\n    let rule;\n    if (regexCache[regex]) {\n        rule = regexCache[regex];\n    }\n    else {\n        rule = (0, parseRegex_1.parseRegex)(regex);\n        regexCache[regex] = rule;\n    }\n    return (subject) => {\n        var _a, _b;\n        return (_b = (_a = subject.match(rule)) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : false;\n    };\n};\nconst createStringTest = (regexCache, ast) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    const { expression } = ast;\n    if (expression.type === 'RangeExpression') {\n        throw new Error('Unexpected range expression.');\n    }\n    if (expression.type === 'RegexExpression') {\n        return createRegexTest(regexCache, expression.value);\n    }\n    if (expression.type !== 'LiteralExpression') {\n        throw new Error('Expected a literal expression.');\n    }\n    const value = String(expression.value);\n    if ((value.includes('*') || value.includes('?')) &&\n        expression.quoted === false) {\n        return createRegexTest(regexCache, String((0, convertWildcardToRegex_1.convertWildcardToRegex)(value)) + 'ui');\n    }\n    else {\n        return createRegexTest(regexCache, '/(' + (0, escapeRegexString_1.escapeRegexString)(value) + ')/' + (expression.quoted ? 'u' : 'ui'));\n    }\n};\nexports.createStringTest = createStringTest;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.testComparisonRange = void 0;\nconst testComparisonRange = (query, value, operator) => {\n    switch (operator) {\n        case ':<':\n            return value < query;\n        case ':<=':\n            return value <= query;\n        case ':=':\n            return value === query;\n        case ':>':\n            return value > query;\n        case ':>=':\n            return value >= query;\n        default:\n            throw new Error(`Unimplemented comparison operator: ${operator}`);\n    }\n};\nexports.testComparisonRange = testComparisonRange;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.testRange = void 0;\nconst testRange = (value, range) => {\n    if (typeof value === 'number') {\n        if (value < range.min) {\n            return false;\n        }\n        if (value === range.min && !range.minInclusive) {\n            return false;\n        }\n        if (value > range.max) {\n            return false;\n        }\n        if (value === range.max && !range.maxInclusive) {\n            return false;\n        }\n        return true;\n    }\n    // @todo handle non-numeric ranges -- https://github.com/gajus/liqe/issues/3\n    return false;\n};\nexports.testRange = testRange;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.internalFilter = void 0;\nconst createStringTest_1 = require(\"./createStringTest\");\nconst testComparisonRange_1 = require(\"./testComparisonRange\");\nconst testRange_1 = require(\"./testRange\");\nconst createValueTest = (ast) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    const { expression } = ast;\n    if (expression.type === 'RangeExpression') {\n        return (value) => {\n            return (0, testRange_1.testRange)(value, expression.range);\n        };\n    }\n    if (expression.type === 'EmptyExpression') {\n        return () => {\n            return false;\n        };\n    }\n    const expressionValue = expression.value;\n    if (ast.operator && ast.operator.operator !== ':') {\n        const operator = ast.operator;\n        if (typeof expressionValue !== 'number') {\n            throw new TypeError('Expected a number.');\n        }\n        return (value) => {\n            if (typeof value !== 'number') {\n                return false;\n            }\n            return (0, testComparisonRange_1.testComparisonRange)(expressionValue, value, operator.operator);\n        };\n    }\n    else if (typeof expressionValue === 'boolean') {\n        return (value) => {\n            return value === expressionValue;\n        };\n    }\n    else if (expressionValue === null) {\n        return (value) => {\n            return value === null;\n        };\n    }\n    else {\n        const testString = (0, createStringTest_1.createStringTest)({}, ast);\n        return (value) => {\n            return testString(String(value));\n        };\n    }\n};\nconst testValue = (ast, value, resultFast, path, highlights) => {\n    if (Array.isArray(value)) {\n        let foundMatch = false;\n        let index = 0;\n        for (const item of value) {\n            if (testValue(ast, item, resultFast, [...path, String(index++)], highlights)) {\n                if (resultFast) {\n                    return true;\n                }\n                foundMatch = true;\n            }\n        }\n        return foundMatch;\n    }\n    else if (typeof value === 'object' && value !== null) {\n        let foundMatch = false;\n        for (const key in value) {\n            if (testValue(ast, value[key], resultFast, [...path, key], highlights)) {\n                if (resultFast) {\n                    return true;\n                }\n                foundMatch = true;\n            }\n        }\n        return foundMatch;\n    }\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    if (!ast.test) {\n        throw new Error('Expected test to be defined.');\n    }\n    const result = ast.test(value);\n    if (result) {\n        highlights.push({\n            ...(typeof result === 'string' && { keyword: result }),\n            path: path.join('.'),\n        });\n        return true;\n    }\n    return Boolean(result);\n};\nconst testField = (row, ast, resultFast, path, highlights) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    if (!ast.test) {\n        ast.test = createValueTest(ast);\n    }\n    if (ast.field.type === 'ImplicitField') {\n        let foundMatch = false;\n        for (const fieldName in row) {\n            if (testValue({\n                ...ast,\n                field: {\n                    location: {\n                        end: -1,\n                        start: -1,\n                    },\n                    name: fieldName,\n                    quoted: true,\n                    quotes: 'double',\n                    type: 'Field',\n                },\n            }, row[fieldName], resultFast, [...path, fieldName], highlights)) {\n                if (resultFast) {\n                    return true;\n                }\n                foundMatch = true;\n            }\n        }\n        return foundMatch;\n    }\n    if (ast.field.name in row) {\n        return testValue(ast, row[ast.field.name], resultFast, path, highlights);\n    }\n    else if (ast.getValue && ast.field.path) {\n        return testValue(ast, ast.getValue(row), resultFast, ast.field.path, highlights);\n    }\n    else if (ast.field.path) {\n        let value = row;\n        for (const key of ast.field.path) {\n            if (typeof value !== 'object' || value === null) {\n                return false;\n            }\n            else if (key in value) {\n                value = value[key];\n            }\n            else {\n                return false;\n            }\n        }\n        return testValue(ast, value, resultFast, ast.field.path, highlights);\n    }\n    else {\n        return false;\n    }\n};\nconst internalFilter = (ast, rows, resultFast = true, path = [], highlights = []) => {\n    if (ast.type === 'Tag') {\n        return rows.filter((row) => {\n            return testField(row, ast, resultFast, ast.field.type === 'ImplicitField' ? path : [...path, ast.field.name], highlights);\n        });\n    }\n    if (ast.type === 'UnaryOperator') {\n        const removeRows = (0, exports.internalFilter)(ast.operand, rows, resultFast, path, []);\n        return rows.filter((row) => {\n            return !removeRows.includes(row);\n        });\n    }\n    if (ast.type === 'ParenthesizedExpression') {\n        return (0, exports.internalFilter)(ast.expression, rows, resultFast, path, highlights);\n    }\n    if (!ast.left) {\n        throw new Error('Expected left to be defined.');\n    }\n    const leftRows = (0, exports.internalFilter)(ast.left, rows, resultFast, path, highlights);\n    if (!ast.right) {\n        throw new Error('Expected right to be defined.');\n    }\n    if (ast.type !== 'LogicalExpression') {\n        throw new Error('Expected a tag expression.');\n    }\n    if (ast.operator.operator === 'OR') {\n        const rightRows = (0, exports.internalFilter)(ast.right, rows, resultFast, path, highlights);\n        return Array.from(new Set([...leftRows, ...rightRows]));\n    }\n    else if (ast.operator.operator === 'AND') {\n        return (0, exports.internalFilter)(ast.right, leftRows, resultFast, path, highlights);\n    }\n    throw new Error('Unexpected state.');\n};\nexports.internalFilter = internalFilter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.filter = void 0;\nconst internalFilter_1 = require(\"./internalFilter\");\nconst filter = (ast, data) => {\n    return (0, internalFilter_1.internalFilter)(ast, data);\n};\nexports.filter = filter;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.highlight = void 0;\nconst escapeRegexString_1 = require(\"./escapeRegexString\");\nconst internalFilter_1 = require(\"./internalFilter\");\nconst highlight = (ast, data) => {\n    const highlights = [];\n    (0, internalFilter_1.internalFilter)(ast, [data], false, [], highlights);\n    const aggregatedHighlights = [];\n    for (const highlightNode of highlights) {\n        let aggregatedHighlight = aggregatedHighlights.find((maybeTarget) => {\n            return maybeTarget.path === highlightNode.path;\n        });\n        if (!aggregatedHighlight) {\n            aggregatedHighlight = {\n                keywords: [],\n                path: highlightNode.path,\n            };\n            aggregatedHighlights.push(aggregatedHighlight);\n        }\n        if (highlightNode.keyword) {\n            aggregatedHighlight.keywords.push(highlightNode.keyword);\n        }\n    }\n    return aggregatedHighlights.map((aggregatedHighlight) => {\n        if (aggregatedHighlight.keywords.length > 0) {\n            return {\n                path: aggregatedHighlight.path,\n                query: new RegExp('(' +\n                    aggregatedHighlight.keywords\n                        .map((keyword) => {\n                        return (0, escapeRegexString_1.escapeRegexString)(keyword.trim());\n                    })\n                        .join('|') +\n                    ')'),\n            };\n        }\n        return {\n            path: aggregatedHighlight.path,\n        };\n    });\n};\nexports.highlight = highlight;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSafeUnquotedExpression = void 0;\nconst isSafeUnquotedExpression = (expression) => {\n    return /^[#$*@A-Z_a-z][#$*.@A-Z_a-z-]*$/.test(expression);\n};\nexports.isSafeUnquotedExpression = isSafeUnquotedExpression;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// Generated automatically by nearley, version 2.20.1\n// http://github.com/Hardmath123/nearley\n// Bypasses TS6133. Allow declared but unused functions.\n//\nfunction id(d) {\n    return d[0];\n}\nconst grammar = {\n    Lexer: undefined,\n    ParserRules: [\n        {\n            name: 'main',\n            postprocess: (data) => data[1],\n            symbols: ['_', 'logical_expression', '_'],\n        },\n        { name: '_$ebnf$1', symbols: [] },\n        {\n            name: '_$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['_$ebnf$1', 'whitespace_character'],\n        },\n        { name: '_', postprocess: (data) => data[0].length, symbols: ['_$ebnf$1'] },\n        { name: '__$ebnf$1', symbols: ['whitespace_character'] },\n        {\n            name: '__$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['__$ebnf$1', 'whitespace_character'],\n        },\n        {\n            name: '__',\n            postprocess: (data) => data[0].length,\n            symbols: ['__$ebnf$1'],\n        },\n        { name: 'whitespace_character', postprocess: id, symbols: [/[\\t\\n\\v\\f ]/] },\n        { name: 'decimal$ebnf$1', postprocess: id, symbols: [{ literal: '-' }] },\n        { name: 'decimal$ebnf$1', postprocess: () => null, symbols: [] },\n        { name: 'decimal$ebnf$2', symbols: [/\\d/] },\n        {\n            name: 'decimal$ebnf$2',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['decimal$ebnf$2', /\\d/],\n        },\n        { name: 'decimal$ebnf$3$subexpression$1$ebnf$1', symbols: [/\\d/] },\n        {\n            name: 'decimal$ebnf$3$subexpression$1$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['decimal$ebnf$3$subexpression$1$ebnf$1', /\\d/],\n        },\n        {\n            name: 'decimal$ebnf$3$subexpression$1',\n            symbols: [{ literal: '.' }, 'decimal$ebnf$3$subexpression$1$ebnf$1'],\n        },\n        {\n            name: 'decimal$ebnf$3',\n            postprocess: id,\n            symbols: ['decimal$ebnf$3$subexpression$1'],\n        },\n        { name: 'decimal$ebnf$3', postprocess: () => null, symbols: [] },\n        {\n            name: 'decimal',\n            postprocess: (data) => Number.parseFloat((data[0] || '') +\n                data[1].join('') +\n                (data[2] ? '.' + data[2][1].join('') : '')),\n            symbols: ['decimal$ebnf$1', 'decimal$ebnf$2', 'decimal$ebnf$3'],\n        },\n        { name: 'dqstring$ebnf$1', symbols: [] },\n        {\n            name: 'dqstring$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['dqstring$ebnf$1', 'dstrchar'],\n        },\n        {\n            name: 'dqstring',\n            postprocess: (data) => data[1].join(''),\n            symbols: [{ literal: '\"' }, 'dqstring$ebnf$1', { literal: '\"' }],\n        },\n        { name: 'sqstring$ebnf$1', symbols: [] },\n        {\n            name: 'sqstring$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['sqstring$ebnf$1', 'sstrchar'],\n        },\n        {\n            name: 'sqstring',\n            postprocess: (data) => data[1].join(''),\n            symbols: [{ literal: \"'\" }, 'sqstring$ebnf$1', { literal: \"'\" }],\n        },\n        { name: 'dstrchar', postprocess: id, symbols: [/[^\\n\"\\\\]/] },\n        {\n            name: 'dstrchar',\n            postprocess: (data) => JSON.parse('\"' + data.join('') + '\"'),\n            symbols: [{ literal: '\\\\' }, 'strescape'],\n        },\n        { name: 'sstrchar', postprocess: id, symbols: [/[^\\n'\\\\]/] },\n        {\n            name: 'sstrchar',\n            postprocess: (data) => JSON.parse('\"' + data.join('') + '\"'),\n            symbols: [{ literal: '\\\\' }, 'strescape'],\n        },\n        {\n            name: 'sstrchar$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: '\\\\' }, { literal: \"'\" }],\n        },\n        {\n            name: 'sstrchar',\n            postprocess: () => \"'\",\n            symbols: ['sstrchar$string$1'],\n        },\n        { name: 'strescape', postprocess: id, symbols: [/[\"/\\\\bfnrt]/] },\n        {\n            name: 'strescape',\n            postprocess: (data) => data.join(''),\n            symbols: [\n                { literal: 'u' },\n                /[\\dA-Fa-f]/,\n                /[\\dA-Fa-f]/,\n                /[\\dA-Fa-f]/,\n                /[\\dA-Fa-f]/,\n            ],\n        },\n        {\n            name: 'logical_expression',\n            postprocess: id,\n            symbols: ['two_op_logical_expression'],\n        },\n        {\n            name: 'two_op_logical_expression',\n            postprocess: (data) => ({\n                left: data[0],\n                location: {\n                    end: data[2].location.end,\n                    start: data[0].location.start,\n                },\n                operator: data[1],\n                right: data[2],\n                type: 'LogicalExpression',\n            }),\n            symbols: [\n                'pre_two_op_logical_expression',\n                'boolean_operator',\n                'post_one_op_logical_expression',\n            ],\n        },\n        {\n            name: 'two_op_logical_expression',\n            postprocess: (data) => ({\n                left: data[0],\n                location: {\n                    end: data[2].location.end,\n                    start: data[0].location.start,\n                },\n                operator: {\n                    operator: 'AND',\n                    type: 'ImplicitBooleanOperator',\n                },\n                right: data[2],\n                type: 'LogicalExpression',\n            }),\n            symbols: [\n                'pre_two_op_implicit_logical_expression',\n                '__',\n                'post_one_op_implicit_logical_expression',\n            ],\n        },\n        {\n            name: 'two_op_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['one_op_logical_expression'],\n        },\n        {\n            name: 'pre_two_op_implicit_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['two_op_logical_expression'],\n        },\n        {\n            name: 'pre_two_op_implicit_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'post_one_op_implicit_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['one_op_logical_expression'],\n        },\n        {\n            name: 'post_one_op_implicit_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'one_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'pre_two_op_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['two_op_logical_expression', '__'],\n        },\n        {\n            name: 'pre_two_op_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (d) => ({\n                expression: {\n                    location: {\n                        end: d[0].location.start + 1,\n                        start: d[0].location.start + 1,\n                    },\n                    type: 'EmptyExpression',\n                },\n                location: { end: d[2].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: ['parentheses_open', '_', 'parentheses_close'],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location.start + 1, start: d[0].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'one_op_logical_expression$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: 'N' }, { literal: 'O' }, { literal: 'T' }],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (data, start) => {\n                return {\n                    location: {\n                        end: data[1].location.end,\n                        start,\n                    },\n                    operand: data[1],\n                    operator: 'NOT',\n                    type: 'UnaryOperator',\n                };\n            },\n            symbols: ['one_op_logical_expression$string$1', 'post_boolean_primary'],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (data, start) => {\n                return {\n                    location: {\n                        end: data[1].location.end,\n                        start,\n                    },\n                    operand: data[1],\n                    operator: '-',\n                    type: 'UnaryOperator',\n                };\n            },\n            symbols: [{ literal: '-' }, 'boolean_primary'],\n        },\n        {\n            name: 'one_op_logical_expression',\n            postprocess: (d) => d[0],\n            symbols: ['boolean_primary'],\n        },\n        {\n            name: 'post_one_op_logical_expression',\n            postprocess: (d) => d[1],\n            symbols: ['__', 'one_op_logical_expression'],\n        },\n        {\n            name: 'post_one_op_logical_expression',\n            postprocess: (d) => ({\n                expression: d[2],\n                location: { end: d[4].location + 1, start: d[0].location },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                'parentheses_open',\n                '_',\n                'one_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'parentheses_open',\n            postprocess: (data, start) => ({ location: { start } }),\n            symbols: [{ literal: '(' }],\n        },\n        {\n            name: 'parentheses_close',\n            postprocess: (data, start) => ({ location: { start } }),\n            symbols: [{ literal: ')' }],\n        },\n        {\n            name: 'boolean_operator$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: 'O' }, { literal: 'R' }],\n        },\n        {\n            name: 'boolean_operator',\n            postprocess: (data, start) => ({\n                location: { end: start + 2, start },\n                operator: 'OR',\n                type: 'BooleanOperator',\n            }),\n            symbols: ['boolean_operator$string$1'],\n        },\n        {\n            name: 'boolean_operator$string$2',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: 'A' }, { literal: 'N' }, { literal: 'D' }],\n        },\n        {\n            name: 'boolean_operator',\n            postprocess: (data, start) => ({\n                location: { end: start + 3, start },\n                operator: 'AND',\n                type: 'BooleanOperator',\n            }),\n            symbols: ['boolean_operator$string$2'],\n        },\n        { name: 'boolean_primary', postprocess: id, symbols: ['tag_expression'] },\n        {\n            name: 'post_boolean_primary',\n            postprocess: (d) => ({\n                expression: d[3],\n                location: { end: d[5].location.start + 1, start: d[1].location.start },\n                type: 'ParenthesizedExpression',\n            }),\n            symbols: [\n                '__',\n                'parentheses_open',\n                '_',\n                'two_op_logical_expression',\n                '_',\n                'parentheses_close',\n            ],\n        },\n        {\n            name: 'post_boolean_primary',\n            postprocess: (d) => d[1],\n            symbols: ['__', 'boolean_primary'],\n        },\n        {\n            name: 'tag_expression',\n            postprocess: (data, start) => {\n                const field = {\n                    location: data[0].location,\n                    name: data[0].name,\n                    path: data[0].name.split('.').filter(Boolean),\n                    quoted: data[0].quoted,\n                    quotes: data[0].quotes,\n                    type: 'Field',\n                };\n                if (!data[0].quotes) {\n                    delete field.quotes;\n                }\n                return {\n                    field,\n                    location: {\n                        end: data[2].expression.location.end,\n                        start,\n                    },\n                    operator: data[1],\n                    ...data[2],\n                };\n            },\n            symbols: ['field', 'comparison_operator', 'expression'],\n        },\n        {\n            name: 'tag_expression',\n            postprocess: (data, start) => {\n                const field = {\n                    location: data[0].location,\n                    name: data[0].name,\n                    path: data[0].name.split('.').filter(Boolean),\n                    quoted: data[0].quoted,\n                    quotes: data[0].quotes,\n                    type: 'Field',\n                };\n                if (!data[0].quotes) {\n                    delete field.quotes;\n                }\n                return {\n                    expression: {\n                        location: {\n                            end: data[1].location.end,\n                            start: data[1].location.end,\n                        },\n                        type: 'EmptyExpression',\n                    },\n                    field,\n                    location: {\n                        end: data[1].location.end,\n                        start,\n                    },\n                    operator: data[1],\n                    type: 'Tag',\n                };\n            },\n            symbols: ['field', 'comparison_operator'],\n        },\n        {\n            name: 'tag_expression',\n            postprocess: (data, start) => {\n                return {\n                    field: { type: 'ImplicitField' },\n                    location: { end: data[0].expression.location.end, start },\n                    ...data[0],\n                };\n            },\n            symbols: ['expression'],\n        },\n        { name: 'field$ebnf$1', symbols: [] },\n        {\n            name: 'field$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['field$ebnf$1', /[\\w$.-]/],\n        },\n        {\n            name: 'field',\n            postprocess: (data, start) => ({\n                location: { end: start + (data[0] + data[1].join('')).length, start },\n                name: data[0] + data[1].join(''),\n                quoted: false,\n                type: 'LiteralExpression',\n            }),\n            symbols: [/[$A-Z_a-z]/, 'field$ebnf$1'],\n        },\n        {\n            name: 'field',\n            postprocess: (data, start) => ({\n                location: { end: start + data[0].length + 2, start },\n                name: data[0],\n                quoted: true,\n                quotes: 'single',\n                type: 'LiteralExpression',\n            }),\n            symbols: ['sqstring'],\n        },\n        {\n            name: 'field',\n            postprocess: (data, start) => ({\n                location: { end: start + data[0].length + 2, start },\n                name: data[0],\n                quoted: true,\n                quotes: 'double',\n                type: 'LiteralExpression',\n            }),\n            symbols: ['dqstring'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length, start },\n                    quoted: false,\n                    type: 'LiteralExpression',\n                    value: Number(data.join('')),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['decimal'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length, start },\n                    type: 'RegexExpression',\n                    value: data.join(''),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['regex'],\n        },\n        { name: 'expression', postprocess: (data) => data[0], symbols: ['range'] },\n        {\n            name: 'expression',\n            postprocess: (data, start, reject) => {\n                const value = data.join('');\n                if (data[0] === 'AND' || data[0] === 'OR' || data[0] === 'NOT') {\n                    return reject;\n                }\n                let normalizedValue;\n                if (value === 'true') {\n                    normalizedValue = true;\n                }\n                else if (value === 'false') {\n                    normalizedValue = false;\n                }\n                else if (value === 'null') {\n                    normalizedValue = null;\n                }\n                else {\n                    normalizedValue = value;\n                }\n                return {\n                    expression: {\n                        location: {\n                            end: start + value.length,\n                            start,\n                        },\n                        quoted: false,\n                        type: 'LiteralExpression',\n                        value: normalizedValue,\n                    },\n                    type: 'Tag',\n                };\n            },\n            symbols: ['unquoted_value'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length + 2, start },\n                    quoted: true,\n                    quotes: 'single',\n                    type: 'LiteralExpression',\n                    value: data.join(''),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['sqstring'],\n        },\n        {\n            name: 'expression',\n            postprocess: (data, start) => ({\n                expression: {\n                    location: { end: start + data.join('').length + 2, start },\n                    quoted: true,\n                    quotes: 'double',\n                    type: 'LiteralExpression',\n                    value: data.join(''),\n                },\n                type: 'Tag',\n            }),\n            symbols: ['dqstring'],\n        },\n        {\n            name: 'range$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [\n                { literal: ' ' },\n                { literal: 'T' },\n                { literal: 'O' },\n                { literal: ' ' },\n            ],\n        },\n        {\n            name: 'range',\n            postprocess: (data, start) => {\n                return {\n                    expression: {\n                        location: {\n                            end: data[4].location.start + 1,\n                            start: data[0].location.start,\n                        },\n                        range: {\n                            max: data[3],\n                            maxInclusive: data[4].inclusive,\n                            min: data[1],\n                            minInclusive: data[0].inclusive,\n                        },\n                        type: 'RangeExpression',\n                    },\n                    location: {\n                        start,\n                    },\n                    type: 'Tag',\n                };\n            },\n            symbols: [\n                'range_open',\n                'decimal',\n                'range$string$1',\n                'decimal',\n                'range_close',\n            ],\n        },\n        {\n            name: 'range_open',\n            postprocess: (data, start) => ({ inclusive: true, location: { start } }),\n            symbols: [{ literal: '[' }],\n        },\n        {\n            name: 'range_open',\n            postprocess: (data, start) => ({ inclusive: false, location: { start } }),\n            symbols: [{ literal: '{' }],\n        },\n        {\n            name: 'range_close',\n            postprocess: (data, start) => ({ inclusive: true, location: { start } }),\n            symbols: [{ literal: ']' }],\n        },\n        {\n            name: 'range_close',\n            postprocess: (data, start) => ({ inclusive: false, location: { start } }),\n            symbols: [{ literal: '}' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: [{ literal: ':' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$1',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '=' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$1'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$2',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '>' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$2'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$3',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '<' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$3'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$4',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '>' }, { literal: '=' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$4'],\n        },\n        {\n            name: 'comparison_operator$subexpression$1$string$5',\n            postprocess: (d) => d.join(''),\n            symbols: [{ literal: ':' }, { literal: '<' }, { literal: '=' }],\n        },\n        {\n            name: 'comparison_operator$subexpression$1',\n            symbols: ['comparison_operator$subexpression$1$string$5'],\n        },\n        {\n            name: 'comparison_operator',\n            postprocess: (data, start) => ({\n                location: { end: start + data[0][0].length, start },\n                operator: data[0][0],\n                type: 'ComparisonOperator',\n            }),\n            symbols: ['comparison_operator$subexpression$1'],\n        },\n        {\n            name: 'regex',\n            postprocess: (d) => d.join(''),\n            symbols: ['regex_body', 'regex_flags'],\n        },\n        { name: 'regex_body$ebnf$1', symbols: [] },\n        {\n            name: 'regex_body$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['regex_body$ebnf$1', 'regex_body_char'],\n        },\n        {\n            name: 'regex_body',\n            postprocess: (data) => '/' + data[1].join('') + '/',\n            symbols: [{ literal: '/' }, 'regex_body$ebnf$1', { literal: '/' }],\n        },\n        { name: 'regex_body_char', postprocess: id, symbols: [/[^\\\\]/] },\n        {\n            name: 'regex_body_char',\n            postprocess: (d) => '\\\\' + d[1],\n            symbols: [{ literal: '\\\\' }, /[^\\\\]/],\n        },\n        { name: 'regex_flags', symbols: [] },\n        { name: 'regex_flags$ebnf$1', symbols: [/[dgimsuy]/] },\n        {\n            name: 'regex_flags$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['regex_flags$ebnf$1', /[dgimsuy]/],\n        },\n        {\n            name: 'regex_flags',\n            postprocess: (d) => d[0].join(''),\n            symbols: ['regex_flags$ebnf$1'],\n        },\n        { name: 'unquoted_value$ebnf$1', symbols: [] },\n        {\n            name: 'unquoted_value$ebnf$1',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['unquoted_value$ebnf$1', /[\\w#$*.?@\\u0080-\\uFFFF\\-]/],\n        },\n        {\n            name: 'unquoted_value',\n            postprocess: (d) => d[0] + d[1].join(''),\n            symbols: [/[#$*?@A-Z_a-z\\u0080-\\uFFFF]/, 'unquoted_value$ebnf$1'],\n        },\n        { name: 'unquoted_value$ebnf$2', symbols: [/\\d/] },\n        {\n            name: 'unquoted_value$ebnf$2',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['unquoted_value$ebnf$2', /\\d/],\n        },\n        { name: 'unquoted_value$ebnf$3', symbols: [] },\n        {\n            name: 'unquoted_value$ebnf$3',\n            postprocess: (d) => d[0].concat([d[1]]),\n            symbols: ['unquoted_value$ebnf$3', /[\\w#$*.?@\\u0080-\\uFFFF\\-]/],\n        },\n        {\n            name: 'unquoted_value',\n            postprocess: (d) => d[0].join('') + d[1] + d[2].join(''),\n            symbols: [\n                'unquoted_value$ebnf$2',\n                /[#$*?@A-Z_a-z\\u0080-\\uFFFF\\-]/,\n                'unquoted_value$ebnf$3',\n            ],\n        },\n    ],\n    ParserStart: 'main',\n};\nexports.default = grammar;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSafePath = void 0;\nconst SAFE_PATH_RULE = /^(\\.(?:[_a-zA-Z]\\w*|\\0|[1-9]\\d*))+$/u;\nconst isSafePath = (path) => {\n    return SAFE_PATH_RULE.test(path);\n};\nexports.isSafePath = isSafePath;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createGetValueFunctionBody = void 0;\nconst isSafePath_1 = require(\"./isSafePath\");\nconst createGetValueFunctionBody = (path) => {\n    if (!(0, isSafePath_1.isSafePath)(path)) {\n        throw new Error('Unsafe path.');\n    }\n    const body = 'return subject' + path;\n    return body.replaceAll(/(\\.(\\d+))/g, '.[$2]').replaceAll('.', '?.');\n};\nexports.createGetValueFunctionBody = createGetValueFunctionBody;\n","\"use strict\";\n/* eslint-disable no-new-func */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hydrateAst = void 0;\nconst createGetValueFunctionBody_1 = require(\"./createGetValueFunctionBody\");\nconst isSafePath_1 = require(\"./isSafePath\");\nconst hydrateAst = (subject) => {\n    const newSubject = {\n        ...subject,\n    };\n    if (subject.type === 'Tag' &&\n        subject.field.type === 'Field' &&\n        'field' in subject &&\n        (0, isSafePath_1.isSafePath)(subject.field.name)) {\n        newSubject.getValue = new Function('subject', (0, createGetValueFunctionBody_1.createGetValueFunctionBody)(subject.field.name));\n    }\n    if ('left' in subject) {\n        newSubject.left = (0, exports.hydrateAst)(subject.left);\n    }\n    if ('right' in subject) {\n        newSubject.right = (0, exports.hydrateAst)(subject.right);\n    }\n    if ('operand' in subject) {\n        newSubject.operand = (0, exports.hydrateAst)(subject.operand);\n    }\n    return newSubject;\n};\nexports.hydrateAst = hydrateAst;\n","(function(root, factory) {\n    if (typeof module === 'object' && module.exports) {\n        module.exports = factory();\n    } else {\n        root.nearley = factory();\n    }\n}(this, function() {\n\n    function Rule(name, symbols, postprocess) {\n        this.id = ++Rule.highestId;\n        this.name = name;\n        this.symbols = symbols;        // a list of literal | regex class | nonterminal\n        this.postprocess = postprocess;\n        return this;\n    }\n    Rule.highestId = 0;\n\n    Rule.prototype.toString = function(withCursorAt) {\n        var symbolSequence = (typeof withCursorAt === \"undefined\")\n                             ? this.symbols.map(getSymbolShortDisplay).join(' ')\n                             : (   this.symbols.slice(0, withCursorAt).map(getSymbolShortDisplay).join(' ')\n                                 + \" ● \"\n                                 + this.symbols.slice(withCursorAt).map(getSymbolShortDisplay).join(' ')     );\n        return this.name + \" → \" + symbolSequence;\n    }\n\n\n    // a State is a rule at a position from a given starting point in the input stream (reference)\n    function State(rule, dot, reference, wantedBy) {\n        this.rule = rule;\n        this.dot = dot;\n        this.reference = reference;\n        this.data = [];\n        this.wantedBy = wantedBy;\n        this.isComplete = this.dot === rule.symbols.length;\n    }\n\n    State.prototype.toString = function() {\n        return \"{\" + this.rule.toString(this.dot) + \"}, from: \" + (this.reference || 0);\n    };\n\n    State.prototype.nextState = function(child) {\n        var state = new State(this.rule, this.dot + 1, this.reference, this.wantedBy);\n        state.left = this;\n        state.right = child;\n        if (state.isComplete) {\n            state.data = state.build();\n            // Having right set here will prevent the right state and its children\n            // form being garbage collected\n            state.right = undefined;\n        }\n        return state;\n    };\n\n    State.prototype.build = function() {\n        var children = [];\n        var node = this;\n        do {\n            children.push(node.right.data);\n            node = node.left;\n        } while (node.left);\n        children.reverse();\n        return children;\n    };\n\n    State.prototype.finish = function() {\n        if (this.rule.postprocess) {\n            this.data = this.rule.postprocess(this.data, this.reference, Parser.fail);\n        }\n    };\n\n\n    function Column(grammar, index) {\n        this.grammar = grammar;\n        this.index = index;\n        this.states = [];\n        this.wants = {}; // states indexed by the non-terminal they expect\n        this.scannable = []; // list of states that expect a token\n        this.completed = {}; // states that are nullable\n    }\n\n\n    Column.prototype.process = function(nextColumn) {\n        var states = this.states;\n        var wants = this.wants;\n        var completed = this.completed;\n\n        for (var w = 0; w < states.length; w++) { // nb. we push() during iteration\n            var state = states[w];\n\n            if (state.isComplete) {\n                state.finish();\n                if (state.data !== Parser.fail) {\n                    // complete\n                    var wantedBy = state.wantedBy;\n                    for (var i = wantedBy.length; i--; ) { // this line is hot\n                        var left = wantedBy[i];\n                        this.complete(left, state);\n                    }\n\n                    // special-case nullables\n                    if (state.reference === this.index) {\n                        // make sure future predictors of this rule get completed.\n                        var exp = state.rule.name;\n                        (this.completed[exp] = this.completed[exp] || []).push(state);\n                    }\n                }\n\n            } else {\n                // queue scannable states\n                var exp = state.rule.symbols[state.dot];\n                if (typeof exp !== 'string') {\n                    this.scannable.push(state);\n                    continue;\n                }\n\n                // predict\n                if (wants[exp]) {\n                    wants[exp].push(state);\n\n                    if (completed.hasOwnProperty(exp)) {\n                        var nulls = completed[exp];\n                        for (var i = 0; i < nulls.length; i++) {\n                            var right = nulls[i];\n                            this.complete(state, right);\n                        }\n                    }\n                } else {\n                    wants[exp] = [state];\n                    this.predict(exp);\n                }\n            }\n        }\n    }\n\n    Column.prototype.predict = function(exp) {\n        var rules = this.grammar.byName[exp] || [];\n\n        for (var i = 0; i < rules.length; i++) {\n            var r = rules[i];\n            var wantedBy = this.wants[exp];\n            var s = new State(r, 0, this.index, wantedBy);\n            this.states.push(s);\n        }\n    }\n\n    Column.prototype.complete = function(left, right) {\n        var copy = left.nextState(right);\n        this.states.push(copy);\n    }\n\n\n    function Grammar(rules, start) {\n        this.rules = rules;\n        this.start = start || this.rules[0].name;\n        var byName = this.byName = {};\n        this.rules.forEach(function(rule) {\n            if (!byName.hasOwnProperty(rule.name)) {\n                byName[rule.name] = [];\n            }\n            byName[rule.name].push(rule);\n        });\n    }\n\n    // So we can allow passing (rules, start) directly to Parser for backwards compatibility\n    Grammar.fromCompiled = function(rules, start) {\n        var lexer = rules.Lexer;\n        if (rules.ParserStart) {\n          start = rules.ParserStart;\n          rules = rules.ParserRules;\n        }\n        var rules = rules.map(function (r) { return (new Rule(r.name, r.symbols, r.postprocess)); });\n        var g = new Grammar(rules, start);\n        g.lexer = lexer; // nb. storing lexer on Grammar is iffy, but unavoidable\n        return g;\n    }\n\n\n    function StreamLexer() {\n      this.reset(\"\");\n    }\n\n    StreamLexer.prototype.reset = function(data, state) {\n        this.buffer = data;\n        this.index = 0;\n        this.line = state ? state.line : 1;\n        this.lastLineBreak = state ? -state.col : 0;\n    }\n\n    StreamLexer.prototype.next = function() {\n        if (this.index < this.buffer.length) {\n            var ch = this.buffer[this.index++];\n            if (ch === '\\n') {\n              this.line += 1;\n              this.lastLineBreak = this.index;\n            }\n            return {value: ch};\n        }\n    }\n\n    StreamLexer.prototype.save = function() {\n      return {\n        line: this.line,\n        col: this.index - this.lastLineBreak,\n      }\n    }\n\n    StreamLexer.prototype.formatError = function(token, message) {\n        // nb. this gets called after consuming the offending token,\n        // so the culprit is index-1\n        var buffer = this.buffer;\n        if (typeof buffer === 'string') {\n            var lines = buffer\n                .split(\"\\n\")\n                .slice(\n                    Math.max(0, this.line - 5), \n                    this.line\n                );\n\n            var nextLineBreak = buffer.indexOf('\\n', this.index);\n            if (nextLineBreak === -1) nextLineBreak = buffer.length;\n            var col = this.index - this.lastLineBreak;\n            var lastLineDigits = String(this.line).length;\n            message += \" at line \" + this.line + \" col \" + col + \":\\n\\n\";\n            message += lines\n                .map(function(line, i) {\n                    return pad(this.line - lines.length + i + 1, lastLineDigits) + \" \" + line;\n                }, this)\n                .join(\"\\n\");\n            message += \"\\n\" + pad(\"\", lastLineDigits + col) + \"^\\n\";\n            return message;\n        } else {\n            return message + \" at index \" + (this.index - 1);\n        }\n\n        function pad(n, length) {\n            var s = String(n);\n            return Array(length - s.length + 1).join(\" \") + s;\n        }\n    }\n\n    function Parser(rules, start, options) {\n        if (rules instanceof Grammar) {\n            var grammar = rules;\n            var options = start;\n        } else {\n            var grammar = Grammar.fromCompiled(rules, start);\n        }\n        this.grammar = grammar;\n\n        // Read options\n        this.options = {\n            keepHistory: false,\n            lexer: grammar.lexer || new StreamLexer,\n        };\n        for (var key in (options || {})) {\n            this.options[key] = options[key];\n        }\n\n        // Setup lexer\n        this.lexer = this.options.lexer;\n        this.lexerState = undefined;\n\n        // Setup a table\n        var column = new Column(grammar, 0);\n        var table = this.table = [column];\n\n        // I could be expecting anything.\n        column.wants[grammar.start] = [];\n        column.predict(grammar.start);\n        // TODO what if start rule is nullable?\n        column.process();\n        this.current = 0; // token index\n    }\n\n    // create a reserved token for indicating a parse fail\n    Parser.fail = {};\n\n    Parser.prototype.feed = function(chunk) {\n        var lexer = this.lexer;\n        lexer.reset(chunk, this.lexerState);\n\n        var token;\n        while (true) {\n            try {\n                token = lexer.next();\n                if (!token) {\n                    break;\n                }\n            } catch (e) {\n                // Create the next column so that the error reporter\n                // can display the correctly predicted states.\n                var nextColumn = new Column(this.grammar, this.current + 1);\n                this.table.push(nextColumn);\n                var err = new Error(this.reportLexerError(e));\n                err.offset = this.current;\n                err.token = e.token;\n                throw err;\n            }\n            // We add new states to table[current+1]\n            var column = this.table[this.current];\n\n            // GC unused states\n            if (!this.options.keepHistory) {\n                delete this.table[this.current - 1];\n            }\n\n            var n = this.current + 1;\n            var nextColumn = new Column(this.grammar, n);\n            this.table.push(nextColumn);\n\n            // Advance all tokens that expect the symbol\n            var literal = token.text !== undefined ? token.text : token.value;\n            var value = lexer.constructor === StreamLexer ? token.value : token;\n            var scannable = column.scannable;\n            for (var w = scannable.length; w--; ) {\n                var state = scannable[w];\n                var expect = state.rule.symbols[state.dot];\n                // Try to consume the token\n                // either regex or literal\n                if (expect.test ? expect.test(value) :\n                    expect.type ? expect.type === token.type\n                                : expect.literal === literal) {\n                    // Add it\n                    var next = state.nextState({data: value, token: token, isToken: true, reference: n - 1});\n                    nextColumn.states.push(next);\n                }\n            }\n\n            // Next, for each of the rules, we either\n            // (a) complete it, and try to see if the reference row expected that\n            //     rule\n            // (b) predict the next nonterminal it expects by adding that\n            //     nonterminal's start state\n            // To prevent duplication, we also keep track of rules we have already\n            // added\n\n            nextColumn.process();\n\n            // If needed, throw an error:\n            if (nextColumn.states.length === 0) {\n                // No states at all! This is not good.\n                var err = new Error(this.reportError(token));\n                err.offset = this.current;\n                err.token = token;\n                throw err;\n            }\n\n            // maybe save lexer state\n            if (this.options.keepHistory) {\n              column.lexerState = lexer.save()\n            }\n\n            this.current++;\n        }\n        if (column) {\n          this.lexerState = lexer.save()\n        }\n\n        // Incrementally keep track of results\n        this.results = this.finish();\n\n        // Allow chaining, for whatever it's worth\n        return this;\n    };\n\n    Parser.prototype.reportLexerError = function(lexerError) {\n        var tokenDisplay, lexerMessage;\n        // Planning to add a token property to moo's thrown error\n        // even on erroring tokens to be used in error display below\n        var token = lexerError.token;\n        if (token) {\n            tokenDisplay = \"input \" + JSON.stringify(token.text[0]) + \" (lexer error)\";\n            lexerMessage = this.lexer.formatError(token, \"Syntax error\");\n        } else {\n            tokenDisplay = \"input (lexer error)\";\n            lexerMessage = lexerError.message;\n        }\n        return this.reportErrorCommon(lexerMessage, tokenDisplay);\n    };\n\n    Parser.prototype.reportError = function(token) {\n        var tokenDisplay = (token.type ? token.type + \" token: \" : \"\") + JSON.stringify(token.value !== undefined ? token.value : token);\n        var lexerMessage = this.lexer.formatError(token, \"Syntax error\");\n        return this.reportErrorCommon(lexerMessage, tokenDisplay);\n    };\n\n    Parser.prototype.reportErrorCommon = function(lexerMessage, tokenDisplay) {\n        var lines = [];\n        lines.push(lexerMessage);\n        var lastColumnIndex = this.table.length - 2;\n        var lastColumn = this.table[lastColumnIndex];\n        var expectantStates = lastColumn.states\n            .filter(function(state) {\n                var nextSymbol = state.rule.symbols[state.dot];\n                return nextSymbol && typeof nextSymbol !== \"string\";\n            });\n\n        if (expectantStates.length === 0) {\n            lines.push('Unexpected ' + tokenDisplay + '. I did not expect any more input. Here is the state of my parse table:\\n');\n            this.displayStateStack(lastColumn.states, lines);\n        } else {\n            lines.push('Unexpected ' + tokenDisplay + '. Instead, I was expecting to see one of the following:\\n');\n            // Display a \"state stack\" for each expectant state\n            // - which shows you how this state came to be, step by step.\n            // If there is more than one derivation, we only display the first one.\n            var stateStacks = expectantStates\n                .map(function(state) {\n                    return this.buildFirstStateStack(state, []) || [state];\n                }, this);\n            // Display each state that is expecting a terminal symbol next.\n            stateStacks.forEach(function(stateStack) {\n                var state = stateStack[0];\n                var nextSymbol = state.rule.symbols[state.dot];\n                var symbolDisplay = this.getSymbolDisplay(nextSymbol);\n                lines.push('A ' + symbolDisplay + ' based on:');\n                this.displayStateStack(stateStack, lines);\n            }, this);\n        }\n        lines.push(\"\");\n        return lines.join(\"\\n\");\n    }\n    \n    Parser.prototype.displayStateStack = function(stateStack, lines) {\n        var lastDisplay;\n        var sameDisplayCount = 0;\n        for (var j = 0; j < stateStack.length; j++) {\n            var state = stateStack[j];\n            var display = state.rule.toString(state.dot);\n            if (display === lastDisplay) {\n                sameDisplayCount++;\n            } else {\n                if (sameDisplayCount > 0) {\n                    lines.push('    ^ ' + sameDisplayCount + ' more lines identical to this');\n                }\n                sameDisplayCount = 0;\n                lines.push('    ' + display);\n            }\n            lastDisplay = display;\n        }\n    };\n\n    Parser.prototype.getSymbolDisplay = function(symbol) {\n        return getSymbolLongDisplay(symbol);\n    };\n\n    /*\n    Builds a the first state stack. You can think of a state stack as the call stack\n    of the recursive-descent parser which the Nearley parse algorithm simulates.\n    A state stack is represented as an array of state objects. Within a\n    state stack, the first item of the array will be the starting\n    state, with each successive item in the array going further back into history.\n\n    This function needs to be given a starting state and an empty array representing\n    the visited states, and it returns an single state stack.\n\n    */\n    Parser.prototype.buildFirstStateStack = function(state, visited) {\n        if (visited.indexOf(state) !== -1) {\n            // Found cycle, return null\n            // to eliminate this path from the results, because\n            // we don't know how to display it meaningfully\n            return null;\n        }\n        if (state.wantedBy.length === 0) {\n            return [state];\n        }\n        var prevState = state.wantedBy[0];\n        var childVisited = [state].concat(visited);\n        var childResult = this.buildFirstStateStack(prevState, childVisited);\n        if (childResult === null) {\n            return null;\n        }\n        return [state].concat(childResult);\n    };\n\n    Parser.prototype.save = function() {\n        var column = this.table[this.current];\n        column.lexerState = this.lexerState;\n        return column;\n    };\n\n    Parser.prototype.restore = function(column) {\n        var index = column.index;\n        this.current = index;\n        this.table[index] = column;\n        this.table.splice(index + 1);\n        this.lexerState = column.lexerState;\n\n        // Incrementally keep track of results\n        this.results = this.finish();\n    };\n\n    // nb. deprecated: use save/restore instead!\n    Parser.prototype.rewind = function(index) {\n        if (!this.options.keepHistory) {\n            throw new Error('set option `keepHistory` to enable rewinding')\n        }\n        // nb. recall column (table) indicies fall between token indicies.\n        //        col 0   --   token 0   --   col 1\n        this.restore(this.table[index]);\n    };\n\n    Parser.prototype.finish = function() {\n        // Return the possible parsings\n        var considerations = [];\n        var start = this.grammar.start;\n        var column = this.table[this.table.length - 1]\n        column.states.forEach(function (t) {\n            if (t.rule.name === start\n                    && t.dot === t.rule.symbols.length\n                    && t.reference === 0\n                    && t.data !== Parser.fail) {\n                considerations.push(t);\n            }\n        });\n        return considerations.map(function(c) {return c.data; });\n    };\n\n    function getSymbolLongDisplay(symbol) {\n        var type = typeof symbol;\n        if (type === \"string\") {\n            return symbol;\n        } else if (type === \"object\") {\n            if (symbol.literal) {\n                return JSON.stringify(symbol.literal);\n            } else if (symbol instanceof RegExp) {\n                return 'character matching ' + symbol;\n            } else if (symbol.type) {\n                return symbol.type + ' token';\n            } else if (symbol.test) {\n                return 'token matching ' + String(symbol.test);\n            } else {\n                throw new Error('Unknown symbol type: ' + symbol);\n            }\n        }\n    }\n\n    function getSymbolShortDisplay(symbol) {\n        var type = typeof symbol;\n        if (type === \"string\") {\n            return symbol;\n        } else if (type === \"object\") {\n            if (symbol.literal) {\n                return JSON.stringify(symbol.literal);\n            } else if (symbol instanceof RegExp) {\n                return symbol.toString();\n            } else if (symbol.type) {\n                return '%' + symbol.type;\n            } else if (symbol.test) {\n                return '<' + String(symbol.test) + '>';\n            } else {\n                throw new Error('Unknown symbol type: ' + symbol);\n            }\n        }\n    }\n\n    return {\n        Parser: Parser,\n        Grammar: Grammar,\n        Rule: Rule,\n    };\n\n}));\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parse = void 0;\nconst errors_1 = require(\"./errors\");\nconst grammar_1 = __importDefault(require(\"./grammar\"));\nconst hydrateAst_1 = require(\"./hydrateAst\");\nconst nearley_1 = __importDefault(require(\"nearley\"));\nconst rules = nearley_1.default.Grammar.fromCompiled(grammar_1.default);\nconst MESSAGE_RULE = /Syntax error at line (?<line>\\d+) col (?<column>\\d+)/;\nconst parse = (query) => {\n    if (query.trim() === '') {\n        return {\n            location: {\n                end: 0,\n                start: 0,\n            },\n            type: 'EmptyExpression',\n        };\n    }\n    const parser = new nearley_1.default.Parser(rules);\n    let results;\n    try {\n        results = parser.feed(query).results;\n    }\n    catch (error) {\n        if (typeof (error === null || error === void 0 ? void 0 : error.message) === 'string' &&\n            typeof (error === null || error === void 0 ? void 0 : error.offset) === 'number') {\n            const match = error.message.match(MESSAGE_RULE);\n            if (!match) {\n                throw error;\n            }\n            throw new errors_1.SyntaxError(`Syntax error at line ${match.groups.line} column ${match.groups.column}`, error.offset, Number(match.groups.line), Number(match.groups.column));\n        }\n        throw error;\n    }\n    if (results.length === 0) {\n        throw new Error('Found no parsings.');\n    }\n    if (results.length > 1) {\n        const firstResult = JSON.stringify(results[0]);\n        for (const result of results) {\n            // Only throw if the results are different.\n            if (JSON.stringify(result) !== firstResult) {\n                throw new errors_1.LiqeError('Ambiguous results.');\n            }\n        }\n    }\n    const hydratedAst = (0, hydrateAst_1.hydrateAst)(results[0]);\n    return hydratedAst;\n};\nexports.parse = parse;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.serialize = void 0;\nconst quote = (value, quotes) => {\n    if (quotes === 'double') {\n        return `\"${value}\"`;\n    }\n    if (quotes === 'single') {\n        return `'${value}'`;\n    }\n    return value;\n};\nconst serializeExpression = (expression) => {\n    if (expression.type === 'LiteralExpression') {\n        if (expression.quoted && typeof expression.value === 'string') {\n            return quote(expression.value, expression.quotes);\n        }\n        return String(expression.value);\n    }\n    if (expression.type === 'RegexExpression') {\n        return String(expression.value);\n    }\n    if (expression.type === 'RangeExpression') {\n        const { max, maxInclusive, min, minInclusive } = expression.range;\n        return `${minInclusive ? '[' : '{'}${min} TO ${max}${maxInclusive ? ']' : '}'}`;\n    }\n    if (expression.type === 'EmptyExpression') {\n        return '';\n    }\n    throw new Error('Unexpected AST type.');\n};\nconst serializeTag = (ast) => {\n    if (ast.type !== 'Tag') {\n        throw new Error('Expected a tag expression.');\n    }\n    const { expression, field, operator } = ast;\n    if (field.type === 'ImplicitField') {\n        return serializeExpression(expression);\n    }\n    const left = field.quoted ? quote(field.name, field.quotes) : field.name;\n    const patEnd = ' '.repeat(expression.location.start - operator.location.end);\n    return left + operator.operator + patEnd + serializeExpression(expression);\n};\nconst serialize = (ast) => {\n    if (ast.type === 'ParenthesizedExpression') {\n        if (!('location' in ast.expression)) {\n            throw new Error('Expected location in expression.');\n        }\n        if (!ast.location.end) {\n            throw new Error('Expected location end.');\n        }\n        const patStart = ' '.repeat(ast.expression.location.start - (ast.location.start + 1));\n        const patEnd = ' '.repeat(ast.location.end - ast.expression.location.end - 1);\n        return `(${patStart}${(0, exports.serialize)(ast.expression)}${patEnd})`;\n    }\n    if (ast.type === 'Tag') {\n        return serializeTag(ast);\n    }\n    if (ast.type === 'LogicalExpression') {\n        let operator = '';\n        if (ast.operator.type === 'BooleanOperator') {\n            operator += ' '.repeat(ast.operator.location.start - ast.left.location.end);\n            operator += ast.operator.operator;\n            operator += ' '.repeat(ast.right.location.start - ast.operator.location.end);\n        }\n        else {\n            operator = ' '.repeat(ast.right.location.start - ast.left.location.end);\n        }\n        return `${(0, exports.serialize)(ast.left)}${operator}${(0, exports.serialize)(ast.right)}`;\n    }\n    if (ast.type === 'UnaryOperator') {\n        return ((ast.operator === 'NOT' ? 'NOT ' : ast.operator) + (0, exports.serialize)(ast.operand));\n    }\n    if (ast.type === 'EmptyExpression') {\n        return '';\n    }\n    throw new Error('Unexpected AST type.');\n};\nexports.serialize = serialize;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.test = void 0;\nconst filter_1 = require(\"./filter\");\nconst test = (ast, subject) => {\n    return (0, filter_1.filter)(ast, [subject]).length === 1;\n};\nexports.test = test;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.test = exports.serialize = exports.parse = exports.isSafeUnquotedExpression = exports.highlight = exports.filter = exports.SyntaxError = exports.LiqeError = void 0;\nvar errors_1 = require(\"./errors\");\nObject.defineProperty(exports, \"LiqeError\", { enumerable: true, get: function () { return errors_1.LiqeError; } });\nObject.defineProperty(exports, \"SyntaxError\", { enumerable: true, get: function () { return errors_1.SyntaxError; } });\nvar filter_1 = require(\"./filter\");\nObject.defineProperty(exports, \"filter\", { enumerable: true, get: function () { return filter_1.filter; } });\nvar highlight_1 = require(\"./highlight\");\nObject.defineProperty(exports, \"highlight\", { enumerable: true, get: function () { return highlight_1.highlight; } });\nvar isSafeUnquotedExpression_1 = require(\"./isSafeUnquotedExpression\");\nObject.defineProperty(exports, \"isSafeUnquotedExpression\", { enumerable: true, get: function () { return isSafeUnquotedExpression_1.isSafeUnquotedExpression; } });\nvar parse_1 = require(\"./parse\");\nObject.defineProperty(exports, \"parse\", { enumerable: true, get: function () { return parse_1.parse; } });\nvar serialize_1 = require(\"./serialize\");\nObject.defineProperty(exports, \"serialize\", { enumerable: true, get: function () { return serialize_1.serialize; } });\nvar test_1 = require(\"./test\");\nObject.defineProperty(exports, \"test\", { enumerable: true, get: function () { return test_1.test; } });\n","import { parse, SyntaxError } from 'liqe'\nimport {\n  E_LUCENE_SYNTAX_EXCEPTION,\n  E_LUCENE_UNEXPECTED_EXCEPTION,\n  E_LUCENE_INVALID_TYPE,\n  E_LUCENE_REGEX_NOT_SUPPORTED,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { QueryClientContract } from '@adonisjs/lucid/types/database'\nimport type { LucidModel, ModelKeysContract } from '@adonisjs/lucid/types/model'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\nimport type {\n  LiqeQuery,\n  ComparisonOperatorToken,\n  EmptyExpression,\n  FieldToken,\n  ImplicitFieldToken,\n  LiteralExpressionToken,\n  LogicalExpressionToken,\n  RangeExpressionToken,\n  RegexExpressionToken,\n  TagToken,\n  UnaryOperatorToken,\n  ParenthesizedExpressionToken,\n  ExpressionToken,\n  ParserAst,\n} from 'liqe'\n\n/**\n * Database query builder contract extended for Lucene filtering capabilities.\n *\n * @template Result - The result type for the query builder\n */\nexport interface LuceneFilteredDatabaseQueryBuilderContract extends DatabaseQueryBuilderContract {}\n\nexport class LuceneLucidQueryBuilder {\n  readonly #attributesToColumns: ModelKeysContract\n  readonly #allowedColumns?: string[] | undefined\n  readonly #connection: QueryClientContract\n  readonly #dialect: string\n  // @ts-ignore - not used yet\n  readonly #primaryKey: string\n  // @ts-ignore - not used yet\n  readonly #tableName: string\n  // @ts-ignore - not used yet\n  readonly #model?: LucidModel | undefined\n\n  constructor(\n    connection: QueryClientContract,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    attributesToColumns: ModelKeysContract,\n    primaryKey: string,\n    tableName: string,\n    allowedColumns?: string[] | undefined,\n    model?: LucidModel | undefined\n  ) {\n    this.#attributesToColumns = attributesToColumns\n    this.#primaryKey = primaryKey\n    this.#tableName = tableName\n    this.#allowedColumns = allowedColumns\n    this.#model = model\n    this.#connection = connection\n    this.#dialect = query.client.dialect.name\n  }\n\n  applyLuceneAst(\n    ast: ParserAst,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    throwOnInvalidType: boolean = false\n  ) {\n    switch (ast.type) {\n      case 'EmptyExpression':\n        this.applyLuceneEmptyExpressionAst(ast, query)\n        break\n\n      case 'LogicalExpression':\n        this.applyLuceneLogicalExpressionAst(ast, query)\n        break\n\n      case 'ParenthesizedExpression':\n        this.applyLuceneParenthesizedExpressionAst(ast, query)\n        break\n\n      case 'UnaryOperator':\n        this.applyLuceneUnaryOperatorAst(ast, query)\n        break\n\n      case 'Tag':\n        this.applyLuceneTagAst(ast, query)\n        break\n\n      default:\n        if (throwOnInvalidType) {\n          throw new E_LUCENE_INVALID_TYPE((ast as any).type)\n        }\n        break\n    }\n  }\n\n  applyLuceneEmptyExpressionAst(\n    _ast: EmptyExpression,\n    _query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    // No operation for empty expressions\n  }\n\n  applyLuceneLogicalExpressionAst(\n    ast: LogicalExpressionToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const operatorType = ast.operator.operator\n    query.where((subQuery) => {\n      if (operatorType === 'AND') {\n        this.applyLuceneAst(ast.left, subQuery)\n        this.applyLuceneAst(ast.right, subQuery)\n      } else {\n        subQuery.orWhere((orSubQuery) => {\n          this.applyLuceneAst(ast.left, orSubQuery)\n        })\n        subQuery.orWhere((orSubQuery) => {\n          this.applyLuceneAst(ast.right, orSubQuery)\n        })\n      }\n    })\n  }\n\n  applyLuceneParenthesizedExpressionAst(\n    ast: ParenthesizedExpressionToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    query.where((subQuery) => {\n      this.applyLuceneAst(ast.expression, subQuery)\n    })\n  }\n\n  applyLuceneUnaryOperatorAst(\n    ast: UnaryOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const operator = ast.operator\n    if (operator === 'NOT' || operator === '-') {\n      query.whereNot((subQuery) => {\n        this.applyLuceneAst(ast.operand, subQuery)\n      })\n    } else {\n      query.where((subQuery) => {\n        this.applyLuceneAst(ast.operand, subQuery)\n      })\n    }\n  }\n\n  applyLuceneTagAst(ast: TagToken, query: LuceneFilteredDatabaseQueryBuilderContract) {\n    const { expression, field, operator } = ast\n    switch (field.type) {\n      case 'ImplicitField':\n        this.applyLuceneImplicitFieldAst(field, expression, operator, query)\n        break\n\n      case 'Field':\n        this.applyLuceneFieldAst(field, expression, operator, query)\n        break\n    }\n  }\n\n  #getSearchableColumns() {\n    if (\n      this.#model &&\n      '$resourcefulColumns' in this.#model &&\n      this.#model.$resourcefulColumns instanceof Map\n    ) {\n      const modelFields: string[] = []\n      this.#model.$resourcefulColumns.forEach((_c, k) => {\n        modelFields.push(k as string)\n      })\n      if (\n        '$resourcefulRelationships' in this.#model &&\n        this.#model.$resourcefulRelationships instanceof Map\n      ) {\n        this.#model.$resourcefulRelationships.forEach((_r, k) => {\n          modelFields.push(k)\n        })\n      }\n      return Array.from(new Set(modelFields)).filter(\n        (f) => !this.#allowedColumns || this.#allowedColumns.includes(f)\n      )\n    }\n    return Object.entries(this.#attributesToColumns.all())\n      .filter(([attr]) => !this.#allowedColumns || this.#allowedColumns.includes(attr))\n      .map(([, column]) => column)\n  }\n\n  applyLuceneImplicitFieldAst(\n    _field: ImplicitFieldToken,\n    expression: ExpressionToken,\n    operator: ComparisonOperatorToken | undefined,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const searchableColumns = this.#getSearchableColumns()\n    const defaultOperator: ComparisonOperatorToken = operator || {\n      operator: ':',\n      type: 'ComparisonOperator',\n      location: { start: 0, end: 0 },\n    }\n    searchableColumns.forEach((columnName) => {\n      const fakeField: FieldToken = {\n        name: columnName,\n        type: 'Field',\n        location: { start: 0, end: 0 },\n        quoted: false,\n      }\n      query.orWhere((s) => {\n        this.applyLuceneFieldAst(fakeField, expression, defaultOperator, s, undefined, true)\n      })\n    })\n  }\n\n  applyLuceneFieldAst(\n    field: FieldToken,\n    expression: ExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    forModel?: LucidModel | undefined,\n    isImplicit: boolean = false\n  ) {\n    const columnName = !forModel\n      ? this.#attributesToColumns.get(field.name)\n      : forModel.$keys.attributesToColumns.get(field.name)\n    if (\n      !columnName ||\n      (!forModel && this.#allowedColumns && !this.#allowedColumns.includes(field.name))\n    ) {\n      if (field.name.includes('.')) {\n        const parts = field.name\n          .split('.')\n          .filter((p) => 'string' === typeof p && p.trim().length > 0)\n          .map((p) => p.trim())\n        const relationship = parts.shift()\n        if (!relationship || parts.length === 0) return\n        this.applyLuceneRelatedFieldAst(\n          relationship,\n          parts.join('.'),\n          expression,\n          operator,\n          query,\n          forModel\n        )\n      }\n      return\n    }\n    switch (expression.type) {\n      case 'EmptyExpression':\n        this.applyLuceneEmptyExpression(columnName, expression, operator, query)\n        break\n      case 'LiteralExpression':\n        this.applyLuceneLiteralExpression(columnName, expression, operator, query, isImplicit)\n        break\n      case 'RangeExpression':\n        this.applyLuceneRangeExpression(columnName, expression, operator, query)\n        break\n      case 'RegexExpression':\n        this.applyLuceneRegexExpression(columnName, expression, operator, query)\n        break\n    }\n  }\n\n  applyLuceneRelatedFieldAst(\n    relationship: string,\n    relatedProperty: string,\n    expression: ExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    forModel?: LucidModel | undefined\n  ) {\n    if (!forModel && !this.#model) return\n    const targetModel = forModel! || this.#model!\n    const lucidRelationshipDefinition = targetModel.$relationsDefinitions.get(relationship)\n    if (!lucidRelationshipDefinition) return\n    lucidRelationshipDefinition.boot()\n    const sub = lucidRelationshipDefinition.subQuery(this.#connection)\n    const relatedField: FieldToken = {\n      name: relatedProperty,\n      type: 'Field',\n      location: { start: 0, end: 0 },\n      quoted: false,\n    }\n    const relatedModel = lucidRelationshipDefinition.relatedModel()\n    this.applyLuceneFieldAst(relatedField, expression, operator, sub as any, relatedModel)\n    query.whereExists(sub.prepare())\n  }\n\n  applyLuceneEmptyExpression(\n    column: string,\n    _expression: EmptyExpression,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    switch (operator.operator) {\n      case ':':\n      case ':=':\n      case ':<=':\n      case ':>=':\n        query.where((sub) => {\n          sub.whereNull(column)\n          sub.orWhere(column, '=', '')\n        })\n        break\n    }\n  }\n\n  applyLuceneLiteralExpression(\n    column: string,\n    expression: LiteralExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract,\n    isImplicit = false\n  ) {\n    let value = expression.value\n    let isCaseSensitive = false\n    if (value === null) {\n      /*\n    |--------------------------------------------------------------------------\n    | Treat null values as empty strings or zero depending on the operator\n    |--------------------------------------------------------------------------\n    */\n      switch (operator.operator) {\n        case ':':\n        case ':=':\n          query.if(\n            ['postgres', 'pg'].includes(this.#dialect),\n            (q) => {\n              q.where((sub) => {\n                sub.whereNull(column)\n\n                // Numeric branch: compare text rep to '0'\n                sub.orWhereRaw(\n                  'pg_typeof(??) IN (' +\n                    \"'smallint'::regtype,'integer'::regtype,'bigint'::regtype,\" +\n                    \"'numeric'::regtype,'real'::regtype,'double precision'::regtype\" +\n                    \") AND COALESCE(??::text,'') = '0'\",\n                  [column, column]\n                )\n\n                // Non-numeric branch: empty string after cast\n                sub.orWhereRaw(\n                  'pg_typeof(??) NOT IN (' +\n                    \"'smallint'::regtype,'integer'::regtype,'bigint'::regtype,\" +\n                    \"'numeric'::regtype,'real'::regtype,'double precision'::regtype\" +\n                    \") AND COALESCE(??::text,'') = ''\",\n                  [column, column]\n                )\n              })\n            },\n            () => {\n              query.if(\n                ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                (q2) => {\n                  q2.where((sub) => {\n                    sub.whereNull(column)\n                    sub.orWhere(column, '=', '')\n                    /*\n                     |--------------------------------------------------------------------------\n                     | MySQL: Only match 0 if the column value is actually numeric\n                     | Check that the value equals 0 AND its string representation equals '0'\n                     | This prevents non-numeric strings from matching via type coercion\n                     |--------------------------------------------------------------------------\n                     */\n                    sub.orWhereRaw('(?? = 0 AND CAST(?? AS CHAR) = ?)', [column, column, '0'])\n                  })\n                },\n                (q2) => {\n                  q2.where((sub) => {\n                    sub.whereNull(column)\n                    sub.orWhere(column, '=', '')\n                    sub.orWhere(column, '=', 0)\n                  })\n                }\n              )\n            }\n          )\n          break\n        case ':<':\n          query.where(column, '<', 0)\n          break\n        case ':<=':\n          query.where(column, '<=', 0)\n          break\n        case ':>':\n          query.where(column, '>', 0)\n          break\n        case ':>=':\n          query.where(column, '>=', 0)\n          break\n      }\n      return\n    }\n    if ('string' === typeof value && expression.quoted) {\n      isCaseSensitive = true\n      /*\n      |--------------------------------------------------------------------------\n      | Strip quotes from the value because they are not needed\n      |--------------------------------------------------------------------------\n      */\n      if (expression.quotes === 'double') {\n        value = value.replace(/^\"/g, '').replace(/\"$/g, '')\n      } else if (expression.quotes === 'single') {\n        value = value.replace(/^'/g, '').replace(/'$/g, '')\n      }\n    } else if (\n      /*\n      |--------------------------------------------------------------------------\n      | Special case for handling unquoted string literals with : or := operators\n      | to perform a contains search by wrapping the value with wildcards (*)\n      |--------------------------------------------------------------------------\n      */\n      isImplicit &&\n      'string' === typeof value &&\n      !expression.quoted &&\n      [':', ':='].includes(operator.operator)\n    ) {\n      value = `*${value}*`\n    }\n    switch (typeof value) {\n      case 'string':\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            // Check if the value contains wildcards\n            if (value.includes('*') || value.includes('?')) {\n              // Escape any instances of `%` and `_` in the literal value\n              let likeValue = value.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_')\n              // Convert Lucene wildcards (*) to SQL wildcards (%) and (?) to (_)\n              likeValue = likeValue.replace(/\\*/g, '%').replace(/\\?/g, '_')\n              if (isCaseSensitive) {\n                query.if(\n                  ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                  (q) => {\n                    /*\n                     |--------------------------------------------------------------------------\n                     | MySQL: Use whereRaw to bypass Knex's broken utf8_bin collation\n                     | LIKE is already case-sensitive in MySQL by default\n                     |--------------------------------------------------------------------------\n                     */\n                    q.whereRaw('?? LIKE ?', [column, likeValue])\n                  },\n                  (q) => {\n                    q.whereLike(column, likeValue)\n                  }\n                )\n              } else {\n                query.if(\n                  ['postgres', 'pg'].includes(this.#dialect),\n                  (q) => {\n                    // q.whereILike(column, likeValue)\n                    /*\n                     |--------------------------------------------------------------------------\n                     | Fix to cast column to text to avoid issues with non-text columns\n                     | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                     |--------------------------------------------------------------------------\n                     */\n                    q.whereRaw(\"COALESCE(??::text, '') ILIKE ?\", [column, likeValue])\n                  },\n                  () => {\n                    query.if(\n                      ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                      (q2) => {\n                        /*\n                         |--------------------------------------------------------------------------\n                         | MySQL: Use LOWER() for case-insensitive comparison\n                         |--------------------------------------------------------------------------\n                         */\n                        q2.whereRaw('LOWER(??) LIKE LOWER(?)', [column, likeValue])\n                      },\n                      (q2) => {\n                        q2.whereLike(column, likeValue)\n                      }\n                    )\n                  }\n                )\n                query\n              }\n            } else {\n              query.where((sub) => {\n                if (isCaseSensitive) {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') = ?\", [column, value])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | Cast all columns to text for comparison\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.whereRaw('CAST(?? AS CHAR) = ?', [column, value])\n                        },\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | For exact matches (no wildcards), use = operator\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.where(column, '=', value)\n                        }\n                      )\n                    }\n                  )\n                } else {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') ILIKE ?\", [column, value])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                           |--------------------------------------------------------------------------\n                           | MySQL: Use LOWER() for case-insensitive comparison\n                           |--------------------------------------------------------------------------\n                           */\n                          sub.whereRaw('LOWER(??) LIKE LOWER(?)', [column, value])\n                        },\n                        () => {\n                          sub.whereLike(column, value)\n                        }\n                      )\n                    }\n                  )\n                }\n              })\n            }\n            break\n          case ':<':\n            query.where(column, '<', value)\n            break\n          case ':<=':\n            query.where(column, '<=', value)\n            break\n          case ':>':\n            query.where(column, '>', value)\n            break\n          case ':>=':\n            query.where(column, '>=', value)\n            break\n        }\n        break\n      case 'number':\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            if (isImplicit) {\n              query.where((sub) => {\n                if (isCaseSensitive) {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') = ?\", [column, String(value)])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | Cast all columns to text for comparison\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.whereRaw('CAST(?? AS CHAR) = ?', [column, String(value)])\n                        },\n                        () => {\n                          /*\n                          |--------------------------------------------------------------------------\n                          | For exact matches (no wildcards), use = operator\n                          |--------------------------------------------------------------------------\n                          */\n                          sub.where(column, '=', String(value))\n                        }\n                      )\n                    }\n                  )\n                } else {\n                  query.if(\n                    ['postgres', 'pg'].includes(this.#dialect),\n                    () => {\n                      // sub.orWhereILike(column, value)\n                      /*\n                       |--------------------------------------------------------------------------\n                       | Fix to cast column to text to avoid issues with non-text columns\n                       | (e.g., integer, boolean) and ensure that NULL values are handled correctly.\n                       |--------------------------------------------------------------------------\n                       */\n                      sub.whereRaw(\"COALESCE(??::text, '') ILIKE ?\", [column, String(value)])\n                    },\n                    () => {\n                      query.if(\n                        ['mysql', 'mysql2', 'mariadb'].includes(this.#dialect),\n                        () => {\n                          /*\n                           |--------------------------------------------------------------------------\n                           | MySQL: Use LOWER() for case-insensitive comparison\n                           |--------------------------------------------------------------------------\n                           */\n                          sub.whereRaw('LOWER(??) LIKE LOWER(?)', [column, String(value)])\n                        },\n                        () => {\n                          sub.whereLike(column, value)\n                        }\n                      )\n                    }\n                  )\n                }\n              })\n            } else {\n              query.where(column, '=', value)\n            }\n            break\n          case ':<':\n            query.where(column, '<', value)\n            break\n          case ':<=':\n            query.where(column, '<=', value)\n            break\n          case ':>':\n            query.where(column, '>', value)\n            break\n          case ':>=':\n            query.where(column, '>=', value)\n            break\n        }\n        break\n      case 'boolean':\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.where(column, '=', value)\n            break\n          case ':<':\n            query.where(column, '<', value)\n            break\n          case ':<=':\n            query.where(column, '<=', value)\n            break\n          case ':>':\n            query.where(column, '>', value)\n            break\n          case ':>=':\n            query.where(column, '>=', value)\n            break\n        }\n        break\n    }\n  }\n\n  applyLuceneRangeExpression(\n    column: string,\n    expression: RangeExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    const comparableMin = expression.range.minInclusive\n      ? expression.range.min\n      : expression.range.min + 1\n    const comparableMax = expression.range.maxInclusive\n      ? expression.range.max\n      : expression.range.max - 1\n    switch (operator.operator) {\n      case ':':\n      case ':=':\n        query.whereBetween(column, [comparableMin, comparableMax])\n        break\n    }\n  }\n\n  applyLuceneRegexExpression(\n    column: string,\n    expression: RegexExpressionToken,\n    operator: ComparisonOperatorToken,\n    query: LuceneFilteredDatabaseQueryBuilderContract\n  ) {\n    let value = expression.value\n    switch (this.#dialect) {\n      case 'mysql':\n      case 'mariadb':\n        // MySQL uses REGEXP for regex matching\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.whereRaw(`?? REGEXP ?`, [column, value.replace(/\\/(.*)\\/.*/, '$1')])\n            break\n        }\n        break\n\n      case 'pg':\n      case 'postgres':\n        // PostgreSQL uses ~ for case-sensitive regex matching and ~* for case-insensitive regex matching\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            {\n              const op = value.endsWith('i') ? '~*' : '~'\n              const cleanedValue = value.replace(/\\/(.*)\\/.*/, '$1')\n              query.whereRaw(`?? ${op} ?`, [column, cleanedValue])\n            }\n            break\n        }\n        break\n\n      case 'oracle':\n      case 'oracledb':\n      case 'tedious':\n      case 'mssql':\n        // Oracle uses REGEXP_LIKE for regex matching\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.whereRaw(`REGEXP_LIKE(??, ?)`, [column, value])\n            break\n        }\n        break\n\n      case 'sqlite3':\n      case 'better-sqlite3':\n        throw new E_LUCENE_REGEX_NOT_SUPPORTED()\n\n      default:\n        // Default case for other dialects, using LIKE as a fallback\n        // Note: This is not a true regex match, but a LIKE pattern match\n        // Escape any instances of `%` and `_` in the regex value\n        value = value.replace(/%/g, '\\\\%').replace(/_/g, '\\\\_')\n        // Replace \"*\" with \"%\" and \"?\" with \"_\"\n        value = value.replace(/\\*/g, '%').replace(/\\?/g, '_')\n        switch (operator.operator) {\n          case ':':\n          case ':=':\n            query.whereLike(column, value)\n            break\n        }\n        break\n    }\n  }\n\n  static get(\n    luceneQuery: string,\n    connection: QueryClientContract,\n    attributesToColumns: ModelKeysContract,\n    primaryKey: string,\n    tableName: string,\n    allowedColumns?: string[] | undefined,\n    model?: LucidModel | undefined\n  ): LuceneFilteredDatabaseQueryBuilderContract {\n    let parsed: LiqeQuery\n    try {\n      parsed = parse(luceneQuery)\n    } catch (error) {\n      if (error instanceof SyntaxError) {\n        throw new E_LUCENE_SYNTAX_EXCEPTION(luceneQuery, error)\n      }\n      throw new E_LUCENE_UNEXPECTED_EXCEPTION(error)\n    }\n    const query: LuceneFilteredDatabaseQueryBuilderContract = connection.query().from(tableName)\n    const builder = new LuceneLucidQueryBuilder(\n      connection,\n      query,\n      attributesToColumns,\n      primaryKey,\n      tableName,\n      allowedColumns,\n      model\n    )\n    builder.applyLuceneAst(parsed, query, true)\n    return query\n  }\n}\n\n/**\n * Converts a Lucene query string to a Lucid database query builder.\n * Parses the Lucene syntax and applies the resulting AST to generate SQL conditions.\n *\n * @template T - The result type for the query builder\n * @param luceneQuery - The Lucene query string to parse and convert\n * @param connection - The database connection client for creating queries\n * @param attributesToColumns - Mapping of model attributes to database columns\n * @param primaryKey - The primary key column name for implicit field queries\n * @param tableName - The database table name to query\n * @param allowedColumns - Optional array of allowed column names for security filtering\n * @param model - Optional The lucid model which the query is being built for. When passed, allows relationship-based filtration.\n * @returns A database query builder with the Lucene conditions applied\n * @throws {E_LUCENE_SYNTAX_EXCEPTION} When the Lucene query has syntax errors\n * @throws {E_LUCENE_UNEXPECTED_EXCEPTION} When an unexpected error occurs during parsing\n * @throws {E_LUCENE_INVALID_TYPE} When an unrecognized AST node type is encountered\n */\nexport const luceneToLucid = (\n  luceneQuery: string,\n  connection: QueryClientContract,\n  attributesToColumns: ModelKeysContract,\n  primaryKey: string,\n  tableName: string,\n  allowedColumns?: string[] | undefined,\n  model?: LucidModel | undefined\n): LuceneFilteredDatabaseQueryBuilderContract => {\n  const query = LuceneLucidQueryBuilder.get(\n    luceneQuery,\n    connection,\n    attributesToColumns,\n    primaryKey,\n    tableName,\n    allowedColumns,\n    model\n  )\n  query.whereNotNull(primaryKey)\n  return query\n}\n","/**\n * Cache service using WeakRef to allow garbage collection of values\n * when they're no longer referenced elsewhere and memory pressure occurs.\n * Uses string keys with weakly-referenced values.\n */\nexport class WeakCacheService {\n  #cache: Map<string, WeakRef<any>>\n\n  constructor() {\n    this.#cache = new Map()\n  }\n\n  /**\n   * Get a cached value by key\n   * @param {string} key - String key to lookup\n   * @returns {*} The cached value or undefined if not found or garbage collected\n   */\n  get(key: string) {\n    const weakRef = this.#cache.get(key)\n\n    if (!weakRef) {\n      return null\n    }\n\n    const value = weakRef.deref()\n\n    // If value was garbage collected, clean up the entry\n    if (value === undefined) {\n      this.#cache.delete(key)\n      return null\n    }\n\n    return value\n  }\n\n  /**\n   * Create/store a value in the cache with weak reference\n   * @param {string} key - String key for the cache entry\n   * @param {Object} value - Value to cache (must be an object, not a primitive)\n   * @returns {Object} The cached value\n   */\n  create(key: string, value: unknown) {\n    if (typeof value !== 'object' || value === null) {\n      throw new Error('Cached values must be objects for WeakRef to work')\n    }\n\n    const weakRef = new WeakRef(value)\n    this.#cache.set(key, weakRef)\n\n    return value\n  }\n\n  /**\n   * Check if a key exists and its value is still alive\n   * @param {string} key - String key to check\n   * @returns {boolean} True if key exists and value hasn't been garbage collected\n   */\n  has(key: string) {\n    const weakRef = this.#cache.get(key)\n    if (!weakRef) {\n      return false\n    }\n\n    const value = weakRef.deref()\n\n    if (value === undefined) {\n      this.#cache.delete(key)\n      return false\n    }\n\n    return true\n  }\n\n  /**\n   * Manually delete a cache entry\n   * @param {string} key - String key to delete\n   * @returns {boolean} True if deletion was successful\n   */\n  delete(key: string) {\n    return this.#cache.delete(key)\n  }\n\n  /**\n   * Get the number of cache entries (including potentially garbage collected ones)\n   * @returns {number} Cache size\n   */\n  size() {\n    return this.#cache.size\n  }\n\n  /**\n   * Clear all cache entries\n   */\n  clear() {\n    this.#cache.clear()\n  }\n}\n\nexport const weakCacheService = new WeakCacheService()\n","import { default as string } from '@poppinss/string'\nimport type { ModelColumnOptions } from '@adonisjs/lucid/types/model'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\n\nexport const resolveModelDisplayColumn = (model: ResourcefulModel): string => {\n  /*\n     |--------------------------------------------------------------------------\n     | If the model has a defined display column, use that\n     |--------------------------------------------------------------------------\n     */\n  if (\n    'string' === typeof model.$resourcefulTitleColumn &&\n    model.$resourcefulTitleColumn.trim().length > 0\n  ) {\n    const found = model.$columnsDefinitions.get(model.$resourcefulTitleColumn)\n    if (found) {\n      return found.columnName\n    }\n    return model.$resourcefulTitleColumn\n  }\n  /*\n     |--------------------------------------------------------------------------\n     | Check for common display fields in the properties which are matched to\n     | database columns\n     |--------------------------------------------------------------------------\n     */\n  const candidates = ['name', 'title', 'label', 'display', 'displayName', 'fullName', 'userName']\n  const potentials = new Map<string, ModelColumnOptions>()\n  model.$columnsDefinitions.forEach((columnOptions, attribute) => {\n    potentials.set(attribute, columnOptions)\n    potentials.set(string.camelCase(attribute), columnOptions)\n    potentials.set(columnOptions.columnName, columnOptions)\n    potentials.set(string.camelCase(columnOptions.columnName), columnOptions)\n  })\n  for (const candidate of candidates) {\n    let found = potentials.get(candidate)\n    if (found) {\n      return found.columnName\n    }\n    found = potentials.get(candidate.toLowerCase())\n    if (found) {\n      return found.columnName\n    }\n    found = potentials.get(string.snakeCase(candidate))\n    if (found) {\n      return found.columnName\n    }\n  }\n  /*\n     |--------------------------------------------------------------------------\n     | Fallback to the primary key\n     |--------------------------------------------------------------------------\n     */\n  return model.primaryKey\n}\n","/*\n|--------------------------------------------------------------------------\n| OpenAPI Schema Service\n|--------------------------------------------------------------------------\n|\n| Service class responsible for generating OpenAPI schema objects from\n| resourceful model metadata. Extracts OpenAPI-related logic from the\n| mixin to improve code organization and maintainability.\n|\n| This service handles:\n| - Data type extraction from resourceful data types\n| - Column schema generation\n| - Computed accessor schema generation  \n| - Relationship schema generation\n| - Complete model schema generation\n*/\n\nimport { deepmerge } from 'deepmerge-ts'\nimport { isResourcefulModel } from './type_guards'\nimport { encode } from '@nhtio/lucid-resourceful/encoding'\nimport { isString, isObject, stripUndefinedValuesFromObject } from './utils'\nimport { resolveModelDisplayColumn } from './router_macro/utils/relationships'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { ResourcefulModel } from './mixin'\nimport type { ResourcefulEnumObject, ResourcefulEnum } from './data_types'\nimport type {\n  ApplicationService,\n  HttpContext,\n  ResourcefulDataType,\n} from '@nhtio/lucid-resourceful/types'\nimport type {\n  RelationshipsContract,\n  HasOneRelationContract,\n  BelongsToRelationContract,\n  HasManyRelationContract,\n  HasManyThroughRelationContract,\n  ManyToManyRelationContract,\n} from '@adonisjs/lucid/types/relations'\nimport type {\n  ResourcefulModelColumnMetaSchema,\n  ResourcefulModelComputedAccessorMetaSchema,\n  ResourcefulModelRelationshipMetaSchema,\n  ResourcefulModelMetaSchema,\n  ResourcefulModelOpenApiSchema,\n  ResourcefulModelOpenApiRelatedSchema,\n  ResourcefulModelRelationshipMeta,\n  ResourcefulModelFieldRelationshipMeta,\n} from './types'\n\nexport interface GenerateModelSchemaOptions {\n  includeRelations?: boolean\n  relationsDeepLevel?: number | null\n  ctx?: HttpContext\n  app?: ApplicationService\n}\n\nexport interface NormalizedGenerateModelSchemaOptions extends GenerateModelSchemaOptions {\n  includeRelations: boolean\n  relationsDeepLevel: number | null\n  ctx?: HttpContext\n  app?: ApplicationService\n}\n\n/**\n * Interface for data type information extracted from resourceful data types.\n * Contains the OpenAPI type and optional format information.\n */\ninterface DataTypeInfo {\n  /** The OpenAPI data type (string, number, integer, boolean, object, array) */\n  type: 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array'\n  /** Optional format specification (date, date-time, binary, int32, int64, float, double) */\n  format?: string\n}\n\n/**\n * Interface for Lucid model definitions that may have serializeAs property.\n */\ninterface LucidDefinitionWithSerializeAs {\n  serializeAs?: string | null\n  autoCreate?: boolean\n}\n\n/**\n * Interface for data type instances with validation constraints.\n */\ninterface DataTypeWithConstraints {\n  type: string\n  format?: string\n  items?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  multipleOf?: number\n  maximum?: number\n  exclusiveMaximum?: boolean\n  minimum?: number\n  exclusiveMinimum?: boolean\n  maxLength?: number\n  minLength?: number\n  pattern?: string\n  additionalProperties?: boolean | OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  maxProperties?: number\n  minProperties?: number\n  properties?: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>\n  maxItems?: number\n  minItems?: number\n  uniqueItems?: boolean\n  allOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  oneOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  anyOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  not?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  required?: string[]\n  enum?: unknown[]\n  nullable?: boolean\n}\n\n/**\n * Interface for property definitions with validation constraints.\n */\ninterface PropertyDefinitionWithConstraints {\n  type: ResourcefulDataType\n  description?: string\n  nullable?: boolean\n  externalDocs?: OpenAPIV3.ExternalDocumentationObject\n  example?: unknown\n  items?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  multipleOf?: number\n  maximum?: number\n  exclusiveMaximum?: boolean\n  minimum?: number\n  exclusiveMinimum?: boolean\n  maxLength?: number\n  minLength?: number\n  pattern?: string\n  additionalProperties?: boolean | OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  maxProperties?: number\n  minProperties?: number\n  properties?: Record<string, OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>\n  maxItems?: number\n  minItems?: number\n  uniqueItems?: boolean\n  allOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  oneOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  anyOf?: (OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject)[]\n  not?: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject\n  required?: string[]\n  enum?: unknown[]\n}\n\n/**\n * Service class for generating OpenAPI schema objects from resourceful model metadata.\n *\n * This service encapsulates all OpenAPI-related functionality that was previously\n * embedded in the resourceful mixin, providing better code organization and\n * easier testing. It handles the extraction of data type information from\n * resourceful data types and generates proper OpenAPI schema objects with\n * vendor extensions for field capabilities (filterable, sortable, aggregatable).\n *\n * @example\n * ```typescript\n * const service = new OpenApiSchemaService()\n * const schema = await service.generateModelSchema('read', metaSchema, model)\n * ```\n */\nexport class OpenApiSchemaService {\n  /**\n   * Gets the field key for a property, handling serializeAs transformation.\n   *\n   * This private method extracts the appropriate field name for a property,\n   * taking into account the serializeAs option from Lucid model definitions.\n   * Returns null if the field cannot be read (following Lucid's serializeAs behavior).\n   *\n   * @param key - The original property key\n   * @param definition - The Lucid model definition (column, computed, or relation)\n   * @returns The field key to use, the original key if no transformation is needed, or null if field cannot be read\n   */\n  #getFieldKey(key: string, definition: LucidDefinitionWithSerializeAs): string | null {\n    if (definition.serializeAs === null) {\n      return null\n    }\n    /* istanbul ignore if -- @preserve */\n    if (isString(definition.serializeAs)) {\n      return definition.serializeAs\n    }\n    /* istanbul ignore next -- @preserve */\n    return key\n  }\n\n  /**\n   * Extracts OpenAPI type and format information from resourceful data types.\n   *\n   * This private method handles the mapping from resourceful data type instances\n   * to their corresponding OpenAPI type and format specifications. It properly\n   * handles all supported resourceful data types and provides appropriate\n   * fallback behavior for unknown types.\n   *\n   * @param dataType - The resourceful data type instance to extract information from\n   * @returns Object containing the OpenAPI type and optional format\n   *\n   * @example\n   * ```typescript\n   * const info = this.#extractDataTypeInfo(ResourcefulStringType())\n   * // Returns: { type: 'string' }\n   *\n   * const info = this.#extractDataTypeInfo(ResourcefulDateTimeType())\n   * // Returns: { type: 'string', format: 'date-time' }\n   * ```\n   */\n  #extractDataTypeInfo(dataType: ResourcefulDataType): DataTypeInfo {\n    // Extract the base type from the data type instance with error handling\n    let baseType: string\n    try {\n      baseType = dataType.type\n    } catch (error) {\n      // Fallback to string type if type extraction fails\n      /* istanbul ignore next -- @preserve */\n      return { type: 'string' }\n    }\n\n    // Extract format information if available\n    const format =\n      'format' in dataType && typeof dataType.format === 'string' ? dataType.format : undefined\n\n    // Handle specific data type mappings based on the type and format\n    /* istanbul ignore next -- @preserve */\n    switch (baseType) {\n      case 'string': {\n        // String types may have specific formats\n        if (format) {\n          return { type: 'string', format }\n        }\n        return { type: 'string' }\n      }\n\n      case 'number': {\n        // Number types may have float/double format\n        if (format === 'float' || format === 'double') {\n          return { type: 'number', format }\n        }\n        return { type: 'number' }\n      }\n\n      case 'integer': {\n        // Integer types may have int32/int64 format\n        if (format === 'int32' || format === 'int64') {\n          return { type: 'integer', format }\n        }\n        return { type: 'integer' }\n      }\n\n      case 'boolean': {\n        return { type: 'boolean' }\n      }\n\n      case 'object': {\n        return { type: 'object' }\n      }\n\n      case 'array': {\n        return { type: 'array' }\n      }\n\n      default: {\n        /* istanbul ignore next -- @preserve */\n        return { type: 'string' }\n      }\n    }\n  }\n\n  #resolveEnums<A = any>(\n    fromDefinition?: ResourcefulEnum<A>,\n    fromDataType?: ResourcefulEnum<A>\n  ): A[] | undefined {\n    if (Array.isArray(fromDefinition)) {\n      return fromDefinition.map((v) => (isObject(v) ? v.value : v))\n    } else if (Array.isArray(fromDataType)) {\n      return fromDataType.map((v) => (isObject(v) ? v.value : v))\n    }\n    return undefined\n  }\n\n  #resolveChoices<A = any>(\n    fromDefinition?: ResourcefulEnum<A>,\n    fromDataType?: ResourcefulEnum<A>\n  ): ResourcefulEnumObject<A>[] | undefined {\n    if (Array.isArray(fromDefinition)) {\n      return fromDefinition.map((v) =>\n        isObject(v)\n          ? ({\n              title: v.title || String(v.value),\n              value: v.value,\n              i18n: v.i18n || false,\n            } satisfies ResourcefulEnumObject<A>)\n          : ({\n              title: String(v),\n              value: v,\n              i18n: false,\n            } satisfies ResourcefulEnumObject<A>)\n      )\n    } else if (Array.isArray(fromDataType)) {\n      return fromDataType.map((v) =>\n        isObject(v)\n          ? ({\n              title: v.title || String(v.value),\n              value: v.value,\n              i18n: v.i18n || false,\n            } satisfies ResourcefulEnumObject<A>)\n          : ({\n              title: String(v),\n              value: v,\n              i18n: false,\n            } satisfies ResourcefulEnumObject<A>)\n      )\n    }\n    return undefined\n  }\n\n  /**\n   * Generates a complete OpenAPI schema object for a resourceful model.\n   *\n   * This method creates a comprehensive OpenAPI v3 schema representation of the model\n   * by processing the provided metadata schema. The metadata should already have\n   * field-level access control permissions evaluated for the given request context.\n   * The generated schema includes vendor extensions that provide metadata about field\n   * capabilities for API consumers:\n   * - `x-resourceful-filterable`: Array of field names that can be used in filter operations\n   * - `x-resourceful-sortable`: Array of field names that can be used in sort operations\n   * - `x-resourceful-aggregatable`: Array of field names that can be used in aggregation operations\n   *\n   * @param operation - The operation type ('read' or 'write') to determine which fields to include\n   * @param resourcefulModelMetaSchema - The resourceful model metadata with ACL filtering applied\n   * @param model - Optional model class for additional context\n   * @returns Complete OpenAPI schema object with field capability metadata\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateModelSchema('read', metaSchema, UserModel)\n   * // Returns OpenAPI schema with vendor extensions:\n   * // {\n   * //   type: 'object',\n   * //   properties: { ... },\n   * //   'x-resourceful-filterable': ['name', 'email', 'user.name'],\n   * //   'x-resourceful-sortable': ['name', 'createdAt'],\n   * //   'x-resourceful-aggregatable': ['totalSales', 'orderCount']\n   * // }\n   * ```\n   */\n  /* istanbul ignore next -- @preserve */\n  async generateModelSchema(\n    /* istanbul ignore next -- @preserve */\n    operation: 'read' | 'write' = 'read',\n    resourcefulModelMetaSchema: ResourcefulModelMetaSchema,\n    options: NormalizedGenerateModelSchemaOptions,\n    model?: ResourcefulModel\n  ): Promise<ResourcefulModelOpenApiSchema> {\n    if (\n      !isObject(resourcefulModelMetaSchema) ||\n      !resourcefulModelMetaSchema.name ||\n      !isResourcefulModel(model)\n    ) {\n      return {\n        type: 'object',\n        properties: {},\n        required: [],\n      }\n    }\n    // Initialize the base schema structure\n    const schema: ResourcefulModelOpenApiSchema = {\n      'type': 'object',\n      'title': resourcefulModelMetaSchema.name,\n      'description': resourcefulModelMetaSchema.description,\n      'externalDocs': resourcefulModelMetaSchema.externalDocs,\n      'example': resourcefulModelMetaSchema.example,\n      'properties': {},\n      'x-resourceful-filterable': {},\n      'x-resourceful-sortable': [],\n      'x-resourceful-aggregatable': [],\n      'x-resourceful-auto-create': [],\n    }\n\n    // Process each property in the metadata schema\n    /* istanbul ignore next -- @preserve */\n    Object.entries(resourcefulModelMetaSchema.properties).forEach(\n      async ([propertyKey, propertyMeta]) => {\n        // Get the field key (handles serializeAs transformation)\n        let resolvedColumnName = this.#getFieldKey(\n          propertyKey,\n          propertyMeta.lucidDefinitions as LucidDefinitionWithSerializeAs\n        )\n\n        if (null === resolvedColumnName && 'read' === operation) {\n          // If the field key is null, that means that the field cannot be \"read\"\n          // This is part of the baseline lucid decorator API, so we need to honor the\n          // expected behavior\n          return\n        } else if (null === resolvedColumnName && 'write' === operation) {\n          resolvedColumnName = propertyKey\n        }\n\n        // Skip properties that cannot be accessed for the given operation\n        if (\n          ('read' === operation && propertyMeta.canRead === false) ||\n          ('write' === operation && propertyMeta.canWrite === false)\n        )\n          return\n\n        // Generate schema based on property type\n        switch (propertyMeta.kind) {\n          case 'column': {\n            schema.properties![propertyKey] = this.generateColumnSchema(\n              model,\n              propertyKey,\n              propertyMeta as ResourcefulModelColumnMetaSchema\n            )\n            if (propertyMeta.filterable) {\n              schema['x-resourceful-filterable']![propertyKey] = schema.properties![propertyKey]\n            }\n            if (propertyMeta.sortable && Array.isArray(schema['x-resourceful-sortable'])) {\n              schema['x-resourceful-sortable'].push(propertyKey)\n            }\n            if (propertyMeta.aggregatable && Array.isArray(schema['x-resourceful-aggregatable'])) {\n              schema['x-resourceful-aggregatable'].push(propertyKey)\n            }\n            if (\n              propertyMeta.definition &&\n              'autoCreate' in propertyMeta.definition &&\n              true === propertyMeta.definition.autoCreate &&\n              Array.isArray(schema['x-resourceful-auto-create'])\n            ) {\n              schema['x-resourceful-auto-create'].push(propertyKey)\n            }\n            return\n          }\n\n          case 'computedAccessor': {\n            schema.properties![propertyKey] = this.generateComputedAccessorSchema(\n              propertyKey,\n              propertyMeta as ResourcefulModelComputedAccessorMetaSchema\n            )\n            return\n          }\n\n          case 'relationship': {\n            const relatedSchema = await this.generateRelationshipSchema(\n              propertyKey,\n              propertyMeta as ResourcefulModelRelationshipMetaSchema,\n              operation,\n              options\n            )\n            if (relatedSchema) {\n              const lucidDefinition = model.$relationsDefinitions.get(propertyKey)\n              if (lucidDefinition && 'read' === operation) {\n                switch (lucidDefinition.type) {\n                  case 'hasOne':\n                  case 'belongsTo':\n                    schema.properties![propertyKey] = relatedSchema\n                    break\n                }\n              }\n            }\n            if (isObject(propertyMeta.filterable)) {\n              const fixedFilterable: { [key: string]: any } = {}\n              Object.entries(propertyMeta.filterable).forEach(([key, value]) => {\n                // Use dot notation for related fields\n                fixedFilterable[`${resolvedColumnName}.${key}`] = value\n              })\n              schema['x-resourceful-filterable'] = deepmerge(\n                schema['x-resourceful-filterable'],\n                fixedFilterable\n              )\n            }\n            return\n          }\n        }\n      }\n    )\n\n    // Build the required fields array based on non-nullable properties\n    const requiredPropSet: Set<string> = new Set()\n    Object.entries(schema.properties!).forEach(([propertyKey, propertySchema]) => {\n      // Skip reference objects (relationships)\n      if (!isObject(propertySchema) || '$ref' in propertySchema) {\n        return\n      }\n\n      // Check if the property is nullable\n      // Properties are required if:\n      // 1. nullable is false (explicitly set)\n      // 2. nullable is undefined (not specified, defaults to non-nullable)\n      // Properties are NOT required if:\n      // 1. nullable is true (explicitly nullable)\n      const isNullable = propertySchema.nullable === true\n      // If not explicitly nullable, it should be required\n      if (\n        !isNullable &&\n        ('read' === operation ||\n          (!model.$resourcefulComputedAccessors.has(propertyKey) &&\n            !model.$resourcefulRelationships.has(propertyKey) &&\n            (!schema['x-resourceful-auto-create'] ||\n              !schema['x-resourceful-auto-create'].includes(propertyKey))))\n      ) {\n        requiredPropSet.add(propertyKey)\n      }\n    })\n    schema.required = Array.from(requiredPropSet)\n\n    return schema\n  }\n\n  #makeRelationshipChoicesUrl(model: ResourcefulModel, relationship: string): string {\n    const encodable = {\n      ResourcefulModel: model.name,\n      relationship,\n    }\n    return `#/$meta.choices/${encodeURIComponent(encode(encodable))}`\n  }\n\n  #extractSingleRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    _propertyMeta: ResourcefulModelColumnMetaSchema,\n    relationshipKey: string,\n    relationship: HasOneRelationContract<any, any> | BelongsToRelationContract<any, any>\n  ): ResourcefulModelFieldRelationshipMeta {\n    if (relationship.foreignKey === propertyKey) {\n      const resourcefulModelRelationshipMeta = model.$resourcefulRelationships.get(relationshipKey)\n      if (!resourcefulModelRelationshipMeta) {\n        return false\n      }\n      const relatedModel = resourcefulModelRelationshipMeta.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        return false\n      }\n      const fieldKey = this.#getFieldKey(\n        relationshipKey,\n        resourcefulModelRelationshipMeta as LucidDefinitionWithSerializeAs\n      )\n      return {\n        title: fieldKey || relationshipKey,\n        multiple: false,\n        choices: this.#makeRelationshipChoicesUrl(model, relationshipKey),\n      }\n    }\n    return false\n  }\n\n  /*\n  |--------------------------------------------------------------------------\n  | Functionally useless\n  |--------------------------------------------------------------------------\n  |\n  | This method has been deactivated because it is functionally useless. It is\n  | not possible for a form to render the choices for a many relationship\n  | in a way which is will be processed by the API. HasMany and HasManyThrough\n  | relationships need to be managed via a separate form which specifically\n  | handles syncronizing relationships.\n  |\n  | The code is being left as a reference for if and when it does have a use\n  | case.\n  | \n  */\n  // @ts-ignore\n  #extractManyRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    _propertyMeta: ResourcefulModelColumnMetaSchema,\n    relationshipKey: string,\n    relationship: HasManyRelationContract<any, any> | HasManyThroughRelationContract<any, any>\n  ): ResourcefulModelFieldRelationshipMeta {\n    if (\n      ('hasMany' === relationship.type && relationship.foreignKey === propertyKey) ||\n      ('hasManyThrough' === relationship.type && relationship.throughForeignKey === propertyKey)\n    ) {\n      const resourcefulModelRelationshipMeta = model.$resourcefulRelationships.get(relationshipKey)\n      if (!resourcefulModelRelationshipMeta) {\n        return false\n      }\n      const relatedModel = resourcefulModelRelationshipMeta.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        return false\n      }\n      const fieldKey = this.#getFieldKey(\n        relationshipKey,\n        resourcefulModelRelationshipMeta as LucidDefinitionWithSerializeAs\n      )\n      return {\n        title: fieldKey || relationshipKey,\n        multiple: true,\n        choices: this.#makeRelationshipChoicesUrl(model, relationshipKey),\n      }\n    }\n    return false\n  }\n\n  /*\n  |--------------------------------------------------------------------------\n  | Functionally useless\n  |--------------------------------------------------------------------------\n  |\n  | This method has been deactivated because it is functionally useless. It is\n  | not possible for a form to render the choices for a many to many \n  | relationship in a way which is will be processed by the API. ManyToMany\n  | relationships need to be managed via a separate form which specifically\n  | handles syncronizing relationships.\n  |\n  | The code is being left as a reference for if and when it does have a use\n  | case.\n  | \n  */\n  // @ts-ignore\n  #extractManyToManyRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    _propertyMeta: ResourcefulModelColumnMetaSchema,\n    relationshipKey: string,\n    relationship: ManyToManyRelationContract<any, any>\n  ): ResourcefulModelFieldRelationshipMeta {\n    if (relationship.pivotForeignKey === propertyKey) {\n      const resourcefulModelRelationshipMeta = model.$resourcefulRelationships.get(relationshipKey)\n      if (!resourcefulModelRelationshipMeta) {\n        return false\n      }\n      const relatedModel = resourcefulModelRelationshipMeta.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        return false\n      }\n      const fieldKey = this.#getFieldKey(\n        relationshipKey,\n        resourcefulModelRelationshipMeta as LucidDefinitionWithSerializeAs\n      )\n      return {\n        title: fieldKey || relationshipKey,\n        multiple: true,\n        choices: this.#makeRelationshipChoicesUrl(model, relationshipKey),\n      }\n    }\n    return false\n  }\n\n  #extractColumnRelationshipMeta(\n    model: ResourcefulModel,\n    propertyKey: string,\n    propertyMeta: ResourcefulModelColumnMetaSchema\n  ): ResourcefulModelFieldRelationshipMeta {\n    // iterate through model relations to find if this column is a key to any relation\n    const possible: Map<string, ResourcefulModelRelationshipMeta> = new Map()\n    const processRelationship = (relation: RelationshipsContract, relationshipKey: string) => {\n      relation.boot()\n      switch (relation.type) {\n        case 'hasOne':\n        case 'belongsTo': {\n          const metaOrFalse = this.#extractSingleRelationshipMeta(\n            model,\n            propertyKey,\n            propertyMeta,\n            relationshipKey,\n            relation\n          )\n          if (metaOrFalse) {\n            possible.set(relationshipKey, metaOrFalse)\n          }\n          break\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Functionality Deactivated\n        |--------------------------------------------------------------------------\n        |\n        | @see comments on the #extractManyRelationshipMeta method\n        | \n        */\n        // case 'hasMany':\n        // case 'hasManyThrough': {\n        //   const metaOrFalse = this.#extractManyRelationshipMeta(\n        //     model,\n        //     propertyKey,\n        //     propertyMeta,\n        //     relationshipKey,\n        //     relation\n        //   )\n        //   if (metaOrFalse) {\n        //     possible.set(relationshipKey, metaOrFalse)\n        //   }\n        //   break\n        // }\n        /*\n        |--------------------------------------------------------------------------\n        | Functionality Deactivated\n        |--------------------------------------------------------------------------\n        |\n        | @see comments on the #extractManyToManyRelationshipMeta method\n        | \n        */\n        // case 'manyToMany': {\n        //   const metaOrFalse = this.#extractManyToManyRelationshipMeta(\n        //     model,\n        //     propertyKey,\n        //     propertyMeta,\n        //     relationshipKey,\n        //     relation\n        //   )\n        //   if (metaOrFalse) {\n        //     possible.set(relationshipKey, metaOrFalse)\n        //   }\n        //   break\n        // }\n      }\n    }\n    if (\n      propertyMeta.definition &&\n      'relationshipKey' in propertyMeta.definition &&\n      'string' === typeof propertyMeta.definition.relationshipKey &&\n      propertyMeta.definition.relationshipKey.trim().length > 0\n    ) {\n      const relation = model.$relationsDefinitions.get(propertyMeta.definition.relationshipKey)\n      if (relation) {\n        processRelationship(relation, propertyMeta.definition.relationshipKey)\n      }\n    } else {\n      model.$relationsDefinitions.forEach(processRelationship)\n    }\n    if (possible.size > 0) {\n      // Always return the first found relationship if multiple are found\n      if (possible.size > 1) {\n        // TODO: provide a warning for the developer that multiple relationships were found\n        // for the same column key and that they should specifically define `relationshipKey` in\n        // the column definition to avoid ambiguity\n      }\n      return Array.from(possible.values())[0]\n    }\n    return false\n  }\n\n  /**\n   * Generates OpenAPI schema for a column property.\n   *\n   * This method converts resourceful column metadata into an OpenAPI schema object,\n   * properly extracting data type information and preserving all existing schema\n   * properties such as validation constraints, nullability, and access modifiers.\n   *\n   * @param propertyKey - The name of the column property\n   * @param propertyMeta - The resourceful metadata for the column\n   * @returns OpenAPI schema object for the column\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateColumnSchema('name', columnMeta)\n   * // Returns: { type: 'string', minLength: 1, maxLength: 100, ... }\n   * ```\n   */\n  generateColumnSchema(\n    model: ResourcefulModel,\n    propertyKey: string,\n    propertyMeta: ResourcefulModelColumnMetaSchema\n  ): ResourcefulModelOpenApiSchema {\n    // Extract data type information from the resourceful data type\n    if (!isObject(propertyMeta) || !propertyMeta.definition || !propertyMeta.lucidDefinitions) {\n      return {}\n    }\n    const dataTypeInfo = this.#extractDataTypeInfo(propertyMeta.definition.type)\n    const relationshipMeta = this.#extractColumnRelationshipMeta(model, propertyKey, propertyMeta)\n    // Get the field key (handles serializeAs)\n    const fieldKey = this.#getFieldKey(\n      propertyKey,\n      propertyMeta.lucidDefinitions as LucidDefinitionWithSerializeAs\n    )\n\n    // Extract validation constraints from the data type instance and definition\n    const dataType = propertyMeta.definition.type as DataTypeWithConstraints\n    const definition = propertyMeta.definition as PropertyDefinitionWithConstraints\n\n    // Build the schema object with proper type information and all existing properties\n    /* istanbul ignore next -- @preserve */\n    const schemaProperties = stripUndefinedValuesFromObject({\n      // Core OpenAPI type information (properly extracted)\n      type: dataTypeInfo.type,\n      format: dataTypeInfo.format,\n\n      // Schema metadata\n      items: definition.items || dataType.items,\n      title: fieldKey || propertyKey,\n      description: definition.description,\n      default:\n        'default' in definition\n          ? definition.default\n          : this.getDefaultValueFromPropertyMeta(propertyMeta),\n\n      // Numeric constraints (from data type or definition)\n      multipleOf: definition.multipleOf || dataType.multipleOf,\n      maximum: definition.maximum || dataType.maximum,\n      exclusiveMaximum: definition.exclusiveMaximum || dataType.exclusiveMaximum,\n      minimum: definition.minimum || dataType.minimum,\n      exclusiveMinimum: definition.exclusiveMinimum || dataType.exclusiveMinimum,\n\n      // String constraints (from data type or definition)\n      maxLength: definition.maxLength || dataType.maxLength,\n      minLength: definition.minLength || dataType.minLength,\n      pattern: definition.pattern || dataType.pattern,\n\n      // Object constraints (from data type or definition)\n      additionalProperties: definition.additionalProperties || dataType.additionalProperties,\n      maxProperties: definition.maxProperties || dataType.maxProperties,\n      minProperties: definition.minProperties || dataType.minProperties,\n      properties: definition.properties || dataType.properties,\n\n      // Array constraints (from data type or definition)\n      maxItems: definition.maxItems || dataType.maxItems,\n      minItems: definition.minItems || dataType.minItems,\n      uniqueItems: definition.uniqueItems || dataType.uniqueItems,\n\n      // Schema composition (from data type or definition)\n      allOf: definition.allOf || dataType.allOf,\n      oneOf: definition.oneOf || dataType.oneOf,\n      anyOf: definition.anyOf || dataType.anyOf,\n      not: definition.not || dataType.not,\n\n      // Validation and constraints (from data type or definition)\n      required: definition.required || dataType.required,\n      enum: this.#resolveEnums(definition.enum, dataType.enum),\n      nullable:\n        definition.nullable !== undefined ? definition.nullable : dataType.nullable || false,\n\n      // Access control\n      readOnly: propertyMeta.canRead && !propertyMeta.canWrite,\n      writeOnly: !propertyMeta.canRead && propertyMeta.canWrite,\n\n      // Documentation\n      externalDocs: definition.externalDocs,\n      example: definition.example,\n\n      // Form Rendering\n      ...{\n        'x-resourceful-autocreated':\n          ('autoCreate' in definition && definition.autoCreate === true) ||\n          ('autoCreate' in dataType && dataType.autoCreate === true) ||\n          ('isPrimary' in definition && definition.isPrimary === true) ||\n          false,\n        'x-resourceful-autoupdated':\n          ('autoUpdate' in definition && definition.autoUpdate === true) ||\n          ('autoUpdate' in dataType && dataType.autoUpdate === true) ||\n          false,\n        'x-resourceful-immutable':\n          ('immutable' in definition && definition.immutable === true) || false,\n        'x-resourceful-primary-key':\n          ('isPrimary' in definition && definition.isPrimary === true) || false,\n        'x-resourceful-relationship': relationshipMeta,\n      },\n      ...stripUndefinedValuesFromObject({\n        'x-resourceful-choices': this.#resolveChoices(definition.enum, dataType.enum),\n      }),\n    })\n\n    return schemaProperties as ResourcefulModelOpenApiSchema\n  }\n\n  /**\n   * Generates OpenAPI schema for a computed accessor property.\n   *\n   * This method converts resourceful computed accessor metadata into an OpenAPI\n   * schema object, applying the same data type extraction improvements as column\n   * schema generation while maintaining all existing functionality.\n   *\n   * @param propertyKey - The name of the computed accessor property\n   * @param propertyMeta - The resourceful metadata for the computed accessor\n   * @returns OpenAPI schema object for the computed accessor\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateComputedAccessorSchema('fullName', accessorMeta)\n   * // Returns: { type: 'string', readOnly: true, ... }\n   * ```\n   */\n  generateComputedAccessorSchema(\n    propertyKey: string,\n    propertyMeta: ResourcefulModelComputedAccessorMetaSchema\n  ): ResourcefulModelOpenApiSchema {\n    if (!isObject(propertyMeta) || !propertyMeta.definition || !propertyMeta.lucidDefinitions) {\n      return {}\n    }\n    // Extract data type information from the resourceful data type\n    const dataTypeInfo = this.#extractDataTypeInfo(propertyMeta.definition.type)\n\n    // Get the field key (handles serializeAs)\n    const fieldKey = this.#getFieldKey(\n      propertyKey,\n      propertyMeta.lucidDefinitions as LucidDefinitionWithSerializeAs\n    )\n\n    // Extract validation constraints from the data type instance and definition\n    const dataType = propertyMeta.definition.type as DataTypeWithConstraints\n    const definition = propertyMeta.definition as PropertyDefinitionWithConstraints\n\n    // Build the schema object with proper type information and all existing properties\n    /* istanbul ignore next -- @preserve */\n    const schemaProperties = stripUndefinedValuesFromObject({\n      // Core OpenAPI type information (properly extracted)\n      type: dataTypeInfo.type,\n      format: dataTypeInfo.format,\n\n      // Schema metadata\n      items: definition.items || dataType.items,\n      title: fieldKey || propertyKey,\n      description: definition.description,\n      default:\n        'default' in definition\n          ? definition.default\n          : this.getDefaultValueFromPropertyMeta(propertyMeta),\n\n      // Numeric constraints (from data type or definition)\n      multipleOf: definition.multipleOf || dataType.multipleOf,\n      maximum: definition.maximum || dataType.maximum,\n      exclusiveMaximum: definition.exclusiveMaximum || dataType.exclusiveMaximum,\n      minimum: definition.minimum || dataType.minimum,\n      exclusiveMinimum: definition.exclusiveMinimum || dataType.exclusiveMinimum,\n\n      // String constraints (from data type or definition)\n      maxLength: definition.maxLength || dataType.maxLength,\n      minLength: definition.minLength || dataType.minLength,\n      pattern: definition.pattern || dataType.pattern,\n\n      // Object constraints (from data type or definition)\n      additionalProperties: definition.additionalProperties || dataType.additionalProperties,\n      maxProperties: definition.maxProperties || dataType.maxProperties,\n      minProperties: definition.minProperties || dataType.minProperties,\n      properties: definition.properties || dataType.properties,\n\n      // Array constraints (from data type or definition)\n      maxItems: definition.maxItems || dataType.maxItems,\n      minItems: definition.minItems || dataType.minItems,\n      uniqueItems: definition.uniqueItems || dataType.uniqueItems,\n\n      // Schema composition (from data type or definition)\n      allOf: definition.allOf || dataType.allOf,\n      oneOf: definition.oneOf || dataType.oneOf,\n      anyOf: definition.anyOf || dataType.anyOf,\n      not: definition.not || dataType.not,\n\n      // Validation and constraints (from data type or definition)\n      required: definition.required || dataType.required,\n      enum: this.#resolveEnums(definition.enum, dataType.enum),\n      nullable:\n        definition.nullable !== undefined ? definition.nullable : dataType.nullable || false,\n\n      // Access control\n      readOnly: propertyMeta.canRead && !propertyMeta.canWrite,\n      writeOnly: !propertyMeta.canRead && propertyMeta.canWrite,\n\n      // Documentation\n      externalDocs: definition.externalDocs,\n      example: definition.example,\n\n      // Form Rendering\n      ...{\n        'x-resourceful-autocreated': !propertyMeta.canWrite,\n        'x-resourceful-autoupdated': !propertyMeta.canWrite,\n        'x-resourceful-immutable': !propertyMeta.canWrite,\n        'x-resourceful-primary-key': false,\n        'x-resourceful-relationship': false,\n      },\n      ...stripUndefinedValuesFromObject({\n        'x-resourceful-choices': this.#resolveChoices(definition.enum, dataType.enum),\n      }),\n    })\n\n    return schemaProperties as ResourcefulModelOpenApiSchema\n  }\n\n  /**\n   * Generates OpenAPI schema for a relationship property.\n   *\n   * This method converts resourceful relationship metadata into an OpenAPI\n   * reference object, preserving existing relationship reference generation\n   * logic and ensuring proper handling of related model references.\n   *\n   * @param propertyKey - The name of the relationship property\n   * @param propertyMeta - The resourceful metadata for the relationship\n   * @returns OpenAPI reference object for the relationship, or undefined if not applicable\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const schema = service.generateRelationshipSchema('user', relationshipMeta)\n   * // Returns: { $ref: '#/components/schemas/User' }\n   * ```\n   */\n  async generateRelationshipSchema(\n    _propertyKey: string,\n    propertyMeta: ResourcefulModelRelationshipMetaSchema,\n    operation: 'read' | 'write',\n    options: NormalizedGenerateModelSchemaOptions\n  ): Promise<ResourcefulModelOpenApiRelatedSchema | ResourcefulModelOpenApiSchema | undefined> {\n    if (\n      !isObject(propertyMeta) ||\n      !propertyMeta.definition ||\n      !propertyMeta.lucidDefinitions ||\n      !propertyMeta.relatedModel\n    ) {\n      return undefined\n    }\n    const relatedModel = propertyMeta.relatedModel()\n    /* istanbul ignore if -- @preserve */\n    if (!relatedModel) {\n      // If the related model is not defined, we cannot generate a schema for it\n      return undefined\n    }\n    /* istanbul ignore if -- @preserve */\n    if (!isResourcefulModel(relatedModel)) {\n      // If the related model is not a ResourcefulModel, we cannot generate a schema for it\n      return undefined\n    }\n\n    if (options.includeRelations && options.relationsDeepLevel === 0) {\n      return undefined\n    }\n\n    if (options.includeRelations) {\n      if (!options.app || !options.ctx) {\n        //TODO: In expected environment, this should never happen. Should be tested and removed later.\n        return undefined\n      }\n\n      const updatedOptions = {\n        ...options,\n        relationsDeepLevel:\n          options.relationsDeepLevel === null ? null : options.relationsDeepLevel - 1,\n      }\n\n      return relatedModel.$asOpenApiSchemaObject(\n        options.ctx,\n        options.app,\n        operation,\n        updatedOptions\n      )\n    }\n\n    const ref: string = `#/components/schemas/${relatedModel.$resourcefulName}`\n    return {\n      '$ref': ref,\n      'x-resourceful-display-key': resolveModelDisplayColumn(relatedModel),\n    }\n  }\n\n  /**\n   * Extracts default value from property metadata using Joi description.\n   *\n   * This protected method provides access to the default value extraction logic\n   * that was previously part of the mixin. It examines the Joi validator\n   * description to find default values specified in the schema.\n   *\n   * @param propertyMeta - The resourceful metadata containing the validator\n   * @returns The default value if found, undefined otherwise\n   *\n   * @example\n   * ```typescript\n   * const service = new OpenApiSchemaService()\n   * const defaultValue = service.getDefaultValueFromPropertyMeta(propertyMeta)\n   * ```\n   */\n  protected getDefaultValueFromPropertyMeta(\n    propertyMeta: ResourcefulModelColumnMetaSchema | ResourcefulModelComputedAccessorMetaSchema\n  ): unknown | undefined {\n    const joiDescription = propertyMeta.validator.describe()\n    /* istanbul ignore if -- @preserve */\n    if (\n      isObject(joiDescription) &&\n      'flags' in joiDescription &&\n      isObject(joiDescription.flags) &&\n      'default' in joiDescription.flags\n    ) {\n      return joiDescription.flags.default\n    }\n    /* istanbul ignore next -- @preserve */\n    return undefined\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Mixin for Lucid Models\n|--------------------------------------------------------------------------\n|\n| Adds the required metadata and functionality to Lucid models\n| which will be utilized by the resourceful controller & factory\n*/\nimport { default as pMap } from 'p-map'\nimport * as guards from './type_guards'\nimport { HttpContext } from '@adonisjs/core/http'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { ValidationError } from '@nhtio/validation'\nimport { SimplePaginator } from '@adonisjs/lucid/database'\nimport { luceneToLucid } from './lucene_to_lucid_translator'\nimport { TypedEventEmitter } from '@nhtio/tiny-typed-emitter'\nimport { WeakCacheService } from './utils/weak_cache_service'\nimport { HttpContextFactory } from '@adonisjs/core/factories/http'\nimport { ACLOperationsEnum, CRUDOperationsEnum } from './constants'\nimport { beforeCreate, beforeUpdate, type BaseModel } from '@adonisjs/lucid/orm'\nimport { GenerateModelSchemaOptions, OpenApiSchemaService } from './open_api_schema_service'\nimport {\n  operationCRUDToACL,\n  isString,\n  stripUndefinedValuesFromObject,\n  prepareFields,\n  isObject,\n} from './utils'\nimport {\n  ResourcefulArrayType,\n  ResourcefulBigintType,\n  ResourcefulBinaryType,\n  ResourcefulIntegerType,\n  ResourcefulNumberType,\n  ResourcefulObjectType,\n  ResourcefulStringType,\n  ResourcefulUnsignedIntegerType,\n} from '@nhtio/lucid-resourceful/definitions'\nimport {\n  E_FORBIDDEN,\n  E_INVALID_COLUMN_ACCESS,\n  E_INVALID_RESOURCEFUL_MIXIN_OPTIONS,\n  E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION,\n  E_INVALID_RESOUREFUL_READ_RELATIONSHIP_REQUEST_EXCEPTION,\n  E_MISSING_PRIMARY_KEY_EXCEPTION,\n  E_RECORD_NOT_FOUND_EXCEPTION,\n  E_INVALID_PAYLOAD_EXCEPTION,\n  E_FORBIDDEN_PAYLOAD_EXCEPTION,\n  E_INVALID_RELATIONSHIP_EXCEPTION,\n  E_BULK_UPDATE_SEARCH_UNKNOWN_EXCEPTION,\n  E_INVALID_AGGREGATION_FIELD,\n  E_INVALID_AGGREGATION_OPERATION,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { EventMap, Key, Listener } from '@nhtio/tiny-typed-emitter'\nimport type { NormalizeConstructor } from '@adonisjs/core/types/helpers'\nimport type { Schema, AnySchema, ObjectSchema } from '@nhtio/validation'\nimport type { RelationshipsContract } from '@adonisjs/lucid/types/relations'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\nimport type { ComputedOptions, LucidModel, ModelColumnOptions } from '@adonisjs/lucid/types/model'\nimport type {\n  ExternalDocumentationObject,\n  PromiseAble,\n  ResourcefulAccessControlFilter,\n  ResourcefulColumnDefinition,\n  ResourcefulComputedAccessorDefinition,\n  ResourcefulDataType,\n  ResourcefulGeneralAccessControlFilter,\n  ResourcefulModelColumnMetaSchema,\n  ResourcefulModelComputedAccessorMetaSchema,\n  ResourcefulModelMetaSchema,\n  ResourcefulModelOpenApiSchema,\n  ResourcefulModelRelationshipMetaSchema,\n  ResourcefulPropertySchema,\n  ResourcefulRelationshipDefinition,\n  ResourcefulResourceAccessControlFilter,\n  ValidationScoper,\n  ResourcefulModelSerializableAttributes,\n} from '@nhtio/lucid-resourceful/types'\n\n/**\n * Result object returned by the resourceful index/list operation.\n *\n * Contains paginated records along with metadata about the query execution\n * and pagination state. The records are filtered according to field-level\n * access control and only contain the requested fields.\n *\n * @template ReturnType - The shape of records after field selection and ACL filtering\n */\nexport interface ResourcefulIndexResult<ReturnType = any> {\n  /** Array of records with only the requested and accessible fields */\n  records: Array<Partial<ReturnType>>\n  /** Total number of records matching the filter (before pagination) */\n  total: number\n  /** The current page number (1-based) */\n  page: number\n  /** Number of records per page */\n  perPage: number\n  /** Aggregation results organized by field name and operation type */\n  aggregations: ResourcefulIndexAggregateResults\n  /** SQL query string used for counting total records */\n  countQuery: string\n  /** SQL query string used for fetching the paginated records */\n  recordsQuery: string\n}\n\nexport interface ServableResourcefulIndexResult<ReturnType = any> extends Omit<\n  ResourcefulIndexResult<ReturnType>,\n  'countQuery' | 'recordsQuery'\n> {}\n\n/**\n * Function type for generating payload validation schemas based on request context.\n *\n * These functions are called during create and update operations to generate\n * context-specific validation schemas using Joi. They provide the core model-level\n * validation that applies regardless of request-specific hooks.\n *\n * @param ctx - HTTP context containing request information and authentication\n * @param app - Application service instance for accessing app-level services\n * @returns Promise resolving to a Joi schema for validating the request payload\n */\nexport interface ResourcefulPayloadValidatorGetter {\n  (ctx: HttpContext, app: ApplicationService): PromiseAble<AnySchema>\n}\n\n/**\n * Function type for generating request-specific payload validation schemas.\n *\n * These functions are provided via hooks during create and update operations\n * to add additional validation constraints beyond the base model validation.\n * They enable request-specific validation logic based on context.\n *\n * @param ctx - HTTP context containing request information and authentication\n * @param app - Application service instance for accessing app-level services\n * @returns Promise resolving to a Joi ObjectSchema for additional validation, or null to skip\n */\nexport interface ResourcefulPayloadSchemaGetter {\n  (ctx: HttpContext, app: ApplicationService): PromiseAble<ObjectSchema | null>\n}\n\n/**\n * Function type for applying query-level scoping to database queries.\n *\n * These callbacks are applied to queries during CRUD operations to enforce\n * data access boundaries based on request context. They modify the query\n * in-place by adding WHERE clauses, JOINs, or other constraints.\n *\n * @param ctx - HTTP context containing request information and authentication\n * @param app - Application service instance for accessing app-level services\n * @param query - Database query builder to modify with scoping constraints\n * @param model - The resourceful model class the query is being built for\n * @returns Promise that resolves when the query has been modified\n */\nexport interface ResourcefulQueryScopeCallback {\n  (\n    ctx: HttpContext,\n    app: ApplicationService,\n    query: DatabaseQueryBuilderContract,\n    model: ResourcefulModel\n  ): PromiseAble<void>\n}\n\ninterface BoundResourcefulQueryScopeCallback {\n  (\n    uid: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    query: DatabaseQueryBuilderContract,\n    model: ResourcefulModel\n  ): PromiseAble<void>\n}\n\n/**\n * Array of query scope callback functions.\n *\n * Used for operations that need to apply query-level scoping (index, read, delete).\n * Callbacks are applied in sequence to build up the complete set of access constraints.\n */\nexport type ResourcefulScopeHooks = ResourcefulQueryScopeCallback[]\n\n/**\n * Array of payload validation schema getter functions.\n *\n * Used for operations that accept request payloads (create, update).\n * Each function can return additional validation constraints based on request context.\n */\nexport type ResourcefulValidationHooks = ResourcefulPayloadSchemaGetter[]\n\n/**\n * Combined hook interface providing both query scoping and payload validation.\n *\n * Used by the update operation which needs both query scoping (to find the record)\n * and payload validation (to validate the update data).\n */\nexport interface ResourcefulHooks {\n  /** Query scope callbacks for constraining database queries */\n  queryScopeCallbacks: ResourcefulScopeHooks\n  /** Payload validation schema getters for additional validation */\n  payloadValidationSchemas: ResourcefulValidationHooks\n}\n\nexport type ResourcefulMixinEventMap<\n  Model extends LucidModel = LucidModel,\n  ModelInstance = InstanceType<Model>,\n> = EventMap<{\n  'acl:error': [unknown, HttpContext, ApplicationService, ModelInstance | undefined]\n  'validation:scope:error': [unknown, HttpContext, ApplicationService, string, ResourcefulDataType]\n}>\n\n/**\n * Enhanced Lucid model interface providing resourceful CRUD functionality.\n *\n * This interface extends the base LucidModel with metadata-driven CRUD operations,\n * field-level access control, query scoping, OpenAPI schema generation, and event\n * handling capabilities. Models implementing this interface gain static methods\n * for handling HTTP requests with built-in validation, pagination, filtering,\n * and comprehensive security features.\n *\n * The interface defines both metadata storage properties and operational methods\n * that work together to provide a complete resourceful API layer on top of\n * AdonisJS Lucid ORM models.\n *\n * @extends LucidModel\n *\n * @example\n * ```typescript\n * import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'\n * import { withResourceful, resourceful } from 'lucid-resourceful'\n *\n * class User extends withResourceful()(BaseModel) implements ResourcefulModel {\n *   @column({ isPrimary: true })\n *   @resourceful({ type: 'number', nullable: false })\n *   public id: number\n *\n *   @column()\n *   @resourceful({ type: 'string', nullable: false })\n *   public name: string\n *\n *   // Automatically gains all ResourcefulModel methods\n *   // User.$onResourcefulIndex, User.$onResourcefulRead, etc.\n * }\n * ```\n */\nexport interface ResourcefulModel extends LucidModel {\n  /** The display name for this model used in API documentation and error messages */\n  $resourcefulName: string\n\n  /** The column used as the title of the model instance when displayed in a list */\n  $resourcefulTitleColumn?: string\n\n  /** Optional description for OpenAPI schema documentation */\n  $resourcefulMetaDescription?: string\n\n  /** Optional external documentation reference for OpenAPI schema */\n  $resourcefulMetaExternalDocs?: ExternalDocumentationObject\n\n  /** Optional example value for OpenAPI schema documentation */\n  $resourcefulMetaExample?: string\n\n  /** Map of column property names to their resourceful metadata definitions */\n  $resourcefulColumns: Map<string, ResourcefulColumnDefinition<ResourcefulPropertySchema>>\n\n  /** Map of relationship property names to their resourceful metadata definitions */\n  $resourcefulRelationships: Map<string, ResourcefulRelationshipDefinition>\n\n  /** Map of computed accessor property names to their resourceful metadata definitions */\n  $resourcefulComputedAccessors: Map<\n    string,\n    ResourcefulComputedAccessorDefinition<ResourcefulPropertySchema>\n  >\n\n  /** Set of enforced preloads for the model */\n  $resourcefulEnforcedPreloads: Set<string>\n\n  /** Access control filter functions organized by CRUD operation type */\n  $resourcefulAccessControlFilters: ResourcefulMixinOptions['accessControlFilters']\n\n  /** Error handling strategy when ACL evaluation fails */\n  $resourcefulOnACLError: ResourcefulMixinOptions['onACLError']\n\n  /** Query scope callback functions for constraining database queries */\n  $resourcefulQueryScopeCallbacks: ResourcefulMixinOptions['queryScopeCallbacks']\n\n  /** Payload validation schema builder functions for create and update operations */\n  $resourcefulPayloadValidationSchemaBuilders: ResourcefulMixinOptions['payloadValidationSchemaBuilders']\n\n  /**\n   * Registers an event listener for resourceful model events.\n   *\n   * This method provides a way to listen for events emitted during resourceful\n   * operations such as ACL errors or validation scope errors. Useful for logging,\n   * monitoring, or implementing custom error handling logic.\n   *\n   * @template K - The event key type from the resourceful event map\n   * @param event - The name of the event to listen for ('acl:error', 'validation:scope:error')\n   * @param listener - Function to call when the event is emitted\n   * @returns The model class for method chaining\n   *\n   * @example\n   * ```typescript\n   * User.$onResourcefulEvent('acl:error', (error, ctx, app, instance) => {\n   *   console.error('ACL error occurred:', error);\n   * });\n   * ```\n   */\n  $onResourcefulEvent<K>(\n    event: Key<K, ResourcefulMixinEventMap<ResourcefulModel>>,\n    listener: Listener<K, ResourcefulMixinEventMap<ResourcefulModel>>\n  ): this\n\n  /**\n   * Registers a one-time event listener for resourceful model events.\n   *\n   * Similar to $onResourcefulEvent but the listener is automatically removed\n   * after being called once. Useful for handling events that should only\n   * trigger a single response.\n   *\n   * @template K - The event key type from the resourceful event map\n   * @param event - The name of the event to listen for\n   * @param listener - Function to call when the event is emitted\n   * @returns The model class for method chaining\n   *\n   * @example\n   * ```typescript\n   * User.$onceResourcefulEvent('validation:scope:error', (error, ctx, app, key, datatype) => {\n   *   console.warn('Validation scope error (one-time):', error);\n   * });\n   * ```\n   */\n  $onceResourcefulEvent<K>(\n    event: Key<K, ResourcefulMixinEventMap<ResourcefulModel>>,\n    listener: Listener<K, ResourcefulMixinEventMap<ResourcefulModel>>\n  ): this\n\n  /**\n   * Removes an event listener for resourceful model events.\n   *\n   * Unregisters a previously registered event listener. If no listener is\n   * provided, all listeners for the specified event are removed.\n   *\n   * @template K - The event key type from the resourceful event map\n   * @param event - The name of the event to stop listening for\n   * @param listener - Optional specific listener function to remove\n   * @returns The model class for method chaining\n   *\n   * @example\n   * ```typescript\n   * // Remove specific listener\n   * User.$offResourcefulEvent('acl:error', myErrorHandler);\n   *\n   * // Remove all listeners for an event\n   * User.$offResourcefulEvent('acl:error');\n   * ```\n   */\n  $offResourcefulEvent<K>(\n    event: Key<K, ResourcefulMixinEventMap<ResourcefulModel>>,\n    listener?: Listener<K, ResourcefulMixinEventMap<ResourcefulModel>>\n  ): this\n\n  $getAsResourcefulForContext(\n    ctx: HttpContext,\n    app: ApplicationService\n  ): Promise<ResourcefulModelMetaSchema>\n\n  $getResourcefulWriteValidationSchema(\n    ctx: HttpContext,\n    app: ApplicationService,\n    forUpdate?: boolean\n  ): Promise<{\n    schema: ResourcefulModelOpenApiSchema\n    validator: ObjectSchema<any>\n  }>\n\n  /**\n   * Performs paginated listing and searching of model records with comprehensive filtering and aggregations.\n   *\n   * This method provides the core implementation for resourceful index/list operations,\n   * supporting pagination, field selection, access control, aggregations, and Lucene query syntax for\n   * filtering. It validates all inputs, applies ACL filters, executes the query with\n   * proper field mapping between serialized names and database columns, and returns\n   * structured results with query metadata and computed aggregations.\n   *\n   * @template SelectedFields - Array of field names that can be selected from the model's serializable attributes\n   * @template ReturnType - The resulting type after picking the selected fields from the model's serializable attributes\n   *\n   * @param filter - Lucene-style query string for filtering records (e.g., \"name:john AND email:*.com\").\n   *                 If null or undefined, defaults to empty string (no filtering).\n   * @param page - The page number for pagination (must be ≥ 1). Used with perPage to calculate offset.\n   * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100 by default).\n   * @param fields - Array of field names to include in the response. If null, undefined, or empty,\n   *                 defaults to just the primary key field. Field names should use serialized names\n   *                 (as they appear in API responses), not database column names.\n   * @param sort - Array of sort specifications as [fieldName, direction] tuples. Field names must be\n   *               marked as sortable in their column definitions.\n   * @param ctx - HTTP context containing request information, authentication, and other request-scoped data.\n   * @param app - Application service instance providing access to application-level services and configuration.\n   * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints.\n   * @param aggregations - Optional object specifying aggregations to compute. Maps field names to arrays\n   *                       of aggregation methods. Only fields marked as aggregatable can be aggregated.\n   *\n   * @returns Promise resolving to ResourcefulIndexResult containing:\n   *   - `records`: Array of partial record objects with only the requested fields\n   *   - `total`: Total number of records matching the filter (before pagination)\n   *   - `page`: The requested page number (echoed back)\n   *   - `perPage`: The requested per-page limit (echoed back)\n   *   - `aggregations`: Computed aggregation results organized by field and method\n   *   - `countQuery`: SQL query string used for counting total records\n   *   - `recordsQuery`: SQL query string used for fetching the actual records\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   * @throws {E_INVALID_COLUMN_ACCESS} When no fields are available for access after ACL filtering\n   * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n   * @throws {E_INVALID_AGGREGATION_FIELD} When attempting to aggregate on non-aggregatable fields\n   * @throws {E_INVALID_AGGREGATION_OPERATION} When using invalid aggregation methods\n   *\n   * @example\n   * ```typescript\n   * // Basic usage with pagination\n   * const result = await User.$onResourcefulIndex(\n   *   'name:john',\n   *   1,\n   *   10,\n   *   ['id', 'name', 'email'],\n   *   null,\n   *   ctx,\n   *   app\n   * );\n   *\n   * // Complex filtering with date ranges and aggregations\n   * const result = await User.$onResourcefulIndex(\n   *   'status:active AND createdAt:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]',\n   *   2,\n   *   25,\n   *   ['id', 'name', 'totalSales'],\n   *   [['createdAt', 'desc']],\n   *   ctx,\n   *   app,\n   *   [],\n   *   {\n   *     totalSales: ['sum', 'avg', 'max'],\n   *     orderCount: ['sum'],\n   *     customerId: ['countDistinct']\n   *   }\n   * );\n   * ```\n   */\n  $onResourcefulIndex(\n    filter: string | null | undefined,\n    page: number,\n    perPage: number,\n    fields: string | string[] | null | undefined,\n    sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks,\n    aggregations?: ResourcefulIndexAggregateOptions\n  ): Promise<ResourcefulIndexResult<{ [key: string]: any }>>\n\n  /**\n   * Retrieves a single model record by its unique identifier with access control.\n   *\n   * This method implements secure record retrieval by first applying query scope callbacks\n   * to verify the record exists within the user's access scope, then fetching the full\n   * model instance for field-level ACL evaluation. Only fields that pass ACL checks\n   * are included in the response.\n   *\n   * @param uid - The unique identifier of the record to retrieve\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints\n   *\n   * @returns Promise resolving to the record object with only accessible fields\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Retrieve a user by ID\n   * const user = await User.$onResourcefulRead(123, ctx, app);\n   *\n   * // With additional query scoping\n   * const user = await User.$onResourcefulRead(123, ctx, app, [\n   *   (ctx, app, query) => query.where('tenant_id', ctx.auth.user.tenantId)\n   * ]);\n   * ```\n   */\n  $onResourcefulRead(\n    uid: number,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks\n  ): Promise<any>\n\n  /**\n   * Loads a specific relationship for a model record with pagination, filtering, and access control.\n   *\n   * This method provides paginated relationship loading by leveraging the related model's\n   * $onResourcefulIndex method with automatically generated relationship constraints.\n   * It supports full filtering, sorting, and pagination capabilities while maintaining\n   * proper access control and scoping.\n   *\n   * @param uid - The unique identifier of the parent record\n   * @param relationshipKey - The name of the relationship property to load\n   * @param filter - Lucene-style query string for filtering related records\n   * @param page - The page number for pagination (must be ≥ 1)\n   * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100)\n   * @param fields - Array of field names to include in the response from the related model\n   * @param sort - Array of sort criteria as [field, direction] tuples\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of additional query scope callbacks\n   *\n   * @returns Promise resolving to paginated relationship results\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_INVALID_RELATIONSHIP_EXCEPTION} When the specified relationship doesn't exist\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n   *\n   * @example\n   * ```typescript\n   * // Load user's posts with filtering and pagination\n   * const userPosts = await Post.$onResourcefulReadRelationship(\n   *   123,                    // user ID\n   *   'posts',               // relationship name\n   *   'status:published',    // filter\n   *   1,                     // page\n   *   10,                    // perPage\n   *   ['id', 'title'],       // fields\n   *   [['createdAt', 'desc']], // sort\n   *   ctx,\n   *   app\n   * );\n   *\n   * // Load user's skills (many-to-many)\n   * const userSkills = await Skill.$onResourcefulReadRelationship(\n   *   123,\n   *   'skills',\n   *   null,  // no filter\n   *   1,\n   *   50,\n   *   null,  // all fields\n   *   null,  // default sort\n   *   ctx,\n   *   app\n   * );\n   * ```\n   */\n  $onResourcefulReadRelationship(\n    uid: any,\n    relationshipKey: string,\n    filter: string | null | undefined,\n    page: number,\n    perPage: number,\n    fields: string | string[] | null | undefined,\n    sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks,\n    aggregations?: ResourcefulIndexAggregateOptions\n  ): Promise<ResourcefulIndexResult<{ [key: string]: any }>>\n\n  /**\n   * Creates a new model record with payload validation and access control.\n   *\n   * This method handles secure record creation by validating the request payload\n   * against both model-level and request-specific validation schemas, checking\n   * field-level write permissions, and returning the created record with appropriate\n   * field filtering applied.\n   *\n   * @param payload - The data object containing field values for the new record\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of validation schema getters for additional payload validation\n   *\n   * @returns Promise resolving to the created record with only accessible fields\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n   * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Create a new user\n   * const user = await User.$onResourcefulCreate({\n   *   name: 'John Doe',\n   *   email: 'john@example.com'\n   * }, ctx, app);\n   *\n   * // With additional validation\n   * const user = await User.$onResourcefulCreate(payload, ctx, app, [\n   *   (ctx, app) => joi.object({ email: joi.string().domain('company.com') })\n   * ]);\n   * ```\n   */\n  $onResourcefulCreate(\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulValidationHooks\n  ): Promise<any>\n\n  /**\n   * Updates an existing model record with payload validation and access control.\n   *\n   * This method implements secure record updates by first verifying the record exists\n   * and is accessible via the read operation, validating the update payload, checking\n   * field-level write permissions, and returning the updated record with appropriate\n   * field filtering applied.\n   *\n   * @param uid - The unique identifier of the record to update\n   * @param payload - The data object containing field values to update\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional object containing query scope callbacks and validation schema getters\n   *\n   * @returns Promise resolving to the updated record with only accessible fields\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n   * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n   * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n   * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Update a user\n   * const user = await User.$onResourcefulUpdate(123, {\n   *   name: 'Jane Doe'\n   * }, ctx, app);\n   *\n   * // With additional scoping and validation\n   * const user = await User.$onResourcefulUpdate(123, payload, ctx, app, {\n   *   queryScopeCallbacks: [(ctx, app, query) => query.where('active', true)],\n   *   payloadValidationSchemas: [(ctx, app) => customValidationSchema]\n   * });\n   * ```\n   */\n  $onResourcefulUpdate(\n    uid: number,\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: Partial<ResourcefulHooks>\n  ): Promise<any>\n\n  /**\n   * Deletes an existing model record with access control.\n   *\n   * This method implements secure record deletion by applying query scope callbacks\n   * to verify the record exists within the user's access scope, checking delete\n   * permissions via ACL filters, and then removing the record from the database.\n   *\n   * @param uid - The unique identifier of the record to delete\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints\n   *\n   * @returns Promise that resolves when the record has been successfully deleted\n   *\n   * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n   * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n   * @throws {E_FORBIDDEN} When access is denied by model-level ACL filters\n   *\n   * @example\n   * ```typescript\n   * // Delete a user\n   * await User.$onResourcefulDelete(123, ctx, app);\n   *\n   * // With additional query scoping\n   * await User.$onResourcefulDelete(123, ctx, app, [\n   *   (ctx, app, query) => query.where('tenant_id', ctx.auth.user.tenantId)\n   * ]);\n   * ```\n   */\n  $onResourcefulDelete(\n    uid: number,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: ResourcefulScopeHooks\n  ): Promise<void>\n\n  $onResourcefulBulkUpdate(\n    filter: string | null | undefined,\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: Partial<ResourcefulHooks>\n  ): Promise<\n    | {\n        [key: string]: any | Error\n      }\n    | Error\n  >\n\n  $onResourcefulBulkUpdateByUid(\n    uids: (number | string)[],\n    payload: any,\n    ctx: HttpContext,\n    app: ApplicationService,\n    hooks?: Partial<ResourcefulHooks>\n  ): Promise<{\n    [key: string]: any | Error\n  }>\n\n  /**\n   * Generates an OpenAPI schema object for this model with context-aware field filtering.\n   *\n   * This method creates a complete OpenAPI v3 schema representation of the model\n   * by evaluating field-level access control permissions for the given request context.\n   * Only fields that pass ACL checks are included in the generated schema, ensuring\n   * that API documentation accurately reflects what data is accessible to the current user.\n   *\n   * The method processes all resourceful properties (columns, computed accessors, and\n   * relationships) and converts them to their OpenAPI schema equivalents while respecting\n   * access control constraints and applying proper type mappings.\n   *\n   * @param ctx - HTTP context containing request information and authentication\n   * @param app - Application service instance for accessing app-level services\n   * @param operation - The type of operation. To honor field-level ACL\n   *\n   * @returns Promise resolving to a complete OpenAPI schema object with:\n   *   - `type`: Always 'object' for model schemas\n   *   - `title`: The model's resourceful name\n   *   - `description`: Optional model description from metadata\n   *   - `properties`: Object containing schema definitions for accessible fields\n   *   - `required`: Array of required field names (non-nullable fields)\n   *   - `externalDocs`: Optional external documentation reference\n   *   - `example`: Optional example value for the schema\n   *\n   * @example\n   * ```typescript\n   * // Generate OpenAPI schema for current user context\n   * const schema = await User.$asOpenApiSchemaObject(ctx, app, 'read');\n   *\n   * // Result structure:\n   * {\n   *   type: 'object',\n   *   title: 'User',\n   *   properties: {\n   *     id: { type: 'number', readOnly: true },\n   *     name: { type: 'string' },\n   *     email: { type: 'string', format: 'email' }\n   *   },\n   *   required: ['id', 'name', 'email']\n   * }\n   * ```\n   *\n   * @see {@link ResourcefulModelOpenApiSchema} for the complete schema structure\n   */\n  $asOpenApiSchemaObject(\n    ctx: HttpContext,\n    app: ApplicationService,\n    operation?: 'read' | 'write',\n    methodOptions?: GenerateModelSchemaOptions\n  ): Promise<ResourcefulModelOpenApiSchema>\n\n  /**\n   * Creates a new model instance from HTTP context data.\n   *\n   * @param ctx - The HTTP context containing the request data\n   * @returns A Promise that resolves to a new model instance\n   */\n  $createFromHttpContext(ctx: HttpContext): Promise<InstanceType<this>>\n}\n\nexport const ResourcefulErrorHandlerMethod = [\n  'bubble' as 'bubble',\n  'pass' as 'pass',\n  'fail' as 'fail',\n]\nexport type ResourcefulErrorHandlerMethod = (typeof ResourcefulErrorHandlerMethod)[number]\nexport const ResourcefulACLOperationType = ['read' as 'read', 'write' as 'write']\nexport type ResourcefulACLOperationType = (typeof ResourcefulACLOperationType)[number]\n\n/**\n * Supported aggregation methods for numeric fields in resourceful queries.\n *\n * These methods can be applied to fields marked as `aggregatable: true` in their\n * column definitions to compute statistical values across filtered datasets.\n *\n * @example\n * ```typescript\n * // Request aggregations on sales data\n * const result = await Order.$onResourcefulIndex('status:completed', 1, 10, ['id'], null, ctx, app, [], {\n *   totalAmount: ['sum', 'avg', 'max'],\n *   quantity: ['sum', 'countDistinct']\n * })\n * ```\n */\nexport const ResourcefulAggregateMethods = [\n  'avg' as 'avg',\n  'min' as 'min',\n  'max' as 'max',\n  'sum' as 'sum',\n  'countDistinct' as 'countDistinct',\n  'sumDistinct' as 'sumDistinct',\n  'avgDistinct' as 'avgDistinct',\n]\nexport type ResourcefulAggregateMethods = (typeof ResourcefulAggregateMethods)[number]\n\n/**\n * Configuration object for specifying aggregations to perform on index operations.\n *\n * Maps field names to arrays of aggregation methods to compute. Only fields marked\n * as `aggregatable: true` in their column definitions can be aggregated.\n *\n * @example\n * ```typescript\n * const aggregations: ResourcefulIndexAggregateOptions = {\n *   totalSales: ['sum', 'avg', 'max', 'min'],\n *   orderCount: ['sum'],\n *   customerId: ['countDistinct']\n * }\n * ```\n */\nexport interface ResourcefulIndexAggregateOptions {\n  [key: string]: ResourcefulAggregateMethods[]\n}\n\n/**\n * Results object containing computed aggregation values organized by field and method.\n *\n * The structure mirrors the requested aggregations, with each field containing\n * the computed values for the requested aggregation methods.\n *\n * @example\n * ```typescript\n * const results: ResourcefulIndexAggregateResults = {\n *   totalSales: { sum: 50000, avg: 125.5, max: 999.99, min: 10.00 },\n *   orderCount: { sum: 400 },\n *   customerId: { countDistinct: 150 }\n * }\n * ```\n */\nexport interface ResourcefulIndexAggregateResults {\n  [key: string]: Partial<Record<ResourcefulAggregateMethods, number>>\n}\n\ntype ResourcefulCheckAccessOptions<\n  Model extends LucidModel = LucidModel,\n  ResourcefulModelInstance = InstanceType<Model>,\n> = { ctx: HttpContext; app: ApplicationService } & (\n  | { operation: CRUDOperationsEnum.LIST | CRUDOperationsEnum.CREATE; instance?: undefined }\n  | {\n      operation: CRUDOperationsEnum.READ | CRUDOperationsEnum.UPDATE | CRUDOperationsEnum.DELETE\n      instance: ResourcefulModelInstance\n    }\n)\n\nexport interface AdvancedResourcefulMixinOptions {\n  propertyEvaluationConcurrency: number\n  aclEvaluationConcurrency: number\n}\n\nexport interface ResourcefulMixinOptions<\n  Model extends LucidModel = LucidModel,\n  ModelInstance = InstanceType<Model>,\n> {\n  name: string\n  resourcefulTitleColumn?: string\n  readRequiredForWrite: boolean\n  accessControlFilters: {\n    list: ResourcefulGeneralAccessControlFilter[]\n    create: ResourcefulGeneralAccessControlFilter[]\n    read: ResourcefulResourceAccessControlFilter<Model, ModelInstance>[]\n    update: ResourcefulResourceAccessControlFilter<Model, ModelInstance>[]\n    delete: ResourcefulResourceAccessControlFilter<Model, ModelInstance>[]\n  }\n  payloadValidationSchemaBuilders: {\n    create: ResourcefulPayloadValidatorGetter[]\n    update: ResourcefulPayloadValidatorGetter[]\n  }\n  onACLError: ResourcefulErrorHandlerMethod\n  onValidationScopeError: ResourcefulErrorHandlerMethod\n  queryScopeCallbacks: {\n    list: ResourcefulQueryScopeCallback[]\n    access: ResourcefulQueryScopeCallback[]\n  }\n  description?: string\n  externalDocs?: ExternalDocumentationObject\n  example?: string\n  advanced: AdvancedResourcefulMixinOptions\n  // allows for forcing a relationship to be preloaded even if it wouldn't normally\n  // due to it being the wrong kind (i.e. many to many)\n  enforcedPreloads?: string[]\n}\n\ntype ResourcefulCheckAccessReturn =\n  | {\n      isForbidden: true\n      message: string\n      allowedSerializedMap?: undefined\n      allowedColumnsMap?: undefined\n    }\n  | {\n      isForbidden: false\n      message?: undefined\n      allowedSerializedMap: Map<string, boolean>\n      allowedColumnsMap: Map<string, boolean>\n    }\n\nconst getFieldKey = (\n  key: string,\n  definition: ModelColumnOptions | ComputedOptions | ReturnType<LucidModel['$getRelation']>\n) => {\n  if (isString(definition.serializeAs)) {\n    return definition.serializeAs as string | null\n  }\n  return key\n}\n\nfunction StaticImplements<T>() {\n  return (_t: T) => {}\n}\n\nconst filterablePropertiesForModelCache = new Map<\n  LucidModel | (LucidModel & ResourcefulModel),\n  string[]\n>()\n\nconst filterableLocalPropertiesForModelCache = new Map<\n  LucidModel | (LucidModel & ResourcefulModel),\n  string[]\n>()\n\nconst getFilterableLocalPropertiesFromModel = (\n  model: LucidModel | (LucidModel & ResourcefulModel)\n) => {\n  const cached = filterableLocalPropertiesForModelCache.get(model)\n  if (cached) {\n    return cached\n  }\n  const filterableLocalProperties: string[] = []\n  if (guards.isResourcefulModel(model)) {\n    model.$resourcefulColumns.forEach((definition, key) => {\n      if (definition.filterable) {\n        const lucidOptions = model.$getColumn(key)\n        if (lucidOptions) {\n          const filterableKey = getFieldKey(key, lucidOptions)\n          if (filterableKey) {\n            filterableLocalProperties.push(filterableKey)\n          }\n        }\n      }\n    })\n  }\n  const returnable = Array.from(new Set(filterableLocalProperties)) // Ensure uniqueness\n  filterableLocalPropertiesForModelCache.set(model, returnable)\n  return returnable\n}\n\nconst getFilterablePropertiesFromModel = (\n  model: LucidModel | (LucidModel & ResourcefulModel),\n  depth: number = 0\n): { [key: string]: any } => {\n  if (depth > 1) {\n    // Prevent infinite recursion in case of circular relationships\n    return []\n  }\n  const cached = filterablePropertiesForModelCache.get(model)\n  if (cached) {\n    return cached\n  }\n  const definitions: Map<\n    string,\n    | ResourcefulColumnDefinition<any>\n    | ResourcefulComputedAccessorDefinition<any>\n    | ResourcefulRelationshipDefinition<LucidModel>\n  > = new Map()\n  const filterablePropertiesRaw: string[] = []\n  filterablePropertiesRaw.push(...getFilterableLocalPropertiesFromModel(model))\n  if (guards.isResourcefulModel(model)) {\n    filterablePropertiesRaw.forEach((field) => {\n      const definition =\n        model.$resourcefulColumns.get(field) || model.$resourcefulComputedAccessors.get(field)\n      if (definition) {\n        definitions.set(field, definition)\n      }\n    })\n    model.$resourcefulRelationships.forEach((_definition, key) => {\n      const lucidOptions = model.$getRelation(key)\n      if (lucidOptions) {\n        const relationshipKey = getFieldKey(key, lucidOptions)\n        const relatedModel = lucidOptions.relatedModel()\n        if (relationshipKey && guards.isResourcefulModel(relatedModel)) {\n          const relatedFilterableFields = Object.entries(\n            getFilterablePropertiesFromModel(relatedModel, depth + 1)\n          )\n          relatedFilterableFields.forEach(([relatedField, relatedFieldDefinitionType]) => {\n            const relatedFilterableField = [relationshipKey, relatedField].join('.')\n            filterablePropertiesRaw.push(relatedFilterableField)\n            definitions.set(relatedFilterableField, { type: relatedFieldDefinitionType } as any)\n          })\n        }\n      }\n    })\n  }\n  const returnable = Object.assign(\n    {},\n    ...Array.from(new Set(filterablePropertiesRaw)).map((k) => {\n      const def = definitions.get(k)\n      if (!def) {\n        return { [k]: { type: 'unknown' } }\n      }\n      if ('type' in def) {\n        return { [k]: def.type }\n      }\n      return { [k]: { type: 'unknown' } }\n    })\n  )\n  filterablePropertiesForModelCache.set(model, returnable)\n  return returnable\n}\n\nconst capitalizeFirstLetterOfString = (str: string): string => {\n  if (typeof str !== 'string' || str.length === 0) {\n    return str\n  }\n  return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nconst getAggregationResults = (\n  desired: ResourcefulIndexAggregateOptions,\n  results: { total: number; [key: string]: number }\n): ResourcefulIndexAggregateResults => {\n  const ret: ResourcefulIndexAggregateResults = {}\n  Object.keys(desired).forEach((key) => {\n    const methods = desired[key]\n    if (methods.length > 0) {\n      ret[key] = {}\n      methods.forEach((method) => {\n        const desiredForMethodKey = [key, capitalizeFirstLetterOfString(method)].join('')\n        if (results[desiredForMethodKey] !== undefined && results[desiredForMethodKey] !== null) {\n          switch (method) {\n            default:\n              ret[key][method] = Number(results[desiredForMethodKey])\n              break\n          }\n        }\n      })\n    }\n  })\n  return ret\n}\n\n/**\n * Creates a mixin that adds resourceful CRUD functionality to Lucid models.\n *\n * This function implements the mixin pattern to enhance AdonisJS Lucid models with\n * metadata-driven CRUD operations, field-level access control, query scoping,\n * and OpenAPI schema generation capabilities. The resulting model gains static\n * methods for handling HTTP requests with built-in validation, pagination,\n * filtering, and security features.\n *\n * The mixin validates and normalizes configuration options, creates isolated\n * metadata maps for each model class to prevent inheritance conflicts, and\n * establishes an event emitter for monitoring ACL and validation operations.\n *\n * @param options - Configuration object for customizing mixin behavior\n * @param options.name - Display name for the model (defaults to class name)\n * @param options.readRequiredForWrite - Whether read access is required before write operations\n * @param options.accessControlFilters - Object containing arrays of ACL filter functions for different operations\n * @param options.accessControlFilters.list - Filters applied during listing/search operations\n * @param options.accessControlFilters.create - Filters applied during record creation\n * @param options.accessControlFilters.read - Filters applied during record reading\n * @param options.accessControlFilters.update - Filters applied during record updates\n * @param options.accessControlFilters.delete - Filters applied during record deletion\n * @param options.onACLError - Error handling strategy when ACL evaluation fails ('throw', 'pass', 'fail')\n * @param options.onValidationScopeError - Error handling strategy when validation scope functions fail\n * @param options.queryScopeCallbacks - Object containing query scope callback functions\n * @param options.queryScopeCallbacks.list - Callbacks applied to listing/search queries\n * @param options.queryScopeCallbacks.access - Callbacks applied to individual record access queries\n * @param options.description - Optional description for OpenAPI documentation\n * @param options.externalDocs - Optional external documentation reference for OpenAPI\n * @param options.example - Optional example value for OpenAPI documentation\n * @param options.advanced - Advanced configuration options for performance tuning\n * @param options.advanced.propertyEvaluationConcurrency - Concurrency limit for property ACL evaluation\n * @param options.advanced.aclEvaluationConcurrency - Concurrency limit for ACL filter evaluation\n *\n * @returns A mixin function that accepts a Lucid model class and returns the enhanced model\n *\n * @throws {E_INVALID_RESOURCEFUL_MIXIN_OPTIONS} When the provided options fail validation\n *\n * @example\n * ```typescript\n * import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'\n * import { withResourceful, resourceful } from 'lucid-resourceful'\n *\n * class User extends withResourceful({\n *   name: 'User',\n *   readRequiredForWrite: true,\n *   accessControlFilters: {\n *     read: [(ctx) => ctx.auth.user?.id === ctx.params.id],\n *     update: [(ctx) => ctx.auth.user?.isAdmin]\n *   }\n * })(BaseModel) {\n *   @column({ isPrimary: true })\n *   @resourceful({ type: 'number', nullable: false })\n *   public id: number\n *\n *   @column()\n *   @resourceful({ type: 'string', nullable: false })\n *   public name: string\n * }\n *\n * // Generated controller with CRUD operations\n * const UserController = User.generateController()\n * ```\n *\n * @see {@link ResourcefulMixinOptions} for detailed configuration options\n * @see {@link ResourcefulModel} for the enhanced model interface\n */\nexport function withResourceful(\n  options: Partial<ResourcefulMixinOptions> = {}\n): <Model extends NormalizeConstructor<typeof BaseModel>>(\n  superclass: Model\n) => Model & ResourcefulModel {\n  return <Model extends NormalizeConstructor<typeof BaseModel>>(\n    superclass: Model\n  ): Model & ResourcefulModel => {\n    const optionsSchema = joi.object<ResourcefulMixinOptions>({\n      name: joi.string().default(superclass.name),\n      resourcefulTitleColumn: joi.string().optional(),\n      readRequiredForWrite: joi.boolean().default(false),\n      accessControlFilters: joi\n        .object({\n          list: joi.array().items(joi.function()).default([]),\n          create: joi.array().items(joi.function()).default([]),\n          read: joi.array().items(joi.function()).default([]),\n          update: joi.array().items(joi.function()).default([]),\n          delete: joi.array().items(joi.function()).default([]),\n        })\n        .default({}),\n      onACLError: joi\n        .string()\n        .valid(...ResourcefulErrorHandlerMethod)\n        .default('throw'),\n      onValidationScopeError: joi\n        .string()\n        .valid(...ResourcefulErrorHandlerMethod)\n        .default('throw'),\n      queryScopeCallbacks: joi\n        .object({\n          list: joi.array().items(joi.function()).default([]),\n          access: joi.array().items(joi.function()).default([]),\n        })\n        .default({}),\n      payloadValidationSchemaBuilders: joi\n        .object({\n          create: joi.array().items(joi.function()).default([]),\n          update: joi.array().items(joi.function()).default([]),\n        })\n        .default({ create: [], update: [] }),\n      description: joi.string().optional(),\n      externalDocs: joi\n        .object<ExternalDocumentationObject>({\n          description: joi.string().optional(),\n          url: joi.string().uri().required(),\n        })\n        .optional(),\n      example: joi.string().optional(),\n      advanced: joi\n        .object<AdvancedResourcefulMixinOptions>({\n          propertyEvaluationConcurrency: joi.number().integer().min(1).default(10),\n          aclEvaluationConcurrency: joi.number().integer().min(1).default(2),\n        })\n        .default({\n          propertyEvaluationConcurrency: 10,\n          aclEvaluationConcurrency: 2,\n        }),\n      enforcedPreloads: joi.array().items(joi.string()).optional(),\n    })\n\n    const { error, value: validatedOptions } = optionsSchema.validate(options, {\n      abortEarly: true,\n    }) as { error?: ValidationError; value: ResourcefulMixinOptions<Model> }\n\n    if (error) {\n      throw new E_INVALID_RESOURCEFUL_MIXIN_OPTIONS(options.name || superclass.name, error)\n    }\n\n    // Ensure each class gets its own non-inherited static Maps\n    const ensureOwnResourcefulMap = <T>(cls: any, key: string): Map<string, T> => {\n      if (!Object.prototype.hasOwnProperty.call(cls, key) || !(cls[key] instanceof Map)) {\n        return new Map()\n      }\n      return cls[key]\n    }\n\n    const resourcefulColumns = ensureOwnResourcefulMap<\n      ResourcefulColumnDefinition<ResourcefulPropertySchema>\n    >(superclass, '$resourcefulColumns')\n    const resourcefulRelationships = ensureOwnResourcefulMap<ResourcefulRelationshipDefinition>(\n      superclass,\n      '$resourcefulRelationships'\n    )\n    const resourcefulComputedAccessors = ensureOwnResourcefulMap<\n      ResourcefulComputedAccessorDefinition<ResourcefulPropertySchema>\n    >(superclass, '$resourcefulComputedAccessors')\n\n    const resourcefulModelEventEmitter = new TypedEventEmitter<\n      ResourcefulMixinEventMap<Model & ResourcefulModel>\n    >()\n\n    /**\n     * Separates payload fields into regular fields and setter fields based on resourceful metadata.\n     *\n     * @param payload - The payload object to separate\n     * @param resourcefulCols - Map of column definitions from the model\n     * @param resourcefulAccessors - Map of computed accessor definitions from the model\n     * @returns Object with regularFields and setterFields\n     */\n    const separatePayloadFields = (\n      payload: Record<string, any>,\n      resourcefulCols: Map<string, any>,\n      resourcefulAccessors: Map<string, any>\n    ): {\n      regularFields: Record<string, any>\n      setterFields: Record<string, any>\n    } => {\n      const regularFields: Record<string, any> = {}\n      const setterFields: Record<string, any> = {}\n\n      for (const [key, value] of Object.entries(payload)) {\n        // Check if it's a writable computed accessor (setter)\n        const computedAccessor = resourcefulAccessors?.get(key)\n        if (computedAccessor) {\n          setterFields[key] = value\n          continue\n        }\n\n        // Check if it's a regular column\n        const column = resourcefulCols?.get(key)\n        if (column) {\n          regularFields[key] = value\n        }\n\n        // If not in either map, skip the field\n      }\n\n      return { regularFields, setterFields }\n    }\n\n    StaticImplements<ResourcefulModel>()\n    class ResourcefulModel extends superclass {\n      declare static readonly $resourcefulName: string\n      declare static readonly $resourcefulTitleColumn?: string\n      declare static $resourcefulMetaDescription?: string\n      declare static $resourcefulMetaExternalDocs?: ExternalDocumentationObject\n      declare static $resourcefulMetaExample?: string\n      static $resourcefulColumns: Map<\n        string,\n        ResourcefulColumnDefinition<ResourcefulPropertySchema>\n      > = resourcefulColumns\n      static $resourcefulRelationships: Map<string, ResourcefulRelationshipDefinition> =\n        resourcefulRelationships\n      static $resourcefulComputedAccessors: Map<\n        string,\n        ResourcefulComputedAccessorDefinition<ResourcefulPropertySchema>\n      > = resourcefulComputedAccessors\n      declare static $resourcefulEnforcedPreloads: Set<string>\n      declare static $resourcefulAccessControlFilters: ResourcefulMixinOptions['accessControlFilters']\n      declare static $resourcefulOnACLError: ResourcefulMixinOptions['onACLError']\n      declare static $resourcefulQueryScopeCallbacks: ResourcefulMixinOptions['queryScopeCallbacks']\n      declare static $resourcefulPayloadValidationSchemaBuilders: ResourcefulMixinOptions['payloadValidationSchemaBuilders']\n      static weakCacheService = new WeakCacheService()\n\n      /**\n       * Hook that runs before creating a new record.\n       * Validates the payload using the configured payloadValidationSchemaBuilders.\n       */\n      @beforeCreate()\n      static async $resourcefulValidateBeforeCreate(model: InstanceType<Model & ResourcefulModel>) {\n        if (!(model instanceof ResourcefulModel)) {\n          return null\n        }\n\n        // @ts-expect-error\n        await model.constructor.$resourcefulValidatePayload(model, 'create')\n      }\n\n      /**\n       * Hook that runs before updating an existing record.\n       * Validates the payload using the configured payloadValidationSchemaBuilders.\n       */\n      @beforeUpdate()\n      static async $resourcefulValidateBeforeUpdate(model: InstanceType<Model & ResourcefulModel>) {\n        if (!(model instanceof ResourcefulModel)) {\n          return null\n        }\n\n        // @ts-expect-error\n        await model.constructor.$resourcefulValidatePayload(model, 'update')\n      }\n\n      /**\n       * Internal method to validate payload using payloadValidationSchemaBuilders.\n       * Attempts to get HttpContext, or creates a dummy context if not available.\n       */\n      protected static async $resourcefulValidatePayload(\n        model: InstanceType<Model & ResourcefulModel>,\n        operation: 'create' | 'update'\n      ) {\n        const validationGetters = validatedOptions.payloadValidationSchemaBuilders?.[operation]\n        if (!validationGetters || validationGetters.length === 0) {\n          return\n        }\n\n        // Try to get the HttpContext and app\n        let ctx: HttpContext\n        let app: ApplicationService\n        try {\n          const { default: appInstance } = await import('@adonisjs/core/services/app')\n          app = appInstance\n\n          const context = HttpContext.get()\n          if (context) {\n            ctx = context\n          } else {\n            // Create a dummy context when real context is not available\n            ctx = new HttpContextFactory().create()\n          }\n        } catch {\n          // If we can't get the app instance, skip validation\n          // This allows the model to be used in environments where AdonisJS is not fully initialized\n          return\n        }\n\n        // Extract the payload from the model's dirty attributes\n        const payload = model.$dirty\n\n        // Validate the payload\n        const validationError = await this.$validatePayloadWithValidationGetters(\n          ctx,\n          app,\n          payload,\n          { isUpdate: operation === 'update' }\n        )\n\n        if (validationError) {\n          throw new E_INVALID_PAYLOAD_EXCEPTION(validationError)\n        }\n      }\n\n      /**\n       * Creates a new model instance from HTTP context data with validation.\n       *\n       * @param ctx - The HTTP context containing the request data\n       * @returns A Promise that resolves to a new validated model instance\n       * @throws {ValidationError} When validation fails for any of the matching schemas\n       */\n      static async $createFromHttpContext(ctx: HttpContext): Promise<InstanceType<Model>> {\n        const payload = ctx.request.all()\n        const instance = new this()\n\n        const { regularFields, setterFields } = separatePayloadFields(\n          payload || {},\n          this.$resourcefulColumns,\n          this.$resourcefulComputedAccessors\n        )\n\n        // Use native .fill() for regular fields\n        instance.fill(regularFields)\n\n        // Use Object.assign for setter fields to trigger setters\n        Object.assign(instance, setterFields)\n\n        return instance as unknown as InstanceType<Model>\n      }\n\n      /**\n       * Merges HTTP context data into the current model instance.\n       *\n       * @param ctx - The HTTP context containing the request data to merge\n       * @returns A Promise that resolves to the current model instance after merging and validation\n       * @throws {ValidationError} When validation fails for any of the matching schemas\n       */\n      $mergeFromHttpContext(ctx: HttpContext): this {\n        const payload = ctx.request.all()\n\n        const { regularFields, setterFields } = separatePayloadFields(\n          payload || {},\n          // @ts-expect-error\n          this.constructor.$resourcefulColumns,\n          // @ts-expect-error\n          this.constructor.$resourcefulComputedAccessors\n        )\n\n        // Use native .merge() for regular fields\n        this.merge(regularFields as any)\n\n        // Use Object.assign for setter fields to trigger setters\n        Object.assign(this, setterFields)\n\n        return this\n      }\n\n      static $onResourcefulEvent<K>(\n        event: Key<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>,\n        listener: Listener<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>\n      ) {\n        resourcefulModelEventEmitter.on(event, listener)\n        return this\n      }\n\n      static $onceResourcefulEvent<K>(\n        event: Key<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>,\n        listener: Listener<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>\n      ) {\n        resourcefulModelEventEmitter.once(event, listener)\n        return this\n      }\n\n      static $offResourcefulEvent<K>(\n        event: Key<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>,\n        listener?: Listener<K, ResourcefulMixinEventMap<Model & ResourcefulModel>>\n      ) {\n        resourcefulModelEventEmitter.off(event, listener)\n        return this\n      }\n\n      static async $getAsResourcefulForContext(\n        ctx: HttpContext,\n        app: ApplicationService\n      ): Promise<ResourcefulModelMetaSchema> {\n        const resourcefulModelMetaSchema: ResourcefulModelMetaSchema = {\n          name: validatedOptions.name,\n          properties: {},\n          description: this.$resourcefulMetaDescription,\n          externalDocs: this.$resourcefulMetaExternalDocs,\n          example: this.$resourcefulMetaExample,\n        }\n        await pMap(\n          Array.from(this.$resourcefulColumns.entries()),\n          async ([propertyKey, columnDefinition]) => {\n            const lucidDefinitions = this.$getColumn(propertyKey)\n            /* istanbul ignore if -- @preserve */\n            if (!lucidDefinitions) return\n            const resourcefulModelColumnMetaSchema: ResourcefulModelColumnMetaSchema = {\n              propertyKey,\n              definition: columnDefinition,\n              lucidDefinitions,\n              ...(await this.$getPropertyCanReadWrite(\n                ctx,\n                app,\n                propertyKey,\n                lucidDefinitions,\n                columnDefinition.readAccessControlFilters,\n                columnDefinition.writeAccessControlFilters,\n                'column'\n              )),\n              kind: 'column',\n              validator: this.$getPropertyValidator(\n                ctx,\n                app,\n                propertyKey,\n                columnDefinition.type,\n                columnDefinition.nullable,\n                columnDefinition.validationScopes as any,\n                'column'\n              ),\n              filterable: columnDefinition.filterable,\n              sortable: columnDefinition.sortable,\n              aggregatable: columnDefinition.aggregatable,\n            }\n            if (\n              !resourcefulModelColumnMetaSchema.canRead &&\n              !resourcefulModelColumnMetaSchema.canWrite\n            )\n              return\n            resourcefulModelMetaSchema.properties[propertyKey] = resourcefulModelColumnMetaSchema\n          },\n          {\n            concurrency: validatedOptions.advanced.propertyEvaluationConcurrency,\n          }\n        )\n        await pMap(\n          Array.from(this.$resourcefulComputedAccessors.entries()),\n          async ([propertyKey, computedAccessorDefinition]) => {\n            const lucidDefinitions = this.$getComputed(propertyKey)\n            /* istanbul ignore if -- @preserve */\n            if (!lucidDefinitions) return\n            const resourcefulModelComputedAccessorMetaSchema: ResourcefulModelComputedAccessorMetaSchema =\n              {\n                propertyKey,\n                definition: computedAccessorDefinition,\n                lucidDefinitions,\n                ...(await this.$getPropertyCanReadWrite(\n                  ctx,\n                  app,\n                  propertyKey,\n                  lucidDefinitions,\n                  computedAccessorDefinition.readAccessControlFilters,\n                  computedAccessorDefinition.writeAccessControlFilters,\n                  'computedAccessor',\n                  computedAccessorDefinition.writable\n                )),\n                kind: 'computedAccessor',\n                validator: this.$getPropertyValidator(\n                  ctx,\n                  app,\n                  propertyKey,\n                  computedAccessorDefinition.type,\n                  computedAccessorDefinition.nullable,\n                  computedAccessorDefinition.validationScopes as any,\n                  'computedAccessor',\n                  computedAccessorDefinition.writable\n                ),\n              }\n            /* istanbul ignore if -- @preserve */\n            if (\n              !resourcefulModelComputedAccessorMetaSchema.canRead &&\n              !resourcefulModelComputedAccessorMetaSchema.canWrite\n            )\n              return\n            resourcefulModelMetaSchema.properties[propertyKey] =\n              resourcefulModelComputedAccessorMetaSchema\n          },\n          {\n            concurrency: validatedOptions.advanced.propertyEvaluationConcurrency,\n          }\n        )\n        await pMap(\n          Array.from(this.$resourcefulRelationships.entries()),\n          async ([propertyKey, relationshipDefinition]) => {\n            const lucidDefinitions = this.$getRelation(propertyKey)\n            /* istanbul ignore if -- @preserve */\n            if (!lucidDefinitions) return\n            const resourcefulModelRelationshipMetaSchema: ResourcefulModelRelationshipMetaSchema = {\n              propertyKey,\n              definition: relationshipDefinition,\n              lucidDefinitions,\n              ...(await this.$getPropertyCanReadWrite(\n                ctx,\n                app,\n                propertyKey,\n                lucidDefinitions,\n                relationshipDefinition.readAccessControlFilters,\n                relationshipDefinition.writeAccessControlFilters,\n                'relationship'\n              )),\n              kind: 'relationship',\n              validator: joi.forbidden(),\n              relatedModel: relationshipDefinition.relatedModel,\n              filterable: getFilterablePropertiesFromModel(relationshipDefinition.relatedModel()),\n            }\n            /* istanbul ignore if -- @preserve */\n            if (\n              !resourcefulModelRelationshipMetaSchema.canRead &&\n              !resourcefulModelRelationshipMetaSchema.canWrite\n            )\n              return\n            resourcefulModelMetaSchema.properties[propertyKey] =\n              resourcefulModelRelationshipMetaSchema\n          },\n          {\n            concurrency: validatedOptions.advanced.propertyEvaluationConcurrency,\n          }\n        )\n        return resourcefulModelMetaSchema\n      }\n\n      static $getPropertyValidator(\n        ctx: HttpContext,\n        app: ApplicationService,\n        key: string,\n        datatype: ResourcefulDataType,\n        nullable: boolean,\n        validationScopes: ValidationScoper<AnySchema>[] | undefined,\n        kind: 'column' | 'computedAccessor' | 'relationship',\n        writable: boolean = false\n      ): AnySchema {\n        const cacheKey = `${key}-${datatype.type}-${(<any>datatype).format}-${nullable}-${validationScopes?.length}-${kind}-${writable}`\n        const cachedValue = this.weakCacheService.get(cacheKey)\n\n        if (cachedValue) {\n          return cachedValue\n        }\n\n        if ('relationship' === kind || ('computedAccessor' === kind && !writable)) {\n          // relationships and read-only computed accessors are not acceptable in a payload\n          return joi.any().forbidden()\n        }\n        const baseValidator = this.$getPropertyBaseValidator(datatype, nullable, kind, writable)\n        let retValidator = baseValidator\n        if (Array.isArray(validationScopes) && validationScopes.length > 0) {\n          validationScopes.forEach((validationScope) => {\n            /* istanbul ignore if -- @preserve */\n            if (retValidator !== baseValidator) return\n            try {\n              validationScope(baseValidator)\n            } catch (err) {\n              resourcefulModelEventEmitter.emit(\n                'validation:scope:error',\n                err,\n                ctx,\n                app,\n                key,\n                datatype\n              )\n              switch (validatedOptions.onValidationScopeError) {\n                case 'bubble':\n                  throw err\n                case 'pass':\n                  // do nothing, just pass the validation scope\n                  break\n                case 'fail':\n                  retValidator = joi.any().forbidden()\n                  break\n              }\n            }\n          })\n        }\n\n        this.weakCacheService.create(cacheKey, retValidator)\n\n        return retValidator\n      }\n\n      protected static $getPropertyBaseValidator(\n        datatype: ResourcefulDataType,\n        nullable: boolean,\n        kind: 'column' | 'computedAccessor' | 'relationship',\n        writable: boolean = false\n      ): AnySchema {\n        if ('relationship' === kind || ('computedAccessor' === kind && !writable)) {\n          // relationships and read-only computed accessors are not acceptable in a payload\n          return joi.any().forbidden()\n        }\n        nullable = nullable || ('boolean' === typeof datatype.nullable && datatype.nullable)\n        switch (true) {\n          case guards.isResourcefulDateType(datatype): {\n            /*\n            |--------------------------------------------------------------------------\n            | Dates are a subset of the 'string' type and thus the OpenAPI validator\n            | does not have any specific options for them.\n            |--------------------------------------------------------------------------\n            |\n            | const d: ResourcefulDateType = datatype as unknown as ResourcefulDateType\n            |\n            */\n            let r = joi.datetime()\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulDateTimeType(datatype): {\n            /*\n            |--------------------------------------------------------------------------\n            | DateTimes are a subset of the 'string' type and thus the OpenAPI validator\n            | does not have any specific options for them.\n            |--------------------------------------------------------------------------\n            |\n            | const d: ResourcefulDateTimeType = datatype as unknown as ResourcefulDateTimeType\n            |\n            */\n            let r = joi.datetime()\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulBinaryType(datatype): {\n            const d: ResourcefulBinaryType = datatype as unknown as ResourcefulBinaryType\n            const min = 'number' === typeof d.minLength ? Math.abs(d.minLength) : 0\n            const max =\n              'number' === typeof d.maxLength ? Math.abs(d.maxLength) : Number.MAX_SAFE_INTEGER\n            let r = joi.string().min(min).max(max)\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulStringType(datatype): {\n            const d: ResourcefulStringType = datatype as unknown as ResourcefulStringType\n            let r = joi.string().min(d.minLength).max(d.maxLength)\n            if (d.pattern) {\n              r = r.concat(r.pattern(new RegExp(d.pattern)))\n            }\n            if (d.enum) {\n              const enumStrings = d.enum\n                .map((v) => {\n                  if (isObject(v)) {\n                    return v.value\n                  }\n                  return v\n                })\n                .filter((v) => 'string' === typeof v) as string[]\n              r = r.concat(joi.string().valid(...enumStrings))\n            }\n            if (d.format) {\n              switch (d.format) {\n                case 'alphanum':\n                  r = r.concat(joi.string().alphanum())\n                  break\n                case 'email':\n                  r = r.concat(joi.string().email())\n                  break\n                case 'uppercase':\n                  r = r.concat(joi.string().case('upper'))\n                  break\n                case 'lowercase':\n                  r = r.concat(joi.string().case('lower'))\n                  break\n                case 'creditCard':\n                  r = r.concat(joi.string().creditCard())\n                  break\n                case 'dataUri':\n                  r = r.concat(joi.string().dataUri())\n                  break\n                case 'domain':\n                  r = r.concat(joi.string().domain())\n                  break\n                case 'uuid':\n                case 'guid':\n                  r = r.concat(joi.string().guid())\n                  break\n                case 'hex':\n                  r = r.concat(joi.string().hex())\n                  break\n                case 'hostname':\n                  r = r.concat(joi.string().hostname())\n                  break\n                case 'ip':\n                  r = r.concat(joi.string().ip({ version: ['ipv4', 'ipv6', 'ipvfuture'] }))\n                  break\n                case 'duration':\n                  r = r.concat(joi.string().isoDuration())\n                  break\n                case 'uri':\n                  r = r.concat(joi.string().uri())\n                  break\n                case 'fqdn':\n                  r = r.concat(joi.string().fqdn())\n                  break\n              }\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulIntegerType(datatype): {\n            const d: ResourcefulIntegerType = datatype as unknown as ResourcefulIntegerType\n            let r = joi.number()\n            r = r.concat(joi.number().integer().multiple(d.multipleOf))\n            if (d.exclusiveMaximum) {\n              r = r.concat(joi.number().less(d.maximum))\n            } else {\n              r = r.concat(joi.number().max(d.maximum))\n            }\n            if (d.exclusiveMinimum) {\n              r = r.concat(joi.number().greater(d.minimum))\n            } else {\n              r = r.concat(joi.number().min(d.minimum))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulBigintType(datatype): {\n            const d: ResourcefulBigintType = datatype as unknown as ResourcefulBigintType\n            if ('undefined' === typeof d.minimum) {\n              d.minimum = 0n\n            }\n            if ('undefined' === typeof d.maximum) {\n              d.maximum = BigInt(Number.MAX_SAFE_INTEGER)\n            }\n            if ('undefined' === typeof d.multipleOf) {\n              d.multipleOf = 1n\n            }\n            let b = joi.bigint()\n            let i = joi.number().integer()\n            // @ts-ignore\n            b = b.concat(\n              joi\n                .bigint()\n                .multiple('number' === typeof d.multipleOf ? BigInt(d.multipleOf) : d.multipleOf)\n            )\n            // @ts-ignore\n            i = i.concat(\n              joi\n                .number()\n                .multiple(\n                  'bigint' === typeof d.multipleOf\n                    ? Number.parseInt(d.multipleOf.toString())\n                    : d.multipleOf\n                )\n            )\n            if (d.exclusiveMaximum) {\n              if (['number', 'bigint'].includes(typeof d.maximum)) {\n                // @ts-ignore\n                b = b.concat(\n                  joi.bigint().less('number' === typeof d.maximum ? BigInt(d.maximum) : d.maximum)\n                )\n              }\n              i = i.concat(\n                joi\n                  .number()\n                  .less(\n                    'bigint' === typeof d.maximum\n                      ? Number.parseInt(d.maximum.toString())\n                      : d.maximum\n                  )\n              )\n            } else {\n              if (['number', 'bigint'].includes(typeof d.maximum)) {\n                // @ts-ignore\n                b = b.concat(\n                  joi.bigint().max('number' === typeof d.maximum ? BigInt(d.maximum) : d.maximum)\n                )\n              }\n              i = i.concat(\n                joi\n                  .number()\n                  .max(\n                    'bigint' === typeof d.maximum\n                      ? Number.parseInt(d.maximum.toString())\n                      : d.maximum\n                  )\n              )\n            }\n            if (d.exclusiveMinimum) {\n              // @ts-ignore\n              b = b.concat(\n                joi.bigint().greater('number' === typeof d.minimum ? BigInt(d.minimum) : d.minimum)\n              )\n              i = i.concat(\n                joi\n                  .number()\n                  .greater(\n                    'bigint' === typeof d.minimum\n                      ? Number.parseInt(d.minimum.toString())\n                      : d.minimum\n                  )\n              )\n            } else {\n              // @ts-ignore\n              b = b.concat(\n                joi.bigint().min('number' === typeof d.minimum ? BigInt(d.minimum) : d.minimum)\n              )\n              i = i.concat(\n                joi\n                  .number()\n                  .min(\n                    'bigint' === typeof d.minimum\n                      ? Number.parseInt(d.minimum.toString())\n                      : d.minimum\n                  )\n              )\n            }\n            let r = joi.alternatives(b, i)\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulUnsignedIntegerType(datatype): {\n            const d: ResourcefulUnsignedIntegerType =\n              datatype as unknown as ResourcefulUnsignedIntegerType\n            let r = joi.number().unsafe()\n            r = r.concat(joi.number().integer().multiple(d.multipleOf))\n            if (d.exclusiveMaximum) {\n              r = r.concat(joi.number().less(d.maximum))\n            } else {\n              r = r.concat(joi.number().max(d.maximum))\n            }\n            if (d.exclusiveMinimum) {\n              r = r.concat(joi.number().greater(d.minimum))\n            } else {\n              r = r.concat(joi.number().min(d.minimum))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulNumberType(datatype): {\n            const d: ResourcefulNumberType = datatype as unknown as ResourcefulNumberType\n            let r = joi.number()\n            r = r.concat(joi.number().multiple(d.multipleOf))\n            if (d.exclusiveMaximum) {\n              r = r.concat(joi.number().less(d.maximum))\n            } else {\n              r = r.concat(joi.number().max(d.maximum))\n            }\n            if (d.exclusiveMinimum) {\n              r = r.concat(joi.number().greater(d.minimum))\n            } else {\n              r = r.concat(joi.number().min(d.minimum))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulBooleanType(datatype): {\n            let r = joi.boolean()\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          case guards.isResourcefulObjectType(datatype): {\n            const d: ResourcefulObjectType = datatype as unknown as ResourcefulObjectType\n\n            // Add property validation based on the new structure with composition patterns\n            const objectSchema: { [key: string]: AnySchema } = {}\n\n            Object.entries(d.properties).forEach(([propKey, propDef]) => {\n              let propValidator: AnySchema\n\n              if ('oneOf' in propDef) {\n                // oneOf composition\n                const alternatives = propDef.oneOf.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = joi.alternatives(...alternatives)\n              } else if ('allOf' in propDef) {\n                // allOf composition\n                const schemas = propDef.allOf.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = schemas.reduce((acc, schema) => acc.concat(schema), joi.any())\n              } else if ('anyOf' in propDef) {\n                // anyOf composition\n                const alternatives = propDef.anyOf.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = joi.alternatives(...alternatives)\n              } else if ('not' in propDef) {\n                // not composition\n                const notSchemas = propDef.not.map((item) =>\n                  this.$getPropertyBaseValidator(\n                    item,\n                    item.nullable || false,\n                    kind,\n                    !(item.readOnly || false)\n                  )\n                )\n                propValidator = joi.any()\n                notSchemas.forEach((notSchema) => {\n                  propValidator = propValidator.concat(\n                    joi.when(notSchema, { then: joi.forbidden() })\n                  )\n                })\n              } else {\n                // Direct ResourcefulDataType\n                propValidator = this.$getPropertyBaseValidator(\n                  propDef,\n                  propDef.nullable || false,\n                  kind,\n                  !(propDef.readOnly || false)\n                )\n                if (Array.isArray(d.required) && d.required.includes(propKey)) {\n                  // If the property is required, we need to ensure it is not nullable\n                  propValidator = propValidator.concat(joi.any().required())\n                }\n              }\n\n              // Check if this field should be required\n              if (d.required && d.required.includes(propKey)) {\n                propValidator.required()\n              }\n\n              objectSchema[propKey] = propValidator\n            })\n            let r = joi.object(objectSchema)\n\n            if (d.minProperties !== undefined) {\n              r = r.concat(joi.object().min(d.minProperties))\n            }\n\n            if (d.maxProperties !== undefined) {\n              r = r.concat(joi.object().max(d.maxProperties))\n            }\n\n            if (guards.isObject(d.additionalProperties)) {\n              const additionalPropertiesType = d.additionalProperties as ResourcefulDataType\n              r = r.concat(\n                joi\n                  .object()\n                  .pattern(\n                    joi.string(),\n                    this.$getPropertyBaseValidator(\n                      additionalPropertiesType,\n                      additionalPropertiesType.nullable || false,\n                      kind,\n                      !(additionalPropertiesType.readOnly || false)\n                    )\n                  )\n              )\n            } else {\n              r = r.concat(joi.object().unknown(true === d.additionalProperties))\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n\n            return r\n          }\n          case guards.isResourcefulArrayType(datatype): {\n            const d: ResourcefulArrayType = datatype as unknown as ResourcefulArrayType\n            let r = joi.array()\n            // Handle different item type structures\n            let itemValidator: AnySchema\n            if ('oneOf' in d.items) {\n              // oneOf composition\n              const alternatives = d.items.oneOf.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = joi.alternatives(...alternatives)\n            } else if ('allOf' in d.items) {\n              // allOf composition\n              const schemas = d.items.allOf.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = schemas.reduce((acc, schema) => acc.concat(schema), joi.any())\n            } else if ('anyOf' in d.items) {\n              // anyOf composition\n              const alternatives = d.items.anyOf.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = joi.alternatives(...alternatives)\n            } else if ('not' in d.items) {\n              // not composition\n              const notSchemas = d.items.not.map((item) =>\n                this.$getPropertyBaseValidator(\n                  item,\n                  item.nullable || false,\n                  kind,\n                  !(item.readOnly || false)\n                )\n              )\n              itemValidator = joi.any()\n              notSchemas.forEach((notSchema) => {\n                itemValidator = itemValidator.concat(joi.when(notSchema, { then: joi.forbidden() }))\n              })\n            } else {\n              // Direct ResourcefulDataType\n              itemValidator = this.$getPropertyBaseValidator(\n                d.items,\n                d.items.nullable || false,\n                kind,\n                !(d.items.readOnly || false)\n              )\n            }\n            r = r.concat(joi.array().items(itemValidator))\n            if (d.minItems !== undefined) {\n              r = r.concat(joi.array().min(d.minItems))\n            }\n            if (d.maxItems !== undefined) {\n              r = r.concat(joi.array().max(d.maxItems))\n            }\n            if (d.uniqueItems) {\n              r = r.concat(joi.array().unique())\n            }\n            if (nullable) {\n              r = r.allow(null)\n            }\n            return r\n          }\n          default:\n            return joi.any().forbidden()\n        }\n      }\n\n      protected static async $getPropertyCanReadWrite(\n        ctx: HttpContext,\n        app: ApplicationService,\n        key: string,\n        lucidDefinition:\n          | ModelColumnOptions\n          | ComputedOptions\n          | ReturnType<LucidModel['$getRelation']>,\n        readAclFilters: ResourcefulAccessControlFilter[] = [],\n        writeAclFilters: ResourcefulAccessControlFilter[] = [],\n        kind: 'column' | 'computedAccessor' | 'relationship',\n        writable: boolean = false\n      ): Promise<{ canRead: boolean; canWrite: boolean }> {\n        const fieldKey = getFieldKey(key, lucidDefinition)\n        if (null === fieldKey) {\n          // if the field key is null, that means that the field cannot be \"read\"\n          // this is part of the baseline lucid decorator API, so we need to honor the\n          // expected behavior\n          if (validatedOptions.readRequiredForWrite) {\n            return { canRead: false, canWrite: false }\n          }\n        }\n        const canRead =\n          null === fieldKey ? false : await this.$evaluatePropertyAccess(ctx, app, readAclFilters)\n        const canWrite =\n          'relationship' === kind || ('computedAccessor' === kind && !writable)\n            ? false\n            : await this.$evaluatePropertyAccess(\n                ctx,\n                app,\n                writeAclFilters.length > 0 ? writeAclFilters : readAclFilters\n              )\n        return { canRead, canWrite }\n      }\n\n      protected static async $evaluatePropertyAccess(\n        ctx: HttpContext,\n        app: ApplicationService,\n        acls: ResourcefulAccessControlFilter[] = []\n      ): Promise<boolean> {\n        if (acls.length === 0) {\n          return true\n        }\n        const results = await pMap(\n          acls,\n          async (acl) => {\n            try {\n              return await acl(ctx, app)\n            } catch (err) {\n              resourcefulModelEventEmitter.emit('acl:error', err, ctx, app, undefined)\n              switch (validatedOptions.onACLError) {\n                case 'pass':\n                  return true\n                case 'fail':\n                  return false\n                default:\n                  throw err\n              }\n            }\n          },\n          {\n            concurrency: validatedOptions.advanced.aclEvaluationConcurrency,\n          }\n        )\n        return results.every((result) => result === true)\n      }\n\n      static async $asOpenApiSchemaObject(\n        ctx: HttpContext,\n        app: ApplicationService,\n        operation: 'read' | 'write' = 'read',\n        methodOptions: GenerateModelSchemaOptions = {},\n        asResourceful?: ResourcefulModelMetaSchema\n      ): Promise<ResourcefulModelOpenApiSchema> {\n        const normalizedMethodOptions = {\n          includeRelations: methodOptions.includeRelations ?? false,\n          relationsDeepLevel: methodOptions.relationsDeepLevel ?? null,\n          ctx,\n          app,\n        }\n        // Get the resourceful model metadata with ACL filtering applied\n        const resourcefulModelMetaSchema =\n          asResourceful || (await this.$getAsResourcefulForContext(ctx, app))\n        // Create service instance and delegate to it\n        const service = new OpenApiSchemaService()\n\n        return await service.generateModelSchema(\n          operation,\n          resourcefulModelMetaSchema,\n          normalizedMethodOptions,\n          this\n        )\n      }\n\n      static async $getWritePayloadValidationSchema(\n        ctx: HttpContext,\n        app: ApplicationService,\n        forUpdate: boolean = false\n      ) {\n        const schemas: AnySchema[] = []\n        await pMap(\n          forUpdate\n            ? validatedOptions.payloadValidationSchemaBuilders?.update || []\n            : validatedOptions.payloadValidationSchemaBuilders?.create || [],\n          async (builder) => {\n            const schema = await builder(ctx, app)\n            if (schema) {\n              schemas.push(schema)\n            }\n          },\n          { concurrency: 1 }\n        )\n        let ret = joi.any()\n        schemas.forEach((schema) => {\n          ret = ret.concat(schema)\n        })\n        return ret\n      }\n\n      static async $getResourcefulWriteValidationSchema(\n        ctx: HttpContext,\n        app: ApplicationService,\n        forUpdate: boolean = false\n      ) {\n        const asResourceful = await this.$getAsResourcefulForContext(ctx, app)\n        const schema = await this.$asOpenApiSchemaObject(ctx, app, 'write', {}, asResourceful)\n        const modelJoiSchema = await this.$getWritePayloadValidationSchema(ctx, app, forUpdate)\n\n        let validatorSchema = joi.object(\n          Object.assign(\n            {},\n            ...Object.keys(schema.properties!)\n              .filter((p) => {\n                if (p === this.primaryKey) return false\n                const propSchema: Record<string, any> = schema.properties![p]\n                if (isObject(propSchema)) {\n                  if (\n                    forUpdate &&\n                    (propSchema['x-resourceful-autoupdated'] === true ||\n                      propSchema['x-resourceful-immutable'] === true)\n                  ) {\n                    return false\n                  }\n                  if (\n                    !forUpdate &&\n                    (propSchema['x-resourceful-autocreated'] === true ||\n                      propSchema['x-resourceful-primary-key'] === true)\n                  ) {\n                    return false\n                  }\n                }\n                return true\n              })\n              .map((creatablePropertyKey) => {\n                let validationSchema: Schema = joi.any()\n\n                const prop = asResourceful.properties[creatablePropertyKey]\n                const schemaProp = schema.properties![creatablePropertyKey]\n                if (prop) {\n                  const propValidator = prop.validator\n                  if (propValidator) {\n                    validationSchema = validationSchema.concat(propValidator)\n                  }\n                }\n\n                try {\n                  const extracted = modelJoiSchema.extract(creatablePropertyKey)\n                  if (extracted) {\n                    validationSchema = validationSchema.concat(extracted)\n                  }\n                } catch {\n                  // noop\n                }\n\n                const required =\n                  !forUpdate &&\n                  Array.isArray(schema.required) &&\n                  schema.required.includes(creatablePropertyKey)\n                const nullable = prop && prop.definition && prop.definition.nullable === true\n\n                if (required) {\n                  validationSchema = validationSchema.required()\n                } else {\n                  validationSchema = validationSchema.optional()\n                }\n                // Ensure that nullable is handled\n                if (nullable) {\n                  if (schemaProp && 'type' in schemaProp && schemaProp.type === 'string') {\n                    validationSchema = validationSchema.allow(null)\n                  } else {\n                    validationSchema = joi.alternatives(validationSchema, joi.valid(null))\n                  }\n                }\n\n                return {\n                  [creatablePropertyKey]: validationSchema,\n                }\n              })\n          )\n        )\n\n        // Add custom rules from the Model Schema\n        if (\n          // @ts-expect-error\n          modelJoiSchema._rules &&\n          // @ts-expect-error\n          Array.isArray(modelJoiSchema._rules) &&\n          // @ts-expect-error\n          modelJoiSchema._rules.length\n        ) {\n          // Add .custom() rules\n          // @ts-expect-error\n          modelJoiSchema._rules.forEach((rule: any) => {\n            if (\n              rule.name === 'custom' &&\n              rule.method === 'custom' &&\n              typeof rule.args.method === 'function'\n            ) {\n              validatorSchema = validatorSchema.custom(rule.args.method)\n              return\n            }\n          })\n        }\n\n        // Add dependency rules from the Model Schema\n        if (modelJoiSchema.$_terms?.dependencies?.length) {\n          modelJoiSchema.$_terms?.dependencies.forEach((dep: any) => {\n            // Add .or() rule\n            if (\n              dep.rel === 'or' &&\n              Array.isArray(dep.paths) &&\n              dep.paths.every((path: unknown): path is string => typeof path === 'string')\n            ) {\n              validatorSchema = validatorSchema.or(...dep.paths)\n              return\n            }\n          })\n        }\n\n        return {\n          schema,\n          validator: validatorSchema,\n        }\n      }\n\n      protected static async $resourcefulCheckAccess(\n        config: ResourcefulCheckAccessOptions\n      ): Promise<ResourcefulCheckAccessReturn> {\n        const { ctx, app, operation, instance } = config\n        const allowedSerializedMap = new Map<string, boolean>()\n        const allowedColumnsMap = new Map<string, boolean>()\n        const mixinAccessControlFilters = validatedOptions.accessControlFilters[operation]\n\n        if (mixinAccessControlFilters) {\n          const mixinAccessControlResult = await Promise.all(\n            mixinAccessControlFilters.map((func) => func(ctx, app, instance as any))\n          )\n          const isAllowedByMixinFilters = mixinAccessControlResult.every(Boolean)\n\n          if (!isAllowedByMixinFilters) {\n            return {\n              isForbidden: true,\n              message: 'Access denied by Mixin ACLs.',\n              allowedSerializedMap: undefined,\n            }\n          }\n        }\n\n        // If the operation is DELETE, we don't check the field-level access\n        if (operation === CRUDOperationsEnum.DELETE) {\n          return {\n            isForbidden: false,\n            allowedSerializedMap: allowedSerializedMap,\n            allowedColumnsMap,\n          }\n        }\n\n        const columnsOptions = this.$resourcefulColumns.values()\n        const aclOperation = operationCRUDToACL(operation)\n        const addColumnOptionToallowedSerializedMap = (propertyKey: string) => {\n          const serializedName = this.$keys.attributesToSerialized.resolve(propertyKey)\n          const columnName = this.$keys.serializedToColumns.resolve(serializedName)\n\n          // For write operations, we need to allow fields even if serializeAs is null\n          // In this case, use the column name as the key for the allowed map\n          if (aclOperation === ACLOperationsEnum.WRITE && serializedName === null) {\n            // For write operations with serializeAs: null, use the column name\n            if (columnName) {\n              allowedSerializedMap.set(columnName, true)\n              allowedColumnsMap.set(columnName, true)\n            }\n          } else if ('string' === typeof serializedName) {\n            allowedSerializedMap.set(serializedName, true)\n            if (columnName) {\n              allowedColumnsMap.set(columnName, true)\n            }\n          }\n        }\n\n        for (const columnOptions of columnsOptions) {\n          const propertyACLFilters =\n            aclOperation === ACLOperationsEnum.READ\n              ? columnOptions.readAccessControlFilters\n              : columnOptions.writeAccessControlFilters\n\n          // If a column has no ACLs - it allowed to everyone\n          if (!propertyACLFilters) {\n            addColumnOptionToallowedSerializedMap(columnOptions.propertyKey)\n\n            continue\n          }\n\n          const isAllowed = await this.$evaluatePropertyAccess(ctx, app, propertyACLFilters)\n\n          if (isAllowed) {\n            addColumnOptionToallowedSerializedMap(columnOptions.propertyKey)\n          }\n        }\n\n        // Process computed properties for READ operations\n        if (aclOperation === ACLOperationsEnum.READ) {\n          const computedAccessorsOptions = this.$resourcefulComputedAccessors.values()\n\n          for (const computedAccessorOptions of computedAccessorsOptions) {\n            const propertyACLFilters = computedAccessorOptions.readAccessControlFilters\n\n            // If a computed accessor has no ACLs - it's allowed to everyone\n            if (!propertyACLFilters) {\n              // For computed properties, use the property key directly as the serialized name\n              allowedSerializedMap.set(computedAccessorOptions.propertyKey, true)\n              continue\n            }\n\n            const isAllowed = await this.$evaluatePropertyAccess(ctx, app, propertyACLFilters)\n\n            if (isAllowed) {\n              allowedSerializedMap.set(computedAccessorOptions.propertyKey, true)\n            }\n          }\n\n          // Process relationships for READ operations\n          const relationshipOptions = this.$resourcefulRelationships.values()\n\n          for (const relationshipOption of relationshipOptions) {\n            const propertyACLFilters = relationshipOption.readAccessControlFilters\n\n            // If a relationship has no ACLs - it's allowed to everyone\n            if (!propertyACLFilters) {\n              // For relationships, use the property key directly as the serialized name\n              allowedSerializedMap.set(relationshipOption.propertyKey, true)\n              continue\n            }\n\n            const isAllowed = await this.$evaluatePropertyAccess(ctx, app, propertyACLFilters)\n\n            if (isAllowed) {\n              allowedSerializedMap.set(relationshipOption.propertyKey, true)\n            }\n          }\n        }\n\n        const hasNoAllowedFields = !allowedSerializedMap.size\n\n        if (hasNoAllowedFields) {\n          return {\n            isForbidden: true,\n            message: 'Access denied since user does not has access to at least 1 column.',\n          }\n        }\n\n        return {\n          isForbidden: false,\n          allowedSerializedMap,\n          allowedColumnsMap,\n        }\n      }\n\n      private static $getPrivateKeyAttribute() {\n        let ret: string | undefined\n        this.$columnsDefinitions.forEach((columnOptions, attribute) => {\n          if (\n            columnOptions.serializeAs !== null &&\n            (columnOptions.isPrimary || columnOptions.columnName === this.primaryKey)\n          ) {\n            ret = columnOptions.serializeAs || attribute\n          }\n        })\n        return ret\n      }\n\n      static $loadPossibilitiesForResourcefulRecord() {\n        const allRelationships = Array.from(this.$resourcefulRelationships.entries())\n          .filter(([propertyKey]) => {\n            // Only load relationships that are allowed by ACL for ALL records\n            const relation = this.$getRelation(propertyKey)\n            return !relation ? false : true\n          })\n          .map(([propertyKey]) => propertyKey)\n        const possibleRelationships = Array.from(this.$resourcefulRelationships.entries())\n          .filter(([propertyKey]) => {\n            // Only load relationships that are allowed by ACL for ALL records\n            const relation = this.$getRelation(propertyKey)\n            if (!relation) return false\n            if (relation.serializeAs === null) return false\n            // Check if it's a 1:1 relationship type\n            return relation.type === 'belongsTo' || relation.type === 'hasOne'\n          })\n          .map(([propertyKey]) => propertyKey)\n        const possibleColumns = Array.from(this.$resourcefulColumns.entries())\n          .map(([propertyKey]) => propertyKey)\n          .filter((propertyKey) => {\n            const lucidColumnOptions = this.$getColumn(propertyKey)\n            if (!lucidColumnOptions) return false\n            if (lucidColumnOptions.serializeAs === null) return false\n            return lucidColumnOptions.serializeAs !== null\n          })\n        const possibleComputed = Array.from(this.$resourcefulComputedAccessors.entries())\n          .map(([propertyKey]) => propertyKey)\n          .filter((propertyKey) => {\n            const lucidComputedOptions = this.$getComputed(propertyKey)\n            if (!lucidComputedOptions) return false\n            if (lucidComputedOptions.serializeAs === null) return false\n            return lucidComputedOptions.serializeAs !== null\n          })\n        const possibleFields = Array.from(\n          new Set([...possibleColumns, ...possibleComputed, ...possibleRelationships])\n        )\n          .map((prop) => this.$keys.attributesToSerialized.get(prop) || prop)\n          .filter((s) => 'string' === typeof s)\n        return {\n          allRelationships,\n          possibleRelationships,\n          possibleColumns,\n          possibleComputed,\n          possibleFields,\n        }\n      }\n\n      /**\n       * Performs paginated listing and searching of model records with comprehensive filtering.\n       *\n       * This method provides the core implementation for resourceful index/list operations,\n       * supporting pagination, field selection, access control, and Lucene query syntax for\n       * filtering. It validates all inputs, applies ACL filters, executes the query with\n       * proper field mapping between serialized names and database columns, and returns\n       * structured results with query metadata.\n       *\n       * @template SelectedFields - Array of field names that can be selected from the model's serializable attributes\n       * @template ReturnType - The resulting type after picking the selected fields from the model's serializable attributes\n       *\n       * @param filter - Lucene-style query string for filtering records (e.g., \"name:john AND email:*.com\").\n       *                 If null or undefined, defaults to empty string (no filtering).\n       * @param page - The page number for pagination (must be ≥ 1). Used with perPage to calculate offset.\n       * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100 by default).\n       * @param fields - Array of field names to include in the response. If null, undefined, or empty,\n       *                 defaults to just the primary key field. Field names should use serialized names\n       *                 (as they appear in API responses), not database column names.\n       * @param ctx - HTTP context containing request information, authentication, and other request-scoped data.\n       * @param app - Application service instance providing access to application-level services and configuration.\n       * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints.\n       *\n       * @returns Promise resolving to ResourcefulIndexResult containing:\n       *   - `records`: Array of partial record objects with only the requested fields\n       *   - `total`: Total number of records matching the filter (before pagination)\n       *   - `page`: The requested page number (echoed back)\n       *   - `perPage`: The requested per-page limit (echoed back)\n       *   - `countQuery`: SQL query string used for counting total records\n       *   - `recordsQuery`: SQL query string used for fetching the actual records\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       * @throws {E_INVALID_COLUMN_ACCESS} When no fields are available for access after ACL filtering\n       * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n       *\n       * @example\n       * ```typescript\n       * // Basic usage with pagination\n       * const result = await User.$onResourcefulIndex(\n       *   'name:john',\n       *   1,\n       *   10,\n       *   ['id', 'name', 'email'],\n       *   ctx,\n       *   app\n       * );\n       *\n       * // Complex filtering with date ranges\n       * const result = await User.$onResourcefulIndex(\n       *   'name:john AND createdAt:[2021-01-01T00:00:00Z TO 2021-12-31T23:59:59Z]',\n       *   2,\n       *   25,\n       *   ['id', 'name', 'createdAt'],\n       *   ctx,\n       *   app\n       * );\n       * ```\n       */\n      protected static $formatResourcefulRecord(\n        record: Model & ResourcefulModel,\n        possibleFields: string[],\n        enforcedPossibleFields: string[] = [],\n        deepRelatedFieldsMap?: Map<string, string[]>\n      ): Partial<ResourcefulModelSerializableAttributes<InstanceType<Model & ResourcefulModel>>> {\n        if (null === record || undefined === record) {\n          return record\n        }\n        const result: Partial<\n          ResourcefulModelSerializableAttributes<InstanceType<Model & ResourcefulModel>>\n        > = {}\n        const { possibleFields: allPossibleFields } = this.$loadPossibilitiesForResourcefulRecord()\n        possibleFields = possibleFields.filter(\n          (field) => allPossibleFields.includes(field) || enforcedPossibleFields.includes(field)\n        )\n        possibleFields.forEach((field) => {\n          const attribute = this.$keys.serializedToAttributes.get(field) || field\n          if (!attribute) return\n          const value = record[attribute as keyof typeof record] as any\n          if (value !== undefined) {\n            const resourcefulRelationshipOptions = this.$resourcefulRelationships.get(attribute)\n            if (resourcefulRelationshipOptions) {\n              // if the resulting value is a relationship, we need to use the related model's $formatResourcefulRecord\n              const relatedModel = resourcefulRelationshipOptions.relatedModel() as any\n              if (\n                'function' === typeof relatedModel.$formatResourcefulRecord &&\n                'function' === typeof relatedModel.$loadPossibilitiesForResourcefulRecord\n              ) {\n                const {\n                  possibleFields: relatedPossibleFields,\n                  possibleRelationships: relatedPossibleRelationships,\n                } = relatedModel.$loadPossibilitiesForResourcefulRecord()\n                // Deep serialization is opt-in per relationship key.\n                //\n                // If dot-notation was used for this relationship (e.g. 'user.country'):\n                //   - Only serialize scalars + the explicitly requested nested relationships.\n                //   - Pass a depth-capping map into the recursive call so those nested\n                //     relationships serialize only their own scalars (no further recursion).\n                //\n                // If no dot-notation was used for this relationship (legacy path):\n                //   - Use all relatedPossibleFields and pass no map, preserving the\n                //     original recursive serialization behavior.\n                const requestedNestedRelations = deepRelatedFieldsMap?.get(field)\n                let fieldsForRelated: string[]\n                let nestedDeepRelatedFieldsMap: Map<string, string[]> | undefined\n                if (requestedNestedRelations) {\n                  // Constrain to scalars + explicitly requested nested relationships\n                  fieldsForRelated = relatedPossibleFields.filter(\n                    (f: string) =>\n                      !relatedPossibleRelationships.includes(f) ||\n                      requestedNestedRelations.includes(f)\n                  )\n                  // Cap recursion: each requested nested relationship serializes scalars only\n                  nestedDeepRelatedFieldsMap = new Map(\n                    requestedNestedRelations.map((r: string) => [r, []])\n                  )\n                } else {\n                  // Legacy behavior: serialize all possible fields, no map\n                  fieldsForRelated = relatedPossibleFields\n                  nestedDeepRelatedFieldsMap = undefined\n                }\n                result[\n                  field as keyof ResourcefulModelSerializableAttributes<\n                    InstanceType<Model & ResourcefulModel>\n                  >\n                ] = relatedModel.$formatResourcefulRecord(\n                  value,\n                  fieldsForRelated,\n                  [],\n                  nestedDeepRelatedFieldsMap\n                )\n              } else if ('function' === typeof value.serialize) {\n                result[\n                  field as keyof ResourcefulModelSerializableAttributes<\n                    InstanceType<Model & ResourcefulModel>\n                  >\n                ] = value.serialize()\n              }\n            } else {\n              result[\n                field as keyof ResourcefulModelSerializableAttributes<\n                  InstanceType<Model & ResourcefulModel>\n                >\n              ] = value\n            }\n          }\n        })\n\n        return stripUndefinedValuesFromObject(result) as ResourcefulModelSerializableAttributes<\n          InstanceType<Model & ResourcefulModel>\n        >\n      }\n\n      protected static async $validatePayloadWithValidationGetters(\n        ctx: HttpContext,\n        app: ApplicationService,\n        payload: unknown,\n        methodOptions?: { isUpdate: boolean }\n      ): Promise<ValidationError | null> {\n        const { isUpdate } = methodOptions || {}\n        const { validator } = await this.$getResourcefulWriteValidationSchema(ctx, app, isUpdate)\n\n        const safeValidate = async (): Promise<null | ValidationError> => {\n          try {\n            await validator\n              .db(this.$adapter.modelConstructorClient(this) as any)\n              .validateAsync(payload, { abortEarly: false })\n\n            return null\n          } catch (err) {\n            return err as unknown as ValidationError\n          }\n        }\n\n        const validationError = await safeValidate()\n\n        if (validationError) {\n          // If it's alternatives.all error, it doesn't have relevant error message and details. So we extract them manually.\n          if (\n            validationError.details?.length === 1 &&\n            validationError.details[0].type === 'alternatives.all'\n          ) {\n            const alternativesError = validationError.details[0]\n\n            if (alternativesError.context?.details.length) {\n              validationError.details = alternativesError.context.details\n              validationError.message = alternativesError.context.details[0].message\n            }\n          }\n\n          return validationError\n        }\n\n        return null\n      }\n\n      protected static async $validatePayloadWithPayloadSchemaGetters(\n        ctx: HttpContext,\n        app: ApplicationService,\n        payload: unknown,\n        payloadSchemaGetters: ResourcefulPayloadSchemaGetter[]\n      ) {\n        const resolved = await Promise.all(payloadSchemaGetters.map((getter) => getter(ctx, app)))\n        const schemas = resolved.filter((schema) => schema !== null && schema !== undefined)\n\n        for (const schema of schemas) {\n          const { error: schemaError } = schema.validate(payload)\n\n          if (schemaError) {\n            return schemaError\n          }\n        }\n\n        return null\n      }\n\n      protected static async $resolveStorablePayload(\n        ctx: HttpContext,\n        app: ApplicationService,\n        payload: unknown,\n        validationGetters: ResourcefulPayloadValidatorGetter[],\n        payloadSchemaGetters: ResourcefulPayloadSchemaGetter[]\n      ) {\n        const schemas: Schema[] = []\n        const [schemasFromValidationGetters, schemasFromPayloadSchemaGetters] = await Promise.all([\n          pMap(validationGetters, async (getter) => await getter(ctx, app), { concurrency: 5 }),\n          pMap(payloadSchemaGetters, async (getter) => await getter(ctx, app), { concurrency: 5 }),\n        ])\n        schemasFromValidationGetters\n          .filter((s) => s !== null && s !== undefined)\n          .forEach((s) => {\n            schemas.push(s)\n          })\n        schemasFromPayloadSchemaGetters\n          .filter((s) => s !== null && s !== undefined)\n          .forEach((s) => {\n            schemas.push(s)\n          })\n        const mergables = await pMap(\n          schemas,\n          async (schema) => {\n            try {\n              return await schema.validateAsync(payload, { abortEarly: true, convert: true })\n            } catch {\n              return {}\n            }\n          },\n          { concurrency: 5 }\n        )\n        return Object.assign({}, payload as Record<string, any>, ...mergables) as Record<\n          string,\n          any\n        >\n      }\n\n      protected static $resourcefulGetQueryBuilder() {\n        return this.$adapter.modelConstructorClient(this).query().from(this.table)\n      }\n\n      static async $onResourcefulIndex(\n        filter: string | null | undefined,\n        page: number,\n        perPage: number,\n        fields: string | string[] | null | undefined,\n        sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = [],\n        aggregations: ResourcefulIndexAggregateOptions = {}\n      ): Promise<ResourcefulIndexResult<{ [key: string]: any }>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        if (!isString(filter)) {\n          filter = ''\n        }\n\n        fields = prepareFields(fields, primaryKey)\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          operation: CRUDOperationsEnum.LIST,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Validate Request Details\n        |--------------------------------------------------------------------------\n        */\n        const { allRelationships, possibleRelationships, possibleColumns, possibleComputed } =\n          this.$loadPossibilitiesForResourcefulRecord()\n        // filter out 1:many and many:many relationships since they are not loadable in this context\n        const possibleFields = Array.from(allowedSerializedMap.keys()).filter(\n          (f) =>\n            possibleColumns.includes(f) ||\n            possibleComputed.includes(f) ||\n            !allRelationships.includes(f) ||\n            possibleRelationships.includes(f)\n        )\n        if (possibleFields.length === 0) {\n          throw new E_INVALID_COLUMN_ACCESS('No fields available for access')\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Deep related fields (dot-notation) support\n        |--------------------------------------------------------------------------\n        |\n        | Fields like \"tenantPaymentServiceProvider.tenant\" request nested\n        | relationship preloading. We separate them from flat fields before\n        | Joi validation, validate them independently, and merge the root\n        | relationships back into the flat field list so the existing\n        | preload/serialization logic picks them up.\n        |\n        */\n        /**\n         * Deep related fields (dot-notation) support.\n         *\n         * Requesting `['id', 'user.country']` will:\n         * 1. Validate that `user` is a loadable resourceful relationship\n         * 2. Validate that `country` is a loadable relationship on the related model\n         * 3. Preload `country` as a nested sub-query on `user`\n         *\n         * Only one level of dot-notation is supported (e.g. `user.country`).\n         * Multi-level nesting (e.g. `user.country.regions`) is explicitly rejected.\n         *\n         * Note: When a root relationship is included (either explicitly or\n         * auto-included via dot-notation), the related model is serialized with\n         * **all** its possible fields — not just the nested fields requested via\n         * dot-notation. This is consistent with flat relationship serialization\n         * behavior in `$formatResourcefulRecord`.\n         */\n        const deepRelatedFields: Map<string, string[]> = new Map()\n        const flatFieldSet: Set<string> = new Set()\n        if (Array.isArray(fields)) {\n          for (const f of fields) {\n            const dotIndex = f.indexOf('.')\n            if (dotIndex > 0) {\n              const root = f.substring(0, dotIndex)\n              const nested = f.substring(dotIndex + 1)\n              // Reject multi-level nesting (e.g. 'user.country.regions')\n              if (nested.includes('.')) {\n                throw new E_INVALID_COLUMN_ACCESS(\n                  `Only one level of dot-notation deep fields is supported (e.g. \"${root}.${nested.split('.')[0]}\"); deeper nesting like \"${f}\" is not supported`\n                )\n              }\n              // Validate root is a loadable relationship\n              if (!possibleRelationships.includes(root)) {\n                throw new E_INVALID_COLUMN_ACCESS(\n                  `Deep field \"${f}\" references \"${root}\" which is not a valid loadable relationship`\n                )\n              }\n              // Validate nested field is valid on the related model\n              const relDef = this.$resourcefulRelationships.get(root)\n              if (relDef) {\n                const relatedModel = relDef.relatedModel() as any\n                if ('function' === typeof relatedModel.$loadPossibilitiesForResourcefulRecord) {\n                  const { possibleRelationships: relPossibleRelationships } =\n                    relatedModel.$loadPossibilitiesForResourcefulRecord()\n                  if (!relPossibleRelationships.includes(nested)) {\n                    throw new E_INVALID_COLUMN_ACCESS(\n                      `Deep field \"${f}\" references \"${nested}\" which is not a valid loadable relationship on \"${root}\"`\n                    )\n                  }\n                } else {\n                  // Related model is not resourceful — we cannot validate nested\n                  // fields, so fail closed rather than allowing unvalidated preloads\n                  throw new E_INVALID_COLUMN_ACCESS(\n                    `Deep field \"${f}\" cannot be validated: \"${root}\" does not reference a resourceful model`\n                  )\n                }\n              }\n              if (!deepRelatedFields.has(root)) {\n                deepRelatedFields.set(root, [])\n              }\n              deepRelatedFields.get(root)!.push(nested)\n              // Ensure the root relationship is included in flat fields\n              flatFieldSet.add(root)\n            } else {\n              flatFieldSet.add(f)\n            }\n          }\n          fields = Array.from(flatFieldSet)\n        }\n        const schema = joi.object({\n          filter: joi.string().allow('').required(),\n          page: joi.number().integer().min(1).required(),\n          perPage: joi.number().integer().min(1).max(100).required(),\n          fields: joi\n            .array()\n            .items(joi.string().valid(...possibleFields))\n            .required(),\n        })\n        const { error: methodValidationError, value: validatedMethodOptions } = schema.validate(\n          {\n            filter,\n            page,\n            perPage,\n            fields,\n          },\n          {\n            abortEarly: false,\n          }\n        )\n        if (methodValidationError) {\n          throw new E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION(methodValidationError)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Create the baseline query\n        |--------------------------------------------------------------------------\n        */\n        let query = luceneToLucid(\n          validatedMethodOptions.filter,\n          this.$adapter.modelConstructorClient(this),\n          this.$keys.serializedToColumns,\n          primaryKey,\n          this.table,\n          possibleFields,\n          this\n        )\n        /*\n        |--------------------------------------------------------------------------\n        | Apply Resourceful Query Scope Callbacks\n        |--------------------------------------------------------------------------\n        */\n        for (const scopeCallback of [\n          ...(this.$resourcefulQueryScopeCallbacks.list || []),\n          ...hooks,\n        ]) {\n          await scopeCallback(ctx, app, query, this)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Split into separate queries for count and results\n        |--------------------------------------------------------------------------\n        */\n        const countQuery = query.clone<{ total: number; [key: string]: number }>()\n        const recordsQuery = query.clone()\n        const privateKeyColumn = this.$keys.attributesToColumns.get(primaryKey)!\n        countQuery.count('*', 'total')\n        Object.keys(aggregations).forEach((aggKey) => {\n          const desired = aggregations[aggKey]\n          const fieldColumn = this.$keys.serializedToColumns.get(aggKey)\n          const resourcefulDefinition = this.$resourcefulColumns.get(aggKey)\n          if (!fieldColumn || !resourcefulDefinition || !resourcefulDefinition.aggregatable) {\n            throw new E_INVALID_AGGREGATION_FIELD(aggKey, this.$resourcefulName)\n          }\n          const uniqueDesired = new Set(desired)\n          uniqueDesired.forEach((desiredAggregation) => {\n            switch (desiredAggregation) {\n              case 'avg':\n                countQuery.avg(fieldColumn, [aggKey, 'Avg'].join(''))\n                break\n              case 'min':\n                countQuery.min(fieldColumn, [aggKey, 'Min'].join(''))\n                break\n              case 'max':\n                countQuery.max(fieldColumn, [aggKey, 'Max'].join(''))\n                break\n              case 'sum':\n                countQuery.sum(fieldColumn, [aggKey, 'Sum'].join(''))\n                break\n              case 'countDistinct':\n                countQuery.countDistinct(fieldColumn, [aggKey, 'CountDistinct'].join(''))\n                break\n              case 'sumDistinct':\n                countQuery.sumDistinct(fieldColumn, [aggKey, 'SumDistinct'].join(''))\n                break\n              case 'avgDistinct':\n                countQuery.avgDistinct(fieldColumn, [aggKey, 'AvgDistinct'].join(''))\n                break\n              default:\n                throw new E_INVALID_AGGREGATION_OPERATION(\n                  desiredAggregation,\n                  this.$resourcefulName,\n                  aggKey\n                )\n            }\n          })\n        })\n        recordsQuery\n          .select(privateKeyColumn)\n          .forPage(validatedMethodOptions.page, validatedMethodOptions.perPage)\n\n        if (Array.isArray(sort) && sort.length > 0) {\n          sort.forEach(([field, direction]) => {\n            const columnName = this.$keys.serializedToColumns.get(field)\n            if (allowedSerializedMap.has(field) && columnName) {\n              recordsQuery.orderBy(columnName, direction)\n            }\n          })\n        }\n\n        const countQueryQuery = countQuery.toQuery()\n        const recordsQueryQuery = recordsQuery.toQuery()\n        /*\n        |--------------------------------------------------------------------------\n        | Retrieve raw results\n        |--------------------------------------------------------------------------\n        */\n        await this.$hooks.runner('before:paginate').run([countQuery, this])\n        const [countResults, rawRecordIds] = await Promise.all([countQuery, recordsQuery])\n        const totalRaw = Number(countResults?.[0]?.total)\n        const rawRecordsUnsortedQuery = this.query().whereIn(\n          privateKeyColumn,\n          rawRecordIds.map((r) => r[privateKeyColumn])\n        )\n        const relationsToSelect = validatedMethodOptions.fields.filter(\n          (field: string) =>\n            allowedSerializedMap.has(field) && possibleRelationships.includes(field)\n        )\n        relationsToSelect.forEach((prop: any) => {\n          const nestedRelations = deepRelatedFields.get(prop)\n          if (nestedRelations && nestedRelations.length > 0) {\n            // Deep preload: preload the root relationship and its nested relationships\n            rawRecordsUnsortedQuery.preload(prop, (subQuery: any) => {\n              for (const nested of nestedRelations) {\n                subQuery.preload(nested)\n              }\n            })\n          } else {\n            rawRecordsUnsortedQuery.preload(prop)\n          }\n        })\n        this.$resourcefulEnforcedPreloads.forEach((prop: string) => {\n          if (!possibleRelationships.includes(prop)) {\n            const rel = this.$getRelation(prop)\n            if (rel) {\n              rawRecordsUnsortedQuery.preload(prop as any)\n            }\n          }\n        })\n        const rawRecordsUnsorted = await rawRecordsUnsortedQuery\n        const rawRecords = rawRecordsUnsorted.sort((a, b) => {\n          const aId = a.$getAttribute(primaryKey)\n          const bId = b.$getAttribute(primaryKey)\n          const rawRecordIdResultsIndexA = rawRecordIds.findIndex(\n            (r) => r[primaryKey].toString() === aId.toString()\n          )\n          const rawRecordIdResultsIndexB = rawRecordIds.findIndex(\n            (r) => r[primaryKey].toString() === bId.toString()\n          )\n          return rawRecordIdResultsIndexA - rawRecordIdResultsIndexB\n        })\n        /*\n        |--------------------------------------------------------------------------\n        | Return results\n        |--------------------------------------------------------------------------\n        */\n        const returnableFields = possibleFields.filter((f) =>\n          !Array.isArray(fields)\n            ? f === primaryKey\n            : fields.length === 0\n              ? f === primaryKey\n              : fields.includes(f)\n        )\n        if (!returnableFields.includes(primaryKey)) {\n          returnableFields.unshift(primaryKey)\n        }\n        const ret = {\n          total: Number.isNaN(totalRaw) ? 0 : totalRaw,\n          page: validatedMethodOptions.page,\n          perPage: validatedMethodOptions.perPage,\n          records: rawRecords.map((record) =>\n            this.$formatResourcefulRecord(record as any, returnableFields, [], deepRelatedFields)\n          ) as Partial<{\n            [key: string]: any\n          }>[],\n          aggregations: getAggregationResults(aggregations, countResults![0]),\n          countQuery: countQueryQuery,\n          recordsQuery: recordsQueryQuery,\n        }\n        const paginator = new SimplePaginator(ret.total, ret.perPage, ret.page, ...ret.records)\n        await this.$hooks.runner('after:paginate').run(paginator)\n        return ret\n      }\n\n      /**\n       * Retrieves a single model record by its unique identifier with access control.\n       *\n       * This method implements secure record retrieval by first applying query scope callbacks\n       * to verify the record exists within the user's access scope, then fetching the full\n       * model instance for field-level ACL evaluation. Only fields that pass ACL checks\n       * are included in the response.\n       *\n       * The dual-fetch pattern ensures security: the first query applies scoping constraints\n       * to verify access, while the second query retrieves the full model for ACL evaluation.\n       *\n       * @param uid - The unique identifier of the record to retrieve\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional array of query scope callbacks to apply additional filtering constraints\n       *\n       * @returns Promise resolving to the record object with only accessible fields\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       */\n      static async $onResourcefulRead(\n        uid: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = []\n      ): Promise<ResourcefulModelSerializableAttributes<Model & ResourcefulModel>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const query = this.$resourcefulGetQueryBuilder()\n\n        const allScopeCallbacks = [...(this.$resourcefulQueryScopeCallbacks.list || []), ...hooks]\n\n        for (const scopeCallback of allScopeCallbacks) {\n          await scopeCallback(ctx, app, query, this)\n        }\n\n        const recordRaw = await query.where(this.primaryKey, uid).select(this.primaryKey).first()\n\n        if (!recordRaw) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n\n        const rid = recordRaw[this.primaryKey]\n\n        const recordQuery = this.query().where(this.primaryKey, rid)\n        const { possibleRelationships, possibleFields } =\n          this.$loadPossibilitiesForResourcefulRecord()\n        possibleRelationships.forEach((prop: any) => {\n          recordQuery.preload(prop)\n        })\n        this.$resourcefulEnforcedPreloads.forEach((prop: string) => {\n          if (!possibleRelationships.includes(prop)) {\n            const rel = this.$getRelation(prop)\n            if (rel) {\n              recordQuery.preload(prop as any)\n            }\n          }\n        })\n        const record = await recordQuery.first()\n        if (!record) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          instance: record,\n          operation: CRUDOperationsEnum.READ,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Format and return the result\n        |--------------------------------------------------------------------------\n        */\n        const enforcedPossibleFields: string[] = []\n        if (ctx.request.header('x-resourceful-for') === 'resourceful-ui') {\n          /*\n          |--------------------------------------------------------------------------\n          | Special condition: Resourceful UI Components\n          |--------------------------------------------------------------------------\n          | Resourceful UI components requires that the same fields as the \"write\"\n          | schema be utilized in addition to the fields for the \"read\" schema\n          | in order to allow forms to show the current values correctly, especially\n          | enum and relationship-bound fields.\n          */\n          this.$resourcefulColumns.forEach((opts, col) => {\n            // Map<relationship, title>\n            const possible: Map<string, string> = new Map()\n            const processRelationship = (\n              relation: RelationshipsContract,\n              relationshipKey: string\n            ) => {\n              relation.boot()\n              switch (relation.type) {\n                case 'hasOne':\n                case 'belongsTo': {\n                  if (relation.foreignKey === col) {\n                    const relationship = this.$resourcefulRelationships.get(relationshipKey)\n                    const lucidRelationship = this.$relationsDefinitions.get(relationshipKey)\n                    if (!relationship || !lucidRelationship) return\n                    const relatedModel = relationship.relatedModel()\n                    if (!guards.isResourcefulModel(relatedModel)) return\n                    const title = guards.isString(lucidRelationship.serializeAs)\n                      ? lucidRelationship.serializeAs || relationshipKey\n                      : relationshipKey\n                    possible.set(col, title || col)\n                  }\n                  break\n                }\n              }\n            }\n            if (\n              'relationshipKey' in opts &&\n              'string' === typeof opts.relationshipKey &&\n              opts.relationshipKey.trim().length > 0\n            ) {\n              const lucidRelationship = this.$relationsDefinitions.get(opts.relationshipKey)\n              if (this.$resourcefulRelationships.has(opts.relationshipKey) && lucidRelationship) {\n                processRelationship(lucidRelationship, opts.relationshipKey)\n              }\n            } else {\n              this.$relationsDefinitions.forEach(processRelationship)\n            }\n            if (possible.size > 0) {\n              if (possible.size > 1) {\n                // TODO: provide a warning for the developer that multiple relationships were found\n                // for the same column key and that they should specifically define `relationshipKey` in\n                // the column definition to avoid ambiguity\n              }\n              const key = Array.from(possible.keys())[0]\n              allowedSerializedMap.set(key, true)\n              if (!possibleFields.includes(key)) {\n                possibleFields.push(key)\n              }\n              if (!enforcedPossibleFields.includes(key)) {\n                enforcedPossibleFields.push(key)\n              }\n            }\n          })\n        }\n        return this.$formatResourcefulRecord(\n          record as any,\n          possibleFields.filter((f) => allowedSerializedMap.get(f) === true),\n          enforcedPossibleFields\n        ) as ResourcefulModelSerializableAttributes<Model & ResourcefulModel>\n      }\n\n      /**\n       * Loads a specific relationship for a model record with pagination, filtering, and access control.\n       *\n       * This method provides paginated relationship loading by leveraging the related model's\n       * $onResourcefulIndex method with automatically generated relationship constraints.\n       * It supports full filtering, sorting, and pagination capabilities while maintaining\n       * proper access control and scoping.\n       *\n       * The method automatically generates query scope hooks to constrain results to only\n       * records related to the specified parent record, preventing unauthorized data access\n       * and ensuring proper relationship boundaries are maintained.\n       *\n       * @param uid - The unique identifier of the parent record\n       * @param relationshipKey - The name of the relationship property to load\n       * @param filter - Lucene-style query string for filtering related records\n       * @param page - The page number for pagination (must be ≥ 1)\n       * @param perPage - Number of records per page (must be ≥ 1 and ≤ 100)\n       * @param fields - Array of field names to include in the response from the related model\n       * @param sort - Array of sort criteria as [field, direction] tuples\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional array of additional query scope callbacks\n       *\n       * @returns Promise resolving to paginated relationship results with the same structure as $onResourcefulIndex\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_INVALID_RELATIONSHIP_EXCEPTION} When the specified relationship doesn't exist or isn't resourceful\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       * @throws {E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION} When input validation fails\n       *\n       * @example\n       * ```typescript\n       * // Load user's posts with filtering and pagination\n       * const userPosts = await Post.$onResourcefulReadRelationship(\n       *   123,                    // user ID\n       *   'posts',               // relationship name\n       *   'status:published',    // filter\n       *   1,                     // page\n       *   10,                    // perPage\n       *   ['id', 'title'],       // fields\n       *   [['createdAt', 'desc']], // sort\n       *   ctx,\n       *   app\n       * );\n       *\n       * // Load user's skills (many-to-many)\n       * const userSkills = await Skill.$onResourcefulReadRelationship(\n       *   123,\n       *   'skills',\n       *   null,  // no filter\n       *   1,\n       *   50,\n       *   null,  // all fields\n       *   null,  // default sort\n       *   ctx,\n       *   app\n       * );\n       * ```\n       */\n      static async $onResourcefulReadRelationship(\n        uid: any,\n        relationshipKey: string,\n        filter: string | null | undefined,\n        page: number,\n        perPage: number,\n        fields: string | string[] | null | undefined,\n        sort: Array<[string, 'asc' | 'desc']> | null | undefined,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = [],\n        aggregations: ResourcefulIndexAggregateOptions = {}\n      ): Promise<ResourcefulIndexResult<{ [key: string]: any }>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Validate relationship exists and is accessible\n        |--------------------------------------------------------------------------\n        */\n        const relationshipDefinition = this.$resourcefulRelationships.get(relationshipKey)\n        if (!relationshipDefinition) {\n          throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n            `Relationship '${relationshipKey}' not found on model '${this.$resourcefulName}'`\n          )\n        }\n\n        const lucidRelationshipDefinition = this.$getRelation(relationshipKey)\n        if (!lucidRelationshipDefinition) {\n          throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n            `Lucid relationship '${relationshipKey}' not found on model '${this.$resourcefulName}'`\n          )\n        }\n\n        const RelatedModel = relationshipDefinition.relatedModel()\n        if (typeof (RelatedModel as any).$onResourcefulIndex !== 'function') {\n          throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n            `Related model for '${relationshipKey}' does not implement resourceful operations`\n          )\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Generate relationship constraint hook\n        |--------------------------------------------------------------------------\n        */\n        const relationshipHook: BoundResourcefulQueryScopeCallback = async (\n          uuid: any,\n          _hookCtx,\n          _hookApp,\n          query\n        ) => {\n          const relationshipType = (lucidRelationshipDefinition as any).type\n\n          switch (relationshipType) {\n            case 'hasMany':\n              {\n                // For hasMany: WHERE foreign_key = uid\n                const foreignKey = (lucidRelationshipDefinition as any).options.foreignKey\n                if (!foreignKey) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `HasMany relationship '${relationshipKey}' missing foreignKey`\n                  )\n                }\n                const foreignColumn = RelatedModel.$keys.attributesToColumns.get(foreignKey)\n                if (!foreignColumn) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `Foreign key '${foreignKey}' not found in related model columns`\n                  )\n                }\n                query.where(foreignColumn, uuid)\n              }\n              break\n\n            case 'manyToMany':\n              {\n                // For manyToMany: WHERE EXISTS (SELECT 1 FROM pivot_table WHERE ...)\n                const pivotTable = (lucidRelationshipDefinition as any).options.pivotTable\n                const localKey = (lucidRelationshipDefinition as any).options.localKey\n                const relatedKey = (lucidRelationshipDefinition as any).options.relatedKey\n                const pivotForeignKey = (lucidRelationshipDefinition as any).options.pivotForeignKey\n                const pivotRelatedForeignKey = (lucidRelationshipDefinition as any).options\n                  .pivotRelatedForeignKey\n\n                if (\n                  !pivotTable ||\n                  !localKey ||\n                  !relatedKey ||\n                  !pivotForeignKey ||\n                  !pivotRelatedForeignKey\n                ) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `ManyToMany relationship '${relationshipKey}' missing required pivot configuration`\n                  )\n                }\n\n                const relatedColumn = RelatedModel.$keys.attributesToColumns.get(relatedKey)\n                if (!relatedColumn) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `Related key '${relatedKey}' not found in related model columns`\n                  )\n                }\n\n                query.whereExists((subQuery) => {\n                  subQuery\n                    .from(pivotTable)\n                    .select(1)\n                    .whereColumn(\n                      `${pivotTable}.${pivotRelatedForeignKey}`,\n                      `${RelatedModel.table}.${relatedColumn}`\n                    )\n                    .where(`${pivotTable}.${pivotForeignKey}`, uid)\n                })\n              }\n              break\n\n            case 'hasManyThrough':\n              {\n                // For hasManyThrough: WHERE EXISTS (SELECT 1 FROM through_table JOIN related_table ...)\n                const throughModel = (lucidRelationshipDefinition as any).options.throughModel\n                  ? (lucidRelationshipDefinition as any).options.throughModel()\n                  : undefined\n                const foreignKey =\n                  (lucidRelationshipDefinition as any).options.foreignKey || RelatedModel.primaryKey\n                const localKey =\n                  (lucidRelationshipDefinition as any).options.localKey || this.primaryKey\n                const throughForeignKey = (lucidRelationshipDefinition as any).options\n                  .throughForeignKey\n                const throughLocalKey =\n                  (lucidRelationshipDefinition as any).options.throughLocalKey ||\n                  throughModel?.primaryKey\n\n                if (\n                  !throughModel ||\n                  !foreignKey ||\n                  !localKey ||\n                  !throughForeignKey ||\n                  !throughLocalKey\n                ) {\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `HasManyThrough relationship '${relationshipKey}' missing required through configuration`\n                  )\n                }\n\n                // Map attribute names to database columns\n                // foreignKey: through table's column that matches parent's localKey (e.g., tenantId -> tenant_id)\n                const throughForeignKeyColumn =\n                  throughModel.$keys.attributesToColumns.get(foreignKey) || foreignKey\n                // throughLocalKey: through table's primary key (e.g., id)\n                const throughLocalKeyColumn =\n                  throughModel.$keys.attributesToColumns.get(throughLocalKey) || throughLocalKey\n                // throughForeignKey: related table's column that references through table (e.g., tenantPaymentServiceProviderId -> tenant_payment_service_provider_id)\n                const relatedThroughForeignKeyColumn =\n                  RelatedModel.$keys.attributesToColumns.get(throughForeignKey) || throughForeignKey\n\n                if (\n                  !throughForeignKeyColumn ||\n                  !throughLocalKeyColumn ||\n                  !relatedThroughForeignKeyColumn\n                ) {\n                  const missing = [\n                    !throughForeignKeyColumn ? 'throughForeignKeyColumn' : undefined,\n                    !throughLocalKeyColumn ? 'throughLocalKeyColumn' : undefined,\n                    !relatedThroughForeignKeyColumn ? 'relatedThroughForeignKeyColumn' : undefined,\n                  ].filter((x) => x !== undefined)\n                  throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                    `HasManyThrough relationship '${relationshipKey}' has invalid key mappings. Missing: ${missing.join(', ')}`\n                  )\n                }\n\n                query.whereExists((subQuery) => {\n                  subQuery\n                    .from(throughModel.table)\n                    .select(1)\n                    .where(`${throughModel.table}.${throughForeignKeyColumn}`, uid)\n                    .whereColumn(\n                      `${throughModel.table}.${throughLocalKeyColumn}`,\n                      `${RelatedModel.table}.${relatedThroughForeignKeyColumn}`\n                    )\n                    .limit(1)\n                })\n              }\n              break\n\n            default:\n              throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n                `Relationship type '${relationshipType}' is not supported for paginated loading`\n              )\n          }\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Call the related model's index method with the relationship constraint\n        |--------------------------------------------------------------------------\n        */\n        const allHooks = [relationshipHook.bind(null, uid), ...hooks]\n\n        try {\n          return (RelatedModel as any).$onResourcefulIndex(\n            filter,\n            page,\n            perPage,\n            fields,\n            sort,\n            ctx,\n            app,\n            allHooks,\n            aggregations\n          )\n        } catch (err) {\n          if (err instanceof E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION) {\n            throw new E_INVALID_RESOUREFUL_READ_RELATIONSHIP_REQUEST_EXCEPTION(err)\n          } else {\n            throw err\n          }\n        }\n      }\n\n      /**\n       * Creates a new model record with payload validation and access control.\n       *\n       * This method handles secure record creation by validating the request payload\n       * against both model-level and request-specific validation schemas, checking\n       * field-level write permissions, and returning the created record with appropriate\n       * field filtering applied via the read operation.\n       *\n       * @param payload - The data object containing field values for the new record\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional array of validation schema getters for additional payload validation\n       *\n       * @returns Promise resolving to the created record with only accessible fields\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n       * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       */\n      static async $onResourcefulCreate(\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulValidationHooks = []\n      ): Promise<ResourcefulModelSerializableAttributes<Model & ResourcefulModel>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const payloadValidatorGetters = [...(options.payloadValidationSchemaBuilders?.create || [])]\n        const payloadSchemaGettersError = await this.$validatePayloadWithPayloadSchemaGetters(\n          ctx,\n          app,\n          payload,\n          hooks\n        )\n\n        if (payloadSchemaGettersError) {\n          throw new E_FORBIDDEN_PAYLOAD_EXCEPTION(payloadSchemaGettersError)\n        }\n\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          operation: CRUDOperationsEnum.CREATE,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Validate and prepare payload\n        |--------------------------------------------------------------------------\n        */\n        const preparedPayload: Record<string, any> = {}\n        const resolvedPayload = await this.$resolveStorablePayload(\n          ctx,\n          app,\n          payload,\n          payloadValidatorGetters,\n          hooks\n        )\n\n        // Only process fields that are allowed by ACL\n        for (const [key, value] of Object.entries(resolvedPayload)) {\n          let attribute = this.$keys.serializedToAttributes.get(key)\n          const isValueNull = value === null || value === undefined\n\n          // If attribute is not found, the key might already be the column name\n          // for fields with serializeAs: null\n          if (!attribute) {\n            // Check if this key corresponds to a column that has serializeAs: null\n            const columnExists = typeof this.$keys.attributesToColumns.get(key) !== 'undefined'\n            if (columnExists) {\n              attribute = key // The key is already the attribute/column name\n            } else {\n              continue // Skip unknown fields\n            }\n          }\n\n          // Check if this field is allowed - either by serialized name or column name\n          const isAllowedBySerializedName = allowedSerializedMap.has(key)\n          const isAllowedByColumnName = allowedSerializedMap.has(attribute)\n          const isAllowed = isAllowedBySerializedName || isAllowedByColumnName\n\n          if (!isValueNull && !isAllowed) {\n            throw new E_FORBIDDEN(`User does not has write access to field ${key}.`)\n          }\n\n          preparedPayload[attribute] = value\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Create the record\n        |--------------------------------------------------------------------------\n        */\n        const newRecord = await this.create(preparedPayload as InstanceType<Model>)\n\n        /*\n        |--------------------------------------------------------------------------\n        | Format and return the result\n        |--------------------------------------------------------------------------\n        */\n\n        // Call inner Read method to honor Read ACL\n        return await this.$onResourcefulRead(newRecord.$getAttribute(primaryKey), ctx, app)\n      }\n\n      /**\n       * Updates an existing model record with payload validation and access control.\n       *\n       * This method implements secure record updates by first verifying the record exists\n       * and is accessible via the read operation, validating the update payload against both\n       * model-level and request-specific schemas, checking field-level write permissions,\n       * and returning the updated record with appropriate field filtering applied.\n       *\n       * The method reuses $onResourcefulRead for consistent access control and scoping logic.\n       *\n       * @param uid - The unique identifier of the record to update\n       * @param payload - The data object containing field values to update\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional object containing query scope callbacks and validation schema getters\n       *\n       * @returns Promise resolving to the updated record with only accessible fields\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n       * @throws {E_INVALID_PAYLOAD_EXCEPTION} When core model validation fails\n       * @throws {E_FORBIDDEN_PAYLOAD_EXCEPTION} When request-specific validation fails\n       * @throws {E_FORBIDDEN} When access is denied by model-level or field-level ACL filters\n       */\n      static async $onResourcefulUpdate(\n        uid: any,\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: Partial<ResourcefulHooks> = {}\n      ): Promise<ResourcefulModelSerializableAttributes<Model & ResourcefulModel>> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access & Find the existing record\n        |--------------------------------------------------------------------------\n        */\n        const payloadValidatorGetters = [...(options.payloadValidationSchemaBuilders?.update || [])]\n        const payloadSchemaGettersError = await this.$validatePayloadWithPayloadSchemaGetters(\n          ctx,\n          app,\n          payload,\n          hooks.payloadValidationSchemas || []\n        )\n\n        if (payloadSchemaGettersError) {\n          throw new E_FORBIDDEN_PAYLOAD_EXCEPTION(payloadSchemaGettersError)\n        }\n\n        // Attempt to load the existing record via $onResourcefulRead in order to\n        // prevent duplicating the scoping logic\n        await this.$onResourcefulRead(uid, ctx, app, hooks.queryScopeCallbacks || [])\n\n        // Refetching record using model to update with it later\n        const record = await this.query().where(primaryKey, uid).first()\n        if (!record) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n\n        const { isForbidden, allowedSerializedMap, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          instance: record,\n          operation: CRUDOperationsEnum.UPDATE,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Prepare payload\n        |--------------------------------------------------------------------------\n        */\n        const preparedPayload: Record<string, any> = {}\n        const resolvedPayload = await this.$resolveStorablePayload(\n          ctx,\n          app,\n          payload,\n          payloadValidatorGetters,\n          hooks.payloadValidationSchemas || []\n        )\n\n        // Only process fields that are allowed by ACL\n        for (const [serializedKey, value] of Object.entries(resolvedPayload)) {\n          let attribute = this.$keys.serializedToAttributes.get(serializedKey)\n          const isValueNull = value === null || value === undefined\n\n          // If attribute is not found, the key might already be the column name\n          // for fields with serializeAs: null\n          if (!attribute) {\n            // Check if this key corresponds to a column that has serializeAs: null\n            const columnExists =\n              typeof this.$keys.attributesToColumns.get(serializedKey) !== 'undefined'\n            if (columnExists) {\n              attribute = serializedKey // The key is already the attribute/column name\n            } else {\n              continue // Skip unknown fields\n            }\n          }\n\n          // Check if this field is allowed - either by serialized name or column name\n          const isAllowedBySerializedName = allowedSerializedMap.has(serializedKey)\n          const isAllowedByColumnName = allowedSerializedMap.has(attribute)\n          const isAllowed = isAllowedBySerializedName || isAllowedByColumnName\n\n          if (!isValueNull && !isAllowed) {\n            throw new E_FORBIDDEN(`User does not has write access to field ${attribute}.`)\n          }\n\n          preparedPayload[attribute] = value\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Update the record\n        |--------------------------------------------------------------------------\n        */\n\n        record.merge(preparedPayload as Partial<InstanceType<Model>>)\n\n        await record.save()\n\n        /*\n        |--------------------------------------------------------------------------\n        | Format and return the result\n        |--------------------------------------------------------------------------\n        */\n\n        // Call inner Read method to honor Read ACL\n        return this.$onResourcefulRead(uid, ctx, app)\n      }\n\n      /**\n       * Deletes an existing model record with verification and access control.\n       *\n       * This method securely deletes records by first verifying the record exists\n       * and is accessible via the read operation, then checking model-level deletion\n       * permissions before executing the deletion. Returns the record as it existed\n       * before deletion with appropriate field filtering applied.\n       *\n       * The method reuses $onResourcefulRead for consistent access control and scoping logic.\n       *\n       * @param uid - The unique identifier of the record to delete\n       * @param ctx - HTTP context containing request information and authentication\n       * @param app - Application service instance for accessing app-level services\n       * @param hooks - Optional object containing query scope callbacks\n       *\n       * @returns Promise resolving to the deleted record as it existed before deletion\n       *\n       * @throws {E_MISSING_PRIMARY_KEY_EXCEPTION} When the model has no identifiable primary key\n       * @throws {E_RECORD_NOT_FOUND_EXCEPTION} When no record exists with the given ID or user lacks access\n       * @throws {E_FORBIDDEN} When access is denied by model-level access control filters\n       */\n      static async $onResourcefulDelete(\n        uid: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: ResourcefulScopeHooks = []\n      ): Promise<void> {\n        /*\n        |--------------------------------------------------------------------------\n        | Normalize inputs\n        |--------------------------------------------------------------------------\n        */\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Find the existing record for access check\n        |--------------------------------------------------------------------------\n        */\n        const query = this.$resourcefulGetQueryBuilder()\n\n        for (const scopeCallback of [\n          ...(this.$resourcefulQueryScopeCallbacks.access || []),\n          ...hooks,\n        ]) {\n          await scopeCallback(ctx, app, query, this)\n        }\n\n        const rawRecord = await query.where(primaryKey, uid).first()\n\n        if (!rawRecord) {\n          throw new E_RECORD_NOT_FOUND_EXCEPTION()\n        }\n        const { possibleFields } = this.$loadPossibilitiesForResourcefulRecord()\n        const record = new this().merge(this.$formatResourcefulRecord(rawRecord, possibleFields))\n\n        /*\n        |--------------------------------------------------------------------------\n        | Check Access\n        |--------------------------------------------------------------------------\n        */\n        const { isForbidden, message } = await this.$resourcefulCheckAccess({\n          ctx,\n          app,\n          instance: record,\n          operation: CRUDOperationsEnum.DELETE,\n        })\n\n        if (isForbidden) {\n          throw new E_FORBIDDEN(message)\n        }\n\n        /*\n        |--------------------------------------------------------------------------\n        | Delete the record\n        |--------------------------------------------------------------------------\n        */\n\n        await record.delete()\n      }\n\n      static async $onResourcefulBulkUpdate(\n        filter: string | null | undefined,\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks: Partial<ResourcefulHooks> = {}\n      ): Promise<\n        | {\n            [key: string]: ResourcefulModelSerializableAttributes<Model & ResourcefulModel> | Error\n          }\n        | Error\n      > {\n        const primaryKey = this.$getPrivateKeyAttribute()\n\n        if (!primaryKey) {\n          throw new E_MISSING_PRIMARY_KEY_EXCEPTION(this.$resourcefulName)\n        }\n        /*\n        |--------------------------------------------------------------------------\n        | Turn $onResourcefulIndex into an async iterator for bulk updates\n        |--------------------------------------------------------------------------\n        */\n        const ctor = this\n        async function* resourcefulIndexIteratorForUpdate(f: string | null | undefined) {\n          let page = 1\n          let pages = 0\n          const pk = ctor.$getPrivateKeyAttribute()\n          if (!pk) return\n          const whileAbortController = new AbortController()\n          while ((pages === 0 || page <= pages) && whileAbortController.signal.aborted === false) {\n            try {\n              const result = await ctor.$onResourcefulIndex(\n                f,\n                page,\n                100,\n                [pk],\n                [[pk, 'asc']],\n                ctx,\n                app,\n                hooks.queryScopeCallbacks || []\n              )\n              if (result.total === 0) {\n                // No records found, break the loop\n                whileAbortController.abort()\n                break\n              }\n              pages = Math.ceil(result.total / result.perPage)\n              page++\n              yield result.records\n            } catch (err) {\n              // break early on error\n              whileAbortController.abort()\n              if (err instanceof Error) {\n                throw err\n              } else {\n                throw new E_BULK_UPDATE_SEARCH_UNKNOWN_EXCEPTION()\n              }\n            }\n          }\n        }\n        const uids: Set<number | string> = new Set()\n        for await (const records of resourcefulIndexIteratorForUpdate(filter)) {\n          for (const record of records) {\n            const uid = record[primaryKey]\n            if (uid !== undefined && uid !== null) {\n              uids.add(uid)\n            }\n          }\n        }\n        return await this.$onResourcefulBulkUpdateByUid(Array.from(uids), payload, ctx, app, hooks)\n      }\n\n      static async $onResourcefulBulkUpdateByUid(\n        uids: (number | string)[],\n        payload: any,\n        ctx: HttpContext,\n        app: ApplicationService,\n        hooks?: Partial<ResourcefulHooks>,\n        concurrency = 5\n      ): Promise<{\n        [key: string]: ResourcefulModelSerializableAttributes<Model & ResourcefulModel> | Error\n      }> {\n        const results: {\n          [key: string]: ResourcefulModelSerializableAttributes<Model & ResourcefulModel> | Error\n        } = {}\n        /*\n        |--------------------------------------------------------------------------\n        | Iterate through records for bulk update using pMap\n        | to balance concurrency and performance\n        |--------------------------------------------------------------------------\n        */\n        /* istanbul ignore next -- @preserve */\n        await pMap(\n          uids,\n          async (uid) => {\n            try {\n              results[uid] = await this.$onResourcefulUpdate(uid, payload, ctx, app, hooks)\n            } catch (err) {\n              const e = err instanceof Error ? err : new Error('Unknown error during update')\n              results[uid] = e\n            }\n          },\n          { concurrency }\n        )\n        return results\n      }\n    }\n    Object.defineProperty(ResourcefulModel, '$resourcefulName', {\n      value: validatedOptions.name,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulTitleColumn', {\n      value: validatedOptions.resourcefulTitleColumn,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulMetaDescription', {\n      value: validatedOptions.description,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulMetaExternalDocs', {\n      value: validatedOptions.externalDocs,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulMetaExample', {\n      value: validatedOptions.example,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulAccessControlFilters', {\n      value: validatedOptions.accessControlFilters,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulOnACLError', {\n      value: validatedOptions.onACLError,\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulQueryScopeCallbacks', {\n      value: validatedOptions.queryScopeCallbacks || { list: [], access: [] },\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulPayloadValidationSchemaBuilders', {\n      value: validatedOptions.payloadValidationSchemaBuilders || { create: [], update: [] },\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(ResourcefulModel, '$resourcefulEnforcedPreloads', {\n      value: new Set(validatedOptions.enforcedPreloads || []),\n      writable: false,\n      enumerable: true,\n      configurable: false,\n    })\n    return ResourcefulModel\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Prepare/Consume Chain Builder\n|--------------------------------------------------------------------------\n|\n| Utility for chaining prepare and consume functions in resourceful decorators.\n| This allows combining default decorator behavior with custom logic in a\n| predictable order while maintaining proper error handling.\n|\n*/\n\n/**\n * Function types for prepare and consume operations\n */\nexport type CustomPrepareFunction = (value: unknown) => unknown\nexport type CustomConsumeFunction = (value: unknown) => unknown\nexport type DefaultPrepareFunction<T = unknown> = (\n  key: string,\n  value: unknown,\n  nullable?: boolean\n) => T\nexport type DefaultConsumeFunction<T = unknown> = (\n  key: string,\n  value: unknown,\n  nullable?: boolean\n) => T\n\n/**\n * Utility class for building chained prepare and consume functions.\n *\n * The chaining order reflects the data flow:\n * - Prepare chain: Default → Custom (data flows TO database)\n * - Consume chain: Custom → Default (data flows FROM database)\n */\nexport class PrepareConsumeChainBuilder {\n  /**\n   * Creates a chained prepare function that calls default first, then custom.\n   *\n   * @param propertyKey - The property name for error context\n   * @param nullable - Whether the field accepts null values\n   * @param defaultPrepare - The default prepare function from decorator\n   * @param customPrepare - The custom prepare function from options\n   * @returns A chained prepare function or undefined if no functions provided\n   */\n  static chainPrepare<T>(\n    propertyKey: string,\n    nullable: boolean,\n    defaultPrepare?: DefaultPrepareFunction<T> | undefined,\n    customPrepare?: CustomPrepareFunction | undefined\n  ): CustomPrepareFunction | undefined {\n    // If neither function is provided, return undefined\n    if (!defaultPrepare && !customPrepare) {\n      return undefined\n    }\n\n    // If only custom function is provided, return it directly\n    if (!defaultPrepare && customPrepare) {\n      return customPrepare\n    }\n\n    // If only default function is provided, wrap it to match signature\n    if (defaultPrepare && !customPrepare) {\n      return (value: unknown) => defaultPrepare(propertyKey, value, nullable)\n    }\n\n    // Both functions provided - chain them: default → custom\n    return (value: unknown) => {\n      const defaultResult = defaultPrepare!(propertyKey, value, nullable)\n\n      return customPrepare!(defaultResult)\n    }\n  }\n\n  /**\n   * Creates a chained consume function that calls custom first, then default.\n   *\n   * @param propertyKey - The property name for error context\n   * @param nullable - Whether the field accepts null values\n   * @param defaultConsume - The default consume function from decorator\n   * @param customConsume - The custom consume function from options\n   * @returns A chained consume function or undefined if no functions provided\n   */\n  static chainConsume<T>(\n    propertyKey: string,\n    nullable: boolean,\n    defaultConsume?: DefaultConsumeFunction<T>,\n    customConsume?: CustomConsumeFunction\n  ): CustomConsumeFunction | undefined {\n    // If neither function is provided, return undefined\n    if (!defaultConsume && !customConsume) {\n      return undefined\n    }\n\n    // If only custom function is provided, return it directly\n    if (!defaultConsume && customConsume) {\n      return customConsume\n    }\n\n    // If only default function is provided, wrap it to match signature\n    if (defaultConsume && !customConsume) {\n      return (value: unknown) => defaultConsume(propertyKey, value, nullable)\n    }\n\n    // Both functions provided - chain them: custom → default\n    return (value: unknown) => {\n      const customResult = customConsume!(value)\n\n      return defaultConsume!(propertyKey, customResult, nullable)\n    }\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Decorator Schemas\n|--------------------------------------------------------------------------\n|\n| Joi validation schemas for Resourceful decorators. These schemas ensure\n| that decorator options to the expected shapes during runtime.\n|\n*/\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { guards } from '@nhtio/lucid-resourceful/utils'\nimport { E_INVALID_RESOURCEFUL_DECORATOR_OPTIONS } from '@nhtio/lucid-resourceful/errors'\nimport {\n  ResourcefulStringType,\n  ResourcefulDateType,\n  ResourcefulDateTimeType,\n  ResourcefulBinaryType,\n  ResourcefulNumberType,\n  ResourcefulIntegerType,\n  ResourcefulBigintType,\n  ResourcefulUnsignedIntegerType,\n  ResourcefulBooleanType,\n  ResourcefulObjectType,\n  ResourcefulArrayType,\n} from '@nhtio/lucid-resourceful/definitions'\nimport type { ObjectSchema } from '@nhtio/validation'\n\n/*\n|--------------------------------------------------------------------------\n| Validate, Normalize and Cast\n|--------------------------------------------------------------------------\n|\n| Internal utility for validating decorator options using Joi schemas.\n| Applies defaults, performs type conversions, and provides meaningful\n| error messages with context about which decorator and field failed.\n|\n*/\n\nconst joiInstanceCheckerAlternativesFactory = (Ctor: any, CtorName: string) => {\n  return [\n    joi.object().instance(Ctor),\n    joi.function().instance(Ctor),\n    joi.custom((value, helpers) => {\n      if (guards.isObject(value) && value.constructor.name === CtorName) {\n        return value\n      }\n      return helpers.error('any.invalid', { value, type: CtorName })\n    }),\n  ]\n}\n\nexport const validateNormalizeAndCastDecoratorOptions = <InputType, OutputType>(\n  fieldName: string,\n  decoratorName: string,\n  schema: ObjectSchema,\n  input: InputType\n): OutputType => {\n  const { error, value } = schema.validate(input, {\n    convert: true,\n    abortEarly: false,\n  })\n  if (error) {\n    throw new E_INVALID_RESOURCEFUL_DECORATOR_OPTIONS(decoratorName, fieldName, error)\n  }\n  return value as OutputType\n}\n\n/*\n|--------------------------------------------------------------------------\n| Base Schemas\n|--------------------------------------------------------------------------\n*/\n\nconst resourcefulPropertyDefinitionSchema = joi.object({\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n})\n\nconst resourcefulDataTypeSchema = joi.alternatives(\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulStringType, 'ResourcefulStringType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulDateType, 'ResourcefulDateType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulDateTimeType, 'ResourcefulDateTimeType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulBinaryType, 'ResourcefulBinaryType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulNumberType, 'ResourcefulNumberType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulIntegerType, 'ResourcefulIntegerType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulBigintType, 'ResourcefulBigintType'),\n  ...joiInstanceCheckerAlternativesFactory(\n    ResourcefulUnsignedIntegerType,\n    'ResourcefulUnsignedIntegerType'\n  ),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulBooleanType, 'ResourcefulBooleanType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulObjectType, 'ResourcefulObjectType'),\n  ...joiInstanceCheckerAlternativesFactory(ResourcefulArrayType, 'ResourcefulArrayType')\n)\n\nconst localResourcefulPropertyDefinitionSchema = resourcefulPropertyDefinitionSchema.keys({\n  type: resourcefulDataTypeSchema.required(),\n  /** Whether this column can be used in filter operations. Defaults to true. */\n  filterable: joi.boolean().default(true),\n  /** Whether this column can be used in sort operations. Defaults to true. */\n  sortable: joi.boolean().default(true),\n  /** Whether this column can be used in aggregation operations. Defaults to false. */\n  aggregatable: joi.boolean().default(false),\n  /** Whether this column is immutable. Defaults to false. */\n  immutable: joi.boolean().default(false),\n  /** The property name of the relationship which this column acts as a key for */\n  relationshipKey: joi.string().optional().allow('', null),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const resourcefulColumnDefinitionSchema = localResourcefulPropertyDefinitionSchema\n\nexport const resourcefulColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (partial)\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.required(),\n  /** Whether this column can be used in filter operations. Defaults to true. */\n  filterable: joi.boolean().default(true),\n  /** Whether this column can be used in sort operations. Defaults to true. */\n  sortable: joi.boolean().default(true),\n  /** Whether this column can be used in aggregation operations. Defaults to false. */\n  aggregatable: joi.boolean().default(false),\n  /** Whether this column is immutable. Defaults to false. */\n  immutable: joi.boolean().default(false),\n  /** The property name of the relationship which this column acts as a key for */\n  relationshipKey: joi.string().optional().allow('', null),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Data Type Specific Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dataTypeColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (full) - now including 'prepare' and 'consume'\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.optional(),\n  /** Whether this column can be used in filter operations. Defaults to true. */\n  filterable: joi.boolean().default(true),\n  /** Whether this column can be used in sort operations. Defaults to true. */\n  sortable: joi.boolean().default(true),\n  /** Whether this column can be used in aggregation operations. Defaults to false. */\n  aggregatable: joi.boolean().default(false),\n  /** Whether this column is immutable. Defaults to false. */\n  immutable: joi.boolean().default(false),\n  /** The property name of the relationship which this column acts as a key for */\n  relationshipKey: joi.string().optional().allow('', null),\n})\n\nconst baseDateColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  autoCreate: joi.boolean().default(false),\n  autoUpdate: joi.boolean().default(false),\n})\n\n/*\n|--------------------------------------------------------------------------\n| String Column Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const stringColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulStringType, 'ResourcefulStringType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulStringType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Date Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dateColumnOptionsSchema = baseDateColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateType, 'ResourcefulDateType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateType({\n          nullable: parent.nullable,\n          autoCreate: parent.autoCreate,\n          autoUpdate: parent.autoUpdate,\n        })\n    ),\n})\n\nexport const dateTimeColumnOptionsSchema = baseDateColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateTimeType, 'ResourcefulDateTimeType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateTimeType({\n          nullable: parent.nullable,\n          autoCreate: parent.autoCreate,\n          autoUpdate: parent.autoUpdate,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Binary Column Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const binaryColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBinaryType, 'ResourcefulBinaryType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBinaryType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Number Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const numberColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulNumberType, 'ResourcefulNumberType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulNumberType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const integerColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulIntegerType, 'ResourcefulIntegerType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const bigintColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBigintType, 'ResourcefulBigintType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBigintType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const unsignedIntegerColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(\n        ResourcefulUnsignedIntegerType,\n        'ResourcefulUnsignedIntegerType'\n      )\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulUnsignedIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Boolean Column Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const booleanColumnOptionsSchema = dataTypeColumnOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBooleanType, 'ResourcefulBooleanType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBooleanType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Object/Array Column Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const objectColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (full)\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Immutability options\n  immutable: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  relationshipKey: joi.string().optional().allow('', null),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulObjectType, 'ResourcefulObjectType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulObjectType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const arrayColumnOptionsSchema = joi.object({\n  // Lucid ColumnOptions (full)\n  columnName: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  consume: joi.function().optional(),\n  prepare: joi.function().optional(),\n  meta: joi.object().optional(),\n  isPrimary: joi.boolean().default(false),\n  hasDefaultValue: joi.boolean().default(false),\n\n  // Immutability options\n  immutable: joi.boolean().default(false),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  relationshipKey: joi.string().optional().allow('', null),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulArrayType, 'ResourcefulArrayType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulArrayType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const resourcefulComputedDefinitionSchema = localResourcefulPropertyDefinitionSchema.append({\n  writable: joi.boolean().default(false),\n})\n\nexport const resourcefulComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (partial)\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.required(),\n  writable: joi.boolean().default(false),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Data Type Specific Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dataTypeComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (partial) - excluding 'prepare' and 'consume'\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: resourcefulDataTypeSchema.optional(),\n  writeable: joi.boolean().default(false),\n})\n\nconst baseDateComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  autoCreate: joi.boolean().default(false),\n  autoUpdate: joi.boolean().default(false),\n})\n\n/*\n|--------------------------------------------------------------------------\n| String Computed Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const stringComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulStringType, 'ResourcefulStringType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulStringType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Date Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const dateComputedOptionsSchema = baseDateComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateType, 'ResourcefulDateType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const dateTimeComputedOptionsSchema = baseDateComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulDateTimeType, 'ResourcefulDateTimeType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulDateTimeType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Binary Computed Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const binaryComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBinaryType, 'ResourcefulBinaryType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBinaryType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Number Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const numberComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulNumberType, 'ResourcefulNumberType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulNumberType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const integerComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulIntegerType, 'ResourcefulIntegerType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const bigintComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBigintType, 'ResourcefulBigintType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBigintType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const unsignedIntegerComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(\n        ResourcefulUnsignedIntegerType,\n        'ResourcefulUnsignedIntegerType'\n      )\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulUnsignedIntegerType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Boolean Computed Schema\n|--------------------------------------------------------------------------\n*/\n\nexport const booleanComputedOptionsSchema = dataTypeComputedOptionsSchema.keys({\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulBooleanType, 'ResourcefulBooleanType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulBooleanType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Object/Array Computed Schemas\n|--------------------------------------------------------------------------\n*/\n\nexport const objectComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (full)\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulObjectType, 'ResourcefulObjectType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulObjectType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\nexport const arrayComputedOptionsSchema = joi.object({\n  // Lucid ComputedOptions (full)\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  serialize: joi.function().optional(),\n  meta: joi.object().optional(),\n\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n  type: joi\n    .alternatives(\n      ...joiInstanceCheckerAlternativesFactory(ResourcefulArrayType, 'ResourcefulArrayType')\n    )\n    .default(\n      (parent: any) =>\n        new ResourcefulArrayType({\n          nullable: parent.nullable,\n        })\n    ),\n})\n\n/*\n|--------------------------------------------------------------------------\n| Relationship Schemas\n|--------------------------------------------------------------------------\n|\n| Joi validation schemas for relationship decorator options. These schemas\n| combine Lucid relationship options with resourceful relationship options.\n|\n*/\n\n// Base schema for resourceful relationship options\nexport const resourcefulRelationshipOptionsSchema = joi.object({\n  // Resourceful options\n  propertyKey: joi.string().default(''),\n  readAccessControlFilters: joi.array().items(joi.function()).default([]),\n  writeAccessControlFilters: joi.array().items(joi.function()).default([]),\n  nullable: joi.boolean().default(false),\n  description: joi.string().optional(),\n  default: joi.any().optional(),\n  externalDocs: joi\n    .object({\n      description: joi.string().optional(),\n      url: joi.string().uri().required(),\n    })\n    .optional(),\n  example: joi.string().optional(),\n  deprecated: joi.boolean().default(false),\n})\n\n// Schema for belongsTo, hasOne, hasMany relationships\nexport const relationOptionsSchema = resourcefulRelationshipOptionsSchema.keys({\n  // Lucid RelationOptions\n  localKey: joi.string().optional(),\n  foreignKey: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  onQuery: joi.function().optional(),\n  relatedModel: joi.function(),\n})\n\n// Schema for manyToMany relationships\nexport const manyToManyRelationOptionsSchema = resourcefulRelationshipOptionsSchema.keys({\n  // Lucid ManyToManyRelationOptions\n  localKey: joi.string().optional(),\n  relatedKey: joi.string().optional(),\n  pivotForeignKey: joi.string().optional(),\n  pivotRelatedForeignKey: joi.string().optional(),\n  pivotTable: joi.string().optional(),\n  pivotTimestamps: joi.boolean().optional(),\n  pivotColumns: joi.array().items(joi.string()).optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  onQuery: joi.function().optional(),\n  relatedModel: joi.function(),\n})\n\n// Schema for hasManyThrough relationships\nexport const hasManyThroughRelationOptionsSchema = resourcefulRelationshipOptionsSchema.keys({\n  // Lucid HasManyThroughRelationOptions (ThroughRelationOptions without throughModel)\n  localKey: joi.string().optional(),\n  foreignKey: joi.string().optional(),\n  throughLocalKey: joi.string().optional(),\n  throughForeignKey: joi.string().optional(),\n  serializeAs: joi.alternatives().try(joi.string(), joi.valid(null)).optional(),\n  onQuery: joi.function().optional(),\n  relatedModel: joi.function(),\n})\n","/*\n|--------------------------------------------------------------------------\n| Decorators for Resourceful Lucid Models\n|--------------------------------------------------------------------------\n|\n| Decorators which are used to add the required metadata to Lucid models\n| which have been extended with the Resourceful mixin.\n|\n*/\n\n/*\n|--------------------------------------------------------------------------\n| NOTE FOR FUTURE MAINTAINERS\n|--------------------------------------------------------------------------\n|\n| The `type` property for resourceful decorators (e.g., resourcefulColumn, resourcefulComputed)\n| must always be a ResourcefulDataType instance (e.g., ResourcefulStringType(), ResourcefulNumberType(), etc.),\n| not a string literal like 'string' or 'number'.\n| This is required because the system expects a structured data type definition with validation,\n| format, and other metadata, not just a primitive string. See src/private/data_types.ts for details.\n|\n*/\n\nimport { guards } from '@nhtio/lucid-resourceful/utils'\nimport {\n  PrepareConsumeChainBuilder,\n  DefaultPrepareFunction,\n  DefaultConsumeFunction,\n} from './prepare_consume_chain_builder'\nimport {\n  LucidModel,\n  ColumnOptions,\n  ComputedOptions,\n  DateColumnDecorator,\n  DateTimeColumnDecorator,\n} from '@adonisjs/lucid/types/model'\nimport {\n  column as lucidColumn,\n  computed as lucidComputed,\n  belongsTo as lucidBelongsTo,\n  hasOne as lucidHasOne,\n  hasMany as lucidHasMany,\n  manyToMany as lucidManyToMany,\n  hasManyThrough as lucidHasManyThrough,\n} from '@adonisjs/lucid/orm'\nimport {\n  prepareString,\n  prepareDate,\n  prepareDateTime,\n  prepareBinary,\n  prepareNumber,\n  prepareInteger,\n  prepareBigint,\n  prepareUnsignedint,\n  prepareBoolean,\n  prepareObject,\n  prepareArray,\n  consumeString,\n  consumeDate,\n  consumeDateTime,\n  consumeBinary,\n  consumeNumber,\n  consumeInteger,\n  consumeBigint,\n  consumeUnsignedint,\n  consumeBoolean,\n  consumeObject,\n  consumeArray,\n} from './decorator_utils'\nimport {\n  validateNormalizeAndCastDecoratorOptions,\n  resourcefulColumnOptionsSchema,\n  stringColumnOptionsSchema,\n  dateColumnOptionsSchema,\n  dateTimeColumnOptionsSchema,\n  binaryColumnOptionsSchema,\n  numberColumnOptionsSchema,\n  integerColumnOptionsSchema,\n  bigintColumnOptionsSchema,\n  unsignedIntegerColumnOptionsSchema,\n  booleanColumnOptionsSchema,\n  objectColumnOptionsSchema,\n  arrayColumnOptionsSchema,\n  resourcefulComputedOptionsSchema,\n  stringComputedOptionsSchema,\n  dateComputedOptionsSchema,\n  dateTimeComputedOptionsSchema,\n  binaryComputedOptionsSchema,\n  numberComputedOptionsSchema,\n  integerComputedOptionsSchema,\n  bigintComputedOptionsSchema,\n  unsignedIntegerComputedOptionsSchema,\n  booleanComputedOptionsSchema,\n  objectComputedOptionsSchema,\n  arrayComputedOptionsSchema,\n  relationOptionsSchema,\n  manyToManyRelationOptionsSchema,\n  hasManyThroughRelationOptionsSchema,\n} from './decorator_schemas'\nimport type {\n  HasOne,\n  ManyToMany,\n  HasManyThrough,\n  ManyToManyRelationOptions,\n  RelationOptions,\n  ThroughRelationOptions,\n} from '@adonisjs/lucid/types/relations'\nimport type {\n  ResourcefulColumnDefinition,\n  ResourcefulComputedAccessorDefinition,\n  ResourcefulRelationshipDefinition,\n  AnySchema,\n  StringSchema,\n  DateSchema,\n  BinarySchema,\n  NumberSchema,\n  BooleanSchema,\n  ObjectSchema,\n  ArraySchema,\n  ResourcefulPropertySchema,\n} from '@nhtio/lucid-resourceful/types'\n\n/**\n * Options for date columns including autoCreate and autoUpdate flags.\n *\n * @example\n * ```ts\n * {\n *   autoCreate: true,\n *   autoUpdate: false,\n *   nullable: false,\n * }\n * ```\n */\nexport type DateColumnOptions = DataTypeColumnOptions & {\n  autoCreate: boolean\n  autoUpdate: boolean\n}\n\n/**\n * Options for relation decorators on related models.\n *\n * @example\n * ```ts\n * import { resourcefulBelongsTo } from '@nhtio/lucid-resourceful'\n *\n * class Post {\n *   @resourcefulBelongsTo(() => User, { foreignKey: 'user_id' })\n *   public user: User\n * }\n * ```\n */\nexport type RelatedModelRelationOptions<RelatedModel extends LucidModel> =\n  | RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>\n  | ManyToManyRelationOptions<ManyToMany<RelatedModel>>\n  | Omit<\n      ThroughRelationOptions<RelatedModel, LucidModel, HasManyThrough<RelatedModel>>,\n      'throughModel'\n    >\n\n/**\n * Options for hasManyThrough relation decorators.\n *\n * @example\n * ```ts\n * import { resourcefulHasManyThrough } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulHasManyThrough([\n *     () => Role,\n *     () => UserRolePivot\n *   ], { foreignKey: 'user_id' })\n *   public roles: HasManyThrough<typeof Role>\n * }\n * ```\n */\nexport type HasManyThroughRelationOptions<RelatedModel extends LucidModel> = Omit<\n  ThroughRelationOptions<RelatedModel, LucidModel, HasManyThrough<RelatedModel>>,\n  'throughModel'\n>\n\ntype ValidatorInput<Schema extends AnySchema = AnySchema> = Partial<DataTypeColumnOptions> &\n  Partial<ResourcefulColumnDefinition<Schema>>\ntype ValidatorOutnput<Schema extends AnySchema = AnySchema> = DataTypeColumnOptions &\n  ResourcefulColumnDefinition<Schema>\n\ninterface ColumnOptionsWithDate extends ColumnOptions {\n  autoCreate: boolean\n  autoUpdate: boolean\n}\n\nconst extractLucidOptionsForLucidDecorator = <\n  LucidDecoratorOptionsType,\n  InputOptionsType extends LucidDecoratorOptionsType = LucidDecoratorOptionsType,\n>(\n  options: InputOptionsType,\n  keys: Array<keyof LucidDecoratorOptionsType>,\n  overrides?: Partial<LucidDecoratorOptionsType>\n): Partial<LucidDecoratorOptionsType> => {\n  const extracted: Partial<LucidDecoratorOptionsType> = {}\n  Object.entries(options as {}).forEach((entry) => {\n    const [key, value] = entry as [keyof InputOptionsType, InputOptionsType[keyof InputOptionsType]]\n    if (keys.includes(key as keyof LucidDecoratorOptionsType)) {\n      const k = key as keyof LucidDecoratorOptionsType\n      const v = value as unknown as LucidDecoratorOptionsType[keyof LucidDecoratorOptionsType]\n      extracted[k] = v\n    }\n  })\n  if (guards.isObject(overrides)) {\n    Object.assign(extracted, overrides)\n  }\n  return extracted\n}\n\nconst extractLucidOptionsForLucidColumnDecorator = (\n  options: Partial<ColumnOptionsWithDate>,\n  overrides?: Partial<ColumnOptionsWithDate>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<ColumnOptionsWithDate>>(\n    options,\n    [\n      'columnName',\n      'serializeAs',\n      'isPrimary',\n      'meta',\n      'serialize',\n      'prepare',\n      'consume',\n      'autoCreate',\n      'autoUpdate',\n    ],\n    overrides\n  )\n}\n\nconst extractLucidOptionsForLucidComputedDecorator = (\n  options: Partial<ComputedOptions>,\n  overrides?: Partial<ComputedOptions>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<ComputedOptions>>(\n    options,\n    ['serializeAs', 'meta'],\n    overrides\n  )\n}\n\nconst extractLucidOptionsForLucidRelatedModelDecorator = <RelatedModel extends LucidModel>(\n  options: Partial<RelatedModelRelationOptions<RelatedModel>>,\n  overrides?: Partial<RelatedModelRelationOptions<RelatedModel>>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<RelatedModelRelationOptions<RelatedModel>>>(\n    options,\n    [\n      'localKey',\n      'foreignKey',\n      'serializeAs',\n      'onQuery',\n      'meta',\n      'pivotTable',\n      'localKey',\n      'pivotForeignKey',\n      'relatedKey',\n      'pivotRelatedForeignKey',\n      'pivotColumns',\n      'pivotTimestamps',\n      'throughLocalKey',\n      'throughForeignKey',\n    ] as any,\n    overrides\n  )\n}\n\nconst extractLucidOptionsForLucidHasManyThroughDecorator = <RelatedModel extends LucidModel>(\n  options: Partial<HasManyThroughRelationOptions<RelatedModel>>,\n  overrides?: Partial<HasManyThroughRelationOptions<RelatedModel>>\n) => {\n  return extractLucidOptionsForLucidDecorator<Partial<HasManyThroughRelationOptions<RelatedModel>>>(\n    options,\n    [\n      'localKey',\n      'foreignKey',\n      'serializeAs',\n      'onQuery',\n      'meta',\n      'pivotTable',\n      'localKey',\n      'pivotForeignKey',\n      'relatedKey',\n      'pivotRelatedForeignKey',\n      'pivotColumns',\n      'pivotTimestamps',\n      'throughLocalKey',\n      'throughForeignKey',\n    ] as any,\n    overrides\n  )\n}\n\nconst handleResourcefulColumn = <Schema extends AnySchema = ResourcefulPropertySchema>(config: {\n  decoratorName: string\n  target: any\n  propertyKey: string\n  decoratorOption: Partial<ResourcefulColumnDefinition<Schema>>\n  decoratorOptionsValidationSchema: ObjectSchema\n  lucidDecoratorFunction: typeof lucidColumn | DateColumnDecorator | DateTimeColumnDecorator\n  overrides?: Partial<ColumnOptions>\n  defaultPrepare?: DefaultPrepareFunction\n  defaultConsume?: DefaultConsumeFunction\n}) => {\n  const {\n    decoratorName,\n    target,\n    propertyKey,\n    decoratorOption,\n    decoratorOptionsValidationSchema,\n    overrides = {},\n    lucidDecoratorFunction,\n    defaultPrepare,\n    defaultConsume,\n  } = config\n  /*\n    |--------------------------------------------------------------------------\n    | Fields which are auto created/updated are always nullable\n    |--------------------------------------------------------------------------\n    */\n  decoratorOption.nullable =\n    decoratorOption.nullable === true ||\n    ('autoCreate' in decoratorOption && decoratorOption.autoCreate === true) ||\n    ('autoUpdate' in decoratorOption && decoratorOption.autoUpdate === true) ||\n    false\n  /*\n    |--------------------------------------------------------------------------\n    | - If the name of the field is `createdAt` or `created_at` and `immutable`\n    | is not explicitly set, set `immutable` to true\n    | - If the field is autoCreated. but not autoUpdated and `immutable` is \n    | not explicitly set, set `immutable` to true\n    | - If the property key is the model's primary key and `immutable` is not\n    | explicitly set, set `immutable` to true\n    |--------------------------------------------------------------------------\n    | This is a helper to reduce boilerplate code and make it less likely that\n    | fields which developers commonly intend to be immutable are accidentally\n    | made mutable.\n    */\n  if (\n    !('immutable' in decoratorOption) &&\n    (propertyKey === 'createdAt' ||\n      propertyKey === 'created_at' ||\n      ('autoCreate' in decoratorOption &&\n        decoratorOption.autoCreate === true &&\n        (!('autoUpdate' in decoratorOption) || decoratorOption.autoUpdate === false)) ||\n      ('isPrimary' in decoratorOption && decoratorOption.isPrimary === true))\n  ) {\n    decoratorOption.immutable = true\n  } else {\n    /*\n    |--------------------------------------------------------------------------\n    | Ensure that immutability is explicitly set to false if not true\n    |--------------------------------------------------------------------------\n    */\n    decoratorOption.immutable = decoratorOption.immutable || false\n  }\n  const opts = validateNormalizeAndCastDecoratorOptions<\n    Partial<ResourcefulColumnDefinition<Schema>>,\n    ResourcefulColumnDefinition<Schema>\n  >(propertyKey, decoratorName, decoratorOptionsValidationSchema, {\n    ...decoratorOption,\n    propertyKey,\n  })\n  const customPrepare = opts.prepare\n  const customConsume = opts.consume\n  const nullable = opts.nullable || false\n\n  // Create chained functions using PrepareConsumeChainBuilder\n  const chainedPrepare = PrepareConsumeChainBuilder.chainPrepare(\n    propertyKey,\n    nullable,\n    defaultPrepare,\n    customPrepare\n  )\n  const chainedConsume = PrepareConsumeChainBuilder.chainConsume(\n    propertyKey,\n    nullable,\n    defaultConsume,\n    customConsume\n  )\n\n  // Merge DataTypeColumnOptions for Lucid, excluding prepare/consume from opts\n  const lucidOptions = extractLucidOptionsForLucidColumnDecorator(\n    opts as unknown as Partial<ColumnOptions>,\n    {\n      ...overrides,\n      ...(chainedPrepare && { prepare: chainedPrepare }),\n      ...(chainedConsume && { consume: chainedConsume }),\n    }\n  )\n\n  lucidDecoratorFunction(lucidOptions)(target, propertyKey)\n\n  const map = ensureOwnResourcefulMap(target, '$resourcefulColumns')\n  map.set(propertyKey, opts)\n}\n\nconst handleResourcefulComputed = <Schema extends AnySchema = ResourcefulPropertySchema>(config: {\n  decoratorName: string\n  target: any\n  propertyKey: string\n  decoratorOption: Partial<ResourcefulComputedAccessorDefinition<Schema>>\n  decoratorOptionsValidationSchema: ObjectSchema\n}) => {\n  const { decoratorName, target, propertyKey, decoratorOption, decoratorOptionsValidationSchema } =\n    config\n  const opts = validateNormalizeAndCastDecoratorOptions<\n    Partial<ResourcefulComputedAccessorDefinition<Schema>>,\n    ResourcefulComputedAccessorDefinition<Schema>\n  >(propertyKey, decoratorName, decoratorOptionsValidationSchema, {\n    ...decoratorOption,\n    propertyKey,\n  })\n  // Merge DataTypeComputedOptions for Lucid\n  const lucidOptions = extractLucidOptionsForLucidComputedDecorator(\n    opts as unknown as Partial<ComputedOptions>\n  )\n\n  lucidComputed(lucidOptions)(target, propertyKey)\n\n  const map = ensureOwnResourcefulMap(target, '$resourcefulComputedAccessors')\n  map.set(propertyKey, opts)\n}\n\nfunction ensureOwnResourcefulMap(target: any, mapKey: string) {\n  const ctor = target.constructor\n  if (!Object.prototype.hasOwnProperty.call(ctor, mapKey)) {\n    ctor[mapKey] = new Map()\n  }\n  return ctor[mapKey]\n}\n\nexport type DataTypeColumnOptions = ColumnOptions\n\nexport type DataTypeComputedOptions = Omit<ComputedOptions, 'prepare' | 'consume'>\n\n/**\n * Decorator to define a resourceful column on a Lucid model property.\n * Applies validation, metadata, and Lucid column options.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn({ type: ResourcefulStringType({ minLength: 1, maxLength: 100 }), nullable: false })\n *   public name: string\n * }\n * ```\n *\n * @param options - Resourceful column options and Lucid column options.\n * @returns Property decorator function.\n */\nexport function resourcefulColumn<Schema extends AnySchema = ResourcefulPropertySchema>(\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<Schema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn'\n  const decoratorOptionsValidationSchema = resourcefulColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<\n      ValidatorInput<Schema>,\n      ValidatorOutnput<Schema>\n    >(propertyKey, decoratorName, decoratorOptionsValidationSchema, { ...options, propertyKey })\n    const lucidOptions = extractLucidOptionsForLucidColumnDecorator(opts)\n\n    lucidColumn(lucidOptions)(target, propertyKey)\n\n    const map = ensureOwnResourcefulMap(target, '$resourcefulColumns')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful string column on a Lucid model property.\n * Includes prepare and consume functions for string type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.string({ type: ResourcefulStringType({ minLength: 3 }), nullable: false })\n *   public email: string\n * }\n * ```\n *\n * @param options - Resourceful string column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.string = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<StringSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.string'\n  const decoratorOptionsValidationSchema = stringColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareString as DefaultPrepareFunction,\n      defaultConsume: consumeString as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful date column on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulDateType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulColumn.date({ type: ResourcefulDateType(), autoCreate: true, autoUpdate: false })\n *   public startDate: Date\n * }\n * ```\n *\n * @param options - Resourceful date column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.date = function (\n  options: Partial<DateColumnOptions> & Partial<ResourcefulColumnDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.date'\n  const decoratorOptionsValidationSchema = dateColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn.date,\n      defaultPrepare: prepareDate as DefaultPrepareFunction,\n      defaultConsume: consumeDate as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful dateTime column on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulDateTimeType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulColumn.dateTime({ type: ResourcefulDateTimeType(), autoCreate: true, autoUpdate: true })\n *   public updatedAt: Date\n * }\n * ```\n *\n * @param options - Resourceful dateTime column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.dateTime = function (\n  options: Partial<DateColumnOptions> & Partial<ResourcefulColumnDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.dateTime'\n  const decoratorOptionsValidationSchema = dateTimeColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn.dateTime,\n      defaultPrepare: prepareDateTime as DefaultPrepareFunction,\n      defaultConsume: consumeDateTime as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful binary column on a Lucid model property.\n * Includes prepare and consume functions for binary type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulBinaryType } from '@nhtio/lucid-resourceful'\n *\n * class File {\n *   @resourcefulColumn.binary({ type: ResourcefulBinaryType(), nullable: true })\n *   public data: Buffer\n * }\n * ```\n *\n * @param options - Resourceful binary column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.binary = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<BinarySchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.binary'\n  const decoratorOptionsValidationSchema = binaryColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareBinary as DefaultPrepareFunction,\n      defaultConsume: consumeBinary as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful number column on a Lucid model property.\n * Includes prepare and consume functions for number type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulNumberType } from '@nhtio/lucid-resourceful'\n *\n * class Product {\n *   @resourcefulColumn.number({ type: ResourcefulNumberType(), nullable: false })\n *   public price: number\n * }\n * ```\n *\n * @param options - Resourceful number column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.number = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.number'\n  const decoratorOptionsValidationSchema = numberColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareNumber as DefaultPrepareFunction,\n      defaultConsume: consumeNumber as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful integer column on a Lucid model property.\n * Includes prepare and consume functions for integer type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.integer({ type: ResourcefulIntegerType(), nullable: false })\n *   public age: number\n * }\n * ```\n *\n * @param options - Resourceful integer column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.integer = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.integer'\n  const decoratorOptionsValidationSchema = integerColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareInteger as DefaultPrepareFunction,\n      defaultConsume: consumeInteger as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful bigint column on a Lucid model property.\n * Includes prepare and consume functions for bigint type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulBigintType } from '@nhtio/lucid-resourceful'\n *\n * class Transaction {\n *   @resourcefulColumn.bigint({ type: ResourcefulBigintType(), nullable: false })\n *   public bigValue: bigint\n * }\n * ```\n *\n * @param options - Resourceful bigint column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.bigint = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.bigint'\n  const decoratorOptionsValidationSchema = bigintColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareBigint as DefaultPrepareFunction,\n      defaultConsume: consumeBigint as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful unsigned integer column on a Lucid model property.\n * Includes prepare and consume functions for unsigned integer type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulUnsignedIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.unsignedint({ type: ResourcefulUnsignedIntegerType(), nullable: false })\n *   public positiveCount: number\n * }\n * ```\n *\n * @param options - Resourceful unsigned integer column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.unsignedint = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.unsignedint'\n  const decoratorOptionsValidationSchema = unsignedIntegerColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareUnsignedint as DefaultPrepareFunction,\n      defaultConsume: consumeUnsignedint as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful boolean column on a Lucid model property.\n * Includes prepare and consume functions for boolean type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulBooleanType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.boolean({ type: ResourcefulBooleanType(), nullable: false })\n *   public isActive: boolean\n * }\n * ```\n *\n * @param options - Resourceful boolean column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.boolean = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<BooleanSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.boolean'\n  const decoratorOptionsValidationSchema = booleanColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareBoolean as DefaultPrepareFunction,\n      defaultConsume: consumeBoolean as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful object column on a Lucid model property.\n * Includes prepare and consume functions for object type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulObjectType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.object({ type: ResourcefulObjectType(), nullable: true })\n *   public metadata: object\n * }\n * ```\n *\n * @param options - Resourceful object column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.object = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<ObjectSchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.object'\n  const decoratorOptionsValidationSchema = objectColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareObject as DefaultPrepareFunction,\n      defaultConsume: consumeObject as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful array column on a Lucid model property.\n * Includes prepare and consume functions for array type.\n *\n * @example\n * ```ts\n * import { resourcefulColumn, ResourcefulArrayType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulColumn.array({ type: ResourcefulArrayType({ items: { type: 'string' } }), nullable: true })\n *   public tags: any[]\n * }\n * ```\n *\n * @param options - Resourceful array column options.\n * @returns Property decorator function.\n */\nresourcefulColumn.array = function (\n  options: Partial<ColumnOptions> & Partial<ResourcefulColumnDefinition<ArraySchema>> = {}\n) {\n  const decoratorName = 'resourcefulColumn.array'\n  const decoratorOptionsValidationSchema = arrayColumnOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulColumn({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n      lucidDecoratorFunction: lucidColumn,\n      defaultPrepare: prepareArray as DefaultPrepareFunction,\n      defaultConsume: consumeArray as DefaultConsumeFunction,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful computed accessor on a Lucid model property.\n * Applies validation, metadata, and Lucid computed options.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed({ type: ResourcefulStringType({ minLength: 1, maxLength: 100 }) })\n *   public get fullName() {\n *     return `${this.firstName} ${this.lastName}`\n *   }\n * }\n * ```\n *\n * @param options - Resourceful computed accessor options and Lucid computed options.\n * @returns Property decorator function.\n */\nexport function resourcefulComputed<Schema extends AnySchema = ResourcefulPropertySchema>(\n  options: Partial<ComputedOptions> & Partial<ResourcefulComputedAccessorDefinition<Schema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed'\n  const decoratorOptionsValidationSchema = resourcefulComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<\n      ValidatorInput<Schema>,\n      ValidatorOutnput<Schema>\n    >(propertyKey, decoratorName, decoratorOptionsValidationSchema, { ...options, propertyKey })\n    const lucidOptions = extractLucidOptionsForLucidComputedDecorator(opts)\n\n    lucidComputed(lucidOptions)(target, propertyKey)\n\n    const map = ensureOwnResourcefulMap(target, '$resourcefulComputedAccessors')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful string computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulStringType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.string({ type: ResourcefulStringType({ minLength: 3 }) })\n *   public get displayName() {\n *     return this.name.toUpperCase()\n *   }\n * }\n * ```\n *\n * @param options - Resourceful string computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.string = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<StringSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.string'\n  const decoratorOptionsValidationSchema = stringComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful date computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulDateType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulComputed.date({ type: ResourcefulDateType() })\n *   public get eventDate() {\n *     return this._eventDate\n *   }\n * }\n * ```\n *\n * @param options - Resourceful date computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.date = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.date'\n  const decoratorOptionsValidationSchema = dateComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful dateTime computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulDateTimeType } from '@nhtio/lucid-resourceful'\n *\n * class Event {\n *   @resourcefulComputed.dateTime({ type: ResourcefulDateTimeType() })\n *   public get updatedAt() {\n *     return this._updatedAt\n *   }\n * }\n * ```\n *\n * @param options - Resourceful dateTime computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.dateTime = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<DateSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.dateTime'\n  const decoratorOptionsValidationSchema = dateTimeComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful binary computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulBinaryType } from '@nhtio/lucid-resourceful'\n *\n * class File {\n *   @resourcefulComputed.binary({ type: ResourcefulBinaryType() })\n *   public get fileData() {\n *     return this._fileData\n *   }\n * }\n * ```\n *\n * @param options - Resourceful binary computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.binary = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<BinarySchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.binary'\n  const decoratorOptionsValidationSchema = binaryComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful number computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulNumberType } from '@nhtio/lucid-resourceful'\n *\n * class Product {\n *   @resourcefulComputed.number({ type: ResourcefulNumberType() })\n *   public get discountedPrice() {\n *     return this.price * 0.9\n *   }\n * }\n * ```\n *\n * @param options - Resourceful number computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.number = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.number'\n  const decoratorOptionsValidationSchema = numberComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful integer computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.integer({ type: ResourcefulIntegerType() })\n *   public get roundedAge() {\n *     return Math.floor(this.age)\n *   }\n * }\n * ```\n *\n * @param options - Resourceful integer computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.integer = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.integer'\n  const decoratorOptionsValidationSchema = integerComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful bigint computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulBigintType } from '@nhtio/lucid-resourceful'\n *\n * class Transaction {\n *   @resourcefulComputed.bigint({ type: ResourcefulBigintType() })\n *   public get bigValue() {\n *     return this._bigValue\n *   }\n * }\n * ```\n *\n * @param options - Resourceful bigint computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.bigint = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.bigint'\n  const decoratorOptionsValidationSchema = bigintComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful unsigned integer computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulUnsignedIntegerType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.unsignedint({ type: ResourcefulUnsignedIntegerType() })\n *   public get positiveCount() {\n *     return this._positiveCount\n *   }\n * }\n * ```\n *\n * @param options - Resourceful unsigned integer computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.unsignedint = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<NumberSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.unsignedint'\n  const decoratorOptionsValidationSchema = unsignedIntegerComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful boolean computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulBooleanType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.boolean({ type: ResourcefulBooleanType() })\n *   public get isActive() {\n *     return this._isActive\n *   }\n * }\n * ```\n *\n * @param options - Resourceful boolean computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.boolean = function (\n  options: Partial<DataTypeComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<BooleanSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.boolean'\n  const decoratorOptionsValidationSchema = booleanComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful object computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulObjectType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.object({ type: ResourcefulObjectType() })\n *   public get metadata() {\n *     return this._metadata\n *   }\n * }\n * ```\n *\n * @param options - Resourceful object computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.object = function (\n  options: Partial<ComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<ObjectSchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.object'\n  const decoratorOptionsValidationSchema = objectComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful array computed accessor on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulComputed, ResourcefulArrayType } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulComputed.array({ type: ResourcefulArrayType({ items: { type: 'string' } }) })\n *   public get tags() {\n *     return this._tags\n *   }\n * }\n * ```\n *\n * @param options - Resourceful array computed accessor options.\n * @returns Property decorator function.\n */\nresourcefulComputed.array = function (\n  options: Partial<ComputedOptions> &\n    Partial<ResourcefulComputedAccessorDefinition<ArraySchema>> = {}\n) {\n  const decoratorName = 'resourcefulComputed.array'\n  const decoratorOptionsValidationSchema = arrayComputedOptionsSchema\n\n  return function (target: any, propertyKey: string) {\n    handleResourcefulComputed({\n      decoratorName,\n      target,\n      propertyKey,\n      decoratorOption: options,\n      decoratorOptionsValidationSchema,\n    })\n  }\n}\n\n/**\n * Decorator to define a resourceful belongsTo relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulBelongsTo } from '@nhtio/lucid-resourceful'\n *\n * class Post {\n *   @resourcefulBelongsTo(() => User, { foreignKey: 'user_id' })\n *   public user: User\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - Relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulBelongsTo<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulBelongsTo',\n      relationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidBelongsTo(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful hasOne relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulHasOne } from '@nhtio/lucid-resourceful'\n *\n * class UserProfile {\n *   @resourcefulHasOne(() => User, { foreignKey: 'user_id' })\n *   public user: UserProfile\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - Relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulHasOne<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulHasOne',\n      relationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidHasOne(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful hasMany relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulHasMany } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulHasMany(() => Post, { foreignKey: 'user_id' })\n *   public posts: HasMany<typeof Post>\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - Relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulHasMany<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<RelationOptions<RelatedModel, LucidModel, HasOne<RelatedModel, LucidModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulHasMany',\n      relationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidHasMany(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful manyToMany relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulManyToMany } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulManyToMany(() => Role, { pivotTable: 'role_user' })\n *   public roles: ManyToMany<typeof Role>\n * }\n * ```\n *\n * @param model - Function returning the related model class.\n * @param options - ManyToMany relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulManyToMany<RelatedModel extends LucidModel>(\n  model: () => RelatedModel,\n  options: Partial<ManyToManyRelationOptions<ManyToMany<RelatedModel>>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulManyToMany',\n      manyToManyRelationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model }\n    )\n    const lucidOptions = extractLucidOptionsForLucidRelatedModelDecorator(opts)\n    lucidManyToMany(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n\n/**\n * Decorator to define a resourceful hasManyThrough relationship on a Lucid model property.\n *\n * @example\n * ```ts\n * import { resourcefulHasManyThrough } from '@nhtio/lucid-resourceful'\n *\n * class User {\n *   @resourcefulHasManyThrough([\n *     () => Role,\n *     () => UserRolePivot\n *   ], { foreignKey: 'user_id' })\n *   public roles: HasManyThrough<typeof Role>\n * }\n * ```\n *\n * @param model - Tuple of functions returning the related model and through model classes.\n * @param options - HasManyThrough relationship options and resourceful relationship definition.\n * @returns Property decorator function.\n */\nexport function resourcefulHasManyThrough<RelatedModel extends LucidModel>(\n  model: [() => RelatedModel, () => LucidModel],\n  options: Partial<HasManyThroughRelationOptions<RelatedModel>> &\n    Partial<ResourcefulRelationshipDefinition> = {}\n) {\n  return function (target: any, propertyKey: string) {\n    const opts = validateNormalizeAndCastDecoratorOptions<any, any>(\n      propertyKey,\n      'resourcefulHasManyThrough',\n      hasManyThroughRelationOptionsSchema,\n      { ...options, propertyKey, relatedModel: model[0] }\n    )\n    const lucidOptions = extractLucidOptionsForLucidHasManyThroughDecorator(opts)\n    lucidHasManyThrough(model, lucidOptions as any)(target, propertyKey)\n    const map = ensureOwnResourcefulMap(target, '$resourcefulRelationships')\n    map.set(propertyKey, opts)\n  }\n}\n","import { OpenAPIV3 } from 'openapi-types'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport type { AlternativesSchema, ObjectSchema } from '@nhtio/lucid-resourceful/joi'\n\n// Helper schemas for reusable components\nconst ReferenceObjectSchema = joi.object<OpenAPIV3.ReferenceObject>({\n  $ref: joi.string().required(),\n})\n\nconst ExternalDocumentationObjectSchema = joi.object<OpenAPIV3.ExternalDocumentationObject>({\n  description: joi.string().optional(),\n  url: joi.string().uri().required(),\n})\n\nconst ContactObjectSchema = joi.object<OpenAPIV3.ContactObject>({\n  name: joi.string().optional(),\n  url: joi.string().uri().optional(),\n  email: joi.string().email().optional(),\n})\n\nconst LicenseObjectSchema = joi.object<OpenAPIV3.LicenseObject>({\n  name: joi.string().required(),\n  url: joi.string().uri().optional(),\n})\n\nconst InfoObjectSchema = joi.object<OpenAPIV3.InfoObject>({\n  title: joi.string().required(),\n  description: joi.string().optional(),\n  termsOfService: joi.string().optional(),\n  contact: ContactObjectSchema.optional(),\n  license: LicenseObjectSchema.optional(),\n  version: joi.string().required(),\n})\n\nconst ServerVariableObjectSchema = joi.object<OpenAPIV3.ServerVariableObject>({\n  enum: joi.array().items(joi.string()).optional(),\n  default: joi.string().required(),\n  description: joi.string().optional(),\n})\n\nconst ServerObjectSchema = joi.object<OpenAPIV3.ServerObject>({\n  url: joi.string().required(),\n  description: joi.string().optional(),\n  variables: joi.object().pattern(joi.string(), ServerVariableObjectSchema).optional(),\n})\n\nconst XMLObjectSchema = joi.object<OpenAPIV3.XMLObject>({\n  name: joi.string().optional(),\n  namespace: joi.string().optional(),\n  prefix: joi.string().optional(),\n  attribute: joi.boolean().optional(),\n  wrapped: joi.boolean().optional(),\n})\n\nconst DiscriminatorObjectSchema = joi.object<OpenAPIV3.DiscriminatorObject>({\n  propertyName: joi.string().required(),\n  mapping: joi.object().pattern(joi.string(), joi.string()).optional(),\n})\n\nconst ExampleObjectSchema = joi.object<OpenAPIV3.ExampleObject>({\n  summary: joi.string().optional(),\n  description: joi.string().optional(),\n  value: joi.any().optional(),\n  externalValue: joi.string().optional(),\n})\n\n// Forward declare schemas that will be defined later for circular references\nlet SchemaObjectSchema: AlternativesSchema<OpenAPIV3.SchemaObject>\nlet MediaTypeObjectSchema: ObjectSchema<OpenAPIV3.MediaTypeObject>\nlet PathItemObjectSchema: ObjectSchema<OpenAPIV3.PathItemObject>\nlet CallbackObjectSchema: ObjectSchema<OpenAPIV3.CallbackObject>\n\n// Define base schema object without recursive references first\nconst BaseSchemaObjectProperties = {\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  format: joi.string().optional(),\n  default: joi.any().optional(),\n  multipleOf: joi.number().optional(),\n  maximum: joi.number().optional(),\n  exclusiveMaximum: joi.boolean().optional(),\n  minimum: joi.number().optional(),\n  exclusiveMinimum: joi.boolean().optional(),\n  maxLength: joi.number().integer().min(0).optional(),\n  minLength: joi.number().integer().min(0).optional(),\n  pattern: joi.string().optional(),\n  maxItems: joi.number().integer().min(0).optional(),\n  minItems: joi.number().integer().min(0).optional(),\n  uniqueItems: joi.boolean().optional(),\n  maxProperties: joi.number().integer().min(0).optional(),\n  minProperties: joi.number().integer().min(0).optional(),\n  required: joi.array().items(joi.string()).optional(),\n  enum: joi.array().optional(),\n  nullable: joi.boolean().optional(),\n  discriminator: DiscriminatorObjectSchema.optional(),\n  readOnly: joi.boolean().optional(),\n  writeOnly: joi.boolean().optional(),\n  xml: XMLObjectSchema.optional(),\n  externalDocs: ExternalDocumentationObjectSchema.optional(),\n  example: joi.any().optional(),\n  deprecated: joi.boolean().optional(),\n}\n\n// Schema Object - defined with link references\nSchemaObjectSchema = joi\n  .alternatives<OpenAPIV3.SchemaObject>()\n  .try(\n    // ArraySchemaObject\n    joi.object<OpenAPIV3.ArraySchemaObject>({\n      type: joi.string().valid('array').required(),\n      items: joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')).required(),\n      ...BaseSchemaObjectProperties,\n      additionalProperties: joi\n        .alternatives()\n        .try(joi.boolean(), ReferenceObjectSchema, joi.link('#schemaObject'))\n        .optional(),\n      properties: joi\n        .object()\n        .pattern(\n          joi.string(),\n          joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject'))\n        )\n        .optional(),\n      allOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      oneOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      anyOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      not: joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')).optional(),\n    }),\n    // NonArraySchemaObject\n    joi.object<OpenAPIV3.NonArraySchemaObject>({\n      type: joi.string().valid('boolean', 'object', 'number', 'string', 'integer').optional(),\n      ...BaseSchemaObjectProperties,\n      additionalProperties: joi\n        .alternatives()\n        .try(joi.boolean(), ReferenceObjectSchema, joi.link('#schemaObject'))\n        .optional(),\n      properties: joi\n        .object()\n        .pattern(\n          joi.string(),\n          joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject'))\n        )\n        .optional(),\n      allOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      oneOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      anyOf: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')))\n        .optional(),\n      not: joi.alternatives().try(ReferenceObjectSchema, joi.link('#schemaObject')).optional(),\n    })\n  )\n  .id('schemaObject') as AlternativesSchema<OpenAPIV3.SchemaObject>\n\nconst SchemaOrReferenceObjectSchema = joi\n  .alternatives<OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject>()\n  .try(ReferenceObjectSchema, SchemaObjectSchema)\n\nconst HeaderObjectSchema = joi.object<OpenAPIV3.HeaderObject>({\n  description: joi.string().optional(),\n  required: joi.boolean().optional(),\n  deprecated: joi.boolean().optional(),\n  allowEmptyValue: joi.boolean().optional(),\n  style: joi.string().optional(),\n  explode: joi.boolean().optional(),\n  allowReserved: joi.boolean().optional(),\n  schema: joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema).optional(),\n  example: joi.any().optional(),\n  examples: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n    .optional(),\n  content: joi.object().pattern(joi.string(), joi.link('#mediaTypeObject')).optional(),\n})\n\nconst ParameterObjectSchema = joi.object<OpenAPIV3.ParameterObject>({\n  name: joi.string().required(),\n  in: joi.string().required(),\n  description: joi.string().optional(),\n  required: joi.boolean().optional(),\n  deprecated: joi.boolean().optional(),\n  allowEmptyValue: joi.boolean().optional(),\n  style: joi.string().optional(),\n  explode: joi.boolean().optional(),\n  allowReserved: joi.boolean().optional(),\n  schema: joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema).optional(),\n  example: joi.any().optional(),\n  examples: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n    .optional(),\n  content: joi.object().pattern(joi.string(), joi.link('#mediaTypeObject')).optional(),\n})\n\nconst EncodingObjectSchema = joi.object<OpenAPIV3.EncodingObject>({\n  contentType: joi.string().optional(),\n  headers: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, HeaderObjectSchema))\n    .optional(),\n  style: joi.string().optional(),\n  explode: joi.boolean().optional(),\n  allowReserved: joi.boolean().optional(),\n})\n\nMediaTypeObjectSchema = joi\n  .object<OpenAPIV3.MediaTypeObject>({\n    schema: joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema).optional(),\n    example: joi.any().optional(),\n    examples: joi\n      .object()\n      .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n      .optional(),\n    encoding: joi.object().pattern(joi.string(), EncodingObjectSchema).optional(),\n  })\n  .id('mediaTypeObject')\n\nconst LinkObjectSchema = joi.object<OpenAPIV3.LinkObject>({\n  operationRef: joi.string().optional(),\n  operationId: joi.string().optional(),\n  parameters: joi.object().pattern(joi.string(), joi.any()).optional(),\n  requestBody: joi.any().optional(),\n  description: joi.string().optional(),\n  server: ServerObjectSchema.optional(),\n})\n\nconst ResponseObjectSchema = joi.object<OpenAPIV3.ResponseObject>({\n  description: joi.string().required(),\n  headers: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, HeaderObjectSchema))\n    .optional(),\n  content: joi.object().pattern(joi.string(), MediaTypeObjectSchema).optional(),\n  links: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, LinkObjectSchema))\n    .optional(),\n})\n\nconst ResponsesObjectSchema = joi\n  .object<OpenAPIV3.ResponsesObject>()\n  .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ResponseObjectSchema))\n\nconst RequestBodyObjectSchema = joi.object<OpenAPIV3.RequestBodyObject>({\n  description: joi.string().optional(),\n  content: joi.object().pattern(joi.string(), MediaTypeObjectSchema).required(),\n  required: joi.boolean().optional(),\n})\n\nconst SecurityRequirementObjectSchema = joi\n  .object<OpenAPIV3.SecurityRequirementObject>()\n  .pattern(joi.string(), joi.array().items(joi.string()))\n\nconst OperationObjectSchema = <T extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.OperationObject<T>>({\n      tags: joi.array().items(joi.string()).optional(),\n      summary: joi.string().optional(),\n      description: joi.string().optional(),\n      externalDocs: ExternalDocumentationObjectSchema.optional(),\n      operationId: joi.string().optional(),\n      parameters: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, ParameterObjectSchema))\n        .optional(),\n      requestBody: joi\n        .alternatives()\n        .try(ReferenceObjectSchema, RequestBodyObjectSchema)\n        .optional(),\n      responses: ResponsesObjectSchema.required(),\n      callbacks: joi\n        .object()\n        .pattern(\n          joi.string(),\n          joi.alternatives().try(ReferenceObjectSchema, joi.link('#callbackObject'))\n        )\n        .optional(),\n      deprecated: joi.boolean().optional(),\n      security: joi.array().items(SecurityRequirementObjectSchema).optional(),\n      servers: joi.array().items(ServerObjectSchema).optional(),\n    })\n    .unknown(true) // Allow additional properties for extension\n\nPathItemObjectSchema = (<T extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.PathItemObject<T>>({\n      $ref: joi.string().optional(),\n      summary: joi.string().optional(),\n      description: joi.string().optional(),\n      servers: joi.array().items(ServerObjectSchema).optional(),\n      parameters: joi\n        .array()\n        .items(joi.alternatives().try(ReferenceObjectSchema, ParameterObjectSchema))\n        .optional(),\n      // HTTP method operations\n      get: OperationObjectSchema<T>().optional(),\n      put: OperationObjectSchema<T>().optional(),\n      post: OperationObjectSchema<T>().optional(),\n      delete: OperationObjectSchema<T>().optional(),\n      options: OperationObjectSchema<T>().optional(),\n      head: OperationObjectSchema<T>().optional(),\n      patch: OperationObjectSchema<T>().optional(),\n      trace: OperationObjectSchema<T>().optional(),\n    })\n    .unknown(true)\n    .id('pathItemObject'))() as ObjectSchema<OpenAPIV3.PathItemObject> // Allow additional properties for extension\n\nCallbackObjectSchema = joi\n  .object<OpenAPIV3.CallbackObject>()\n  .pattern(joi.string(), PathItemObjectSchema)\n  .id('callbackObject')\n\nconst PathsObjectSchema = <T extends {} = {}, P extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.PathsObject<T, P>>()\n    .pattern(joi.string(), PathItemObjectSchema.allow(undefined))\n\nconst TagObjectSchema = joi.object<OpenAPIV3.TagObject>({\n  name: joi.string().required(),\n  description: joi.string().optional(),\n  externalDocs: ExternalDocumentationObjectSchema.optional(),\n})\n\n// Security Scheme Objects\nconst HttpSecuritySchemeSchema = joi.object<OpenAPIV3.HttpSecurityScheme>({\n  type: joi.string().valid('http').required(),\n  description: joi.string().optional(),\n  scheme: joi.string().required(),\n  bearerFormat: joi.string().optional(),\n})\n\nconst ApiKeySecuritySchemeSchema = joi.object<OpenAPIV3.ApiKeySecurityScheme>({\n  type: joi.string().valid('apiKey').required(),\n  description: joi.string().optional(),\n  name: joi.string().required(),\n  in: joi.string().required(),\n})\n\nconst OAuth2SecuritySchemeSchema = joi.object<OpenAPIV3.OAuth2SecurityScheme>({\n  type: joi.string().valid('oauth2').required(),\n  description: joi.string().optional(),\n  flows: joi\n    .object({\n      implicit: joi\n        .object({\n          authorizationUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n      password: joi\n        .object({\n          tokenUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n      clientCredentials: joi\n        .object({\n          tokenUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n      authorizationCode: joi\n        .object({\n          authorizationUrl: joi.string().uri().required(),\n          tokenUrl: joi.string().uri().required(),\n          refreshUrl: joi.string().uri().optional(),\n          scopes: joi.object().pattern(joi.string(), joi.string()).required(),\n        })\n        .optional(),\n    })\n    .required(),\n})\n\nconst OpenIdSecuritySchemeSchema = joi.object<OpenAPIV3.OpenIdSecurityScheme>({\n  type: joi.string().valid('openIdConnect').required(),\n  description: joi.string().optional(),\n  openIdConnectUrl: joi.string().uri().required(),\n})\n\nconst SecuritySchemeObjectSchema = joi\n  .alternatives<OpenAPIV3.SecuritySchemeObject>()\n  .try(\n    HttpSecuritySchemeSchema,\n    ApiKeySecuritySchemeSchema,\n    OAuth2SecuritySchemeSchema,\n    OpenIdSecuritySchemeSchema\n  )\n\nconst ComponentsObjectSchema = joi.object<OpenAPIV3.ComponentsObject>({\n  schemas: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, SchemaObjectSchema))\n    .optional(),\n  responses: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ResponseObjectSchema))\n    .optional(),\n  parameters: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ParameterObjectSchema))\n    .optional(),\n  examples: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, ExampleObjectSchema))\n    .optional(),\n  requestBodies: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, RequestBodyObjectSchema))\n    .optional(),\n  headers: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, HeaderObjectSchema))\n    .optional(),\n  securitySchemes: joi\n    .object()\n    .pattern(\n      joi.string(),\n      joi.alternatives().try(ReferenceObjectSchema, SecuritySchemeObjectSchema)\n    )\n    .optional(),\n  links: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, LinkObjectSchema))\n    .optional(),\n  callbacks: joi\n    .object()\n    .pattern(joi.string(), joi.alternatives().try(ReferenceObjectSchema, CallbackObjectSchema))\n    .optional(),\n})\n\n// Main Document Schema\nexport const OpenAPIV3DocumentSchema = <T extends {} = {}>() =>\n  joi\n    .object<OpenAPIV3.Document<T>>({\n      'openapi': joi\n        .string()\n        .required()\n        .pattern(/^3\\.\\d+\\.\\d+$/),\n      'info': InfoObjectSchema.required(),\n      'servers': joi.array().items(ServerObjectSchema).optional(),\n      'paths': PathsObjectSchema<T>().required(),\n      'components': ComponentsObjectSchema.optional(),\n      'security': joi.array().items(SecurityRequirementObjectSchema).optional(),\n      'tags': joi.array().items(TagObjectSchema).optional(),\n      'externalDocs': ExternalDocumentationObjectSchema.optional(),\n      'x-express-openapi-additional-middleware': joi.array().items(joi.function()).optional(),\n      'x-express-openapi-validation-strict': joi.boolean().optional(),\n    })\n    .unknown(true) // Allow additional properties for extension\n\n// Export individual schemas for reuse\nexport {\n  InfoObjectSchema,\n  ContactObjectSchema,\n  LicenseObjectSchema,\n  ServerObjectSchema,\n  ServerVariableObjectSchema,\n  PathsObjectSchema,\n  PathItemObjectSchema,\n  OperationObjectSchema,\n  ExternalDocumentationObjectSchema,\n  ParameterObjectSchema,\n  HeaderObjectSchema,\n  SchemaObjectSchema,\n  SchemaOrReferenceObjectSchema,\n  DiscriminatorObjectSchema,\n  XMLObjectSchema,\n  ReferenceObjectSchema,\n  ExampleObjectSchema,\n  MediaTypeObjectSchema,\n  EncodingObjectSchema,\n  RequestBodyObjectSchema,\n  ResponsesObjectSchema,\n  ResponseObjectSchema,\n  LinkObjectSchema,\n  CallbackObjectSchema,\n  SecurityRequirementObjectSchema,\n  ComponentsObjectSchema,\n  SecuritySchemeObjectSchema,\n  HttpSecuritySchemeSchema,\n  ApiKeySecuritySchemeSchema,\n  OAuth2SecuritySchemeSchema,\n  OpenIdSecuritySchemeSchema,\n  TagObjectSchema,\n}\n","import { isObject } from '../../type_guards'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport {\n  SchemaOrReferenceObjectSchema as schemaOrReferenceObjectSchema,\n  ParameterObjectSchema as parameterObjectSchema,\n} from '../utils/openapi_validation_schemas'\nimport type { RouteCallback, AdditionalResourcefulRouteDetails } from '../types'\n\nconst RouteCallbackSchema = joi.function<RouteCallback>().required()\n\nconst AdditionalResourcefulRouteDetailsSchema = joi.object<AdditionalResourcefulRouteDetails>({\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  handler: RouteCallbackSchema,\n  parameters: joi.array().items(parameterObjectSchema).optional(),\n  requestPayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  responsePayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  tags: joi.alternatives(joi.string(), joi.array().items(joi.string())).optional(),\n})\n\nexport const isAdditionalResourcefulRouteDetails = (\n  value: unknown\n): value is AdditionalResourcefulRouteDetails => {\n  if (!isObject(value)) {\n    return false\n  }\n  const { error } = AdditionalResourcefulRouteDetailsSchema.validate(value, { abortEarly: true })\n  return !error\n}\n","import { isObject } from '../../type_guards'\nimport { default as string } from '@poppinss/string'\nimport type { ElementCompact } from 'xml-js'\n\nconst isSimpleValue = (value: any): boolean => {\n  switch (typeof value) {\n    case 'string':\n    case 'number':\n    case 'boolean':\n    case 'bigint':\n      return true\n    default:\n      return false\n  }\n}\n\n// Helper to convert primitive/array/object values into xml-js ElementCompact structure\nexport const toXmlValue = (value: any, parent?: string): any => {\n  if (Array.isArray(value)) {\n    return value.map((v) => (parent ? { [string.singular(parent)]: toXmlValue(v) } : toXmlValue(v)))\n  }\n  if (isObject(value)) {\n    const out: ElementCompact = {}\n    Object.entries(value).forEach(([k, v]) => {\n      if (isSimpleValue(v)) {\n        if (!out._attributes) {\n          out._attributes = {}\n        }\n        out._attributes[k] = String(v)\n        return\n      } else {\n        out[k] = toXmlValue(v, k)\n      }\n    })\n    return out\n  } else if (isSimpleValue(value)) {\n    return { _text: String(value) }\n  } else if (value === undefined) {\n    return undefined\n  } else {\n    return {}\n  }\n  //   if (value === null || value === undefined) return undefined\n  //   if (isSimpleValue(value)) {\n  //     return { _text: String(value) }\n  //   }\n  //   if (Array.isArray(value)) {\n  //     return value.map((v) => toXmlValue(v)).filter(Boolean)\n  //   }\n  //   if (typeof value === 'object') {\n  //     const out: Record<string, any> = {}\n  //     const attributes: Record<string, any> = {}\n\n  //     Object.entries(value).forEach(([k, v]) => {\n  //       const converted = toXmlValue(v)\n  //       if (converted !== undefined) {\n  //         // Simple values go to _attributes, complex values become child properties\n  //         if (isSimpleValue(v)) {\n  //           attributes[k] = String(v)\n  //         } else {\n  //           out[k] = converted\n  //         }\n  //       }\n  //     })\n\n  //     // Only add _attributes if there are any\n  //     if (Object.keys(attributes).length > 0) {\n  //       out._attributes = attributes\n  //     }\n\n  //     return out\n  //   }\n  //   return { _text: String(value) }\n}\n","import { DateTime } from 'luxon'\nimport { default as qs } from 'qs'\nimport { version } from '../../../'\nimport { default as YAML } from 'yaml'\nimport { default as pMap } from 'p-map'\nimport { toXmlValue } from '../utils/xml'\nimport { encode, decode } from '../../encoding'\nimport { negotiateContent } from '../utils/http'\nimport { normalizeError } from '../utils/errors'\nimport { default as Hooks } from '@poppinss/hooks'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { stripUndefinedValuesFromObject } from '../../utils'\nimport { encode as encodeJoi } from '@nhtio/lucid-resourceful/joi'\nimport { isObject, isArray, isResourcefulModel } from '../../type_guards'\nimport {\n  E_UNRESOLVABLE_MODEL,\n  E_ROUTE_NOT_FOUND,\n  E_RELATIONSHIP_NOT_FOUND_EXCEPTION,\n  E_RECORD_NOT_FOUND_EXCEPTION,\n  E_UNSYNCABLE_RELATIONSHIP_EXCEPTION,\n  E_INVALID_RELATIONSHIP_EXCEPTION,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ElementCompact } from 'xml-js'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { AnySchema } from '@nhtio/lucid-resourceful/joi'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { ResourcefulRouterModelServiceOptionsService } from '../services/resourceful_router_model_options_service'\nimport type {\n  ResourcefulModel,\n  ResourcefulIndexResult,\n  ServableResourcefulIndexResult,\n  ResourcefulIndexResponse,\n  ResourceResourcefulRecordResponse,\n  ResourcefulQueryScopeCallback,\n  ResourcefulPayloadSchemaGetter,\n  ResourcefulPolicy,\n  ResourcefulIndexResponseHook,\n  ResourceResourcefulRecordResponseHook,\n  ResourcefulRouterMutatorOptions,\n} from '@nhtio/lucid-resourceful/types'\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  return value\n}\n\nconst makeEncodable = (data: any): any => {\n  if (Array.isArray(data)) {\n    return data.map((item) => makeEncodable(item))\n  }\n  if (data instanceof Date) {\n    return DateTime.fromJSDate(data).toISO()\n  }\n  if (data instanceof DateTime) {\n    return data.toISO()\n  }\n  if (isObject(data)) {\n    return Object.fromEntries(\n      Object.entries(data).map(([key, value]) => [key, makeEncodable(value)])\n    )\n  }\n  return data\n}\n\nconst baseIndexRequestSchema = joi\n  .object({\n    aggregations: joi\n      .object()\n      .pattern(\n        joi.string().required(),\n        joi\n          .array()\n          .items(\n            joi\n              .string()\n              .valid('avg', 'min', 'max', 'sum', 'countDistinct', 'sumDistinct', 'avgDistinct')\n          )\n          .unique()\n          .required()\n      )\n      .optional(),\n    filter: joi.string().allow('', null).default(''),\n    page: joi.number().integer().min(1).default(1),\n    perPage: joi.number().integer().min(1).max(100).default(20),\n    sort: joi\n      .object()\n      .pattern(joi.string().required(), joi.string().valid('asc', 'desc').default('asc'))\n      .default({ id: 'asc' }),\n  })\n  .unknown(false)\n\nconst preProcessingIndexRequestSchema = baseIndexRequestSchema.concat(\n  joi.object({\n    fields: joi.alternatives(\n      joi\n        .string()\n        .pattern(/^[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)?(,[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)?)*$/)\n        .allow('', null)\n        .default(''),\n      joi.array().items(joi.string()).unique().optional()\n    ),\n  })\n)\n\nconst postProcessingIndexRequestSchema = baseIndexRequestSchema.concat(\n  joi.object({\n    fields: joi.array().items(joi.string()).unique().optional(),\n  })\n)\n\ninterface ModelRelationshipSyncPayload {\n  ruid: string | number\n  [key: string]: any\n}\n\nconst modelRelationshipSyncPayloadSchema = joi\n  .object<ModelRelationshipSyncPayload>({\n    ruid: joi\n      .alternatives()\n      .try(joi.string().required(), joi.number().integer().required())\n      .required(),\n  })\n  .pattern(joi.string().required(), joi.any())\n  .unknown(true)\nconst modelRelationshipSyncPayloadSchemaArray = joi\n  .array()\n  .items(modelRelationshipSyncPayloadSchema)\n\nexport type ResourcefulModelControllerHooks = {\n  index: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  create: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  read: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  readRelated: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  update: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n}\n\nexport class ResourcefulModelController {\n  readonly #subpath: string\n  readonly #model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>\n  readonly #options: ResourcefulRouterModelServiceOptionsService\n  readonly #headers: {\n    [key: string]: string\n  }\n  readonly #mutators: Hooks<ResourcefulModelControllerHooks>\n  readonly #scopeRestrictors: ResourcefulQueryScopeCallback[]\n  readonly #payloadRestrictors: ResourcefulPayloadSchemaGetter[]\n  get options() {\n    return this.#options\n  }\n\n  constructor(\n    subpath: string,\n    model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>,\n    options: ResourcefulRouterModelServiceOptionsService,\n    headers: {\n      [key: string]: string\n    },\n    groupResourcefulQueryScopeCallbacks?: ResourcefulQueryScopeCallback[],\n    groupResourcefulPayloadSchemaGetters?: ResourcefulPayloadSchemaGetter[],\n    groupResourcefulRouterMutatorOptions?: ResourcefulRouterMutatorOptions,\n    groupResourcefulPolicies?: ResourcefulPolicy[]\n  ) {\n    this.#subpath = subpath\n    this.#model = model\n    this.#options = options\n    this.#headers = headers\n    this.#mutators = new Hooks<ResourcefulModelControllerHooks>()\n    this.#scopeRestrictors = [\n      ...(groupResourcefulQueryScopeCallbacks || []),\n      ...(this.#options.scopeRestrictors || []),\n    ]\n    this.#payloadRestrictors = [\n      ...(groupResourcefulPayloadSchemaGetters || []),\n      ...(this.#options.payloadRestrictors || []),\n    ]\n    if (isObject(groupResourcefulRouterMutatorOptions)) {\n      if (\n        'index' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.index)\n      ) {\n        groupResourcefulRouterMutatorOptions.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if (\n        'create' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.create)\n      ) {\n        groupResourcefulRouterMutatorOptions.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'read' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.read)\n      ) {\n        groupResourcefulRouterMutatorOptions.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'readRelated' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.readRelated)\n      ) {\n        groupResourcefulRouterMutatorOptions.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'update' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.update)\n      ) {\n        groupResourcefulRouterMutatorOptions.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (isObject(this.#options.mutators)) {\n      if ('index' in this.#options.mutators && isArray(this.#options.mutators.index)) {\n        this.#options.mutators.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if ('create' in this.#options.mutators && isArray(this.#options.mutators.create)) {\n        this.#options.mutators.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('read' in this.#options.mutators && isArray(this.#options.mutators.read)) {\n        this.#options.mutators.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('readRelated' in this.#options.mutators && isArray(this.#options.mutators.readRelated)) {\n        this.#options.mutators.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('update' in this.#options.mutators && isArray(this.#options.mutators.update)) {\n        this.#options.mutators.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (groupResourcefulPolicies) {\n      groupResourcefulPolicies.forEach((policy) => {\n        if (policy.scope) {\n          this.#scopeRestrictors.push(policy.scope)\n        }\n        if (policy.payload) {\n          this.#payloadRestrictors.push(policy.payload)\n        }\n        if (isObject(policy.mutators)) {\n          if ('index' in policy.mutators && isArray(policy.mutators.index)) {\n            policy.mutators.index.forEach((hook) => {\n              this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n            })\n          }\n          if ('create' in policy.mutators && isArray(policy.mutators.create)) {\n            policy.mutators.create.forEach((hook) => {\n              this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('read' in policy.mutators && isArray(policy.mutators.read)) {\n            policy.mutators.read.forEach((hook) => {\n              this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('readRelated' in policy.mutators && isArray(policy.mutators.readRelated)) {\n            policy.mutators.readRelated.forEach((hook) => {\n              this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('update' in policy.mutators && isArray(policy.mutators.update)) {\n            policy.mutators.update.forEach((hook) => {\n              this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n        }\n      })\n    }\n  }\n\n  async resolveRequestRequirements(ctx: HttpContext) {\n    const [model, { default: app }] = await Promise.all([\n      this.#model,\n      import('@adonisjs/core/services/app'),\n    ])\n    const serveAs = negotiateContent(ctx)\n    const method = ctx.request.method() || 'GET'\n    const url = ctx.request.url() || '/'\n    if (model instanceof E_UNRESOLVABLE_MODEL) {\n      throw new E_ROUTE_NOT_FOUND([method, url])\n    }\n    const respond = (status: number, body: any, headers: { [key: string]: string } = {}) => {\n      ctx.response.status(status)\n      // apply macro-level headers\n      Object.entries(this.#headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // apply controller-level headers\n      Object.entries(this.#options.headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // apply request-level headers\n      Object.entries(headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // if response is requested as encoded, return as encoded plaintext\n      if (ctx.request.header('x-resourceful-response-encoded') === '1') {\n        ctx.response.header(\n          'Content-Type',\n          `application/vnd.resourceful.structured; coding=\"zlib+base64\"; ver=\"${version}\"`\n        )\n        const encodable = makeEncodable(body)\n        ctx.response.send(encode(encodable))\n        return\n      }\n      // apply content-type headers\n      switch (serveAs) {\n        case 'yaml':\n          ctx.response.header('Content-Type', 'application/x-yaml')\n          break\n        default:\n          ctx.response.header('Content-Type', 'application/json')\n          break\n      }\n      if ('undefined' !== typeof body && 204 !== status) {\n        switch (serveAs) {\n          case 'yaml':\n            ctx.response.send(YAML.stringify(body, encoder))\n            break\n          default:\n            ctx.response.send(JSON.stringify(body, encoder))\n            break\n        }\n      }\n    }\n    return {\n      model,\n      app,\n      prefix: this.#subpath,\n      serveAs,\n      method,\n      url,\n      respond,\n    }\n  }\n\n  async #processIndexRequest(requested: any, ctx: HttpContext) {\n    // Normalize indexed-object fields (qs arrayLimit shim):\n    // When qs parses >20 indexed array params (e.g. fields[21]=x), it produces\n    // a plain object {\"0\":\"id\",\"1\":\"status\",...} instead of an array.\n    // Convert it to a sorted array before Joi validation.\n    if ('fields' in requested && isObject(requested.fields) && !Array.isArray(requested.fields)) {\n      const keys = Object.keys(requested.fields)\n      if (keys.length > 0 && keys.every((k) => /^\\d+$/.test(k))) {\n        requested = {\n          ...requested,\n          fields: keys.sort((a, b) => Number(a) - Number(b)).map((k) => requested.fields[k]),\n        }\n      }\n    }\n    const { error: preprocessingError, value: prepared } = preProcessingIndexRequestSchema.validate(\n      requested,\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (preprocessingError) {\n      throw preprocessingError\n    }\n    if ('fields' in prepared && 'string' === typeof prepared.fields) {\n      prepared.fields = prepared.fields\n        .split(',')\n        .map((str: string) => str.trim())\n        .filter((str: string) => str.length > 0)\n    }\n    const { error: postprocessingError, value: processed } =\n      postProcessingIndexRequestSchema.validate(prepared, {\n        abortEarly: false,\n        convert: true,\n      })\n    if (postprocessingError) {\n      throw postprocessingError\n    }\n    const sort = Object.entries(processed.sort) as [string, 'asc' | 'desc'][]\n    const encoded = encode(requested)\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const response = await model.$onResourcefulIndex(\n      processed.filter,\n      processed.page,\n      processed.perPage,\n      processed.fields || null,\n      sort,\n      ctx,\n      app,\n      this.#scopeRestrictors,\n      processed.aggregations\n    )\n    let fullUrl = ctx.request.completeUrl(false)\n    if (ctx.params.encoded) {\n      fullUrl = fullUrl.replace(/\\/s\\/.*$/, '/')\n    }\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.index`\n    let linkedUrl = ctx.params.encoded\n      ? `${fullUrl}${qs.stringify(requested, { addQueryPrefix: true })}`\n      : `${fullUrl}s/${encodeURIComponent(encoded)}`\n    const linkedUrlKey = ctx.params.encoded ? 'x-full-url' : 'x-shortcut-url'\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('index')\n    await runner.run(ret, ctx)\n    return respond(200, ret, {\n      'x-metadata-url': metaUrl,\n      [linkedUrlKey]: linkedUrl,\n    })\n  }\n\n  // GET /:subpath/\n  async serveModelIndex(ctx: HttpContext) {\n    return await this.#processIndexRequest(ctx.request.qs(), ctx)\n  }\n\n  // GET /:subpath/s/:encoded\n  async serveModelShortcut(ctx: HttpContext) {\n    const { encoded } = ctx.params\n    const decoded = decode(decodeURIComponent(encoded))\n    return await this.#processIndexRequest(decoded, ctx)\n  }\n\n  // GET /:subpath/$meta.index\n  async serveModelIndexMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const schema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n    const filterable = schema['x-resourceful-filterable'] || []\n    const sortable = schema['x-resourceful-sortable'] || []\n    const aggregatable = schema['x-resourceful-aggregatable'] || []\n    return respond(\n      200,\n      JSON.parse(\n        JSON.stringify(\n          {\n            selectable: schema.properties,\n            filterable,\n            sortable,\n            aggregatable,\n          },\n          encoder\n        )\n      )\n    )\n  }\n\n  async #getWriteValidationSchema(\n    ctx: HttpContext,\n    model: ResourcefulModel,\n    app: ApplicationService,\n    forUpdate: boolean = false\n  ) {\n    return await model.$getResourcefulWriteValidationSchema(ctx, app, forUpdate)\n  }\n\n  // POST /:subpath/\n  async serveModelCreate(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { validator } = await this.#getWriteValidationSchema(ctx, model, app)\n    const { error, value: validated } = validator.validate(ctx.request.all(), {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    let fullUrl = ctx.request.completeUrl(false)\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.create`\n    try {\n      const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulCreate(\n        validated,\n        ctx,\n        app,\n        this.#payloadRestrictors\n      )\n      const runner = this.#mutators.runner('create')\n      await runner.run(ret, ctx)\n      return respond(201, ret, {\n        'x-metadata-url': metaUrl,\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  // GET /:subpath/$meta.create\n  async serveModelCreateMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { schema, validator } = await this.#getWriteValidationSchema(ctx, model, app)\n    const ret = {\n      schema: schema.properties,\n      joiSchema: encodeJoi(validator),\n      joiSchemaDescription: validator.describe(),\n    }\n    return respond(200, ret)\n  }\n\n  // GET /:subpath/:id\n  async serveModelRead(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const id = ctx.params.id\n    const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulRead(\n      id,\n      ctx,\n      app,\n      this.#scopeRestrictors\n    )\n    const runner = this.#mutators.runner('read')\n    await runner.run(ret, ctx)\n    return respond(200, ret)\n  }\n\n  async #processModelReadRelatedRequest(requested: any, ctx: HttpContext) {\n    const { id, relationship } = ctx.params\n    // Normalize indexed-object fields (qs arrayLimit shim)\n    if ('fields' in requested && isObject(requested.fields) && !Array.isArray(requested.fields)) {\n      const keys = Object.keys(requested.fields)\n      if (keys.length > 0 && keys.every((k) => /^\\d+$/.test(k))) {\n        requested = {\n          ...requested,\n          fields: keys.sort((a, b) => Number(a) - Number(b)).map((k) => requested.fields[k]),\n        }\n      }\n    }\n    const { error: preprocessingError, value: prepared } = preProcessingIndexRequestSchema.validate(\n      requested,\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (preprocessingError) {\n      throw preprocessingError\n    }\n    if ('fields' in prepared && 'string' === typeof prepared.fields) {\n      prepared.fields = prepared.fields\n        .split(',')\n        .map((str: string) => str.trim())\n        .filter((str: string) => str.length > 0)\n    }\n    const { error: postprocessingError, value: processed } =\n      postProcessingIndexRequestSchema.validate(prepared, {\n        abortEarly: false,\n        convert: true,\n      })\n    if (postprocessingError) {\n      throw postprocessingError\n    }\n    const sort = Object.entries(processed.sort) as [string, 'asc' | 'desc'][]\n    const encoded = encode(requested)\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const response = await model.$onResourcefulReadRelationship(\n      id,\n      relationship,\n      processed.filter,\n      processed.page,\n      processed.perPage,\n      processed.fields || null,\n      sort,\n      ctx,\n      app,\n      this.#scopeRestrictors,\n      processed.aggregations\n    )\n    let fullUrl = ctx.request.completeUrl(false)\n    if (ctx.params.encoded) {\n      fullUrl = fullUrl.replace(/\\/s\\/.*$/, '/')\n    }\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.index`\n    let linkedUrl = ctx.params.encoded\n      ? `${fullUrl}${qs.stringify(requested, { addQueryPrefix: true })}`\n      : `${fullUrl}s/${encodeURIComponent(encoded)}`\n    const linkedUrlKey = ctx.params.encoded ? 'x-full-url' : 'x-shortcut-url'\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('readRelated')\n    await runner.run(ret, ctx)\n    return respond(200, ret, {\n      'x-metadata-url': metaUrl,\n      [linkedUrlKey]: linkedUrl,\n    })\n  }\n\n  // GET /:subpath/:id/:relationship\n  async serveModelReadRelated(ctx: HttpContext) {\n    return await this.#processModelReadRelatedRequest(ctx.request.qs(), ctx)\n  }\n\n  // GET /:subpath/:id/:relationship/s/:encoded\n  async serveModelReadRelatedShortcut(ctx: HttpContext) {\n    const { encoded } = ctx.params\n    const decoded = decode(decodeURIComponent(encoded))\n    return await this.#processModelReadRelatedRequest(decoded, ctx)\n  }\n\n  // GET /:subpath/:id/:relationship/$meta.index\n  async serveModelReadRelatedMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { relationship } = ctx.params\n    const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const lucidRelationshipDefinition = model.$getRelation(relationship)\n    if (!lucidRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    switch (lucidRelationshipDefinition.type) {\n      case 'hasOne':\n      case 'belongsTo':\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const relatedResourcefulModel = resourcefulRelationshipDefinition.relatedModel()\n    if (!isResourcefulModel(relatedResourcefulModel)) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const schema = await relatedResourcefulModel.$asOpenApiSchemaObject(ctx, app, 'read')\n    const selectable = schema.properties || {}\n    const filterable = schema['x-resourceful-filterable'] || []\n    const sortable = schema['x-resourceful-sortable'] || []\n    const aggregatable = schema['x-resourceful-aggregatable'] || []\n    return respond(200, {\n      selectable,\n      filterable,\n      sortable,\n      aggregatable,\n    })\n  }\n\n  // PUT /:subpath (with id in the payload)\n  // PUT /:subpath/:id\n  // PATCH /:subpath/:id\n  async serveModelUpdate(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const id = ctx.params.id || ctx.request.input(model.primaryKey)\n    const { validator } = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const { error, value: validated } = validator.validate(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        [model.primaryKey]: undefined,\n      }),\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (error) {\n      throw normalizeError(error)\n    }\n    let fullUrl = ctx.request.completeUrl(false)\n    while (!fullUrl.endsWith('/')) {\n      fullUrl += '/'\n    }\n    const metaUrl = `${fullUrl}$meta.update`\n    try {\n      const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulUpdate(\n        id,\n        validated,\n        ctx,\n        app,\n        {\n          queryScopeCallbacks: this.#scopeRestrictors,\n          payloadValidationSchemas: this.#payloadRestrictors,\n        }\n      )\n      const runner = this.#mutators.runner('update')\n      await runner.run(ret, ctx)\n      return respond(201, ret, {\n        'x-metadata-url': metaUrl,\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  // GET /:subpath/$meta.update\n  async serveModelUpdateMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const { schema, validator } = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const ret = {\n      schema: schema.properties,\n      joiSchema: encodeJoi(validator),\n      joiSchemaDescription: validator.describe(),\n    }\n    return respond(200, ret)\n  }\n\n  async #getAndValidateBulkUpdatePayload(\n    input: unknown,\n    ctx: HttpContext,\n    model: ResourcefulModel,\n    app: ApplicationService\n  ) {\n    const { validator } = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const { error, value: validated } = validator.validate(input, {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    return validated\n  }\n\n  async #processModelBulkUpdateRequestByFilter(filter: string | null, ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const payload = await this.#getAndValidateBulkUpdatePayload(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        filter: undefined,\n      }),\n      ctx,\n      model,\n      app\n    )\n    try {\n      await model.$onResourcefulBulkUpdate(filter, payload, ctx, app, {\n        queryScopeCallbacks: this.#scopeRestrictors,\n        payloadValidationSchemas: this.#payloadRestrictors,\n      })\n      return respond(204, undefined)\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #processModelBulkUpdateRequestById(ids: string, ctx: HttpContext) {\n    const { error: preprocessingError, value: prepared } = joi\n      .string()\n      .pattern(/^[a-zA-Z0-9_,\\s]+$/)\n      .required()\n      .validate(ids, {\n        abortEarly: false,\n        convert: true,\n      })\n    if (preprocessingError) {\n      throw preprocessingError\n    }\n    const parsedIds = prepared.split(',').map((id: string) => id.trim())\n    const { error: postprocessingError, value: processed } = joi\n      .array()\n      .items(joi.alternatives(joi.number().integer(), joi.string()))\n      .unique()\n      .min(1)\n      .validate(parsedIds, {\n        abortEarly: false,\n        convert: true,\n      }) as { error?: Error; value: (string | number)[] }\n    if (postprocessingError) {\n      throw postprocessingError\n    }\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const payload = await this.#getAndValidateBulkUpdatePayload(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        ids: undefined,\n      }),\n      ctx,\n      model,\n      app\n    )\n    try {\n      await model.$onResourcefulBulkUpdateByUid(processed, payload, ctx, app, {\n        queryScopeCallbacks: this.#scopeRestrictors,\n        payloadValidationSchemas: this.#payloadRestrictors,\n      })\n      return respond(204, undefined)\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  // PUT /:subpath/$bulk (with ids or filters in the query)\n  // PUT /:subpath/$bulk/:ids\n  // PATCH /:subpath/$bulk (with ids or filters in the query)\n  // PATCH /:subpath/$bulk/:ids\n  async serveModelBulkUpdate(ctx: HttpContext) {\n    const ids = ctx.params.ids || ctx.request.qs().ids\n    if (ids) {\n      return await this.#processModelBulkUpdateRequestById(ids, ctx)\n    }\n    return await this.#processModelBulkUpdateRequestByFilter(ctx.request.qs().filter || null, ctx)\n  }\n\n  // GET /:subpath/$meta.$bulk.update\n  async serveModelBulkUpdateMeta(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const readable = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n    const schema = await model.$asOpenApiSchemaObject(ctx, app, 'write')\n    const asResourceful = await model.$getAsResourcefulForContext(ctx, app)\n    const modelJoiSchema =\n      await ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(\n        model,\n        ctx,\n        app\n      )\n    const modelUpdateSchema = joi.object(\n      Object.assign(\n        {},\n        ...Object.keys(schema.properties!)\n          .filter((p) => p !== model.primaryKey)\n          .map((creatablePropertyKey) => {\n            const returnable = { [creatablePropertyKey]: joi.any() }\n            const prop = asResourceful.properties[creatablePropertyKey]\n            if (prop) {\n              const validator = prop.validator\n              if (validator) {\n                returnable[creatablePropertyKey] = validator\n              }\n            }\n            try {\n              const extracted = modelJoiSchema.extract(creatablePropertyKey)\n              if (extracted) {\n                returnable[creatablePropertyKey] =\n                  returnable[creatablePropertyKey].concat(extracted)\n              }\n            } catch {\n              // noop\n            }\n            return returnable\n          })\n      )\n    )\n    const filterable = readable['x-resourceful-filterable'] || []\n    const modelSchema = Object.fromEntries(\n      Object.entries(schema.properties || {}).filter(\n        ([p, d]: [string, any]) =>\n          p !== model.primaryKey && !d['x-resourceful-autoupdated'] && !d['x-resourceful-immutable']\n      )\n    )\n    const ret = {\n      schema: modelSchema,\n      filterable: JSON.parse(JSON.stringify(filterable, encoder)),\n      joiSchema: encodeJoi(modelUpdateSchema),\n      joiSchemaDescription: modelUpdateSchema.describe(),\n    }\n    return respond(200, ret)\n  }\n\n  // PUT /:subpath/:id/:relationship\n  // PATCH /:subpath/:id/:relationship\n  async serveModelSyncRelated(ctx: HttpContext) {\n    const payload = Object.values(ctx.request.all())\n    const { error, value } = modelRelationshipSyncPayloadSchemaArray.validate(payload, {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    const { model, respond } = await this.resolveRequestRequirements(ctx)\n    const { id, relationship } = ctx.params\n    // @ts-ignore\n    const instance = await model.query().where(model.primaryKey, id).first()\n    if (!instance) {\n      throw new E_RECORD_NOT_FOUND_EXCEPTION()\n    }\n    const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const lucidRelationshipDefinition = model.$getRelation(relationship)\n    if (!lucidRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    switch (lucidRelationshipDefinition.type) {\n      case 'hasOne':\n      case 'belongsTo':\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n      case 'hasManyThrough':\n        throw new E_UNSYNCABLE_RELATIONSHIP_EXCEPTION()\n    }\n    if (lucidRelationshipDefinition.type === 'manyToMany') {\n      const syncable: { [key: string]: { [key: string]: any } } = Object.assign(\n        {},\n        ...value.map((v) => ({\n          [v.ruid.toString()]: stripUndefinedValuesFromObject({\n            ...v,\n            ruid: undefined,\n          }),\n        }))\n      )\n      try {\n        await instance.related(relationship).sync(syncable)\n      } catch (e) {\n        throw normalizeError(e)\n      }\n    }\n    if (lucidRelationshipDefinition.type === 'hasMany') {\n      // in order to ensure that model hooks are run, we will load the relevant related models which need to be synced\n      // and then update them one by one\n      const foreignKey = (lucidRelationshipDefinition as any).options.foreignKey\n      if (!foreignKey) {\n        throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n          `HasMany relationship '${relationship}' missing foreignKey`\n        )\n      }\n      const relatedModel = resourcefulRelationshipDefinition.relatedModel()\n      const idsToInclude = value.map((v) => v.ruid)\n      const [relatedModelInstancesEnclude, relatedModelInstancesToInclude] = await Promise.all([\n        instance.related(relationship).query().whereNotIn(relatedModel.primaryKey, idsToInclude),\n        // @ts-ignore\n        relatedModel.query().whereIn(relatedModel.primaryKey, idsToInclude),\n      ])\n      const relatedModelInstancesEncludeResults = await pMap(\n        relatedModelInstancesEnclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: null,\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesEncludeResultsErr = relatedModelInstancesEncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesEncludeResultsErr.length > 0) {\n        throw relatedModelInstancesEncludeResultsErr[0]\n      }\n      const relatedModelInstancesToIncludeResults = await pMap(\n        relatedModelInstancesToInclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: instance.$getAttribute(model.primaryKey),\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesToIncludeResultsErr = relatedModelInstancesToIncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesToIncludeResultsErr.length > 0) {\n        throw relatedModelInstancesToIncludeResultsErr[0]\n      }\n    }\n    return respond(204, undefined)\n  }\n\n  // DELETE /:subpath/:id\n  async serveModelDelete(ctx: HttpContext) {\n    const { model, app, respond } = await this.resolveRequestRequirements(ctx)\n    try {\n      await model.$onResourcefulDelete(ctx.params.id, ctx, app, this.#scopeRestrictors)\n      return respond(204, undefined)\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  static resourcefulIndexResultToConsumable(\n    result: ResourcefulIndexResult\n  ): ServableResourcefulIndexResult {\n    return stripUndefinedValuesFromObject({\n      ...result,\n      countQuery: undefined,\n      recordsQuery: undefined,\n    })\n  }\n\n  static resourcefulIndexResultToXmlConsumable(result: ResourcefulIndexResult) {\n    const servable: ServableResourcefulIndexResult =\n      ResourcefulModelController.resourcefulIndexResultToConsumable(result)\n    const ret: ElementCompact = stripUndefinedValuesFromObject({\n      _declaration: { _attributes: { version: '1.0', encoding: 'utf-8' } },\n      results: {\n        _attributes: {\n          total: servable.total,\n          page: servable.page,\n          perPage: servable.perPage,\n        },\n        records: servable.records.map((record: ResourcefulIndexResult['records'][number]) =>\n          toXmlValue(record)\n        ),\n      },\n      aggregations:\n        Object.keys(servable.aggregations).length === 0\n          ? undefined\n          : Object.entries(servable.aggregations).map(([key, aggs]) =>\n              stripUndefinedValuesFromObject({\n                [key]: {\n                  _attributes: aggs,\n                },\n              })\n            ),\n    })\n    return ret\n  }\n\n  static async getResourcefulModelCreatePayloadValidationSchema(\n    model: ResourcefulModel,\n    ctx: HttpContext,\n    app: ApplicationService\n  ) {\n    const schemas: AnySchema[] = []\n    await pMap(\n      model.$resourcefulPayloadValidationSchemaBuilders.create,\n      async (builder) => {\n        const schema = await builder(ctx, app)\n        if (schema) {\n          schemas.push(schema)\n        }\n      },\n      { concurrency: 1 }\n    )\n    let ret = joi.any()\n    schemas.forEach((schema) => {\n      ret = ret.concat(schema)\n    })\n    return ret\n  }\n}\n","'use strict'\n\nfunction _process (v, mod) {\n  var i\n  var r\n\n  if (typeof mod === 'function') {\n    r = mod(v)\n    if (r !== undefined) {\n      v = r\n    }\n  } else if (Array.isArray(mod)) {\n    for (i = 0; i < mod.length; i++) {\n      r = mod[i](v)\n      if (r !== undefined) {\n        v = r\n      }\n    }\n  }\n\n  return v\n}\n\nfunction parseKey (key, val) {\n  // detect negative index notation\n  if (key[0] === '-' && Array.isArray(val) && /^-\\d+$/.test(key)) {\n    return val.length + parseInt(key, 10)\n  }\n  return key\n}\n\nfunction isIndex (k) {\n  return /^\\d+$/.test(k)\n}\n\nfunction isObject (val) {\n  return Object.prototype.toString.call(val) === '[object Object]'\n}\n\nfunction isArrayOrObject (val) {\n  return Object(val) === val\n}\n\nfunction isEmptyObject (val) {\n  return Object.keys(val).length === 0\n}\n\nvar blacklist = ['__proto__', 'prototype', 'constructor']\nvar blacklistFilter = function (part) { return blacklist.indexOf(part) === -1 }\n\nfunction parsePath (path, sep) {\n  if (path.indexOf('[') >= 0) {\n    path = path.replace(/\\[/g, sep).replace(/]/g, '')\n  }\n\n  var parts = path.split(sep)\n\n  var check = parts.filter(blacklistFilter)\n\n  if (check.length !== parts.length) {\n    throw Error('Refusing to update blacklisted property ' + path)\n  }\n\n  return parts\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction DotObject (separator, override, useArray, useBrackets) {\n  if (!(this instanceof DotObject)) {\n    return new DotObject(separator, override, useArray, useBrackets)\n  }\n\n  if (typeof override === 'undefined') override = false\n  if (typeof useArray === 'undefined') useArray = true\n  if (typeof useBrackets === 'undefined') useBrackets = true\n  this.separator = separator || '.'\n  this.override = override\n  this.useArray = useArray\n  this.useBrackets = useBrackets\n  this.keepArray = false\n\n  // contains touched arrays\n  this.cleanup = []\n}\n\nvar dotDefault = new DotObject('.', false, true, true)\nfunction wrap (method) {\n  return function () {\n    return dotDefault[method].apply(dotDefault, arguments)\n  }\n}\n\nDotObject.prototype._fill = function (a, obj, v, mod) {\n  var k = a.shift()\n\n  if (a.length > 0) {\n    obj[k] = obj[k] || (this.useArray && isIndex(a[0]) ? [] : {})\n\n    if (!isArrayOrObject(obj[k])) {\n      if (this.override) {\n        obj[k] = {}\n      } else {\n        if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n          throw new Error(\n            'Trying to redefine `' + k + '` which is a ' + typeof obj[k]\n          )\n        }\n\n        return\n      }\n    }\n\n    this._fill(a, obj[k], v, mod)\n  } else {\n    if (!this.override && isArrayOrObject(obj[k]) && !isEmptyObject(obj[k])) {\n      if (!(isArrayOrObject(v) && isEmptyObject(v))) {\n        throw new Error(\"Trying to redefine non-empty obj['\" + k + \"']\")\n      }\n\n      return\n    }\n\n    obj[k] = _process(v, mod)\n  }\n}\n\n/**\n *\n * Converts an object with dotted-key/value pairs to it's expanded version\n *\n * Optionally transformed by a set of modifiers.\n *\n * Usage:\n *\n *   var row = {\n *     'nr': 200,\n *     'doc.name': '  My Document  '\n *   }\n *\n *   var mods = {\n *     'doc.name': [_s.trim, _s.underscored]\n *   }\n *\n *   dot.object(row, mods)\n *\n * @param {Object} obj\n * @param {Object} mods\n */\nDotObject.prototype.object = function (obj, mods) {\n  var self = this\n\n  Object.keys(obj).forEach(function (k) {\n    var mod = mods === undefined ? null : mods[k]\n    // normalize array notation.\n    var ok = parsePath(k, self.separator).join(self.separator)\n\n    if (ok.indexOf(self.separator) !== -1) {\n      self._fill(ok.split(self.separator), obj, obj[k], mod)\n      delete obj[k]\n    } else {\n      obj[k] = _process(obj[k], mod)\n    }\n  })\n\n  return obj\n}\n\n/**\n * @param {String} path dotted path\n * @param {String} v value to be set\n * @param {Object} obj object to be modified\n * @param {Function|Array} mod optional modifier\n */\nDotObject.prototype.str = function (path, v, obj, mod) {\n  var ok = parsePath(path, this.separator).join(this.separator)\n\n  if (path.indexOf(this.separator) !== -1) {\n    this._fill(ok.split(this.separator), obj, v, mod)\n  } else {\n    obj[path] = _process(v, mod)\n  }\n\n  return obj\n}\n\n/**\n *\n * Pick a value from an object using dot notation.\n *\n * Optionally remove the value\n *\n * @param {String} path\n * @param {Object} obj\n * @param {Boolean} remove\n */\nDotObject.prototype.pick = function (path, obj, remove, reindexArray) {\n  var i\n  var keys\n  var val\n  var key\n  var cp\n\n  keys = parsePath(path, this.separator)\n  for (i = 0; i < keys.length; i++) {\n    key = parseKey(keys[i], obj)\n    if (obj && typeof obj === 'object' && key in obj) {\n      if (i === keys.length - 1) {\n        if (remove) {\n          val = obj[key]\n          if (reindexArray && Array.isArray(obj)) {\n            obj.splice(key, 1)\n          } else {\n            delete obj[key]\n          }\n          if (Array.isArray(obj)) {\n            cp = keys.slice(0, -1).join('.')\n            if (this.cleanup.indexOf(cp) === -1) {\n              this.cleanup.push(cp)\n            }\n          }\n          return val\n        } else {\n          return obj[key]\n        }\n      } else {\n        obj = obj[key]\n      }\n    } else {\n      return undefined\n    }\n  }\n  if (remove && Array.isArray(obj)) {\n    obj = obj.filter(function (n) {\n      return n !== undefined\n    })\n  }\n  return obj\n}\n/**\n *\n * Delete value from an object using dot notation.\n *\n * @param {String} path\n * @param {Object} obj\n * @return {any} The removed value\n */\nDotObject.prototype.delete = function (path, obj) {\n  return this.remove(path, obj, true)\n}\n\n/**\n *\n * Remove value from an object using dot notation.\n *\n * Will remove multiple items if path is an array.\n * In this case array indexes will be retained until all\n * removals have been processed.\n *\n * Use dot.delete() to automatically  re-index arrays.\n *\n * @param {String|Array<String>} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.remove = function (path, obj, reindexArray) {\n  var i\n\n  this.cleanup = []\n  if (Array.isArray(path)) {\n    for (i = 0; i < path.length; i++) {\n      this.pick(path[i], obj, true, reindexArray)\n    }\n    if (!reindexArray) {\n      this._cleanup(obj)\n    }\n    return obj\n  } else {\n    return this.pick(path, obj, true, reindexArray)\n  }\n}\n\nDotObject.prototype._cleanup = function (obj) {\n  var ret\n  var i\n  var keys\n  var root\n  if (this.cleanup.length) {\n    for (i = 0; i < this.cleanup.length; i++) {\n      keys = this.cleanup[i].split('.')\n      root = keys.splice(0, -1).join('.')\n      ret = root ? this.pick(root, obj) : obj\n      ret = ret[keys[0]].filter(function (v) {\n        return v !== undefined\n      })\n      this.set(this.cleanup[i], ret, obj)\n    }\n    this.cleanup = []\n  }\n}\n\n/**\n * Alias method  for `dot.remove`\n *\n * Note: this is not an alias for dot.delete()\n *\n * @param {String|Array<String>} path\n * @param {Object} obj\n * @param {Boolean} reindexArray\n * @return {any} The removed value\n */\nDotObject.prototype.del = DotObject.prototype.remove\n\n/**\n *\n * Move a property from one place to the other.\n *\n * If the source path does not exist (undefined)\n * the target property will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.move = function (source, target, obj, mods, merge) {\n  if (typeof mods === 'function' || Array.isArray(mods)) {\n    this.set(target, _process(this.pick(source, obj, true), mods), obj, merge)\n  } else {\n    merge = mods\n    this.set(target, this.pick(source, obj, true), obj, merge)\n  }\n\n  return obj\n}\n\n/**\n *\n * Transfer a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.transfer = function (\n  source,\n  target,\n  obj1,\n  obj2,\n  mods,\n  merge\n) {\n  if (typeof mods === 'function' || Array.isArray(mods)) {\n    this.set(\n      target,\n      _process(this.pick(source, obj1, true), mods),\n      obj2,\n      merge\n    )\n  } else {\n    merge = mods\n    this.set(target, this.pick(source, obj1, true), obj2, merge)\n  }\n\n  return obj2\n}\n\n/**\n *\n * Copy a property from one object to another object.\n *\n * If the source path does not exist (undefined)\n * the property on the other object will not be set.\n *\n * @param {String} source\n * @param {String} target\n * @param {Object} obj1\n * @param {Object} obj2\n * @param {Function|Array} mods\n * @param {Boolean} merge\n */\nDotObject.prototype.copy = function (source, target, obj1, obj2, mods, merge) {\n  if (typeof mods === 'function' || Array.isArray(mods)) {\n    this.set(\n      target,\n      _process(\n        // clone what is picked\n        JSON.parse(JSON.stringify(this.pick(source, obj1, false))),\n        mods\n      ),\n      obj2,\n      merge\n    )\n  } else {\n    merge = mods\n    this.set(target, this.pick(source, obj1, false), obj2, merge)\n  }\n\n  return obj2\n}\n\n/**\n *\n * Set a property on an object using dot notation.\n *\n * @param {String} path\n * @param {any} val\n * @param {Object} obj\n * @param {Boolean} merge\n */\nDotObject.prototype.set = function (path, val, obj, merge) {\n  var i\n  var k\n  var keys\n  var key\n\n  // Do not operate if the value is undefined.\n  if (typeof val === 'undefined') {\n    return obj\n  }\n  keys = parsePath(path, this.separator)\n\n  for (i = 0; i < keys.length; i++) {\n    key = keys[i]\n    if (i === keys.length - 1) {\n      if (merge && isObject(val) && isObject(obj[key])) {\n        for (k in val) {\n          if (hasOwnProperty.call(val, k)) {\n            obj[key][k] = val[k]\n          }\n        }\n      } else if (merge && Array.isArray(obj[key]) && Array.isArray(val)) {\n        for (var j = 0; j < val.length; j++) {\n          obj[keys[i]].push(val[j])\n        }\n      } else {\n        obj[key] = val\n      }\n    } else if (\n      // force the value to be an object\n      !hasOwnProperty.call(obj, key) ||\n      (!isObject(obj[key]) && !Array.isArray(obj[key]))\n    ) {\n      // initialize as array if next key is numeric\n      if (/^\\d+$/.test(keys[i + 1])) {\n        obj[key] = []\n      } else {\n        obj[key] = {}\n      }\n    }\n    obj = obj[key]\n  }\n  return obj\n}\n\n/**\n *\n * Transform an object\n *\n * Usage:\n *\n *   var obj = {\n *     \"id\": 1,\n *    \"some\": {\n *      \"thing\": \"else\"\n *    }\n *   }\n *\n *   var transform = {\n *     \"id\": \"nr\",\n *    \"some.thing\": \"name\"\n *   }\n *\n *   var tgt = dot.transform(transform, obj)\n *\n * @param {Object} recipe Transform recipe\n * @param {Object} obj Object to be transformed\n * @param {Array} mods modifiers for the target\n */\nDotObject.prototype.transform = function (recipe, obj, tgt) {\n  obj = obj || {}\n  tgt = tgt || {}\n  Object.keys(recipe).forEach(\n    function (key) {\n      this.set(recipe[key], this.pick(key, obj), tgt)\n    }.bind(this)\n  )\n  return tgt\n}\n\n/**\n *\n * Convert object to dotted-key/value pair\n *\n * Usage:\n *\n *   var tgt = dot.dot(obj)\n *\n *   or\n *\n *   var tgt = {}\n *   dot.dot(obj, tgt)\n *\n * @param {Object} obj source object\n * @param {Object} tgt target object\n * @param {Array} path path array (internal)\n */\nDotObject.prototype.dot = function (obj, tgt, path) {\n  tgt = tgt || {}\n  path = path || []\n  var isArray = Array.isArray(obj)\n\n  Object.keys(obj).forEach(\n    function (key) {\n      var index = isArray && this.useBrackets ? '[' + key + ']' : key\n      if (\n        isArrayOrObject(obj[key]) &&\n        ((isObject(obj[key]) && !isEmptyObject(obj[key])) ||\n          (Array.isArray(obj[key]) && !this.keepArray && obj[key].length !== 0))\n      ) {\n        if (isArray && this.useBrackets) {\n          var previousKey = path[path.length - 1] || ''\n          return this.dot(\n            obj[key],\n            tgt,\n            path.slice(0, -1).concat(previousKey + index)\n          )\n        } else {\n          return this.dot(obj[key], tgt, path.concat(index))\n        }\n      } else {\n        if (isArray && this.useBrackets) {\n          tgt[path.join(this.separator).concat('[' + key + ']')] = obj[key]\n        } else {\n          tgt[path.concat(index).join(this.separator)] = obj[key]\n        }\n      }\n    }.bind(this)\n  )\n  return tgt\n}\n\nDotObject.pick = wrap('pick')\nDotObject.move = wrap('move')\nDotObject.transfer = wrap('transfer')\nDotObject.transform = wrap('transform')\nDotObject.copy = wrap('copy')\nDotObject.object = wrap('object')\nDotObject.str = wrap('str')\nDotObject.set = wrap('set')\nDotObject.delete = wrap('delete')\nDotObject.del = DotObject.remove = wrap('remove')\nDotObject.dot = wrap('dot');\n['override', 'overwrite'].forEach(function (prop) {\n  Object.defineProperty(DotObject, prop, {\n    get: function () {\n      return dotDefault.override\n    },\n    set: function (val) {\n      dotDefault.override = !!val\n    }\n  })\n});\n['useArray', 'keepArray', 'useBrackets'].forEach(function (prop) {\n  Object.defineProperty(DotObject, prop, {\n    get: function () {\n      return dotDefault[prop]\n    },\n    set: function (val) {\n      dotDefault[prop] = val\n    }\n  })\n})\n\nDotObject._process = _process\n\nmodule.exports = DotObject\n","import { deepmerge } from 'deepmerge-ts'\nimport { default as dot } from 'dot-object'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { ResourcefulRouterOperation, ResourcefulRouterVerb } from '../types'\nimport { E_INVALID_RESOURCEFUL_ROUTER_OPTIONS } from '@nhtio/lucid-resourceful/errors'\nimport { ResourcefulErrorMiddleware } from '../middlewares/resourceful_error_middleware'\nimport {\n  SchemaOrReferenceObjectSchema as schemaOrReferenceObjectSchema,\n  InfoObjectSchema as infoObjectSchema,\n  ExternalDocumentationObjectSchema as externalDocsSchema,\n  SecuritySchemeObjectSchema,\n} from '../utils/openapi_validation_schemas'\nimport type { ValidationError } from '@nhtio/lucid-resourceful/joi'\nimport type { ResourcefulErrorMiddlewareOptions } from '../middlewares/resourceful_error_middleware'\nimport type {\n  ResourcefulRouterOptions,\n  ResourcefulSecuritySchemaDefinition,\n  RouteCallback,\n  AdditionalResourcefulRoutesMap,\n  AdditionalResourcefulRouteDetails,\n  ResourcefulPolicy,\n  ResourcefulIndexResponseHook,\n  ResourceResourcefulRecordResponseHook,\n  ResourcefulRouterMutatorOptions,\n} from '../types'\n\nconst DEFAULT_RESOURCEFUL_ROUTER_OPTIONS: ResourcefulRouterOptions = {\n  prefix: '/',\n  domain: undefined,\n  middleware: [],\n  except: [],\n  additional: {},\n  info: {\n    title: 'Resourceful API',\n    version: '0.0.0',\n  },\n  tagMap: {\n    general: 'General',\n    additional: 'Additional',\n  },\n  catchThrown: true,\n  headers: {},\n  security: [],\n  scopeRestrictors: [],\n  payloadRestrictors: [],\n  policies: [],\n  mutators: {},\n}\n\nconst FORBIDDEN_ADDITIONALS = ['get|/']\n\nconst FORBIDDEN_ADDITIONAL_PATTERNS = [\n  /^get\\|\\/?[\\w.-]+\\/?$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.index$/,\n  /^post\\|\\/?[\\w.-]+\\/?$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.create$/,\n  /^get\\|\\/?[\\w.-]+\\/:id$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/\\$meta\\.read$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/:relationship$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/:relationship\\/\\$meta\\.index$/,\n  /^put\\|\\/?[\\w.-]+\\/:id$/,\n  /^patch\\|\\/?[\\w.-]+\\/:id$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.update$/,\n  /^put\\|\\/?[\\w.-]+\\/\\$bulk$/,\n  /^put\\|\\/?[\\w.-]+\\/\\$bulk\\/:ids$/,\n  /^patch\\|\\/?[\\w.-]+\\/\\$bulk$/,\n  /^patch\\|\\/?[\\w.-]+\\/\\$bulk\\/:ids$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.\\$bulk\\.update$/,\n  /^put\\|\\/?[\\w.-]+\\/:id\\/:relationship$/,\n  /^patch\\|\\/?[\\w.-]+\\/:id\\/:relationship$/,\n  /^get\\|\\/?[\\w.-]+\\/:id\\/:relationship\\/\\$meta\\.sync$/,\n  /^delete\\|\\/?[\\w.-]+\\/:id$/,\n  /^get\\|\\/?[\\w.-]+\\/\\$meta\\.delete$/,\n]\n\nlet ForbiddenAdditionalPatternsSchema = joi.string()\nFORBIDDEN_ADDITIONAL_PATTERNS.forEach((p) => {\n  ForbiddenAdditionalPatternsSchema = ForbiddenAdditionalPatternsSchema.concat(\n    joi.string().regex(p, { invert: true })\n  )\n})\n\nconst RouteCallbackSchema = joi.function<RouteCallback>().required()\n\nconst AdditionalResourcefulRouteDetailsSchema = joi.object<AdditionalResourcefulRouteDetails>({\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  handler: RouteCallbackSchema,\n  requestPayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  responsePayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  tags: joi.alternatives(joi.string(), joi.array().items(joi.string())).optional(),\n})\n\nconst AdditionalResourcefulRoutesMapValueSchema = joi.alternatives<\n  RouteCallback | AdditionalResourcefulRouteDetails\n>(RouteCallbackSchema, AdditionalResourcefulRouteDetailsSchema)\n\nconst ResourcefulRouterOptionsMiddlewareSchema = joi.alternatives(\n  joi.function(),\n  joi\n    .object({\n      name: joi.string().required(),\n      args: joi.array().optional(),\n    })\n    .unknown(true)\n)\n\nconst ResourcefulSecuritySchemaDefinitionSchema = joi.object<ResourcefulSecuritySchemaDefinition>({\n  key: joi.string().required(),\n  schema: SecuritySchemeObjectSchema.required(),\n  applyToModels: joi.alternatives(\n    joi.boolean(),\n    joi\n      .object()\n      .pattern(\n        joi.string(),\n        joi.alternatives(\n          joi.boolean(),\n          joi\n            .object()\n            .pattern(\n              joi.string().valid(...ResourcefulRouterVerb),\n              joi.alternatives(joi.boolean(), joi.array().items(joi.string()))\n            )\n        )\n      )\n      .required()\n  ),\n  applyToAdditional: joi\n    .alternatives(\n      joi.boolean(),\n      joi\n        .object()\n        .pattern(\n          joi\n            .string()\n            .regex(\n              /^(get|post|put|patch|delete)\\|\\/(?:[\\w\\-\\.]+(?:\\/[\\w\\-\\.]+)*(?:\\/:\\w+(?:\\([^)]+\\))?(?:\\?)?)*(?:\\/\\*)?)?$/\n            ),\n          joi.alternatives(joi.boolean(), joi.array().items(joi.string()))\n        )\n    )\n    .required(),\n})\n\nconst ResourcefulIndexResponseHookSchema = joi\n  .array<ResourcefulIndexResponseHook[]>()\n  .items(\n    joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n  )\nconst ResourceResourcefulRecordResponseHookSchema = joi\n  .array<ResourceResourcefulRecordResponseHook[]>()\n  .items(\n    joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n  )\n\nexport const ResourcefulRouterMutatorOptionsSchema = joi.object<ResourcefulRouterMutatorOptions>({\n  index: ResourcefulIndexResponseHookSchema.optional(),\n  create: ResourceResourcefulRecordResponseHookSchema.optional(),\n  read: ResourceResourcefulRecordResponseHookSchema.optional(),\n  readRelated: ResourceResourcefulRecordResponseHookSchema.optional(),\n  update: ResourceResourcefulRecordResponseHookSchema.optional(),\n})\n\nexport const ResourcefulPolicySchema = joi\n  .object<ResourcefulPolicy>({\n    scope: joi\n      .alternatives(\n        joi.function().arity(0),\n        joi.function().arity(1),\n        joi.function().arity(2),\n        joi.function().arity(3)\n      )\n      .optional(),\n    payload: joi\n      .alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n      .optional(),\n    mutators: ResourcefulRouterMutatorOptionsSchema.optional(),\n  })\n  .unknown(false)\n  .or('scope', 'payload', 'mutators')\n\nconst ResourcefulRouterOptionsSchema = joi.object<ResourcefulRouterOptions>({\n  prefix: joi.string().pattern(/^\\//).required(),\n  domain: joi.string().optional().allow(null),\n  middleware: joi\n    .alternatives(\n      ResourcefulRouterOptionsMiddlewareSchema,\n      joi.array().items(ResourcefulRouterOptionsMiddlewareSchema)\n    )\n    .required(),\n  except: joi\n    .array()\n    .items(joi.string().valid(...ResourcefulRouterOperation))\n    .required(),\n  additional: joi\n    .object<AdditionalResourcefulRoutesMap>()\n    .pattern(\n      joi\n        .string()\n        .regex(\n          /^(get|post|put|patch|delete)\\|\\/(?:[\\w\\-\\.]+(?:\\/[\\w\\-\\.]+)*(?:\\/:\\w+(?:\\([^)]+\\))?(?:\\?)?)*(?:\\/\\*)?)?$/\n        )\n        .disallow(...FORBIDDEN_ADDITIONALS)\n        .concat(ForbiddenAdditionalPatternsSchema),\n\n      AdditionalResourcefulRoutesMapValueSchema\n    )\n    .required(),\n  info: infoObjectSchema.required(),\n  externalDocs: externalDocsSchema.optional(),\n  tagMap: joi\n    .object({\n      general: joi.string().required(),\n    })\n    .unknown(true)\n    .required(),\n  catchThrown: joi.boolean().default(true),\n  onVineValidationError: joi.function().arity(1).optional(),\n  onJoiValidationError: joi.function().arity(1).optional(),\n  onException: joi.function().arity(1).optional(),\n  onError: joi.function().arity(1).optional(),\n  onUnknown: joi.function().arity(1).optional(),\n  onAny: joi.function().arity(1).optional(),\n  headers: joi.object().pattern(joi.string(), joi.string()).default({}),\n  security: joi.array().items(ResourcefulSecuritySchemaDefinitionSchema),\n  scopeRestrictors: joi\n    .array()\n    .items(\n      joi.alternatives(\n        joi.function().arity(0),\n        joi.function().arity(1),\n        joi.function().arity(2),\n        joi.function().arity(3)\n      )\n    )\n    .optional()\n    .default([]),\n  payloadRestrictors: joi\n    .array()\n    .items(\n      joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n    )\n    .optional()\n    .default([]),\n  policies: joi.array().items(ResourcefulPolicySchema).optional().default([]),\n  mutators: ResourcefulRouterMutatorOptionsSchema.optional().default({}),\n})\n\nexport class ResourcefulRouterOptionsService {\n  readonly #options: ResourcefulRouterOptions\n\n  private constructor(options: ResourcefulRouterOptions) {\n    const modified = { ...options }\n    if (options.catchThrown === true) {\n      const errorMiddlewareOptions: ResourcefulErrorMiddlewareOptions = {\n        onVineValidationError: options.onVineValidationError,\n        onJoiValidationError: options.onJoiValidationError,\n        onException: options.onException,\n        onError: options.onError,\n        onUnknown: options.onUnknown,\n        onAny: options.onAny,\n        asYaml: true,\n        headers: options.headers,\n      }\n      if (!Array.isArray(modified.middleware)) {\n        modified.middleware = [modified.middleware].filter(Boolean)\n      }\n      modified.middleware.unshift(ResourcefulErrorMiddleware.usable(errorMiddlewareOptions))\n    }\n    this.#options = Object.freeze(deepmerge({}, modified))\n    Object.defineProperty(this, 'prefix', {\n      get: () => this.#options.prefix,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'domain', {\n      get: () => this.#options.domain,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'middleware', {\n      get: () => this.#options.middleware,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'except', {\n      get: () => this.#options.except,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'additional', {\n      get: () => this.#options.additional,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'info', {\n      get: () => this.#options.info,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'externalDocs', {\n      get: () => this.#options.externalDocs,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'tagMap', {\n      get: () => this.#options.tagMap,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'catchThrown', {\n      get: () => this.#options.catchThrown,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onVineValidationError', {\n      get: () => this.#options.onVineValidationError,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onJoiValidationError', {\n      get: () => this.#options.onJoiValidationError,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onException', {\n      get: () => this.#options.onException,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onError', {\n      get: () => this.#options.onError,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onUnknown', {\n      get: () => this.#options.onUnknown,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'onAny', {\n      get: () => this.#options.onAny,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'headers', {\n      get: () => this.#options.headers,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'security', {\n      get: () => this.#options.security,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'scopeRestrictors', {\n      get: () => this.#options.scopeRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'payloadRestrictors', {\n      get: () => this.#options.payloadRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'policies', {\n      get: () => this.#options.policies,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'mutators', {\n      get: () => this.#options.mutators,\n      enumerable: true,\n      configurable: false,\n    })\n  }\n\n  declare prefix: Readonly<ResourcefulRouterOptions['prefix']>\n  declare domain: Readonly<ResourcefulRouterOptions['domain']>\n  declare middleware: Readonly<ResourcefulRouterOptions['middleware']>\n  declare except: Readonly<ResourcefulRouterOptions['except']>\n  declare additional: Readonly<ResourcefulRouterOptions['additional']>\n  declare info: Readonly<ResourcefulRouterOptions['info']>\n  declare externalDocs: Readonly<ResourcefulRouterOptions['externalDocs']>\n  declare tagMap: Readonly<ResourcefulRouterOptions['tagMap']>\n  declare catchThrown: Readonly<ResourcefulRouterOptions['catchThrown']>\n  declare onVineValidationError: ResourcefulRouterOptions['onVineValidationError']\n  declare onJoiValidationError: ResourcefulRouterOptions['onJoiValidationError']\n  declare onException: ResourcefulRouterOptions['onException']\n  declare onError: ResourcefulRouterOptions['onError']\n  declare onUnknown: ResourcefulRouterOptions['onUnknown']\n  declare onAny: ResourcefulRouterOptions['onAny']\n  declare headers: Readonly<ResourcefulRouterOptions['headers']>\n  declare security: Readonly<ResourcefulRouterOptions['security']>\n  declare scopeRestrictors: ResourcefulRouterOptions['scopeRestrictors']\n  declare payloadRestrictors: ResourcefulRouterOptions['payloadRestrictors']\n  declare policies: ResourcefulRouterOptions['policies']\n  declare mutators: ResourcefulRouterOptions['mutators']\n\n  get(key: string): any {\n    return dot.pick(key, this.#options, false)\n  }\n\n  public static init(options: unknown): ResourcefulRouterOptionsService {\n    // step 1: at minimum, ensure that we are dealing with an object\n    const { error: checkIfObjectError } = joi.object().unknown(true).required().validate(options, {\n      abortEarly: true,\n    })\n    if (checkIfObjectError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(checkIfObjectError)\n    }\n    // step 2: create an object which is merged with the defaults\n    const mergedOptions = deepmerge(\n      DEFAULT_RESOURCEFUL_ROUTER_OPTIONS,\n      options\n    ) as ResourcefulRouterOptions\n    // step 3: validate the merged options\n    const { error: resourcefulRouterOptionsValidationError } =\n      ResourcefulRouterOptionsSchema.validate(mergedOptions, {\n        abortEarly: true,\n        convert: true,\n        allowUnknown: true,\n        stripUnknown: true,\n      }) as { error?: ValidationError; value: ResourcefulRouterOptions }\n    if (resourcefulRouterOptionsValidationError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(resourcefulRouterOptionsValidationError)\n    }\n    const instance = new ResourcefulRouterOptionsService(mergedOptions)\n    return instance\n  }\n}\n","function once(scope, callback) {\n  function next() {\n    if (next.called) {\n      return;\n    }\n    next.called = true;\n    return callback(scope);\n  }\n  next.called = false;\n  return next;\n}\nconst DEFAULT_FINAL_HANDLER = () => Promise.resolve();\nclass Runner {\n  /**\n   * The array of middleware handlers to execute in sequence.\n   */\n  #middleware;\n  /**\n   * The current index position in the middleware pipeline.\n   */\n  #currentIndex = 0;\n  /**\n   * The executor function responsible for invoking each middleware handler.\n   */\n  #executor;\n  /**\n   * The final handler to execute when the middleware chain completes successfully.\n   */\n  #finalHandler = DEFAULT_FINAL_HANDLER;\n  /**\n   * Optional error handler to catch and handle exceptions in the middleware pipeline.\n   */\n  #errorHandler;\n  constructor(middleware) {\n    this.#middleware = middleware;\n  }\n  /**\n   * Invokes middleware handlers one at a time.\n   *\n   * Middleware functions are executed recursively until `next` is called.\n   * If a middleware doesn't call `next`, the chain will finish automatically\n   * without executing remaining handlers.\n   *\n   * @param self - The Runner instance scope\n   * @returns A Promise that resolves when the middleware chain completes\n   * @internal\n   */\n  #invoke(self) {\n    const middleware = self.#middleware[self.#currentIndex++];\n    if (!middleware) {\n      return self.#finalHandler();\n    }\n    return self.#executor(middleware, once(self, self.#invoke));\n  }\n  /**\n   * Invokes middleware handlers with error handling.\n   *\n   * Similar to `#invoke`, but catches exceptions and passes them to the error handler.\n   * When an exception is raised, the middleware downstream logic will not run unless\n   * the error handler allows the chain to continue.\n   *\n   * @param self - The Runner instance scope\n   * @returns A Promise that resolves when the middleware chain completes\n   * @internal\n   */\n  #invokeWithErrorManagement(self) {\n    const middleware = self.#middleware[self.#currentIndex++];\n    if (!middleware) {\n      return self.#finalHandler().catch(self.#errorHandler);\n    }\n    return self.#executor(middleware, once(self, self.#invokeWithErrorManagement)).catch(self.#errorHandler);\n  }\n  /**\n   * Sets a custom final handler to execute when the middleware chain completes successfully.\n   *\n   * The final handler is called when the entire middleware pipeline reaches the end\n   * by calling `next` through all handlers. This makes it easier to execute custom\n   * logic that is not part of the chain but must run when the chain ends.\n   *\n   * @param finalHandler - The function to execute when the chain completes\n   * @returns The Runner instance for method chaining\n   *\n   * @example\n   * ```ts\n   * await middleware\n   *   .runner()\n   *   .finalHandler(() => {\n   *     console.log('All middleware completed')\n   *   })\n   *   .run((fn, next) => fn(context, next))\n   * ```\n   */\n  finalHandler(finalHandler) {\n    this.#finalHandler = finalHandler;\n    return this;\n  }\n  /**\n   * Sets a custom error handler to catch exceptions in the middleware pipeline.\n   *\n   * By default, exceptions raised in the middleware pipeline bubble up to the `run`\n   * method and can be captured using a try/catch block. When an exception is raised,\n   * the middleware downstream logic will not run.\n   *\n   * Defining an error handler changes this behavior:\n   * - The `run` method will not throw exceptions\n   * - Errors are caught and passed to the error handler\n   * - Middleware upstream logic (after `next`) can still execute\n   *\n   * @param errorHandler - The function to handle errors\n   * @returns The Runner instance for method chaining\n   *\n   * @example\n   * ```ts\n   * await middleware\n   *   .runner()\n   *   .errorHandler((error) => {\n   *     console.error('Middleware error:', error)\n   *   })\n   *   .run((fn, next) => fn(context, next))\n   * ```\n   */\n  errorHandler(errorHandler) {\n    this.#errorHandler = errorHandler;\n    return this;\n  }\n  /**\n   * Executes the middleware pipeline using the provided executor function.\n   *\n   * The executor function is responsible for invoking each middleware handler with\n   * the appropriate context and the `next` callback. Since you control the executor,\n   * you can pass any data you want to the middleware.\n   *\n   * @param cb - The executor function that invokes each middleware handler\n   * @returns A Promise that resolves when the middleware pipeline completes\n   *\n   * @example\n   * ```ts\n   * const context = { user: null }\n   * type MiddlewareFn = (ctx: typeof context, next: NextFn) => void | Promise<void>\n   *\n   * const middleware = new Middleware<MiddlewareFn>()\n   * middleware.add(async (ctx, next) => {\n   *   ctx.user = await authenticate()\n   *   await next()\n   * })\n   *\n   * await middleware\n   *   .runner()\n   *   .run((fn, next) => fn(context, next))\n   * ```\n   */\n  async run(cb) {\n    this.#executor = cb;\n    if (this.#errorHandler) {\n      return this.#invokeWithErrorManagement(this);\n    }\n    return this.#invoke(this);\n  }\n}\nclass Middleware {\n  #middleware = /* @__PURE__ */ new Set();\n  #middlewareArray;\n  #isFrozen = false;\n  /**\n   * Returns all registered middleware handlers.\n   *\n   * @returns A Set containing all registered middleware handlers\n   */\n  all() {\n    return this.#middleware;\n  }\n  /**\n   * Checks if a specific handler has already been registered as middleware.\n   *\n   * @param handler - The middleware handler to check for\n   * @returns `true` if the handler is registered, `false` otherwise\n   */\n  has(handler) {\n    return this.#middleware.has(handler);\n  }\n  /**\n   * Registers a new middleware handler to the pipeline.\n   *\n   * Adding the same middleware handler multiple times will result in a no-op,\n   * as handlers are stored in a Set to prevent duplicates.\n   *\n   * @param handler - The middleware handler to register\n   * @returns The Middleware instance for method chaining\n   * @throws {Error} If the middleware stack is frozen\n   */\n  add(handler) {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot add new middleware\");\n    }\n    this.#middleware.add(handler);\n    return this;\n  }\n  /**\n   * Removes a specific middleware handler from the pipeline.\n   *\n   * @param handler - The middleware handler to remove\n   * @returns `true` if the handler was removed, `false` if it was not found\n   * @throws {Error} If the middleware stack is frozen\n   */\n  remove(handler) {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot remove middleware\");\n    }\n    return this.#middleware.delete(handler);\n  }\n  /**\n   * Removes all registered middleware handlers from the pipeline.\n   *\n   * @throws {Error} If the middleware stack is frozen\n   */\n  clear() {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot clear middleware\");\n    }\n    this.#middleware.clear();\n  }\n  /**\n   * Merges middleware handlers from another Middleware instance.\n   *\n   * The middleware from the source instance are appended to the current instance.\n   *\n   * @param hooks - The source Middleware instance to merge from\n   * @throws {Error} If the middleware stack is frozen\n   */\n  merge(hooks) {\n    if (this.#isFrozen) {\n      throw new Error(\"Middleware stack is frozen. Cannot merge middleware\");\n    }\n    hooks.all().forEach((handler) => {\n      this.add(handler);\n    });\n  }\n  /**\n   * Freezes the middleware stack to prevent further modifications.\n   *\n   * Once frozen, the middleware array is cached and no new handlers can be added,\n   * removed, or modified. This method is automatically called when creating a runner.\n   */\n  freeze() {\n    if (this.#isFrozen) {\n      return;\n    }\n    this.#isFrozen = true;\n    this.#middlewareArray = [...this.all()];\n  }\n  /**\n   * Creates and returns a Runner instance to execute the middleware pipeline.\n   *\n   * This method automatically freezes the middleware stack to prevent modifications\n   * during execution.\n   *\n   * @returns A new Runner instance configured with the current middleware handlers\n   */\n  runner() {\n    this.freeze();\n    return new Runner(this.#middlewareArray);\n  }\n}\nconst version = \"1.20251213.1\";\nexport {\n  Middleware,\n  Runner,\n  version\n};\n//# sourceMappingURL=index.mjs.map\n","import { DateTime } from 'luxon'\nimport { version } from '../../../'\nimport { default as YAML } from 'yaml'\nimport { default as pMap } from 'p-map'\nimport { Middleware } from '@nhtio/middleware'\nimport { encode, decode } from '../../encoding'\nimport { negotiateContent } from '../utils/http'\nimport { validator } from '@nhtio/lucid-resourceful/joi'\nimport { isObject, isResourcefulModel } from '../../type_guards'\nimport { resolveModelDisplayColumn } from '../utils/relationships'\nimport { E_MISSING_CURRENT_INSTANCE_ID } from '@nhtio/lucid-resourceful/errors'\nimport { ResourcefulRouterModelResolverService } from './resourceful_router_model_resolver_service'\nimport type { NextFn } from '@nhtio/middleware'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { Schema } from '@nhtio/lucid-resourceful/joi'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\nimport type { ResourcefulRouterOptionsService } from './resourceful_router_options_service'\nimport type { ResourcefulModelController } from '../controllers/resourceful_model_controller'\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  return value\n}\n\nconst makeEncodable = (data: any): any => {\n  if (Array.isArray(data)) {\n    return data.map((item) => makeEncodable(item))\n  }\n  if (data instanceof Date) {\n    return DateTime.fromJSDate(data).toISO()\n  }\n  if (data instanceof DateTime) {\n    return data.toISO()\n  }\n  if (isObject(data)) {\n    return Object.fromEntries(\n      Object.entries(data).map(([key, value]) => [key, makeEncodable(value)])\n    )\n  }\n  return data\n}\n\ntype ResourcefulRouterChoicesServiceMiddlewareContext = {\n  ctx: HttpContext\n  app: ApplicationService\n  query: DatabaseQueryBuilderContract\n}\n\ntype ResourcefulRouterChoicesServiceMiddlewareFn = (\n  ctx: ResourcefulRouterChoicesServiceMiddlewareContext,\n  next: NextFn\n) => void | Promise<void>\n\ntype ResourcefulRouterChoicesRequestAttributes = {\n  uid: string | number | bigint\n  modelValue: string | number | bigint\n  search: string\n  exclude: Array<string | number | bigint>\n}\n\nexport class ResourcefulRouterChoicesService {\n  readonly #options: ResourcefulRouterOptionsService\n  // @ts-ignore\n  readonly #models: ResourcefulRouterModelResolverService\n  // @ts-ignore\n  readonly #controllers: Map<string, ResourcefulModelController>\n\n  constructor(\n    options: ResourcefulRouterOptionsService,\n    models: ResourcefulRouterModelResolverService,\n    controllers: Map<string, ResourcefulModelController>\n  ) {\n    this.#options = options\n    this.#models = models\n    this.#controllers = controllers\n  }\n\n  async #resolveRequestRequirements(ctx: HttpContext) {\n    const { default: app } = await import('@adonisjs/core/services/app')\n    const serveAs = negotiateContent(ctx)\n    const method = ctx.request.method() || 'GET'\n    const url = ctx.request.url() || '/'\n    const respond = (status: number, body: any, headers: { [key: string]: string } = {}) => {\n      ctx.response.status(status)\n      // apply macro-level headers\n      Object.entries(this.#options.headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // apply request-level headers\n      Object.entries(headers).forEach(([key, value]) => {\n        ctx.response.header(key, value)\n      })\n      // if response is requested as encoded, return as encoded plaintext\n      if (ctx.request.header('x-resourceful-response-encoded') === '1') {\n        ctx.response.header(\n          'Content-Type',\n          `application/vnd.resourceful.structured; coding=\"zlib+base64\"; ver=\"${version}\"`\n        )\n        const encodable = makeEncodable(body)\n        ctx.response.send(encode(encodable))\n        return\n      }\n      // apply content-type headers\n      switch (serveAs) {\n        case 'yaml':\n          ctx.response.header('Content-Type', 'application/x-yaml')\n          break\n        default:\n          ctx.response.header('Content-Type', 'application/json')\n          break\n      }\n      if ('undefined' !== typeof body && 204 !== status) {\n        switch (serveAs) {\n          case 'yaml':\n            ctx.response.send(YAML.stringify(body, encoder))\n            break\n          default:\n            ctx.response.send(JSON.stringify(body, encoder))\n            break\n        }\n      }\n    }\n    return {\n      app,\n      serveAs,\n      method,\n      url,\n      respond,\n    }\n  }\n\n  async #resolveModel(modelName: string): Promise<ResourcefulModel | undefined> {\n    const resolvedModelEntries = await pMap(\n      Object.getOwnPropertyNames(this.#models),\n      async (name) => {\n        const modelOrError = await this.#models[name]\n        if (!isResourcefulModel(modelOrError)) {\n          return [name, undefined] as const\n        }\n        return [modelOrError.name, modelOrError] as const\n      },\n      { concurrency: 5 }\n    )\n    const resolvedModels = Object.fromEntries(resolvedModelEntries)\n    return resolvedModels[modelName]\n  }\n\n  #extractValidatedRequestAttribute<A extends keyof ResourcefulRouterChoicesRequestAttributes>(\n    attribute: A,\n    schema: Schema<any>,\n    ctx: HttpContext\n  ): ResourcefulRouterChoicesRequestAttributes[A] | undefined {\n    const original = ctx.request.input(attribute)\n    if ('undefined' === typeof original || null === original) {\n      return undefined\n    }\n    const { error, value } = schema.validate(original, { abortEarly: true, convert: true })\n    if (error) {\n      return undefined\n    }\n    return value as ResourcefulRouterChoicesRequestAttributes[A]\n  }\n\n  #getValidatedValue<A>(value: unknown, schema: Schema<any>, fallback: A): A {\n    const { error, value: validated } = schema.validate(value, { abortEarly: true, convert: true })\n    if (error) {\n      return fallback\n    }\n    return validated as A\n  }\n\n  async handleRequest(ctx: HttpContext) {\n    const { respond, app } = await this.#resolveRequestRequirements(ctx)\n    /*\n     |--------------------------------------------------------------------------\n     | Decode model and relationship information from the URL\n     |--------------------------------------------------------------------------\n     */\n    const doubleEncoded = Array.isArray(ctx.params['*']) ? ctx.params['*'][0] : ctx.params['*']\n    if ('string' !== typeof doubleEncoded) {\n      return respond(400, [])\n    }\n    const encoded = decodeURIComponent(doubleEncoded)\n    let decoded: any = {}\n    try {\n      decoded = decode(encoded)\n    } catch {\n      return respond(400, [])\n    }\n    const { ResourcefulModel, relationship } = decoded as {\n      ResourcefulModel: string\n      relationship: string\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Resolve the model from the name of the model class\n     |--------------------------------------------------------------------------\n     */\n    const model = await this.#resolveModel(ResourcefulModel)\n    if (!model) {\n      return respond(404, [])\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Resolve the relationship from the model\n     |--------------------------------------------------------------------------\n     */\n    const resourcefulRelationship = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationship) {\n      return respond(404, [])\n    }\n    const relatedModel = resourcefulRelationship.relatedModel()\n    if (!isResourcefulModel(relatedModel)) {\n      return respond(404, [])\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Check the ACL for reading the related model from the rules on the\n     | base model's relationship definition\n     |--------------------------------------------------------------------------\n     */\n    const canReadFilterResults = await pMap(\n      resourcefulRelationship.readAccessControlFilters,\n      async (filter) => filter(ctx, app),\n      { concurrency: 5 }\n    )\n    if (canReadFilterResults.includes(false)) {\n      return respond(403, [])\n    }\n    /*\n     |--------------------------------------------------------------------------\n     | Enqueue all scope hooks for the related model\n     |--------------------------------------------------------------------------\n     */\n    const middleware = new Middleware<ResourcefulRouterChoicesServiceMiddlewareFn>()\n    /*\n     |--------------------------------------------------------------------------\n     | Initialize the query so that we can apply scopes\n     |--------------------------------------------------------------------------\n     */\n    const valueColumn = relatedModel.primaryKey\n    const displayColumn = resolveModelDisplayColumn(relatedModel)\n    /*\n     |--------------------------------------------------------------------------\n     | Not used in MVP\n     |--------------------------------------------------------------------------\n     | This functionality will aide in pagination in the future, but it's not\n     | needed for the MVP\n     */\n    // @ts-ignore\n    const modelValue = this.#extractValidatedRequestAttribute(\n      'modelValue',\n      validator.alternatives(validator.string(), validator.number(), validator.bigint()),\n      ctx\n    )\n    // @ts-ignore\n    const search = this.#extractValidatedRequestAttribute('search', validator.string().trim(), ctx)\n    // @ts-ignore\n    const exclude = this.#extractValidatedRequestAttribute(\n      'exclude',\n      validator\n        .array()\n        .items(validator.alternatives(validator.string(), validator.number(), validator.bigint())),\n      ctx\n    )\n\n    const connectionClient = relatedModel.$adapter.modelConstructorClient(relatedModel)\n    const queryTable = relatedModel.table\n    const query: DatabaseQueryBuilderContract = connectionClient.query().from(queryTable)\n    if (Array.isArray(this.#options.scopeRestrictors)) {\n      this.#options.scopeRestrictors.forEach((restrictor) => {\n        middleware.add(async (_, next) => {\n          await restrictor(ctx, app, query, relatedModel)\n          await next()\n        })\n      })\n    }\n    if (Array.isArray(relatedModel.$resourcefulQueryScopeCallbacks.list)) {\n      relatedModel.$resourcefulQueryScopeCallbacks.list.forEach((scopeCallback) => {\n        middleware.add(async (_, next) => {\n          await scopeCallback(ctx, app, query, relatedModel)\n          await next()\n        })\n      })\n    }\n    if (model.table === relatedModel.table) {\n      /*\n      |--------------------------------------------------------------------------\n      | Self-referential relationships\n      |--------------------------------------------------------------------------\n      | For self-referential relationships, we require the current model's \n      | primary key value as a query parameter to avoid returning the base\n      | model itself in the choices.\n      */\n      const currentModelInstanceId = this.#extractValidatedRequestAttribute(\n        'uid',\n        validator.alternatives(validator.string(), validator.number(), validator.bigint()),\n        ctx\n      )\n      if (!currentModelInstanceId) {\n        throw new E_MISSING_CURRENT_INSTANCE_ID()\n      }\n      middleware.add(async (_, next) => {\n        // currentInstanceModelId.toString() is used to cast to a string to handle\n        // bigint values which are not natively supported by the query builder\n        query.whereNot(`${queryTable}.${valueColumn}`, currentModelInstanceId.toString())\n        await next()\n      })\n    }\n    await middleware.runner().run(async (fn, next) => fn({ ctx, app, query }, next))\n    const countQuery = query.clone().count(`${valueColumn} as total`)\n    /*\n     |--------------------------------------------------------------------------\n     | Dev Note\n     |--------------------------------------------------------------------------\n     | In the MVP we will return all of the results without any additional\n     | filtration since the front-end will be handling that for now, and we\n     | are not likely to have an issue until we hit 10,000+ results.\n     |\n     | In the future we will add a proper pagination mechanism and have it\n     | coordinate with the front end using the ignored `modelValue`, `search`,\n     | and `exclude` parameters.\n     |--------------------------------------------------------------------------\n     |\n     | The `total` count will be eventually used as part of the pagination\n     | functionality, and in order to maintain the contract that the `choices`\n     | will be an attribute of the returned payload instead of the entire\n     | returned payload, and because we already have the count query separated out\n     | we are leaving it in during the MVP\n     */\n    const resultsQuery = query\n      .clone()\n      .select(`${valueColumn} as value`, `${displayColumn} as title`)\n    const [countResults, choices] = await Promise.all([countQuery.first(), resultsQuery])\n    const total = this.#getValidatedValue<number>(countResults?.total, validator.number().min(0), 0)\n    respond(200, {\n      total,\n      choices,\n    })\n  }\n\n  public static async serve(\n    ctx: HttpContext,\n    options: ResourcefulRouterOptionsService,\n    models: ResourcefulRouterModelResolverService,\n    controllers: Map<string, ResourcefulModelController>\n  ) {\n    const instance = new ResourcefulRouterChoicesService(options, models, controllers)\n    return await instance.handleRequest(ctx)\n  }\n}\n","import { ResourcefulRouterVerb } from '../types'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { isObject, isResourcefulModel } from '../../type_guards'\nimport {\n  E_INVALID_RESOURCEFUL_MODELS_MAP,\n  E_UNRESOLVABLE_MODEL,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ValidationError } from '@nhtio/lucid-resourceful/joi'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\nimport type { MacroModelsMap, Resolvable, ResourcefulRouterModelMappedOptions } from '../types'\n\nconst MacroModelsMapSchema = joi.object<MacroModelsMap>().pattern(\n  joi.string().min(1).required(),\n  joi\n    .object<ResourcefulRouterModelMappedOptions>({\n      model: joi.alternatives(\n        joi.function().class(),\n        joi\n          .object()\n          .instance(Promise)\n          .custom((value, helpers) => {\n            if (\n              typeof value.then !== 'function' ||\n              value.then.length === 0 ||\n              typeof value.catch !== 'function' ||\n              value.catch.length === 0\n            ) {\n              return helpers.error('any.invalid')\n            }\n            return value\n          }, 'Promise validation'),\n        joi\n          .function()\n          .arity(0)\n          .custom((value, helpers) => {\n            try {\n              const result = value()\n              if (\n                typeof result === 'object' &&\n                result !== null &&\n                typeof (result as Promise<unknown>).then === 'function' &&\n                (result as Promise<unknown>).then.length > 0 &&\n                typeof (result as Promise<unknown>).catch === 'function' &&\n                (result as Promise<unknown>).catch.length > 0\n              ) {\n                return result\n              } else if (typeof result === 'function') {\n                return helpers.error('any.invalid')\n              } else if (typeof result === 'object' && result !== null && 'default' in result) {\n                return result.default\n              } else {\n                return result\n              }\n            } catch {\n              return helpers.error('any.invalid')\n            }\n          }, 'Lazy import validation')\n      ),\n      crudActionMiddlewares: joi\n        .object(\n          Object.fromEntries([...ResourcefulRouterVerb].map((verb) => [verb, joi.any().optional()]))\n        )\n        .optional(),\n    })\n    .unknown(true)\n)\n\nexport class ResourcefulRouterModelResolverService {\n  readonly #cache: Map<string, Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>>\n  readonly #errors: Map<string, E_UNRESOLVABLE_MODEL>\n  readonly #crudActionMiddlewaresByModel: Map<\n    string,\n    MacroModelsMap[string]['crudActionMiddlewares']\n  >\n  private constructor(map: MacroModelsMap) {\n    this.#cache = new Map<string, Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>>()\n    this.#errors = new Map<string, E_UNRESOLVABLE_MODEL>()\n    this.#crudActionMiddlewaresByModel = new Map<\n      string,\n      MacroModelsMap[string]['crudActionMiddlewares']\n    >()\n    Object.entries(map).forEach(([name, { model: resolveable, crudActionMiddlewares }]) => {\n      this.#cache.set(name, this.#resolveToPromise(name, resolveable))\n      this.#crudActionMiddlewaresByModel.set(name, crudActionMiddlewares)\n      Object.defineProperty(this, name, {\n        get: () => this.#errors.get(name) ?? this.#cache.get(name),\n        enumerable: true,\n        configurable: false,\n      })\n    })\n  }\n\n  // @ts-ignore\n  public getCrudActionMiddlewaresForModel(\n    modelName: string\n  ): MacroModelsMap[string]['crudActionMiddlewares'] | undefined {\n    return this.#crudActionMiddlewaresByModel.get(modelName)\n  }\n\n  async #resolveToPromise(\n    name: string,\n    resolveable: Resolvable<ResourcefulModel>\n  ): Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL> {\n    if (isResourcefulModel(resolveable)) {\n      return resolveable\n    }\n    let resolved: unknown\n    try {\n      if (typeof resolveable === 'function') {\n        resolved = await Promise.resolve(resolveable())\n      } else {\n        resolved = await Promise.resolve(resolveable)\n      }\n    } catch (err) {\n      const e = new E_UNRESOLVABLE_MODEL(name, err)\n      this.#errors.set(name, e)\n      return e\n    }\n    if (isResourcefulModel(resolved)) {\n      return resolved\n    }\n    if (isObject(resolved) && 'default' in resolved && isResourcefulModel(resolved.default)) {\n      return resolved.default\n    }\n    const e = new E_UNRESOLVABLE_MODEL(name)\n    this.#errors.set(name, e)\n    return e\n  }\n\n  [key: string]: Promise<ResourcefulModel> | E_UNRESOLVABLE_MODEL | undefined\n\n  public static init(map: unknown): ResourcefulRouterModelResolverService {\n    const { error, value } = MacroModelsMapSchema.validate(map, {\n      abortEarly: true,\n      convert: true,\n      allowUnknown: false,\n      stripUnknown: true,\n    }) as { error?: ValidationError; value: MacroModelsMap }\n    if (error) {\n      throw new E_INVALID_RESOURCEFUL_MODELS_MAP(error)\n    }\n    return new ResourcefulRouterModelResolverService(value)\n  }\n}\n","import { DateTime } from 'luxon'\nimport { default as qs } from 'qs'\nimport { default as YAML } from 'yaml'\nimport { default as pMap } from 'p-map'\nimport { deepmerge } from 'deepmerge-ts'\nimport { default as string } from '@poppinss/string'\nimport { ResourcefulAggregateMethods } from '../../mixin'\nimport { validator as joi, encode } from '@nhtio/validation'\nimport { stripUndefinedValuesFromObject } from '../../utils'\nimport { isObject, isResourcefulModel } from '../../type_guards'\nimport { encode as minify } from '@nhtio/lucid-resourceful/encoding'\nimport { ResourcefulHttpVerb, ResourcefulRouterVerb } from '../types'\nimport { E_UNRESOLVABLE_MODEL } from '@nhtio/lucid-resourceful/errors'\nimport { isAdditionalResourcefulRouteDetails } from '../utils/type_guards'\nimport { getPossibleHttpErrorCodes, describeHttpError } from '../utils/http'\nimport { ResourcefulModelController } from '../controllers/resourceful_model_controller'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { ResourcefulResponseFormat } from '../types'\nimport type { HttpContext, Request } from '@adonisjs/core/http'\nimport type { ResourcefulModelOpenApiSchema } from '../../types'\nimport type { default as ApplicationService } from '@adonisjs/core/services/app'\nimport type { ResourcefulRouterOptionsService } from './resourceful_router_options_service'\nimport type { ResourcefulRouterModelResolverService } from './resourceful_router_model_resolver_service'\nimport type {\n  ResourcefulModel,\n  ResourcefulIndexResult,\n  AnySchema,\n  RouteCallback,\n  AdditionalResourcefulRouteDetails,\n} from '@nhtio/lucid-resourceful/types'\n\nenum HttpMethodSortOrder {\n  'get' = 1,\n  'post' = 2,\n  'put' = 3,\n  'patch' = 4,\n  'delete' = 5,\n  'head' = 6,\n  'options' = 7,\n}\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  return value\n}\n\nexport class ResourcefulRouterOpenApiDocumentService {\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #modelMap: ResourcefulRouterModelResolverService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #app: typeof ApplicationService\n  readonly #models: Map<string, ResourcefulModel>\n  readonly #modelReadSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n  readonly #modelWriteSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n\n  constructor(\n    opts: ResourcefulRouterOptionsService,\n    modelMap: ResourcefulRouterModelResolverService,\n    controllers: Map<string, ResourcefulModelController>,\n    app: typeof ApplicationService\n  ) {\n    this.#opts = opts\n    this.#modelMap = modelMap\n    this.#controllers = controllers\n    this.#app = app\n    this.#models = new Map<string, ResourcefulModel>()\n    this.#modelReadSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n    this.#modelWriteSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n  }\n\n  async boot(ctx: HttpContext) {\n    const names = Object.getOwnPropertyNames(this.#modelMap)\n    await pMap(\n      names,\n      async (name) => {\n        const cached = this.#models.get(name)\n        if (cached) {\n          const [readable, writeable] = await Promise.all([\n            cached.$asOpenApiSchemaObject(ctx, this.#app, 'read'),\n            cached.$asOpenApiSchemaObject(ctx, this.#app, 'write'),\n          ])\n          this.#modelReadSchemas.set(cached, readable)\n          this.#modelWriteSchemas.set(cached, writeable)\n          return\n        }\n        const promiseOrError = this.#modelMap[name]\n        if (promiseOrError instanceof E_UNRESOLVABLE_MODEL) return\n        const resolved = await promiseOrError\n        if (isResourcefulModel(resolved)) {\n          this.#models.set(name, resolved)\n          const [readable, writeable] = await Promise.all([\n            resolved.$asOpenApiSchemaObject(ctx, this.#app, 'read'),\n            resolved.$asOpenApiSchemaObject(ctx, this.#app, 'write'),\n          ])\n          this.#modelReadSchemas.set(resolved, readable)\n          this.#modelWriteSchemas.set(resolved, writeable)\n        }\n      },\n      {\n        concurrency: 5,\n      }\n    )\n  }\n\n  #getBaseUrl(request: Request): string {\n    const protocol = request.protocol()\n    const host = request.host()\n    const url = request.url()\n    const normalizedBase = url.replace(/\\/(openapi|swagger)?(\\.(json|yaml|yml))?$/, '')\n    return `${protocol}://${host}${normalizedBase}`\n  }\n\n  #makeAbsoluteUrl(ctx: HttpContext, path: string): string {\n    const baseUrl = this.#getBaseUrl(ctx.request)\n    while (path.startsWith('/')) {\n      path = path.slice(1)\n    }\n    return [baseUrl, path]\n      .filter((v) => 'string' === typeof v && v.trim().length > 0)\n      .map((v) => v.trim())\n      .join('/')\n  }\n\n  #stringifyQueryObject(obj: any): string {\n    return qs.stringify(obj, { arrayFormat: 'brackets', encode: false })\n  }\n\n  #queryParamExample(obj: any): string {\n    const stringified = this.#stringifyQueryObject(obj)\n    return stringified.replace(/^.*=/, '')\n  }\n\n  #descriptionOfFieldWithPossibleValues(\n    standaloneText: string,\n    possibleValuesText: string,\n    possibleValues: string[]\n  ): string {\n    let ret = standaloneText\n    if (possibleValues.length > 0) {\n      ret += `\\n\\n ${possibleValuesText}:\\n\\n - ${possibleValues.join('\\n - ')}`\n    }\n    return ret\n  }\n\n  #getHeadersForResponseObject(\n    global: {\n      [key: string]: string\n    },\n    model?: {\n      [key: string]: string\n    },\n    additional?: {\n      [key: string]: string\n    }\n  ): { [key: string]: OpenAPIV3.HeaderObject } {\n    const ret: { [key: string]: OpenAPIV3.HeaderObject } = {}\n    const toMerge = [global, model, additional].filter(isObject)\n    const all = deepmerge(...toMerge) as { [key: string]: string }\n    Object.keys(all).forEach((key) => {\n      ret[key] = {}\n    })\n    return ret\n  }\n\n  async #openapi(): Promise<OpenAPIV3.Document['openapi']> {\n    return '3.0.0'\n  }\n\n  async #info(): Promise<OpenAPIV3.Document['info']> {\n    return this.#opts.info\n  }\n\n  async #servers(ctx: HttpContext): Promise<OpenAPIV3.Document['servers']> {\n    return [\n      {\n        url: this.#getBaseUrl(ctx.request),\n      },\n    ]\n  }\n\n  #makeMetaIndexResponseSchema(\n    properties: { [key: string]: any },\n    filterable: { [key: string]: any },\n    sortable: string[],\n    aggregatable: string[],\n    format: ResourcefulResponseFormat = 'json'\n  ) {\n    return {\n      schema: {\n        type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n        properties: {\n          selectable: {\n            description: 'Describes the fields that can be selected for the index response',\n            properties: Object.assign(\n              {},\n              ...Object.keys(properties).map((k) => {\n                const example = 'type' in properties[k] ? properties[k] : { type: 'object' }\n                return {\n                  [k]: {\n                    type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                    properties: {\n                      type: {\n                        type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n                        description: 'The type of the selectable field',\n                        enum: ['integer', 'number', 'string', 'boolean'],\n                      },\n                    },\n                    additionalProperties: true,\n                    required: ['type'],\n                    example: 'json' === format ? example : YAML.stringify(example),\n                  },\n                }\n              })\n            ),\n          },\n          filterable: {\n            description: 'Describes the fields that can be used to filter the index response',\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            properties: Object.assign(\n              {},\n              ...Object.keys(filterable).map((k) => ({\n                [k]: {\n                  type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                  properties: {\n                    type: {\n                      type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n                      description: 'The type of the filterable field',\n                      enum: ['integer', 'number', 'string', 'boolean'],\n                    },\n                  },\n                  additionalProperties: true,\n                  required: ['type'],\n                  example: 'json' === format ? filterable[k] : YAML.stringify(filterable[k]),\n                },\n              }))\n            ),\n          },\n          sortable: {\n            description: 'Describes the fields that can be used to sort the index response',\n            type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n            items: {\n              type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            },\n            uniqueItems: true,\n            example: 'json' === format ? sortable : YAML.stringify(sortable),\n          },\n          aggregatable: {\n            description:\n              'Describes the fields that can return aggregate calculations for the index response',\n            type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n            items: {\n              type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            },\n            uniqueItems: true,\n            example: 'json' === format ? aggregatable : YAML.stringify(aggregatable),\n          },\n        },\n        required: ['selectable', 'filterable', 'sortable', 'aggregatable'],\n      },\n      example:\n        'yaml' === format\n          ? YAML.stringify({\n              selectable: properties,\n              filterable,\n              sortable,\n              aggregatable,\n            })\n          : {\n              selectable: properties,\n              filterable,\n              sortable,\n              aggregatable,\n            },\n    }\n  }\n\n  #makeMetaWriteOperationResponseSchema(\n    properties: { [key: string]: any },\n    schema: AnySchema,\n    encoded: string,\n    format: ResourcefulResponseFormat = 'json'\n  ) {\n    return {\n      schema: {\n        type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n        properties: {\n          schema: {\n            description: 'The OpenAPI schema for the payload',\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            schema: {\n              properties,\n            },\n            example:\n              'yaml' === format\n                ? YAML.stringify(properties, encoder)\n                : JSON.stringify(properties, encoder, 2),\n          },\n          joiSchema: {\n            description: 'The encoded Joi schema for the payload',\n            type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            example: encoded,\n          },\n          joiSchemaDescription: {\n            description: 'The description of the Joi schema for the payload',\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            schema: {\n              additionalProperties: true,\n            },\n            example:\n              'yaml' === format\n                ? YAML.stringify(schema.describe(), encoder)\n                : JSON.stringify(schema.describe(), encoder, 2),\n          },\n        },\n      },\n      example:\n        'yaml' === format\n          ? YAML.stringify(\n              {\n                schema: properties,\n                joiSchema: encoded,\n                joiSchemaDescription: schema.describe(),\n              },\n              encoder\n            )\n          : {\n              schema: properties,\n              joiSchema: encoded,\n              joiSchemaDescription: schema.describe(),\n            },\n    }\n  }\n\n  #makeSchemaForAdditionalRoute(\n    method: ResourcefulHttpVerb,\n    path: string,\n    callbackOrRouteDetails: RouteCallback | AdditionalResourcefulRouteDetails\n  ): OpenAPIV3.OperationObject {\n    const operationId = string.camelCase(`${method}_${path.replace(/^\\//, '_')}`)\n    if (isAdditionalResourcefulRouteDetails(callbackOrRouteDetails)) {\n      const operation: OpenAPIV3.OperationObject = {\n        tags: Array.isArray(callbackOrRouteDetails.tags)\n          ? callbackOrRouteDetails.tags\n          : 'string' === typeof callbackOrRouteDetails.tags\n            ? [callbackOrRouteDetails.tags]\n            : [],\n        summary: callbackOrRouteDetails.title,\n        description: callbackOrRouteDetails.description,\n        operationId,\n        parameters: callbackOrRouteDetails.parameters,\n        requestBody: callbackOrRouteDetails.requestPayloadSchema\n          ? {\n              content: {\n                'application/json': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n                'multipart/form-data': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n                'application/x-yaml': {\n                  schema: callbackOrRouteDetails.requestPayloadSchema,\n                },\n              },\n            }\n          : undefined,\n        responses: callbackOrRouteDetails.responsePayloadSchema\n          ? {\n              '200': {\n                description: 'Successful response',\n                headers: this.#getHeadersForResponseObject(this.#opts.headers),\n                content: {\n                  'application/json': {\n                    schema: callbackOrRouteDetails.responsePayloadSchema,\n                  },\n                  'application/x-yaml': {\n                    schema: callbackOrRouteDetails.responsePayloadSchema,\n                  },\n                },\n              },\n            }\n          : {},\n      }\n      return operation\n    } else {\n      const operation: OpenAPIV3.OperationObject = {\n        tags: [this.#opts.tagMap.additional],\n        summary: `Custom ${method.toUpperCase()} Route`,\n        operationId,\n        responses: {},\n      }\n      return operation\n    }\n  }\n\n  async #paths(ctx: HttpContext): Promise<OpenAPIV3.Document['paths']> {\n    const ret: OpenAPIV3.PathsObject = {\n      '/': {\n        get: {\n          summary: `${this.#opts.info.title} OpenAPI Specification`,\n          operationId: `resourcefulOpenApiSpecRoot`,\n          tags: [this.#opts.tagMap.general],\n          responses: {\n            '200': {\n              description: 'The document you are currently viewing',\n              headers: this.#getHeadersForResponseObject(this.#opts.headers, undefined, {\n                'x-api-version': this.#opts.info.version,\n                'x-api-base-url': this.#getBaseUrl(ctx.request),\n              }),\n              content: {\n                'application/json': {\n                  schema: {\n                    type: 'object',\n                    additionalProperties: true,\n                  },\n                },\n                'application/x-yaml': {\n                  schema: {\n                    type: 'object',\n                    additionalProperties: true,\n                  },\n                },\n              },\n            },\n          },\n        },\n      },\n    }\n    const prefixesAndModels = Array.from(this.#models.entries())\n    await pMap(\n      prefixesAndModels,\n      async ([prefix, model]) => {\n        if (!isResourcefulModel(model)) return\n        const modelController = this.#controllers.get(prefix)\n        if (!modelController) return\n        const asResourceful = await model.$getAsResourcefulForContext(ctx, this.#app)\n        const base = `/${prefix}`\n        const resourcefulModelName = model.$resourcefulName\n        const readable = this.#modelReadSchemas.get(model)\n        const writable = this.#modelWriteSchemas.get(model)\n        if (!readable || !writable) return\n        const creatable = { ...writable }\n        creatable.properties = stripUndefinedValuesFromObject({\n          ...creatable.properties,\n          id: undefined,\n        }) as unknown as OpenAPIV3.SchemaObject['properties']\n        creatable.required = creatable.required\n          ? creatable.required.filter((r) => r !== 'id' && r in creatable.properties!)\n          : []\n        const modelJoiSchema =\n          await ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(\n            model,\n            ctx,\n            this.#app\n          )\n        const modelCreateSchema = joi.object(\n          Object.assign(\n            {},\n            ...Object.keys(creatable.properties!).map((creatablePropertyKey) => {\n              const returnable = { [creatablePropertyKey]: joi.any() }\n              const prop = asResourceful.properties[creatablePropertyKey]\n              if (prop) {\n                const validator = prop.validator\n                if (validator) {\n                  returnable[creatablePropertyKey] = validator\n                }\n              }\n              try {\n                const extracted = modelJoiSchema.extract(creatablePropertyKey)\n                if (extracted) {\n                  returnable[creatablePropertyKey] =\n                    returnable[creatablePropertyKey].concat(extracted)\n                }\n              } catch {\n                // noop\n              }\n              return returnable\n            })\n          )\n        )\n        const modelUpdateSchema = joi.object(\n          Object.assign(\n            {},\n            ...Object.keys(writable.properties!).map((writablePropertyKey) => {\n              const returnable = { [writablePropertyKey]: joi.any() }\n              const prop = asResourceful.properties[writablePropertyKey]\n              if (prop) {\n                const validator = prop.validator\n                if (validator) {\n                  returnable[writablePropertyKey] = validator\n                }\n              }\n              try {\n                const extracted = modelJoiSchema.extract(writablePropertyKey)\n                if (extracted) {\n                  returnable[writablePropertyKey] =\n                    returnable[writablePropertyKey].concat(extracted)\n                }\n              } catch {\n                // noop\n              }\n              return returnable\n            })\n          )\n        )\n        const encodedModelCreateSchema = encode(modelCreateSchema)\n        const encodedModelUpdateSchema = encode(modelUpdateSchema)\n        const propertyNames = readable.properties ? Object.keys(readable.properties) : []\n        const filterable = readable['x-resourceful-filterable'] || []\n        const sortable = readable['x-resourceful-sortable'] || []\n        const aggregatable = readable['x-resourceful-aggregatable'] || []\n\n        const indexResponseFor = (\n          format: 'json' | 'yaml',\n          properties: OpenAPIV3.SchemaObject['properties']\n        ): OpenAPIV3.SchemaObject => {\n          const exampleObject: ResourcefulIndexResult = {\n            records: [\n              { id: 1 },\n              { id: 2 },\n              { id: 3 },\n              { id: 4 },\n              { id: 5 },\n              { id: 6 },\n              { id: 7 },\n              { id: 8 },\n              { id: 9 },\n              { id: 10 },\n            ],\n            total: 100,\n            page: 1,\n            perPage: 10,\n            aggregations:\n              aggregatable.length === 0\n                ? {}\n                : {\n                    [aggregatable[0]]: {\n                      avg: 50,\n                      min: 1,\n                      max: 100,\n                      sum: 500,\n                      countDistinct: 10,\n                      sumDistinct: 500,\n                      avgDistinct: 50,\n                    },\n                  },\n            countQuery: '',\n            recordsQuery: '',\n          }\n          return stripUndefinedValuesFromObject({\n            schema: {\n              type: 'object',\n              properties: {\n                records: {\n                  type: 'array',\n                  items: {\n                    type: 'object',\n                    properties,\n                  },\n                },\n                total: {\n                  type: 'integer',\n                  description: 'The total number of items matching the query',\n                },\n                page: {\n                  type: 'integer',\n                  description: 'The current page number',\n                },\n                perPage: {\n                  type: 'integer',\n                  description: 'The number of items per page',\n                },\n                aggregations: {\n                  type: 'object',\n                  properties: Object.assign(\n                    {},\n                    ...aggregatable.map((f) => ({\n                      [f]: {\n                        type: 'object',\n                        properties: {\n                          avg: {\n                            type: 'number',\n                          },\n                          min: {\n                            type: 'number',\n                          },\n                          max: {\n                            type: 'number',\n                          },\n                          sum: {\n                            type: 'number',\n                          },\n                          countDistinct: {\n                            type: 'number',\n                          },\n                          sumDistinct: {\n                            type: 'number',\n                          },\n                          avgDistinct: {\n                            type: 'number',\n                          },\n                        },\n                      },\n                    }))\n                  ),\n                },\n              },\n            },\n            example:\n              'json' === format\n                ? JSON.stringify(\n                    ResourcefulModelController.resourcefulIndexResultToConsumable(exampleObject),\n                    null,\n                    2\n                  )\n                : 'yaml' === format\n                  ? YAML.stringify(\n                      ResourcefulModelController.resourcefulIndexResultToConsumable(exampleObject)\n                    )\n                  : undefined,\n          })\n        }\n\n        ret[base] = {\n          get: {\n            summary: `Filterable Index of ${resourcefulModelName} Model`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(['serve', resourcefulModelName, 'index'].join('_')),\n            parameters: [\n              {\n                name: 'filter',\n                in: 'query',\n                allowReserved: true,\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'The lucene filter to apply to the results',\n                  'Filterable fields',\n                  Object.keys(filterable)\n                ),\n                required: false,\n                allowEmptyValue: true,\n                schema: {\n                  type: 'string',\n                  example: 'id:[20 TO 30]',\n                },\n                example: this.#queryParamExample({\n                  filter: 'id:[20 TO 30]',\n                }),\n              },\n              {\n                name: 'page',\n                in: 'query',\n                description: 'The page number to return',\n                required: false,\n                schema: {\n                  type: 'integer',\n                  minimum: 1,\n                  example: 1,\n                },\n                example: this.#queryParamExample({\n                  page: 1,\n                }),\n              },\n              {\n                name: 'perPage',\n                in: 'query',\n                description: 'The number of items to return per page',\n                required: false,\n                schema: {\n                  type: 'integer',\n                  minimum: 1,\n                  maximum: 100,\n                  example: 20,\n                },\n                example: this.#queryParamExample({\n                  perPage: 20,\n                }),\n              },\n              {\n                name: 'fields',\n                in: 'query',\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'A comma separated list of the fields to include in the response',\n                  'Available fields',\n                  propertyNames\n                ),\n                required: false,\n                allowEmptyValue: true,\n                style: 'form',\n                explode: false,\n                schema: {\n                  type: 'array',\n                  items: {\n                    type: 'string',\n                    enum: propertyNames,\n                  },\n                },\n                example: this.#queryParamExample({\n                  fields: propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                }),\n              },\n              {\n                name: 'sort',\n                in: 'query',\n                description:\n                  'The sort order to return results in. Sort operations will be applied in the order that they are specified.',\n                required: false,\n                allowEmptyValue: true,\n                explode: true,\n                style: 'deepObject',\n                schema: {\n                  type: 'object',\n                  properties: Object.assign(\n                    {},\n                    ...sortable.map((field) => ({\n                      [field]: {\n                        type: 'string',\n                        enum: ['asc', 'desc'],\n                        default: 'asc',\n                        example: 'asc',\n                      },\n                    }))\n                  ),\n                },\n                example: this.#stringifyQueryObject({\n                  sort:\n                    sortable.length > 0\n                      ? Object.assign(\n                          {},\n                          ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                        )\n                      : { id: 'desc' },\n                }),\n              },\n              aggregatable.length > 0\n                ? {\n                    name: 'aggregations',\n                    in: 'query',\n                    description: this.#descriptionOfFieldWithPossibleValues(\n                      'An object containing a comma separated list of the aggregations to return with the results, per field',\n                      'Aggregatable fields',\n                      aggregatable\n                    ),\n                    required: false,\n                    allowEmptyValue: true,\n                    explode: true,\n                    style: 'deepObject',\n                    schema: {\n                      type: 'object',\n                      properties: Object.assign(\n                        {},\n                        ...aggregatable.map((field) => ({\n                          [field]: {\n                            type: 'array',\n                            items: {\n                              type: 'string',\n                              enum: ResourcefulAggregateMethods,\n                              description: this.#descriptionOfFieldWithPossibleValues(\n                                `The aggregation methods to apply to the ${field} field`,\n                                'Aggregation methods',\n                                Array.from(ResourcefulAggregateMethods)\n                              ),\n                            },\n                          },\n                        }))\n                      ),\n                    },\n                    example: this.#stringifyQueryObject({\n                      aggregations: Object.assign(\n                        {},\n                        ...aggregatable.slice(0, 2).map((field, index) => ({\n                          [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(','),\n                        }))\n                      ),\n                    }),\n                  }\n                : undefined,\n            ].filter(Boolean) as OpenAPIV3.ParameterObject[],\n            responses: {\n              '200': {\n                description: 'A paginated list of model instances matching the requested query',\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.index`),\n                    'x-shortcut-url': this.#makeAbsoluteUrl(\n                      ctx,\n                      [\n                        base,\n                        's',\n                        minify(\n                          stripUndefinedValuesFromObject({\n                            filter: 'id:[20 TO 30]',\n                            page: 1,\n                            perPage: 20,\n                            fields:\n                              propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                            sort:\n                              sortable.length > 0\n                                ? Object.assign(\n                                    {},\n                                    ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                                  )\n                                : { id: 'desc' },\n                            aggregations: aggregatable.length\n                              ? Object.assign(\n                                  {},\n                                  ...aggregatable.slice(0, 2).map((field, index) => ({\n                                    [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(\n                                      ','\n                                    ),\n                                  }))\n                                )\n                              : undefined,\n                          })\n                        ),\n                      ].join('/')\n                    ),\n                  }\n                ),\n                content: {\n                  'application/json': indexResponseFor('json', readable.properties),\n                  'application/x-yaml': indexResponseFor('yaml', readable.properties),\n                },\n              },\n            },\n          },\n          post: {\n            summary: `Create a new ${resourcefulModelName} Model instance`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(['serve', resourcefulModelName, 'create'].join('_')),\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The newly created ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.create`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          put: {\n            summary: `Update an existing ${resourcefulModelName} Model instance with ID in payload`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'putUpdateWithIdInPayload'].join('_')\n            ),\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n                'multipart/form-data': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-yaml': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...writable,\n                    required: undefined,\n                  }),\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The updated ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.update`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n        }\n\n        const metaIndexResponseSchema = this.#makeMetaIndexResponseSchema(\n          readable.properties as any,\n          filterable,\n          sortable,\n          aggregatable\n        )\n\n        const metaCreateOperationResponseSchema = this.#makeMetaWriteOperationResponseSchema(\n          writable.properties as any,\n          modelCreateSchema,\n          encodedModelCreateSchema\n        )\n\n        const metaUpdateOperationResponseSchema = this.#makeMetaWriteOperationResponseSchema(\n          writable.properties as any,\n          modelUpdateSchema,\n          encodedModelUpdateSchema\n        )\n\n        const metaBulkUpdateOperationResponseSchema = {\n          schema: {\n            type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n            properties: deepmerge(\n              stripUndefinedValuesFromObject({\n                filterable: {\n                  ...metaIndexResponseSchema.schema.properties!.filterable,\n                  description: this.#descriptionOfFieldWithPossibleValues(\n                    'The lucene filter used to select the records to update',\n                    'Filterable fields',\n                    Object.keys(filterable)\n                  ),\n                },\n              }),\n              metaUpdateOperationResponseSchema.schema.properties!\n            ),\n          },\n        }\n\n        ret[`${base}/$meta.index`] = {\n          get: {\n            summary: `${resourcefulModelName} index operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'index'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} index operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaIndexResponseSchema,\n                  'application/x-yaml': metaIndexResponseSchema,\n                },\n              },\n            },\n          },\n        }\n        ret[`${base}/$meta.create`] = {\n          get: {\n            summary: `${resourcefulModelName} create operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'create'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} create operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaCreateOperationResponseSchema,\n                  'application/x-yaml': metaCreateOperationResponseSchema,\n                },\n              },\n            },\n          },\n        }\n        ret[`${base}/$meta.update`] = {\n          get: {\n            summary: `${resourcefulModelName} update operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'update'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} update operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaUpdateOperationResponseSchema,\n                  'application/x-yaml': metaUpdateOperationResponseSchema,\n                },\n              },\n            },\n          },\n        }\n        ret[`${base}/$meta.bulk.update`] = {\n          get: {\n            summary: `${resourcefulModelName} bulk.update operation metadata`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'meta', 'for', 'bulkUpdate'].join('_')\n            ),\n            responses: {\n              '200': {\n                description: `The metadata for the ${resourcefulModelName} bulk.update operation`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': metaBulkUpdateOperationResponseSchema,\n                  'application/x-yaml': metaBulkUpdateOperationResponseSchema,\n                },\n              },\n            },\n          },\n        }\n\n        const bulkUpdateResponses = {\n          '201': {\n            description: `The updated ${resourcefulModelName} Model instances`,\n            headers: this.#getHeadersForResponseObject(\n              this.#opts.headers,\n              modelController.options.headers,\n              {\n                'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.bulk.update`),\n              }\n            ),\n            content: {\n              'application/json': {\n                schema: {\n                  type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n                  items: {\n                    ...readable,\n                    type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                  },\n                },\n              },\n              'application/x-yaml': {\n                schema: {\n                  type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n                  items: {\n                    ...readable,\n                    type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n                  },\n                },\n              },\n            },\n          },\n        }\n\n        ret[`${base}/$bulk`] = {\n          put: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by filter`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'putBulkUpdateWithFilter'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'filter',\n                in: 'query',\n                allowReserved: true,\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'The lucene filter to apply to the results',\n                  'Filterable fields',\n                  Object.keys(filterable)\n                ),\n                required: false,\n                allowEmptyValue: true,\n                schema: {\n                  type: 'string',\n                  example: 'id:[20 TO 30]',\n                },\n                example: this.#queryParamExample({\n                  filter: 'id:[20 TO 30]',\n                }),\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n          patch: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by filter`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'patchBulkUpdateWithFilter'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'filter',\n                in: 'query',\n                allowReserved: true,\n                description: this.#descriptionOfFieldWithPossibleValues(\n                  'The lucene filter to apply to the results',\n                  'Filterable fields',\n                  Object.keys(filterable)\n                ),\n                required: false,\n                allowEmptyValue: true,\n                schema: {\n                  type: 'string',\n                  example: 'id:[20 TO 30]',\n                },\n                example: this.#queryParamExample({\n                  filter: 'id:[20 TO 30]',\n                }),\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n        }\n        ret[`${base}/$bulk/{uids}`] = {\n          put: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by unique ids`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'putBulkUpdateWithUniqueIds'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uids',\n                in: 'path',\n                description: `A comma separated list of unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n          patch: {\n            summary: `Bulk update existing ${resourcefulModelName} Model instances by unique ids`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'patchBulkUpdateWithUniqueIds'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uids',\n                in: 'path',\n                description: `A comma separated list of unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1,2,3,4,5',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: creatable,\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: creatable,\n                },\n                'multipart/form-data': {\n                  schema: creatable,\n                },\n                'application/x-yaml': {\n                  schema: creatable,\n                },\n              },\n            },\n            responses: bulkUpdateResponses,\n          },\n        }\n\n        ret[`${base}/s/{encoded}`] = {\n          get: {\n            summary: `Filterable Index Shortcut of ${resourcefulModelName} Model`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'index', 'shortcut'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'encoded',\n                in: 'path',\n                description: `A URL encoded string representing the filter, page, perPage, fields, sort and aggregations parameters, generated via the \\`encode\\` method provided by the \\`@nhtio/lucid-resourceful/encoding\\` package`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: minify(\n                    stripUndefinedValuesFromObject({\n                      filter: 'id:[20 TO 30]',\n                      page: 1,\n                      perPage: 20,\n                      fields: propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                      sort:\n                        sortable.length > 0\n                          ? Object.assign(\n                              {},\n                              ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                            )\n                          : { id: 'desc' },\n                      aggregations: aggregatable.length\n                        ? Object.assign(\n                            {},\n                            ...aggregatable.slice(0, 2).map((field, index) => ({\n                              [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(','),\n                            }))\n                          )\n                        : undefined,\n                    })\n                  ),\n                },\n              },\n            ],\n            responses: {\n              '200': {\n                description: 'A paginated list of model instances matching the requested query',\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.index`),\n                    'x-full-url': this.#makeAbsoluteUrl(\n                      ctx,\n                      [\n                        base,\n                        's',\n                        qs.stringify(\n                          stripUndefinedValuesFromObject({\n                            filter: 'id:[20 TO 30]',\n                            page: 1,\n                            perPage: 20,\n                            fields:\n                              propertyNames.length > 0 ? propertyNames.slice(1, 3).join(',') : 'id',\n                            sort:\n                              sortable.length > 0\n                                ? Object.assign(\n                                    {},\n                                    ...sortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                                  )\n                                : { id: 'desc' },\n                            aggregations: aggregatable.length\n                              ? Object.assign(\n                                  {},\n                                  ...aggregatable.slice(0, 2).map((field, index) => ({\n                                    [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(\n                                      ','\n                                    ),\n                                  }))\n                                )\n                              : undefined,\n                          }),\n                          { addQueryPrefix: true }\n                        ),\n                      ].join('/')\n                    ),\n                  }\n                ),\n                content: {\n                  'application/json': indexResponseFor('json', readable.properties),\n                  'application/x-yaml': indexResponseFor('yaml', readable.properties),\n                },\n              },\n            },\n          },\n        }\n\n        ret[`${base}/{uid}`] = {\n          get: {\n            summary: `Retrieve a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(['serve', resourcefulModelName, 'read'].join('_')),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            responses: {\n              '200': {\n                description: `The requested ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          put: {\n            summary: `Update a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'put', 'update'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'multipart/form-data': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-yaml': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The updated ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.update`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          patch: {\n            summary: `Partially update a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'patch', 'update'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to update`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            requestBody: {\n              content: {\n                'application/json': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-www-form-urlencoded': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'multipart/form-data': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n                'application/x-yaml': {\n                  schema: stripUndefinedValuesFromObject({\n                    ...creatable,\n                    required: undefined,\n                  }),\n                },\n              },\n            },\n            responses: {\n              '201': {\n                description: `The updated ${resourcefulModelName} Model instance`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers,\n                  {\n                    'x-metadata-url': this.#makeAbsoluteUrl(ctx, `${base}/$meta.update`),\n                  }\n                ),\n                content: {\n                  'application/json': {\n                    schema: readable,\n                  },\n                  'application/x-yaml': {\n                    schema: readable,\n                  },\n                },\n              },\n            },\n          },\n          delete: {\n            summary: `Delete a specific ${resourcefulModelName} Model instance by its ID`,\n            tags: [`${resourcefulModelName} Model`],\n            operationId: string.camelCase(\n              ['serve', resourcefulModelName, 'delete', 'remove'].join('_')\n            ),\n            parameters: [\n              {\n                name: 'uid',\n                in: 'path',\n                description: `The unique identifier of the ${resourcefulModelName} Model instance to delete`,\n                required: true,\n                schema: {\n                  type: 'string',\n                  example: '1',\n                },\n              },\n            ],\n            responses: {\n              '204': {\n                description: `The ${resourcefulModelName} Model instance was successfully deleted`,\n                headers: this.#getHeadersForResponseObject(\n                  this.#opts.headers,\n                  modelController.options.headers\n                ),\n              },\n            },\n          },\n        }\n        const relationshipPaths: Set<string> = new Set()\n        await pMap(\n          Array.from(model.$resourcefulRelationships.entries()),\n          async ([name, relationship]) => {\n            const lucidRelationshipDefinition = model.$getRelation(name)\n            if (!lucidRelationshipDefinition) return\n            switch (lucidRelationshipDefinition.type) {\n              case 'hasOne':\n              case 'belongsTo':\n                return\n            }\n            const relatedResourcefulModel = relationship.relatedModel()\n            if (!isResourcefulModel(relatedResourcefulModel)) return\n            let relatedReadable = this.#modelReadSchemas.get(relatedResourcefulModel)\n            if (!relatedReadable) {\n              relatedReadable = await relatedResourcefulModel.$asOpenApiSchemaObject(\n                ctx,\n                this.#app,\n                'read'\n              )\n              this.#modelReadSchemas.set(relatedResourcefulModel, relatedReadable)\n            }\n            if (!relatedReadable) return\n            const relatedResourcefulModelName = relatedResourcefulModel.$resourcefulName\n            const relatedPropertyNames = relatedReadable.properties\n              ? Object.keys(relatedReadable.properties)\n              : []\n            const relatedFilterable = relatedReadable['x-resourceful-filterable'] || []\n            const relatedSortable = relatedReadable['x-resourceful-sortable'] || []\n            const relatedAggregatable = relatedReadable['x-resourceful-aggregatable'] || []\n            const baseWithRelationship = `${base}/{uid}/${name}`\n            relationshipPaths.add(baseWithRelationship)\n            ret[baseWithRelationship] = {\n              get: {\n                summary: `Retrieve the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'read', 'related', name].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'uid',\n                    in: 'path',\n                    description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve related instances for`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: '1',\n                    },\n                  },\n                  {\n                    name: 'filter',\n                    in: 'query',\n                    description: this.#descriptionOfFieldWithPossibleValues(\n                      'The lucene filter to apply to the results',\n                      'Filterable fields',\n                      Object.keys(relatedFilterable)\n                    ),\n                    required: false,\n                    allowEmptyValue: true,\n                    schema: {\n                      type: 'string',\n                      example: 'id:[20 TO 30]',\n                    },\n                    example: this.#queryParamExample({\n                      filter: 'id:[20 TO 30]',\n                    }),\n                  },\n                  {\n                    name: 'page',\n                    in: 'query',\n                    description: 'The page number to return',\n                    required: false,\n                    schema: {\n                      type: 'integer',\n                      minimum: 1,\n                      example: 1,\n                    },\n                    example: this.#queryParamExample({\n                      page: 1,\n                    }),\n                  },\n                  {\n                    name: 'perPage',\n                    in: 'query',\n                    description: 'The number of items to return per page',\n                    required: false,\n                    schema: {\n                      type: 'integer',\n                      minimum: 1,\n                      maximum: 100,\n                      example: 20,\n                    },\n                    example: this.#queryParamExample({\n                      perPage: 20,\n                    }),\n                  },\n                  {\n                    name: 'fields',\n                    in: 'query',\n                    description: this.#descriptionOfFieldWithPossibleValues(\n                      'A comma separated list of the fields to include in the response',\n                      'Available fields',\n                      relatedPropertyNames\n                    ),\n                    required: false,\n                    allowEmptyValue: true,\n                    style: 'form',\n                    explode: false,\n                    schema: {\n                      type: 'array',\n                      items: {\n                        type: 'string',\n                        enum: relatedPropertyNames,\n                      },\n                    },\n                    example: this.#queryParamExample({\n                      fields:\n                        relatedPropertyNames.length > 0\n                          ? relatedPropertyNames.slice(1, 3).join(',')\n                          : 'id',\n                    }),\n                  },\n                  {\n                    name: 'sort',\n                    in: 'query',\n                    description:\n                      'The sort order to return results in. Sort operations will be applied in the order that they are specified.',\n                    required: false,\n                    allowEmptyValue: true,\n                    explode: true,\n                    style: 'deepObject',\n                    schema: {\n                      type: 'object',\n                      properties: Object.assign(\n                        {},\n                        ...relatedSortable.map((field) => ({\n                          [field]: {\n                            type: 'string',\n                            enum: ['asc', 'desc'],\n                            default: 'asc',\n                            example: 'asc',\n                          },\n                        }))\n                      ),\n                    },\n                    example: this.#stringifyQueryObject({\n                      sort:\n                        relatedSortable.length > 0\n                          ? Object.assign(\n                              {},\n                              ...relatedSortable.slice(0, 2).map((field) => ({ [field]: 'desc' }))\n                            )\n                          : { id: 'desc' },\n                    }),\n                  },\n                  relatedAggregatable.length > 0\n                    ? {\n                        name: 'aggregations',\n                        in: 'query',\n                        description: this.#descriptionOfFieldWithPossibleValues(\n                          'An object containing a comma separated list of the aggregations to return with the results, per field',\n                          'Aggregatable fields',\n                          relatedAggregatable\n                        ),\n                        required: false,\n                        allowEmptyValue: true,\n                        explode: true,\n                        style: 'deepObject',\n                        schema: {\n                          type: 'object',\n                          properties: Object.assign(\n                            {},\n                            ...relatedAggregatable.map((field) => ({\n                              [field]: {\n                                type: 'array',\n                                items: {\n                                  type: 'string',\n                                  enum: ResourcefulAggregateMethods,\n                                  description: this.#descriptionOfFieldWithPossibleValues(\n                                    `The aggregation methods to apply to the ${field} field`,\n                                    'Aggregation methods',\n                                    Array.from(ResourcefulAggregateMethods)\n                                  ),\n                                },\n                              },\n                            }))\n                          ),\n                        },\n                        example: this.#stringifyQueryObject({\n                          aggregations: Object.assign(\n                            {},\n                            ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                              [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(','),\n                            }))\n                          ),\n                        }),\n                      }\n                    : undefined,\n                ].filter(Boolean) as OpenAPIV3.ParameterObject[],\n                responses: {\n                  '200': {\n                    description: `A paginated list of related ${relatedResourcefulModelName} Model instances`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers,\n                      {\n                        'x-metadata-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          `${baseWithRelationship}/$meta.index`\n                        ),\n                        'x-shortcut-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          [\n                            baseWithRelationship,\n                            's',\n                            minify(\n                              stripUndefinedValuesFromObject({\n                                filter: 'id:[20 TO 30]',\n                                page: 1,\n                                perPage: 20,\n                                fields:\n                                  relatedPropertyNames.length > 0\n                                    ? relatedPropertyNames.slice(1, 3).join(',')\n                                    : 'id',\n                                sort:\n                                  relatedSortable.length > 0\n                                    ? Object.assign(\n                                        {},\n                                        ...relatedSortable\n                                          .slice(0, 2)\n                                          .map((field) => ({ [field]: 'desc' }))\n                                      )\n                                    : { id: 'desc' },\n                                aggregations: relatedAggregatable.length\n                                  ? Object.assign(\n                                      {},\n                                      ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                                        [field]: ResourcefulAggregateMethods.slice(\n                                          0,\n                                          index + 1\n                                        ).join(','),\n                                      }))\n                                    )\n                                  : undefined,\n                              })\n                            ),\n                          ].join('/')\n                        ),\n                      }\n                    ),\n                    content: {\n                      'application/json': indexResponseFor('json', relatedReadable.properties),\n                      'application/x-yaml': indexResponseFor('yaml', relatedReadable.properties),\n                    },\n                  },\n                },\n              },\n              put: {\n                summary: `Sync the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'update', 'related', name, 'put'].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'uid',\n                    in: 'path',\n                    description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve related instances for`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: '1',\n                    },\n                  },\n                ],\n                requestBody: {\n                  $ref: '#/components/requestBodies/SyncRelatedInstancesRequestBody',\n                },\n                responses: {\n                  204: {\n                    description: `The related ${relatedResourcefulModelName} Model instances were successfully synced`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers\n                    ),\n                  },\n                },\n              },\n              patch: {\n                summary: `Sync the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'update', 'related', name, 'patch'].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'uid',\n                    in: 'path',\n                    description: `The unique identifier of the ${resourcefulModelName} Model instance to retrieve related instances for`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: '1',\n                    },\n                  },\n                ],\n                requestBody: {\n                  $ref: '#/components/requestBodies/SyncRelatedInstancesRequestBody',\n                },\n                responses: {\n                  204: {\n                    description: `The related ${relatedResourcefulModelName} Model instances were successfully synced`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers\n                    ),\n                  },\n                },\n              },\n            }\n            ret[`${baseWithRelationship}/s/{encoded}`] = {\n              get: {\n                summary: `Shortcut to Retrieve the related ${name} ${relatedResourcefulModelName} Model instances for a specific ${resourcefulModelName} Model instance by its ID`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'read', 'related', name, 'shortcut'].join('_')\n                ),\n                parameters: [\n                  {\n                    name: 'encoded',\n                    in: 'path',\n                    description: `A URL encoded string representing the filter, page, perPage, fields, sort and aggregations parameters, generated via the \\`encode\\` method provided by the \\`@nhtio/lucid-resourceful/encoding\\` package`,\n                    required: true,\n                    schema: {\n                      type: 'string',\n                      example: minify(\n                        stripUndefinedValuesFromObject({\n                          filter: 'id:[20 TO 30]',\n                          page: 1,\n                          perPage: 20,\n                          fields:\n                            relatedPropertyNames.length > 0\n                              ? relatedPropertyNames.slice(1, 3).join(',')\n                              : 'id',\n                          sort:\n                            relatedSortable.length > 0\n                              ? Object.assign(\n                                  {},\n                                  ...relatedSortable\n                                    .slice(0, 2)\n                                    .map((field) => ({ [field]: 'desc' }))\n                                )\n                              : { id: 'desc' },\n                          aggregations: relatedAggregatable.length\n                            ? Object.assign(\n                                {},\n                                ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                                  [field]: ResourcefulAggregateMethods.slice(0, index + 1).join(\n                                    ','\n                                  ),\n                                }))\n                              )\n                            : undefined,\n                        })\n                      ),\n                    },\n                  },\n                ],\n                responses: {\n                  '200': {\n                    description: 'A paginated list of model instances matching the requested query',\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers,\n                      {\n                        'x-metadata-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          `${baseWithRelationship}/$meta.index`\n                        ),\n                        'x-full-url': this.#makeAbsoluteUrl(\n                          ctx,\n                          [\n                            baseWithRelationship,\n                            's',\n                            qs.stringify(\n                              stripUndefinedValuesFromObject({\n                                filter: 'id:[20 TO 30]',\n                                page: 1,\n                                perPage: 20,\n                                fields:\n                                  relatedPropertyNames.length > 0\n                                    ? relatedPropertyNames.slice(1, 3).join(',')\n                                    : 'id',\n                                sort:\n                                  relatedSortable.length > 0\n                                    ? Object.assign(\n                                        {},\n                                        ...relatedSortable\n                                          .slice(0, 2)\n                                          .map((field) => ({ [field]: 'desc' }))\n                                      )\n                                    : { id: 'desc' },\n                                aggregations: relatedAggregatable.length\n                                  ? Object.assign(\n                                      {},\n                                      ...relatedAggregatable.slice(0, 2).map((field, index) => ({\n                                        [field]: ResourcefulAggregateMethods.slice(\n                                          0,\n                                          index + 1\n                                        ).join(','),\n                                      }))\n                                    )\n                                  : undefined,\n                              }),\n                              { addQueryPrefix: true }\n                            ),\n                          ].join('/')\n                        ),\n                      }\n                    ),\n                    content: {\n                      'application/json': indexResponseFor('json', relatedReadable.properties),\n                      'application/x-yaml': indexResponseFor('yaml', relatedReadable.properties),\n                    },\n                  },\n                },\n              },\n            }\n            ret[`${baseWithRelationship}/$meta.index`] = {\n              get: {\n                summary: `Related ${relatedResourcefulModelName} index operation metadata`,\n                tags: [`${resourcefulModelName} Model`],\n                operationId: string.camelCase(\n                  ['serve', resourcefulModelName, 'read', 'related', name, 'metadata'].join('_')\n                ),\n                responses: {\n                  '200': {\n                    description: `The metadata for the ${resourcefulModelName} index operation`,\n                    headers: this.#getHeadersForResponseObject(\n                      this.#opts.headers,\n                      modelController.options.headers\n                    ),\n                    content: {\n                      'application/json': this.#makeMetaIndexResponseSchema(\n                        relatedReadable.properties as any,\n                        relatedFilterable,\n                        relatedSortable,\n                        relatedAggregatable\n                      ),\n                      'application/x-yaml': this.#makeMetaIndexResponseSchema(\n                        relatedReadable.properties as any,\n                        relatedFilterable,\n                        relatedSortable,\n                        relatedAggregatable,\n                        'yaml'\n                      ),\n                    },\n                  },\n                },\n              },\n            }\n          },\n          { concurrency: 1 }\n        )\n        this.#opts.security.forEach((def) => {\n          const applyToModel = isObject(def.applyToModels)\n            ? def.applyToModels[prefix]\n            : def.applyToModels\n          if (applyToModel === false || !applyToModel) return\n          const toApply: Map<string, any[]> = new Map()\n          if (applyToModel === true) {\n            toApply.set([base, 'get'].join('|'), [])\n            toApply.set([base, 'post'].join('|'), [])\n            toApply.set([base, 'put'].join('|'), [])\n            toApply.set([base, 'patch'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'get'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'put'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'patch'].join('|'), [])\n            toApply.set([`${base}/{uid}`, 'delete'].join('|'), [])\n            toApply.set([`${base}/$bulk`, 'put'].join('|'), [])\n            toApply.set([`${base}/$bulk`, 'patch'].join('|'), [])\n            toApply.set([`${base}/$bulk/{uids}`, 'put'].join('|'), [])\n            toApply.set([`${base}/$bulk/{uids}`, 'patch'].join('|'), [])\n            toApply.set([`${base}/s/{encoded}`, 'get'].join('|'), [])\n            relationshipPaths.forEach((path) => {\n              toApply.set([path, 'get'].join('|'), [])\n              toApply.set([path, 'put'].join('|'), [])\n              toApply.set([path, 'patch'].join('|'), [])\n            })\n          } else if (isObject(applyToModel)) {\n            Object.entries(applyToModel).forEach(([resourcefulRouterVerb, requiredPermissions]) => {\n              if (!requiredPermissions) return\n              const permissionsToApply = true === requiredPermissions ? [] : requiredPermissions\n              switch (resourcefulRouterVerb) {\n                case 'index':\n                  toApply.set([base, 'get'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/s/{encoded}`, 'get'].join('|'), permissionsToApply)\n                  break\n                case 'create':\n                  toApply.set([base, 'post'].join('|'), permissionsToApply)\n                  break\n                case 'read':\n                  toApply.set([`${base}/{uid}`, 'get'].join('|'), permissionsToApply)\n                  break\n                case 'readRelated':\n                  relationshipPaths.forEach((path) => {\n                    toApply.set([path, 'get'].join('|'), permissionsToApply)\n                    toApply.set([`${path}/s/{encoded}`, 'get'].join('|'), permissionsToApply)\n                  })\n                  break\n                case 'update':\n                  toApply.set([base, 'put'].join('|'), permissionsToApply)\n                  toApply.set([base, 'patch'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/{uid}`, 'put'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/{uid}`, 'patch'].join('|'), permissionsToApply)\n                  break\n                case 'bulkUpdate':\n                  toApply.set([`${base}/$bulk`, 'put'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/$bulk`, 'patch'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/$bulk/{uids}`, 'put'].join('|'), permissionsToApply)\n                  toApply.set([`${base}/$bulk/{uids}`, 'patch'].join('|'), permissionsToApply)\n                  break\n                case 'syncRelated':\n                  relationshipPaths.forEach((path) => {\n                    toApply.set([path, 'put'].join('|'), permissionsToApply)\n                    toApply.set([path, 'patch'].join('|'), permissionsToApply)\n                  })\n                  break\n                case 'delete':\n                  toApply.set([`${base}/{uid}`, 'delete'].join('|'), permissionsToApply)\n                  break\n              }\n            })\n          }\n          toApply.forEach((permissions, relativePathAndMethod) => {\n            const [relativePath, method] = relativePathAndMethod.split('|') as [\n              keyof typeof ret,\n              ResourcefulHttpVerb,\n            ]\n            if (\n              typeof ret[relativePath] === 'undefined' ||\n              !isObject(ret[relativePath]) ||\n              typeof ret[relativePath][method] === 'undefined' ||\n              !isObject(ret[relativePath][method])\n            )\n              return false\n            if (!Array.isArray(ret[relativePath][method].security)) {\n              ret[relativePath][method].security = []\n            }\n            ret[relativePath][method].security.push({\n              [def.key]: permissions,\n            })\n          })\n        })\n        ResourcefulRouterVerb.forEach((verb) => {\n          if (this.#opts.except.includes(verb) || modelController.options.except.includes(verb)) {\n            switch (verb) {\n              case 'index':\n                delete ret[`${base}/$meta.index`]\n                delete ret[`${base}/s/{encoded}`]\n                delete ret[base]?.get\n                break\n              case 'create':\n                delete ret[`${base}/$meta.create`]\n                delete ret[base]?.post\n                break\n              case 'read':\n                delete ret[`${base}/{uid}`]?.get\n                delete ret[`${base}/$meta.read`]\n                break\n              case 'readRelated':\n                Object.entries(ret).forEach(([key]) => {\n                  if (key.startsWith(`${base}/{uid}/`)) {\n                    delete ret[key]?.get\n                  }\n                })\n                break\n              case 'update':\n                delete ret[base]?.put\n                delete ret[base]?.patch\n                delete ret[`${base}/{uid}`]?.put\n                delete ret[`${base}/{uid}`]?.patch\n                delete ret[`${base}/$meta.update`]\n                break\n              case 'bulkUpdate':\n                delete ret[`${base}/$bulk`]?.put\n                delete ret[`${base}/$bulk`]?.patch\n                delete ret[`${base}/$bulk/{uids}`]?.put\n                delete ret[`${base}/$bulk/{uids}`]?.patch\n                delete ret[`${base}/$meta.bulk.update`]\n                break\n              case 'syncRelated':\n                Object.entries(ret).forEach(([key]) => {\n                  if (key.startsWith(`${base}/{uid}/`)) {\n                    delete ret[key]?.put\n                    delete ret[key]?.patch\n                  }\n                })\n                break\n              case 'delete':\n                delete ret[`${base}/{uid}`]?.delete\n                break\n            }\n          }\n        })\n        Object.keys(ret).forEach((key) => {\n          if (isObject(ret[key]) && Object.keys(ret[key]).length === 0) {\n            delete ret[key]\n          }\n        })\n        Object.entries(modelController.options.additional).forEach(\n          ([methodAndRelativePath, callbackOrRouteDetails]) => {\n            const [method, relativePath] = methodAndRelativePath.split('|')\n            if (!ResourcefulHttpVerb.includes(method.toLowerCase() as any)) return\n            const resourcefulHttpMethod = method.toLowerCase() as ResourcefulHttpVerb\n            const pathKey = `${base}/${relativePath}`.replace('//', '/')\n            const schema = this.#makeSchemaForAdditionalRoute(\n              resourcefulHttpMethod,\n              pathKey,\n              callbackOrRouteDetails\n            )\n            const matchingSecuritySchemaDefinitions = this.#opts.security\n              .filter(\n                (def) =>\n                  def.applyToAdditional === true ||\n                  Object.keys(def.applyToAdditional).includes(pathKey)\n              )\n              .map((def) => ({\n                key: def.key,\n                application: isObject(def.applyToAdditional)\n                  ? def.applyToAdditional[pathKey as keyof typeof def.applyToAdditional]!\n                  : def.applyToAdditional,\n              }))\n              .filter((def) => def.application !== false)\n            if (matchingSecuritySchemaDefinitions.length > 0) {\n              if (!schema.security) {\n                schema.security = []\n              }\n              matchingSecuritySchemaDefinitions.forEach((def) => {\n                if (def.application === false) return\n                schema.security!.push({\n                  [def.key]: def.application === true ? [] : def.application,\n                })\n              })\n            }\n            if (!ret[pathKey]) ret[pathKey] = {}\n            if (!ret[pathKey][resourcefulHttpMethod]) ret[pathKey][resourcefulHttpMethod] = schema\n          }\n        )\n      },\n      { concurrency: 10 }\n    )\n    Object.entries(this.#opts.additional).forEach(\n      ([methodAndRelativePath, callbackOrRouteDetails]) => {\n        const [method, relativePath] = methodAndRelativePath.split('|')\n        if (!ResourcefulHttpVerb.includes(method.toLowerCase() as any)) return\n        const resourcefulHttpMethod = method.toLowerCase() as ResourcefulHttpVerb\n        const pathKey = relativePath\n        const schema = this.#makeSchemaForAdditionalRoute(\n          resourcefulHttpMethod,\n          pathKey,\n          callbackOrRouteDetails\n        )\n        const matchingSecuritySchemaDefinitions = this.#opts.security\n          .filter(\n            (def) =>\n              def.applyToAdditional === true ||\n              Object.keys(def.applyToAdditional).includes(methodAndRelativePath)\n          )\n          .map((def) => ({\n            key: def.key,\n            application: isObject(def.applyToAdditional)\n              ? def.applyToAdditional[pathKey as keyof typeof def.applyToAdditional]!\n              : def.applyToAdditional,\n          }))\n          .filter((def) => def.application !== false)\n        if (matchingSecuritySchemaDefinitions.length > 0) {\n          if (!schema.security) {\n            schema.security = []\n          }\n          matchingSecuritySchemaDefinitions.forEach((def) => {\n            if (def.application === false) return\n            schema.security!.push({\n              [def.key]: def.application === true ? [] : def.application,\n            })\n          })\n        }\n        if (!ret[pathKey]) ret[pathKey] = {}\n        if (!ret[pathKey][resourcefulHttpMethod]) ret[pathKey][resourcefulHttpMethod] = schema\n      }\n    )\n    const errorResponseReferences = getPossibleHttpErrorCodes().map((c) => ({\n      [c.toString()]: {\n        $ref: `#/components/responses/${string.camelCase(['error', c].join('_'))}`,\n      },\n    }))\n    Object.entries(ret).forEach(([path, operations]) => {\n      Object.entries(operations!).forEach(([method, operation]) => {\n        if (isObject(operation)) {\n          if (this.#opts.catchThrown) {\n            if (!operation.responses) {\n              operation.responses = {}\n            }\n            operation.responses = deepmerge(\n              operation.responses,\n              ...errorResponseReferences\n            ) as OpenAPIV3.ResponsesObject\n            // @ts-ignore\n            ret[path][method] = operation\n          }\n        }\n      })\n    })\n    return Object.assign(\n      {},\n      ...Object.entries(ret)\n        .sort(([a], [b]) => a.localeCompare(b))\n        .map(([k, v]) => ({\n          [k]: Object.assign(\n            {},\n            ...Object.entries(v!)\n              .sort(([a], [b]) => {\n                const aOrder = HttpMethodSortOrder[a as keyof typeof HttpMethodSortOrder]\n                const bOrder = HttpMethodSortOrder[b as keyof typeof HttpMethodSortOrder]\n                if (!aOrder || !bOrder) return a.localeCompare(b)\n                return aOrder - bOrder\n              })\n              .map(([k2, v2]) => ({ [k2]: v2 }))\n          ),\n        }))\n    )\n  }\n\n  async #components(): Promise<OpenAPIV3.Document['components']> {\n    const syncRelatedInstancesSchema = {\n      type: 'array' as OpenAPIV3.ArraySchemaObjectType,\n      items: {\n        description: 'An object representing a related instance to sync, including pivot data',\n        type: 'object' as OpenAPIV3.NonArraySchemaObjectType,\n        properties: {\n          ruid: {\n            type: 'string' as OpenAPIV3.NonArraySchemaObjectType,\n            description: 'The unique identifier of the related instance',\n            example: '1',\n          },\n        },\n        additionalProperties: true,\n        required: ['ruid'],\n      },\n      uniqueItems: true,\n    }\n\n    const ret: OpenAPIV3.ComponentsObject = {\n      schemas: {},\n      requestBodies: {\n        SyncRelatedInstancesRequestBody: {\n          description:\n            'A request body to sync related instances.\\n\\n**Note**: For Many to Many relationships, additional properties may be specified to update pivot properties.',\n          content: {\n            'application/json': {\n              schema: syncRelatedInstancesSchema,\n              example: JSON.stringify(\n                [{ ruid: '1' }, { ruid: '2', pivotValue: 'foo' }, { ruid: '3' }],\n                null,\n                2\n              ),\n            },\n            'application/x-www-form-urlencoded': {\n              schema: syncRelatedInstancesSchema,\n              example: qs.stringify([\n                { ruid: '1' },\n                { ruid: '2', pivotValue: 'foo' },\n                { ruid: '3' },\n              ]),\n            },\n            'multipart/form-data': {\n              schema: syncRelatedInstancesSchema,\n              example: [{ ruid: '1' }, { ruid: '2', pivotValue: 'foo' }, { ruid: '3' }],\n            },\n            'application/x-yaml': {\n              schema: syncRelatedInstancesSchema,\n              example: YAML.stringify([\n                { ruid: '1' },\n                { ruid: '2', pivotValue: 'foo' },\n                { ruid: '3' },\n              ]),\n            },\n          },\n        },\n      },\n    }\n    if (this.#opts.catchThrown) {\n      if (!ret.responses) {\n        ret.responses = {}\n      }\n      const errorResponses: { [key: string]: OpenAPIV3.ResponseObject } = {}\n      const errorCodes = getPossibleHttpErrorCodes()\n      errorCodes.forEach((code) => {\n        const key = string.camelCase(['error', code].join('_'))\n        const errorCodeSchema: OpenAPIV3.MediaTypeObject = {\n          schema: {\n            type: 'object',\n            required: ['status', 'code', 'message'],\n            properties: {\n              status: {\n                type: 'number',\n                enum: [code],\n                example: code,\n                description: 'The HTTP Status code of the error',\n              },\n              code: {\n                type: 'string',\n                example: 'E_SOME_ERROR_CODE',\n                description:\n                  'A machine readable code used to differentiate different errors within the same HTTP status code',\n              },\n              message: {\n                type: 'string',\n                example: 'Some message which is much friendier to humans',\n                description: 'A message meant to be consumed by non-machine consumers',\n              },\n              help: {\n                type: 'string',\n                example: 'To fix this error, change something',\n                description: 'Optional help text providing guidance on how to resolve the error',\n              },\n              details: {\n                description: 'Array of detailed error information, typically for validation errors',\n                type: 'array',\n                items: {\n                  description:\n                    'Provides field-level information for validation errors or error chain details.',\n                  type: 'object',\n                  required: ['code', 'message'],\n                  properties: {\n                    code: {\n                      type: 'string',\n                      example: 'E_SOME_ERROR_CODE',\n                      description:\n                        'A machine readable code used to differentiate different errors within the same HTTP status code',\n                    },\n                    message: {\n                      type: 'string',\n                      example: 'Some message which is much friendier to humans',\n                      description: 'A message meant to be consumed by non-machine consumers',\n                    },\n                    target: {\n                      type: 'string',\n                      example: 'yourObject.yourObjectField',\n                      description:\n                        'The field or property that caused the error (for validation errors)',\n                    },\n                    context: {\n                      type: 'object',\n                      example: {},\n                      description: 'Additional context information about the error',\n                      additionalProperties: true,\n                    },\n                  },\n                },\n              },\n            },\n          },\n        }\n        errorResponses[key] = {\n          description: describeHttpError(code),\n          headers: this.#getHeadersForResponseObject(this.#opts.headers),\n          content: {\n            'application/json': errorCodeSchema,\n            'application/x-www-form-urlencoded': errorCodeSchema,\n            'multipart/form-data': errorCodeSchema,\n            'application/x-yaml': errorCodeSchema,\n          },\n        }\n      })\n      ret.responses = deepmerge(ret.responses, errorResponses)\n    }\n    const prefixesAndModels = Array.from(this.#models.entries())\n    await pMap(\n      prefixesAndModels,\n      async ([_prefix, model]) => {\n        if (!isResourcefulModel(model)) return\n        const readable = this.#modelReadSchemas.get(model)\n        const key = model.$resourcefulName\n        if (readable && key) {\n          ret.schemas = ret.schemas || {}\n          ret.schemas[key] = readable\n        }\n      },\n      {\n        concurrency: 5,\n      }\n    )\n    const securitySchemas: { [key: string]: OpenAPIV3.SecuritySchemeObject } = {}\n    this.#opts.security.forEach((def) => {\n      securitySchemas[def.key] = def.schema\n    })\n    ret.securitySchemes = securitySchemas\n    return ret\n  }\n\n  async #security(): Promise<OpenAPIV3.Document['security']> {\n    return undefined\n  }\n\n  async #tags(): Promise<OpenAPIV3.Document['tags']> {\n    return undefined\n  }\n\n  async #externalDocs(): Promise<OpenAPIV3.Document['externalDocs']> {\n    return this.#opts.externalDocs || undefined\n  }\n\n  async #getJsonAndYamlCompatibleObject(ctx: HttpContext): Promise<OpenAPIV3.Document> {\n    const [openapi, info, servers, paths, components, security, tags, externalDocs] =\n      await Promise.all([\n        this.#openapi(),\n        this.#info(),\n        this.#servers(ctx),\n        this.#paths(ctx),\n        this.#components(),\n        this.#security(),\n        this.#tags(),\n        this.#externalDocs(),\n      ])\n    return {\n      openapi,\n      info,\n      servers,\n      paths,\n      components,\n      security,\n      tags,\n      externalDocs,\n    }\n  }\n\n  async #serveAsJson(ctx: HttpContext): Promise<void> {\n    const spec = await this.#getJsonAndYamlCompatibleObject(ctx)\n    return ctx.response\n      .header('Content-Type', 'application/json')\n      .status(200)\n      .send(JSON.stringify(spec, encoder))\n  }\n\n  async #serveAsYaml(ctx: HttpContext): Promise<void> {\n    const spec = await this.#getJsonAndYamlCompatibleObject(ctx)\n    return ctx.response\n      .header('Content-Type', 'application/x-yaml')\n      .status(200)\n      .send(YAML.stringify(spec, encoder))\n  }\n\n  async serveAs(format: ResourcefulResponseFormat, ctx: HttpContext): Promise<void> {\n    switch (format) {\n      case 'yaml':\n        return await this.#serveAsYaml(ctx)\n      default:\n        return await this.#serveAsJson(ctx)\n    }\n  }\n}\n","import { deepmerge } from 'deepmerge-ts'\nimport { default as dot } from 'dot-object'\nimport { validator as joi } from '@nhtio/validation'\nimport { ResourcefulRouterOperation } from '../types'\nimport { E_INVALID_RESOURCEFUL_ROUTER_OPTIONS } from '@nhtio/lucid-resourceful/errors'\nimport { SchemaOrReferenceObjectSchema as schemaOrReferenceObjectSchema } from '../utils/openapi_validation_schemas'\nimport {\n  ResourcefulPolicySchema,\n  ResourcefulRouterMutatorOptionsSchema,\n} from './resourceful_router_options_service'\nimport type { ValidationError } from '@nhtio/lucid-resourceful/joi'\nimport type {\n  ResourcefulRouterModelServiceOptions,\n  RouteCallback,\n  AdditionalResourcefulRoutesMap,\n  AdditionalResourcefulRouteDetails,\n} from '../types'\n\nconst DEFAULT_RESOURCEFUL_ROUTER_MODEL_OPTIONS: ResourcefulRouterModelServiceOptions = {\n  middleware: [],\n  except: [],\n  additional: {},\n  headers: {},\n  scopeRestrictors: [],\n  payloadRestrictors: [],\n  policies: [],\n  mutators: {},\n}\n\nconst FORBIDDEN_ADDITIONALS = [\n  'get|/',\n  'get|/$meta.index',\n  'post|/',\n  'get|/$meta.create',\n  'get|/:id',\n  'get|/:id/$meta.read',\n  'get|/:id/:relationship',\n  'get|/:id/:relationship/$meta.index',\n  'put|/:id',\n  'patch|/:id',\n  'get|/$meta.update',\n  'put|/$bulk',\n  'put|/$bulk/:ids',\n  'patch|/$bulk',\n  'patch|/$bulk/:ids',\n  'get|/$meta.$bulk.update',\n  'put|/:id/:relationship',\n  'patch|/:id/:relationship',\n  'get|/:id/:relationship/$meta.sync',\n  'delete|/:id',\n  'get|/$meta.delete',\n]\n\nconst RouteCallbackSchema = joi.function<RouteCallback>().required()\n\nconst AdditionalResourcefulRouteDetailsSchema = joi.object<AdditionalResourcefulRouteDetails>({\n  title: joi.string().optional(),\n  description: joi.string().optional(),\n  handler: RouteCallbackSchema,\n  requestPayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  responsePayloadSchema: schemaOrReferenceObjectSchema.optional(),\n  tags: joi.alternatives(joi.string(), joi.array().items(joi.string())).optional(),\n})\n\nconst AdditionalResourcefulRoutesMapValueSchema = joi.alternatives<\n  RouteCallback | AdditionalResourcefulRouteDetails\n>(RouteCallbackSchema, AdditionalResourcefulRouteDetailsSchema)\n\nconst ResourcefulRouterModelServiceOptionsMiddlewareSchema = joi.alternatives(\n  joi.function(),\n  joi\n    .object({\n      name: joi.string().required(),\n      args: joi.array().optional(),\n    })\n    .unknown(true)\n)\n\nconst ResourcefulRouterModelServiceOptionsSchema = joi.object<ResourcefulRouterModelServiceOptions>(\n  {\n    middleware: joi\n      .alternatives(\n        ResourcefulRouterModelServiceOptionsMiddlewareSchema,\n        joi.array().items(ResourcefulRouterModelServiceOptionsMiddlewareSchema)\n      )\n      .required(),\n    except: joi\n      .array()\n      .items(joi.string().valid(...ResourcefulRouterOperation))\n      .required(),\n    additional: joi\n      .object<AdditionalResourcefulRoutesMap>()\n      .pattern(\n        joi\n          .alternatives(joi.string(), joi.string().disallow(...FORBIDDEN_ADDITIONALS))\n          .match('all'),\n        AdditionalResourcefulRoutesMapValueSchema\n      )\n      .keys(\n        Object.assign({}, ...FORBIDDEN_ADDITIONALS.map((route) => ({ [route]: joi.forbidden() })))\n      )\n      .custom((value, helpers) => {\n        const keys = Object.keys(value)\n        const passed = keys.every((key) => /^(get|post|put|patch|delete)\\|\\/.*$/gm.test(key))\n        if (!passed) {\n          return helpers.error('any.invalid')\n        }\n        return value\n      }),\n    headers: joi.object().pattern(joi.string(), joi.string()).default({}),\n    scopeRestrictors: joi\n      .array()\n      .items(\n        joi.alternatives(\n          joi.function().arity(0),\n          joi.function().arity(1),\n          joi.function().arity(2),\n          joi.function().arity(3)\n        )\n      )\n      .optional()\n      .default([]),\n    payloadRestrictors: joi\n      .array()\n      .items(\n        joi.alternatives(joi.function().arity(0), joi.function().arity(1), joi.function().arity(2))\n      )\n      .optional()\n      .default([]),\n    policies: joi.array().items(ResourcefulPolicySchema).optional().default([]),\n    mutators: ResourcefulRouterMutatorOptionsSchema.optional().default({}),\n  }\n)\n\nexport class ResourcefulRouterModelServiceOptionsService {\n  readonly #options: ResourcefulRouterModelServiceOptions\n\n  private constructor(options: ResourcefulRouterModelServiceOptions) {\n    this.#options = Object.freeze(deepmerge({}, options))\n    Object.defineProperty(this, 'middleware', {\n      get: () => this.#options.middleware,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'except', {\n      get: () => this.#options.except,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'additional', {\n      get: () => this.#options.additional,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'headers', {\n      get: () => this.#options.headers,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'scopeRestrictors', {\n      get: () => this.#options.scopeRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'payloadRestrictors', {\n      get: () => this.#options.payloadRestrictors,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'policies', {\n      get: () => this.#options.policies,\n      enumerable: true,\n      configurable: false,\n    })\n    Object.defineProperty(this, 'mutators', {\n      get: () => this.#options.mutators,\n      enumerable: true,\n      configurable: false,\n    })\n  }\n\n  declare middleware: Readonly<ResourcefulRouterModelServiceOptions['middleware']>\n  declare except: Readonly<ResourcefulRouterModelServiceOptions['except']>\n  declare additional: Readonly<ResourcefulRouterModelServiceOptions['additional']>\n  declare headers: Readonly<ResourcefulRouterModelServiceOptions['headers']>\n  declare scopeRestrictors: Readonly<ResourcefulRouterModelServiceOptions['scopeRestrictors']>\n  declare payloadRestrictors: Readonly<ResourcefulRouterModelServiceOptions['payloadRestrictors']>\n  declare policies: Readonly<ResourcefulRouterModelServiceOptions['policies']>\n  declare mutators: Readonly<ResourcefulRouterModelServiceOptions['mutators']>\n\n  get(key: string): any {\n    return dot.pick(key, this.#options, false)\n  }\n\n  public static init(options: unknown): ResourcefulRouterModelServiceOptionsService {\n    // step 1: at minimum, ensure that we are dealing with an object\n    const { error: checkIfObjectError } = joi.object().unknown(true).required().validate(options, {\n      abortEarly: true,\n    })\n    if (checkIfObjectError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(checkIfObjectError)\n    }\n    // step 2: create an object which is merged with the defaults\n    const mergedOptions = deepmerge(DEFAULT_RESOURCEFUL_ROUTER_MODEL_OPTIONS, options)\n    // step 3: validate the merged options\n    const {\n      error: ResourcefulRouterModelServiceOptionsValidationError,\n      value: ResourcefulRouterModelServiceOptions,\n    } = ResourcefulRouterModelServiceOptionsSchema.validate(mergedOptions, {\n      abortEarly: false,\n      convert: true,\n      allowUnknown: true,\n      stripUnknown: true,\n    }) as { error?: ValidationError; value: ResourcefulRouterModelServiceOptions }\n    if (ResourcefulRouterModelServiceOptionsValidationError) {\n      throw new E_INVALID_RESOURCEFUL_ROUTER_OPTIONS(\n        ResourcefulRouterModelServiceOptionsValidationError\n      )\n    }\n    const instance = new ResourcefulRouterModelServiceOptionsService(\n      ResourcefulRouterModelServiceOptions\n    )\n    return instance\n  }\n}\n","/*\n|--------------------------------------------------------------------------\n| Resourceful Router Module\n|--------------------------------------------------------------------------\n|\n| This module contains all the components needed for the resourceful router\n| macro functionality, including validation, route generation, OpenAPI\n| generation, and route registration services.\n|\n*/\nimport { negotiateContent } from './utils/http'\nimport { ResourcefulRouterVerb } from './types'\nimport { isAdditionalResourcefulRouteDetails } from './utils/type_guards'\nimport { ResourcefulHttpContext } from './services/resourceful_router_context_service'\nimport { ResourcefulModelController } from './controllers/resourceful_model_controller'\nimport { ResourcefulErrorMiddleware } from './middlewares/resourceful_error_middleware'\nimport { ResourcefulRouterOptionsService } from './services/resourceful_router_options_service'\nimport { ResourcefulRouterChoicesService } from './services/resourceful_router_choices_service'\nimport { ResourcefulRouterModelResolverService } from './services/resourceful_router_model_resolver_service'\nimport { ResourcefulRouterOpenApiDocumentService } from './services/resourceful_router_openapi_document_service'\nimport { ResourcefulRouterModelServiceOptionsService } from './services/resourceful_router_model_options_service'\nimport {\n  E_UNRESOLVABLE_MODEL,\n  E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE,\n  E_INVALID_HTTP_METHOD_EXCEPTION,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { HttpContext, Router, RouteGroup } from '@adonisjs/core/http'\nimport type { ResourcefulHttpContextResolver } from './services/resourceful_router_context_service'\nimport type {\n  RouteCallback,\n  ResourcefulHttpVerb,\n  MacroModelsMap,\n  ResourcefulRouterOptions,\n  ResourcefulRouterMacro,\n  MiddlewareFn,\n  ParsedNamedMiddleware,\n} from './types'\n\nclass ResourcefulRouterService {\n  readonly #router: Router\n  readonly #rawModelMap: MacroModelsMap\n  readonly #options?: Partial<ResourcefulRouterOptions>\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #modelMap: ResourcefulRouterModelResolverService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #group: RouteGroup\n\n  /** @private */\n  constructor(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ) {\n    this.#router = router\n    this.#rawModelMap = rawModelMap\n    this.#options = options\n    this.#controllers = new Map<string, ResourcefulModelController>()\n    this.#opts = ResourcefulRouterOptionsService.init(this.#options)\n    this.#modelMap = ResourcefulRouterModelResolverService.init(this.#rawModelMap)\n    const unresolvableModels: E_UNRESOLVABLE_MODEL[] = []\n    Object.getOwnPropertyNames(this.#modelMap).forEach((name) => {\n      const promiseOrError = this.#modelMap[name]\n      if (promiseOrError instanceof E_UNRESOLVABLE_MODEL) {\n        unresolvableModels.push(promiseOrError)\n      } else if ('undefined' !== typeof promiseOrError) {\n        const modelOptions = ResourcefulRouterModelServiceOptionsService.init(\n          this.#rawModelMap[name as any]\n        )\n        const controller = new ResourcefulModelController(\n          name,\n          promiseOrError,\n          modelOptions,\n          this.#opts.headers,\n          this.#opts.scopeRestrictors,\n          this.#opts.payloadRestrictors,\n          this.#opts.mutators,\n          this.#opts.policies\n        )\n        this.#controllers.set(name, controller)\n      }\n    })\n    if (unresolvableModels.length > 0) {\n      throw new E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE(unresolvableModels)\n    }\n    this.#group = this.#router.group(this.#groupCallback.bind(this))\n    if (this.#opts.prefix !== '/') {\n      this.#group.prefix(this.#opts.prefix)\n    }\n    if (Array.isArray(this.#opts.middleware) && this.#opts.middleware.length > 0) {\n      this.#group.use(Array.from(this.#opts.middleware))\n    } else if (!Array.isArray(this.#opts.middleware) && this.#opts.middleware) {\n      this.#group.use(this.#opts.middleware as any)\n    }\n    if ('string' === typeof this.#opts.domain && this.#opts.domain.length > 0) {\n      this.#group.domain(this.#opts.domain)\n    }\n  }\n\n  #groupCallback() {\n    this.#controllers.forEach((controller, name) => {\n      const controllerGroup = this.#router\n        .group(() => {\n          let crudActionMiddlewares = this.#modelMap.getCrudActionMiddlewaresForModel(name)\n          if ('undefined' === typeof crudActionMiddlewares) {\n            crudActionMiddlewares = Object.fromEntries(\n              [...ResourcefulRouterVerb].map((verb) => [verb, []])\n            )\n          }\n          ResourcefulRouterVerb.forEach((verb) => {\n            crudActionMiddlewares![verb] = Array.isArray(crudActionMiddlewares![verb])\n              ? crudActionMiddlewares![verb]\n              : 'undefined' === typeof crudActionMiddlewares![verb]\n                ? []\n                : [crudActionMiddlewares![verb]]\n          })\n          const modelActionMiddlewares: {\n            [K in ResourcefulRouterVerb]: Array<MiddlewareFn | ParsedNamedMiddleware>\n          } = crudActionMiddlewares as any\n          this.#router.any(\n            `/$meta.choices/*`,\n            this.#processRequest.bind(this, this.#serveResourcefulChoices.bind(this))\n          )\n          Object.entries(controller.options.additional).forEach(([methodAndPath, callback]) => {\n            const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n            if (!method || !path) return\n            switch (method) {\n              case 'get':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.get(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.get(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'post':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.post(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.post(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'put':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.put(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.put(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'patch':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.patch(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.patch(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              case 'delete':\n                if (isAdditionalResourcefulRouteDetails(callback)) {\n                  this.#router.delete(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(\n                        null,\n                        controller,\n                        callback.handler\n                      )\n                    )\n                  )\n                } else {\n                  this.#router.delete(\n                    path,\n                    this.#processRequest.bind(\n                      this,\n                      this.#serveInResourcefulModelRouterContext.bind(null, controller, callback)\n                    )\n                  )\n                }\n                break\n              default:\n                throw new E_INVALID_HTTP_METHOD_EXCEPTION([method, path])\n            }\n          })\n          if (\n            !this.#opts.except.includes('index') &&\n            !controller.options.except.includes('index')\n          ) {\n            this.#router\n              .get(\n                '/',\n                this.#processRequest.bind(this, controller.serveModelIndex.bind(controller))\n              )\n              .use(modelActionMiddlewares['index'] as any)\n            this.#router\n              .get(\n                '/s/:encoded',\n                this.#processRequest.bind(this, controller.serveModelShortcut.bind(controller))\n              )\n              .use(modelActionMiddlewares['index'] as any)\n            this.#router.get(\n              '/$meta.index',\n              this.#processRequest.bind(this, controller.serveModelIndexMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('create') &&\n            !controller.options.except.includes('create')\n          ) {\n            this.#router\n              .post(\n                '/',\n                this.#processRequest.bind(this, controller.serveModelCreate.bind(controller))\n              )\n              .use(modelActionMiddlewares['create'] as any)\n            this.#router.get(\n              '/$meta.create',\n              this.#processRequest.bind(this, controller.serveModelCreateMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('update') &&\n            !controller.options.except.includes('update')\n          ) {\n            this.#router.get(\n              '/$meta.update',\n              this.#processRequest.bind(this, controller.serveModelUpdateMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('bulkUpdate') &&\n            !controller.options.except.includes('bulkUpdate')\n          ) {\n            this.#router.get(\n              '/$meta.$bulk.update',\n              this.#processRequest.bind(this, controller.serveModelBulkUpdateMeta.bind(controller))\n            )\n          }\n          if (!this.#opts.except.includes('read') && !controller.options.except.includes('read')) {\n            this.#router\n              .get(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelRead.bind(controller))\n              )\n              .use(modelActionMiddlewares['read'] as any)\n          }\n          if (\n            !this.#opts.except.includes('readRelated') &&\n            !controller.options.except.includes('readRelated')\n          ) {\n            this.#router\n              .get(\n                '/:id/:relationship',\n                this.#processRequest.bind(this, controller.serveModelReadRelated.bind(controller))\n              )\n              .use(modelActionMiddlewares['readRelated'] as any)\n            this.#router\n              .get(\n                '/:id/:relationship/s/:encoded',\n                this.#processRequest.bind(\n                  this,\n                  controller.serveModelReadRelatedShortcut.bind(controller)\n                )\n              )\n              .use(modelActionMiddlewares['readRelated'] as any)\n            this.#router.get(\n              '/:id/:relationship/$meta.index',\n              this.#processRequest.bind(this, controller.serveModelReadRelatedMeta.bind(controller))\n            )\n          }\n          if (\n            !this.#opts.except.includes('bulkUpdate') &&\n            !controller.options.except.includes('bulkUpdate')\n          ) {\n            this.#router\n              .put('/$bulk', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n            this.#router\n              .put('/$bulk/:ids', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n            this.#router\n              .patch('/$bulk', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n            this.#router\n              .patch('/$bulk/:ids', controller.serveModelBulkUpdate.bind(controller))\n              .use(modelActionMiddlewares['bulkUpdate'] as any)\n          }\n          if (\n            !this.#opts.except.includes('syncRelated') &&\n            !controller.options.except.includes('syncRelated')\n          ) {\n            this.#router\n              .put(\n                '/:id/:relationship',\n                this.#processRequest.bind(this, controller.serveModelSyncRelated.bind(controller))\n              )\n              .use(modelActionMiddlewares['syncRelated'] as any)\n            this.#router\n              .patch(\n                '/:id/:relationship',\n                this.#processRequest.bind(this, controller.serveModelSyncRelated.bind(controller))\n              )\n              .use(modelActionMiddlewares['syncRelated'] as any)\n          }\n          if (\n            !this.#opts.except.includes('update') &&\n            !controller.options.except.includes('update')\n          ) {\n            this.#router\n              .put(\n                '/',\n                this.#processRequest.bind(this, controller.serveModelUpdate.bind(controller))\n              )\n              .use(modelActionMiddlewares['update'] as any)\n            this.#router\n              .put(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelUpdate.bind(controller))\n              )\n              .use(modelActionMiddlewares['update'] as any)\n            this.#router\n              .patch(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelUpdate.bind(controller))\n              )\n              .use(modelActionMiddlewares['update'] as any)\n          }\n          if (\n            !this.#opts.except.includes('delete') &&\n            !controller.options.except.includes('delete')\n          ) {\n            this.#router\n              .delete(\n                '/:id',\n                this.#processRequest.bind(this, controller.serveModelDelete.bind(controller))\n              )\n              .use(modelActionMiddlewares['delete'] as any)\n          }\n        })\n        .prefix(name)\n      if (controller.options.middleware) {\n        if (\n          Array.isArray(controller.options.middleware) &&\n          controller.options.middleware.length > 0\n        ) {\n          controllerGroup.use(Array.from(controller.options.middleware))\n        } else if (!Array.isArray(controller.options.middleware) && controller.options.middleware) {\n          controllerGroup.use(controller.options.middleware as any)\n        }\n      }\n    })\n    Object.entries(this.#opts.additional).forEach(([methodAndPath, callback]) => {\n      const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n      if (!method || !path) return\n      if (isAdditionalResourcefulRouteDetails(callback)) {\n        this.#router[method](path, this.#processRequest.bind(this, callback.handler))\n      } else {\n        this.#router[method](path, this.#processRequest.bind(this, callback))\n      }\n    })\n    this.#router.any(\n      '/$meta.choices/*',\n      this.#processRequest.bind(this, this.#serveResourcefulChoices.bind(this))\n    )\n    this.#router.get('/', this.#serveResourcefulRouteIndex.bind(this))\n  }\n\n  async #processRequest(callback: RouteCallback, ctx: HttpContext) {\n    let next: ((ctx: HttpContext) => unknown | PromiseLike<unknown> | Promise<unknown>) | undefined\n    if (typeof callback === 'function') {\n      next = async (c) => await callback(c)\n    } else if (Array.isArray(callback) && callback.length === 2) {\n      const [maybeResolvableController, method] = callback\n      if (\n        method in maybeResolvableController &&\n        typeof maybeResolvableController[method] === 'function'\n      ) {\n        // @ts-ignore\n        next = async (c) => await maybeResolvableController[method](c)\n      } else {\n        // @ts-ignore\n        const resolvedController = maybeResolvableController()\n        if (typeof resolvedController[method] === 'function') {\n          next = async (c) => await resolvedController[method](c)\n        }\n      }\n    }\n    if (!next) return\n    try {\n      await next(ctx)\n    } catch (error) {\n      if (this.#opts.catchThrown && ResourcefulErrorMiddleware.shouldHandle(ctx)) {\n        return await ResourcefulErrorMiddleware.handle(error, ctx, {\n          onVineValidationError: this.#opts.onVineValidationError,\n          onJoiValidationError: this.#opts.onJoiValidationError,\n          onException: this.#opts.onException,\n          onError: this.#opts.onError,\n          onUnknown: this.#opts.onUnknown,\n          onAny: this.#opts.onAny,\n          asYaml: true,\n          headers: this.#opts.headers,\n        })\n      } else {\n        throw error\n      }\n    }\n  }\n\n  async #serveInResourcefulModelRouterContext(\n    controller: ResourcefulModelController,\n    callback: RouteCallback,\n    ctx: HttpContext\n  ) {\n    const resolver: ResourcefulHttpContextResolver = controller.resolveRequestRequirements.bind(\n      controller,\n      ctx\n    ) as ResourcefulHttpContextResolver\n    await ResourcefulHttpContext.run({ resolver }, async () => {\n      if (typeof callback === 'function') {\n        await callback(ctx)\n      } else if (Array.isArray(callback) && callback.length === 2) {\n        const [maybeResolvableController, method] = callback\n        if (\n          method in maybeResolvableController &&\n          typeof maybeResolvableController[method] === 'function'\n        ) {\n          // @ts-ignore\n          await maybeResolvableController[method](ctx)\n        } else {\n          // @ts-ignore\n          const resolvedController = maybeResolvableController()\n          if (typeof resolvedController[method] === 'function') {\n            await resolvedController[method](ctx)\n          }\n        }\n      }\n    })\n  }\n\n  async #serveResourcefulChoices(ctx: HttpContext) {\n    return await ResourcefulRouterChoicesService.serve(\n      ctx,\n      this.#opts,\n      this.#modelMap,\n      this.#controllers\n    )\n  }\n\n  async #serveResourcefulRouteIndex(ctx: HttpContext) {\n    const serveAs = negotiateContent(ctx)\n    if (serveAs === 'html') {\n      return await this.#serveResourcefulRouteIndexHtml(ctx)\n    }\n    const { default: app } = await import('@adonisjs/core/services/app')\n    const service = new ResourcefulRouterOpenApiDocumentService(\n      this.#opts,\n      this.#modelMap,\n      this.#controllers,\n      app\n    )\n    await service.boot(ctx)\n    return await service.serveAs(serveAs, ctx)\n  }\n\n  async #serveResourcefulRouteIndexHtml(ctx: HttpContext) {\n    const html = `<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title inertia>${this.#opts.info.title}</title><script src=\"https://unpkg.com/@stoplight/elements/web-components.min.js\"></script><link rel=\"stylesheet\" href=\"https://unpkg.com/@stoplight/elements/styles.min.css\"><style>elements-api{min-height:100dvh}elements-api .sl-h-full{min-height:100dvh}</style></head><body><elements-api apiDescriptionUrl=${JSON.stringify(ctx.request.url())} router=\"hash\" layout=\"responsive\" /></body></html>`\n    ctx.response.type('text/html')\n    ctx.response.status(200)\n    ctx.response.send(html)\n  }\n\n  get group() {\n    return this.#group\n  }\n\n  public static hook(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ): RouteGroup {\n    const instance = new ResourcefulRouterService(router, rawModelMap, options)\n    return instance.group\n  }\n}\n\nexport const resourcefulRouterMacro: ResourcefulRouterMacro = function (\n  this: Router,\n  models: MacroModelsMap,\n  options: Partial<ResourcefulRouterOptions> = {}\n): RouteGroup {\n  return ResourcefulRouterService.hook(this, models, options)\n}\n\nexport type { ResourcefulRouterService }\n\nexport type GetResourcefulModelCreatePayloadValidationSchemaArgs = Parameters<\n  (typeof ResourcefulModelController)['getResourcefulModelCreatePayloadValidationSchema']\n>\n\nexport const getResourcefulModelCreatePayloadValidationSchema = (\n  ...args: GetResourcefulModelCreatePayloadValidationSchemaArgs\n) => ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(...args)\n","import { isObject } from '../../type_guards'\nimport type { ODataPreference } from './http'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { ResourcefulModel } from '@nhtio/lucid-resourceful/types'\n\nexport const isSimpleIdentifier = (name: unknown): boolean => {\n  if (typeof name !== 'string') {\n    return false\n  }\n  // Must be 1–128 Unicode code points\n  if (!name || [...name].length < 1 || [...name].length > 128) {\n    return false\n  }\n\n  // Regex based on OData \"SimpleIdentifier\" rules\n  // First character: underscore (_) or Unicode category Letter (L) or Letter Number (Nl)\n  // Remaining characters: underscore, Letter, Letter Number, Decimal Number, Non-spacing mark,\n  // Combining spacing mark, Connector punctuation, or Other Format\n  const simpleIdentifierRegex = /^[_\\p{L}\\p{Nl}][_\\p{L}\\p{Nl}\\p{Nd}\\p{Mn}\\p{Mc}\\p{Pc}\\p{Cf}]*$/u\n\n  return simpleIdentifierRegex.test(name)\n}\n\nexport const sanitizeSelect = async (\n  query: Record<string, any>,\n  model: ResourcefulModel,\n  ctx: HttpContext,\n  app: ApplicationService\n): Promise<{ valid: string[] | undefined; isFullSet: boolean }> => {\n  const potential: string[] = []\n  if (typeof query['$select'] === 'string') {\n    potential.push(\n      ...query['$select']\n        .split(',')\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0)\n    )\n  } else if (Array.isArray(query['$select'])) {\n    potential.push(...query['$select'].map((s) => String(s).trim()).filter((s) => s.length > 0))\n  }\n  const readSchema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n  const possible =\n    !isObject(readSchema) || !('properties' in readSchema) || !isObject(readSchema.properties)\n      ? []\n      : Object.keys(readSchema.properties)\n  if (!('$select' in query)) {\n    // Default selection for OData should avoid relationship objects unless explicitly expanded/selected.\n    // Returning relationship fields by default causes deep/cyclic payloads and unstable serialization.\n    const relationshipNames = new Set(\n      Array.from(model.$resourcefulRelationships.keys()).map((k) => k.toLowerCase())\n    )\n    const scalarFields = possible.filter((k) => !relationshipNames.has(String(k).toLowerCase()))\n    if (!scalarFields.includes(model.primaryKey)) {\n      scalarFields.unshift(model.primaryKey)\n    }\n    return { valid: scalarFields, isFullSet: true }\n  }\n  if (potential.length === 0) {\n    return { valid: undefined, isFullSet: false }\n  }\n  if (potential.includes('*')) {\n    // return possible\n    return { valid: possible.filter((k) => k !== model.primaryKey), isFullSet: true }\n  }\n  const valid = potential.filter((p) => possible.includes(p))\n  if (valid.length === 0) {\n    return { valid: undefined, isFullSet: false }\n  }\n  if (!valid.includes(model.primaryKey)) {\n    valid.unshift(model.primaryKey)\n  }\n  return { valid, isFullSet: valid.length === possible.length - 1 }\n}\n\nexport const sanitizeExpand = (query: Record<string, any>): string[] | undefined => {\n  const potential: string[] = []\n  if (typeof query['$expand'] === 'string') {\n    potential.push(\n      ...query['$expand']\n        .split(',')\n        .map((s) => s.trim())\n        .filter((s) => s.length > 0)\n    )\n  } else if (Array.isArray(query['$expand'])) {\n    potential.push(...query['$expand'].map((s) => String(s).trim()).filter((s) => s.length > 0))\n  }\n  if (potential.length === 0) {\n    return\n  }\n  return potential\n}\n\nexport const santizeResponsePayload = (\n  payload: any,\n  selections: string[] | undefined,\n  preference: ODataPreference = 'representation'\n): any => {\n  if (!isObject(payload)) {\n    return payload\n  }\n  if ('minimal' === preference && !Array.isArray(selections)) {\n    return undefined\n  }\n  const ret: any = {}\n  if (Array.isArray(selections)) {\n    for (const key of selections) {\n      if (key in payload) {\n        ret[key] = payload[key]\n      }\n    }\n  } else {\n    Object.assign(ret, payload)\n  }\n  return ret\n}\n\nexport function sanitizeODataKeys(value: unknown, seen: WeakSet<object> = new WeakSet()): unknown {\n  if (\n    typeof value === 'object' &&\n    value !== null &&\n    !Array.isArray(value) &&\n    !(value instanceof Date) &&\n    !(typeof Buffer !== 'undefined' && value instanceof Buffer)\n  ) {\n    if ((value as any).isLuxonDateTime === true) {\n      return value\n    }\n    if (seen.has(value)) {\n      return undefined\n    }\n    seen.add(value)\n\n    const result: Record<string, unknown> = {}\n    for (const key in value as Record<string, unknown>) {\n      const sanitizedKey = key.startsWith('@') ? key : key.replace(/\\./g, '__')\n      result[sanitizedKey] = sanitizeODataKeys((value as Record<string, unknown>)[key], seen)\n    }\n    return result\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => sanitizeODataKeys(item, seen))\n  }\n  return value\n}\n\nexport function desanitizeODataKeys(\n  value: unknown,\n  seen: WeakSet<object> = new WeakSet()\n): unknown {\n  if (\n    typeof value === 'object' &&\n    value !== null &&\n    !Array.isArray(value) &&\n    !(value instanceof Date) &&\n    !(typeof Buffer !== 'undefined' && value instanceof Buffer)\n  ) {\n    if ((value as any).isLuxonDateTime === true) {\n      return value\n    }\n    if (seen.has(value)) {\n      return undefined\n    }\n    seen.add(value)\n\n    const result: Record<string, unknown> = {}\n    for (const key in value as Record<string, unknown>) {\n      const desanitizedKey = key.startsWith('@') ? key : key.replace(/__/g, '.')\n      result[desanitizedKey] = desanitizeODataKeys((value as Record<string, unknown>)[key], seen)\n    }\n    return result\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) => desanitizeODataKeys(item, seen))\n  }\n  return value\n}\n","/*\n|--------------------------------------------------------------------------\n| Internal Helper Functions\n|--------------------------------------------------------------------------\n|\n| Functionality to help keep things DRY\n|\n*/\n\n/**\n * Removes all properties with undefined values from an object.\n * This utility function creates a new object containing only the properties\n * that have defined values, effectively filtering out any undefined properties.\n *\n * @example\n * ```typescript\n * const input = {\n *   name: 'John',\n *   age: undefined,\n *   email: 'john@example.com',\n *   phone: undefined\n * }\n *\n * const result = stripUndefinedValuesFromObject(input)\n * // Result: { name: 'John', email: 'john@example.com' }\n * ```\n *\n * @example\n * ```typescript\n * // Useful for cleaning up optional parameters before API calls\n * const apiParams = stripUndefinedValuesFromObject({\n *   userId: user.id,\n *   filter: searchFilter || undefined,\n *   limit: pageSize || undefined,\n *   offset: currentPage ? currentPage * pageSize : undefined\n * })\n * ```\n *\n * @template T - The type of the input object, must extend Record<string, any>\n * @param {T} obj - The object to filter, removing properties with undefined values\n * @returns {T} A new object of the same type with undefined properties removed\n */\nexport const stripUndefinedValuesFromObject = <T extends Record<string, any>>(obj: T): T => {\n  return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== undefined)) as T\n}\n","import { default as pMap } from 'p-map'\nimport { default as string } from '@poppinss/string'\nimport { stripUndefinedValuesFromObject } from '../../helpers'\nimport { ResourcefulRouterVerb } from '../../router_macro/types'\nimport {\n  isResourcefulModel,\n  isObject,\n  isInstanceOf,\n  isNonArraySchemaObject,\n} from '../../type_guards'\nimport {\n  ResourcefulStringType,\n  ResourcefulDateType,\n  ResourcefulDateTimeType,\n  ResourcefulBinaryType,\n  ResourcefulNumberType,\n  ResourcefulIntegerType,\n  ResourcefulBigintType,\n  ResourcefulUnsignedIntegerType,\n  ResourcefulBooleanType,\n  ResourcefulObjectType,\n  ResourcefulArrayType,\n  ResourcefulDataType,\n} from '../../data_types'\nimport type { ElementCompact } from 'xml-js'\nimport type { OpenAPIV3 } from 'openapi-types'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { default as ApplicationService } from '@adonisjs/core/services/app'\nimport type { ModelColumnOptions, LucidModel } from '@adonisjs/lucid/types/model'\nimport type { ResourcefulModelController } from '../controllers/resourceful_model_controller'\nimport type { ResourcefulRouterOptionsService } from '../../router_macro/services/resourceful_router_options_service'\nimport type {\n  ResourcefulModelOpenApiSchema,\n  ResourcefulColumnDefinition,\n  ResourcefulComputedAccessorDefinition,\n} from '../../types'\nimport type {\n  DateColumnOptions,\n  ResourcefulHttpVerb,\n  ResourcefulModel,\n  ResourcefulModelMetaSchema,\n} from '@nhtio/lucid-resourceful/types'\nimport type {\n  PropertyAttributes,\n  NavigationPropertyAttributes,\n  AnnotationAttributes,\n  EntityTypeAttributes,\n  EntitySetAttributes,\n  NavigationPropertyBindingAttributes,\n} from '../types'\nimport type {\n  HasOneRelationContract,\n  BelongsToRelationContract,\n  HasManyRelationContract,\n  HasManyThroughRelationContract,\n  ManyToManyRelationContract,\n} from '@adonisjs/lucid/types/relations'\n\ntype AppServiceInstance = typeof ApplicationService\n\ntype ODataModelVerbPolicy = {\n  [key in ResourcefulRouterVerb]: boolean\n}\ntype ParamSpec = { name: string; type: string; nullable: boolean }\ntype Boundness = 'entity' | 'collection'\ntype OpKind = 'action' | 'function'\ntype BasicResourcefulOModelScalarType =\n  | 'Edm.String'\n  | 'Edm.Date'\n  | 'Edm.DateTimeOffset'\n  | 'Edm.Binary'\n  | 'Edm.Decimal'\n  | 'Edm.Int32'\n  | 'Edm.Int64'\n  | 'Edm.Boolean'\n  | 'self.ResourcefulObjectType'\n  | 'Collection(self.ResourcefulObjectType)'\n  | 'Edm.String'\n\ntype ResourcefulOModelScalarType =\n  | BasicResourcefulOModelScalarType\n  | `Collection(${BasicResourcefulOModelScalarType})`\n\ntype ColumnAndComputedAccessorAttributes = {\n  // shows in index operation results\n  selectable: boolean\n  // can be used for filtration\n  filterable: boolean\n  // can be used for sorting\n  sortable: boolean\n  // is visible in read operations\n  readable: boolean\n  // is usable in write operations\n  insertable: boolean | 'required'\n  // is usable in update operations\n  updatable: boolean\n  // is usable in bulk update operations\n  bulkUpdatable: boolean\n  // is a readonly immutable computed value\n  isComputed: boolean\n  // is a writable value which has a computed default value\n  hasComputedDefault: boolean\n}\n\n// Utility to process knobs and ensure rule precedence\nconst processKnobs = (\n  knobs: ColumnAndComputedAccessorAttributes\n): ColumnAndComputedAccessorAttributes => {\n  if (knobs.isComputed) {\n    knobs.insertable = false\n    knobs.updatable = false\n    knobs.bulkUpdatable = false\n  }\n  if (knobs.hasComputedDefault) {\n    if ('required' === knobs.insertable) {\n      knobs.insertable = true\n    }\n  }\n  if (knobs.readable === false) {\n    knobs.selectable = false\n    knobs.filterable = false\n    knobs.sortable = false\n  }\n  if (knobs.selectable === false) {\n    knobs.filterable = false\n    knobs.sortable = false\n  }\n  if (knobs.updatable === false) {\n    knobs.bulkUpdatable = false\n  }\n  return knobs\n}\n\nconst isAutoincrementedPrimaryKey = (\n  lucidDefinition: ModelColumnOptions,\n  resourcefulDefinition: ResourcefulColumnDefinition<any>,\n  propReadSchema: OpenAPIV3.SchemaObject | undefined,\n  propWriteSchema: OpenAPIV3.SchemaObject | undefined\n): boolean => {\n  if (!lucidDefinition.isPrimary || !isNonArraySchemaObject(propWriteSchema)) {\n    return false\n  }\n  if (\n    !isInstanceOf<ResourcefulIntegerType>(\n      resourcefulDefinition.type,\n      'ResourcefulIntegerType',\n      ResourcefulIntegerType\n    ) &&\n    !isInstanceOf<ResourcefulUnsignedIntegerType>(\n      resourcefulDefinition.type,\n      'ResourcefulUnsignedIntegerType',\n      ResourcefulUnsignedIntegerType\n    ) &&\n    !isInstanceOf<ResourcefulBigintType>(\n      resourcefulDefinition.type,\n      'ResourcefulBigintType',\n      ResourcefulBigintType\n    )\n  ) {\n    return false\n  }\n  if (\n    (isNonArraySchemaObject(propReadSchema) && propReadSchema.nullable) ||\n    !isNonArraySchemaObject(propWriteSchema) ||\n    (isNonArraySchemaObject(propReadSchema) && !propWriteSchema.nullable) ||\n    propWriteSchema.writeOnly\n  ) {\n    return false\n  }\n  return true\n}\n\ntype SimpleCapabilityAnnotationProperties = {\n  [key: string]: boolean | number | string | Array<string> | SimpleCapabilityAnnotationProperties\n}\n\nconst makeRecord = (\n  key: string,\n  value: boolean | number | string | Array<string> | SimpleCapabilityAnnotationProperties\n) => {\n  const ret: ElementCompact = {\n    _attributes: {\n      Property: key,\n    },\n  }\n  switch (typeof value) {\n    case 'boolean':\n      ret._attributes!.Bool = value ? 'true' : 'false'\n      break\n    case 'number':\n      ret._attributes!.Int = value\n      break\n    case 'string':\n      ret._attributes!.String = value\n      break\n  }\n  if (Array.isArray(value) && value.length > 0) {\n    ret.Collection = {\n      PropertyPath: value.map((v) => ({ _text: v })),\n    }\n  }\n  if (isObject(value)) {\n    ret.Record = {\n      PropertyValue: Object.entries(value).map(([k, v]) => makeRecord(k, v)),\n    }\n  }\n  return ret\n}\n\nconst makeSimpleCapabilityAnnotation = (\n  term: string,\n  properties: SimpleCapabilityAnnotationProperties = {},\n  attributes: ElementCompact['_attributes'] = {}\n): ElementCompact => {\n  const records = Object.entries(properties).map(([key, value]) => makeRecord(key, value))\n  const ret: ElementCompact = {\n    _attributes: {\n      ...attributes,\n      Term: term,\n    },\n    Record: records.length > 0 ? { PropertyValue: records } : undefined,\n  }\n  return stripUndefinedValuesFromObject(ret)\n}\n\nexport const makeOpName = (...parts: string[]) => {\n  const combinable: string[] = []\n  parts.forEach((part) => {\n    const frags = part.trim().split(/(\\/|-|_)/gm)\n    frags.forEach((frag) => {\n      if (frag.includes(':uid')) {\n        combinable.push('Instance')\n      } else {\n        combinable.push(frag)\n      }\n    })\n  })\n  return string.pascalCase(combinable.join(' '))\n}\n\ntype OperationSpec = {\n  kind: OpKind\n  binding: Boundness // 'entity' => self.Model, 'collection' => Collection(self.Model)\n  name: string // e.g., \"SyncPosts\", \"FollowersCount\"\n  params?: ParamSpec[] // OData types e.g. Edm.Int32, self.Post, Collection(self.User)\n  returnType?: string // required for functions, optional for actions\n  entitySetPath?: string // e.g. \"BindingParameter/posts\" or \"BindingParameter\"\n  isComposable?: boolean // functions only\n  enabled?: (policy: ODataModelVerbPolicy) => boolean // policy gate\n  annotations?: ElementCompact[] // optional per-op annotations\n}\n\nexport class ODataMetadataService {\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #models: Map<string, ResourcefulModel>\n  readonly #policiesByModelName: Map<string, ODataModelVerbPolicy>\n  readonly #modelMetaSchemas: Map<ResourcefulModel, ResourcefulModelMetaSchema>\n  readonly #modelReadSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n  readonly #modelWriteSchemas: Map<ResourcefulModel, ResourcefulModelOpenApiSchema>\n  readonly #policiesByModelCtor: Map<ResourcefulModel, ODataModelVerbPolicy>\n  readonly #controllersByModelCtor: Map<ResourcefulModel, ResourcefulModelController>\n  readonly #modelPathByModelCtor: Map<ResourcefulModel, string>\n\n  constructor(\n    opts: ResourcefulRouterOptionsService,\n    controllers: Map<string, ResourcefulModelController>\n  ) {\n    this.#opts = opts\n    this.#controllers = controllers\n    this.#models = new Map<string, ResourcefulModel>()\n    this.#policiesByModelName = new Map<string, ODataModelVerbPolicy>()\n    this.#modelMetaSchemas = new Map<ResourcefulModel, ResourcefulModelMetaSchema>()\n    this.#modelReadSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n    this.#modelWriteSchemas = new Map<ResourcefulModel, ResourcefulModelOpenApiSchema>()\n    this.#policiesByModelCtor = new Map<ResourcefulModel, ODataModelVerbPolicy>()\n    this.#controllersByModelCtor = new Map<ResourcefulModel, ResourcefulModelController>()\n    this.#modelPathByModelCtor = new Map<ResourcefulModel, string>()\n  }\n\n  #currentModelCan(verb: ResourcefulRouterVerb, controller?: ResourcefulModelController): boolean {\n    if (!controller) {\n      return !this.#opts.except.includes(verb)\n    }\n    // Defensive: controller.options should always be present, but guard to prevent hard crash\n    const controllerExcept = controller?.options?.except || []\n    return !this.#opts.except.includes(verb) && !controllerExcept.includes(verb as any)\n  }\n\n  async #cacheModel(\n    ctx: HttpContext,\n    app: AppServiceInstance,\n    model: ResourcefulModel,\n    onRelatedModel: (related: ResourcefulModel) => void\n  ) {\n    const modelName = model.$resourcefulName\n    if (!this.#models.has(modelName)) {\n      // we have not registered this model yet\n      this.#models.set(modelName, model)\n    }\n    if (!this.#modelMetaSchemas.has(model)) {\n      const asResourceful = await model.$getAsResourcefulForContext(ctx, app)\n      this.#modelMetaSchemas.set(model, asResourceful)\n    }\n    if (!this.#modelReadSchemas.has(model) && !this.#modelWriteSchemas.has(model)) {\n      const [readSchema, writeSchema] = await Promise.all([\n        model.$asOpenApiSchemaObject(ctx, app, 'read'),\n        model.$asOpenApiSchemaObject(ctx, app, 'write'),\n      ])\n      this.#modelReadSchemas.set(model, readSchema)\n      this.#modelWriteSchemas.set(model, writeSchema)\n    } else if (!this.#modelReadSchemas.has(model)) {\n      const readSchema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n      this.#modelReadSchemas.set(model, readSchema)\n    } else if (!this.#modelWriteSchemas.has(model)) {\n      const writeSchema = await model.$asOpenApiSchemaObject(ctx, app, 'write')\n      this.#modelWriteSchemas.set(model, writeSchema)\n    }\n    await pMap(\n      Array.from(model.$relationsDefinitions.values()),\n      async (relation) => {\n        relation.boot()\n        const related = relation.relatedModel()\n        if (isResourcefulModel(related)) {\n          onRelatedModel(related)\n        }\n      },\n      { concurrency: 10 }\n    )\n  }\n\n  async #boot(ctx: HttpContext) {\n    const relatedModelsToProcess = new Map<string, ResourcefulModel>()\n    await pMap(\n      Array.from(this.#controllers.entries()),\n      async ([modelPath, controller]) => {\n        const { model, app } = await controller.resolveBaseRequirements()\n        if (!isResourcefulModel(model)) {\n          return\n        }\n        const policy: ODataModelVerbPolicy = {\n          index: this.#currentModelCan('index', controller),\n          create: this.#currentModelCan('create', controller),\n          read: this.#currentModelCan('read', controller),\n          readRelated: this.#currentModelCan('readRelated', controller),\n          update: this.#currentModelCan('update', controller),\n          bulkUpdate: this.#currentModelCan('bulkUpdate', controller),\n          syncRelated: this.#currentModelCan('syncRelated', controller),\n          delete: this.#currentModelCan('delete', controller),\n        }\n        this.#policiesByModelName.set(model.$resourcefulName, policy)\n        this.#policiesByModelCtor.set(model, policy)\n        this.#controllersByModelCtor.set(model, controller)\n        this.#modelPathByModelCtor.set(model, modelPath)\n        await this.#cacheModel(ctx, app, model, (related) => {\n          const relatedModelName = related.$resourcefulName\n          if (\n            !this.#models.has(relatedModelName) &&\n            !relatedModelsToProcess.has(relatedModelName)\n          ) {\n            relatedModelsToProcess.set(relatedModelName, related)\n          }\n        })\n      },\n      { concurrency: 5 }\n    )\n    while (relatedModelsToProcess.size > 0) {\n      const modelsToProcess = Array.from(relatedModelsToProcess.values())\n      relatedModelsToProcess.clear()\n      await pMap(\n        modelsToProcess,\n        async (model) => {\n          const { default: app } = await import('@adonisjs/core/services/app')\n          await this.#cacheModel(ctx, app, model, (related) => {\n            const relatedModelName = related.$resourcefulName\n            if (\n              !this.#models.has(relatedModelName) &&\n              !relatedModelsToProcess.has(relatedModelName)\n            ) {\n              relatedModelsToProcess.set(relatedModelName, related)\n            }\n          })\n        },\n        { concurrency: 5 }\n      )\n    }\n  }\n\n  async generateMetadataElements(ctx: HttpContext): Promise<ElementCompact> {\n    await this.#boot(ctx)\n    const ret: ElementCompact = {\n      'edmx:Edmx': {\n        '_attributes': {\n          'Version': '4.0',\n          'xmlns:edmx': 'http://docs.oasis-open.org/odata/ns/edmx',\n        },\n        'edmx:Reference': [\n          {\n            '_attributes': {\n              Uri: 'https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/Org.OData.Validation.V1.xml',\n            },\n            'edmx:Include': {\n              _attributes: {\n                Namespace: 'Org.OData.Validation.V1',\n                Alias: 'Validation',\n              },\n            },\n          },\n          {\n            '_attributes': {\n              Uri: 'https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/Org.OData.Core.V1.xml',\n            },\n            'edmx:Include': {\n              _attributes: {\n                Namespace: 'Org.OData.Core.V1',\n                Alias: 'Core',\n              },\n            },\n          },\n          {\n            '_attributes': {\n              Uri: 'https://docs.oasis-open.org/odata/odata-vocabularies/v4.0/Org.OData.Capabilities.V1.xml',\n            },\n            'edmx:Include': {\n              _attributes: {\n                Namespace: 'Org.OData.Capabilities.V1',\n                Alias: 'Capabilities',\n              },\n            },\n          },\n        ],\n        'edmx:DataServices': {\n          Schema: {\n            _attributes: {\n              Namespace: 'Default',\n              Alias: 'self',\n              xmlns: 'http://docs.oasis-open.org/odata/ns/edm',\n            },\n            ...(await this.generateEdmElements()),\n          },\n        },\n      },\n    }\n    return ret\n  }\n\n  #getEdmIntScalarType(type: ResourcefulIntegerType | ResourcefulUnsignedIntegerType) {\n    let min: number = Number.MIN_SAFE_INTEGER\n    if (\n      isInstanceOf<ResourcefulUnsignedIntegerType>(\n        type,\n        'ResourcefulUnsignedIntegerType',\n        ResourcefulUnsignedIntegerType\n      )\n    ) {\n      min = 0\n    } else {\n      min = type.exclusiveMinimum ? type.minimum + 1 : type.minimum\n    }\n    const max = type.exclusiveMaximum\n      ? type.maximum\n      : typeof type.maximum === 'bigint'\n        ? type.maximum - BigInt(1)\n        : type.maximum - 1\n    return min < -2_147_483_648 || max > 2_147_483_647 ? 'Edm.Int64' : 'Edm.Int32'\n  }\n\n  #resourcefulDataTypeToEdmScalarType(type: ResourcefulDataType): ResourcefulOModelScalarType {\n    switch (true) {\n      case isInstanceOf<ResourcefulStringType>(\n        type,\n        'ResourcefulStringType',\n        ResourcefulStringType\n      ):\n        return 'Edm.String'\n      case isInstanceOf<ResourcefulDateType>(type, 'ResourcefulDateType', ResourcefulDateType):\n        return 'Edm.Date'\n      case isInstanceOf<ResourcefulDateTimeType>(\n        type,\n        'ResourcefulDateTimeType',\n        ResourcefulDateTimeType\n      ):\n        return 'Edm.DateTimeOffset'\n      case isInstanceOf<ResourcefulBinaryType>(\n        type,\n        'ResourcefulBinaryType',\n        ResourcefulBinaryType\n      ):\n        return 'Edm.Binary'\n      case isInstanceOf<ResourcefulNumberType>(\n        type,\n        'ResourcefulNumberType',\n        ResourcefulNumberType\n      ):\n        return 'Edm.Decimal'\n      case isInstanceOf<ResourcefulBigintType>(\n        type,\n        'ResourcefulBigintType',\n        ResourcefulBigintType\n      ):\n        return 'Edm.Int64'\n      case isInstanceOf<ResourcefulIntegerType>(\n        type,\n        'ResourcefulIntegerType',\n        ResourcefulIntegerType\n      ):\n      case isInstanceOf<ResourcefulUnsignedIntegerType>(\n        type,\n        'ResourcefulUnsignedIntegerType',\n        ResourcefulUnsignedIntegerType\n      ):\n        return this.#getEdmIntScalarType(type)\n      case isInstanceOf<ResourcefulBooleanType>(\n        type,\n        'ResourcefulBooleanType',\n        ResourcefulBooleanType\n      ):\n        return 'Edm.Boolean'\n      case isInstanceOf(type, 'ResourcefulObjectType', ResourcefulObjectType):\n        return 'self.ResourcefulObjectType'\n      case isInstanceOf<ResourcefulArrayType>(type, 'ResourcefulArrayType', ResourcefulArrayType): {\n        const t: ResourcefulArrayType = type\n        if ('oneOf' in t.items || 'allOf' in t.items || 'anyOf' in t.items || 'not' in t.items) {\n          return 'Collection(self.ResourcefulObjectType)'\n        }\n        const it = this.#resourcefulDataTypeToEdmScalarType(\n          t.items as unknown as ResourcefulDataType\n        )\n        return `Collection(${it})` as `Collection(${BasicResourcefulOModelScalarType})`\n      }\n      default:\n        return 'Edm.String'\n    }\n  }\n\n  #getEdmScalarType(\n    resourcefulDef: ResourcefulColumnDefinition<any> | ResourcefulComputedAccessorDefinition<any>\n  ) {\n    return this.#resourcefulDataTypeToEdmScalarType(resourcefulDef.type)\n  }\n\n  #getValidationAnnotationsForProperty(\n    scalarType: string,\n    schema: OpenAPIV3.SchemaObject | undefined\n  ): AnnotationAttributes[] {\n    const ret: AnnotationAttributes[] = []\n    if (isObject(schema) && 'array' !== schema.type) {\n      const s: OpenAPIV3.NonArraySchemaObject = schema as OpenAPIV3.NonArraySchemaObject\n      const valueKey = scalarType\n        .replace(/^Edm\\./, '')\n        .replace(/32$/, '')\n        .replace(/64$/, '') as Extract<keyof AnnotationAttributes, string>\n      if ('Edm.String' === scalarType && s.pattern) {\n        ret.push({\n          Term: 'Validation.Pattern',\n          String: s.pattern,\n        })\n      }\n      if ('undefined' !== typeof s.minimum) {\n        ret.push({\n          Term: 'Validation.Minimum',\n          [valueKey]: s.minimum.toString(),\n          Exclusive: s.exclusiveMinimum ? 'true' : undefined,\n        } as AnnotationAttributes)\n      }\n      if ('undefined' !== typeof s.maximum) {\n        ret.push({\n          Term: 'Validation.Maximum',\n          [valueKey]: s.maximum.toString(),\n          Exclusive: s.exclusiveMaximum ? 'true' : undefined,\n        } as AnnotationAttributes)\n      }\n      if ('undefined' !== typeof s.multipleOf) {\n        ret.push({\n          Term: 'Validation.MultipleOf',\n          [valueKey]: s.multipleOf.toString(),\n        } as AnnotationAttributes)\n      }\n    }\n    return ret\n  }\n\n  #resolveSchemaPropertySchemas(\n    props: { [key: string]: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject } = {},\n    mode: 'read' | 'write' = 'read',\n    depth: number = 0\n  ): Map<string, OpenAPIV3.SchemaObject> {\n    const ret = new Map<string, OpenAPIV3.SchemaObject>()\n    if (depth > 1) {\n      return ret\n    }\n    Object.entries(props).forEach(([propName, propSchema]) => {\n      if ('$ref' in propSchema) {\n        const referencedModelName = propSchema.$ref.split('/').pop() || 'Unknown'\n        const referencedModel = this.#models.get(referencedModelName)\n        // if we cannot find the referenced model, skip it\n        if (!referencedModel) return\n        const referencedModelSchema =\n          'read' === mode\n            ? this.#modelReadSchemas.get(referencedModel)\n            : this.#modelWriteSchemas.get(referencedModel)\n        // if we cannot find the referenced model schema, skip it\n        if (!referencedModelSchema) return\n        const resolvedReferencedModelPropertySchemas = this.#resolveSchemaPropertySchemas(\n          referencedModelSchema.properties,\n          mode,\n          depth + 1\n        )\n        const resolvedReferenceModelPropertySchemasObject: {\n          [key: string]: OpenAPIV3.SchemaObject\n        } = Object.assign(\n          {},\n          ...Array.from(resolvedReferencedModelPropertySchemas.entries()).map(([k, v]) => ({\n            [k]: v,\n          }))\n        )\n        ret.set(propName, {\n          ...referencedModelSchema,\n          properties: resolvedReferenceModelPropertySchemasObject,\n        })\n      } else {\n        ret.set(propName, propSchema)\n      }\n    })\n    return ret\n  }\n\n  #hasComputedDefault(\n    resourcefulDef: ResourcefulColumnDefinition<any> | ResourcefulComputedAccessorDefinition<any>,\n    lucidDef: ModelColumnOptions\n  ) {\n    if (\n      !isInstanceOf<ResourcefulDateType>(\n        resourcefulDef.type,\n        'ResourcefulDateType',\n        ResourcefulDateType\n      ) &&\n      !isInstanceOf<ResourcefulDateTimeType>(\n        resourcefulDef.type,\n        'ResourcefulDateTimeType',\n        ResourcefulDateTimeType\n      )\n    ) {\n      return false\n    }\n    const dateColumnOptions: DateColumnOptions = lucidDef as unknown as DateColumnOptions\n    return true === dateColumnOptions.autoCreate\n  }\n\n  async generateEdmElements(): Promise<ElementCompact> {\n    const ret: ElementCompact = {}\n    const EntityTypeMap = new Map<string, ElementCompact>()\n    const ComplexTypeMap = new Map<string, ElementCompact>()\n    const EnumTypeMap = new Map<string, ElementCompact>()\n    const EntitySetMap = new Map<string, ElementCompact>()\n    const AnnotationsArray: Array<ElementCompact> = [\n      {\n        _attributes: { Target: 'self.Container' },\n        Annotation: [\n          {\n            _attributes: { Term: 'Capabilities.BatchSupport' },\n            Record: {\n              PropertyValue: [\n                {\n                  _attributes: {\n                    Property: 'Supported',\n                    Bool: 'false',\n                  },\n                },\n              ],\n            },\n          },\n        ],\n      },\n    ]\n    const ActionMap = new Map<string, ElementCompact[]>()\n    const FunctionMap = new Map<string, ElementCompact[]>()\n    const ActionImportSet = new Set<string>()\n    const FunctionImportSet = new Set<string>()\n    // Registry of actions, functions and operations by model\n    const modelOps = new Map<ResourcefulModel, OperationSpec[]>()\n    const registerModelOps = (modelCtor: ResourcefulModel, ops: OperationSpec[]) => {\n      const cur = modelOps.get(modelCtor) || []\n      modelOps.set(modelCtor, cur.concat(ops))\n    }\n    let hasResourcefulObjectType = false\n    this.#models.forEach((model, modelName) => {\n      const controller = this.#controllersByModelCtor.get(model)\n      const readSchema = this.#modelReadSchemas.get(model)!\n      const writeSchema = this.#modelWriteSchemas.get(model)!\n      const filterable: string[] = isObject(readSchema['x-resourceful-filterable'])\n        ? Object.keys(readSchema['x-resourceful-filterable'])\n        : []\n      const sortable: string[] = readSchema['x-resourceful-sortable'] || []\n      const readablePropertySchemas = this.#resolveSchemaPropertySchemas(\n        readSchema.properties,\n        'read'\n      )\n      const writablePropertySchemas = this.#resolveSchemaPropertySchemas(\n        writeSchema.properties,\n        'write'\n      )\n      const modelPolicy = this.#policiesByModelCtor.get(model) || {\n        index: false,\n        create: false,\n        read: false,\n        readRelated: false,\n        update: false,\n        bulkUpdate: false,\n        syncRelated: false,\n        delete: false,\n      }\n      const entityTypeName = model.$resourcefulName\n      const rawEntitySetName = this.#modelPathByModelCtor.get(model)\n      const entitySetName = rawEntitySetName || modelName\n      const resourcefulColumns = Array.from(model.$resourcefulColumns.entries())\n      const resourcefulComputedAccessors = Array.from(model.$resourcefulComputedAccessors.entries())\n      const resourcefulRelationships = Array.from(model.$resourcefulRelationships.entries())\n      // sort all of the information into maps for easy access\n      const modelEntitySetNavigationPropertyBindings: NavigationPropertyBindingAttributes[] = []\n      const modelEntitySetAnnotations: ElementCompact[] = []\n      const modelPropertyMap = new Map<string, PropertyAttributes>()\n      const modelPropertyAnnotationsMap = new Map<string, AnnotationAttributes[]>()\n      const modelPropertyAnnotationsCompactElementMap = new Map<string, ElementCompact[]>()\n      const modelNavigationPropertyMap = new Map<string, NavigationPropertyAttributes>()\n      const modelNavigationPropertyReferentialConstraintsMap = new Map<string, ElementCompact[]>()\n      const modelNavigationPropertyAnnotationsMap = new Map<string, AnnotationAttributes[]>()\n      const modelNavigationPropertyAnnotationsCompactElementMap = new Map<\n        string,\n        ElementCompact[]\n      >()\n      const insertRequiredProperties = new Set<string>()\n      const nonInsertableProperties = new Set<string>()\n      const nonUpdatableProperties = new Set<string>()\n      const nonBulkUpdatableProperties = new Set<string>()\n      const nonSelectableProperties = new Set<string>()\n      const nonReadableProperties = new Set<string>()\n      const nonFilterableProperties = new Set<string>()\n      const nonSortableProperties = new Set<string>()\n      const nonNavigableProperties = new Set<string>()\n      const nonExpandableProperties = new Set<string>()\n      const modelOperationSpecMap: Map<string, OperationSpec> = new Map()\n      const modelOperationRestrictions: ElementCompact[] = []\n      // iterate through columns, computed accessors and then relationships\n      // to populate the buckets appropriately\n      resourcefulColumns.forEach(([propName, resourcefulDef]) => {\n        const lucidDefinition = model.$columnsDefinitions.get(propName)!\n        // Columns with serializeAs: null are intentionally excluded from\n        // serialized output (toJSON). Declaring them in $metadata would cause\n        // OData clients (Power BI, Excel) to expect data that is never\n        // provided, producing per-cell \"Error\" values. Skip them so the\n        // advertised schema matches the wire format.\n        if (lucidDefinition.serializeAs === null) return\n        const propReadSchema = readablePropertySchemas.get(propName)\n        const propWriteSchema = writablePropertySchemas.get(propName)\n        const Type = this.#getEdmScalarType(resourcefulDef)\n        if (Type.includes('self.ResourcefulObjectType')) {\n          hasResourcefulObjectType = true\n        }\n        const propPropertyAttributes: PropertyAttributes = {\n          Name: propName,\n          Type,\n          Nullable: true === resourcefulDef.nullable ? undefined : false,\n        }\n        const propAnnotationAttributes: AnnotationAttributes[] = []\n        const propAnnotationElements: ElementCompact[] = []\n        this.#getValidationAnnotationsForProperty(Type, propReadSchema).forEach((a) =>\n          propAnnotationAttributes.push(a)\n        )\n        if (isNonArraySchemaObject(propReadSchema) && Array.isArray(propReadSchema.enum)) {\n          propAnnotationElements.push({\n            _attributes: {\n              Term: 'Validation.AllowedValues',\n            },\n            Collection: {\n              AllowedValue: propReadSchema.enum.map((enumValue) => ({\n                _attributes: {\n                  Value: String(isObject(enumValue) ? enumValue.value : enumValue),\n                },\n              })),\n            },\n          })\n        }\n        const knobs = processKnobs({\n          selectable: modelPolicy.index && isObject(propReadSchema),\n          filterable:\n            modelPolicy.index && isObject(propReadSchema) && filterable.includes(propName),\n          sortable: modelPolicy.index && isObject(propReadSchema) && sortable.includes(propName),\n          readable: modelPolicy.read && isObject(propReadSchema),\n          insertable:\n            modelPolicy.create &&\n            isObject(propWriteSchema) &&\n            !isAutoincrementedPrimaryKey(\n              lucidDefinition,\n              resourcefulDef,\n              propReadSchema,\n              propWriteSchema\n            )\n              ? writeSchema.required?.includes(propName)\n                ? 'required'\n                : true\n              : false,\n          updatable: modelPolicy.update && isObject(propWriteSchema),\n          bulkUpdatable: modelPolicy.bulkUpdate && isObject(propWriteSchema),\n          isComputed: false,\n          hasComputedDefault: this.#hasComputedDefault(resourcefulDef, lucidDefinition),\n        } satisfies ColumnAndComputedAccessorAttributes)\n        if (false === knobs.selectable) {\n          nonSelectableProperties.add(propName)\n        }\n        if (false === knobs.filterable) {\n          nonFilterableProperties.add(propName)\n        }\n        if (false === knobs.sortable) {\n          nonSortableProperties.add(propName)\n        }\n        if (false === knobs.readable) {\n          nonReadableProperties.add(propName)\n        }\n        if (false === knobs.insertable) {\n          nonInsertableProperties.add(propName)\n        } else if ('required' === knobs.insertable) {\n          insertRequiredProperties.add(propName)\n        }\n        if (false === knobs.updatable) {\n          nonUpdatableProperties.add(propName)\n        }\n        if (false === knobs.bulkUpdatable) {\n          nonBulkUpdatableProperties.add(propName)\n        }\n        if (knobs.isComputed) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Computed',\n            Bool: true,\n          })\n        }\n        if (knobs.hasComputedDefault) {\n          propAnnotationAttributes.push({\n            Term: 'Core.ComputedDefaultValue',\n            Bool: true,\n          })\n        }\n        if (knobs.readable && !knobs.insertable && !knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Read',\n          })\n        }\n        if (!knobs.readable && knobs.insertable && knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Write',\n          })\n        }\n        modelPropertyMap.set(propName, propPropertyAttributes)\n        if (propAnnotationAttributes.length > 0) {\n          modelPropertyAnnotationsMap.set(propName, propAnnotationAttributes)\n        }\n        if (propAnnotationElements.length > 0) {\n          modelPropertyAnnotationsCompactElementMap.set(propName, propAnnotationElements)\n        }\n      })\n      resourcefulComputedAccessors.forEach(([propName, resourcefulDef]) => {\n        const propReadSchema = readablePropertySchemas.get(propName)\n        const propWriteSchema = writablePropertySchemas.get(propName)\n        const Type = this.#getEdmScalarType(resourcefulDef)\n        if (Type.includes('self.ResourcefulObjectType')) {\n          hasResourcefulObjectType = true\n        }\n        const propPropertyAttributes: PropertyAttributes = {\n          Name: propName,\n          Type,\n          Nullable: true === resourcefulDef.nullable ? undefined : false,\n        }\n        const propAnnotationAttributes: AnnotationAttributes[] = []\n        const propAnnotationElements: ElementCompact[] = []\n        this.#getValidationAnnotationsForProperty(Type, propReadSchema).forEach((a) =>\n          propAnnotationAttributes.push(a)\n        )\n        if (isNonArraySchemaObject(propReadSchema) && Array.isArray(propReadSchema.enum)) {\n          propAnnotationElements.push({\n            _attributes: {\n              Term: 'Validation.AllowedValues',\n            },\n            Collection: {\n              AllowedValue: propReadSchema.enum.map((enumValue) => ({\n                _attributes: {\n                  Value: String(isObject(enumValue) ? enumValue.value : enumValue),\n                },\n              })),\n            },\n          })\n        }\n        const knobs = processKnobs({\n          selectable: modelPolicy.index && isObject(propReadSchema),\n          filterable:\n            modelPolicy.index && isObject(propReadSchema) && filterable.includes(propName),\n          sortable: modelPolicy.index && isObject(propReadSchema) && sortable.includes(propName),\n          readable: modelPolicy.read && isObject(propReadSchema),\n          insertable:\n            modelPolicy.create && resourcefulDef.writable && isObject(propWriteSchema)\n              ? writeSchema.required?.includes(propName)\n                ? 'required'\n                : true\n              : false,\n          updatable: modelPolicy.update && resourcefulDef.writable && isObject(propWriteSchema),\n          bulkUpdatable: false,\n          isComputed: !resourcefulDef.writable,\n          hasComputedDefault: false,\n        } satisfies ColumnAndComputedAccessorAttributes)\n        if (false === knobs.selectable) {\n          nonSelectableProperties.add(propName)\n        }\n        if (false === knobs.filterable) {\n          nonFilterableProperties.add(propName)\n        }\n        if (false === knobs.sortable) {\n          nonSortableProperties.add(propName)\n        }\n        if (false === knobs.readable) {\n          nonReadableProperties.add(propName)\n        }\n        if (false === knobs.insertable) {\n          nonInsertableProperties.add(propName)\n        } else if ('required' === knobs.insertable) {\n          insertRequiredProperties.add(propName)\n        }\n        if (false === knobs.updatable) {\n          nonUpdatableProperties.add(propName)\n        }\n        if (false === knobs.bulkUpdatable) {\n          nonBulkUpdatableProperties.add(propName)\n        }\n        if (knobs.isComputed) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Computed',\n            Bool: true,\n          })\n        }\n        if (knobs.hasComputedDefault) {\n          propAnnotationAttributes.push({\n            Term: 'Core.ComputedDefaultValue',\n            Bool: true,\n          })\n        }\n        if (knobs.readable && !knobs.insertable && !knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Read',\n          })\n        }\n        if (!knobs.readable && knobs.insertable && knobs.updatable) {\n          propAnnotationAttributes.push({\n            Term: 'Core.Permissions',\n            EnumMember: 'Core.Permission/Write',\n          })\n        }\n        modelPropertyMap.set(propName, propPropertyAttributes)\n        if (propAnnotationAttributes.length > 0) {\n          modelPropertyAnnotationsMap.set(propName, propAnnotationAttributes)\n        }\n        if (propAnnotationElements.length > 0) {\n          modelPropertyAnnotationsCompactElementMap.set(propName, propAnnotationElements)\n        }\n      })\n      const addModelEntitySetNavigationPropertyBindings = (\n        propName: string,\n        relatedModel: ResourcefulModel\n      ) => {\n        const modelPath = this.#modelPathByModelCtor.get(relatedModel)\n        if (!modelPath) {\n          return\n        }\n        const fixedModelPath = modelPath\n        modelEntitySetNavigationPropertyBindings.push({\n          Path: propName,\n          Target: fixedModelPath,\n        })\n      }\n      const processNonCollectionRelationship = (\n        propName: string,\n        lucidDef:\n          | HasOneRelationContract<LucidModel, LucidModel>\n          | BelongsToRelationContract<LucidModel, LucidModel>,\n        propReadSchema: OpenAPIV3.SchemaObject | undefined\n      ) => {\n        if (!isNonArraySchemaObject(propReadSchema) || (!modelPolicy.index && !modelPolicy.read))\n          return\n        const relatedModel = lucidDef.relatedModel()\n        if (!isResourcefulModel(relatedModel)) {\n          return\n        }\n        addModelEntitySetNavigationPropertyBindings(propName, relatedModel)\n        const targetType = relatedModel.$resourcefulName\n        const fkProp = lucidDef.foreignKey\n        const fkCol =\n          'belongsTo' === lucidDef.type\n            ? model.$resourcefulColumns.get(fkProp)\n            : relatedModel.$resourcefulColumns.get(fkProp)\n        const nullable = fkCol ? true === fkCol.nullable : true\n        const propNavigationPropertyAttributes: NavigationPropertyAttributes = {\n          Name: propName,\n          Type: `self.${targetType}`,\n          Nullable: nullable,\n        }\n        const propNavigationPropertyReferentialConstraints: ElementCompact[] = []\n        if (lucidDef.type === 'belongsTo') {\n          const referentialConstraint = {\n            _attributes: {\n              Property: lucidDef.foreignKey,\n              ReferencedProperty: lucidDef.localKey,\n            },\n          }\n          propNavigationPropertyReferentialConstraints.push(referentialConstraint)\n        }\n        const propNavigationPropertyAnnotations: AnnotationAttributes[] = []\n        propNavigationPropertyAnnotations.push({\n          Term: 'Core.AutoExpand',\n          Bool: true,\n        })\n        modelNavigationPropertyMap.set(propName, propNavigationPropertyAttributes)\n        if (propNavigationPropertyReferentialConstraints.length > 0) {\n          modelNavigationPropertyReferentialConstraintsMap.set(\n            propName,\n            propNavigationPropertyReferentialConstraints\n          )\n        }\n        if (propNavigationPropertyAnnotations.length > 0) {\n          modelNavigationPropertyAnnotationsMap.set(propName, propNavigationPropertyAnnotations)\n        }\n        nonNavigableProperties.add(propName)\n        nonExpandableProperties.add(propName)\n      }\n      const processCollectionRelationship = (\n        propName: string,\n        lucidDef:\n          | HasManyRelationContract<LucidModel, LucidModel>\n          | HasManyThroughRelationContract<LucidModel, LucidModel>\n          | ManyToManyRelationContract<LucidModel, LucidModel>\n      ) => {\n        const relatedModel = lucidDef.relatedModel()\n        if (!isResourcefulModel(relatedModel)) {\n          return\n        }\n        addModelEntitySetNavigationPropertyBindings(propName, relatedModel)\n        const targetType = relatedModel.$resourcefulName\n        const propNavigationPropertyAttributes: NavigationPropertyAttributes = {\n          Name: propName,\n          Type: `Collection(self.${targetType})`,\n        }\n        modelNavigationPropertyMap.set(propName, propNavigationPropertyAttributes)\n        if (!modelPolicy.readRelated) {\n          nonNavigableProperties.add(propName)\n        }\n        nonExpandableProperties.add(propName)\n        if (modelPolicy.syncRelated) {\n          const opName = string.pascalCase(\n            ['sync', model.$resourcefulName, 'related', propName].join(' ')\n          )\n          if (!modelOperationSpecMap.has(opName)) {\n            const opSpec: OperationSpec = {\n              kind: 'action',\n              binding: 'entity',\n              name: opName,\n              params: [{ name: 'ruids', type: 'Collection(Edm.String)', nullable: false }],\n              returnType: 'Edm.String',\n              entitySetPath: propName,\n              isComposable: false,\n              enabled: () => true,\n            }\n            modelOperationSpecMap.set(opName, opSpec)\n            modelOperationRestrictions.push({\n              PropertyValue: [\n                {\n                  _attributes: {\n                    Property: 'Operation',\n                    String: `Default.${opName}`,\n                  },\n                },\n                {\n                  _attributes: {\n                    Property: 'Target',\n                    NavigationPropertyPath: propName,\n                  },\n                },\n              ],\n            })\n          }\n        }\n      }\n      resourcefulRelationships.forEach(([propName]) => {\n        const lucidDefinition = model.$relationsDefinitions.get(propName)!\n        const propReadSchema = readablePropertySchemas.get(propName)\n        // differentiate between collection and non collection relationships\n        if (['hasMany', 'manyToMany', 'hasManyThrough'].includes(lucidDefinition.type)) {\n          // process as collection\n          processCollectionRelationship(\n            propName,\n            lucidDefinition as\n              | HasManyRelationContract<LucidModel, LucidModel>\n              | HasManyThroughRelationContract<LucidModel, LucidModel>\n              | ManyToManyRelationContract<LucidModel, LucidModel>\n          )\n        } else {\n          // process as single entity\n          processNonCollectionRelationship(\n            propName,\n            lucidDefinition as\n              | HasOneRelationContract<LucidModel, LucidModel>\n              | BelongsToRelationContract<LucidModel, LucidModel>,\n            propReadSchema\n          )\n        }\n      })\n      // create the entity type now that we have all of the information\n      const modelEntityType: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: {\n          Name: entityTypeName,\n        } satisfies EntityTypeAttributes,\n        Key: {\n          PropertyRef: {\n            _attributes: { Name: model.primaryKey },\n          },\n        },\n        Property:\n          modelPropertyMap.size > 0\n            ? Array.from(modelPropertyMap.entries()).map(([prop, attrs]) => {\n                const propAnnotations = modelPropertyAnnotationsMap.get(prop) || []\n                const propAnnotationElements =\n                  modelPropertyAnnotationsCompactElementMap.get(prop) || []\n                const Annotation = [\n                  ...propAnnotations.map((a) => ({ _attributes: a })),\n                  ...propAnnotationElements,\n                ]\n                return stripUndefinedValuesFromObject({\n                  _attributes: attrs,\n                  Annotation: Annotation.length > 0 ? Annotation : undefined,\n                })\n              })\n            : undefined,\n        NavigationProperty:\n          modelNavigationPropertyMap.size > 0\n            ? Array.from(modelNavigationPropertyMap.entries()).map(([prop, attrs]) => {\n                const propReferentialConstraints =\n                  modelNavigationPropertyReferentialConstraintsMap.get(prop) || []\n                const propAnnotations = modelNavigationPropertyAnnotationsMap.get(prop) || []\n                const propAnnotationElements =\n                  modelNavigationPropertyAnnotationsCompactElementMap.get(prop) || []\n                const Annotation = [\n                  ...propAnnotations.map((a) => ({ _attributes: a })),\n                  ...propAnnotationElements,\n                ]\n                return stripUndefinedValuesFromObject({\n                  _attributes: attrs,\n                  ReferentialConstraint:\n                    propReferentialConstraints.length > 0 ? propReferentialConstraints : undefined,\n                  Annotation: Annotation.length > 0 ? Annotation : undefined,\n                })\n              })\n            : undefined,\n      })\n      EntityTypeMap.set(modelName, modelEntityType)\n      // create the entity set now that we have all of the information\n      const modelEntitySet: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: {\n          Name: entitySetName,\n          EntityType: `self.${entityTypeName}`,\n        } satisfies EntitySetAttributes,\n        NavigationPropertyBinding:\n          modelEntitySetNavigationPropertyBindings.length === 0\n            ? undefined\n            : modelEntitySetNavigationPropertyBindings.map((b) => ({ _attributes: b })),\n      })\n      EntitySetMap.set(entitySetName, modelEntitySet)\n      // build the model-level annotations now that we have all of the information\n      const annotationsTarget = `self.Container/${entitySetName}`\n      if (modelPolicy.index) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SearchRestrictions', { Searchable: true })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.FilterRestrictions',\n            stripUndefinedValuesFromObject({\n              Filterable: true,\n              NonFilterableProperties:\n                nonFilterableProperties.size > 0 ? Array.from(nonFilterableProperties) : undefined,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SortRestrictions',\n            stripUndefinedValuesFromObject({\n              Sortable: true,\n              NonSortableProperties:\n                nonSortableProperties.size > 0 ? Array.from(nonSortableProperties) : undefined,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.CountRestrictions', {\n            Countable: true,\n          })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.TopSupported',\n            {},\n            {\n              Bool: 'true',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SkipSupported',\n            {},\n            {\n              Bool: 'true',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SelectSupport',\n            stripUndefinedValuesFromObject({\n              Supported: true,\n              NonSelectableProperties:\n                nonSelectableProperties.size > 0 ? Array.from(nonSelectableProperties) : undefined,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SearchRestrictions', { Searchable: false })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.FilterRestrictions', { Filterable: false })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SortRestrictions', { Sortable: false })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.CountRestrictions', {\n            Countable: false,\n          })\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.TopSupported',\n            {},\n            {\n              Bool: 'false',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.SkipSupported',\n            {},\n            {\n              Bool: 'false',\n            }\n          )\n        )\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.SelectSupport', {\n            Supported: false,\n          })\n        )\n      }\n      if (modelPolicy.index || modelPolicy.read) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.ReadRestrictions', {\n            Readable: true,\n            ReadByKeyRestrictions: {\n              Readable: modelPolicy.read,\n            },\n          })\n        )\n        if (modelNavigationPropertyMap.size > 0) {\n          if (modelNavigationPropertyMap.size !== nonExpandableProperties.size) {\n            modelEntitySetAnnotations.push({\n              _attributes: {\n                Term: 'Capabilities.ExpandRestrictions',\n              },\n              Record: {\n                PropertyValue: [\n                  { _attributes: { Property: 'Expandable', Bool: 'true' } },\n                  { _attributes: { Property: 'MaxLevels', Int: '1' } },\n                  nonExpandableProperties.size > 0\n                    ? {\n                        _attributes: { Property: 'NonExpandableProperties' },\n                        Collection: {\n                          NavigationPropertyPath: Array.from(nonExpandableProperties).map((v) => ({\n                            _text: v,\n                          })),\n                        },\n                      }\n                    : undefined,\n                ].filter(isObject),\n              },\n            })\n            if (nonNavigableProperties.size > 0) {\n              modelEntitySetAnnotations.push({\n                _attributes: {\n                  Term: 'Capabilities.NavigationRestrictions',\n                },\n                Record: {\n                  PropertyValue: {\n                    _attributes: { Property: 'RestrictedProperties' },\n                    Collection: {\n                      Record: Array.from(nonNavigableProperties).map((prop) => ({\n                        PropertyValue: [\n                          {\n                            _attributes: {\n                              Property: 'NavigationProperty',\n                              NavigationPropertyPath: prop,\n                            },\n                          },\n                          {\n                            _attributes: {\n                              Property: 'Navigability',\n                              EnumMember: 'Capabilities.NavigationType/None',\n                            },\n                          },\n                        ],\n                      })),\n                    },\n                  },\n                },\n              })\n            }\n          } else {\n            modelEntitySetAnnotations.push(\n              makeSimpleCapabilityAnnotation('Capabilities.ExpandRestrictions', {\n                Expandable: false,\n              })\n            )\n          }\n        } else {\n          modelEntitySetAnnotations.push(\n            makeSimpleCapabilityAnnotation('Capabilities.ExpandRestrictions', {\n              Expandable: false,\n            })\n          )\n        }\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.ReadRestrictions', {\n            Readable: false,\n          })\n        )\n        if (modelNavigationPropertyMap.size > 0) {\n          modelEntitySetAnnotations.push(\n            makeSimpleCapabilityAnnotation('Capabilities.ExpandRestrictions', {\n              Expandable: false,\n            })\n          )\n        }\n      }\n      if (modelPolicy.create) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.InsertRestrictions',\n            stripUndefinedValuesFromObject({\n              Insertable: true,\n              RequiredProperties:\n                insertRequiredProperties.size > 0\n                  ? Array.from(insertRequiredProperties)\n                  : undefined,\n              NonInsertableProperties:\n                nonInsertableProperties.size > 0 ? Array.from(nonInsertableProperties) : undefined,\n            }) as SimpleCapabilityAnnotationProperties\n          )\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.InsertRestrictions', {\n            Insertable: false,\n          })\n        )\n      }\n      if (modelPolicy.update) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation(\n            'Capabilities.UpdateRestrictions',\n            stripUndefinedValuesFromObject({\n              Updatable: true,\n              NonUpdatableProperties:\n                nonUpdatableProperties.size > 0 ? Array.from(nonUpdatableProperties) : undefined,\n              FilterSegmentSupported: modelPolicy.bulkUpdate,\n              TypecastSegmentSupported: modelPolicy.bulkUpdate,\n              DeltaUpdateSupported: true,\n            } as SimpleCapabilityAnnotationProperties)\n          )\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.UpdateRestrictions', {\n            Updatable: false,\n          })\n        )\n      }\n      if (modelPolicy.delete) {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.DeleteRestrictions', {\n            Deletable: true,\n          })\n        )\n      } else {\n        modelEntitySetAnnotations.push(\n          makeSimpleCapabilityAnnotation('Capabilities.DeleteRestrictions', {\n            Deletable: false,\n          })\n        )\n      }\n      if (controller) {\n        const additional = controller.options?.additional || {}\n        Object.entries(additional).forEach(([methodAndPath]) => {\n          const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n          if (!method || !path) return\n          const opName = makeOpName(method, model.$resourcefulName, path)\n          if (!modelOperationSpecMap.has(opName)) {\n            const opBinding: Boundness = path.includes(':uid\\/') ? 'entity' : 'collection'\n            const opKind: OpKind = ['post', 'patch', 'put', 'delete'].includes(method)\n              ? 'action'\n              : 'function'\n            const opSpec: OperationSpec = {\n              kind: opKind,\n              binding: opBinding,\n              name: opName,\n              params:\n                'action' === opKind\n                  ? [{ name: 'payload', type: 'Edm.String', nullable: true }]\n                  : [],\n              returnType: 'Edm.String',\n              entitySetPath: path.replace(/:uid\\/?/g, ''),\n              isComposable: false,\n              enabled: () => true,\n            }\n            modelOperationSpecMap.set(opName, opSpec)\n            modelOperationRestrictions.push({\n              PropertyValue: [\n                {\n                  _attributes: {\n                    Property: 'Operation',\n                    String: `Default.${opName}`,\n                  },\n                },\n                {\n                  _attributes: {\n                    Property: 'Target',\n                    NavigationPropertyPath: opSpec.entitySetPath!,\n                  },\n                },\n              ],\n            })\n          }\n        })\n      }\n      // Add the operations to the registry for processing later\n      registerModelOps(model, Array.from(modelOperationSpecMap.values()))\n      // Add the operation restrictions annotations if needed\n      if (modelOperationRestrictions.length > 0) {\n        modelEntitySetAnnotations.push({\n          _attributes: {\n            Term: 'Capabilities.OperationRestrictions',\n          },\n          Collection: {\n            Record: modelOperationRestrictions,\n          },\n        })\n      }\n      // Add the model entity set annotations to the global array\n      const modelEntitySetAnnotationsElement: ElementCompact = {\n        _attributes: {\n          Target: annotationsTarget,\n        },\n        Annotation: modelEntitySetAnnotations,\n      }\n      AnnotationsArray.push(modelEntitySetAnnotationsElement)\n    })\n    // Process all registered actions and functions\n    const addBoundAction = (\n      entityTypeName: string,\n      binding: Boundness,\n      name: string,\n      params: ParamSpec[] = [],\n      returnType?: string,\n      extras: Partial<ElementCompact['_attributes']> = {},\n      annotations?: ElementCompact[]\n    ) => {\n      const bindingType =\n        binding === 'collection' ? `Collection(self.${entityTypeName})` : `self.${entityTypeName}`\n\n      const el: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: { Name: name, IsBound: 'true', ...extras },\n        Parameter: [{ _attributes: { Name: 'BindingParameter', Type: bindingType } }].concat(\n          params.map((p) =>\n            stripUndefinedValuesFromObject({\n              _attributes: {\n                Name: p.name,\n                Type: p.type,\n                Nullable: p.nullable ? undefined : 'false',\n              },\n            })\n          )\n        ),\n        ReturnType: returnType ? { _attributes: { Type: returnType } } : undefined,\n        Annotation: annotations && annotations.length ? annotations : undefined,\n      })\n\n      const arr = ActionMap.get(entityTypeName) || []\n      arr.push(el)\n      ActionMap.set(entityTypeName, arr)\n    }\n    const addBoundFunction = (\n      entityTypeName: string,\n      binding: Boundness,\n      name: string,\n      params: ParamSpec[] = [],\n      returnType: string,\n      opts: {\n        isComposable?: boolean\n        entitySetPath?: string\n        extras?: Partial<ElementCompact['_attributes']>\n        annotations?: ElementCompact[]\n      } = {}\n    ) => {\n      const bindingType =\n        binding === 'collection' ? `Collection(self.${entityTypeName})` : `self.${entityTypeName}`\n\n      const el: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: stripUndefinedValuesFromObject({\n          Name: name,\n          IsBound: 'true',\n          IsComposable: opts.isComposable ? 'true' : undefined,\n          ...(opts.extras || {}),\n        }),\n        Parameter: [{ _attributes: { Name: 'BindingParameter', Type: bindingType } }].concat(\n          params.map((p) =>\n            stripUndefinedValuesFromObject({\n              _attributes: {\n                Name: p.name,\n                Type: p.type,\n                Nullable: p.nullable ? undefined : 'false',\n              },\n            })\n          )\n        ),\n        ReturnType: { _attributes: { Type: returnType } },\n        Annotation: opts.annotations && opts.annotations.length ? opts.annotations : undefined,\n      })\n\n      const arr = FunctionMap.get(entityTypeName) || []\n      arr.push(el)\n      FunctionMap.set(entityTypeName, arr)\n    }\n    modelOps.forEach((ops, model) => {\n      ops.forEach((op) => {\n        if (op.kind === 'action') {\n          addBoundAction(\n            model.$resourcefulName,\n            op.binding,\n            op.name,\n            op.params || [],\n            op.returnType,\n            {},\n            op.annotations\n          )\n        } else {\n          addBoundFunction(\n            model.$resourcefulName,\n            op.binding,\n            op.name,\n            op.params || [],\n            op.returnType!,\n            {\n              isComposable: op.isComposable,\n              entitySetPath: op.entitySetPath,\n              annotations: op.annotations,\n            }\n          )\n        }\n      })\n    })\n    // Add unbound operations\n    Object.entries(this.#opts.additional).forEach(([methodAndPath]) => {\n      const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n      if (!method || !path) return\n      const opName = makeOpName(method, path)\n      const opKind: OpKind = ['post', 'patch', 'put', 'delete'].includes(method)\n        ? 'action'\n        : 'function'\n      const el: ElementCompact = stripUndefinedValuesFromObject({\n        _attributes: stripUndefinedValuesFromObject({\n          Name: opName,\n          ...(opKind === 'function' ? { IsComposable: 'false' } : {}),\n        }),\n        Parameter:\n          opKind === 'action' ? [{ _attributes: { Name: 'Payload', Type: 'Edm.String' } }] : [],\n        ReturnType: opKind === 'action' ? undefined : { _attributes: { Type: 'Edm.String' } },\n      })\n      if (opKind === 'action') {\n        const arr = ActionMap.get('Unbound') || []\n        arr.push(el)\n        ActionMap.set('Unbound', arr)\n        ActionImportSet.add(opName)\n      } else {\n        const arr = FunctionMap.get('Unbound') || []\n        arr.push(el)\n        FunctionMap.set('Unbound', arr)\n        FunctionImportSet.add(opName)\n      }\n    })\n    // Add complex types if needed\n    if (hasResourcefulObjectType) {\n      ComplexTypeMap.set('ResourcefulObjectType', {\n        _attributes: { Name: 'ResourcefulObjectType', OpenType: 'true' },\n      })\n    }\n    ret.EntityType = Array.from(EntityTypeMap.values())\n    ret.ComplexType = Array.from(ComplexTypeMap.values())\n    ret.EnumType = Array.from(EnumTypeMap.values())\n    ret.EntityContainer =\n      EntitySetMap.size > 0\n        ? stripUndefinedValuesFromObject({\n            _attributes: {\n              Name: 'Container',\n            },\n            EntitySet: Array.from(EntitySetMap.values()),\n            ActionImport:\n              ActionImportSet.size > 0\n                ? Array.from(ActionImportSet.values()).map((name) => ({\n                    _attributes: {\n                      Name: name,\n                      Action: `Default.${name}`,\n                    },\n                  }))\n                : undefined,\n            FunctionImport:\n              FunctionImportSet.size > 0\n                ? Array.from(FunctionImportSet.values()).map((name) => ({\n                    _attributes: {\n                      Name: name,\n                      Function: `Default.${name}`,\n                      IncludeInServiceDocument: true,\n                    },\n                  }))\n                : undefined,\n          })\n        : undefined\n    ret.Action = Array.from(ActionMap.values()).flat()\n    ret.Function = Array.from(FunctionMap.values()).flat()\n    ret.Annotations = AnnotationsArray.length > 0 ? AnnotationsArray : undefined\n    return stripUndefinedValuesFromObject(ret)\n  }\n\n  static async serveRootMetadata(\n    opts: ResourcefulRouterOptionsService,\n    controllers: Map<string, ResourcefulModelController>,\n    ctx: HttpContext\n  ): Promise<ElementCompact> {\n    const service = new ODataMetadataService(opts, controllers)\n    return service.generateMetadataElements(ctx)\n  }\n}\n","import {\n  E_ODATA_FILTER_UNEXPECTED_CHARACTER,\n  E_ODATA_FILTER_UNEXPECTED_TYPE,\n  E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT,\n  E_ODATA_UNKNOWN_PARAMETER_ALIAS,\n  E_ODATA_FILTER_UNEXPECTED_TOKEN,\n  E_ODATA_FILTER_INAPPLICABLE_NODE_TYPE,\n  E_ODATA_FILTER_UNKNOWN_LOGICAL_OPERATOR,\n  E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR,\n  E_ODATA_FILTER_INVALID_COMPARISON_SIDE,\n  E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE,\n  E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON,\n  E_ODATA_FILTER_EXPECTED_COLUMN_REFERENCE,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ResourcefulQueryScopeCallback } from './mixin'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { DatabaseQueryBuilderContract } from '@adonisjs/lucid/types/querybuilder'\n\ninterface Token {\n  type:\n    | 'IDENTIFIER'\n    | 'STRING'\n    | 'NUMBER'\n    | 'BOOLEAN'\n    | 'NULL'\n    | 'OPERATOR'\n    | 'LPAREN'\n    | 'RPAREN'\n    | 'COMMA'\n    | 'WHITESPACE'\n    | 'PARAMETER'\n    | 'DATE'\n    | 'GUID'\n  value: string\n}\n\ninterface ASTNode {\n  type: string\n  [key: string]: any\n}\n\nexport type Dialect = 'postgres' | 'mysql' | 'sqlite'\n\nexport class ODataToLucidTranslator {\n  static readonly #LOGICAL_OPERATORS = ['and', 'or', 'not']\n  static readonly #COMPARISON_OPERATORS = ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'in', 'has']\n  static readonly #STRING_FUNCTIONS = [\n    'contains',\n    'endswith',\n    'startswith',\n    'length',\n    'indexof',\n    'substring',\n    'tolower',\n    'toupper',\n    'trim',\n    'concat',\n  ]\n  static readonly #DATE_FUNCTIONS = ['year', 'month', 'day', 'hour', 'minute', 'second']\n  static readonly #MATH_FUNCTIONS = ['round', 'floor', 'ceiling']\n\n  #tokens: Token[] = []\n  #position: number = 0\n  #filter: string\n  #aliases: Map<string, string>\n  #keyToColumn: Map<string, string>\n  #dialectType: Dialect\n\n  constructor(\n    filter: string,\n    aliases: Map<string, string>,\n    keyToColumn: Map<string, string>,\n    dialect: Dialect = 'postgres'\n  ) {\n    this.#filter = filter\n    this.#aliases = aliases\n    this.#keyToColumn = keyToColumn\n    this.#dialectType = dialect\n  }\n\n  public static apply(\n    $filter: string,\n    aliases: Map<string, string> = new Map(),\n    keyToColumn: Map<string, string> = new Map(),\n    dialect: Dialect = 'postgres',\n    dbQuery: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    const translator = new ODataToLucidTranslator($filter, aliases, keyToColumn, dialect)\n    return translator.#translate(dbQuery)\n  }\n\n  public static toHook(\n    $filter: string,\n    aliases: Map<string, string> = new Map(),\n    keyToColumn: Map<string, string> = new Map(),\n    dialect: Dialect = 'postgres'\n  ): ResourcefulQueryScopeCallback {\n    const bound = ODataToLucidTranslator.apply.bind(null, $filter, aliases, keyToColumn, dialect)\n    return (_ctx: HttpContext, _app: ApplicationService, query: DatabaseQueryBuilderContract) => {\n      bound(query)\n    }\n  }\n\n  #getSqlFns(query?: DatabaseQueryBuilderContract) {\n    // Prefer the actual DB client from the query when available; fall back to configured dialect\n    let resolved: Dialect = this.#dialectType\n    if (query) {\n      const client = this.#dialect(query)\n      if (client === 'pg') resolved = 'postgres'\n      else if (client === 'mysql' || client === 'mysql2') resolved = 'mysql'\n      else if (client === 'sqlite3') resolved = 'sqlite'\n    }\n\n    switch (resolved) {\n      case 'postgres':\n        return {\n          len: (col: string) => `LENGTH(${col})`,\n          instr: (col: string) => `POSITION(? IN ${col})`,\n          substr2: (col: string, start: string) => `SUBSTRING(${col} FROM ${start})`,\n          substr3: (col: string, start: string, len: string) =>\n            `SUBSTRING(${col} FROM ${start} FOR ${len})`,\n          year: (col: string) => `EXTRACT(YEAR FROM ${col})`,\n          month: (col: string) => `EXTRACT(MONTH FROM ${col})`,\n          day: (col: string) => `EXTRACT(DAY FROM ${col})`,\n          hour: (col: string) => `EXTRACT(HOUR FROM ${col})`,\n          minute: (col: string) => `EXTRACT(MINUTE FROM ${col})`,\n          second: (col: string) => `EXTRACT(SECOND FROM ${col})`,\n          floor: (col: string) => `FLOOR(${col})`,\n          ceil: (col: string) => `CEILING(${col})`,\n          round: (col: string, p?: string) => (p ? `ROUND(${col}, ${p})` : `ROUND(${col})`),\n          concat: (a: string, b: string) => `${a} || ${b}`,\n        }\n      case 'mysql':\n        return {\n          len: (col: string) => `CHAR_LENGTH(${col})`,\n          instr: (col: string) => `INSTR(${col}, ?)`,\n          substr2: (col: string, start: string) => `SUBSTRING(${col}, ${start})`,\n          substr3: (col: string, start: string, len: string) =>\n            `SUBSTRING(${col}, ${start}, ${len})`,\n          year: (col: string) => `YEAR(${col})`,\n          month: (col: string) => `MONTH(${col})`,\n          day: (col: string) => `DAY(${col})`,\n          hour: (col: string) => `HOUR(${col})`,\n          minute: (col: string) => `MINUTE(${col})`,\n          second: (col: string) => `SECOND(${col})`,\n          floor: (col: string) => `FLOOR(${col})`,\n          ceil: (col: string) => `CEIL(${col})`,\n          round: (col: string, p?: string) => (p ? `ROUND(${col}, ${p})` : `ROUND(${col})`),\n          concat: (a: string, b: string) => `CONCAT(${a}, ${b})`,\n        }\n      case 'sqlite':\n        return {\n          len: (col: string) => `LENGTH(${col})`,\n          instr: (col: string) => `INSTR(${col}, ?)`,\n          substr2: (col: string, start: string) => `SUBSTR(${col}, ${start})`,\n          substr3: (col: string, start: string, len: string) => `SUBSTR(${col}, ${start}, ${len})`,\n          year: (col: string) => `CAST(STRFTIME('%Y', ${col}) AS INTEGER)`,\n          month: (col: string) => `CAST(STRFTIME('%m', ${col}) AS INTEGER)`,\n          day: (col: string) => `CAST(STRFTIME('%d', ${col}) AS INTEGER)`,\n          hour: (col: string) => `CAST(STRFTIME('%H', ${col}) AS INTEGER)`,\n          minute: (col: string) => `CAST(STRFTIME('%M', ${col}) AS INTEGER)`,\n          second: (col: string) => `CAST(STRFTIME('%S', ${col}) AS INTEGER)`,\n          floor: (col: string) =>\n            `CASE WHEN (${col} - CAST(${col} AS INTEGER)) >= 0 THEN CAST(${col} AS INTEGER) ELSE CAST(${col} AS INTEGER) - 1 END`,\n          // Ceil using SQLite semantics (CAST truncates toward zero)\n          // ceil(x) = CAST(x AS INTEGER) + (x > CAST(x AS INTEGER) ? 1 : 0)\n          ceil: (col: string) =>\n            `CAST(${col} AS INTEGER) + CASE WHEN ${col} > CAST(${col} AS INTEGER) THEN 1 ELSE 0 END`,\n          round: (col: string, p?: string) => (p ? `ROUND(${col}, ${p})` : `ROUND(${col})`),\n          concat: (a: string, b: string) => `${a} || ${b}`,\n        }\n    }\n  }\n\n  #asSqlExpr(node: ASTNode): { sql: string; params: any[] } {\n    if (node.type === 'PROPERTY') {\n      return { sql: '??', params: [this.#getColumnName(node.name)] }\n    }\n    if (node.type === 'LITERAL') {\n      return { sql: '?', params: [node.value] }\n    }\n    throw new E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE(node)\n  }\n\n  #translate(dbQuery: DatabaseQueryBuilderContract): DatabaseQueryBuilderContract {\n    this.#tokens = this.#tokenize(this.#filter)\n    this.#position = 0\n\n    if (this.#tokens.length === 0) {\n      return dbQuery\n    }\n\n    const ast = this.#parseExpression()\n    return this.#applyASTToQuery(ast, dbQuery)\n  }\n\n  #tokenize(input: string): Token[] {\n    const tokens: Token[] = []\n    let i = 0\n\n    while (i < input.length) {\n      // Skip whitespace\n      if (/\\s/.test(input[i])) {\n        while (i < input.length && /\\s/.test(input[i])) i++\n        continue\n      }\n\n      // Parameter reference (@param)\n      if (input[i] === '@') {\n        let j = i + 1\n        while (j < input.length && /[a-zA-Z0-9_]/.test(input[j])) j++\n        if (j === i + 1) {\n          // No parameter name after @\n          throw new E_ODATA_FILTER_UNEXPECTED_CHARACTER(input[i], i)\n        }\n        tokens.push({ type: 'PARAMETER', value: input.substring(i + 1, j) })\n        i = j\n        continue\n      }\n\n      // String literals\n      if (input[i] === \"'\") {\n        let j = i + 1\n        let value = ''\n        let closed = false\n        while (j < input.length) {\n          if (input[j] === \"'\") {\n            if (j + 1 < input.length && input[j + 1] === \"'\") {\n              value += \"'\"\n              j += 2\n            } else {\n              j++\n              closed = true\n              break\n            }\n          } else {\n            value += input[j]\n            j++\n          }\n        }\n        if (!closed) {\n          throw new E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT()\n        }\n        tokens.push({ type: 'STRING', value })\n        i = j\n        continue\n      }\n\n      // Numbers (including decimals and scientific notation)\n      if (\n        /[0-9]/.test(input[i]) ||\n        (input[i] === '-' && i + 1 < input.length && /[0-9]/.test(input[i + 1]))\n      ) {\n        let j = i\n        if (input[j] === '-') j++\n        while (j < input.length && /[0-9]/.test(input[j])) j++\n        if (j < input.length && input[j] === '.') {\n          j++\n          while (j < input.length && /[0-9]/.test(input[j])) j++\n        }\n        if (j < input.length && /[eE]/.test(input[j])) {\n          j++\n          if (j < input.length && /[+-]/.test(input[j])) j++\n          while (j < input.length && /[0-9]/.test(input[j])) j++\n        }\n        tokens.push({ type: 'NUMBER', value: input.substring(i, j) })\n        i = j\n        continue\n      }\n\n      // Parentheses\n      if (input[i] === '(') {\n        tokens.push({ type: 'LPAREN', value: '(' })\n        i++\n        continue\n      }\n      if (input[i] === ')') {\n        tokens.push({ type: 'RPAREN', value: ')' })\n        i++\n        continue\n      }\n\n      // Comma\n      if (input[i] === ',') {\n        tokens.push({ type: 'COMMA', value: ',' })\n        i++\n        continue\n      }\n\n      // Identifiers and keywords\n      if (/[a-zA-Z_$]/.test(input[i])) {\n        let j = i\n        while (j < input.length && /[a-zA-Z0-9_$\\/]/.test(input[j])) j++\n        const value = input.substring(i, j)\n\n        // Check for boolean literals\n        if (value === 'true' || value === 'false') {\n          tokens.push({ type: 'BOOLEAN', value })\n        }\n        // Check for null literal\n        else if (value === 'null') {\n          tokens.push({ type: 'NULL', value })\n        }\n        // Check for operators\n        else if (\n          [\n            ...ODataToLucidTranslator.#LOGICAL_OPERATORS,\n            ...ODataToLucidTranslator.#COMPARISON_OPERATORS,\n          ].includes(value.toLowerCase())\n        ) {\n          tokens.push({ type: 'OPERATOR', value: value.toLowerCase() })\n        }\n        // Otherwise it's an identifier\n        else {\n          tokens.push({ type: 'IDENTIFIER', value })\n        }\n        i = j\n        continue\n      }\n\n      // If we get here, we have an unexpected character\n      throw new E_ODATA_FILTER_UNEXPECTED_CHARACTER(input[i], i)\n    }\n\n    return tokens\n  }\n\n  #peek(): Token | null {\n    if (this.#position >= this.#tokens.length) return null\n    return this.#tokens[this.#position]\n  }\n\n  #consume(): Token | null {\n    if (this.#position >= this.#tokens.length) return null\n    return this.#tokens[this.#position++]\n  }\n\n  #expect(type: Token['type'], value?: string): Token {\n    const token = this.#consume()\n    if (!token || token.type !== type || (value !== undefined && token.value !== value)) {\n      throw new E_ODATA_FILTER_UNEXPECTED_TYPE(type, token, value)\n    }\n    return token\n  }\n\n  #parseExpression(): ASTNode {\n    return this.#parseLogicalOr()\n  }\n\n  #parseLogicalOr(): ASTNode {\n    let left = this.#parseLogicalAnd()\n\n    while (this.#peek()?.type === 'OPERATOR' && this.#peek()?.value === 'or') {\n      this.#consume()\n      const right = this.#parseLogicalAnd()\n      left = { type: 'LOGICAL', operator: 'or', left, right }\n    }\n\n    return left\n  }\n\n  #parseLogicalAnd(): ASTNode {\n    let left = this.#parseNot()\n\n    while (this.#peek()?.type === 'OPERATOR' && this.#peek()?.value === 'and') {\n      this.#consume()\n      const right = this.#parseNot()\n      left = { type: 'LOGICAL', operator: 'and', left, right }\n    }\n\n    return left\n  }\n\n  #parseNot(): ASTNode {\n    if (this.#peek()?.type === 'OPERATOR' && this.#peek()?.value === 'not') {\n      this.#consume()\n      return { type: 'LOGICAL', operator: 'not', operand: this.#parseNot() }\n    }\n\n    return this.#parseComparison()\n  }\n\n  #parseComparison(): ASTNode {\n    let left = this.#parsePrimary()\n\n    const token = this.#peek()\n    if (\n      token?.type === 'OPERATOR' &&\n      ODataToLucidTranslator.#COMPARISON_OPERATORS.includes(token.value)\n    ) {\n      const operator = this.#consume()!.value\n\n      if (operator === 'in') {\n        // Handle 'in' operator which expects a list\n        this.#expect('LPAREN')\n        const values: ASTNode[] = []\n        if (this.#peek()?.type !== 'RPAREN') {\n          values.push(this.#parsePrimary())\n          while (this.#peek()?.type === 'COMMA') {\n            this.#consume()\n            values.push(this.#parsePrimary())\n          }\n        }\n        this.#expect('RPAREN')\n        return { type: 'COMPARISON', operator: 'in', left, right: values }\n      } else {\n        const right = this.#parsePrimary()\n        return { type: 'COMPARISON', operator, left, right }\n      }\n    }\n\n    return left\n  }\n\n  #parsePrimary(): ASTNode {\n    const token = this.#peek()\n\n    if (!token) {\n      throw new E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT()\n    }\n\n    // Parenthesized expression\n    if (token.type === 'LPAREN') {\n      this.#consume()\n      const expr = this.#parseExpression()\n      this.#expect('RPAREN')\n      return expr\n    }\n\n    // Function call\n    if (token.type === 'IDENTIFIER') {\n      const nextToken = this.#tokens[this.#position + 1]\n      if (nextToken?.type === 'LPAREN') {\n        return this.#parseFunctionCall()\n      }\n      // Property reference\n      const identifier = this.#consume()!\n      return { type: 'PROPERTY', name: identifier.value }\n    }\n\n    // String literal\n    if (token.type === 'STRING') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'string', value: token.value }\n    }\n\n    // Number literal\n    if (token.type === 'NUMBER') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'number', value: Number.parseFloat(token.value) }\n    }\n\n    // Boolean literal\n    if (token.type === 'BOOLEAN') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'boolean', value: token.value === 'true' }\n    }\n\n    // Null literal\n    if (token.type === 'NULL') {\n      this.#consume()\n      return { type: 'LITERAL', dataType: 'null', value: null }\n    }\n\n    // Parameter reference\n    if (token.type === 'PARAMETER') {\n      this.#consume()\n      const aliasValue = this.#aliases.get(token.value)\n      if (!aliasValue) {\n        throw new E_ODATA_UNKNOWN_PARAMETER_ALIAS(token.value)\n      }\n      // Parse the alias value as a literal\n      return this.#parseLiteralValue(aliasValue)\n    }\n    throw new E_ODATA_FILTER_UNEXPECTED_TOKEN(token)\n  }\n\n  #parseFunctionCall(): ASTNode {\n    const funcName = this.#consume()!.value.toLowerCase()\n    this.#expect('LPAREN')\n\n    const args: ASTNode[] = []\n    if (this.#peek()?.type !== 'RPAREN') {\n      args.push(this.#parseExpression())\n      while (this.#peek()?.type === 'COMMA') {\n        this.#consume()\n        args.push(this.#parseExpression())\n      }\n    }\n\n    this.#expect('RPAREN')\n    return { type: 'FUNCTION', name: funcName, arguments: args }\n  }\n\n  #parseLiteralValue(value: string): ASTNode {\n    // Try to parse as number\n    if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(value)) {\n      return { type: 'LITERAL', dataType: 'number', value: Number.parseFloat(value) }\n    }\n\n    // Try to parse as boolean\n    if (value === 'true' || value === 'false') {\n      return { type: 'LITERAL', dataType: 'boolean', value: value === 'true' }\n    }\n\n    // Try to parse as null\n    if (value === 'null') {\n      return { type: 'LITERAL', dataType: 'null', value: null }\n    }\n\n    // Otherwise treat as string (remove quotes if present)\n    if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n      value = value.slice(1, -1).replace(/''/g, \"'\")\n    }\n\n    return { type: 'LITERAL', dataType: 'string', value }\n  }\n\n  #applyASTToQuery(\n    node: ASTNode,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    // Treat bare boolean-returning expressions as \"eq true\"\n    if (node.type === 'PROPERTY') {\n      return this.#applyComparisonOperator(\n        {\n          type: 'COMPARISON',\n          operator: 'eq',\n          left: node,\n          right: { type: 'LITERAL', dataType: 'boolean', value: true },\n        },\n        query\n      )\n    }\n    if (node.type === 'FUNCTION') {\n      return this.#applyComparisonOperator(\n        {\n          type: 'COMPARISON',\n          operator: 'eq',\n          left: node,\n          right: { type: 'LITERAL', dataType: 'boolean', value: true },\n        },\n        query\n      )\n    }\n\n    switch (node.type) {\n      case 'LOGICAL':\n        return this.#applyLogicalOperator(node, query)\n      case 'COMPARISON':\n        return this.#applyComparisonOperator(node, query)\n      default:\n        throw new E_ODATA_FILTER_INAPPLICABLE_NODE_TYPE(node)\n    }\n  }\n\n  #applyLogicalOperator(\n    node: ASTNode,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    switch (node.operator) {\n      case 'and':\n        return query\n          .where((subQuery) => {\n            this.#applyASTToQuery(node.left, subQuery)\n          })\n          .where((subQuery) => {\n            this.#applyASTToQuery(node.right, subQuery)\n          })\n\n      case 'or':\n        return query.where((subQuery) => {\n          subQuery\n            .where((sq) => this.#applyASTToQuery(node.left, sq))\n            .orWhere((sq) => this.#applyASTToQuery(node.right, sq))\n        })\n\n      case 'not':\n        return query.whereNot((subQuery) => {\n          this.#applyASTToQuery(node.operand, subQuery)\n        })\n\n      default:\n        throw new E_ODATA_FILTER_UNKNOWN_LOGICAL_OPERATOR(node)\n    }\n  }\n\n  #applyComparisonOperator(\n    node: ASTNode,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    const left = this.#evaluateNode(node.left)\n    const right =\n      node.operator === 'in'\n        ? node.right.map((n: ASTNode) => this.#evaluateNode(n))\n        : this.#evaluateNode(node.right)\n\n    // If left side is a column reference\n    if (typeof left === 'object' && left.type === 'column') {\n      const column = this.#getColumnName(left.name)\n\n      if (node.operator === 'eq' && right === null) return query.whereNull(column)\n      if (node.operator === 'ne' && right === null) return query.whereNotNull(column)\n\n      switch (node.operator) {\n        case 'eq':\n          return right === null ? query.whereNull(column) : query.where(column, '=', right)\n        case 'ne':\n          return right === null ? query.whereNotNull(column) : query.where(column, '!=', right)\n        case 'gt':\n          return query.where(column, '>', right)\n        case 'ge':\n          return query.where(column, '>=', right)\n        case 'lt':\n          return query.where(column, '<', right)\n        case 'le':\n          return query.where(column, '<=', right)\n        case 'in':\n          return query.whereIn(column, right as any[])\n        case 'has':\n          // OData 'has' means: all flags in the RHS are present in LHS\n          // That's a bitmask test: (col & mask) = mask\n          const mask = right\n          return query.whereRaw('(?? & ?) = ?', [column, mask, mask])\n        default:\n          throw new E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR(node)\n      }\n    }\n\n    // Support normalized comparisons where the column is on the RIGHT side\n    // Example: `null eq Prop` or `5 gt Age`\n    if (\n      !(typeof left === 'object' && left.type === 'column') &&\n      typeof right === 'object' &&\n      right.type === 'column'\n    ) {\n      const column = this.#getColumnName(right.name)\n      const value = left\n\n      switch (node.operator) {\n        case 'eq':\n          return value === null ? query.whereNull(column) : query.where(column, '=', value)\n        case 'ne':\n          return value === null ? query.whereNotNull(column) : query.where(column, '!=', value)\n        case 'gt':\n          // value > column  => column < value\n          return query.where(column, '<', value)\n        case 'ge':\n          // value >= column => column <= value\n          return query.where(column, '<=', value)\n        case 'lt':\n          // value < column  => column > value\n          return query.where(column, '>', value)\n        case 'le':\n          // value <= column => column >= value\n          return query.where(column, '>=', value)\n        // 'in' and 'has' are not meaningful with column on RHS in our context\n        default:\n          throw new E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR(node)\n      }\n    }\n\n    // If it's a function comparison, we need to handle it differently\n    if (typeof left === 'object' && left.type === 'function') {\n      return this.#applyFunctionComparison(left, node.operator, right, query)\n    }\n\n    throw new E_ODATA_FILTER_INVALID_COMPARISON_SIDE()\n  }\n\n  #evaluateNode(node: ASTNode): any {\n    switch (node.type) {\n      case 'LITERAL':\n        return node.value\n\n      case 'PROPERTY':\n        return { type: 'column', name: node.name }\n\n      case 'FUNCTION':\n        return this.#evaluateFunction(node)\n\n      default:\n        throw new E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE(node)\n    }\n  }\n\n  #evaluateFunction(node: ASTNode): any {\n    const funcName = node.name.toLowerCase()\n\n    // For functions that need special handling in SQL\n    if (\n      ODataToLucidTranslator.#STRING_FUNCTIONS.includes(funcName) ||\n      ODataToLucidTranslator.#DATE_FUNCTIONS.includes(funcName) ||\n      ODataToLucidTranslator.#MATH_FUNCTIONS.includes(funcName)\n    ) {\n      return { type: 'function', name: funcName, arguments: node.arguments }\n    }\n\n    // For functions that can be evaluated immediately\n    if (funcName === 'tolower' && node.arguments.length === 1) {\n      const arg = this.#evaluateNode(node.arguments[0])\n      if (typeof arg === 'string') return arg.toLowerCase()\n    }\n\n    if (funcName === 'toupper' && node.arguments.length === 1) {\n      const arg = this.#evaluateNode(node.arguments[0])\n      if (typeof arg === 'string') return arg.toUpperCase()\n    }\n\n    return { type: 'function', name: funcName, arguments: node.arguments }\n  }\n\n  #escapeLike(v: string, esc = '\\\\') {\n    return v.replace(/[\\\\%_]/g, (m) => esc + m)\n  }\n\n  #dialect(query: DatabaseQueryBuilderContract) {\n    const client =\n      (query as any).client?.client?.config?.client || (query as any).client?.dialect?.name\n    // knex names: 'pg', 'mysql', 'mysql2', 'sqlite3'\n    return client\n  }\n\n  #likeOp(query: DatabaseQueryBuilderContract) {\n    return this.#dialect(query) === 'pg' ? 'ILIKE' : 'LIKE'\n  }\n\n  #applyFunctionComparison(\n    func: any,\n    operator: string,\n    value: any,\n    query: DatabaseQueryBuilderContract\n  ): DatabaseQueryBuilderContract {\n    const funcName = func.name.toLowerCase()\n\n    // String functions\n    if (funcName === 'contains' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const val = String(this.#evaluateNode(func.arguments[1]) ?? '')\n      const patt = `%${this.#escapeLike(val)}%`\n      const like = this.#likeOp(query)\n      /*\n      |--------------------------------------------------------------------------\n      | MySQL doesn't support ESCAPE clause in LIKE statements\n      |--------------------------------------------------------------------------\n      */\n      const escapeClause = this.#dialectType === 'mysql' ? '' : ` ESCAPE '\\\\'`\n\n      if (operator === 'eq') {\n        return value === true\n          ? query.whereRaw(`?? ${like} ?${escapeClause}`, [column, patt])\n          : query.whereRaw(`NOT (?? ${like} ?${escapeClause})`, [column, patt])\n      }\n    }\n    if (funcName === 'startswith' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const val = String(this.#evaluateNode(func.arguments[1]) ?? '')\n      const patt = `${this.#escapeLike(val)}%`\n      const like = this.#likeOp(query)\n      /*\n      |--------------------------------------------------------------------------\n      | MySQL doesn't support ESCAPE clause in LIKE statements\n      |--------------------------------------------------------------------------\n      */\n      const escapeClause = this.#dialectType === 'mysql' ? '' : ` ESCAPE '\\\\'`\n      if (operator === 'eq') {\n        return value === true\n          ? query.whereRaw(`?? ${like} ?${escapeClause}`, [column, patt])\n          : query.whereRaw(`NOT (?? ${like} ?${escapeClause})`, [column, patt])\n      }\n    }\n\n    if (funcName === 'endswith' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const val = String(this.#evaluateNode(func.arguments[1]) ?? '')\n      const patt = `%${this.#escapeLike(val)}`\n      const like = this.#likeOp(query)\n      /*\n      |--------------------------------------------------------------------------\n      | MySQL doesn't support ESCAPE clause in LIKE statements\n      |--------------------------------------------------------------------------\n      */\n      const escapeClause = this.#dialectType === 'mysql' ? '' : ` ESCAPE '\\\\'`\n      if (operator === 'eq') {\n        return value === true\n          ? query.whereRaw(`?? ${like} ?${escapeClause}`, [column, patt])\n          : query.whereRaw(`NOT (?? ${like} ?${escapeClause})`, [column, patt])\n      }\n    }\n\n    if (funcName === 'length' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      return query.whereRaw(`${f.len('??')} ${sqlOp} ?`, [column, value])\n    }\n\n    if (funcName === 'indexof' && func.arguments.length === 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const searchValue = this.#evaluateNode(func.arguments[1])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      // OData wants 0-based; INSTR/POSITION are 1-based (or 0 on miss). Normalize.\n      // Parameter ordering differs by dialect (POSITION(? IN col) vs INSTR(col, ?)).\n      const isPg = this.#dialectType === 'postgres'\n      const params = isPg ? [searchValue, column, value] : [column, searchValue, value]\n      return query.whereRaw(`(${f.instr('??')} - 1) ${sqlOp} ?`, params)\n    }\n\n    if (funcName === 'substring' && func.arguments.length >= 2) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const startIndex = this.#evaluateNode(func.arguments[1])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n\n      if (func.arguments.length === 2) {\n        // substring(string, start) - from start to end (OData start is 0-based → SQL start is 1-based)\n        return query.whereRaw(`${f.substr2('??', '(? + 1)')} ${sqlOp} ?`, [\n          column,\n          startIndex,\n          value,\n        ])\n      } else if (func.arguments.length === 3) {\n        // substring(string, start, length)\n        const length = this.#evaluateNode(func.arguments[2])\n        return query.whereRaw(`${f.substr3('??', '(? + 1)', '?')} ${sqlOp} ?`, [\n          column,\n          startIndex,\n          length,\n          value,\n        ])\n      }\n    }\n\n    if (funcName === 'trim' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      return query.whereRaw(`TRIM(??) ${sqlOp} ?`, [column, value])\n    }\n\n    if (funcName === 'concat' && func.arguments.length === 2) {\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      // Allow column/column and column/literal combinations\n      const a = this.#asSqlExpr(func.arguments[0])\n      const b = this.#asSqlExpr(func.arguments[1])\n      return query.whereRaw(`${f.concat(a.sql, b.sql)} ${sqlOp} ?`, [\n        ...a.params,\n        ...b.params,\n        value,\n      ])\n    }\n\n    // tolower/toupper functions for columns\n    if (funcName === 'tolower' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      return query.whereRaw(`LOWER(??) ${sqlOp} LOWER(?)`, [column, value])\n    }\n\n    if (funcName === 'toupper' && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      return query.whereRaw(`UPPER(??) ${sqlOp} UPPER(?)`, [column, value])\n    } // Date functions\n    if (ODataToLucidTranslator.#DATE_FUNCTIONS.includes(funcName) && func.arguments.length === 1) {\n      const column = this.#getColumnFromNode(func.arguments[0])\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n      const f = this.#getSqlFns()\n      let expr: string\n      switch (funcName) {\n        case 'year':\n          expr = f.year('??')\n          break\n        case 'month':\n          expr = f.month('??')\n          break\n        case 'day':\n          expr = f.day('??')\n          break\n        case 'hour':\n          expr = f.hour('??')\n          break\n        case 'minute':\n          expr = f.minute('??')\n          break\n        case 'second':\n          expr = f.second('??')\n          break\n        default:\n          throw new E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON(funcName)\n      }\n      return query.whereRaw(`${expr} ${sqlOp} ?`, [column, value])\n    }\n\n    // Math functions\n    if (ODataToLucidTranslator.#MATH_FUNCTIONS.includes(funcName)) {\n      const f = this.#getSqlFns()\n      const sqlOp = this.#getComparisonOperatorSQL(operator)\n\n      if (funcName === 'round' && (func.arguments.length === 1 || func.arguments.length === 2)) {\n        const column = this.#getColumnFromNode(func.arguments[0])\n        if (func.arguments.length === 1) {\n          // round(value) - round to integer\n          return query.whereRaw(`${f.round('??')} ${sqlOp} ?`, [column, value])\n        } else {\n          // round(value, precision)\n          const precision = this.#evaluateNode(func.arguments[1])\n          return query.whereRaw(`${f.round('??', '?')} ${sqlOp} ?`, [column, precision, value])\n        }\n      } else if (funcName === 'floor' && func.arguments.length === 1) {\n        const column = this.#getColumnFromNode(func.arguments[0])\n        return query.whereRaw(`${f.floor('??')} ${sqlOp} ?`, [column, value])\n      } else if (funcName === 'ceiling' && func.arguments.length === 1) {\n        const column = this.#getColumnFromNode(func.arguments[0])\n        return query.whereRaw(`${f.ceil('??')} ${sqlOp} ?`, [column, value])\n      }\n    }\n    throw new E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON(funcName)\n  }\n\n  #getColumnFromNode(node: ASTNode): string {\n    const result = this.#evaluateNode(node)\n    if (typeof result === 'object' && result.type === 'column') {\n      return this.#getColumnName(result.name)\n    }\n    throw new E_ODATA_FILTER_EXPECTED_COLUMN_REFERENCE()\n  }\n\n  //   #getValueFromNode(node: ASTNode): string | number {\n  //     const result = this.#evaluateNode(node)\n  //     if (typeof result === 'object' && result.type === 'column') {\n  //       return this.#getColumnName(result.name)\n  //     }\n  //     // Return the literal value for non-column arguments\n  //     return result\n  //   }\n\n  #getColumnName(key: string): string {\n    // Check if there's a mapping for this key\n    if (this.#keyToColumn.has(key)) {\n      return this.#keyToColumn.get(key)!\n    }\n    // Otherwise use the key as-is\n    return key\n  }\n\n  #getComparisonOperatorSQL(operator: string): string {\n    const mapping: Record<string, string> = {\n      eq: '=',\n      ne: '!=',\n      gt: '>',\n      ge: '>=',\n      lt: '<',\n      le: '<=',\n    }\n    return mapping[operator] || '='\n  }\n\n  // (date/math helper mappings removed in favor of dialect-aware #getSqlFns())\n}\n","import { js2xml } from 'xml-js'\nimport { DateTime } from 'luxon'\nimport { default as qs } from 'qs'\nimport { default as pMap } from 'p-map'\nimport { Exception } from '@poppinss/utils'\nimport { default as Hooks } from '@poppinss/hooks'\nimport { joi } from '@nhtio/lucid-resourceful/joi'\nimport { NextFn } from '@poppinss/middleware/types'\nimport { default as string } from '@poppinss/string'\nimport { stripUndefinedValuesFromObject } from '../../utils'\nimport { default as Middleware } from '@poppinss/middleware'\nimport { makeOpName } from '../services/odata_metadata_service'\nimport { normalizeError } from '../../router_macro/utils/errors'\nimport { useODataContext } from '@nhtio/lucid-resourceful/odata/context'\nimport { ODataToLucidTranslator } from '../../odata_to_lucid_translator'\nimport { isAdditionalResourcefulRouteDetails } from '../../router_macro/utils/type_guards'\nimport {\n  isObject,\n  isArray,\n  isStringContent,\n  isResourcefulModel,\n  isInstanceOf,\n} from '../../type_guards'\nimport {\n  sanitizeSelect,\n  sanitizeExpand,\n  santizeResponsePayload,\n  sanitizeODataKeys,\n} from '../utils/odata'\nimport {\n  negotiateContent,\n  negotiateMetadata,\n  negotiatePreference,\n  negotiateIeee754Compatible,\n} from '../utils/http'\nimport {\n  ResourcefulNumberType,\n  ResourcefulIntegerType,\n  ResourcefulBigintType,\n  ResourcefulUnsignedIntegerType,\n} from '../../data_types'\nimport {\n  E_UNRESOLVABLE_MODEL,\n  E_ROUTE_NOT_FOUND,\n  E_RELATIONSHIP_NOT_FOUND_EXCEPTION,\n  E_RECORD_NOT_FOUND_EXCEPTION,\n  E_UNSYNCABLE_RELATIONSHIP_EXCEPTION,\n  E_INVALID_RELATIONSHIP_EXCEPTION,\n  E_EXPAND_NOT_IMPLEMENTED,\n  E_UNSUPPORTED_DATABASE_DIALECT,\n  E_UNACCEPTABLE_FORMAT,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ElementCompact } from 'xml-js'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ResourcefulDataType } from '../../data_types'\nimport type { AnySchema } from '@nhtio/lucid-resourceful/joi'\nimport type { ApplicationService } from '@adonisjs/core/types'\nimport type { Dialect } from '../../odata_to_lucid_translator'\nimport type { ResourcefulModelMetaSchema } from '@nhtio/lucid-resourceful/types'\nimport type { ResourcefulRouterModelServiceOptionsService } from '../../router_macro/services/resourceful_router_model_options_service'\nimport type {\n  ResourcefulModel,\n  ResourcefulIndexResponse,\n  ResourceResourcefulRecordResponse,\n  ResourcefulQueryScopeCallback,\n  ResourcefulPayloadSchemaGetter,\n  ResourcefulPolicy,\n  ResourcefulIndexResponseHook,\n  ResourceResourcefulRecordResponseHook,\n  ResourcefulRouterMutatorOptions,\n  RouteCallback,\n  AdditionalResourcefulRouteDetails,\n} from '@nhtio/lucid-resourceful/types'\n\ntype ODataMetadata = {\n  context: string\n} & Partial<{\n  count: number\n  nextLink: string\n  deltaLink: string\n  id: string | number | bigint\n  etag: string\n  readLink: string\n  editLink: string\n  navigationLink: string\n  type: string\n  mediaReadLink: string\n  mediaEditLink: string\n  mediaContentType: string\n  mediaEtag: string\n}>\n\nconst encoder = (_key: string, value: any) => {\n  if (value instanceof Date) {\n    return DateTime.fromJSDate(value).toISO()\n  }\n  if (value instanceof DateTime) {\n    return value.toISO()\n  }\n  // Handle Luxon DateTime values that may come from a different module instance.\n  if (\n    value &&\n    typeof value === 'object' &&\n    value.isLuxonDateTime === true &&\n    typeof value.toISO === 'function'\n  ) {\n    return value.toISO()\n  }\n  if (typeof value === 'bigint') {\n    return value.toString()\n  }\n  if (typeof value === 'number') {\n    // OData JSON §7.1: Infinity and NaN are represented as string literals\n    // \"INF\", \"-INF\", \"NaN\". Normal numbers remain numeric (not stringified).\n    // NOTE: This is a behavior change from earlier versions which stringified all numbers.\n    if (Number.POSITIVE_INFINITY === value) {\n      return 'INF'\n    }\n    if (Number.NEGATIVE_INFINITY === value) {\n      return '-INF'\n    }\n    if (Number.isNaN(value)) {\n      return 'NaN'\n    }\n    return value\n  }\n  return value\n}\n\nconst asXmlEntityObject = (obj: any): any => {\n  obj = sanitizeODataKeys(obj)\n  if (!isObject(obj)) {\n    return obj\n  }\n  return Object.assign(\n    {},\n    ...Object.entries(obj).map(([key, value]) => {\n      value = encoder(key, value)\n      if (isObject(value)) {\n        return { [`data:${key}`]: asXmlEntityObject(value) }\n      } else if (isArray(value)) {\n        return { [`data:${key}`]: value.map((v) => asXmlEntityObject(v)) }\n      }\n      return { [`data:${key}`]: { _text: String(value) } }\n    })\n  )\n}\n\nconst elementCompactFromResourcefulModelRecord = (\n  record: ResourceResourcefulRecordResponse\n): ElementCompact => {\n  record = sanitizeODataKeys(record) as ResourceResourcefulRecordResponse\n  const ret: ElementCompact = {\n    'metadata:properties': asXmlEntityObject(record),\n  }\n  return ret\n}\n\nconst toJsonEntity = (entity: any) => {\n  if (entity && typeof entity.toJSON === 'function') {\n    try {\n      return sanitizeODataKeys(entity.toJSON())\n    } catch {\n      return sanitizeODataKeys({ ...entity })\n    }\n  }\n  return sanitizeODataKeys(entity)\n}\n\n/**\n * Determines whether a resourceful data type maps to an EDM scalar type that\n * must be serialized as a JSON string when `IEEE754Compatible=true` is\n * negotiated (per OData JSON Format §3.2 — `Edm.Int64`, `Edm.Decimal`).\n *\n * The Int64-vs-Int32 threshold mirrors\n * `ODataMetadataService#getEdmIntScalarType` so a property reported as\n * `Edm.Int64` in `$metadata` is also stringified on the wire.\n */\nconst isIeee754CompatibleRelevantType = (type: ResourcefulDataType): boolean => {\n  if (isInstanceOf(type, 'ResourcefulBigintType', ResourcefulBigintType)) {\n    return true\n  }\n  if (isInstanceOf(type, 'ResourcefulNumberType', ResourcefulNumberType)) {\n    return true\n  }\n  const isInteger = isInstanceOf(type, 'ResourcefulIntegerType', ResourcefulIntegerType)\n  const isUnsigned = isInstanceOf(\n    type,\n    'ResourcefulUnsignedIntegerType',\n    ResourcefulUnsignedIntegerType\n  )\n  if (!isInteger && !isUnsigned) {\n    return false\n  }\n  const intType = type as ResourcefulIntegerType | ResourcefulUnsignedIntegerType\n  const min = isUnsigned ? 0 : intType.exclusiveMinimum ? intType.minimum + 1 : intType.minimum\n  const max = intType.exclusiveMaximum\n    ? intType.maximum\n    : typeof intType.maximum === 'bigint'\n      ? (intType.maximum as unknown as bigint) - BigInt(1)\n      : (intType.maximum as number) - 1\n\n  return min < -2_147_483_648 || (max as number) > 2_147_483_647\n}\n\n/** Per-request cache of resourceful meta schemas, keyed by the model class. */\ntype ResourcefulModelMetaCache = Map<ResourcefulModel, ResourcefulModelMetaSchema>\n\n/**\n * Pre-warms a per-request cache of resourceful meta schemas for `rootModel`\n * and every related model reachable through its relationships. Having it\n * ready up-front keeps response serialization synchronous — the coercion\n * pass needs a related model's meta to walk into `$expand`ed nested data,\n * and `$getAsResourcefulForContext` is async.\n */\nconst buildModelMetaCache = async (\n  rootModel: ResourcefulModel,\n  ctx: HttpContext,\n  app: ApplicationService\n): Promise<ResourcefulModelMetaCache> => {\n  const cache: ResourcefulModelMetaCache = new Map()\n\n  const visit = async (model: ResourcefulModel): Promise<void> => {\n    if (cache.has(model)) return\n    let meta: ResourcefulModelMetaSchema\n    try {\n      meta = await model.$getAsResourcefulForContext(ctx, app)\n    } catch {\n      return\n    }\n\n    cache.set(model, meta)\n\n    for (const prop of Object.values(meta.properties)) {\n      if (prop.kind !== 'relationship') continue\n      try {\n        const related = prop.relatedModel()\n        if (isResourcefulModel(related)) {\n          await visit(related)\n        }\n      } catch {\n        // Relation resolution may fail for unregistered models — safe to skip.\n      }\n    }\n  }\n  await visit(rootModel)\n  return cache\n}\n\n/**\n * Coerces a single Int64/Decimal field in-place to match the negotiated\n * `IEEE754Compatible` parameter: stringifies the value when the client asked\n * for strings, or unstringifies it back to a JSON number when the client is\n * using the default JSON representation.\n *\n * NOTE: values above `Number.MAX_SAFE_INTEGER` (2^53 − 1) still get coerced\n * to `Number`, which may silently lose precision. This is an accepted\n * trade-off: `IEEE754Compatible=false` clients (Power BI in particular)\n * cannot parse string values at all — a slightly imprecise number is\n * strictly better than a hard error that blocks the entire table.\n */\nconst coerceNumericField = (\n  entity: Record<string, unknown>,\n  jsonKey: string,\n  ieee754Compatible: boolean\n): void => {\n  const value = entity[jsonKey]\n  // Null/undefined are valid JSON and carry no precision concern — leave as-is.\n  if (value === null || value === undefined) return\n\n  // Direction fork: stringify (true) vs. unstringify (false).\n  if (ieee754Compatible) {\n    // Already a string — matches the IEEE754=true wire format, no work needed.\n    if (typeof value === 'string') return\n    if (typeof value === 'bigint') {\n      entity[jsonKey] = value.toString()\n      return\n    }\n    // Non-finite numbers (Infinity/NaN) are handled by the JSON encoder per\n    // OData §7.1, so skip them here instead of emitting \"Infinity\" strings.\n    if (typeof value === 'number' && Number.isFinite(value)) {\n      entity[jsonKey] = String(value)\n    }\n    return\n  }\n\n  // IEEE754=false path: coerce back to JSON number. bigint came from the JS\n  // runtime; string came from node-postgres preserving precision on\n  // bigint/numeric columns — both need unwrapping for clients that expect\n  // Edm.Int64 as a number (Power BI's default).\n  if (typeof value === 'bigint') {\n    entity[jsonKey] = Number(value)\n    return\n  }\n  if (typeof value !== 'string') return\n  const num = Number(value)\n  // Reject non-numeric strings (malformed data) rather than writing NaN.\n  if (Number.isNaN(num) || !Number.isFinite(num)) return\n  entity[jsonKey] = num\n}\n\n/**\n * Walks `entity` using `model`'s resourceful metadata as the guide: any\n * scalar column whose declared type maps to Edm.Int64 / Edm.Decimal is\n * coerced per the negotiated IEEE754Compatible parameter, and any relation\n * key actually present in the data (e.g. from `$expand`) is recursed into\n * using the related model's own metadata.\n */\nconst coerceEntityForIeee754 = (\n  entity: Record<string, unknown>,\n  model: ResourcefulModel,\n  ieee754Compatible: boolean,\n  metaCache: ResourcefulModelMetaCache,\n  visited: Set<ResourcefulModel> = new Set()\n): void => {\n  if (visited.has(model)) return\n  const meta = metaCache.get(model)\n  // Meta cache miss — model wasn't reachable from the root at warm-up time.\n  // Rare but possible if a hook attached records from an unrelated model.\n  if (!meta) return\n  const nextVisited = new Set(visited)\n  nextVisited.add(model)\n\n  for (const [propertyKey, prop] of Object.entries(meta.properties)) {\n    // Fork by property kind: scalar (column / computed) vs. relation.\n    if (prop.kind === 'column' || prop.kind === 'computedAccessor') {\n      const serializeAs = (prop.lucidDefinitions as { serializeAs?: string | null } | undefined)\n        ?.serializeAs\n      // serializeAs: null means Lucid hides this column from toJSON() — it\n      // won't appear in the response, so there's nothing to coerce.\n      if (serializeAs === null) continue\n      const jsonKey = serializeAs || propertyKey\n      // Column may be declared on the model but dropped from this specific\n      // response (e.g. $select, visibility policy) — skip if absent.\n      if (!(jsonKey in entity)) continue\n      // Only Edm.Int64 / Edm.Decimal can exceed IEEE 754 safe range. Smaller\n      // integer types and booleans ride JSON numbers without precision risk,\n      // so the IEEE754Compatible parameter doesn't change their wire form.\n      if (!isIeee754CompatibleRelevantType(prop.definition.type)) continue\n      coerceNumericField(entity, jsonKey, ieee754Compatible)\n      continue\n    }\n    if (prop.kind !== 'relationship') continue\n    // Relation absent from the data means the client didn't $expand it —\n    // no nested records to walk, nothing to coerce.\n    if (!(propertyKey in entity)) continue\n    const nested = entity[propertyKey]\n    if (nested === null || nested === undefined) continue\n    let relatedModel: ResourcefulModel | null = null\n    try {\n      const related = prop.relatedModel()\n      if (isResourcefulModel(related)) relatedModel = related\n    } catch {\n      // Relation resolution may fail for unregistered models — safe to skip.\n    }\n    if (!relatedModel) continue\n    // Array vs. single object reflects the relation cardinality (hasMany /\n    // manyToMany produce arrays; hasOne / belongsTo produce single objects).\n    // Recurse with the related model's meta so each nested level is coerced\n    // against its own column definitions.\n    if (Array.isArray(nested)) {\n      for (const item of nested) {\n        if (item && typeof item === 'object') {\n          coerceEntityForIeee754(\n            item as Record<string, unknown>,\n            relatedModel,\n            ieee754Compatible,\n            metaCache,\n            nextVisited\n          )\n        }\n      }\n      continue\n    }\n    if (typeof nested === 'object') {\n      coerceEntityForIeee754(\n        nested as Record<string, unknown>,\n        relatedModel,\n        ieee754Compatible,\n        metaCache,\n        nextVisited\n      )\n    }\n  }\n}\n\n/**\n * Shapes `respond()` can be asked to serialize. Entity bodies are plain\n * dictionaries (after `toJSON()`); collections are arrays of those. Primitive\n * bodies cover `$count` and other raw text responses; `undefined` covers\n * 204/304 and minimal-preference updates.\n */\ntype RespondEntityBody = Record<string, unknown>\ntype RespondBody = undefined | number | RespondEntityBody | RespondEntityBody[]\n\n/**\n * Arguments for `respond()`.\n *\n * @property status HTTP status code of the response.\n * @property body Payload to serialize — a single entity, a collection of\n *   entities, a primitive (e.g. `$count`), or `undefined` for empty bodies\n *   (204/304, minimal-preference updates).\n * @property metadata OData `@odata.*` annotations for the response envelope\n *   (context, count, nextLink, id, etag, etc.).\n * @property model Optional. The resourceful model describing the entity\n *   shape of `body`. Drives the IEEE754 coercion pass — Edm.Int64 /\n *   Edm.Decimal detection and `$expand` recursion into related models. Omit\n *   when `body` isn't entity-shaped — 204/304 responses, error envelopes,\n *   raw `$count` numbers — since there's nothing for the coercion pass to\n *   walk.\n * @property isArray Optional. Marks `body` as a collection so it's serialized\n *   into an OData feed (`value: [...]` / `<feed>`) instead of a single\n *   entry. Omit when there's no body (204/304) or the body is a primitive —\n *   there's no ambiguity in those cases. Defaults to `Array.isArray(body)`.\n * @property headers Optional. Request-level response headers to merge on\n *   top of macro-level and controller-level defaults.\n * @property raw Optional. When `true`, serializes `String(body)` as\n *   `text/plain` and skips OData envelope construction — used for `$count`\n *   endpoints that must return a bare number per the spec.\n */\ninterface RespondOptions {\n  status: number\n  body: RespondBody\n  metadata: ODataMetadata\n  model?: ResourcefulModel\n  isArray?: boolean\n  headers?: { [key: string]: string }\n  raw?: boolean\n}\n\ninterface ModelRelationshipSyncPayload {\n  ruids: Array<string | number>\n}\n\nconst modelRelationshipSyncPayloadSchema = joi.object<ModelRelationshipSyncPayload>({\n  ruids: joi\n    .array()\n    .items(joi.alternatives().try(joi.string().required(), joi.number().integer().required()))\n    .required(),\n})\n\nexport type ResourcefulModelControllerHooks = {\n  index: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  create: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  read: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n  readRelated: [\n    [ResourcefulIndexResponse, HttpContext],\n    [error: Error | null, ResourcefulIndexResponse, HttpContext],\n  ]\n  update: [\n    [ResourceResourcefulRecordResponse, HttpContext],\n    [error: Error | null, ResourceResourcefulRecordResponse, HttpContext],\n  ]\n}\n\nexport type ODataEntityUidAndRelationshipInformation = {\n  uid: string | undefined\n  relationship: string | undefined\n  isCountRequest: boolean\n}\n\ntype MiddlewareFn = (ctx: HttpContext, next: NextFn) => void | Promise<void>\n\nexport class ResourcefulModelController {\n  readonly #subpath: string\n  readonly #model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>\n  readonly #options: ResourcefulRouterModelServiceOptionsService\n  readonly #headers: {\n    [key: string]: string\n  }\n  readonly #mutators: Hooks<ResourcefulModelControllerHooks>\n  readonly #scopeRestrictors: ResourcefulQueryScopeCallback[]\n  readonly #payloadRestrictors: ResourcefulPayloadSchemaGetter[]\n  readonly #operations: Map<string, RouteCallback | AdditionalResourcefulRouteDetails>\n  get options() {\n    return this.#options\n  }\n\n  constructor(\n    subpath: string,\n    model: Promise<ResourcefulModel | E_UNRESOLVABLE_MODEL>,\n    options: ResourcefulRouterModelServiceOptionsService,\n    headers: {\n      [key: string]: string\n    },\n    groupResourcefulQueryScopeCallbacks?: ResourcefulQueryScopeCallback[],\n    groupResourcefulPayloadSchemaGetters?: ResourcefulPayloadSchemaGetter[],\n    groupResourcefulRouterMutatorOptions?: ResourcefulRouterMutatorOptions,\n    groupResourcefulPolicies?: ResourcefulPolicy[]\n  ) {\n    this.#subpath = subpath\n    this.#model = model\n    this.#options = options\n    this.#headers = headers\n    this.#mutators = new Hooks<ResourcefulModelControllerHooks>()\n    this.#scopeRestrictors = [\n      ...(groupResourcefulQueryScopeCallbacks || []),\n      ...(this.#options.scopeRestrictors || []),\n    ]\n    this.#payloadRestrictors = [\n      ...(groupResourcefulPayloadSchemaGetters || []),\n      ...(this.#options.payloadRestrictors || []),\n    ]\n    if (isObject(groupResourcefulRouterMutatorOptions)) {\n      if (\n        'index' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.index)\n      ) {\n        groupResourcefulRouterMutatorOptions.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if (\n        'create' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.create)\n      ) {\n        groupResourcefulRouterMutatorOptions.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'read' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.read)\n      ) {\n        groupResourcefulRouterMutatorOptions.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'readRelated' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.readRelated)\n      ) {\n        groupResourcefulRouterMutatorOptions.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if (\n        'update' in groupResourcefulRouterMutatorOptions &&\n        isArray(groupResourcefulRouterMutatorOptions.update)\n      ) {\n        groupResourcefulRouterMutatorOptions.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (isObject(this.#options.mutators)) {\n      if ('index' in this.#options.mutators && isArray(this.#options.mutators.index)) {\n        this.#options.mutators.index.forEach((hook) => {\n          this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n        })\n      }\n      if ('create' in this.#options.mutators && isArray(this.#options.mutators.create)) {\n        this.#options.mutators.create.forEach((hook) => {\n          this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('read' in this.#options.mutators && isArray(this.#options.mutators.read)) {\n        this.#options.mutators.read.forEach((hook) => {\n          this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('readRelated' in this.#options.mutators && isArray(this.#options.mutators.readRelated)) {\n        this.#options.mutators.readRelated.forEach((hook) => {\n          this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n      if ('update' in this.#options.mutators && isArray(this.#options.mutators.update)) {\n        this.#options.mutators.update.forEach((hook) => {\n          this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n        })\n      }\n    }\n    if (groupResourcefulPolicies) {\n      groupResourcefulPolicies.forEach((policy) => {\n        if (policy.scope) {\n          this.#scopeRestrictors.push(policy.scope)\n        }\n        if (policy.payload) {\n          this.#payloadRestrictors.push(policy.payload)\n        }\n        if (isObject(policy.mutators)) {\n          if ('index' in policy.mutators && isArray(policy.mutators.index)) {\n            policy.mutators.index.forEach((hook) => {\n              this.#mutators.add('index', hook as ResourcefulIndexResponseHook)\n            })\n          }\n          if ('create' in policy.mutators && isArray(policy.mutators.create)) {\n            policy.mutators.create.forEach((hook) => {\n              this.#mutators.add('create', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('read' in policy.mutators && isArray(policy.mutators.read)) {\n            policy.mutators.read.forEach((hook) => {\n              this.#mutators.add('read', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('readRelated' in policy.mutators && isArray(policy.mutators.readRelated)) {\n            policy.mutators.readRelated.forEach((hook) => {\n              this.#mutators.add('readRelated', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n          if ('update' in policy.mutators && isArray(policy.mutators.update)) {\n            policy.mutators.update.forEach((hook) => {\n              this.#mutators.add('update', hook as ResourceResourcefulRecordResponseHook)\n            })\n          }\n        }\n      })\n    }\n    this.#operations = new Map<string, RouteCallback | AdditionalResourcefulRouteDetails>()\n  }\n\n  static async getResourcefulModelCreatePayloadValidationSchema(\n    model: ResourcefulModel,\n    ctx: HttpContext,\n    app: ApplicationService\n  ) {\n    const schemas: AnySchema[] = []\n    await pMap(\n      model.$resourcefulPayloadValidationSchemaBuilders.create,\n      async (builder) => {\n        const schema = await builder(ctx, app)\n        if (schema) {\n          schemas.push(schema)\n        }\n      },\n      { concurrency: 1 }\n    )\n    let ret = joi.any()\n    schemas.forEach((schema) => {\n      ret = ret.concat(schema)\n    })\n    return ret\n  }\n\n  async #getWriteValidationSchema(\n    ctx: HttpContext,\n    model: ResourcefulModel,\n    app: ApplicationService,\n    forUpdate: boolean = false\n  ) {\n    const schema = await model.$asOpenApiSchemaObject(ctx, app, 'write')\n    const asResourceful = await model.$getAsResourcefulForContext(ctx, app)\n    const modelJoiSchema =\n      await ResourcefulModelController.getResourcefulModelCreatePayloadValidationSchema(\n        model,\n        ctx,\n        app\n      )\n    return joi.object(\n      Object.assign(\n        {},\n        ...Object.keys(schema.properties!)\n          .filter((p) => p !== model.primaryKey)\n          .map((creatablePropertyKey) => {\n            const required =\n              !forUpdate &&\n              Array.isArray(schema.required) &&\n              schema.required.includes(creatablePropertyKey)\n            const returnable = {\n              [creatablePropertyKey]: joi.any(),\n            }\n            const prop = asResourceful.properties[creatablePropertyKey]\n            if (prop) {\n              const validator = prop.validator\n              if (validator) {\n                returnable[creatablePropertyKey] = validator\n              }\n            }\n            try {\n              const extracted = modelJoiSchema.extract(creatablePropertyKey)\n              if (extracted) {\n                returnable[creatablePropertyKey] = returnable[creatablePropertyKey]\n                  ? returnable[creatablePropertyKey].concat(extracted)\n                  : extracted\n              }\n            } catch {\n              // noop\n            }\n            if (required) {\n              returnable[creatablePropertyKey] = returnable[creatablePropertyKey].concat(\n                joi.any().required()\n              )\n            } else {\n              returnable[creatablePropertyKey] = returnable[creatablePropertyKey].concat(\n                joi.any().optional()\n              )\n            }\n            return returnable\n          })\n      )\n    )\n  }\n\n  async getODataContextUrl(fragment: string) {\n    const odataContext = await useODataContext()\n    let base = odataContext.serviceBaseUrl\n    if (!base.endsWith('/')) {\n      base += '/'\n    }\n    const parts = [base, '$metadata', '#', fragment]\n    return parts.join('')\n  }\n\n  async resolveFullUrl(relative: string, ...more: string[]) {\n    const odataContext = await useODataContext()\n    let base = odataContext.serviceBaseUrl\n    if (!base.endsWith('/')) {\n      base += '/'\n    }\n    const parts = [base, relative, ...more]\n    return parts.join('/')\n  }\n\n  async resolveBaseRequirements() {\n    const [model, { default: app }] = await Promise.all([\n      this.#model,\n      import('@adonisjs/core/services/app'),\n    ])\n    return { model, app }\n  }\n\n  resolveUrlResource(ctx: HttpContext) {\n    const star = ctx.params['*']\n    let resource = Array.isArray(star)\n      ? `/${star.join('/')}`\n      : typeof star === 'string'\n        ? star.startsWith('/')\n          ? star\n          : `/${star}`\n        : '/'\n    resource = resource.replace(/\\/{2,}/g, '/')\n    return resource\n  }\n\n  async resolveRequestRequirements(ctx: HttpContext) {\n    const { model, app } = await this.resolveBaseRequirements()\n    const serveAs = negotiateContent(ctx)\n    const metadataLevel = negotiateMetadata(ctx)\n    const preference = negotiatePreference(ctx)\n    const ieee754Compatible = negotiateIeee754Compatible(ctx)\n    const method = ctx.request.method() || 'GET'\n    const url = ctx.request.url() || '/'\n    if (model instanceof E_UNRESOLVABLE_MODEL) {\n      throw new E_ROUTE_NOT_FOUND([method, url])\n    }\n    // Pre-warm a per-request cache of resourceful meta schemas for the root\n    // model and every reachable related model. The respond() coercion pass\n    // walks the data guided by each entity's own model meta (for Edm.Int64 /\n    // Edm.Decimal detection and $expand recursion), and this keeps that walk\n    // synchronous.\n    let metaCache: ResourcefulModelMetaCache = new Map()\n    if (isResourcefulModel(model)) {\n      try {\n        metaCache = await buildModelMetaCache(model, ctx, app)\n      } catch {\n        metaCache = new Map()\n      }\n    }\n\n    const respond = (options: RespondOptions) => {\n      const {\n        status,\n        body,\n        metadata,\n        model: coercionModel,\n        isArray: isCollection,\n        headers = {},\n        raw = false,\n      } = options\n\n      ctx.response.status(status)\n      // apply macro-level headers\n      Object.entries(this.#headers).forEach(([key, value]) => ctx.response.header(key, value))\n      // apply controller-level headers\n      Object.entries(this.#options.headers).forEach(([key, value]) =>\n        ctx.response.header(key, value)\n      )\n      // apply request-level headers\n      Object.entries(headers).forEach(([key, value]) => ctx.response.header(key, value))\n      // apply OData headers\n      if (!ctx.response.getHeader('OData-Version')) {\n        ctx.response.header('OData-Version', '4.0')\n      }\n      if (metadata.etag) {\n        ctx.response.header('ETag', metadata.etag)\n      }\n      // Handle empty/no-content responses\n      if (status === 204 || status === 304 || body === null || typeof body === 'undefined') {\n        ctx.response.send(null)\n        return\n      }\n      if (raw) {\n        ctx.response.header('Content-Type', `text/plain`)\n        ctx.response.send(String(body))\n        return\n      }\n      // apply content-type headers\n      switch (serveAs) {\n        case 'xml': {\n          const typeParam = isCollection ? 'feed' : 'entry'\n          ctx.response.header(\n            'Content-Type',\n            `application/atom+xml;type=${typeParam};odata.metadata=${metadataLevel}`\n          )\n          break\n        }\n        default: {\n          // Per OData JSON §3.2, the server MUST NOT advertise a\n          // `IEEE754Compatible` parameter it does not actually honor in the\n          // payload. Emitting `=true` while writing numeric `Edm.Int64` /\n          // `Edm.Decimal` values is what triggers Power BI's\n          // `DataSource.Error: Cannot convert a value to target type\n          // 'Edm.Int64' because of conflict between input format\n          // string/number and parameter 'IEEE754Compatible' false/true`.\n          // We advertise the parameter that matches the value we're actually\n          // going to serialize, based on the client's negotiation.\n          ctx.response.header(\n            'Content-Type',\n            `application/json;odata.metadata=${metadataLevel};IEEE754Compatible=${\n              ieee754Compatible ? 'true' : 'false'\n            }`\n          )\n          break\n        }\n      }\n\n      const include = (name: keyof ODataMetadata) => {\n        if (serveAs === 'xml') return true\n        if (metadataLevel === 'none') return false\n        if (metadataLevel === 'minimal') {\n          return ['context', 'count', 'nextLink', 'deltaLink', 'id', 'etag'].includes(name)\n        }\n        return true // full\n      }\n\n      // IEEE754 coercion helper — walks the JSON entity using the target\n      // model's meta to decide which fields need stringifying/unstringifying,\n      // and recurses into $expand-ed relations using their own model meta.\n      const applyIeee754Coercion = (jsonEntity: unknown): void => {\n        if (!coercionModel) return\n        if (!jsonEntity || typeof jsonEntity !== 'object' || Array.isArray(jsonEntity)) return\n\n        coerceEntityForIeee754(\n          jsonEntity as Record<string, unknown>,\n          coercionModel,\n          ieee754Compatible,\n          metaCache\n        )\n      }\n\n      // JSON\n      if (serveAs !== 'xml') {\n        if (isCollection) {\n          const records = body as RespondEntityBody[]\n          const value = records.map((item) => {\n            const jsonEntity = toJsonEntity(item)\n            applyIeee754Coercion(jsonEntity)\n            return jsonEntity\n          })\n          const payload: Record<string, any> = stripUndefinedValuesFromObject({\n            // Annotations\n            ['@odata.context']: include('context') ? metadata.context : undefined,\n            ['@odata.count']: include('count') ? metadata.count : undefined,\n            ['@odata.nextLink']: include('nextLink') ? metadata.nextLink : undefined,\n            ['@odata.deltaLink']: include('deltaLink') ? metadata.deltaLink : undefined,\n            // Data\n            value,\n          })\n          ctx.response.send(JSON.stringify(payload, encoder))\n          return\n        }\n\n        // Single entity or primitive\n        const entity = toJsonEntity(body)\n        if (isObject(entity)) {\n          applyIeee754Coercion(entity)\n          const payload: Record<string, any> = stripUndefinedValuesFromObject({\n            ['@odata.context']: include('context') ? metadata.context : undefined,\n            ['@odata.id']:\n              include('id') && metadata.id !== undefined ? String(metadata.id) : undefined,\n            ['@odata.etag']: include('etag') ? metadata.etag : undefined,\n            ['@odata.readLink']: include('readLink') ? metadata.readLink : undefined,\n            ['@odata.editLink']: include('editLink') ? metadata.editLink : undefined,\n            ['@odata.type']: include('type') ? metadata.type : undefined,\n            ['@odata.mediaReadLink']: include('mediaReadLink') ? metadata.mediaReadLink : undefined,\n            ['@odata.mediaEditLink']: include('mediaEditLink') ? metadata.mediaEditLink : undefined,\n            ['@odata.mediaContentType']: include('mediaContentType')\n              ? metadata.mediaContentType\n              : undefined,\n            ['@odata.mediaEtag']: include('mediaEtag') ? metadata.mediaEtag : undefined,\n            ...entity,\n          })\n          ctx.response.send(JSON.stringify(payload, encoder))\n          return\n        } else {\n          // Primitive value\n          const payload: Record<string, any> = stripUndefinedValuesFromObject({\n            ['@odata.context']: include('context') ? metadata.context : undefined,\n            value: entity,\n          })\n          ctx.response.send(JSON.stringify(payload, encoder))\n          return\n        }\n      }\n\n      // XML (Atom)\n      const atomNs = 'http://www.w3.org/2005/Atom'\n      const mNs = 'http://docs.oasis-open.org/odata/ns/metadata'\n      const dNs = 'http://docs.oasis-open.org/odata/ns/data'\n\n      const buildEntry = (entity: any, meta: ODataMetadata): ElementCompact => {\n        const obj = toJsonEntity(entity) as any\n        const entryAttrs: Record<string, any> = stripUndefinedValuesFromObject({\n          'metadata:context': include('context') ? meta.context : undefined,\n          'metadata:etag': include('etag') ? meta.etag : undefined,\n        })\n\n        const entryNode: ElementCompact = {\n          entry: {\n            _attributes: {\n              'xmlns': atomNs,\n              'xmlns:metadata': mNs,\n              'xmlns:data': dNs,\n              ...entryAttrs,\n            },\n            // Optional Atom children (gated by metadata level)\n            ...(include('id') && meta.id !== undefined ? { id: { _text: String(meta.id) } } : {}),\n            ...(include('readLink') && meta.readLink\n              ? { link: [{ _attributes: { rel: 'self', href: meta.readLink } }] }\n              : {}),\n            ...(include('editLink') && meta.editLink\n              ? {\n                  link: [\n                    ...(meta.readLink\n                      ? [{ _attributes: { rel: 'self', href: meta.readLink } }]\n                      : []),\n                    { _attributes: { rel: 'edit', href: meta.editLink } },\n                  ],\n                }\n              : {}),\n            content: {\n              _attributes: { type: 'application/xml' },\n              ...elementCompactFromResourcefulModelRecord(obj),\n            },\n          },\n        }\n        return entryNode.entry as ElementCompact\n      }\n\n      if (isCollection) {\n        const feedAttrs: Record<string, any> = stripUndefinedValuesFromObject({\n          'metadata:context': include('context') ? metadata.context : undefined,\n        })\n\n        const linkNext =\n          include('nextLink') && metadata.nextLink\n            ? [\n                {\n                  _attributes: { rel: 'next', href: metadata.nextLink },\n                },\n              ]\n            : undefined\n\n        const feedDoc: ElementCompact = {\n          _declaration: { _attributes: { version: '1.0', encoding: 'utf-8' } },\n          feed: stripUndefinedValuesFromObject({\n            _attributes: {\n              'xmlns': atomNs,\n              'xmlns:metadata': mNs,\n              'xmlns:data': dNs,\n              ...feedAttrs,\n            },\n            ...(include('count') && typeof metadata.count === 'number'\n              ? { 'metadata:count': { _text: String(metadata.count) } }\n              : {}),\n            ...(linkNext ? { link: linkNext } : {}),\n            entry: (body as RespondEntityBody[]).map((item) => buildEntry(item, metadata)),\n          }) as any,\n        }\n\n        const xml = js2xml(feedDoc, { compact: true })\n        ctx.response.send(xml)\n        return\n      }\n\n      const entryDoc: ElementCompact = {\n        _declaration: { _attributes: { version: '1.0', encoding: 'utf-8' } },\n        ...(() => {\n          const entry = buildEntry(body, metadata)\n          return { entry }\n        })(),\n      }\n      const xml = js2xml(entryDoc, { compact: true })\n      ctx.response.send(xml)\n    }\n    const query = ctx.request.qs()\n\n    const requestedFormat =\n      typeof query['$format'] === 'string' ? query['$format'].trim() : undefined\n    if (requestedFormat && !requestedFormat.includes('json') && !requestedFormat.includes('xml')) {\n      throw new E_UNACCEPTABLE_FORMAT(requestedFormat)\n    }\n\n    // Validate Accept header per OData §7. Allow standard JSON/XML types plus\n    // vendor/structured suffixes (e.g. application/vnd.odata+json, application/*+json)\n    // to avoid rejecting legitimate non-Power-BI clients.\n    const accept = String(ctx.request.header('accept') || '').toLowerCase()\n    if (\n      accept &&\n      !accept.includes('*/*') &&\n      !accept.includes('application/json') &&\n      !accept.includes('application/xml') &&\n      !accept.includes('text/xml') &&\n      !accept.includes('+json') &&\n      !accept.includes('+xml')\n    ) {\n      throw new E_UNACCEPTABLE_FORMAT(accept)\n    }\n\n    const allowedSystemOptions = new Set([\n      '$top',\n      '$skip',\n      '$count',\n      '$orderby',\n      '$select',\n      '$filter',\n      '$expand',\n      '$format',\n      '$search',\n    ])\n    for (const key of Object.keys(query)) {\n      if (key.startsWith('$') && !allowedSystemOptions.has(key)) {\n        throw new Exception(`Unsupported OData system query option: ${key}`, {\n          status: 400,\n          code: 'E_ODATA_UNSUPPORTED_SYSTEM_QUERY_OPTION',\n        })\n      }\n    }\n\n    const { valid: rawSelections, isFullSet } = await sanitizeSelect(query, model, ctx, app)\n    const selections = Array.isArray(rawSelections) ? [...rawSelections] : rawSelections\n    const expansions = await sanitizeExpand(query)\n    if (Array.isArray(expansions) && expansions.length > 0) {\n      const readSchema = await model.$asOpenApiSchemaObject(ctx, app, 'read')\n      const possible =\n        !isObject(readSchema) || !('properties' in readSchema) || !isObject(readSchema.properties)\n          ? []\n          : Object.keys(readSchema.properties)\n      const possibleMap = new Map(possible.map((k) => [k.toLowerCase(), k]))\n      const relationshipMap = new Map(\n        Array.from(model.$resourcefulRelationships.keys()).map((k) => [k.toLowerCase(), k])\n      )\n\n      const unsupported: string[] = []\n      const resolvedExpansions: string[] = []\n      for (const expansion of expansions) {\n        const lcExpansion = expansion.toLowerCase()\n        const resolved = relationshipMap.get(lcExpansion) || possibleMap.get(lcExpansion)\n        if (!resolved) {\n          unsupported.push(expansion)\n          continue\n        }\n        resolvedExpansions.push(resolved)\n      }\n      if (unsupported.length > 0) {\n        throw new E_EXPAND_NOT_IMPLEMENTED(model.$resourcefulName, unsupported)\n      }\n      if (Array.isArray(selections)) {\n        for (const expansion of expansions) {\n          if (!selections.includes(expansion)) {\n            selections.push(expansion)\n          }\n        }\n        for (const expansion of resolvedExpansions) {\n          if (!selections.includes(expansion)) {\n            selections.push(expansion)\n          }\n        }\n      }\n    }\n    return {\n      model,\n      app,\n      prefix: this.#subpath,\n      serveAs,\n      method,\n      url,\n      resource: this.resolveUrlResource(ctx),\n      query,\n      selections,\n      isFullSet,\n      metadataLevel,\n      preference,\n      respond,\n    }\n  }\n\n  #parseInstanceUidFromResourceFragment(resource: string) {\n    const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n    // normalize subpath to start with a single \"/\" and have no trailing \"/\"\n    const sub = (() => {\n      let s = this.#subpath || ''\n      s = s.replace(/\\/{2,}/g, '/').replace(/\\/+$/, '')\n      if (!s.startsWith('/')) s = `/${s}`\n      return s\n    })()\n    // match: ^/<subpath>(<key>) then end or next segment\n    const pattern = new RegExp(`^${esc(sub)}\\\\(([^)]*)\\\\)(?:$|\\\\/)`)\n    const match = resource.match(pattern)\n    if (match && match[1] !== undefined) {\n      let v = match[1]\n      if ((v.startsWith(\"'\") && v.endsWith(\"'\")) || (v.startsWith('\"') && v.endsWith('\"'))) {\n        v = v.slice(1, -1)\n        if (v.includes(\"''\")) v = v.replace(/''/g, \"'\")\n      }\n      return v\n    }\n    return undefined\n  }\n\n  #parseInstanceUidAndRelationshipNameFromResourceFragment(\n    resource: string\n  ): ODataEntityUidAndRelationshipInformation {\n    const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n    // normalize subpath to start with a single \"/\" and have no trailing \"/\"\n    const sub = (() => {\n      let s = this.#subpath || ''\n      s = s.replace(/\\/{2,}/g, '/').replace(/\\/+$/, '')\n      if (!s.startsWith('/')) s = `/${s}`\n      return s\n    })()\n\n    // match: ^/<subpath>(<key>)/<relationship> with optional /$count\n    const pattern = new RegExp(`^${esc(sub)}\\\\(([^)]*)\\\\)\\\\/([^\\\\/]+)(?:\\\\/\\\\$count)?$`)\n    const match = resource.match(pattern)\n\n    if (match && match[1] !== undefined && match[2] !== undefined) {\n      // Extract and clean the UID\n      let uid = match[1]\n      if (\n        (uid.startsWith(\"'\") && uid.endsWith(\"'\")) ||\n        (uid.startsWith('\"') && uid.endsWith('\"'))\n      ) {\n        uid = uid.slice(1, -1)\n        if (uid.includes(\"''\")) uid = uid.replace(/''/g, \"'\")\n      }\n\n      // Extract relationship name\n      const relationship = match[2]\n\n      // Check if it's a count request\n      const isCountRequest = resource.endsWith('/$count')\n\n      return {\n        uid,\n        relationship,\n        isCountRequest,\n      }\n    }\n\n    // Return undefined values if pattern doesn't match\n    return {\n      uid: undefined,\n      relationship: undefined,\n      isCountRequest: false,\n    }\n  }\n\n  #parseODataMetadataIdFromResourceFragment(resource: string) {\n    while (resource.startsWith('/')) {\n      resource = resource.slice(1)\n    }\n    return resource\n  }\n\n  #makeSelectionSubsetForContextUrl(\n    selections: string[] | undefined,\n    isFullSet: boolean,\n    model: ResourcefulModel\n  ): string {\n    if (isFullSet) {\n      return ''\n    }\n    const props = [model.primaryKey]\n    if (Array.isArray(selections)) {\n      props.push(...selections.filter((s) => s !== model.primaryKey))\n    }\n    return `(${props.join(',')})`\n  }\n\n  #entityEtag(record: any): string | undefined {\n    if (!record || typeof record !== 'object') {\n      return undefined\n    }\n    const basis = record.updatedAt || record.createdAt || record.id\n    if (!basis) {\n      return undefined\n    }\n    return `W/\"${String(basis)}\"`\n  }\n\n  #normalizeEtag(value: string): string {\n    return value.trim().replace(/^W\\//i, '')\n  }\n\n  async #serveModelRead(ctx: HttpContext) {\n    console.log('ResourcefulModelController##serveModelRead')\n    const { resource, model, app, respond, selections, preference } =\n      await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulRead(\n      id,\n      ctx,\n      app,\n      this.#scopeRestrictors\n    )\n    const runner = this.#mutators.runner('read')\n    await runner.run(ret, ctx)\n    const metadataId = this.#parseODataMetadataIdFromResourceFragment(resource)\n    const etag = this.#entityEtag(ret)\n\n    const ifNoneMatch = ctx.request.header('if-none-match')\n    if (etag && typeof ifNoneMatch === 'string') {\n      const values = ifNoneMatch\n        .split(',')\n        .map((v) => v.trim())\n        .filter((v) => v.length > 0)\n      const current = this.#normalizeEtag(etag)\n      const matched = values.some((v) => v === '*' || this.#normalizeEtag(v) === current)\n      if (matched) {\n        return respond({\n          status: 304,\n          body: undefined,\n          metadata: {\n            context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n            etag,\n          },\n        })\n      }\n    }\n\n    const metadata: ODataMetadata = {\n      context: await this.getODataContextUrl(\n        `${this.#subpath}${this.#makeSelectionSubsetForContextUrl(selections, 'undefined' === typeof selections, model)}/$entity`\n      ),\n      id: await this.resolveFullUrl(metadataId),\n      readLink: metadataId,\n      editLink: metadataId,\n      etag,\n    }\n    return respond({\n      status: 200,\n      body: santizeResponsePayload(ret, selections, preference),\n      metadata,\n      model,\n      isArray: false,\n    })\n  }\n\n  async #serveModelUpdate(ctx: HttpContext) {\n    const { resource, model, app, respond, selections, preference } =\n      await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const schema = await this.#getWriteValidationSchema(ctx, model, app, true)\n    const { error, value: validated } = schema.validate(\n      stripUndefinedValuesFromObject({\n        ...ctx.request.all(),\n        [model.primaryKey]: undefined,\n      }),\n      {\n        abortEarly: false,\n        convert: true,\n      }\n    )\n    if (error) {\n      throw normalizeError(error)\n    }\n    try {\n      const existing = await model.$onResourcefulRead(id, ctx, app, this.#scopeRestrictors)\n      const existingEtag = this.#entityEtag(existing)\n      const ifMatch = ctx.request.header('if-match')\n      if (existingEtag && typeof ifMatch === 'string' && ifMatch.trim() !== '*') {\n        const requested = ifMatch\n          .split(',')\n          .map((v) => v.trim())\n          .filter((v) => v.length > 0)\n        const current = this.#normalizeEtag(existingEtag)\n        const matched = requested.some((v) => this.#normalizeEtag(v) === current)\n        if (!matched) {\n          return respond({\n            status: 412,\n            body: {\n              error: {\n                code: 'E_PRECONDITION_FAILED',\n                message: 'If-Match precondition failed',\n              },\n            },\n            metadata: {\n              context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n              etag: existingEtag,\n            },\n          })\n        }\n      }\n\n      const ret: ResourceResourcefulRecordResponse<typeof model> = await model.$onResourcefulUpdate(\n        id,\n        validated,\n        ctx,\n        app,\n        {\n          queryScopeCallbacks: this.#scopeRestrictors,\n          payloadValidationSchemas: this.#payloadRestrictors,\n        }\n      )\n      const runner = this.#mutators.runner('update')\n      await runner.run(ret, ctx)\n      const metadataId = this.#parseODataMetadataIdFromResourceFragment(resource)\n      const metadata: ODataMetadata = {\n        context: await this.getODataContextUrl(\n          `${this.#subpath}${this.#makeSelectionSubsetForContextUrl(selections, 'undefined' === typeof selections, model)}/$entity`\n        ),\n        id: await this.resolveFullUrl(metadataId),\n        readLink: metadataId,\n        editLink: metadataId,\n        etag: this.#entityEtag(ret),\n      }\n      if (preference === 'minimal') {\n        return respond({\n          status: 204,\n          body: undefined,\n          metadata,\n          headers: { 'Preference-Applied': 'return=minimal' },\n        })\n      }\n      return respond({\n        status: 200,\n        body: santizeResponsePayload(ret, selections, preference),\n        metadata,\n        model,\n        isArray: false,\n        headers: { 'Preference-Applied': 'return=representation' },\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #serveModelDelete(ctx: HttpContext) {\n    const { resource, model, app, respond } = await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    try {\n      await model.$onResourcefulDelete(id, ctx, app, this.#scopeRestrictors)\n      return respond({\n        status: 204,\n        body: undefined,\n        metadata: {\n          context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n        },\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #serveModelCreate(ctx: HttpContext) {\n    const { model, app, respond, preference, selections } =\n      await this.resolveRequestRequirements(ctx)\n    const schema = await this.#getWriteValidationSchema(ctx, model, app)\n    const { error, value: validated } = schema.validate(ctx.request.all(), {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    try {\n      const ret: any = await model.$onResourcefulCreate(\n        validated,\n        ctx,\n        app,\n        this.#payloadRestrictors\n      )\n      const runner = this.#mutators.runner('create')\n      await runner.run(ret, ctx)\n      const resource = `/${this.#subpath}(${encodeURIComponent(String(ret[model.primaryKey]))})`\n      const metadataId = this.#parseODataMetadataIdFromResourceFragment(resource)\n      const metadata: ODataMetadata = {\n        context: await this.getODataContextUrl(`${this.#subpath}/$entity`),\n        id: await this.resolveFullUrl(metadataId),\n        readLink: metadataId,\n        editLink: metadataId,\n      }\n      return respond({\n        status: 201,\n        body: santizeResponsePayload(ret, selections, preference),\n        metadata,\n        model,\n        isArray: false,\n        headers: { Location: String(metadata.id!) },\n      })\n    } catch (e) {\n      throw normalizeError(e)\n    }\n  }\n\n  async #serveModelReadRelated(ctx: HttpContext) {\n    const { resource, model, app, respond, preference, query } =\n      await this.resolveRequestRequirements(ctx)\n\n    let { uid, relationship, isCountRequest } =\n      this.#parseInstanceUidAndRelationshipNameFromResourceFragment(resource)\n\n    // Fallback parser for property raw-value endpoints: /EntitySet(id)/property/$value\n    // Supports numeric ids, GUIDs, and single-quoted string keys per OData URL conventions.\n    if (!uid || !relationship) {\n      const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n      const sub = (() => {\n        let s = this.#subpath || ''\n        s = s.replace(/\\/{2,}/g, '/').replace(/\\/+$/, '')\n        if (!s.startsWith('/')) s = `/${s}`\n        return s\n      })()\n      // Match keys in parentheses: numeric (123), GUID (xxx-xxx), or single-quoted strings ('foo')\n      const valueMatch = resource.match(\n        new RegExp(`^${esc(sub)}\\\\(([^)]*(?:'[^']*'[^)]*)?)\\\\)\\\\/([^\\\\/]+)\\\\/\\\\$value$`)\n      )\n      if (valueMatch && valueMatch[1] && valueMatch[2]) {\n        uid = valueMatch[1]\n        relationship = valueMatch[2]\n        isCountRequest = false\n      }\n    }\n\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n\n    // Resolve uid: strip single-quotes for string keys, parse numeric keys.\n    // Supports numeric ids, GUIDs, and single-quoted string keys per OData URL conventions.\n    let resolvedId: string | number\n    const strippedUid = uid.startsWith(\"'\") && uid.endsWith(\"'\") ? uid.slice(1, -1) : uid\n    if (/^-?\\d+$/.test(strippedUid)) {\n      const numId = Number(strippedUid)\n      if (!Number.isSafeInteger(numId)) {\n        throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n      }\n      resolvedId = numId\n    } else if (strippedUid.length > 0) {\n      // String or GUID key — pass through as-is\n      resolvedId = strippedUid\n    } else {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n\n    if (!relationship) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n\n    // Support primitive property raw value requests such as /Users(1)/username/$value.\n    const valueSuffix = `${relationship}/$value`\n    if (\n      resource.endsWith(`/${valueSuffix}`) &&\n      !model.$resourcefulRelationships.has(relationship)\n    ) {\n      let record: Record<string, unknown>\n      try {\n        record = (await model.$onResourcefulRead(\n          resolvedId as any,\n          ctx,\n          app,\n          this.#scopeRestrictors\n        )) as Record<string, unknown>\n      } catch {\n        // Key type mismatch or not found — surface as 404, not 500.\n        throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n      }\n      if (!(relationship in record)) {\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n      }\n      const value = record[relationship]\n      ctx.response.header('Content-Type', 'text/plain; charset=utf-8')\n      return ctx.response.status(200).send(value === null ? '' : String(value))\n    }\n\n    const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(relationship)\n    if (!resourcefulRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const lucidRelationshipDefinition = model.$getRelation(relationship)\n    if (!lucidRelationshipDefinition) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const relatedModel = resourcefulRelationshipDefinition.relatedModel()\n    if (!isResourcefulModel(relatedModel)) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const { valid: selections, isFullSet } = await sanitizeSelect(query, relatedModel, ctx, app)\n    const { filter, page, perPage, fields, sort, hooks, showCountMeta } =\n      this.#parseResourcefulIndexArguments(query, selections, resource, relatedModel)\n    const response = await model.$onResourcefulReadRelationship(\n      resolvedId as any,\n      relationship,\n      filter,\n      page,\n      perPage,\n      fields,\n      sort,\n      ctx,\n      app,\n      hooks\n    )\n    if (isCountRequest) {\n      return respond({\n        status: 200,\n        body: response.total,\n        metadata: {\n          context: '', // required for shape of ODataMetadata but not used in $count responses\n        },\n        raw: true,\n      })\n    }\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('readRelated')\n    await runner.run(ret, ctx)\n    const metadata: ODataMetadata = stripUndefinedValuesFromObject({\n      context: await this.getODataContextUrl(\n        `Collection(Default.${relatedModel.$resourcefulName})${this.#makeSelectionSubsetForContextUrl(selections, isFullSet, relatedModel)}`\n      ),\n      count: showCountMeta && !isCountRequest ? ret.total : undefined,\n      nextLink: this.#computeODataNextLink(ret.page, ret.perPage, ret.total, query, ctx),\n    })\n    return respond({\n      status: 200,\n      body: santizeResponsePayload(ret.records, selections, preference),\n      metadata,\n      model: relatedModel,\n      isArray: true,\n    })\n  }\n\n  #parseRelationshipFromSyncRelatedResourceFragment(resource: string, model: ResourcefulModel) {\n    const startOfActionName = resource.lastIndexOf('/Default.Sync')\n    if (startOfActionName === -1) {\n      return undefined\n    }\n    const resourceAction = resource.slice(startOfActionName + 1)\n    const toStrip = `Default.Sync${string.pascalCase([this.#subpath, 'related'].join(' '))}`\n    let relationshipName = resourceAction.replace(toStrip, '')\n    if (relationshipName.startsWith('/')) {\n      relationshipName = relationshipName.slice(1)\n    }\n    if (relationshipName.endsWith('/$ref')) {\n      relationshipName = relationshipName.slice(0, -5)\n    }\n    if (relationshipName.endsWith('/')) {\n      relationshipName = relationshipName.slice(0, -1)\n    }\n    if (!relationshipName) {\n      return undefined\n    }\n    const candidates = [relationshipName, string.camelCase(relationshipName)]\n    for (const candidate of candidates) {\n      const resourcefulRelationshipDefinition = model.$resourcefulRelationships.get(candidate)\n      if (!resourcefulRelationshipDefinition) {\n        continue\n      }\n      const lucidRelationshipDefinition = model.$getRelation(candidate)\n      if (!lucidRelationshipDefinition) {\n        continue\n      }\n      const relatedModel = resourcefulRelationshipDefinition.relatedModel()\n      if (!isResourcefulModel(relatedModel)) {\n        continue\n      }\n      return {\n        relationship: candidate,\n        relatedModel,\n        resourcefulRelationshipDefinition,\n        lucidRelationshipDefinition,\n      }\n    }\n    return undefined\n  }\n\n  async #serveModelSyncRelated(ctx: HttpContext) {\n    const { resource, model, respond } = await this.resolveRequestRequirements(ctx)\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const relInfo = this.#parseRelationshipFromSyncRelatedResourceFragment(resource, model)\n    if (!isObject(relInfo)) {\n      throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n    }\n    const { relationship, lucidRelationshipDefinition, relatedModel } = relInfo\n    switch (lucidRelationshipDefinition.type) {\n      case 'hasOne':\n      case 'belongsTo':\n        throw new E_RELATIONSHIP_NOT_FOUND_EXCEPTION()\n      case 'hasManyThrough':\n        throw new E_UNSYNCABLE_RELATIONSHIP_EXCEPTION()\n    }\n    const { error, value } = modelRelationshipSyncPayloadSchema.validate(ctx.request.all(), {\n      abortEarly: false,\n      convert: true,\n    })\n    if (error) {\n      throw normalizeError(error)\n    }\n    const instance = await model.query().where(model.primaryKey, id).first()\n    if (!instance) {\n      throw new E_RECORD_NOT_FOUND_EXCEPTION()\n    }\n    const idsToInclude = value.ruids.map((ruid) => Number(ruid)) as number[]\n    if (lucidRelationshipDefinition.type === 'manyToMany') {\n      try {\n        // @ts-ignore\n        await instance.related(relationship).sync(idsToInclude)\n      } catch (e) {\n        throw normalizeError(e)\n      }\n    }\n    if (lucidRelationshipDefinition.type === 'hasMany') {\n      // in order to ensure that model hooks are run, we will load the relevant related models which need to be synced\n      // and then update them one by one\n      const foreignKey = (lucidRelationshipDefinition as any).options.foreignKey\n      if (!foreignKey) {\n        throw new E_INVALID_RELATIONSHIP_EXCEPTION(\n          `HasMany relationship '${relationship}' missing foreignKey`\n        )\n      }\n      const [relatedModelInstancesEnclude, relatedModelInstancesToInclude] = await Promise.all([\n        // @ts-ignore\n        instance.related(relationship).query().whereNotIn(relatedModel.primaryKey, idsToInclude),\n        // @ts-ignore\n        relatedModel.query().whereIn(relatedModel.primaryKey, idsToInclude),\n      ])\n      const relatedModelInstancesEncludeResults = await pMap(\n        relatedModelInstancesEnclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: null,\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesEncludeResultsErr = relatedModelInstancesEncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesEncludeResultsErr.length > 0) {\n        throw relatedModelInstancesEncludeResultsErr[0]\n      }\n      const relatedModelInstancesToIncludeResults = await pMap(\n        relatedModelInstancesToInclude as InstanceType<typeof relatedModel>[],\n        async (relatedInstance) => {\n          relatedInstance.merge({\n            [foreignKey]: instance.$getAttribute(model.primaryKey),\n          })\n          try {\n            await relatedInstance.save()\n          } catch (e) {\n            return e\n          }\n        },\n        { concurrency: 1, stopOnError: false }\n      )\n      const relatedModelInstancesToIncludeResultsErr = relatedModelInstancesToIncludeResults.filter(\n        (result) => 'undefined' !== typeof result\n      )\n      if (relatedModelInstancesToIncludeResultsErr.length > 0) {\n        throw relatedModelInstancesToIncludeResultsErr[0]\n      }\n    }\n    return respond({\n      status: 204,\n      body: undefined,\n      metadata: {\n        context: '', // required for shape of ODataMetadata but not used in sync responses\n      },\n    })\n  }\n\n  async #cacheOperations() {\n    if (\n      this.#operations.size > 0 ||\n      !isObject(this.#options.additional) ||\n      Object.keys(this.#options.additional).length === 0\n    )\n      return\n    const model = await this.#model\n    if (model instanceof E_UNRESOLVABLE_MODEL) {\n      return\n    }\n    if (isObject(this.#options.additional)) {\n      Object.entries(this.#options.additional).forEach(([methodAndPath, callback]) => {\n        const [method, path] = methodAndPath.split('|')\n        if (!method || !path) return\n        const opName = makeOpName(method, model.$resourcefulName, path)\n        this.#operations.set(opName, callback)\n      })\n    }\n  }\n\n  #parseOperationNameFromResourceFragment(resource: string) {\n    const pattern = /\\/Default\\.([^.\\/(]+)/\n    const match = resource.match(pattern)\n    if (match && match[1] !== undefined) {\n      return match[1]\n    }\n    return undefined\n  }\n\n  #getMutatedContext(ctx: HttpContext, params: Record<string, any>) {\n    const mutated: HttpContext = Object.create(ctx)\n    mutated.params = Object.freeze(params)\n    return Object.freeze(mutated)\n  }\n\n  async #processOperation(callback: RouteCallback, ctx: HttpContext) {\n    let next: ((ctx: HttpContext) => unknown | PromiseLike<unknown> | Promise<unknown>) | undefined\n    if (typeof callback === 'function') {\n      next = async (c) => await callback(c)\n    } else if (Array.isArray(callback) && callback.length === 2) {\n      const [maybeResolvableController, method] = callback\n      if (\n        method in maybeResolvableController &&\n        typeof maybeResolvableController[method] === 'function'\n      ) {\n        // @ts-ignore\n        next = async (c) => await maybeResolvableController[method](c)\n      } else {\n        // @ts-ignore\n        const resolvedController = maybeResolvableController()\n        if (typeof resolvedController[method] === 'function') {\n          next = async (c) => await resolvedController[method](c)\n        }\n      }\n    }\n    if (!next) return\n    await next(ctx)\n  }\n\n  async #processCallbackOrAdditionalResourcefulRouteDetails(\n    callback: RouteCallback | AdditionalResourcefulRouteDetails,\n    ctx: HttpContext\n  ) {\n    if (isAdditionalResourcefulRouteDetails(callback)) {\n      await this.#processOperation(callback.handler, ctx)\n    } else {\n      await this.#processOperation(callback, ctx)\n    }\n  }\n\n  async #serveModelFunction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, {})\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  async #serveModelAction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, {})\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  async #serveModelInstanceFunction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, { uid: id })\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  async #serveModelInstanceAction(ctx: HttpContext) {\n    const { resource } = await this.resolveRequestRequirements(ctx)\n    await this.#cacheOperations()\n    const opName = this.#parseOperationNameFromResourceFragment(resource)\n    if (!opName) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const callback = this.#operations.get(opName)\n    if ('undefined' === typeof callback) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const uid = this.#parseInstanceUidFromResourceFragment(resource)\n    if (!uid) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    if (!uid || !/^-?\\d+$/.test(uid)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const id = Number(uid)\n    if (!Number.isSafeInteger(id)) {\n      throw new E_ROUTE_NOT_FOUND([ctx.request.method(), ctx.request.url()])\n    }\n    const mutatedCtx = this.#getMutatedContext(ctx, { uid: id })\n    await this.#processCallbackOrAdditionalResourcefulRouteDetails(callback, mutatedCtx)\n  }\n\n  #getPageAndPerPageFromTopAndSkip(query: Record<string, any>, isCountRequest: boolean) {\n    if (isCountRequest) {\n      return { page: 1, perPage: 1 }\n    }\n    const rawTop = isStringContent(query['$top']) ? query['$top'].trim() : '10'\n    const rawSkip = isStringContent(query['$skip']) ? query['$skip'].trim() : '0'\n    const parsedTop = Number.parseInt(rawTop, 10)\n    const parsedSkip = Number.parseInt(rawSkip, 10)\n    const top = Number.isSafeInteger(parsedTop) && parsedTop > 0 ? parsedTop : 10\n    const skip = Number.isSafeInteger(parsedSkip) && parsedSkip >= 0 ? parsedSkip : 0\n    const page = Math.floor(skip / top) + 1\n    const perPage = top > 100 ? 100 : top\n    return { page, perPage }\n  }\n\n  #getSortFromOrderBy($order: string | undefined) {\n    const ret: [string, 'asc' | 'desc'][] = []\n    if ('undefined' === typeof $order || !isStringContent($order)) {\n      return ret\n    }\n    const fragments = $order.split(',')\n    fragments.forEach((fragment) => {\n      const [field, dir] = fragment\n        .trim()\n        .split(/\\s+/)\n        .map((s) => s.trim()) as [string, string | undefined]\n      ret.push([field, dir === 'desc' ? 'desc' : 'asc'])\n    })\n    return ret\n  }\n\n  #getDialectFromModel(model: ResourcefulModel): Dialect {\n    const adapter = model.$adapter\n    const client = adapter.modelConstructorClient(model)\n    const clientDialect = client.dialect.name\n    switch (clientDialect) {\n      case 'postgres':\n      case 'redshift':\n        return 'postgres'\n      case 'mysql':\n        return 'mysql'\n      case 'sqlite3':\n      case 'better-sqlite3':\n        return 'sqlite'\n      case 'mssql':\n      case 'oracledb':\n      case 'libsql':\n      default:\n        throw new E_UNSUPPORTED_DATABASE_DIALECT(clientDialect || 'unknown')\n    }\n  }\n\n  #parseResourcefulIndexArguments(\n    query: Record<string, any>,\n    selections: string[] | undefined,\n    resource: string,\n    model: ResourcefulModel\n  ) {\n    console.log('ResourcefulModelController##parseResourcefulIndexArguments')\n    const isCountRequest = resource.endsWith('/$count')\n    const showCountMeta = '$count' in query && query['$count'] === 'true'\n    if (isStringContent(query['$search'])) {\n      throw new Exception('$search is not implemented for this OData endpoint', {\n        status: 501,\n        code: 'E_ODATA_SEARCH_NOT_IMPLEMENTED',\n      })\n    }\n\n    const filter: string | undefined = undefined\n    const { page, perPage } = this.#getPageAndPerPageFromTopAndSkip(query, isCountRequest)\n    const sort = this.#getSortFromOrderBy(query['$orderby'])\n    const aliases: Map<string, string> = new Map()\n    const keyToColumn: Map<string, string> = new Map()\n    Object.entries(query).forEach(([k, v]) => {\n      if (isStringContent(k) && k.startsWith('@')) {\n        aliases.set(k, isStringContent(v) ? v.trim() : '')\n      }\n    })\n    Object.entries(model.$keys.serializedToColumns.all()).forEach(([key, col]) => {\n      keyToColumn.set(key, col)\n    })\n    const dialect = this.#getDialectFromModel(model)\n    const $filter = isStringContent(query['$filter']) ? query['$filter'].trim() : ''\n    const hooks = [\n      ...this.#scopeRestrictors,\n      ODataToLucidTranslator.toHook($filter, aliases, keyToColumn, dialect),\n    ]\n    return {\n      filter,\n      page,\n      perPage,\n      fields: selections,\n      sort,\n      hooks,\n      showCountMeta,\n      isCountRequest,\n    }\n  }\n\n  #computeODataNextLink(\n    currentPage: number,\n    perPage: number,\n    totalItems: number,\n    query: Record<string, any>,\n    ctx: HttpContext\n  ): string | undefined {\n    const possiblyServedCount = currentPage * perPage\n    const servedCount = possiblyServedCount > totalItems ? totalItems : possiblyServedCount\n    if (servedCount >= totalItems) {\n      return undefined\n    }\n    const updatedQuery = { ...query }\n    updatedQuery['$top'] = String(perPage)\n    updatedQuery['$skip'] = String(servedCount)\n    const absUrl = ctx.request.completeUrl(false)\n    return [absUrl, qs.stringify(updatedQuery, { addQueryPrefix: true })].join('')\n  }\n\n  async #serveModelIndex(ctx: HttpContext) {\n    console.log('ResourcefulModelController##serveModelIndex')\n    const { model, app, respond, selections, isFullSet, preference, query, resource } =\n      await this.resolveRequestRequirements(ctx)\n\n    // Avoid passing relationship names into the underlying index fields selection.\n    const relationshipNames = new Set(\n      Array.from(model.$resourcefulRelationships.keys()).map((k) => k.toLowerCase())\n    )\n    const safeSelections = Array.isArray(selections)\n      ? selections.filter((k) => !relationshipNames.has(String(k).toLowerCase()))\n      : selections\n\n    const { filter, page, perPage, fields, sort, hooks, showCountMeta, isCountRequest } =\n      this.#parseResourcefulIndexArguments(query, safeSelections, resource, model)\n    const response = await model.$onResourcefulIndex(\n      filter,\n      page,\n      perPage,\n      fields,\n      sort,\n      ctx,\n      app,\n      hooks\n    )\n\n    console.log(`ResourcefulModelController#serveModelIndex - Response:`)\n    console.log(response)\n\n    if (isCountRequest) {\n      return respond({\n        status: 200,\n        body: response.total,\n        metadata: {\n          context: '', // required for shape of ODataMetadata but not used in $count responses\n        },\n        raw: true,\n      })\n    }\n    const ret: ResourcefulIndexResponse = {\n      records: response.records,\n      total: response.total,\n      page: response.page,\n      perPage: response.perPage,\n      aggregations: response.aggregations,\n    }\n    const runner = this.#mutators.runner('index')\n    await runner.run(ret, ctx)\n\n    // Handle $expand for index responses by loading related records per returned entity.\n    // NOTE: This issues one DB query per (expansion × record). To prevent runaway load,\n    // hydration is capped at ODATA_EXPAND_MAX_RECORDS (default 100). If the result set\n    // exceeds this cap and $expand is requested, only the first N records are returned\n    // and metadata (count, nextLink) is adjusted to reflect the truncated page.\n    const ODATA_EXPAND_MAX_RECORDS = 100\n    const expansions = sanitizeExpand(query)\n    let expandTruncated = false\n    if (Array.isArray(expansions) && expansions.length > 0) {\n      // Truncate records to the expand cap to guarantee consistent shape.\n      if (ret.records.length > ODATA_EXPAND_MAX_RECORDS) {\n        ret.records = ret.records.slice(0, ODATA_EXPAND_MAX_RECORDS)\n        expandTruncated = true\n      }\n      const relationshipMap = new Map(\n        Array.from(model.$resourcefulRelationships.keys()).map((k) => [k.toLowerCase(), k])\n      )\n      const resolved: string[] = []\n      for (const e of expansions) {\n        const r = relationshipMap.get(String(e).toLowerCase())\n        if (r) resolved.push(r)\n      }\n      if (resolved.length > 0) {\n        for (const originalExp of expansions) {\n          const rel = relationshipMap.get(String(originalExp).toLowerCase())\n          if (!rel) continue\n          for (const record of ret.records) {\n            try {\n              const relResp = await model.$onResourcefulReadRelationship(\n                Number(record[model.primaryKey]),\n                rel,\n                undefined,\n                1,\n                1000,\n                undefined,\n                undefined,\n                ctx,\n                app,\n                []\n              )\n              // Attach under the original expansion token (preserve requested casing).\n              record[originalExp] = Array.isArray(relResp && (relResp as any).records)\n                ? (relResp as any).records\n                : []\n            } catch (e) {\n              record[originalExp] = []\n            }\n          }\n        }\n      }\n    }\n\n    // When $expand truncated the result set, compute a nextLink so the client\n    // knows to fetch the remaining records. Use the truncated count as the\n    // effective page size for metadata purposes.\n    const effectivePerPage = expandTruncated ? ODATA_EXPAND_MAX_RECORDS : ret.perPage\n    const effectivePage = expandTruncated ? 1 : ret.page\n    const metadata: ODataMetadata = stripUndefinedValuesFromObject({\n      context: await this.getODataContextUrl(\n        `${this.#subpath}${this.#makeSelectionSubsetForContextUrl(selections, isFullSet, model)}`\n      ),\n      count: showCountMeta && !isCountRequest ? ret.total : undefined,\n      nextLink: this.#computeODataNextLink(effectivePage, effectivePerPage, ret.total, query, ctx),\n    })\n    return respond({\n      status: 200,\n      body: santizeResponsePayload(ret.records, selections, preference),\n      metadata,\n      model,\n      isArray: true,\n    })\n  }\n\n  async #applyMiddlewares(ctx: HttpContext, next: (ctx: HttpContext) => Promise<void>) {\n    const middleware = new Middleware<MiddlewareFn>()\n    if (this.#options.middleware) {\n      if (Array.isArray(this.#options.middleware)) {\n        this.#options.middleware.forEach((m) => middleware.add(m))\n      } else if (isObject(this.#options.middleware) && 'handle' in this.#options.middleware) {\n        middleware.add(this.#options.middleware.handle as MiddlewareFn)\n      } else if (typeof this.#options.middleware === 'function') {\n        middleware.add(this.#options.middleware as MiddlewareFn)\n      }\n    }\n    middleware.add(async (c) => {\n      await next(c)\n    })\n    return await middleware.runner().run(async (fn, nxt) => fn(ctx, nxt))\n  }\n\n  async serveModelRead(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelRead.bind(this, ctx))\n  }\n  async serveModelUpdate(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelUpdate.bind(this, ctx))\n  }\n  async serveModelDelete(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelDelete.bind(this, ctx))\n  }\n  async serveModelCreate(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelCreate.bind(this, ctx))\n  }\n  async serveModelReadRelated(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelReadRelated.bind(this, ctx))\n  }\n  async serveModelSyncRelated(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelSyncRelated.bind(this, ctx))\n  }\n  async serveModelFunction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelFunction.bind(this, ctx))\n  }\n  async serveModelAction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelAction.bind(this, ctx))\n  }\n  async serveModelInstanceFunction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelInstanceFunction.bind(this, ctx))\n  }\n  async serveModelInstanceAction(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelInstanceAction.bind(this, ctx))\n  }\n  async serveModelIndex(ctx: HttpContext) {\n    return await this.#applyMiddlewares(ctx, this.#serveModelIndex.bind(this, ctx))\n  }\n}\n","import { Exception } from '@poppinss/utils'\nimport { isSimpleIdentifier } from './utils/odata'\nimport { ODataContext } from './services/odata_context_service'\nimport { negotiateContent, negotiateMetadata } from './utils/http'\nimport { useODataContext } from '@nhtio/lucid-resourceful/odata/context'\nimport { ODataErrorMiddleware } from './middlewares/odata_error_middleware'\nimport { ODataMetadataService, makeOpName } from './services/odata_metadata_service'\nimport { ResourcefulModelController } from './controllers/resourceful_model_controller'\nimport { isAdditionalResourcefulRouteDetails } from '../router_macro/utils/type_guards'\nimport { ResourcefulHttpContext } from '../router_macro/services/resourceful_router_context_service'\nimport { ResourcefulRouterOptionsService } from '../router_macro/services/resourceful_router_options_service'\nimport { ResourcefulRouterModelResolverService } from '../router_macro/services/resourceful_router_model_resolver_service'\nimport { ResourcefulRouterModelServiceOptionsService } from '../router_macro/services/resourceful_router_model_options_service'\nimport {\n  E_ROUTE_NOT_FOUND,\n  E_UNRESOLVABLE_MODEL,\n  E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE,\n  //   E_INVALID_HTTP_METHOD_EXCEPTION,\n  E_UNACCEPTABLE_FORMAT,\n  E_INVALID_ENTITYSET_IDENTIFIERS,\n} from '@nhtio/lucid-resourceful/errors'\nimport type { ResourcefulHttpVerb } from '@nhtio/lucid-resourceful/types'\nimport type { HttpContext, Router, RouteGroup } from '@adonisjs/core/http'\nimport type { ODataResponseFormat, ODataMetadataLevel } from './utils/http'\nimport type { MacroModelsMap, ResourcefulRouterOptions, RouteCallback } from '../router_macro/types'\nimport type { ResourcefulHttpContextResolver } from '../router_macro/services/resourceful_router_context_service'\nimport type {\n  ResourcefulODataContextResolver,\n  ResolvedODataContext,\n} from './services/odata_context_service'\n\ntype ODataRouteCallback = (ctx: HttpContext) => Promise<void> | void\n\nclass ODataRouterService {\n  readonly #router: Router\n  readonly #rawModelMap: MacroModelsMap\n  readonly #options?: Partial<ResourcefulRouterOptions>\n  readonly #opts: ResourcefulRouterOptionsService\n  readonly #modelMap: ResourcefulRouterModelResolverService\n  readonly #controllers: Map<string, ResourcefulModelController>\n  readonly #group: RouteGroup\n  readonly #routes: Map<ResourcefulHttpVerb, Map<string | RegExp, ODataRouteCallback>>\n\n  /** @private */\n  constructor(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ) {\n    this.#router = router\n    this.#rawModelMap = rawModelMap\n    this.#options = options\n    this.#controllers = new Map<string, ResourcefulModelController>()\n    this.#opts = ResourcefulRouterOptionsService.init(this.#options)\n    this.#modelMap = ResourcefulRouterModelResolverService.init(this.#rawModelMap)\n    const unresolvableModels: E_UNRESOLVABLE_MODEL[] = []\n    const invalidEntitySetNames: Set<string> = new Set<string>()\n    Object.getOwnPropertyNames(this.#modelMap).forEach((name) => {\n      const promiseOrError = this.#modelMap[name]\n      if (!isSimpleIdentifier(name)) {\n        invalidEntitySetNames.add(name)\n        return\n      }\n      if (promiseOrError instanceof E_UNRESOLVABLE_MODEL) {\n        unresolvableModels.push(promiseOrError)\n      } else if ('undefined' !== typeof promiseOrError) {\n        const modelOptions = ResourcefulRouterModelServiceOptionsService.init(\n          this.#rawModelMap[name as any]\n        )\n        const controller = new ResourcefulModelController(\n          name,\n          promiseOrError,\n          modelOptions,\n          this.#opts.headers,\n          this.#opts.scopeRestrictors,\n          this.#opts.payloadRestrictors,\n          this.#opts.mutators,\n          this.#opts.policies\n        )\n        this.#controllers.set(name, controller)\n      }\n    })\n    if (unresolvableModels.length > 0) {\n      throw new E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE(unresolvableModels)\n    }\n    if (invalidEntitySetNames.size > 0) {\n      throw new E_INVALID_ENTITYSET_IDENTIFIERS(invalidEntitySetNames)\n    }\n    this.#group = this.#router.group(this.#groupCallback.bind(this))\n    if (this.#opts.prefix !== '/') {\n      this.#group.prefix(this.#opts.prefix)\n    }\n    if (Array.isArray(this.#opts.middleware) && this.#opts.middleware.length > 0) {\n      this.#group.use(Array.from(this.#opts.middleware))\n    } else if (!Array.isArray(this.#opts.middleware) && this.#opts.middleware) {\n      this.#group.use(this.#opts.middleware as any)\n    }\n    if ('string' === typeof this.#opts.domain && this.#opts.domain.length > 0) {\n      this.#group.domain(this.#opts.domain)\n    }\n    this.#routes = new Map<ResourcefulHttpVerb, Map<string | RegExp, ODataRouteCallback>>()\n    this.#initRoutes()\n  }\n\n  #initRoutes() {\n    const getRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const postRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const putRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const patchRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    const deleteRoutes = new Map<string | RegExp, ODataRouteCallback>()\n    Array.from(this.#controllers.entries())\n      .sort((a, b) => {\n        if (a[0].length === b[0].length) {\n          return a[0].localeCompare(b[0])\n        }\n        return b[0].length - a[0].length\n      })\n      .forEach(([name, controller]) => {\n        const currentControllerCan = (op: ResourcefulRouterOptions['except'][number]) => {\n          return !this.#opts.except.includes(op) && !controller.options.except.includes(op)\n        }\n        if (currentControllerCan('index')) {\n          const pattern = new RegExp(`^\\/${name}\\/?(?:\\\\$\\\\w+)*$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelIndex.bind(controller)\n          )\n          getRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n          getRoutes.set(\n            `/${name}/$count`,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('create')) {\n          const pattern = `/${name}`\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelCreate.bind(controller)\n          )\n          postRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('read')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelRead.bind(controller)\n          )\n          getRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('readRelated')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)\\/\\\\w{1,128}\\/?(?:\\\\$\\\\w+)*$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelReadRelated.bind(controller)\n          )\n          getRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('syncRelated')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)\\/Default\\\\.Sync(?:\\\\w+)+$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelSyncRelated.bind(controller)\n          )\n          postRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('update')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelUpdate.bind(controller)\n          )\n          postRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n          putRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n          patchRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        if (currentControllerCan('delete')) {\n          const pattern = new RegExp(`^\\/${name}\\\\(([^)]+)\\\\)$`)\n          const callback = this.#processOdataRequest.bind(\n            this,\n            controller.serveModelDelete.bind(controller)\n          )\n          deleteRoutes.set(\n            pattern,\n            this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n          )\n        }\n        Object.entries(controller.options.additional).forEach(([methodAndPath]) => {\n          const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n          if (!method || !path) return\n          const opKind = ['post', 'patch', 'put', 'delete'].includes(method) ? 'action' : 'function'\n          const boundToInstance = path.includes(':uid\\/')\n          const pattern = boundToInstance\n            ? opKind === 'action'\n              ? new RegExp(\n                  `^\\/${name}\\\\(([^)]+)\\\\)\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+$`\n                )\n              : new RegExp(\n                  `^\\/${name}\\\\(([^)]+)\\\\)\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+\\\\(\\\\)$`\n                )\n            : opKind === 'action'\n              ? new RegExp(`^\\/${name}\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+$`)\n              : new RegExp(`^\\/${name}\\/Default\\\\.(Get|Post|Put|Patch|Delete)[a-zA-Z0-9_]+\\\\(\\\\)$`)\n          const callback = boundToInstance\n            ? 'action' === opKind\n              ? this.#processOdataRequest.bind(\n                  this,\n                  controller.serveModelInstanceAction.bind(controller)\n                )\n              : this.#processOdataRequest.bind(\n                  this,\n                  controller.serveModelInstanceFunction.bind(controller)\n                )\n            : 'action' === opKind\n              ? this.#processOdataRequest.bind(this, controller.serveModelAction.bind(controller))\n              : this.#processOdataRequest.bind(this, controller.serveModelFunction.bind(controller))\n          switch (opKind) {\n            case 'action':\n              postRoutes.set(\n                pattern,\n                this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n              )\n              break\n            case 'function':\n              getRoutes.set(\n                pattern,\n                this.#serveInResourcefulModelRouterContext.bind(this, controller, callback)\n              )\n              break\n          }\n        })\n      })\n    this.#routes.set('get', getRoutes)\n    this.#routes.set('post', postRoutes)\n    this.#routes.set('put', putRoutes)\n    this.#routes.set('patch', patchRoutes)\n    this.#routes.set('delete', deleteRoutes)\n  }\n\n  #groupCallback() {\n    Object.entries(this.#opts.additional).forEach(([methodAndPath, callback]) => {\n      const [method, path] = methodAndPath.split('|') as [ResourcefulHttpVerb, string]\n      if (!method || !path) return\n      const opName = makeOpName(method, path)\n      // unbound actions\n      const routerMethod = ['post', 'put', 'patch', 'delete'].includes(method.toLowerCase())\n        ? 'post'\n        : 'get'\n      const opPath = ['post', 'put', 'patch', 'delete'].includes(method.toLowerCase())\n        ? `/Default.${opName}`\n        : `/Default.${opName}()`\n      if (isAdditionalResourcefulRouteDetails(callback)) {\n        this.#router[routerMethod](opPath, this.#processOdataRequest.bind(this, callback.handler))\n      } else {\n        this.#router[routerMethod](opPath, this.#processOdataRequest.bind(this, callback))\n      }\n    })\n    this.#router.get(\n      '/$metadata',\n      this.#processOdataRequest.bind(this, this.#serveRootMetadata.bind(this))\n    )\n    this.#router.get(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveRootServiceDocument.bind(this))\n    )\n    // Explicitly route non-GET root methods through OData path resolution so they return 405.\n    this.#router.post(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.put(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.patch(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.delete(\n      '/',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n    this.#router.any(\n      '/*',\n      this.#processOdataRequest.bind(this, this.#serveResourceRequest.bind(this))\n    )\n  }\n\n  async #processRequest(callback: RouteCallback, ctx: HttpContext) {\n    let next: ((ctx: HttpContext) => unknown | PromiseLike<unknown> | Promise<unknown>) | undefined\n    if (typeof callback === 'function') {\n      next = async (c) => await callback(c)\n    } else if (Array.isArray(callback) && callback.length === 2) {\n      const [maybeResolvableController, method] = callback\n      if (\n        method in maybeResolvableController &&\n        typeof maybeResolvableController[method] === 'function'\n      ) {\n        // @ts-ignore\n        next = async (c) => await maybeResolvableController[method](c)\n      } else {\n        // @ts-ignore\n        const resolvedController = maybeResolvableController()\n        if (typeof resolvedController[method] === 'function') {\n          next = async (c) => await resolvedController[method](c)\n        }\n      }\n    }\n    if (!next) return\n    try {\n      await next(ctx)\n    } catch (error) {\n      if (this.#opts.catchThrown && ODataErrorMiddleware.shouldHandle(ctx)) {\n        return await ODataErrorMiddleware.handle(error, ctx, {\n          onVineValidationError: this.#opts.onVineValidationError,\n          onJoiValidationError: this.#opts.onJoiValidationError,\n          onException: this.#opts.onException,\n          onError: this.#opts.onError,\n          onUnknown: this.#opts.onUnknown,\n          onAny: this.#opts.onAny,\n          asYaml: true,\n          headers: this.#opts.headers,\n        })\n      } else {\n        throw error\n      }\n    }\n  }\n\n  async #serveInODataContext(\n    callback: RouteCallback,\n    fallbackResponseFormat: ODataResponseFormat,\n    fallbackMetadataLevel: ODataMetadataLevel,\n    ctx: HttpContext\n  ) {\n    const resolver: ResourcefulODataContextResolver = this.#resolvedODataContext.bind(\n      this,\n      ctx,\n      fallbackResponseFormat,\n      fallbackMetadataLevel\n    )\n    return await ODataContext.run({ resolver }, async () => {\n      if (typeof callback === 'function') {\n        return await callback(ctx)\n      } else if (Array.isArray(callback) && callback.length === 2) {\n        const [maybeResolvableController, method] = callback\n        if (\n          method in maybeResolvableController &&\n          typeof maybeResolvableController[method] === 'function'\n        ) {\n          // @ts-ignore\n          await maybeResolvableController[method](ctx)\n        } else {\n          // @ts-ignore\n          const resolvedController = maybeResolvableController()\n          if (typeof resolvedController[method] === 'function') {\n            await resolvedController[method](ctx)\n          }\n        }\n      }\n    })\n  }\n\n  async #processOdataRequest(\n    callback: RouteCallback,\n    ctx: HttpContext,\n    fallbackResponseFormat: ODataResponseFormat = 'json',\n    fallbackMetadataLevel: ODataMetadataLevel = 'minimal'\n  ) {\n    return await this.#processRequest(\n      this.#serveInODataContext.bind(\n        this,\n        callback,\n        fallbackResponseFormat,\n        fallbackMetadataLevel,\n        ctx\n      ),\n      ctx\n    )\n  }\n\n  async #resolvedODataContext(\n    ctx: HttpContext,\n    fallbackResponseFormat: ODataResponseFormat = 'json',\n    fallbackMetadataLevel: ODataMetadataLevel = 'minimal'\n  ): Promise<ResolvedODataContext> {\n    const fullUrl = ctx.request.completeUrl()\n    const indexOfPrefix = fullUrl.indexOf(this.#opts.prefix)\n    const beforePrefix = fullUrl.substring(0, indexOfPrefix === -1 ? fullUrl.length : indexOfPrefix)\n    const ret: ResolvedODataContext = {\n      serviceBaseUrl: beforePrefix + this.#opts.prefix,\n      serveAs: negotiateContent(ctx, fallbackResponseFormat),\n      metadataLevel: negotiateMetadata(ctx, fallbackMetadataLevel),\n    }\n    ctx.response.header('OData-Version', '4.0')\n    return ret\n  }\n\n  async #serveInResourcefulModelRouterContext(\n    controller: ResourcefulModelController,\n    callback: RouteCallback,\n    ctx: HttpContext\n  ) {\n    const resolver: ResourcefulHttpContextResolver = controller.resolveRequestRequirements.bind(\n      controller,\n      ctx\n    ) as ResourcefulHttpContextResolver\n    await ResourcefulHttpContext.run({ resolver }, async () => {\n      if (typeof callback === 'function') {\n        await callback(ctx)\n      } else if (Array.isArray(callback) && callback.length === 2) {\n        const [maybeResolvableController, method] = callback\n        if (\n          method in maybeResolvableController &&\n          typeof maybeResolvableController[method] === 'function'\n        ) {\n          // @ts-ignore\n          await maybeResolvableController[method](ctx)\n        } else {\n          // @ts-ignore\n          const resolvedController = maybeResolvableController()\n          if (typeof resolvedController[method] === 'function') {\n            await resolvedController[method](ctx)\n          }\n        }\n      }\n    })\n  }\n\n  async #serveRootServiceDocument(ctx: HttpContext) {\n    const { serveAs } = await useODataContext()\n    if ('xml' === serveAs) {\n      return await this.#serveRootServiceDocumentXml()\n    } else {\n      return await this.#serveRootServiceDocumentJson(ctx)\n    }\n  }\n\n  async #serveRootServiceDocumentJson(ctx: HttpContext) {\n    const payload = {\n      '@odata.context': `$metadata`,\n      'value': Array.from(this.#controllers.keys()).map((name) => ({\n        name,\n        kind: 'EntitySet',\n        url: name,\n      })),\n    }\n    return ctx.response.json(payload)\n  }\n\n  async #serveRootServiceDocumentXml() {\n    throw new E_UNACCEPTABLE_FORMAT('xml')\n  }\n\n  async #serveRootMetadata(ctx: HttpContext) {\n    const { serveAs } = await useODataContext()\n    const renegotiated = negotiateContent(ctx, 'xml')\n    if ('json' === serveAs && 'json' === renegotiated) {\n      throw new E_UNACCEPTABLE_FORMAT('json')\n    } else {\n      const metadata = await ODataMetadataService.serveRootMetadata(\n        this.#opts,\n        this.#controllers,\n        ctx\n      )\n      return ctx.response.oXml(200, metadata)\n    }\n  }\n\n  async #serveResourceRequest(ctx: HttpContext) {\n    // Normalize wildcard segment to a canonical path\n    const star = ctx.params['*']\n    let resource = Array.isArray(star)\n      ? `/${star.join('/')}`\n      : typeof star === 'string'\n        ? star.startsWith('/')\n          ? star\n          : `/${star}`\n        : '/'\n    resource = resource.replace(/\\/{2,}/g, '/')\n    const method = (ctx.request.method() || 'GET').toLowerCase()\n\n    // Service root supports read semantics only.\n    if (resource === '/' && !['get', 'head'].includes(method)) {\n      throw new Exception(`Method ${method.toUpperCase()} is not allowed for OData service root`, {\n        status: 405,\n        code: 'E_METHOD_NOT_ALLOWED',\n      })\n    }\n\n    const effectiveMethod = (method === 'head' ? 'get' : method) as ResourcefulHttpVerb\n    const routes = this.#routes.get(effectiveMethod)\n    if (!routes) {\n      throw new E_ROUTE_NOT_FOUND([method.toUpperCase(), ctx.request.url() || '/'])\n    }\n    // Exact match first (try as-is and without trailing slash)\n    const trimmed = resource !== '/' ? resource.replace(/\\/+$/, '') : resource\n    const exact = routes.get(resource) || routes.get(trimmed)\n    if (exact) {\n      return await exact(ctx)\n    }\n    // Regex match: longest match wins, then most specific pattern (by regex source length)\n    const candidates = trimmed === resource ? [resource] : [resource, trimmed]\n    const matches = Array.from(routes.entries())\n      .filter(([pattern]) => pattern instanceof RegExp)\n      .map(([pattern, cb]) => {\n        let best: { len: number; specif: number; cb: ODataRouteCallback } | null = null\n        for (const path of candidates) {\n          const m = (pattern as RegExp).exec(path)\n          if (m) {\n            const cur = { len: m[0].length, specif: (pattern as RegExp).source.length, cb }\n            if (!best || cur.len > best.len || (cur.len === best.len && cur.specif > best.specif)) {\n              best = cur\n            }\n          }\n        }\n        return best\n      })\n      .filter((v): v is { len: number; specif: number; cb: ODataRouteCallback } => !!v)\n      .sort((a, b) => b.len - a.len || b.specif - a.specif)\n\n    if (matches.length > 0) {\n      return await matches[0].cb(ctx)\n    }\n    // No match\n    throw new E_ROUTE_NOT_FOUND([method.toUpperCase(), ctx.request.url() || '/'])\n  }\n\n  get group() {\n    return this.#group\n  }\n\n  public static hook(\n    router: Router,\n    rawModelMap: MacroModelsMap,\n    options?: Partial<ResourcefulRouterOptions>\n  ): RouteGroup {\n    const instance = new ODataRouterService(router, rawModelMap, options)\n    return instance.group\n  }\n}\n\nexport const odataRouterMacro: ODataRouterMacro = function (\n  this: Router,\n  models: MacroModelsMap,\n  options: Partial<ResourcefulRouterOptions> = {}\n): RouteGroup {\n  return ODataRouterService.hook(this, models, options)\n}\n\nexport interface ODataRouterMacro {\n  (models: MacroModelsMap, options?: Partial<ResourcefulRouterOptions>): RouteGroup\n}\n\nexport type { ODataRouterService }\n","import type { default as Configure } from '@adonisjs/core/commands/configure'\n\n/** @private */\nexport async function configure(command: Configure) {\n  const codemods = await command.createCodemods()\n  await codemods.updateRcFile((rcFile) => {\n    rcFile.addProvider('@nhtio/lucid-resourceful/integration/provider')\n  })\n  await codemods.registerMiddleware('router', [\n    {\n      path: '@nhtio/lucid-resourceful/integration/middlewares/resourceful_encoded_request',\n      position: 'after',\n    },\n  ])\n}\n","/**\n * A decorator-driven AdonisJS library that lets you annotate Lucid ORM models with metadata to automatically generate CRUD controllers, validation rules, OpenAPI schemas, and a unified query interface.\n * @module @nhtio/lucid-resourceful\n */\n\n/**\n * The current version of the package.\n *\n * @tip This is a constant that is replaced during the build process with the actual version of the package.\n */\nexport const version = __VERSION__\n\nexport { withResourceful } from '@/private/mixin'\nexport {\n  resourcefulColumn,\n  resourcefulComputed,\n  resourcefulBelongsTo,\n  resourcefulHasOne,\n  resourcefulHasMany,\n  resourcefulManyToMany,\n  resourcefulHasManyThrough,\n} from '@/private/decorators'\nexport * as errors from '@nhtio/lucid-resourceful/errors'\nexport * as definitions from '@nhtio/lucid-resourceful/definitions'\n\n// Resourceful Router Macro\nexport { resourcefulRouterMacro } from '@/private/router_macro'\n\n// OData Router Macro\nexport { odataRouterMacro } from '@/private/odata_macro'\n\n// Adonis Integration\nexport { configure } from '@/integration/configure'\n"],"names":["errors","index","error","convertWildcardToRegex_1","convertWildcardToRegex","escapeRegexString_1","escapeRegexString","parseRegex_1","parseRegex","createStringTest_1","require$$0","require$$1","require$$2","createStringTest","testComparisonRange_1","testComparisonRange","testRange_1","testRange","exports","internalFilter","filter_1","filter","highlight_1","highlight","isSafeUnquotedExpression_1","isSafeUnquotedExpression","grammar_1","grammar","isSafePath_1","isSafePath","createGetValueFunctionBody_1","createGetValueFunctionBody","hydrateAst","module","this","dot","parse_1","require$$3","parse","serialize","test_1","test","require$$4","require$$5","require$$6","E_LUCENE_INVALID_TYPE","E_LUCENE_REGEX_NOT_SUPPORTED","SyntaxError","E_LUCENE_SYNTAX_EXCEPTION","E_LUCENE_UNEXPECTED_EXCEPTION","isString","isObject","isResourcefulModel","deepmerge","encode","stripUndefinedValuesFromObject","guards.isResourcefulModel","definitions","joi","E_INVALID_RESOURCEFUL_MIXIN_OPTIONS","ensureOwnResourcefulMap","TypedEventEmitter","_ResourcefulModel","HttpContext","HttpContextFactory","E_INVALID_PAYLOAD_EXCEPTION","guards.isResourcefulDateType","guards.isResourcefulDateTimeType","guards.isResourcefulBinaryType","guards.isResourcefulStringType","guards.isResourcefulIntegerType","guards.isResourcefulBigintType","guards.isResourcefulUnsignedIntegerType","guards.isResourcefulNumberType","guards.isResourcefulBooleanType","guards.isResourcefulObjectType","guards.isObject","guards.isResourcefulArrayType","CRUDOperationsEnum","operationCRUDToACL","ACLOperationsEnum","E_MISSING_PRIMARY_KEY_EXCEPTION","prepareFields","E_FORBIDDEN","E_INVALID_COLUMN_ACCESS","E_INVALID_RESOUREFUL_INDEX_REQUEST_EXCEPTION","E_INVALID_AGGREGATION_FIELD","E_INVALID_AGGREGATION_OPERATION","SimplePaginator","E_RECORD_NOT_FOUND_EXCEPTION","guards.isString","E_INVALID_RELATIONSHIP_EXCEPTION","E_INVALID_RESOUREFUL_READ_RELATIONSHIP_REQUEST_EXCEPTION","E_FORBIDDEN_PAYLOAD_EXCEPTION","E_BULK_UPDATE_SEARCH_UNKNOWN_EXCEPTION","beforeCreate","beforeUpdate","E_INVALID_RESOURCEFUL_DECORATOR_OPTIONS","ResourcefulStringType","ResourcefulDateType","ResourcefulDateTimeType","ResourcefulBinaryType","ResourcefulNumberType","ResourcefulIntegerType","ResourcefulBigintType","ResourcefulUnsignedIntegerType","ResourcefulBooleanType","ResourcefulObjectType","ResourcefulArrayType","lucidComputed","lucidColumn","prepareString","consumeString","prepareDate","consumeDate","prepareDateTime","consumeDateTime","prepareBinary","consumeBinary","prepareNumber","consumeNumber","prepareInteger","consumeInteger","prepareBigint","consumeBigint","prepareUnsignedint","consumeUnsignedint","prepareBoolean","consumeBoolean","prepareObject","consumeObject","prepareArray","consumeArray","lucidBelongsTo","lucidHasOne","lucidHasMany","lucidManyToMany","lucidHasManyThrough","RouteCallbackSchema","AdditionalResourcefulRouteDetailsSchema","parameterObjectSchema","schemaOrReferenceObjectSchema","encoder","DateTime","makeEncodable","modelRelationshipSyncPayloadSchema","isArray","negotiateContent","E_UNRESOLVABLE_MODEL","E_ROUTE_NOT_FOUND","YAML","decode","normalizeError","encodeJoi","E_RELATIONSHIP_NOT_FOUND_EXCEPTION","E_UNSYNCABLE_RELATIONSHIP_EXCEPTION","FORBIDDEN_ADDITIONALS","AdditionalResourcefulRoutesMapValueSchema","ResourcefulRouterVerb","ResourcefulRouterOperation","infoObjectSchema","externalDocsSchema","ResourcefulErrorMiddleware","E_INVALID_RESOURCEFUL_ROUTER_OPTIONS","validator","E_MISSING_CURRENT_INSTANCE_ID","e","E_INVALID_RESOURCEFUL_MODELS_MAP","HttpMethodSortOrder","ResourcefulModelController","minify","ResourcefulHttpVerb","getPossibleHttpErrorCodes","describeHttpError","E_INVALID_RESOURCEFUL_MODELS_MAP_AGGREGATE","E_INVALID_HTTP_METHOD_EXCEPTION","ResourcefulHttpContext","Buffer","isNonArraySchemaObject","isInstanceOf","E_ODATA_FILTER_UNEVALUATABLE_NODE_TYPE","E_ODATA_FILTER_UNEXPECTED_CHARACTER","E_ODATA_FILTER_UNEXPECTED_END_OF_INPUT","E_ODATA_FILTER_UNEXPECTED_TYPE","E_ODATA_UNKNOWN_PARAMETER_ALIAS","E_ODATA_FILTER_UNEXPECTED_TOKEN","E_ODATA_FILTER_INAPPLICABLE_NODE_TYPE","E_ODATA_FILTER_UNKNOWN_LOGICAL_OPERATOR","E_ODATA_FILTER_UNKNOWN_COMPARISON_OPERATOR","E_ODATA_FILTER_INVALID_COMPARISON_SIDE","E_ODATA_FILTER_UNSUPPORTED_FUNCTION_COMPARISON","E_ODATA_FILTER_EXPECTED_COLUMN_REFERENCE","useODataContext","negotiateMetadata","negotiatePreference","negotiateIeee754Compatible","xml","js2xml","E_UNACCEPTABLE_FORMAT","Exception","E_EXPAND_NOT_IMPLEMENTED","isStringContent","E_UNSUPPORTED_DATABASE_DIALECT","Middleware","E_INVALID_ENTITYSET_IDENTIFIERS","ODataErrorMiddleware","ODataContext"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAe,eAAe,KAC7B,UACA,QACA;AAAA,EACC,cAAc,OAAO;AAAA,EACrB,cAAc;AAAA,EACd;AACF,IAAK,CAAA,GACH;AACD,SAAO,IAAI,QAAQ,CAAC,UAAU,YAAY;AACzC,QAAI,SAAS,OAAO,QAAQ,MAAM,UAAa,SAAS,OAAO,aAAa,MAAM,QAAW;AAC5F,YAAM,IAAI,UAAU,8EAA8E,OAAO,QAAQ,GAAG;AAAA,IACrH;AAEA,QAAI,OAAO,WAAW,YAAY;AACjC,YAAM,IAAI,UAAU,6BAA6B;AAAA,IAClD;AAEA,QAAI,EAAG,OAAO,cAAc,WAAW,KAAK,eAAe,KAAM,gBAAgB,OAAO,oBAAoB;AAC3G,YAAM,IAAI,UAAU,kFAAkF,WAAW,OAAO,OAAO,WAAW,GAAG;AAAA,IAC9I;AAEA,UAAM,SAAS,CAAA;AACf,UAAMA,UAAS,CAAA;AACf,UAAM,oBAAoB,oBAAI,IAAG;AACjC,QAAI,aAAa;AACjB,QAAI,aAAa;AACjB,QAAI,iBAAiB;AACrB,QAAI,iBAAiB;AACrB,QAAI,eAAe;AACnB,UAAM,WAAW,SAAS,OAAO,QAAQ,MAAM,SAAY,SAAS,OAAO,aAAa,EAAC,IAAK,SAAS,OAAO,QAAQ,EAAC;AAEvH,UAAM,iBAAiB,MAAM;AAC5B,aAAO,OAAO,MAAM;AAAA,IACrB;AAEA,UAAM,UAAU,MAAM;AACrB,cAAQ,oBAAoB,SAAS,cAAc;AAAA,IACpD;AAEA,UAAM,UAAU,WAAS;AACxB,eAAS,KAAK;AACd,cAAO;AAAA,IACR;AAEA,UAAM,SAAS,YAAU;AACxB,mBAAa;AACb,mBAAa;AACb,cAAQ,MAAM;AACd,cAAO;AAAA,IACR;AAEA,QAAI,QAAQ;AACX,UAAI,OAAO,SAAS;AACnB,eAAO,OAAO,MAAM;AAAA,MACrB;AAEA,aAAO,iBAAiB,SAAS,gBAAgB,EAAC,MAAM,KAAI,CAAC;AAAA,IAC9D;AAEA,UAAM,OAAO,YAAY;AACxB,UAAI,YAAY;AACf;AAAA,MACD;AAEA,YAAM,WAAW,MAAM,SAAS,KAAI;AAEpC,YAAMC,SAAQ;AACd;AAQA,UAAI,SAAS,MAAM;AAClB,yBAAiB;AAEjB,YAAI,mBAAmB,KAAK,CAAC,YAAY;AACxC,cAAI,CAAC,eAAeD,QAAO,SAAS,GAAG;AACtC,mBAAO,IAAI,eAAeA,OAAM,CAAC;AACjC;AAAA,UACD;AAEA,uBAAa;AAEb,cAAI,kBAAkB,SAAS,GAAG;AACjC,oBAAQ,MAAM;AACd;AAAA,UACD;AAEA,gBAAM,aAAa,CAAA;AAGnB,qBAAW,CAACC,QAAO,KAAK,KAAK,OAAO,QAAO,GAAI;AAC9C,gBAAI,kBAAkB,IAAIA,MAAK,MAAM,UAAU;AAC9C;AAAA,YACD;AAEA,uBAAW,KAAK,KAAK;AAAA,UACtB;AAEA,kBAAQ,UAAU;AAAA,QACnB;AAEA;AAAA,MACD;AAEA;AAGA,OAAC,YAAY;AACZ,YAAI;AACH,gBAAM,UAAU,MAAM,SAAS;AAE/B,cAAI,YAAY;AACf;AAAA,UACD;AAEA,gBAAM,QAAQ,MAAM,OAAO,SAASA,MAAK;AAGzC,cAAI,UAAU,UAAU;AACvB,8BAAkB,IAAIA,QAAO,KAAK;AAAA,UACnC;AAEA,iBAAOA,MAAK,IAAI;AAEhB;AACA,gBAAM,KAAI;AAAA,QACX,SAAS,OAAO;AACf,cAAI,aAAa;AAChB,mBAAO,KAAK;AAAA,UACb,OAAO;AACN,YAAAD,QAAO,KAAK,KAAK;AACjB;AAMA,gBAAI;AACH,oBAAM,KAAI;AAAA,YACX,SAASE,QAAO;AACf,qBAAOA,MAAK;AAAA,YACb;AAAA,UACD;AAAA,QACD;AAAA,MACD,GAAC;AAAA,IACF;AAQA,KAAC,YAAY;AACZ,eAASD,SAAQ,GAAGA,SAAQ,aAAaA,UAAS;AACjD,YAAI;AAEH,gBAAM,KAAI;AAAA,QACX,SAAS,OAAO;AACf,iBAAO,KAAK;AACZ;AAAA,QACD;AAEA,YAAI,kBAAkB,YAAY;AACjC;AAAA,QACD;AAAA,MACD;AAAA,IACD,GAAC;AAAA,EACF,CAAC;AACF;AA4GO,MAAM,WAAW,uBAAO,MAAM;;;AC1R9B,MAAM,wBAAwB,MAAM;AAAA,EACzC,eAAe,QAAQ;AACrB,UAAM,GAAG,MAAM;AACf,QAAI,UACF,OAAO,SAAS,KAAK,OAAO,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,IAAI;AAGnE,QAAI,KAAK,SAAS,UAAa,KAAK,SAAS,SAAS;AACpD,aAAO,eAAe,MAAM,QAAQ;AAAA,QAClC,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO,KAAK,YAAY;AAAA,QACxB,UAAU;AAAA,MAClB,CAAO;AAAA,IACH;AAEA,WAAO,eAAe,MAAM,WAAW;AAAA,MACrC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,IAChB,CAAK;AAED,WAAO,eAAe,MAAM,SAAS;AAAA,MACnC,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,IAChB,CAAK;AAGD,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,KAAK,WAAW;AAAA,IAChD,WAAW,KAAK,UAAU,IAAI;AAC5B,WAAK,QAAQ,IAAI,MAAM,OAAO,EAAE;AAAA,IAClC;AAAA,EACF;AACF;;;;;;;;;;;ACpCA,SAAO,eAAe,QAAS,cAAc,EAAE,OAAO,MAAM;AAC5D,SAAA,cAAsB,OAAA,YAAoB;AAC1C,QAAM,aAAa;AAAA,EACnB,MAAM,kBAAkB,WAAW,gBAAgB;AAAA,EACnD;AACA,SAAA,YAAoB;AAAA,EACpB,MAAM,oBAAoB,UAAU;AAAA,IAChC,YAAY,SAAS,QAAQ,MAAM,QAAQ;AACvC,YAAM,OAAO;AACb,WAAK,UAAU;AACf,WAAK,SAAS;AACd,WAAK,OAAO;AACZ,WAAK,SAAS;AAAA,IACtB;AAAA,EACA;AACA,SAAA,cAAsB;;;;;;;;;;;ACftB,SAAO,eAAeE,wBAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,yBAAA,yBAAiC;AACjC,QAAM,gBAAgB;AACtB,QAAMC,2BAAyB,CAAC,YAAY;AACxC,WAAO,IAAI,OAAO,QAAQ,WAAW,eAAe,CAAC,QAAQ,OAAO;AAChE,aAAO,KAAK,UAAU;AAAA,IAC9B,CAAK,CAAC;AAAA,EACN;AACAD,yBAAA,yBAAiCC;;;;;;;;ACRjC,SAAO,eAAeC,mBAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,oBAAA,oBAA4B;AAC5B,QAAM,cAAc;AACpB,QAAM,YAAY;AAClB,QAAMC,sBAAoB,CAAC,YAAY;AACnC,WAAO,QAAQ,WAAW,aAAa,MAAM,EAAE,WAAW,WAAW,OAAO;AAAA,EAChF;AACAD,oBAAA,oBAA4BC;;;;;;;;ACP5B,SAAO,eAAeC,YAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,aAAA,aAAqB;AACrB,QAAM,aAAa;AACnB,QAAM,WAAW;AACjB,QAAMC,eAAa,CAAC,YAAY;AAC5B,UAAM,QAAQ,WAAW,KAAK,OAAO;AACrC,QAAI,CAAC,OAAO;AACR,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACzC;AACI,QAAI,MAAM,CAAC,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,GAAG;AACtC,aAAO,IAAI,OAAO,OAAO;AAAA,IACjC;AACI,WAAO,IAAI,OAAO,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,EACxC;AACAD,aAAA,aAAqBC;;;;;;;ACdrB,SAAO,eAAeC,kBAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,mBAAA,mBAA2B;AAC3B,QAAM,2BAA2BC,8BAAA;AACjC,QAAM,sBAAsBC,yBAAA;AAC5B,QAAM,eAAeC,kBAAA;AACrB,QAAM,kBAAkB,CAAC,YAAY,UAAU;AAC3C,QAAI;AACJ,QAAI,WAAW,KAAK,GAAG;AACnB,aAAO,WAAW,KAAK;AAAA,IAC/B,OACS;AACD,cAAO,GAAI,aAAa,YAAY,KAAK;AACzC,iBAAW,KAAK,IAAI;AAAA,IAC5B;AACI,WAAO,CAAC,YAAY;AAChB,UAAI,IAAI;AACR,cAAQ,MAAM,KAAK,QAAQ,MAAM,IAAI,OAAO,QAAQ,OAAO,SAAS,SAAS,GAAG,CAAC,OAAO,QAAQ,OAAO,SAAS,KAAK;AAAA,IAC7H;AAAA,EACA;AACA,QAAMC,qBAAmB,CAAC,YAAY,QAAQ;AAC1C,QAAI,IAAI,SAAS,OAAO;AACpB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IACpD;AACI,UAAM,EAAE,WAAU,IAAK;AACvB,QAAI,WAAW,SAAS,mBAAmB;AACvC,YAAM,IAAI,MAAM,8BAA8B;AAAA,IACtD;AACI,QAAI,WAAW,SAAS,mBAAmB;AACvC,aAAO,gBAAgB,YAAY,WAAW,KAAK;AAAA,IAC3D;AACI,QAAI,WAAW,SAAS,qBAAqB;AACzC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IACxD;AACI,UAAM,QAAQ,OAAO,WAAW,KAAK;AACrC,SAAK,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,MAC1C,WAAW,WAAW,OAAO;AAC7B,aAAO,gBAAgB,YAAY,QAAO,GAAI,yBAAyB,wBAAwB,KAAK,CAAC,IAAI,IAAI;AAAA,IACrH,OACS;AACD,aAAO,gBAAgB,YAAY,QAAO,GAAI,oBAAoB,mBAAmB,KAAK,IAAI,QAAQ,WAAW,SAAS,MAAM,KAAK;AAAA,IAC7I;AAAA,EACA;AACAJ,mBAAA,mBAA2BI;;;;;;;;AC1C3B,SAAO,eAAeC,qBAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,sBAAA,sBAA8B;AAC9B,QAAMC,wBAAsB,CAAC,OAAO,OAAO,aAAa;AACpD,YAAQ,UAAQ;AAAA,MACZ,KAAK;AACD,eAAO,QAAQ;AAAA,MACnB,KAAK;AACD,eAAO,SAAS;AAAA,MACpB,KAAK;AACD,eAAO,UAAU;AAAA,MACrB,KAAK;AACD,eAAO,QAAQ;AAAA,MACnB,KAAK;AACD,eAAO,SAAS;AAAA,MACpB;AACI,cAAM,IAAI,MAAM,sCAAsC,QAAQ,EAAE;AAAA,IAC5E;AAAA,EACA;AACAD,sBAAA,sBAA8BC;;;;;;;;AClB9B,SAAO,eAAeC,WAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,YAAA,YAAoB;AACpB,QAAMC,cAAY,CAAC,OAAO,UAAU;AAChC,QAAI,OAAO,UAAU,UAAU;AAC3B,UAAI,QAAQ,MAAM,KAAK;AACnB,eAAO;AAAA,MACnB;AACQ,UAAI,UAAU,MAAM,OAAO,CAAC,MAAM,cAAc;AAC5C,eAAO;AAAA,MACnB;AACQ,UAAI,QAAQ,MAAM,KAAK;AACnB,eAAO;AAAA,MACnB;AACQ,UAAI,UAAU,MAAM,OAAO,CAAC,MAAM,cAAc;AAC5C,eAAO;AAAA,MACnB;AACQ,aAAO;AAAA,IACf;AAEI,WAAO;AAAA,EACX;AACAD,YAAA,YAAoBC;;;;;;;;ACrBpB,WAAO,eAAcC,WAAU,cAAc,EAAE,OAAO,MAAM;AAC5DA,cAAA,iBAAyB;AACzB,UAAM,qBAAqBR,wBAAA;AAC3B,UAAM,wBAAwBC,2BAAA;AAC9B,UAAM,cAAcC,iBAAA;AACpB,UAAM,kBAAkB,CAAC,QAAQ;AAC7B,UAAI,IAAI,SAAS,OAAO;AACpB,cAAM,IAAI,MAAM,4BAA4B;AAAA,MACpD;AACI,YAAM,EAAE,WAAU,IAAK;AACvB,UAAI,WAAW,SAAS,mBAAmB;AACvC,eAAO,CAAC,UAAU;AACd,kBAAO,GAAI,YAAY,WAAW,OAAO,WAAW,KAAK;AAAA,QACrE;AAAA,MACA;AACI,UAAI,WAAW,SAAS,mBAAmB;AACvC,eAAO,MAAM;AACT,iBAAO;AAAA,QACnB;AAAA,MACA;AACI,YAAM,kBAAkB,WAAW;AACnC,UAAI,IAAI,YAAY,IAAI,SAAS,aAAa,KAAK;AAC/C,cAAM,WAAW,IAAI;AACrB,YAAI,OAAO,oBAAoB,UAAU;AACrC,gBAAM,IAAI,UAAU,oBAAoB;AAAA,QACpD;AACQ,eAAO,CAAC,UAAU;AACd,cAAI,OAAO,UAAU,UAAU;AAC3B,mBAAO;AAAA,UACvB;AACY,kBAAO,GAAI,sBAAsB,qBAAqB,iBAAiB,OAAO,SAAS,QAAQ;AAAA,QAC3G;AAAA,MACA,WACa,OAAO,oBAAoB,WAAW;AAC3C,eAAO,CAAC,UAAU;AACd,iBAAO,UAAU;AAAA,QAC7B;AAAA,MACA,WACa,oBAAoB,MAAM;AAC/B,eAAO,CAAC,UAAU;AACd,iBAAO,UAAU;AAAA,QAC7B;AAAA,MACA,OACS;AACD,cAAM,cAAa,GAAI,mBAAmB,kBAAkB,CAAA,GAAI,GAAG;AACnE,eAAO,CAAC,UAAU;AACd,iBAAO,WAAW,OAAO,KAAK,CAAC;AAAA,QAC3C;AAAA,MACA;AAAA,IACA;AACA,UAAM,YAAY,CAAC,KAAK,OAAO,YAAY,MAAM,eAAe;AAC5D,UAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,YAAI,aAAa;AACjB,YAAIX,SAAQ;AACZ,mBAAW,QAAQ,OAAO;AACtB,cAAI,UAAU,KAAK,MAAM,YAAY,CAAC,GAAG,MAAM,OAAOA,QAAO,CAAC,GAAG,UAAU,GAAG;AAC1E,gBAAI,YAAY;AACZ,qBAAO;AAAA,YAC3B;AACgB,yBAAa;AAAA,UAC7B;AAAA,QACA;AACQ,eAAO;AAAA,MACf,WACa,OAAO,UAAU,YAAY,UAAU,MAAM;AAClD,YAAI,aAAa;AACjB,mBAAW,OAAO,OAAO;AACrB,cAAI,UAAU,KAAK,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,MAAM,GAAG,GAAG,UAAU,GAAG;AACpE,gBAAI,YAAY;AACZ,qBAAO;AAAA,YAC3B;AACgB,yBAAa;AAAA,UAC7B;AAAA,QACA;AACQ,eAAO;AAAA,MACf;AACI,UAAI,IAAI,SAAS,OAAO;AACpB,cAAM,IAAI,MAAM,4BAA4B;AAAA,MACpD;AACI,UAAI,CAAC,IAAI,MAAM;AACX,cAAM,IAAI,MAAM,8BAA8B;AAAA,MACtD;AACI,YAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,UAAI,QAAQ;AACR,mBAAW,KAAK;AAAA,UACZ,GAAI,OAAO,WAAW,YAAY,EAAE,SAAS,OAAM;AAAA,UACnD,MAAM,KAAK,KAAK,GAAG;AAAA,QAC/B,CAAS;AACD,eAAO;AAAA,MACf;AACI,aAAO,QAAQ,MAAM;AAAA,IACzB;AACA,UAAM,YAAY,CAAC,KAAK,KAAK,YAAY,MAAM,eAAe;AAC1D,UAAI,IAAI,SAAS,OAAO;AACpB,cAAM,IAAI,MAAM,4BAA4B;AAAA,MACpD;AACI,UAAI,CAAC,IAAI,MAAM;AACX,YAAI,OAAO,gBAAgB,GAAG;AAAA,MACtC;AACI,UAAI,IAAI,MAAM,SAAS,iBAAiB;AACpC,YAAI,aAAa;AACjB,mBAAW,aAAa,KAAK;AACzB,cAAI,UAAU;AAAA,YACV,GAAG;AAAA,YACH,OAAO;AAAA,cACH,UAAU;AAAA,gBACN,KAAK;AAAA,gBACL,OAAO;AAAA;cAEX,MAAM;AAAA,cACN,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,MAAM;AAAA;UAE1B,GAAe,IAAI,SAAS,GAAG,YAAY,CAAC,GAAG,MAAM,SAAS,GAAG,UAAU,GAAG;AAC9D,gBAAI,YAAY;AACZ,qBAAO;AAAA,YAC3B;AACgB,yBAAa;AAAA,UAC7B;AAAA,QACA;AACQ,eAAO;AAAA,MACf;AACI,UAAI,IAAI,MAAM,QAAQ,KAAK;AACvB,eAAO,UAAU,KAAK,IAAI,IAAI,MAAM,IAAI,GAAG,YAAY,MAAM,UAAU;AAAA,MAC/E,WACa,IAAI,YAAY,IAAI,MAAM,MAAM;AACrC,eAAO,UAAU,KAAK,IAAI,SAAS,GAAG,GAAG,YAAY,IAAI,MAAM,MAAM,UAAU;AAAA,MACvF,WACa,IAAI,MAAM,MAAM;AACrB,YAAI,QAAQ;AACZ,mBAAW,OAAO,IAAI,MAAM,MAAM;AAC9B,cAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC7C,mBAAO;AAAA,UACvB,WACqB,OAAO,OAAO;AACnB,oBAAQ,MAAM,GAAG;AAAA,UACjC,OACiB;AACD,mBAAO;AAAA,UACvB;AAAA,QACA;AACQ,eAAO,UAAU,KAAK,OAAO,YAAY,IAAI,MAAM,MAAM,UAAU;AAAA,MAC3E,OACS;AACD,eAAO;AAAA,MACf;AAAA,IACA;AACA,UAAMkB,kBAAiB,CAAC,KAAK,MAAM,aAAa,MAAM,OAAO,CAAA,GAAI,aAAa,OAAO;AACjF,UAAI,IAAI,SAAS,OAAO;AACpB,eAAO,KAAK,OAAO,CAAC,QAAQ;AACxB,iBAAO,UAAU,KAAK,KAAK,YAAY,IAAI,MAAM,SAAS,kBAAkB,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,UAAU;AAAA,QACpI,CAAS;AAAA,MACT;AACI,UAAI,IAAI,SAAS,iBAAiB;AAC9B,cAAM,iBAAiBD,UAAQ,gBAAgB,IAAI,SAAS,MAAM,YAAY,MAAM,EAAE;AACtF,eAAO,KAAK,OAAO,CAAC,QAAQ;AACxB,iBAAO,CAAC,WAAW,SAAS,GAAG;AAAA,QAC3C,CAAS;AAAA,MACT;AACI,UAAI,IAAI,SAAS,2BAA2B;AACxC,gBAAO,GAAIA,UAAQ,gBAAgB,IAAI,YAAY,MAAM,YAAY,MAAM,UAAU;AAAA,MAC7F;AACI,UAAI,CAAC,IAAI,MAAM;AACX,cAAM,IAAI,MAAM,8BAA8B;AAAA,MACtD;AACI,YAAM,eAAeA,UAAQ,gBAAgB,IAAI,MAAM,MAAM,YAAY,MAAM,UAAU;AACzF,UAAI,CAAC,IAAI,OAAO;AACZ,cAAM,IAAI,MAAM,+BAA+B;AAAA,MACvD;AACI,UAAI,IAAI,SAAS,qBAAqB;AAClC,cAAM,IAAI,MAAM,4BAA4B;AAAA,MACpD;AACI,UAAI,IAAI,SAAS,aAAa,MAAM;AAChC,cAAM,gBAAgBA,UAAQ,gBAAgB,IAAI,OAAO,MAAM,YAAY,MAAM,UAAU;AAC3F,eAAO,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC;AAAA,MAC9D,WACa,IAAI,SAAS,aAAa,OAAO;AACtC,gBAAO,GAAIA,UAAQ,gBAAgB,IAAI,OAAO,UAAU,YAAY,MAAM,UAAU;AAAA,MAC5F;AACI,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACvC;AACAA,cAAA,iBAAyBC;AAAA;;;;;;;ACtLzB,SAAO,eAAeC,QAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,SAAA,SAAiB;AACjB,QAAM,mBAAmBV,sBAAA;AACzB,QAAMW,WAAS,CAAC,KAAK,SAAS;AAC1B,eAAW,iBAAiB,gBAAgB,KAAK,IAAI;AAAA,EACzD;AACAD,SAAA,SAAiBC;;;;;;;;ACNjB,SAAO,eAAeC,WAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,YAAA,YAAoB;AACpB,QAAM,sBAAsBZ,yBAAA;AAC5B,QAAM,mBAAmBC,sBAAA;AACzB,QAAMY,cAAY,CAAC,KAAK,SAAS;AAC7B,UAAM,aAAa,CAAA;AACnB,QAAI,iBAAiB,gBAAgB,KAAK,CAAC,IAAI,GAAG,OAAO,CAAA,GAAI,UAAU;AACvE,UAAM,uBAAuB,CAAA;AAC7B,eAAW,iBAAiB,YAAY;AACpC,UAAI,sBAAsB,qBAAqB,KAAK,CAAC,gBAAgB;AACjE,eAAO,YAAY,SAAS,cAAc;AAAA,MACtD,CAAS;AACD,UAAI,CAAC,qBAAqB;AACtB,8BAAsB;AAAA,UAClB,UAAU,CAAA;AAAA,UACV,MAAM,cAAc;AAAA;AAExB,6BAAqB,KAAK,mBAAmB;AAAA,MACzD;AACQ,UAAI,cAAc,SAAS;AACvB,4BAAoB,SAAS,KAAK,cAAc,OAAO;AAAA,MACnE;AAAA,IACA;AACI,WAAO,qBAAqB,IAAI,CAAC,wBAAwB;AACrD,UAAI,oBAAoB,SAAS,SAAS,GAAG;AACzC,eAAO;AAAA,UACH,MAAM,oBAAoB;AAAA,UAC1B,OAAO,IAAI,OAAO,MACd,oBAAoB,SACf,IAAI,CAAC,YAAY;AAClB,oBAAO,GAAI,oBAAoB,mBAAmB,QAAQ,KAAI,CAAE;AAAA,UACxF,CAAqB,EACI,KAAK,GAAG,IACb,GAAG;AAAA;MAEvB;AACQ,aAAO;AAAA,QACH,MAAM,oBAAoB;AAAA;IAEtC,CAAK;AAAA,EACL;AACAD,YAAA,YAAoBC;;;;;;;;ACzCpB,SAAO,eAAeC,0BAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,2BAAA,2BAAmC;AACnC,QAAMC,6BAA2B,CAAC,eAAe;AAC7C,WAAO,kCAAkC,KAAK,UAAU;AAAA,EAC5D;AACAD,2BAAA,2BAAmCC;;;;;;;;;ACLnC,SAAO,eAAeC,SAAS,cAAc,EAAE,OAAO,MAAM;AAK5D,WAAS,GAAG,GAAG;AACX,WAAO,EAAE,CAAC;AAAA,EACd;AACA,QAAMC,YAAU;AAAA,IACZ,OAAO;AAAA,IACP,aAAa;AAAA,MACT;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,KAAK,CAAC;AAAA,QAC7B,SAAS,CAAC,KAAK,sBAAsB,GAAG;AAAA;MAE5C,EAAE,MAAM,YAAY,SAAS,GAAE;AAAA,MAC/B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,YAAY,sBAAsB;AAAA;MAEhD,EAAE,MAAM,KAAK,aAAa,CAAC,SAAS,KAAK,CAAC,EAAE,QAAQ,SAAS,CAAC,UAAU,EAAC;AAAA,MACzE,EAAE,MAAM,aAAa,SAAS,CAAC,sBAAsB,EAAC;AAAA,MACtD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,aAAa,sBAAsB;AAAA;MAEjD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,KAAK,CAAC,EAAE;AAAA,QAC/B,SAAS,CAAC,WAAW;AAAA;MAEzB,EAAE,MAAM,wBAAwB,aAAa,IAAI,SAAS,CAAC,aAAa,EAAC;AAAA,MACzE,EAAE,MAAM,kBAAkB,aAAa,IAAI,SAAS,CAAC,EAAE,SAAS,IAAG,CAAE,EAAC;AAAA,MACtE,EAAE,MAAM,kBAAkB,aAAa,MAAM,MAAM,SAAS,GAAE;AAAA,MAC9D,EAAE,MAAM,kBAAkB,SAAS,CAAC,IAAI,EAAC;AAAA,MACzC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,kBAAkB,IAAI;AAAA;MAEpC,EAAE,MAAM,yCAAyC,SAAS,CAAC,IAAI,EAAC;AAAA,MAChE;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,yCAAyC,IAAI;AAAA;MAE3D;AAAA,QACI,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,uCAAuC;AAAA;MAEvE;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,CAAC,gCAAgC;AAAA;MAE9C,EAAE,MAAM,kBAAkB,aAAa,MAAM,MAAM,SAAS,GAAE;AAAA,MAC9D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,OAAO,YAAY,KAAK,CAAC,KAAK,MACjD,KAAK,CAAC,EAAE,KAAK,EAAE,KACd,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG;AAAA,QAC9C,SAAS,CAAC,kBAAkB,kBAAkB,gBAAgB;AAAA;MAElE,EAAE,MAAM,mBAAmB,SAAS,GAAE;AAAA,MACtC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,mBAAmB,UAAU;AAAA;MAE3C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,KAAK,CAAC,EAAE,KAAK,EAAE;AAAA,QACtC,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,mBAAmB,EAAE,SAAS,KAAK;AAAA;MAEnE,EAAE,MAAM,mBAAmB,SAAS,GAAE;AAAA,MACtC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,mBAAmB,UAAU;AAAA;MAE3C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,KAAK,CAAC,EAAE,KAAK,EAAE;AAAA,QACtC,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,mBAAmB,EAAE,SAAS,KAAK;AAAA;MAEnE,EAAE,MAAM,YAAY,aAAa,IAAI,SAAS,CAAC,UAAU,EAAC;AAAA,MAC1D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,KAAK,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,GAAG;AAAA,QAC3D,SAAS,CAAC,EAAE,SAAS,KAAI,GAAI,WAAW;AAAA;MAE5C,EAAE,MAAM,YAAY,aAAa,IAAI,SAAS,CAAC,UAAU,EAAC;AAAA,MAC1D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,KAAK,MAAM,MAAM,KAAK,KAAK,EAAE,IAAI,GAAG;AAAA,QAC3D,SAAS,CAAC,EAAE,SAAS,KAAI,GAAI,WAAW;AAAA;MAE5C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,KAAI,GAAI,EAAE,SAAS,KAAK;AAAA;MAEjD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,MAAM;AAAA,QACnB,SAAS,CAAC,mBAAmB;AAAA;MAEjC,EAAE,MAAM,aAAa,aAAa,IAAI,SAAS,CAAC,aAAa,EAAC;AAAA,MAC9D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,KAAK,KAAK,EAAE;AAAA,QACnC,SAAS;AAAA,UACL,EAAE,SAAS,IAAG;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS,CAAC,2BAA2B;AAAA;MAEzC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,UAAU;AAAA,UACpB,MAAM,KAAK,CAAC;AAAA,UACZ,UAAU;AAAA,YACN,KAAK,KAAK,CAAC,EAAE,SAAS;AAAA,YACtB,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA;UAE5B,UAAU,KAAK,CAAC;AAAA,UAChB,OAAO,KAAK,CAAC;AAAA,UACb,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,UAAU;AAAA,UACpB,MAAM,KAAK,CAAC;AAAA,UACZ,UAAU;AAAA,YACN,KAAK,KAAK,CAAC,EAAE,SAAS;AAAA,YACtB,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA;UAE5B,UAAU;AAAA,YACN,UAAU;AAAA,YACV,MAAM;AAAA;UAEV,OAAO,KAAK,CAAC;AAAA,UACb,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC;AAAA,QACvB,SAAS,CAAC,2BAA2B;AAAA;MAEzC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC;AAAA,QACvB,SAAS,CAAC,2BAA2B;AAAA;MAEzC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,OAAO;AAAA,UACjB,YAAY,EAAE,CAAC;AAAA,UACf,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,SAAS,MAAK;AAAA,UACpE,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC;AAAA,QACvB,SAAS,CAAC,2BAA2B;AAAA;MAEzC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,OAAO;AAAA,UACjB,YAAY,EAAE,CAAC;AAAA,UACf,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,SAAS,MAAK;AAAA,UACpE,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC;AAAA,QACvB,SAAS,CAAC,6BAA6B,IAAI;AAAA;MAE/C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,OAAO;AAAA,UACjB,YAAY,EAAE,CAAC;AAAA,UACf,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,SAAS,MAAK;AAAA,UACpE,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,OAAO;AAAA,UACjB,YAAY;AAAA,YACR,UAAU;AAAA,cACN,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ;AAAA,cAC3B,OAAO,EAAE,CAAC,EAAE,SAAS,QAAQ;AAAA;YAEjC,MAAM;AAAA;UAEV,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,SAAS,MAAK;AAAA,UACpE,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,oBAAoB,KAAK,mBAAmB;AAAA;MAE1D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,OAAO;AAAA,UACjB,YAAY,EAAE,CAAC;AAAA,UACf,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,SAAS,MAAK;AAAA,UACpE,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,SAAS,OAAO,EAAE,SAAS,KAAK;AAAA;MAElE;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,UAAU;AAC1B,iBAAO;AAAA,YACH,UAAU;AAAA,cACN,KAAK,KAAK,CAAC,EAAE,SAAS;AAAA,cACtB;AAAA;YAEJ,SAAS,KAAK,CAAC;AAAA,YACf,UAAU;AAAA,YACV,MAAM;AAAA;QAE1B;AAAA,QACY,SAAS,CAAC,sCAAsC,sBAAsB;AAAA;MAE1E;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,UAAU;AAC1B,iBAAO;AAAA,YACH,UAAU;AAAA,cACN,KAAK,KAAK,CAAC,EAAE,SAAS;AAAA,cACtB;AAAA;YAEJ,SAAS,KAAK,CAAC;AAAA,YACf,UAAU;AAAA,YACV,MAAM;AAAA;QAE1B;AAAA,QACY,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,iBAAiB;AAAA;MAEjD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC;AAAA,QACvB,SAAS,CAAC,iBAAiB;AAAA;MAE/B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC;AAAA,QACvB,SAAS,CAAC,MAAM,2BAA2B;AAAA;MAE/C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,OAAO;AAAA,UACjB,YAAY,EAAE,CAAC;AAAA,UACf,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,EAAE,CAAC,EAAE,SAAQ;AAAA,UACxD,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW,EAAE,UAAU,EAAE,MAAK;QAClD,SAAS,CAAC,EAAE,SAAS,KAAK;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW,EAAE,UAAU,EAAE,MAAK;QAClD,SAAS,CAAC,EAAE,SAAS,KAAK;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,EAAE,SAAS,KAAK;AAAA;MAEhD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,UAAU,EAAE,KAAK,QAAQ,GAAG,MAAK;AAAA,UACjC,UAAU;AAAA,UACV,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,2BAA2B;AAAA;MAEzC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,SAAS,OAAO,EAAE,SAAS,KAAK;AAAA;MAElE;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,UAAU,EAAE,KAAK,QAAQ,GAAG,MAAK;AAAA,UACjC,UAAU;AAAA,UACV,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,2BAA2B;AAAA;MAEzC,EAAE,MAAM,mBAAmB,aAAa,IAAI,SAAS,CAAC,gBAAgB,EAAC;AAAA,MACvE;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,OAAO;AAAA,UACjB,YAAY,EAAE,CAAC;AAAA,UACf,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,QAAQ,GAAG,OAAO,EAAE,CAAC,EAAE,SAAS,MAAK;AAAA,UACpE,MAAM;AAAA,QACtB;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC;AAAA,QACvB,SAAS,CAAC,MAAM,iBAAiB;AAAA;MAErC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,UAAU;AAC1B,gBAAM,QAAQ;AAAA,YACV,UAAU,KAAK,CAAC,EAAE;AAAA,YAClB,MAAM,KAAK,CAAC,EAAE;AAAA,YACd,MAAM,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,YAC5C,QAAQ,KAAK,CAAC,EAAE;AAAA,YAChB,QAAQ,KAAK,CAAC,EAAE;AAAA,YAChB,MAAM;AAAA;AAEV,cAAI,CAAC,KAAK,CAAC,EAAE,QAAQ;AACjB,mBAAO,MAAM;AAAA,UACjC;AACgB,iBAAO;AAAA,YACH;AAAA,YACA,UAAU;AAAA,cACN,KAAK,KAAK,CAAC,EAAE,WAAW,SAAS;AAAA,cACjC;AAAA;YAEJ,UAAU,KAAK,CAAC;AAAA,YAChB,GAAG,KAAK,CAAC;AAAA;QAE7B;AAAA,QACY,SAAS,CAAC,SAAS,uBAAuB,YAAY;AAAA;MAE1D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,UAAU;AAC1B,gBAAM,QAAQ;AAAA,YACV,UAAU,KAAK,CAAC,EAAE;AAAA,YAClB,MAAM,KAAK,CAAC,EAAE;AAAA,YACd,MAAM,KAAK,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,YAC5C,QAAQ,KAAK,CAAC,EAAE;AAAA,YAChB,QAAQ,KAAK,CAAC,EAAE;AAAA,YAChB,MAAM;AAAA;AAEV,cAAI,CAAC,KAAK,CAAC,EAAE,QAAQ;AACjB,mBAAO,MAAM;AAAA,UACjC;AACgB,iBAAO;AAAA,YACH,YAAY;AAAA,cACR,UAAU;AAAA,gBACN,KAAK,KAAK,CAAC,EAAE,SAAS;AAAA,gBACtB,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA;cAE5B,MAAM;AAAA;YAEV;AAAA,YACA,UAAU;AAAA,cACN,KAAK,KAAK,CAAC,EAAE,SAAS;AAAA,cACtB;AAAA;YAEJ,UAAU,KAAK,CAAC;AAAA,YAChB,MAAM;AAAA;QAE1B;AAAA,QACY,SAAS,CAAC,SAAS,qBAAqB;AAAA;MAE5C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,UAAU;AAC1B,iBAAO;AAAA,YACH,OAAO,EAAE,MAAM,gBAAe;AAAA,YAC9B,UAAU,EAAE,KAAK,KAAK,CAAC,EAAE,WAAW,SAAS,KAAK,MAAK;AAAA,YACvD,GAAG,KAAK,CAAC;AAAA;QAE7B;AAAA,QACY,SAAS,CAAC,YAAY;AAAA;MAE1B,EAAE,MAAM,gBAAgB,SAAS,GAAE;AAAA,MACnC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,gBAAgB,SAAS;AAAA;MAEvC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,UAAU,EAAE,KAAK,SAAS,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,QAAQ,MAAK;AAAA,UACnE,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE;AAAA,UAC/B,QAAQ;AAAA,UACR,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,cAAc,cAAc;AAAA;MAE1C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,UAAU,EAAE,KAAK,QAAQ,KAAK,CAAC,EAAE,SAAS,GAAG,MAAK;AAAA,UAClD,MAAM,KAAK,CAAC;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,UAAU;AAAA;MAExB;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,UAAU,EAAE,KAAK,QAAQ,KAAK,CAAC,EAAE,SAAS,GAAG,MAAK;AAAA,UAClD,MAAM,KAAK,CAAC;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,UAAU;AAAA;MAExB;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,YAAY;AAAA,YACR,UAAU,EAAE,KAAK,QAAQ,KAAK,KAAK,EAAE,EAAE,QAAQ,MAAK;AAAA,YACpD,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,OAAO,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA;UAE/B,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,SAAS;AAAA;MAEvB;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,YAAY;AAAA,YACR,UAAU,EAAE,KAAK,QAAQ,KAAK,KAAK,EAAE,EAAE,QAAQ,MAAK;AAAA,YACpD,MAAM;AAAA,YACN,OAAO,KAAK,KAAK,EAAE;AAAA;UAEvB,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,OAAO;AAAA;MAErB,EAAE,MAAM,cAAc,aAAa,CAAC,SAAS,KAAK,CAAC,GAAG,SAAS,CAAC,OAAO,EAAC;AAAA,MACxE;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,OAAO,WAAW;AAClC,gBAAM,QAAQ,KAAK,KAAK,EAAE;AAC1B,cAAI,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,OAAO;AAC5D,mBAAO;AAAA,UAC3B;AACgB,cAAI;AACJ,cAAI,UAAU,QAAQ;AAClB,8BAAkB;AAAA,UACtC,WACyB,UAAU,SAAS;AACxB,8BAAkB;AAAA,UACtC,WACyB,UAAU,QAAQ;AACvB,8BAAkB;AAAA,UACtC,OACqB;AACD,8BAAkB;AAAA,UACtC;AACgB,iBAAO;AAAA,YACH,YAAY;AAAA,cACR,UAAU;AAAA,gBACN,KAAK,QAAQ,MAAM;AAAA,gBACnB;AAAA;cAEJ,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,OAAO;AAAA;YAEX,MAAM;AAAA;QAE1B;AAAA,QACY,SAAS,CAAC,gBAAgB;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,YAAY;AAAA,YACR,UAAU,EAAE,KAAK,QAAQ,KAAK,KAAK,EAAE,EAAE,SAAS,GAAG,MAAK;AAAA,YACxD,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,OAAO,KAAK,KAAK,EAAE;AAAA;UAEvB,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,UAAU;AAAA;MAExB;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,YAAY;AAAA,YACR,UAAU,EAAE,KAAK,QAAQ,KAAK,KAAK,EAAE,EAAE,SAAS,GAAG,MAAK;AAAA,YACxD,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,OAAO,KAAK,KAAK,EAAE;AAAA;UAEvB,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,UAAU;AAAA;MAExB;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS;AAAA,UACL,EAAE,SAAS,IAAG;AAAA,UACd,EAAE,SAAS,IAAG;AAAA,UACd,EAAE,SAAS,IAAG;AAAA,UACd,EAAE,SAAS,IAAG;AAAA;;MAGtB;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,UAAU;AAC1B,iBAAO;AAAA,YACH,YAAY;AAAA,cACR,UAAU;AAAA,gBACN,KAAK,KAAK,CAAC,EAAE,SAAS,QAAQ;AAAA,gBAC9B,OAAO,KAAK,CAAC,EAAE,SAAS;AAAA;cAE5B,OAAO;AAAA,gBACH,KAAK,KAAK,CAAC;AAAA,gBACX,cAAc,KAAK,CAAC,EAAE;AAAA,gBACtB,KAAK,KAAK,CAAC;AAAA,gBACX,cAAc,KAAK,CAAC,EAAE;AAAA;cAE1B,MAAM;AAAA;YAEV,UAAU;AAAA,cACN;AAAA;YAEJ,MAAM;AAAA;QAE1B;AAAA,QACY,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;;MAGR;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW,EAAE,WAAW,MAAM,UAAU,EAAE,MAAK;QACnE,SAAS,CAAC,EAAE,SAAS,KAAK;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW,EAAE,WAAW,OAAO,UAAU,EAAE,MAAK;QACpE,SAAS,CAAC,EAAE,SAAS,KAAK;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW,EAAE,WAAW,MAAM,UAAU,EAAE,MAAK;QACnE,SAAS,CAAC,EAAE,SAAS,KAAK;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW,EAAE,WAAW,OAAO,UAAU,EAAE,MAAK;QACpE,SAAS,CAAC,EAAE,SAAS,KAAK;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,SAAS,KAAK;AAAA;MAE9B;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,EAAE,SAAS,KAAK;AAAA;MAEhD;AAAA,QACI,MAAM;AAAA,QACN,SAAS,CAAC,8CAA8C;AAAA;MAE5D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,EAAE,SAAS,KAAK;AAAA;MAEhD;AAAA,QACI,MAAM;AAAA,QACN,SAAS,CAAC,8CAA8C;AAAA;MAE5D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,EAAE,SAAS,KAAK;AAAA;MAEhD;AAAA,QACI,MAAM;AAAA,QACN,SAAS,CAAC,8CAA8C;AAAA;MAE5D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,SAAS,OAAO,EAAE,SAAS,KAAK;AAAA;MAElE;AAAA,QACI,MAAM;AAAA,QACN,SAAS,CAAC,8CAA8C;AAAA;MAE5D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,SAAS,OAAO,EAAE,SAAS,KAAK;AAAA;MAElE;AAAA,QACI,MAAM;AAAA,QACN,SAAS,CAAC,8CAA8C;AAAA;MAE5D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,WAAW;AAAA,UAC3B,UAAU,EAAE,KAAK,QAAQ,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAK;AAAA,UACjD,UAAU,KAAK,CAAC,EAAE,CAAC;AAAA,UACnB,MAAM;AAAA,QACtB;AAAA,QACY,SAAS,CAAC,qCAAqC;AAAA;MAEnD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE;AAAA,QAC7B,SAAS,CAAC,cAAc,aAAa;AAAA;MAEzC,EAAE,MAAM,qBAAqB,SAAS,GAAE;AAAA,MACxC;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,qBAAqB,iBAAiB;AAAA;MAEpD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,SAAS,MAAM,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI;AAAA,QAChD,SAAS,CAAC,EAAE,SAAS,IAAG,GAAI,qBAAqB,EAAE,SAAS,KAAK;AAAA;MAErE,EAAE,MAAM,mBAAmB,aAAa,IAAI,SAAS,CAAC,OAAO,EAAC;AAAA,MAC9D;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,OAAO,EAAE,CAAC;AAAA,QAC9B,SAAS,CAAC,EAAE,SAAS,KAAI,GAAI,OAAO;AAAA;MAExC,EAAE,MAAM,eAAe,SAAS,GAAE;AAAA,MAClC,EAAE,MAAM,sBAAsB,SAAS,CAAC,WAAW,EAAC;AAAA,MACpD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,sBAAsB,WAAW;AAAA;MAE/C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE;AAAA,QAChC,SAAS,CAAC,oBAAoB;AAAA;MAElC,EAAE,MAAM,yBAAyB,SAAS,GAAE;AAAA,MAC5C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,yBAAyB,2BAA2B;AAAA;MAElE;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE;AAAA,QACvC,SAAS,CAAC,+BAA+B,uBAAuB;AAAA;MAEpE,EAAE,MAAM,yBAAyB,SAAS,CAAC,IAAI,EAAC;AAAA,MAChD;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,yBAAyB,IAAI;AAAA;MAE3C,EAAE,MAAM,yBAAyB,SAAS,GAAE;AAAA,MAC5C;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA,QACtC,SAAS,CAAC,yBAAyB,2BAA2B;AAAA;MAElE;AAAA,QACI,MAAM;AAAA,QACN,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE;AAAA,QACvD,SAAS;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA;;;IAIZ,aAAa;AAAA;AAEjBD,UAAA,UAAkBC;;;;;;;;;;AC9vBlB,SAAO,eAAeC,YAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,aAAA,aAAqB;AACrB,QAAM,iBAAiB;AACvB,QAAMC,eAAa,CAAC,SAAS;AACzB,WAAO,eAAe,KAAK,IAAI;AAAA,EACnC;AACAD,aAAA,aAAqBC;;;;;;;ACNrB,SAAO,eAAeC,4BAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,6BAAA,6BAAqC;AACrC,QAAM,eAAepB,kBAAA;AACrB,QAAMqB,+BAA6B,CAAC,SAAS;AACzC,QAAI,EAAC,GAAI,aAAa,YAAY,IAAI,GAAG;AACrC,YAAM,IAAI,MAAM,cAAc;AAAA,IACtC;AACI,UAAM,OAAO,mBAAmB;AAChC,WAAO,KAAK,WAAW,cAAc,OAAO,EAAE,WAAW,KAAK,IAAI;AAAA,EACtE;AACAD,6BAAA,6BAAqCC;;;;;;;;ACTrC,WAAO,eAAcb,WAAU,cAAc,EAAE,OAAO,MAAM;AAC5DA,cAAA,aAAqB;AACrB,UAAM,+BAA+BR,kCAAA;AACrC,UAAM,eAAeC,kBAAA;AACrB,UAAMqB,cAAa,CAAC,YAAY;AAC5B,YAAM,aAAa;AAAA,QACf,GAAG;AAAA;AAEP,UAAI,QAAQ,SAAS,SACjB,QAAQ,MAAM,SAAS,WACvB,WAAW,YACX,GAAI,aAAa,YAAY,QAAQ,MAAM,IAAI,GAAG;AAClD,mBAAW,WAAW,IAAI,SAAS,YAAW,GAAI,6BAA6B,4BAA4B,QAAQ,MAAM,IAAI,CAAC;AAAA,MACtI;AACI,UAAI,UAAU,SAAS;AACnB,mBAAW,QAAO,GAAId,UAAQ,YAAY,QAAQ,IAAI;AAAA,MAC9D;AACI,UAAI,WAAW,SAAS;AACpB,mBAAW,SAAQ,GAAIA,UAAQ,YAAY,QAAQ,KAAK;AAAA,MAChE;AACI,UAAI,aAAa,SAAS;AACtB,mBAAW,WAAU,GAAIA,UAAQ,YAAY,QAAQ,OAAO;AAAA,MACpE;AACI,aAAO;AAAA,IACX;AACAA,cAAA,aAAqBc;AAAA;;;;;;;;;;AC3BrB,KAAC,SAAS,MAAM,SAAS;AACrB,UAAkCC,QAAO,SAAS;AAC9C,QAAAA,QAAA,UAAiB,QAAO;AAAA,MAChC,OAAW;AACH,aAAK,UAAU,QAAO;AAAA,MAC9B;AAAA,IACA,GAAEC,SAAM,WAAW;AAEf,eAAS,KAAK,MAAM,SAAS,aAAa;AACtC,aAAK,KAAK,EAAE,KAAK;AACjB,aAAK,OAAO;AACZ,aAAK,UAAU;AACf,aAAK,cAAc;AACnB,eAAO;AAAA,MACf;AACI,WAAK,YAAY;AAEjB,WAAK,UAAU,WAAW,SAAS,cAAc;AAC7C,YAAI,iBAAkB,OAAO,iBAAiB,cACvB,KAAK,QAAQ,IAAI,qBAAqB,EAAE,KAAK,GAAG,IAC5C,KAAK,QAAQ,MAAM,GAAG,YAAY,EAAE,IAAI,qBAAqB,EAAE,KAAK,GAAG,IACvE,QACA,KAAK,QAAQ,MAAM,YAAY,EAAE,IAAI,qBAAqB,EAAE,KAAK,GAAG;AAC/F,eAAO,KAAK,OAAO,QAAQ;AAAA,MACnC;AAII,eAAS,MAAM,MAAMC,MAAK,WAAW,UAAU;AAC3C,aAAK,OAAO;AACZ,aAAK,MAAMA;AACX,aAAK,YAAY;AACjB,aAAK,OAAO,CAAA;AACZ,aAAK,WAAW;AAChB,aAAK,aAAa,KAAK,QAAQ,KAAK,QAAQ;AAAA,MACpD;AAEI,YAAM,UAAU,WAAW,WAAW;AAClC,eAAO,MAAM,KAAK,KAAK,SAAS,KAAK,GAAG,IAAI,eAAe,KAAK,aAAa;AAAA,MACrF;AAEI,YAAM,UAAU,YAAY,SAAS,OAAO;AACxC,YAAI,QAAQ,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,KAAK,WAAW,KAAK,QAAQ;AAC5E,cAAM,OAAO;AACb,cAAM,QAAQ;AACd,YAAI,MAAM,YAAY;AAClB,gBAAM,OAAO,MAAM,MAAK;AAGxB,gBAAM,QAAQ;AAAA,QAC1B;AACQ,eAAO;AAAA,MACf;AAEI,YAAM,UAAU,QAAQ,WAAW;AAC/B,YAAI,WAAW,CAAA;AACf,YAAI,OAAO;AACX,WAAG;AACC,mBAAS,KAAK,KAAK,MAAM,IAAI;AAC7B,iBAAO,KAAK;AAAA,QACxB,SAAiB,KAAK;AACd,iBAAS,QAAO;AAChB,eAAO;AAAA,MACf;AAEI,YAAM,UAAU,SAAS,WAAW;AAChC,YAAI,KAAK,KAAK,aAAa;AACvB,eAAK,OAAO,KAAK,KAAK,YAAY,KAAK,MAAM,KAAK,WAAW,OAAO,IAAI;AAAA,QACpF;AAAA,MACA;AAGI,eAAS,OAAOR,UAAS1B,QAAO;AAC5B,aAAK,UAAU0B;AACf,aAAK,QAAQ1B;AACb,aAAK,SAAS,CAAA;AACd,aAAK,QAAQ;AACb,aAAK,YAAY;AACjB,aAAK,YAAY;MACzB;AAGI,aAAO,UAAU,UAAU,SAAS,YAAY;AAC5C,YAAI,SAAS,KAAK;AAClB,YAAI,QAAQ,KAAK;AACjB,YAAI,YAAY,KAAK;AAErB,iBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,cAAI,QAAQ,OAAO,CAAC;AAEpB,cAAI,MAAM,YAAY;AAClB,kBAAM,OAAM;AACZ,gBAAI,MAAM,SAAS,OAAO,MAAM;AAE5B,kBAAI,WAAW,MAAM;AACrB,uBAAS,IAAI,SAAS,QAAQ,OAAO;AACjC,oBAAI,OAAO,SAAS,CAAC;AACrB,qBAAK,SAAS,MAAM,KAAK;AAAA,cACjD;AAGoB,kBAAI,MAAM,cAAc,KAAK,OAAO;AAEhC,oBAAI,MAAM,MAAM,KAAK;AACrB,iBAAC,KAAK,UAAU,GAAG,IAAI,KAAK,UAAU,GAAG,KAAK,CAAA,GAAI,KAAK,KAAK;AAAA,cACpF;AAAA,YACA;AAAA,UAEA,OAAmB;AAEH,gBAAI,MAAM,MAAM,KAAK,QAAQ,MAAM,GAAG;AACtC,gBAAI,OAAO,QAAQ,UAAU;AACzB,mBAAK,UAAU,KAAK,KAAK;AACzB;AAAA,YACpB;AAGgB,gBAAI,MAAM,GAAG,GAAG;AACZ,oBAAM,GAAG,EAAE,KAAK,KAAK;AAErB,kBAAI,UAAU,eAAe,GAAG,GAAG;AAC/B,oBAAI,QAAQ,UAAU,GAAG;AACzB,yBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,sBAAI,QAAQ,MAAM,CAAC;AACnB,uBAAK,SAAS,OAAO,KAAK;AAAA,gBACtD;AAAA,cACA;AAAA,YACA,OAAuB;AACH,oBAAM,GAAG,IAAI,CAAC,KAAK;AACnB,mBAAK,QAAQ,GAAG;AAAA,YACpC;AAAA,UACA;AAAA,QACA;AAAA,MACA;AAEI,aAAO,UAAU,UAAU,SAAS,KAAK;AACrC,YAAI,QAAQ,KAAK,QAAQ,OAAO,GAAG,KAAK,CAAA;AAExC,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,cAAI,IAAI,MAAM,CAAC;AACf,cAAI,WAAW,KAAK,MAAM,GAAG;AAC7B,cAAI,IAAI,IAAI,MAAM,GAAG,GAAG,KAAK,OAAO,QAAQ;AAC5C,eAAK,OAAO,KAAK,CAAC;AAAA,QAC9B;AAAA,MACA;AAEI,aAAO,UAAU,WAAW,SAAS,MAAM,OAAO;AAC9C,YAAI,OAAO,KAAK,UAAU,KAAK;AAC/B,aAAK,OAAO,KAAK,IAAI;AAAA,MAC7B;AAGI,eAAS,QAAQ,OAAO,OAAO;AAC3B,aAAK,QAAQ;AACb,aAAK,QAAQ,SAAS,KAAK,MAAM,CAAC,EAAE;AACpC,YAAI,SAAS,KAAK,SAAS,CAAA;AAC3B,aAAK,MAAM,QAAQ,SAAS,MAAM;AAC9B,cAAI,CAAC,OAAO,eAAe,KAAK,IAAI,GAAG;AACnC,mBAAO,KAAK,IAAI,IAAI,CAAA;AAAA,UACpC;AACY,iBAAO,KAAK,IAAI,EAAE,KAAK,IAAI;AAAA,QACvC,CAAS;AAAA,MACT;AAGI,cAAQ,eAAe,SAAS,OAAO,OAAO;AAC1C,YAAI,QAAQ,MAAM;AAClB,YAAI,MAAM,aAAa;AACrB,kBAAQ,MAAM;AACd,kBAAQ,MAAM;AAAA,QACxB;AACQ,YAAI,QAAQ,MAAM,IAAI,SAAU,GAAG;AAAE,iBAAQ,IAAI,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW;AAAA,SAAK;AAC3F,YAAI,IAAI,IAAI,QAAQ,OAAO,KAAK;AAChC,UAAE,QAAQ;AACV,eAAO;AAAA,MACf;AAGI,eAAS,cAAc;AACrB,aAAK,MAAM,EAAE;AAAA,MACnB;AAEI,kBAAY,UAAU,QAAQ,SAAS,MAAM,OAAO;AAChD,aAAK,SAAS;AACd,aAAK,QAAQ;AACb,aAAK,OAAO,QAAQ,MAAM,OAAO;AACjC,aAAK,gBAAgB,QAAQ,CAAC,MAAM,MAAM;AAAA,MAClD;AAEI,kBAAY,UAAU,OAAO,WAAW;AACpC,YAAI,KAAK,QAAQ,KAAK,OAAO,QAAQ;AACjC,cAAI,KAAK,KAAK,OAAO,KAAK,OAAO;AACjC,cAAI,OAAO,MAAM;AACf,iBAAK,QAAQ;AACb,iBAAK,gBAAgB,KAAK;AAAA,UACxC;AACY,iBAAO,EAAC,OAAO,GAAE;AAAA,QAC7B;AAAA,MACA;AAEI,kBAAY,UAAU,OAAO,WAAW;AACtC,eAAO;AAAA,UACL,MAAM,KAAK;AAAA,UACX,KAAK,KAAK,QAAQ,KAAK;AAAA,QAC/B;AAAA,MACA;AAEI,kBAAY,UAAU,cAAc,SAAS,OAAO,SAAS;AAGzD,YAAI,SAAS,KAAK;AAClB,YAAI,OAAO,WAAW,UAAU;AAC5B,cAAI,QAAQ,OACP,MAAM,IAAI,EACV;AAAA,YACG,KAAK,IAAI,GAAG,KAAK,OAAO,CAAC;AAAA,YACzB,KAAK;AAAA;AAGb,cAAI,gBAAgB,OAAO,QAAQ,MAAM,KAAK,KAAK;AACnD,cAAI,kBAAkB,GAAI,iBAAgB,OAAO;AACjD,cAAI,MAAM,KAAK,QAAQ,KAAK;AAC5B,cAAI,iBAAiB,OAAO,KAAK,IAAI,EAAE;AACvC,qBAAW,cAAc,KAAK,OAAO,UAAU,MAAM;AACrD,qBAAW,MACN,IAAI,SAAS,MAAM,GAAG;AACnB,mBAAO,IAAI,KAAK,OAAO,MAAM,SAAS,IAAI,GAAG,cAAc,IAAI,MAAM;AAAA,UACzF,GAAmB,IAAI,EACN,KAAK,IAAI;AACd,qBAAW,OAAO,IAAI,IAAI,iBAAiB,GAAG,IAAI;AAClD,iBAAO;AAAA,QACnB,OAAe;AACH,iBAAO,UAAU,gBAAgB,KAAK,QAAQ;AAAA,QAC1D;AAEQ,iBAAS,IAAI,GAAG,QAAQ;AACpB,cAAI,IAAI,OAAO,CAAC;AAChB,iBAAO,MAAM,SAAS,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,QAC5D;AAAA,MACA;AAEI,eAAS,OAAO,OAAO,OAAO,SAAS;AACnC,YAAI,iBAAiB,SAAS;AAC1B,cAAI0B,WAAU;AACd,cAAI,UAAU;AAAA,QAC1B,OAAe;AACH,cAAIA,WAAU,QAAQ,aAAa,OAAO,KAAK;AAAA,QAC3D;AACQ,aAAK,UAAUA;AAGf,aAAK,UAAU;AAAA,UACX,aAAa;AAAA,UACb,OAAOA,SAAQ,SAAS,IAAI;AAAA;AAEhC,iBAAS,OAAQ,WAAW,IAAK;AAC7B,eAAK,QAAQ,GAAG,IAAI,QAAQ,GAAG;AAAA,QAC3C;AAGQ,aAAK,QAAQ,KAAK,QAAQ;AAC1B,aAAK,aAAa;AAGlB,YAAI,SAAS,IAAI,OAAOA,UAAS,CAAC;AACtB,aAAK,QAAQ,CAAC,MAAM;AAGhC,eAAO,MAAMA,SAAQ,KAAK,IAAI,CAAA;AAC9B,eAAO,QAAQA,SAAQ,KAAK;AAE5B,eAAO,QAAO;AACd,aAAK,UAAU;AAAA,MACvB;AAGI,aAAO,OAAO,CAAA;AAEd,aAAO,UAAU,OAAO,SAAS,OAAO;AACpC,YAAI,QAAQ,KAAK;AACjB,cAAM,MAAM,OAAO,KAAK,UAAU;AAElC,YAAI;AACJ,eAAO,MAAM;AACT,cAAI;AACA,oBAAQ,MAAM,KAAI;AAClB,gBAAI,CAAC,OAAO;AACR;AAAA,YACpB;AAAA,UACA,SAAqB,GAAG;AAGR,gBAAI,aAAa,IAAI,OAAO,KAAK,SAAS,KAAK,UAAU,CAAC;AAC1D,iBAAK,MAAM,KAAK,UAAU;AAC1B,gBAAI,MAAM,IAAI,MAAM,KAAK,iBAAiB,CAAC,CAAC;AAC5C,gBAAI,SAAS,KAAK;AAClB,gBAAI,QAAQ,EAAE;AACd,kBAAM;AAAA,UACtB;AAEY,cAAI,SAAS,KAAK,MAAM,KAAK,OAAO;AAGpC,cAAI,CAAC,KAAK,QAAQ,aAAa;AAC3B,mBAAO,KAAK,MAAM,KAAK,UAAU,CAAC;AAAA,UAClD;AAEY,cAAI,IAAI,KAAK,UAAU;AACvB,cAAI,aAAa,IAAI,OAAO,KAAK,SAAS,CAAC;AAC3C,eAAK,MAAM,KAAK,UAAU;AAG1B,cAAI,UAAU,MAAM,SAAS,SAAY,MAAM,OAAO,MAAM;AAC5D,cAAI,QAAQ,MAAM,gBAAgB,cAAc,MAAM,QAAQ;AAC9D,cAAI,YAAY,OAAO;AACvB,mBAAS,IAAI,UAAU,QAAQ,OAAO;AAClC,gBAAI,QAAQ,UAAU,CAAC;AACvB,gBAAI,SAAS,MAAM,KAAK,QAAQ,MAAM,GAAG;AAGzC,gBAAI,OAAO,OAAO,OAAO,KAAK,KAAK,IAC/B,OAAO,OAAO,OAAO,SAAS,MAAM,OACtB,OAAO,YAAY,SAAS;AAE1C,kBAAI,OAAO,MAAM,UAAU,EAAC,MAAM,OAAO,OAAc,SAAS,MAAM,WAAW,IAAI,EAAC,CAAC;AACvF,yBAAW,OAAO,KAAK,IAAI;AAAA,YAC/C;AAAA,UACA;AAUY,qBAAW,QAAO;AAGlB,cAAI,WAAW,OAAO,WAAW,GAAG;AAEhC,gBAAI,MAAM,IAAI,MAAM,KAAK,YAAY,KAAK,CAAC;AAC3C,gBAAI,SAAS,KAAK;AAClB,gBAAI,QAAQ;AACZ,kBAAM;AAAA,UACtB;AAGY,cAAI,KAAK,QAAQ,aAAa;AAC5B,mBAAO,aAAa,MAAM,KAAI;AAAA,UAC5C;AAEY,eAAK;AAAA,QACjB;AACQ,YAAI,QAAQ;AACV,eAAK,aAAa,MAAM,KAAI;AAAA,QACtC;AAGQ,aAAK,UAAU,KAAK,OAAM;AAG1B,eAAO;AAAA,MACf;AAEI,aAAO,UAAU,mBAAmB,SAAS,YAAY;AACrD,YAAI,cAAc;AAGlB,YAAI,QAAQ,WAAW;AACvB,YAAI,OAAO;AACP,yBAAe,WAAW,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,IAAI;AAC1D,yBAAe,KAAK,MAAM,YAAY,OAAO,cAAc;AAAA,QACvE,OAAe;AACH,yBAAe;AACf,yBAAe,WAAW;AAAA,QACtC;AACQ,eAAO,KAAK,kBAAkB,cAAc,YAAY;AAAA,MAChE;AAEI,aAAO,UAAU,cAAc,SAAS,OAAO;AAC3C,YAAI,gBAAgB,MAAM,OAAO,MAAM,OAAO,aAAa,MAAM,KAAK,UAAU,MAAM,UAAU,SAAY,MAAM,QAAQ,KAAK;AAC/H,YAAI,eAAe,KAAK,MAAM,YAAY,OAAO,cAAc;AAC/D,eAAO,KAAK,kBAAkB,cAAc,YAAY;AAAA,MAChE;AAEI,aAAO,UAAU,oBAAoB,SAAS,cAAc,cAAc;AACtE,YAAI,QAAQ,CAAA;AACZ,cAAM,KAAK,YAAY;AACvB,YAAI,kBAAkB,KAAK,MAAM,SAAS;AAC1C,YAAI,aAAa,KAAK,MAAM,eAAe;AAC3C,YAAI,kBAAkB,WAAW,OAC5B,OAAO,SAAS,OAAO;AACpB,cAAI,aAAa,MAAM,KAAK,QAAQ,MAAM,GAAG;AAC7C,iBAAO,cAAc,OAAO,eAAe;AAAA,QAC3D,CAAa;AAEL,YAAI,gBAAgB,WAAW,GAAG;AAC9B,gBAAM,KAAK,gBAAgB,eAAe,2EAA2E;AACrH,eAAK,kBAAkB,WAAW,QAAQ,KAAK;AAAA,QAC3D,OAAe;AACH,gBAAM,KAAK,gBAAgB,eAAe,2DAA2D;AAIrG,cAAI,cAAc,gBACb,IAAI,SAAS,OAAO;AACjB,mBAAO,KAAK,qBAAqB,OAAO,CAAA,CAAE,KAAK,CAAC,KAAK;AAAA,UACzE,GAAmB,IAAI;AAEX,sBAAY,QAAQ,SAAS,YAAY;AACrC,gBAAI,QAAQ,WAAW,CAAC;AACxB,gBAAI,aAAa,MAAM,KAAK,QAAQ,MAAM,GAAG;AAC7C,gBAAI,gBAAgB,KAAK,iBAAiB,UAAU;AACpD,kBAAM,KAAK,OAAO,gBAAgB,YAAY;AAC9C,iBAAK,kBAAkB,YAAY,KAAK;AAAA,UACxD,GAAe,IAAI;AAAA,QACnB;AACQ,cAAM,KAAK,EAAE;AACb,eAAO,MAAM,KAAK,IAAI;AAAA,MAC9B;AAEI,aAAO,UAAU,oBAAoB,SAAS,YAAY,OAAO;AAC7D,YAAI;AACJ,YAAI,mBAAmB;AACvB,iBAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,cAAI,QAAQ,WAAW,CAAC;AACxB,cAAI,UAAU,MAAM,KAAK,SAAS,MAAM,GAAG;AAC3C,cAAI,YAAY,aAAa;AACzB;AAAA,UAChB,OAAmB;AACH,gBAAI,mBAAmB,GAAG;AACtB,oBAAM,KAAK,WAAW,mBAAmB,+BAA+B;AAAA,YAC5F;AACgB,+BAAmB;AACnB,kBAAM,KAAK,SAAS,OAAO;AAAA,UAC3C;AACY,wBAAc;AAAA,QAC1B;AAAA,MACA;AAEI,aAAO,UAAU,mBAAmB,SAAS,QAAQ;AACjD,eAAO,qBAAqB,MAAM;AAAA,MAC1C;AAaI,aAAO,UAAU,uBAAuB,SAAS,OAAO,SAAS;AAC7D,YAAI,QAAQ,QAAQ,KAAK,MAAM,IAAI;AAI/B,iBAAO;AAAA,QACnB;AACQ,YAAI,MAAM,SAAS,WAAW,GAAG;AAC7B,iBAAO,CAAC,KAAK;AAAA,QACzB;AACQ,YAAI,YAAY,MAAM,SAAS,CAAC;AAChC,YAAI,eAAe,CAAC,KAAK,EAAE,OAAO,OAAO;AACzC,YAAI,cAAc,KAAK,qBAAqB,WAAW,YAAY;AACnE,YAAI,gBAAgB,MAAM;AACtB,iBAAO;AAAA,QACnB;AACQ,eAAO,CAAC,KAAK,EAAE,OAAO,WAAW;AAAA,MACzC;AAEI,aAAO,UAAU,OAAO,WAAW;AAC/B,YAAI,SAAS,KAAK,MAAM,KAAK,OAAO;AACpC,eAAO,aAAa,KAAK;AACzB,eAAO;AAAA,MACf;AAEI,aAAO,UAAU,UAAU,SAAS,QAAQ;AACxC,YAAI1B,SAAQ,OAAO;AACnB,aAAK,UAAUA;AACf,aAAK,MAAMA,MAAK,IAAI;AACpB,aAAK,MAAM,OAAOA,SAAQ,CAAC;AAC3B,aAAK,aAAa,OAAO;AAGzB,aAAK,UAAU,KAAK,OAAM;AAAA,MAClC;AAGI,aAAO,UAAU,SAAS,SAASA,QAAO;AACtC,YAAI,CAAC,KAAK,QAAQ,aAAa;AAC3B,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAC1E;AAGQ,aAAK,QAAQ,KAAK,MAAMA,MAAK,CAAC;AAAA,MACtC;AAEI,aAAO,UAAU,SAAS,WAAW;AAEjC,YAAI,iBAAiB,CAAA;AACrB,YAAI,QAAQ,KAAK,QAAQ;AACzB,YAAI,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAC7C,eAAO,OAAO,QAAQ,SAAU,GAAG;AAC/B,cAAI,EAAE,KAAK,SAAS,SACT,EAAE,QAAQ,EAAE,KAAK,QAAQ,UACzB,EAAE,cAAc,KAChB,EAAE,SAAS,OAAO,MAAM;AAC/B,2BAAe,KAAK,CAAC;AAAA,UACrC;AAAA,QACA,CAAS;AACD,eAAO,eAAe,IAAI,SAAS,GAAG;AAAC,iBAAO,EAAE;AAAA,SAAO;AAAA,MAC/D;AAEI,eAAS,qBAAqB,QAAQ;AAClC,YAAI,OAAO,OAAO;AAClB,YAAI,SAAS,UAAU;AACnB,iBAAO;AAAA,QACnB,WAAmB,SAAS,UAAU;AAC1B,cAAI,OAAO,SAAS;AAChB,mBAAO,KAAK,UAAU,OAAO,OAAO;AAAA,UACpD,WAAuB,kBAAkB,QAAQ;AACjC,mBAAO,wBAAwB;AAAA,UAC/C,WAAuB,OAAO,MAAM;AACpB,mBAAO,OAAO,OAAO;AAAA,UACrC,WAAuB,OAAO,MAAM;AACpB,mBAAO,oBAAoB,OAAO,OAAO,IAAI;AAAA,UAC7D,OAAmB;AACH,kBAAM,IAAI,MAAM,0BAA0B,MAAM;AAAA,UAChE;AAAA,QACA;AAAA,MACA;AAEI,eAAS,sBAAsB,QAAQ;AACnC,YAAI,OAAO,OAAO;AAClB,YAAI,SAAS,UAAU;AACnB,iBAAO;AAAA,QACnB,WAAmB,SAAS,UAAU;AAC1B,cAAI,OAAO,SAAS;AAChB,mBAAO,KAAK,UAAU,OAAO,OAAO;AAAA,UACpD,WAAuB,kBAAkB,QAAQ;AACjC,mBAAO,OAAO,SAAQ;AAAA,UACtC,WAAuB,OAAO,MAAM;AACpB,mBAAO,MAAM,OAAO;AAAA,UACpC,WAAuB,OAAO,MAAM;AACpB,mBAAO,MAAM,OAAO,OAAO,IAAI,IAAI;AAAA,UACnD,OAAmB;AACH,kBAAM,IAAI,MAAM,0BAA0B,MAAM;AAAA,UAChE;AAAA,QACA;AAAA,MACA;AAEI,aAAO;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA;IAGR,CAAC;AAAA;;;;;;;ACljBD,MAAI,kBAAmBiC,SAAQA,MAAK,mBAAoB,SAAU,KAAK;AACnE,WAAQ,OAAO,IAAI,aAAc,MAAM,EAAE,WAAW,IAAG;AAAA,EAC3D;AACA,SAAO,eAAeE,OAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,QAAA,QAAgB;AAChB,QAAM,WAAW1B,cAAA;AACjB,QAAM,YAAY,gBAAgBC,gBAAoB;AACtD,QAAM,eAAeC,kBAAA;AACrB,QAAM,YAAY,gBAAgByB,gBAAkB;AACpD,QAAM,QAAQ,UAAU,QAAQ,QAAQ,aAAa,UAAU,OAAO;AACtE,QAAM,eAAe;AACrB,QAAMC,UAAQ,CAAC,UAAU;AACrB,QAAI,MAAM,KAAI,MAAO,IAAI;AACrB,aAAO;AAAA,QACH,UAAU;AAAA,UACN,KAAK;AAAA,UACL,OAAO;AAAA;QAEX,MAAM;AAAA;IAElB;AACI,UAAM,SAAS,IAAI,UAAU,QAAQ,OAAO,KAAK;AACjD,QAAI;AACJ,QAAI;AACA,gBAAU,OAAO,KAAK,KAAK,EAAE;AAAA,IACrC,SACW,OAAO;AACV,UAAI,QAAQ,UAAU,QAAQ,UAAU,SAAS,SAAS,MAAM,aAAa,YACzE,QAAQ,UAAU,QAAQ,UAAU,SAAS,SAAS,MAAM,YAAY,UAAU;AAClF,cAAM,QAAQ,MAAM,QAAQ,MAAM,YAAY;AAC9C,YAAI,CAAC,OAAO;AACR,gBAAM;AAAA,QACtB;AACY,cAAM,IAAI,SAAS,YAAY,wBAAwB,MAAM,OAAO,IAAI,WAAW,MAAM,OAAO,MAAM,IAAI,MAAM,QAAQ,OAAO,MAAM,OAAO,IAAI,GAAG,OAAO,MAAM,OAAO,MAAM,CAAC;AAAA,MAC1L;AACQ,YAAM;AAAA,IACd;AACI,QAAI,QAAQ,WAAW,GAAG;AACtB,YAAM,IAAI,MAAM,oBAAoB;AAAA,IAC5C;AACI,QAAI,QAAQ,SAAS,GAAG;AACpB,YAAM,cAAc,KAAK,UAAU,QAAQ,CAAC,CAAC;AAC7C,iBAAW,UAAU,SAAS;AAE1B,YAAI,KAAK,UAAU,MAAM,MAAM,aAAa;AACxC,gBAAM,IAAI,SAAS,UAAU,oBAAoB;AAAA,QACjE;AAAA,MACA;AAAA,IACA;AACI,UAAM,eAAc,GAAI,aAAa,YAAY,QAAQ,CAAC,CAAC;AAC3D,WAAO;AAAA,EACX;AACAF,QAAA,QAAgBE;;;;;;;;;ACpDhB,WAAO,eAAcpB,WAAU,cAAc,EAAE,OAAO,MAAM;AAC5DA,cAAA,YAAoB;AACpB,UAAM,QAAQ,CAAC,OAAO,WAAW;AAC7B,UAAI,WAAW,UAAU;AACrB,eAAO,IAAI,KAAK;AAAA,MACxB;AACI,UAAI,WAAW,UAAU;AACrB,eAAO,IAAI,KAAK;AAAA,MACxB;AACI,aAAO;AAAA,IACX;AACA,UAAM,sBAAsB,CAAC,eAAe;AACxC,UAAI,WAAW,SAAS,qBAAqB;AACzC,YAAI,WAAW,UAAU,OAAO,WAAW,UAAU,UAAU;AAC3D,iBAAO,MAAM,WAAW,OAAO,WAAW,MAAM;AAAA,QAC5D;AACQ,eAAO,OAAO,WAAW,KAAK;AAAA,MACtC;AACI,UAAI,WAAW,SAAS,mBAAmB;AACvC,eAAO,OAAO,WAAW,KAAK;AAAA,MACtC;AACI,UAAI,WAAW,SAAS,mBAAmB;AACvC,cAAM,EAAE,KAAK,cAAc,KAAK,aAAY,IAAK,WAAW;AAC5D,eAAO,GAAG,eAAe,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,eAAe,MAAM,GAAG;AAAA,MACrF;AACI,UAAI,WAAW,SAAS,mBAAmB;AACvC,eAAO;AAAA,MACf;AACI,YAAM,IAAI,MAAM,sBAAsB;AAAA,IAC1C;AACA,UAAM,eAAe,CAAC,QAAQ;AAC1B,UAAI,IAAI,SAAS,OAAO;AACpB,cAAM,IAAI,MAAM,4BAA4B;AAAA,MACpD;AACI,YAAM,EAAE,YAAY,OAAO,SAAQ,IAAK;AACxC,UAAI,MAAM,SAAS,iBAAiB;AAChC,eAAO,oBAAoB,UAAU;AAAA,MAC7C;AACI,YAAM,OAAO,MAAM,SAAS,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI,MAAM;AACpE,YAAM,SAAS,IAAI,OAAO,WAAW,SAAS,QAAQ,SAAS,SAAS,GAAG;AAC3E,aAAO,OAAO,SAAS,WAAW,SAAS,oBAAoB,UAAU;AAAA,IAC7E;AACA,UAAMqB,aAAY,CAAC,QAAQ;AACvB,UAAI,IAAI,SAAS,2BAA2B;AACxC,YAAI,EAAE,cAAc,IAAI,aAAa;AACjC,gBAAM,IAAI,MAAM,kCAAkC;AAAA,QAC9D;AACQ,YAAI,CAAC,IAAI,SAAS,KAAK;AACnB,gBAAM,IAAI,MAAM,wBAAwB;AAAA,QACpD;AACQ,cAAM,WAAW,IAAI,OAAO,IAAI,WAAW,SAAS,SAAS,IAAI,SAAS,QAAQ,EAAE;AACpF,cAAM,SAAS,IAAI,OAAO,IAAI,SAAS,MAAM,IAAI,WAAW,SAAS,MAAM,CAAC;AAC5E,eAAO,IAAI,QAAQ,OAAOrB,UAAQ,WAAW,IAAI,UAAU,CAAC,GAAG,MAAM;AAAA,MAC7E;AACI,UAAI,IAAI,SAAS,OAAO;AACpB,eAAO,aAAa,GAAG;AAAA,MAC/B;AACI,UAAI,IAAI,SAAS,qBAAqB;AAClC,YAAI,WAAW;AACf,YAAI,IAAI,SAAS,SAAS,mBAAmB;AACzC,sBAAY,IAAI,OAAO,IAAI,SAAS,SAAS,QAAQ,IAAI,KAAK,SAAS,GAAG;AAC1E,sBAAY,IAAI,SAAS;AACzB,sBAAY,IAAI,OAAO,IAAI,MAAM,SAAS,QAAQ,IAAI,SAAS,SAAS,GAAG;AAAA,QACvF,OACa;AACD,qBAAW,IAAI,OAAO,IAAI,MAAM,SAAS,QAAQ,IAAI,KAAK,SAAS,GAAG;AAAA,QAClF;AACQ,eAAO,IAAG,GAAIA,UAAQ,WAAW,IAAI,IAAI,CAAC,GAAG,QAAQ,IAAG,GAAIA,UAAQ,WAAW,IAAI,KAAK,CAAC;AAAA,MACjG;AACI,UAAI,IAAI,SAAS,iBAAiB;AAC9B,gBAAS,IAAI,aAAa,QAAQ,SAAS,IAAI,gBAAgBA,UAAQ,WAAW,IAAI,OAAO;AAAA,MACrG;AACI,UAAI,IAAI,SAAS,mBAAmB;AAChC,eAAO;AAAA,MACf;AACI,YAAM,IAAI,MAAM,sBAAsB;AAAA,IAC1C;AACAA,cAAA,YAAoBqB;AAAA;;;;;;;;AC7EpB,SAAO,eAAeC,MAAS,cAAc,EAAE,OAAO,MAAM;AAC5DA,OAAA,OAAe;AACf,QAAM,WAAW9B,cAAA;AACjB,QAAM+B,SAAO,CAAC,KAAK,YAAY;AAC3B,YAAO,GAAI,SAAS,QAAQ,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;AAAA,EAC3D;AACAD,OAAA,OAAeC;;;;;;;;ACNf,WAAO,eAAcvB,WAAU,cAAc,EAAE,OAAO,MAAM;AAC5DA,cAAA,OAAeA,UAAA,YAAoBA,kBAAgBA,UAAA,2BAAmCA,UAAA,YAAoBA,mBAAiBA,UAAA,cAAsBA,UAAA,YAAoB;AACrK,QAAI,WAAWR,cAAA;AACf,WAAO,eAAeQ,WAAS,aAAa,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,SAAS;AAAA,IAAU,EAAE,CAAE;AACjH,WAAO,eAAeA,WAAS,eAAe,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,SAAS;AAAA,IAAY,EAAE,CAAE;AACrH,QAAI,WAAWP,cAAA;AACf,WAAO,eAAeO,WAAS,UAAU,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,SAAS;AAAA,IAAO,EAAE,CAAE;AAC3G,QAAI,cAAcN,iBAAA;AAClB,WAAO,eAAeM,WAAS,aAAa,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,YAAY;AAAA,IAAU,EAAE,CAAE;AACpH,QAAI,6BAA6BmB,gCAAA;AACjC,WAAO,eAAenB,WAAS,4BAA4B,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,2BAA2B;AAAA,IAAyB,EAAE,CAAE;AACjK,QAAI,UAAUwB,aAAA;AACd,WAAO,eAAexB,WAAS,SAAS,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,QAAQ;AAAA,IAAM,EAAE,CAAE;AACxG,QAAI,cAAcyB,iBAAA;AAClB,WAAO,eAAezB,WAAS,aAAa,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,YAAY;AAAA,IAAU,EAAE,CAAE;AACpH,QAAI,SAAS0B,YAAA;AACb,WAAO,eAAe1B,WAAS,QAAQ,EAAE,YAAY,MAAM,KAAK,WAAY;AAAE,aAAO,OAAO;AAAA,IAAK,EAAE,CAAE;AAAA;;;;ACiB9F,MAAM,wBAAwB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,YACA,OACA,qBACA,YACA,WACA,gBACA,OACA;AACA,SAAK,uBAAuB;AAC5B,SAAK,cAAc;AACnB,SAAK,aAAa;AAClB,SAAK,kBAAkB;AACvB,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,WAAW,MAAM,OAAO,QAAQ;AAAA,EACvC;AAAA,EAEA,eACE,KACA,OACA,qBAA8B,OAC9B;AACA,YAAQ,IAAI,MAAA;AAAA,MACV,KAAK;AACH,aAAK,8BAA8B,KAAK,KAAK;AAC7C;AAAA,MAEF,KAAK;AACH,aAAK,gCAAgC,KAAK,KAAK;AAC/C;AAAA,MAEF,KAAK;AACH,aAAK,sCAAsC,KAAK,KAAK;AACrD;AAAA,MAEF,KAAK;AACH,aAAK,4BAA4B,KAAK,KAAK;AAC3C;AAAA,MAEF,KAAK;AACH,aAAK,kBAAkB,KAAK,KAAK;AACjC;AAAA,MAEF;AACE,YAAI,oBAAoB;AACtB,gBAAM,IAAI2B,SAAAA,sBAAuB,IAAY,IAAI;AAAA,QACnD;AACA;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,8BACE,MACA,QACA;AAAA,EAEF;AAAA,EAEA,gCACE,KACA,OACA;AACA,UAAM,eAAe,IAAI,SAAS;AAClC,UAAM,MAAM,CAAC,aAAa;AACxB,UAAI,iBAAiB,OAAO;AAC1B,aAAK,eAAe,IAAI,MAAM,QAAQ;AACtC,aAAK,eAAe,IAAI,OAAO,QAAQ;AAAA,MACzC,OAAO;AACL,iBAAS,QAAQ,CAAC,eAAe;AAC/B,eAAK,eAAe,IAAI,MAAM,UAAU;AAAA,QAC1C,CAAC;AACD,iBAAS,QAAQ,CAAC,eAAe;AAC/B,eAAK,eAAe,IAAI,OAAO,UAAU;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,sCACE,KACA,OACA;AACA,UAAM,MAAM,CAAC,aAAa;AACxB,WAAK,eAAe,IAAI,YAAY,QAAQ;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,4BACE,KACA,OACA;AACA,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,SAAS,aAAa,KAAK;AAC1C,YAAM,SAAS,CAAC,aAAa;AAC3B,aAAK,eAAe,IAAI,SAAS,QAAQ;AAAA,MAC3C,CAAC;AAAA,IACH,OAAO;AACL,YAAM,MAAM,CAAC,aAAa;AACxB,aAAK,eAAe,IAAI,SAAS,QAAQ;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,kBAAkB,KAAe,OAAmD;AAClF,UAAM,EAAE,YAAY,OAAO,SAAA,IAAa;AACxC,YAAQ,MAAM,MAAA;AAAA,MACZ,KAAK;AACH,aAAK,4BAA4B,OAAO,YAAY,UAAU,KAAK;AACnE;AAAA,MAEF,KAAK;AACH,aAAK,oBAAoB,OAAO,YAAY,UAAU,KAAK;AAC3D;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,wBAAwB;AACtB,QACE,KAAK,UACL,yBAAyB,KAAK,UAC9B,KAAK,OAAO,+BAA+B,KAC3C;AACA,YAAM,cAAwB,CAAA;AAC9B,WAAK,OAAO,oBAAoB,QAAQ,CAAC,IAAI,MAAM;AACjD,oBAAY,KAAK,CAAW;AAAA,MAC9B,CAAC;AACD,UACE,+BAA+B,KAAK,UACpC,KAAK,OAAO,qCAAqC,KACjD;AACA,aAAK,OAAO,0BAA0B,QAAQ,CAAC,IAAI,MAAM;AACvD,sBAAY,KAAK,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AACA,aAAO,MAAM,KAAK,IAAI,IAAI,WAAW,CAAC,EAAE;AAAA,QACtC,CAAC,MAAM,CAAC,KAAK,mBAAmB,KAAK,gBAAgB,SAAS,CAAC;AAAA,MAAA;AAAA,IAEnE;AACA,WAAO,OAAO,QAAQ,KAAK,qBAAqB,IAAA,CAAK,EAClD,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,mBAAmB,KAAK,gBAAgB,SAAS,IAAI,CAAC,EAC/E,IAAI,CAAC,CAAA,EAAG,MAAM,MAAM,MAAM;AAAA,EAC/B;AAAA,EAEA,4BACE,QACA,YACA,UACA,OACA;AACA,UAAM,oBAAoB,KAAK,sBAAA;AAC/B,UAAM,kBAA2C,YAAY;AAAA,MAC3D,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU,EAAE,OAAO,GAAG,KAAK,EAAA;AAAA,IAAE;AAE/B,sBAAkB,QAAQ,CAAC,eAAe;AACxC,YAAM,YAAwB;AAAA,QAC5B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU,EAAE,OAAO,GAAG,KAAK,EAAA;AAAA,QAC3B,QAAQ;AAAA,MAAA;AAEV,YAAM,QAAQ,CAAC,MAAM;AACnB,aAAK,oBAAoB,WAAW,YAAY,iBAAiB,GAAG,QAAW,IAAI;AAAA,MACrF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,oBACE,OACA,YACA,UACA,OACA,UACA,aAAsB,OACtB;AACA,UAAM,aAAa,CAAC,WAChB,KAAK,qBAAqB,IAAI,MAAM,IAAI,IACxC,SAAS,MAAM,oBAAoB,IAAI,MAAM,IAAI;AACrD,QACE,CAAC,cACA,CAAC,YAAY,KAAK,mBAAmB,CAAC,KAAK,gBAAgB,SAAS,MAAM,IAAI,GAC/E;AACA,UAAI,MAAM,KAAK,SAAS,GAAG,GAAG;AAC5B,cAAM,QAAQ,MAAM,KACjB,MAAM,GAAG,EACT,OAAO,CAAC,MAAM,aAAa,OAAO,KAAK,EAAE,OAAO,SAAS,CAAC,EAC1D,IAAI,CAAC,MAAM,EAAE,MAAM;AACtB,cAAM,eAAe,MAAM,MAAA;AAC3B,YAAI,CAAC,gBAAgB,MAAM,WAAW,EAAG;AACzC,aAAK;AAAA,UACH;AAAA,UACA,MAAM,KAAK,GAAG;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AACA;AAAA,IACF;AACA,YAAQ,WAAW,MAAA;AAAA,MACjB,KAAK;AACH,aAAK,2BAA2B,YAAY,YAAY,UAAU,KAAK;AACvE;AAAA,MACF,KAAK;AACH,aAAK,6BAA6B,YAAY,YAAY,UAAU,OAAO,UAAU;AACrF;AAAA,MACF,KAAK;AACH,aAAK,2BAA2B,YAAY,YAAY,UAAU,KAAK;AACvE;AAAA,MACF,KAAK;AACH,aAAK,2BAA2B,YAAY,YAAY,UAAU,KAAK;AACvE;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,2BACE,cACA,iBACA,YACA,UACA,OACA,UACA;AACA,QAAI,CAAC,YAAY,CAAC,KAAK,OAAQ;AAC/B,UAAM,cAAc,YAAa,KAAK;AACtC,UAAM,8BAA8B,YAAY,sBAAsB,IAAI,YAAY;AACtF,QAAI,CAAC,4BAA6B;AAClC,gCAA4B,KAAA;AAC5B,UAAM,MAAM,4BAA4B,SAAS,KAAK,WAAW;AACjE,UAAM,eAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU,EAAE,OAAO,GAAG,KAAK,EAAA;AAAA,MAC3B,QAAQ;AAAA,IAAA;AAEV,UAAM,eAAe,4BAA4B,aAAA;AACjD,SAAK,oBAAoB,cAAc,YAAY,UAAU,KAAY,YAAY;AACrF,UAAM,YAAY,IAAI,SAAS;AAAA,EACjC;AAAA,EAEA,2BACE,QACA,aACA,UACA,OACA;AACA,YAAQ,SAAS,UAAA;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAM,MAAM,CAAC,QAAQ;AACnB,cAAI,UAAU,MAAM;AACpB,cAAI,QAAQ,QAAQ,KAAK,EAAE;AAAA,QAC7B,CAAC;AACD;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,6BACE,QACA,YACA,UACA,OACA,aAAa,OACb;AACA,QAAI,QAAQ,WAAW;AACvB,QAAI,kBAAkB;AACtB,QAAI,UAAU,MAAM;AAMlB,cAAQ,SAAS,UAAA;AAAA,QACf,KAAK;AAAA,QACL,KAAK;AACH,gBAAM;AAAA,YACJ,CAAC,YAAY,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,YACzC,CAAC,MAAM;AACL,gBAAE,MAAM,CAAC,QAAQ;AACf,oBAAI,UAAU,MAAM;AAGpB,oBAAI;AAAA,kBACF;AAAA,kBAIA,CAAC,QAAQ,MAAM;AAAA,gBAAA;AAIjB,oBAAI;AAAA,kBACF;AAAA,kBAIA,CAAC,QAAQ,MAAM;AAAA,gBAAA;AAAA,cAEnB,CAAC;AAAA,YACH;AAAA,YACA,MAAM;AACJ,oBAAM;AAAA,gBACJ,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,gBACrD,CAAC,OAAO;AACN,qBAAG,MAAM,CAAC,QAAQ;AAChB,wBAAI,UAAU,MAAM;AACpB,wBAAI,QAAQ,QAAQ,KAAK,EAAE;AAQ3B,wBAAI,WAAW,qCAAqC,CAAC,QAAQ,QAAQ,GAAG,CAAC;AAAA,kBAC3E,CAAC;AAAA,gBACH;AAAA,gBACA,CAAC,OAAO;AACN,qBAAG,MAAM,CAAC,QAAQ;AAChB,wBAAI,UAAU,MAAM;AACpB,wBAAI,QAAQ,QAAQ,KAAK,EAAE;AAC3B,wBAAI,QAAQ,QAAQ,KAAK,CAAC;AAAA,kBAC5B,CAAC;AAAA,gBACH;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAEF;AAAA,QACF,KAAK;AACH,gBAAM,MAAM,QAAQ,KAAK,CAAC;AAC1B;AAAA,QACF,KAAK;AACH,gBAAM,MAAM,QAAQ,MAAM,CAAC;AAC3B;AAAA,QACF,KAAK;AACH,gBAAM,MAAM,QAAQ,KAAK,CAAC;AAC1B;AAAA,QACF,KAAK;AACH,gBAAM,MAAM,QAAQ,MAAM,CAAC;AAC3B;AAAA,MAAA;AAEJ;AAAA,IACF;AACA,QAAI,aAAa,OAAO,SAAS,WAAW,QAAQ;AAClD,wBAAkB;AAMlB,UAAI,WAAW,WAAW,UAAU;AAClC,gBAAQ,MAAM,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAAA,MACpD,WAAW,WAAW,WAAW,UAAU;AACzC,gBAAQ,MAAM,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAAA,MACpD;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOE,cACA,aAAa,OAAO,SACpB,CAAC,WAAW,UACZ,CAAC,KAAK,IAAI,EAAE,SAAS,SAAS,QAAQ;AAAA,MACtC;AACA,cAAQ,IAAI,KAAK;AAAA,IACnB;AACA,YAAQ,OAAO,OAAA;AAAA,MACb,KAAK;AACH,gBAAQ,SAAS,UAAA;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AAEH,gBAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAE9C,kBAAI,YAAY,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK;AAE9D,0BAAY,UAAU,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG;AAC5D,kBAAI,iBAAiB;AACnB,sBAAM;AAAA,kBACJ,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,kBACrD,CAAC,MAAM;AAOL,sBAAE,SAAS,aAAa,CAAC,QAAQ,SAAS,CAAC;AAAA,kBAC7C;AAAA,kBACA,CAAC,MAAM;AACL,sBAAE,UAAU,QAAQ,SAAS;AAAA,kBAC/B;AAAA,gBAAA;AAAA,cAEJ,OAAO;AACL,sBAAM;AAAA,kBACJ,CAAC,YAAY,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,kBACzC,CAAC,MAAM;AAQL,sBAAE,SAAS,kCAAkC,CAAC,QAAQ,SAAS,CAAC;AAAA,kBAClE;AAAA,kBACA,MAAM;AACJ,0BAAM;AAAA,sBACJ,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,sBACrD,CAAC,OAAO;AAMN,2BAAG,SAAS,2BAA2B,CAAC,QAAQ,SAAS,CAAC;AAAA,sBAC5D;AAAA,sBACA,CAAC,OAAO;AACN,2BAAG,UAAU,QAAQ,SAAS;AAAA,sBAChC;AAAA,oBAAA;AAAA,kBAEJ;AAAA,gBAAA;AAAA,cAGJ;AAAA,YACF,OAAO;AACL,oBAAM,MAAM,CAAC,QAAQ;AACnB,oBAAI,iBAAiB;AACnB,wBAAM;AAAA,oBACJ,CAAC,YAAY,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,oBACzC,MAAM;AAQJ,0BAAI,SAAS,8BAA8B,CAAC,QAAQ,KAAK,CAAC;AAAA,oBAC5D;AAAA,oBACA,MAAM;AACJ,4BAAM;AAAA,wBACJ,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,wBACrD,MAAM;AAMJ,8BAAI,SAAS,wBAAwB,CAAC,QAAQ,KAAK,CAAC;AAAA,wBACtD;AAAA,wBACA,MAAM;AAMJ,8BAAI,MAAM,QAAQ,KAAK,KAAK;AAAA,wBAC9B;AAAA,sBAAA;AAAA,oBAEJ;AAAA,kBAAA;AAAA,gBAEJ,OAAO;AACL,wBAAM;AAAA,oBACJ,CAAC,YAAY,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,oBACzC,MAAM;AAQJ,0BAAI,SAAS,kCAAkC,CAAC,QAAQ,KAAK,CAAC;AAAA,oBAChE;AAAA,oBACA,MAAM;AACJ,4BAAM;AAAA,wBACJ,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,wBACrD,MAAM;AAMJ,8BAAI,SAAS,2BAA2B,CAAC,QAAQ,KAAK,CAAC;AAAA,wBACzD;AAAA,wBACA,MAAM;AACJ,8BAAI,UAAU,QAAQ,KAAK;AAAA,wBAC7B;AAAA,sBAAA;AAAA,oBAEJ;AAAA,kBAAA;AAAA,gBAEJ;AAAA,cACF,CAAC;AAAA,YACH;AACA;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,MAAM,KAAK;AAC/B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,MAAM,KAAK;AAC/B;AAAA,QAAA;AAEJ;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,UAAA;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AACH,gBAAI,YAAY;AACd,oBAAM,MAAM,CAAC,QAAQ;AACnB,oBAAI,iBAAiB;AACnB,wBAAM;AAAA,oBACJ,CAAC,YAAY,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,oBACzC,MAAM;AAQJ,0BAAI,SAAS,8BAA8B,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,oBACpE;AAAA,oBACA,MAAM;AACJ,4BAAM;AAAA,wBACJ,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,wBACrD,MAAM;AAMJ,8BAAI,SAAS,wBAAwB,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,wBAC9D;AAAA,wBACA,MAAM;AAMJ,8BAAI,MAAM,QAAQ,KAAK,OAAO,KAAK,CAAC;AAAA,wBACtC;AAAA,sBAAA;AAAA,oBAEJ;AAAA,kBAAA;AAAA,gBAEJ,OAAO;AACL,wBAAM;AAAA,oBACJ,CAAC,YAAY,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,oBACzC,MAAM;AAQJ,0BAAI,SAAS,kCAAkC,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,oBACxE;AAAA,oBACA,MAAM;AACJ,4BAAM;AAAA,wBACJ,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,KAAK,QAAQ;AAAA,wBACrD,MAAM;AAMJ,8BAAI,SAAS,2BAA2B,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,wBACjE;AAAA,wBACA,MAAM;AACJ,8BAAI,UAAU,QAAQ,KAAK;AAAA,wBAC7B;AAAA,sBAAA;AAAA,oBAEJ;AAAA,kBAAA;AAAA,gBAEJ;AAAA,cACF,CAAC;AAAA,YACH,OAAO;AACL,oBAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,YAChC;AACA;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,MAAM,KAAK;AAC/B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,MAAM,KAAK;AAC/B;AAAA,QAAA;AAEJ;AAAA,MACF,KAAK;AACH,gBAAQ,SAAS,UAAA;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AACH,kBAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,MAAM,KAAK;AAC/B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B;AAAA,UACF,KAAK;AACH,kBAAM,MAAM,QAAQ,MAAM,KAAK;AAC/B;AAAA,QAAA;AAEJ;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,2BACE,QACA,YACA,UACA,OACA;AACA,UAAM,gBAAgB,WAAW,MAAM,eACnC,WAAW,MAAM,MACjB,WAAW,MAAM,MAAM;AAC3B,UAAM,gBAAgB,WAAW,MAAM,eACnC,WAAW,MAAM,MACjB,WAAW,MAAM,MAAM;AAC3B,YAAQ,SAAS,UAAA;AAAA,MACf,KAAK;AAAA,MACL,KAAK;AACH,cAAM,aAAa,QAAQ,CAAC,eAAe,aAAa,CAAC;AACzD;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,2BACE,QACA,YACA,UACA,OACA;AACA,QAAI,QAAQ,WAAW;AACvB,YAAQ,KAAK,UAAA;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AAEH,gBAAQ,SAAS,UAAA;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AACH,kBAAM,SAAS,eAAe,CAAC,QAAQ,MAAM,QAAQ,cAAc,IAAI,CAAC,CAAC;AACzE;AAAA,QAAA;AAEJ;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAEH,gBAAQ,SAAS,UAAA;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AACH;AACE,oBAAM,KAAK,MAAM,SAAS,GAAG,IAAI,OAAO;AACxC,oBAAM,eAAe,MAAM,QAAQ,cAAc,IAAI;AACrD,oBAAM,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ,YAAY,CAAC;AAAA,YACrD;AACA;AAAA,QAAA;AAEJ;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAEH,gBAAQ,SAAS,UAAA;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AACH,kBAAM,SAAS,sBAAsB,CAAC,QAAQ,KAAK,CAAC;AACpD;AAAA,QAAA;AAEJ;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,IAAIC,SAAAA,6BAAA;AAAA,MAEZ;AAIE,gBAAQ,MAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK;AAEtD,gBAAQ,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG;AACpD,gBAAQ,SAAS,UAAA;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AACH,kBAAM,UAAU,QAAQ,KAAK;AAC7B;AAAA,QAAA;AAEJ;AAAA,IAAA;AAAA,EAEN;AAAA,EAEA,OAAO,IACL,aACA,YACA,qBACA,YACA,WACA,gBACA,OAC4C;AAC5C,QAAI;AACJ,QAAI;AACF,eAASR,YAAAA,MAAM,WAAW;AAAA,IAC5B,SAAS,OAAO;AACd,UAAI,iBAAiBS,YAAAA,aAAa;AAChC,cAAM,IAAIC,SAAAA,0BAA0B,aAAa,KAAK;AAAA,MACxD;AACA,YAAM,IAAIC,SAAAA,8BAA8B,KAAK;AAAA,IAC/C;AACA,UAAM,QAAoD,WAAW,MAAA,EAAQ,KAAK,SAAS;AAC3F,UAAM,UAAU,IAAI;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,YAAQ,eAAe,QAAQ,OAAO,IAAI;AAC1C,WAAO;AAAA,EACT;AACF;AAmBO,MAAM,gBAAgB,CAC3B,aACA,YACA,qBACA,YACA,WACA,gBACA,UAC+C;AAC/C,QAAM,QAAQ,wBAAwB;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,aAAa,UAAU;AAC7B,SAAO;AACT;AC/zBO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EAEA,cAAc;AACZ,SAAK,6BAAa,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAa;AACf,UAAM,UAAU,KAAK,OAAO,IAAI,GAAG;AAEnC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,QAAQ,MAAA;AAGtB,QAAI,UAAU,QAAW;AACvB,WAAK,OAAO,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAAa,OAAgB;AAClC,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,UAAM,UAAU,IAAI,QAAQ,KAAK;AACjC,SAAK,OAAO,IAAI,KAAK,OAAO;AAE5B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAa;AACf,UAAM,UAAU,KAAK,OAAO,IAAI,GAAG;AACnC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,QAAQ,MAAA;AAEtB,QAAI,UAAU,QAAW;AACvB,WAAK,OAAO,OAAO,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAa;AAClB,WAAO,KAAK,OAAO,OAAO,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO;AACL,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,OAAO,MAAA;AAAA,EACd;AACF;AC5FO,MAAM,4BAA4B,CAAC,UAAoC;AAM5E,MACE,aAAa,OAAO,MAAM,2BAC1B,MAAM,wBAAwB,KAAA,EAAO,SAAS,GAC9C;AACA,UAAM,QAAQ,MAAM,oBAAoB,IAAI,MAAM,uBAAuB;AACzE,QAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AACA,WAAO,MAAM;AAAA,EACf;AAOA,QAAM,aAAa,CAAC,QAAQ,SAAS,SAAS,WAAW,eAAe,YAAY,UAAU;AAC9F,QAAM,iCAAiB,IAAA;AACvB,QAAM,oBAAoB,QAAQ,CAAC,eAAe,cAAc;AAC9D,eAAW,IAAI,WAAW,aAAa;AACvC,eAAW,IAAI,OAAO,UAAU,SAAS,GAAG,aAAa;AACzD,eAAW,IAAI,cAAc,YAAY,aAAa;AACtD,eAAW,IAAI,OAAO,UAAU,cAAc,UAAU,GAAG,aAAa;AAAA,EAC1E,CAAC;AACD,aAAW,aAAa,YAAY;AAClC,QAAI,QAAQ,WAAW,IAAI,SAAS;AACpC,QAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AACA,YAAQ,WAAW,IAAI,UAAU,YAAA,CAAa;AAC9C,QAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AACA,YAAQ,WAAW,IAAI,OAAO,UAAU,SAAS,CAAC;AAClD,QAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAMA,SAAO,MAAM;AACf;AC2GO,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYhC,aAAa,KAAa,YAA2D;AACnF,QAAI,WAAW,gBAAgB,MAAM;AACnC,aAAO;AAAA,IACT;AAEA,QAAIC,SAAAA,SAAS,WAAW,WAAW,GAAG;AACpC,aAAO,WAAW;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,qBAAqB,UAA6C;AAEhE,QAAI;AACJ,QAAI;AACF,iBAAW,SAAS;AAAA,IACtB,SAAS,OAAO;AAGd,aAAO,EAAE,MAAM,SAAA;AAAA,IACjB;AAGA,UAAM,SACJ,YAAY,YAAY,OAAO,SAAS,WAAW,WAAW,SAAS,SAAS;AAIlF,YAAQ,UAAA;AAAA,MACN,KAAK,UAAU;AAEb,YAAI,QAAQ;AACV,iBAAO,EAAE,MAAM,UAAU,OAAA;AAAA,QAC3B;AACA,eAAO,EAAE,MAAM,SAAA;AAAA,MACjB;AAAA,MAEA,KAAK,UAAU;AAEb,YAAI,WAAW,WAAW,WAAW,UAAU;AAC7C,iBAAO,EAAE,MAAM,UAAU,OAAA;AAAA,QAC3B;AACA,eAAO,EAAE,MAAM,SAAA;AAAA,MACjB;AAAA,MAEA,KAAK,WAAW;AAEd,YAAI,WAAW,WAAW,WAAW,SAAS;AAC5C,iBAAO,EAAE,MAAM,WAAW,OAAA;AAAA,QAC5B;AACA,eAAO,EAAE,MAAM,UAAA;AAAA,MACjB;AAAA,MAEA,KAAK,WAAW;AACd,eAAO,EAAE,MAAM,UAAA;AAAA,MACjB;AAAA,MAEA,KAAK,UAAU;AACb,eAAO,EAAE,MAAM,SAAA;AAAA,MACjB;AAAA,MAEA,KAAK,SAAS;AACZ,eAAO,EAAE,MAAM,QAAA;AAAA,MACjB;AAAA,MAEA,SAAS;AAEP,eAAO,EAAE,MAAM,SAAA;AAAA,MACjB;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,cACE,gBACA,cACiB;AACjB,QAAI,MAAM,QAAQ,cAAc,GAAG;AACjC,aAAO,eAAe,IAAI,CAAC,MAAOC,SAAAA,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAE;AAAA,IAC9D,WAAW,MAAM,QAAQ,YAAY,GAAG;AACtC,aAAO,aAAa,IAAI,CAAC,MAAOA,SAAAA,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAE;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBACE,gBACA,cACwC;AACxC,QAAI,MAAM,QAAQ,cAAc,GAAG;AACjC,aAAO,eAAe;AAAA,QAAI,CAAC,MACzBA,kBAAS,CAAC,IACL;AAAA,UACC,OAAO,EAAE,SAAS,OAAO,EAAE,KAAK;AAAA,UAChC,OAAO,EAAE;AAAA,UACT,MAAM,EAAE,QAAQ;AAAA,QAAA,IAEjB;AAAA,UACC,OAAO,OAAO,CAAC;AAAA,UACf,OAAO;AAAA,UACP,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,IAER,WAAW,MAAM,QAAQ,YAAY,GAAG;AACtC,aAAO,aAAa;AAAA,QAAI,CAAC,MACvBA,kBAAS,CAAC,IACL;AAAA,UACC,OAAO,EAAE,SAAS,OAAO,EAAE,KAAK;AAAA,UAChC,OAAO,EAAE;AAAA,UACT,MAAM,EAAE,QAAQ;AAAA,QAAA,IAEjB;AAAA,UACC,OAAO,OAAO,CAAC;AAAA,UACf,OAAO;AAAA,UACP,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,IAER;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCA,MAAM,oBAEJ,YAA8B,QAC9B,4BACA,SACA,OACwC;AACxC,QACE,CAACA,SAAAA,SAAS,0BAA0B,KACpC,CAAC,2BAA2B,QAC5B,CAACC,mCAAmB,KAAK,GACzB;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,CAAA;AAAA,QACZ,UAAU,CAAA;AAAA,MAAC;AAAA,IAEf;AAEA,UAAM,SAAwC;AAAA,MAC5C,QAAQ;AAAA,MACR,SAAS,2BAA2B;AAAA,MACpC,eAAe,2BAA2B;AAAA,MAC1C,gBAAgB,2BAA2B;AAAA,MAC3C,WAAW,2BAA2B;AAAA,MACtC,cAAc,CAAA;AAAA,MACd,4BAA4B,CAAA;AAAA,MAC5B,0BAA0B,CAAA;AAAA,MAC1B,8BAA8B,CAAA;AAAA,MAC9B,6BAA6B,CAAA;AAAA,IAAC;AAKhC,WAAO,QAAQ,2BAA2B,UAAU,EAAE;AAAA,MACpD,OAAO,CAAC,aAAa,YAAY,MAAM;AAErC,YAAI,qBAAqB,KAAK;AAAA,UAC5B;AAAA,UACA,aAAa;AAAA,QAAA;AAGf,YAAI,SAAS,sBAAsB,WAAW,WAAW;AAIvD;AAAA,QACF,WAAW,SAAS,sBAAsB,YAAY,WAAW;AAC/D,+BAAqB;AAAA,QACvB;AAGA,YACG,WAAW,aAAa,aAAa,YAAY,SACjD,YAAY,aAAa,aAAa,aAAa;AAEpD;AAGF,gBAAQ,aAAa,MAAA;AAAA,UACnB,KAAK,UAAU;AACb,mBAAO,WAAY,WAAW,IAAI,KAAK;AAAA,cACrC;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAEF,gBAAI,aAAa,YAAY;AAC3B,qBAAO,0BAA0B,EAAG,WAAW,IAAI,OAAO,WAAY,WAAW;AAAA,YACnF;AACA,gBAAI,aAAa,YAAY,MAAM,QAAQ,OAAO,wBAAwB,CAAC,GAAG;AAC5E,qBAAO,wBAAwB,EAAE,KAAK,WAAW;AAAA,YACnD;AACA,gBAAI,aAAa,gBAAgB,MAAM,QAAQ,OAAO,4BAA4B,CAAC,GAAG;AACpF,qBAAO,4BAA4B,EAAE,KAAK,WAAW;AAAA,YACvD;AACA,gBACE,aAAa,cACb,gBAAgB,aAAa,cAC7B,SAAS,aAAa,WAAW,cACjC,MAAM,QAAQ,OAAO,2BAA2B,CAAC,GACjD;AACA,qBAAO,2BAA2B,EAAE,KAAK,WAAW;AAAA,YACtD;AACA;AAAA,UACF;AAAA,UAEA,KAAK,oBAAoB;AACvB,mBAAO,WAAY,WAAW,IAAI,KAAK;AAAA,cACrC;AAAA,cACA;AAAA,YAAA;AAEF;AAAA,UACF;AAAA,UAEA,KAAK,gBAAgB;AACnB,kBAAM,gBAAgB,MAAM,KAAK;AAAA,cAC/B;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAEF,gBAAI,eAAe;AACjB,oBAAM,kBAAkB,MAAM,sBAAsB,IAAI,WAAW;AACnE,kBAAI,mBAAmB,WAAW,WAAW;AAC3C,wBAAQ,gBAAgB,MAAA;AAAA,kBACtB,KAAK;AAAA,kBACL,KAAK;AACH,2BAAO,WAAY,WAAW,IAAI;AAClC;AAAA,gBAAA;AAAA,cAEN;AAAA,YACF;AACA,gBAAID,SAAAA,SAAS,aAAa,UAAU,GAAG;AACrC,oBAAM,kBAA0C,CAAA;AAChD,qBAAO,QAAQ,aAAa,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAEhE,gCAAgB,GAAG,kBAAkB,IAAI,GAAG,EAAE,IAAI;AAAA,cACpD,CAAC;AACD,qBAAO,0BAA0B,IAAIE,MAAAA;AAAAA,gBACnC,OAAO,0BAA0B;AAAA,gBACjC;AAAA,cAAA;AAAA,YAEJ;AACA;AAAA,UACF;AAAA,QAAA;AAAA,MAEJ;AAAA,IAAA;AAIF,UAAM,sCAAmC,IAAA;AACzC,WAAO,QAAQ,OAAO,UAAW,EAAE,QAAQ,CAAC,CAAC,aAAa,cAAc,MAAM;AAE5E,UAAI,CAACF,SAAAA,SAAS,cAAc,KAAK,UAAU,gBAAgB;AACzD;AAAA,MACF;AAQA,YAAM,aAAa,eAAe,aAAa;AAE/C,UACE,CAAC,eACA,WAAW,aACT,CAAC,MAAM,8BAA8B,IAAI,WAAW,KACnD,CAAC,MAAM,0BAA0B,IAAI,WAAW,MAC/C,CAAC,OAAO,2BAA2B,KAClC,CAAC,OAAO,2BAA2B,EAAE,SAAS,WAAW,KAC/D;AACA,wBAAgB,IAAI,WAAW;AAAA,MACjC;AAAA,IACF,CAAC;AACD,WAAO,WAAW,MAAM,KAAK,eAAe;AAE5C,WAAO;AAAA,EACT;AAAA,EAEA,4BAA4B,OAAyB,cAA8B;AACjF,UAAM,YAAY;AAAA,MAChB,kBAAkB,MAAM;AAAA,MACxB;AAAA,IAAA;AAEF,WAAO,mBAAmB,mBAAmBG,SAAAA,OAAO,SAAS,CAAC,CAAC;AAAA,EACjE;AAAA,EAEA,+BACE,OACA,aACA,eACA,iBACA,cACuC;AACvC,QAAI,aAAa,eAAe,aAAa;AAC3C,YAAM,mCAAmC,MAAM,0BAA0B,IAAI,eAAe;AAC5F,UAAI,CAAC,kCAAkC;AACrC,eAAO;AAAA,MACT;AACA,YAAM,eAAe,iCAAiC,aAAA;AACtD,UAAI,CAACF,gBAAAA,mBAAmB,YAAY,GAAG;AACrC,eAAO;AAAA,MACT;AACA,YAAM,WAAW,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,MAAA;AAEF,aAAO;AAAA,QACL,OAAO,YAAY;AAAA,QACnB,UAAU;AAAA,QACV,SAAS,KAAK,4BAA4B,OAAO,eAAe;AAAA,MAAA;AAAA,IAEpE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,6BACE,OACA,aACA,eACA,iBACA,cACuC;AACvC,QACG,cAAc,aAAa,QAAQ,aAAa,eAAe,eAC/D,qBAAqB,aAAa,QAAQ,aAAa,sBAAsB,aAC9E;AACA,YAAM,mCAAmC,MAAM,0BAA0B,IAAI,eAAe;AAC5F,UAAI,CAAC,kCAAkC;AACrC,eAAO;AAAA,MACT;AACA,YAAM,eAAe,iCAAiC,aAAA;AACtD,UAAI,CAACA,gBAAAA,mBAAmB,YAAY,GAAG;AACrC,eAAO;AAAA,MACT;AACA,YAAM,WAAW,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,MAAA;AAEF,aAAO;AAAA,QACL,OAAO,YAAY;AAAA,QACnB,UAAU;AAAA,QACV,SAAS,KAAK,4BAA4B,OAAO,eAAe;AAAA,MAAA;AAAA,IAEpE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,mCACE,OACA,aACA,eACA,iBACA,cACuC;AACvC,QAAI,aAAa,oBAAoB,aAAa;AAChD,YAAM,mCAAmC,MAAM,0BAA0B,IAAI,eAAe;AAC5F,UAAI,CAAC,kCAAkC;AACrC,eAAO;AAAA,MACT;AACA,YAAM,eAAe,iCAAiC,aAAA;AACtD,UAAI,CAACA,gBAAAA,mBAAmB,YAAY,GAAG;AACrC,eAAO;AAAA,MACT;AACA,YAAM,WAAW,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,MAAA;AAEF,aAAO;AAAA,QACL,OAAO,YAAY;AAAA,QACnB,UAAU;AAAA,QACV,SAAS,KAAK,4BAA4B,OAAO,eAAe;AAAA,MAAA;AAAA,IAEpE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,+BACE,OACA,aACA,cACuC;AAEvC,UAAM,+BAA8D,IAAA;AACpE,UAAM,sBAAsB,CAAC,UAAiC,oBAA4B;AACxF,eAAS,KAAA;AACT,cAAQ,SAAS,MAAA;AAAA,QACf,KAAK;AAAA,QACL,KAAK,aAAa;AAChB,gBAAM,cAAc,KAAK;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAEF,cAAI,aAAa;AACf,qBAAS,IAAI,iBAAiB,WAAW;AAAA,UAC3C;AACA;AAAA,QACF;AAAA,MAAA;AAAA,IA6CJ;AACA,QACE,aAAa,cACb,qBAAqB,aAAa,cAClC,aAAa,OAAO,aAAa,WAAW,mBAC5C,aAAa,WAAW,gBAAgB,KAAA,EAAO,SAAS,GACxD;AACA,YAAM,WAAW,MAAM,sBAAsB,IAAI,aAAa,WAAW,eAAe;AACxF,UAAI,UAAU;AACZ,4BAAoB,UAAU,aAAa,WAAW,eAAe;AAAA,MACvE;AAAA,IACF,OAAO;AACL,YAAM,sBAAsB,QAAQ,mBAAmB;AAAA,IACzD;AACA,QAAI,SAAS,OAAO,GAAG;AAErB,UAAI,SAAS,OAAO,EAAG;AAKvB,aAAO,MAAM,KAAK,SAAS,OAAA,CAAQ,EAAE,CAAC;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,qBACE,OACA,aACA,cAC+B;AAE/B,QAAI,CAACD,SAAAA,SAAS,YAAY,KAAK,CAAC,aAAa,cAAc,CAAC,aAAa,kBAAkB;AACzF,aAAO,CAAA;AAAA,IACT;AACA,UAAM,eAAe,KAAK,qBAAqB,aAAa,WAAW,IAAI;AAC3E,UAAM,mBAAmB,KAAK,+BAA+B,OAAO,aAAa,YAAY;AAE7F,UAAM,WAAW,KAAK;AAAA,MACpB;AAAA,MACA,aAAa;AAAA,IAAA;AAIf,UAAM,WAAW,aAAa,WAAW;AACzC,UAAM,aAAa,aAAa;AAIhC,UAAM,mBAAmBI,SAAAA,+BAA+B;AAAA;AAAA,MAEtD,MAAM,aAAa;AAAA,MACnB,QAAQ,aAAa;AAAA;AAAA,MAGrB,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,OAAO,YAAY;AAAA,MACnB,aAAa,WAAW;AAAA,MACxB,SACE,aAAa,aACT,WAAW,UACX,KAAK,gCAAgC,YAAY;AAAA;AAAA,MAGvD,YAAY,WAAW,cAAc,SAAS;AAAA,MAC9C,SAAS,WAAW,WAAW,SAAS;AAAA,MACxC,kBAAkB,WAAW,oBAAoB,SAAS;AAAA,MAC1D,SAAS,WAAW,WAAW,SAAS;AAAA,MACxC,kBAAkB,WAAW,oBAAoB,SAAS;AAAA;AAAA,MAG1D,WAAW,WAAW,aAAa,SAAS;AAAA,MAC5C,WAAW,WAAW,aAAa,SAAS;AAAA,MAC5C,SAAS,WAAW,WAAW,SAAS;AAAA;AAAA,MAGxC,sBAAsB,WAAW,wBAAwB,SAAS;AAAA,MAClE,eAAe,WAAW,iBAAiB,SAAS;AAAA,MACpD,eAAe,WAAW,iBAAiB,SAAS;AAAA,MACpD,YAAY,WAAW,cAAc,SAAS;AAAA;AAAA,MAG9C,UAAU,WAAW,YAAY,SAAS;AAAA,MAC1C,UAAU,WAAW,YAAY,SAAS;AAAA,MAC1C,aAAa,WAAW,eAAe,SAAS;AAAA;AAAA,MAGhD,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,KAAK,WAAW,OAAO,SAAS;AAAA;AAAA,MAGhC,UAAU,WAAW,YAAY,SAAS;AAAA,MAC1C,MAAM,KAAK,cAAc,WAAW,MAAM,SAAS,IAAI;AAAA,MACvD,UACE,WAAW,aAAa,SAAY,WAAW,WAAW,SAAS,YAAY;AAAA;AAAA,MAGjF,UAAU,aAAa,WAAW,CAAC,aAAa;AAAA,MAChD,WAAW,CAAC,aAAa,WAAW,aAAa;AAAA;AAAA,MAGjD,cAAc,WAAW;AAAA,MACzB,SAAS,WAAW;AAAA;AAAA,MAGpB,GAAG;AAAA,QACD,6BACG,gBAAgB,cAAc,WAAW,eAAe,QACxD,gBAAgB,YAAY,SAAS,eAAe,QACpD,eAAe,cAAc,WAAW,cAAc,QACvD;AAAA,QACF,6BACG,gBAAgB,cAAc,WAAW,eAAe,QACxD,gBAAgB,YAAY,SAAS,eAAe,QACrD;AAAA,QACF,2BACG,eAAe,cAAc,WAAW,cAAc,QAAS;AAAA,QAClE,6BACG,eAAe,cAAc,WAAW,cAAc,QAAS;AAAA,QAClE,8BAA8B;AAAA,MAAA;AAAA,MAEhC,GAAGA,wCAA+B;AAAA,QAChC,yBAAyB,KAAK,gBAAgB,WAAW,MAAM,SAAS,IAAI;AAAA,MAAA,CAC7E;AAAA,IAAA,CACF;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,+BACE,aACA,cAC+B;AAC/B,QAAI,CAACJ,SAAAA,SAAS,YAAY,KAAK,CAAC,aAAa,cAAc,CAAC,aAAa,kBAAkB;AACzF,aAAO,CAAA;AAAA,IACT;AAEA,UAAM,eAAe,KAAK,qBAAqB,aAAa,WAAW,IAAI;AAG3E,UAAM,WAAW,KAAK;AAAA,MACpB;AAAA,MACA,aAAa;AAAA,IAAA;AAIf,UAAM,WAAW,aAAa,WAAW;AACzC,UAAM,aAAa,aAAa;AAIhC,UAAM,mBAAmBI,SAAAA,+BAA+B;AAAA;AAAA,MAEtD,MAAM,aAAa;AAAA,MACnB,QAAQ,aAAa;AAAA;AAAA,MAGrB,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,OAAO,YAAY;AAAA,MACnB,aAAa,WAAW;AAAA,MACxB,SACE,aAAa,aACT,WAAW,UACX,KAAK,gCAAgC,YAAY;AAAA;AAAA,MAGvD,YAAY,WAAW,cAAc,SAAS;AAAA,MAC9C,SAAS,WAAW,WAAW,SAAS;AAAA,MACxC,kBAAkB,WAAW,oBAAoB,SAAS;AAAA,MAC1D,SAAS,WAAW,WAAW,SAAS;AAAA,MACxC,kBAAkB,WAAW,oBAAoB,SAAS;AAAA;AAAA,MAG1D,WAAW,WAAW,aAAa,SAAS;AAAA,MAC5C,WAAW,WAAW,aAAa,SAAS;AAAA,MAC5C,SAAS,WAAW,WAAW,SAAS;AAAA;AAAA,MAGxC,sBAAsB,WAAW,wBAAwB,SAAS;AAAA,MAClE,eAAe,WAAW,iBAAiB,SAAS;AAAA,MACpD,eAAe,WAAW,iBAAiB,SAAS;AAAA,MACpD,YAAY,WAAW,cAAc,SAAS;AAAA;AAAA,MAG9C,UAAU,WAAW,YAAY,SAAS;AAAA,MAC1C,UAAU,WAAW,YAAY,SAAS;AAAA,MAC1C,aAAa,WAAW,eAAe,SAAS;AAAA;AAAA,MAGhD,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,OAAO,WAAW,SAAS,SAAS;AAAA,MACpC,KAAK,WAAW,OAAO,SAAS;AAAA;AAAA,MAGhC,UAAU,WAAW,YAAY,SAAS;AAAA,MAC1C,MAAM,KAAK,cAAc,WAAW,MAAM,SAAS,IAAI;AAAA,MACvD,UACE,WAAW,aAAa,SAAY,WAAW,WAAW,SAAS,YAAY;AAAA;AAAA,MAGjF,UAAU,aAAa,WAAW,CAAC,aAAa;AAAA,MAChD,WAAW,CAAC,aAAa,WAAW,aAAa;AAAA;AAAA,MAGjD,cAAc,WAAW;AAAA,MACzB,SAAS,WAAW;AAAA;AAAA,MAGpB,GAAG;AAAA,QACD,6BAA6B,CAAC,aAAa;AAAA,QAC3C,6BAA6B,CAAC,aAAa;AAAA,QAC3C,2BAA2B,CAAC,aAAa;AAAA,QACzC,6BAA6B;AAAA,QAC7B,8BAA8B;AAAA,MAAA;AAAA,MAEhC,GAAGA,wCAA+B;AAAA,QAChC,yBAAyB,KAAK,gBAAgB,WAAW,MAAM,SAAS,IAAI;AAAA,MAAA,CAC7E;AAAA,IAAA,CACF;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAM,2BACJ,cACA,cACA,WACA,SAC2F;AAC3F,QACE,CAACJ,SAAAA,SAAS,YAAY,KACtB,CAAC,aAAa,cACd,CAAC,aAAa,oBACd,CAAC,aAAa,cACd;AACA,aAAO;AAAA,IACT;AACA,UAAM,eAAe,aAAa,aAAA;AAElC,QAAI,CAAC,cAAc;AAEjB,aAAO;AAAA,IACT;AAEA,QAAI,CAACC,gBAAAA,mBAAmB,YAAY,GAAG;AAErC,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,oBAAoB,QAAQ,uBAAuB,GAAG;AAChE,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,UAAI,CAAC,QAAQ,OAAO,CAAC,QAAQ,KAAK;AAEhC,eAAO;AAAA,MACT;AAEA,YAAM,iBAAiB;AAAA,QACrB,GAAG;AAAA,QACH,oBACE,QAAQ,uBAAuB,OAAO,OAAO,QAAQ,qBAAqB;AAAA,MAAA;AAG9E,aAAO,aAAa;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,MAAc,wBAAwB,aAAa,gBAAgB;AACzE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,6BAA6B,0BAA0B,YAAY;AAAA,IAAA;AAAA,EAEvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBU,gCACR,cACqB;AACrB,UAAM,iBAAiB,aAAa,UAAU,SAAA;AAE9C,QACED,kBAAS,cAAc,KACvB,WAAW,kBACXA,SAAAA,SAAS,eAAe,KAAK,KAC7B,aAAa,eAAe,OAC5B;AACA,aAAO,eAAe,MAAM;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AACF;;;;;;;;;;;AC/SO,MAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF;AAoBO,MAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAwGA,MAAM,cAAc,CAClB,KACA,eACG;AACH,MAAID,SAAAA,SAAS,WAAW,WAAW,GAAG;AACpC,WAAO,WAAW;AAAA,EACpB;AACA,SAAO;AACT;AAMA,MAAM,wDAAwC,IAAA;AAK9C,MAAM,6DAA6C,IAAA;AAKnD,MAAM,wCAAwC,CAC5C,UACG;AACH,QAAM,SAAS,uCAAuC,IAAI,KAAK;AAC/D,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAM,4BAAsC,CAAA;AAC5C,MAAIM,gBAAAA,mBAA0B,KAAK,GAAG;AACpC,UAAM,oBAAoB,QAAQ,CAAC,YAAY,QAAQ;AACrD,UAAI,WAAW,YAAY;AACzB,cAAM,eAAe,MAAM,WAAW,GAAG;AACzC,YAAI,cAAc;AAChB,gBAAM,gBAAgB,YAAY,KAAK,YAAY;AACnD,cAAI,eAAe;AACjB,sCAA0B,KAAK,aAAa;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,aAAa,MAAM,KAAK,IAAI,IAAI,yBAAyB,CAAC;AAChE,yCAAuC,IAAI,OAAO,UAAU;AAC5D,SAAO;AACT;AAEA,MAAM,mCAAmC,CACvC,OACA,QAAgB,MACW;AAC3B,MAAI,QAAQ,GAAG;AAEb,WAAO,CAAA;AAAA,EACT;AACA,QAAM,SAAS,kCAAkC,IAAI,KAAK;AAC1D,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AACA,QAAMC,mCAKE,IAAA;AACR,QAAM,0BAAoC,CAAA;AAC1C,0BAAwB,KAAK,GAAG,sCAAsC,KAAK,CAAC;AAC5E,MAAID,gBAAAA,mBAA0B,KAAK,GAAG;AACpC,4BAAwB,QAAQ,CAAC,UAAU;AACzC,YAAM,aACJ,MAAM,oBAAoB,IAAI,KAAK,KAAK,MAAM,8BAA8B,IAAI,KAAK;AACvF,UAAI,YAAY;AACd,QAAAC,aAAY,IAAI,OAAO,UAAU;AAAA,MACnC;AAAA,IACF,CAAC;AACD,UAAM,0BAA0B,QAAQ,CAAC,aAAa,QAAQ;AAC5D,YAAM,eAAe,MAAM,aAAa,GAAG;AAC3C,UAAI,cAAc;AAChB,cAAM,kBAAkB,YAAY,KAAK,YAAY;AACrD,cAAM,eAAe,aAAa,aAAA;AAClC,YAAI,mBAAmBD,mCAA0B,YAAY,GAAG;AAC9D,gBAAM,0BAA0B,OAAO;AAAA,YACrC,iCAAiC,cAAc,QAAQ,CAAC;AAAA,UAAA;AAE1D,kCAAwB,QAAQ,CAAC,CAAC,cAAc,0BAA0B,MAAM;AAC9E,kBAAM,yBAAyB,CAAC,iBAAiB,YAAY,EAAE,KAAK,GAAG;AACvE,oCAAwB,KAAK,sBAAsB;AACnD,YAAAC,aAAY,IAAI,wBAAwB,EAAE,MAAM,4BAAmC;AAAA,UACrF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,CAAA;AAAA,IACA,GAAG,MAAM,KAAK,IAAI,IAAI,uBAAuB,CAAC,EAAE,IAAI,CAAC,MAAM;AACzD,YAAM,MAAMA,aAAY,IAAI,CAAC;AAC7B,UAAI,CAAC,KAAK;AACR,eAAO,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,YAAU;AAAA,MAClC;AACA,UAAI,UAAU,KAAK;AACjB,eAAO,EAAE,CAAC,CAAC,GAAG,IAAI,KAAA;AAAA,MACpB;AACA,aAAO,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,YAAU;AAAA,IAClC,CAAC;AAAA,EAAA;AAEH,oCAAkC,IAAI,OAAO,UAAU;AACvD,SAAO;AACT;AAEA,MAAM,gCAAgC,CAAC,QAAwB;AAC7D,MAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AACA,SAAO,IAAI,OAAO,CAAC,EAAE,gBAAgB,IAAI,MAAM,CAAC;AAClD;AAEA,MAAM,wBAAwB,CAC5B,SACA,YACqC;AACrC,QAAM,MAAwC,CAAA;AAC9C,SAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACpC,UAAM,UAAU,QAAQ,GAAG;AAC3B,QAAI,QAAQ,SAAS,GAAG;AACtB,UAAI,GAAG,IAAI,CAAA;AACX,cAAQ,QAAQ,CAAC,WAAW;AAC1B,cAAM,sBAAsB,CAAC,KAAK,8BAA8B,MAAM,CAAC,EAAE,KAAK,EAAE;AAChF,YAAI,QAAQ,mBAAmB,MAAM,UAAa,QAAQ,mBAAmB,MAAM,MAAM;AACvF,kBAAQ,QAAA;AAAA,YACN;AACE,kBAAI,GAAG,EAAE,MAAM,IAAI,OAAO,QAAQ,mBAAmB,CAAC;AACtD;AAAA,UAAA;AAAA,QAEN;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAqEO,SAAS,gBACd,UAA4C,IAGhB;AAC5B,SAAO,CACL,eAC6B;AAC7B,UAAM,gBAAgBC,IAAAA,IAAI,OAAgC;AAAA,MACxD,MAAMA,IAAAA,IAAI,OAAA,EAAS,QAAQ,WAAW,IAAI;AAAA,MAC1C,wBAAwBA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,MACrC,sBAAsBA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,MACjD,sBAAsBA,IAAAA,IACnB,OAAO;AAAA,QACN,MAAMA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,QAClD,QAAQA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,QACpD,MAAMA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,QAClD,QAAQA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,QACpD,QAAQA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,MAAA,CACrD,EACA,QAAQ,EAAE;AAAA,MACb,YAAYA,IAAAA,IACT,SACA,MAAM,GAAG,6BAA6B,EACtC,QAAQ,OAAO;AAAA,MAClB,wBAAwBA,IAAAA,IACrB,SACA,MAAM,GAAG,6BAA6B,EACtC,QAAQ,OAAO;AAAA,MAClB,qBAAqBA,IAAAA,IAClB,OAAO;AAAA,QACN,MAAMA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,QAClD,QAAQA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,MAAA,CACrD,EACA,QAAQ,EAAE;AAAA,MACb,iCAAiCA,IAAAA,IAC9B,OAAO;AAAA,QACN,QAAQA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,QACpD,QAAQA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,CAAA,CAAE;AAAA,MAAA,CACrD,EACA,QAAQ,EAAE,QAAQ,CAAA,GAAI,QAAQ,CAAA,GAAI;AAAA,MACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,MAC1B,cAAcA,IAAAA,IACX,OAAoC;AAAA,QACnC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,QAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,MAAS,CAClC,EACA,SAAA;AAAA,MACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,MACtB,UAAUA,IAAAA,IACP,OAAwC;AAAA,QACvC,+BAA+BA,IAAAA,IAAI,OAAA,EAAS,QAAA,EAAU,IAAI,CAAC,EAAE,QAAQ,EAAE;AAAA,QACvE,0BAA0BA,IAAAA,IAAI,SAAS,QAAA,EAAU,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,MAAA,CAClE,EACA,QAAQ;AAAA,QACP,+BAA+B;AAAA,QAC/B,0BAA0B;AAAA,MAAA,CAC3B;AAAA,MACH,kBAAkBA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,QAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,IAAS,CAC5D;AAED,UAAM,EAAE,OAAO,OAAO,qBAAqB,cAAc,SAAS,SAAS;AAAA,MACzE,YAAY;AAAA,IAAA,CACb;AAED,QAAI,OAAO;AACT,YAAM,IAAIC,SAAAA,oCAAoC,QAAQ,QAAQ,WAAW,MAAM,KAAK;AAAA,IACtF;AAGA,UAAMC,2BAA0B,CAAI,KAAU,QAAgC;AAC5E,UAAI,CAAC,OAAO,UAAU,eAAe,KAAK,KAAK,GAAG,KAAK,EAAE,IAAI,GAAG,aAAa,MAAM;AACjF,mCAAW,IAAA;AAAA,MACb;AACA,aAAO,IAAI,GAAG;AAAA,IAChB;AAEA,UAAM,qBAAqBA,yBAEzB,YAAY,qBAAqB;AACnC,UAAM,2BAA2BA;AAAA,MAC/B;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,+BAA+BA,yBAEnC,YAAY,+BAA+B;AAE7C,UAAM,+BAA+B,IAAIC,UAAA;AAYzC,UAAM,wBAAwB,CAC5B,SACA,iBACA,yBAIG;AACH,YAAM,gBAAqC,CAAA;AAC3C,YAAM,eAAoC,CAAA;AAE1C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAElD,cAAM,mBAAmB,sBAAsB,IAAI,GAAG;AACtD,YAAI,kBAAkB;AACpB,uBAAa,GAAG,IAAI;AACpB;AAAA,QACF;AAGA,cAAM,SAAS,iBAAiB,IAAI,GAAG;AACvC,YAAI,QAAQ;AACV,wBAAc,GAAG,IAAI;AAAA,QACvB;AAAA,MAGF;AAEA,aAAO,EAAE,eAAe,aAAA;AAAA,IAC1B;AAGA,UAAM,oBAAN,MAAMC,2BAAyB,WAAW;AAAA,MAMxC,OAAO,sBAGH;AAAA,MACJ,OAAO,4BACL;AAAA,MACF,OAAO,gCAGH;AAAA,MAMJ,OAAO,mBAAmB,IAAI,iBAAA;AAAA,MAO9B,aAAa,iCAAiC,OAA+C;AAC3F,YAAI,EAAE,iBAAiBA,qBAAmB;AACxC,iBAAO;AAAA,QACT;AAGA,cAAM,MAAM,YAAY,4BAA4B,OAAO,QAAQ;AAAA,MACrE;AAAA,MAOA,aAAa,iCAAiC,OAA+C;AAC3F,YAAI,EAAE,iBAAiBA,qBAAmB;AACxC,iBAAO;AAAA,QACT;AAGA,cAAM,MAAM,YAAY,4BAA4B,OAAO,QAAQ;AAAA,MACrE;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,aAAuB,4BACrB,OACA,WACA;AACA,cAAM,oBAAoB,iBAAiB,kCAAkC,SAAS;AACtF,YAAI,CAAC,qBAAqB,kBAAkB,WAAW,GAAG;AACxD;AAAA,QACF;AAGA,YAAI;AACJ,YAAI;AACJ,YAAI;AACF,gBAAM,EAAE,SAAS,gBAAgB,MAAM,OAAO,6BAA6B;AAC3E,gBAAM;AAEN,gBAAM,UAAUC,KAAAA,YAAY,IAAA;AAC5B,cAAI,SAAS;AACX,kBAAM;AAAA,UACR,OAAO;AAEL,kBAAM,IAAIC,0BAAA,EAAqB,OAAA;AAAA,UACjC;AAAA,QACF,QAAQ;AAGN;AAAA,QACF;AAGA,cAAM,UAAU,MAAM;AAGtB,cAAM,kBAAkB,MAAM,KAAK;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,UAAU,cAAc,SAAA;AAAA,QAAS;AAGrC,YAAI,iBAAiB;AACnB,gBAAM,IAAIC,SAAAA,4BAA4B,eAAe;AAAA,QACvD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,aAAa,uBAAuB,KAAgD;AAClF,cAAM,UAAU,IAAI,QAAQ,IAAA;AAC5B,cAAM,WAAW,IAAI,KAAA;AAErB,cAAM,EAAE,eAAe,aAAA,IAAiB;AAAA,UACtC,WAAW,CAAA;AAAA,UACX,KAAK;AAAA,UACL,KAAK;AAAA,QAAA;AAIP,iBAAS,KAAK,aAAa;AAG3B,eAAO,OAAO,UAAU,YAAY;AAEpC,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,sBAAsB,KAAwB;AAC5C,cAAM,UAAU,IAAI,QAAQ,IAAA;AAE5B,cAAM,EAAE,eAAe,aAAA,IAAiB;AAAA,UACtC,WAAW,CAAA;AAAA;AAAA,UAEX,KAAK,YAAY;AAAA;AAAA,UAEjB,KAAK,YAAY;AAAA,QAAA;AAInB,aAAK,MAAM,aAAoB;AAG/B,eAAO,OAAO,MAAM,YAAY;AAEhC,eAAO;AAAA,MACT;AAAA,MAEA,OAAO,oBACL,OACA,UACA;AACA,qCAA6B,GAAG,OAAO,QAAQ;AAC/C,eAAO;AAAA,MACT;AAAA,MAEA,OAAO,sBACL,OACA,UACA;AACA,qCAA6B,KAAK,OAAO,QAAQ;AACjD,eAAO;AAAA,MACT;AAAA,MAEA,OAAO,qBACL,OACA,UACA;AACA,qCAA6B,IAAI,OAAO,QAAQ;AAChD,eAAO;AAAA,MACT;AAAA,MAEA,aAAa,4BACX,KACA,KACqC;AACrC,cAAM,6BAAyD;AAAA,UAC7D,MAAM,iBAAiB;AAAA,UACvB,YAAY,CAAA;AAAA,UACZ,aAAa,KAAK;AAAA,UAClB,cAAc,KAAK;AAAA,UACnB,SAAS,KAAK;AAAA,QAAA;AAEhB,cAAM;AAAA,UACJ,MAAM,KAAK,KAAK,oBAAoB,SAAS;AAAA,UAC7C,OAAO,CAAC,aAAa,gBAAgB,MAAM;AACzC,kBAAM,mBAAmB,KAAK,WAAW,WAAW;AAEpD,gBAAI,CAAC,iBAAkB;AACvB,kBAAM,mCAAqE;AAAA,cACzE;AAAA,cACA,YAAY;AAAA,cACZ;AAAA,cACA,GAAI,MAAM,KAAK;AAAA,gBACb;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,cAAA;AAAA,cAEF,MAAM;AAAA,cACN,WAAW,KAAK;AAAA,gBACd;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,gBACjB;AAAA,cAAA;AAAA,cAEF,YAAY,iBAAiB;AAAA,cAC7B,UAAU,iBAAiB;AAAA,cAC3B,cAAc,iBAAiB;AAAA,YAAA;AAEjC,gBACE,CAAC,iCAAiC,WAClC,CAAC,iCAAiC;AAElC;AACF,uCAA2B,WAAW,WAAW,IAAI;AAAA,UACvD;AAAA,UACA;AAAA,YACE,aAAa,iBAAiB,SAAS;AAAA,UAAA;AAAA,QACzC;AAEF,cAAM;AAAA,UACJ,MAAM,KAAK,KAAK,8BAA8B,SAAS;AAAA,UACvD,OAAO,CAAC,aAAa,0BAA0B,MAAM;AACnD,kBAAM,mBAAmB,KAAK,aAAa,WAAW;AAEtD,gBAAI,CAAC,iBAAkB;AACvB,kBAAM,6CACJ;AAAA,cACE;AAAA,cACA,YAAY;AAAA,cACZ;AAAA,cACA,GAAI,MAAM,KAAK;AAAA,gBACb;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,2BAA2B;AAAA,gBAC3B,2BAA2B;AAAA,gBAC3B;AAAA,gBACA,2BAA2B;AAAA,cAAA;AAAA,cAE7B,MAAM;AAAA,cACN,WAAW,KAAK;AAAA,gBACd;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,2BAA2B;AAAA,gBAC3B,2BAA2B;AAAA,gBAC3B,2BAA2B;AAAA,gBAC3B;AAAA,gBACA,2BAA2B;AAAA,cAAA;AAAA,YAC7B;AAGJ,gBACE,CAAC,2CAA2C,WAC5C,CAAC,2CAA2C;AAE5C;AACF,uCAA2B,WAAW,WAAW,IAC/C;AAAA,UACJ;AAAA,UACA;AAAA,YACE,aAAa,iBAAiB,SAAS;AAAA,UAAA;AAAA,QACzC;AAEF,cAAM;AAAA,UACJ,MAAM,KAAK,KAAK,0BAA0B,SAAS;AAAA,UACnD,OAAO,CAAC,aAAa,sBAAsB,MAAM;AAC/C,kBAAM,mBAAmB,KAAK,aAAa,WAAW;AAEtD,gBAAI,CAAC,iBAAkB;AACvB,kBAAM,yCAAiF;AAAA,cACrF;AAAA,cACA,YAAY;AAAA,cACZ;AAAA,cACA,GAAI,MAAM,KAAK;AAAA,gBACb;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,uBAAuB;AAAA,gBACvB,uBAAuB;AAAA,gBACvB;AAAA,cAAA;AAAA,cAEF,MAAM;AAAA,cACN,WAAWP,IAAAA,IAAI,UAAA;AAAA,cACf,cAAc,uBAAuB;AAAA,cACrC,YAAY,iCAAiC,uBAAuB,aAAA,CAAc;AAAA,YAAA;AAGpF,gBACE,CAAC,uCAAuC,WACxC,CAAC,uCAAuC;AAExC;AACF,uCAA2B,WAAW,WAAW,IAC/C;AAAA,UACJ;AAAA,UACA;AAAA,YACE,aAAa,iBAAiB,SAAS;AAAA,UAAA;AAAA,QACzC;AAEF,eAAO;AAAA,MACT;AAAA,MAEA,OAAO,sBACL,KACA,KACA,KACA,UACA,UACA,kBACA,MACA,WAAoB,OACT;AACX,cAAM,WAAW,GAAG,GAAG,IAAI,SAAS,IAAI,IAAU,SAAU,MAAM,IAAI,QAAQ,IAAI,kBAAkB,MAAM,IAAI,IAAI,IAAI,QAAQ;AAC9H,cAAM,cAAc,KAAK,iBAAiB,IAAI,QAAQ;AAEtD,YAAI,aAAa;AACf,iBAAO;AAAA,QACT;AAEA,YAAI,mBAAmB,QAAS,uBAAuB,QAAQ,CAAC,UAAW;AAEzE,iBAAOA,IAAAA,IAAI,IAAA,EAAM,UAAA;AAAA,QACnB;AACA,cAAM,gBAAgB,KAAK,0BAA0B,UAAU,UAAU,MAAM,QAAQ;AACvF,YAAI,eAAe;AACnB,YAAI,MAAM,QAAQ,gBAAgB,KAAK,iBAAiB,SAAS,GAAG;AAClE,2BAAiB,QAAQ,CAAC,oBAAoB;AAE5C,gBAAI,iBAAiB,cAAe;AACpC,gBAAI;AACF,8BAAgB,aAAa;AAAA,YAC/B,SAAS,KAAK;AACZ,2CAA6B;AAAA,gBAC3B;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAEF,sBAAQ,iBAAiB,wBAAA;AAAA,gBACvB,KAAK;AACH,wBAAM;AAAA,gBACR,KAAK;AAEH;AAAA,gBACF,KAAK;AACH,iCAAeA,IAAAA,IAAI,IAAA,EAAM,UAAA;AACzB;AAAA,cAAA;AAAA,YAEN;AAAA,UACF,CAAC;AAAA,QACH;AAEA,aAAK,iBAAiB,OAAO,UAAU,YAAY;AAEnD,eAAO;AAAA,MACT;AAAA,MAEA,OAAiB,0BACf,UACA,UACA,MACA,WAAoB,OACT;AACX,YAAI,mBAAmB,QAAS,uBAAuB,QAAQ,CAAC,UAAW;AAEzE,iBAAOA,IAAAA,IAAI,IAAA,EAAM,UAAA;AAAA,QACnB;AACA,mBAAW,YAAa,cAAc,OAAO,SAAS,YAAY,SAAS;AAC3E,gBAAQ,MAAA;AAAA,UACN,KAAKQ,gBAAAA,sBAA6B,QAAQ,GAAG;AAU3C,gBAAI,IAAIR,IAAAA,IAAI,SAAA;AACZ,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKS,gBAAAA,0BAAiC,QAAQ,GAAG;AAU/C,gBAAI,IAAIT,IAAAA,IAAI,SAAA;AACZ,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKU,gBAAAA,wBAA+B,QAAQ,GAAG;AAC7C,kBAAM,IAA2B;AACjC,kBAAM,MAAM,aAAa,OAAO,EAAE,YAAY,KAAK,IAAI,EAAE,SAAS,IAAI;AACtE,kBAAM,MACJ,aAAa,OAAO,EAAE,YAAY,KAAK,IAAI,EAAE,SAAS,IAAI,OAAO;AACnE,gBAAI,IAAIV,IAAAA,IAAI,OAAA,EAAS,IAAI,GAAG,EAAE,IAAI,GAAG;AACrC,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKW,gBAAAA,wBAA+B,QAAQ,GAAG;AAC7C,kBAAM,IAA2B;AACjC,gBAAI,IAAIX,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;AACrD,gBAAI,EAAE,SAAS;AACb,kBAAI,EAAE,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,OAAO,CAAC,CAAC;AAAA,YAC/C;AACA,gBAAI,EAAE,MAAM;AACV,oBAAM,cAAc,EAAE,KACnB,IAAI,CAAC,MAAM;AACV,oBAAIP,SAAAA,SAAS,CAAC,GAAG;AACf,yBAAO,EAAE;AAAA,gBACX;AACA,uBAAO;AAAA,cACT,CAAC,EACA,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC;AACtC,kBAAI,EAAE,OAAOO,IAAAA,IAAI,OAAA,EAAS,MAAM,GAAG,WAAW,CAAC;AAAA,YACjD;AACA,gBAAI,EAAE,QAAQ;AACZ,sBAAQ,EAAE,QAAA;AAAA,gBACR,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,UAAU;AACpC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,OAAO;AACjC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,SAAS,KAAK,OAAO,CAAC;AACvC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,SAAS,KAAK,OAAO,CAAC;AACvC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,YAAY;AACtC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAS;AACnC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,QAAQ;AAClC;AAAA,gBACF,KAAK;AAAA,gBACL,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,MAAM;AAChC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,KAAK;AAC/B;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,UAAU;AACpC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,GAAG,EAAE,SAAS,CAAC,QAAQ,QAAQ,WAAW,EAAA,CAAG,CAAC;AACxE;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,aAAa;AACvC;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,KAAK;AAC/B;AAAA,gBACF,KAAK;AACH,sBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,MAAM;AAChC;AAAA,cAAA;AAAA,YAEN;AACA,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKY,gBAAAA,yBAAgC,QAAQ,GAAG;AAC9C,kBAAM,IAA4B;AAClC,gBAAI,IAAIZ,IAAAA,IAAI,OAAA;AACZ,gBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,UAAU,SAAS,EAAE,UAAU,CAAC;AAC1D,gBAAI,EAAE,kBAAkB;AACtB,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,KAAK,EAAE,OAAO,CAAC;AAAA,YAC3C,OAAO;AACL,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,OAAO,CAAC;AAAA,YAC1C;AACA,gBAAI,EAAE,kBAAkB;AACtB,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,QAAQ,EAAE,OAAO,CAAC;AAAA,YAC9C,OAAO;AACL,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,OAAO,CAAC;AAAA,YAC1C;AACA,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKa,gBAAAA,wBAA+B,QAAQ,GAAG;AAC7C,kBAAM,IAA2B;AACjC,gBAAI,gBAAgB,OAAO,EAAE,SAAS;AACpC,gBAAE,UAAU;AAAA,YACd;AACA,gBAAI,gBAAgB,OAAO,EAAE,SAAS;AACpC,gBAAE,UAAU,OAAO,OAAO,gBAAgB;AAAA,YAC5C;AACA,gBAAI,gBAAgB,OAAO,EAAE,YAAY;AACvC,gBAAE,aAAa;AAAA,YACjB;AACA,gBAAI,IAAIb,IAAAA,IAAI,OAAA;AACZ,gBAAI,IAAIA,IAAAA,IAAI,OAAA,EAAS,QAAA;AAErB,gBAAI,EAAE;AAAA,cACJA,IAAAA,IACG,OAAA,EACA,SAAS,aAAa,OAAO,EAAE,aAAa,OAAO,EAAE,UAAU,IAAI,EAAE,UAAU;AAAA,YAAA;AAGpF,gBAAI,EAAE;AAAA,cACJA,IAAAA,IACG,SACA;AAAA,gBACC,aAAa,OAAO,EAAE,aAClB,OAAO,SAAS,EAAE,WAAW,UAAU,IACvC,EAAE;AAAA,cAAA;AAAA,YACR;AAEJ,gBAAI,EAAE,kBAAkB;AACtB,kBAAI,CAAC,UAAU,QAAQ,EAAE,SAAS,OAAO,EAAE,OAAO,GAAG;AAEnD,oBAAI,EAAE;AAAA,kBACJA,IAAAA,IAAI,OAAA,EAAS,KAAK,aAAa,OAAO,EAAE,UAAU,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO;AAAA,gBAAA;AAAA,cAEnF;AACA,kBAAI,EAAE;AAAA,gBACJA,IAAAA,IACG,SACA;AAAA,kBACC,aAAa,OAAO,EAAE,UAClB,OAAO,SAAS,EAAE,QAAQ,UAAU,IACpC,EAAE;AAAA,gBAAA;AAAA,cACR;AAAA,YAEN,OAAO;AACL,kBAAI,CAAC,UAAU,QAAQ,EAAE,SAAS,OAAO,EAAE,OAAO,GAAG;AAEnD,oBAAI,EAAE;AAAA,kBACJA,IAAAA,IAAI,OAAA,EAAS,IAAI,aAAa,OAAO,EAAE,UAAU,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO;AAAA,gBAAA;AAAA,cAElF;AACA,kBAAI,EAAE;AAAA,gBACJA,IAAAA,IACG,SACA;AAAA,kBACC,aAAa,OAAO,EAAE,UAClB,OAAO,SAAS,EAAE,QAAQ,UAAU,IACpC,EAAE;AAAA,gBAAA;AAAA,cACR;AAAA,YAEN;AACA,gBAAI,EAAE,kBAAkB;AAEtB,kBAAI,EAAE;AAAA,gBACJA,IAAAA,IAAI,OAAA,EAAS,QAAQ,aAAa,OAAO,EAAE,UAAU,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO;AAAA,cAAA;AAEpF,kBAAI,EAAE;AAAA,gBACJA,IAAAA,IACG,SACA;AAAA,kBACC,aAAa,OAAO,EAAE,UAClB,OAAO,SAAS,EAAE,QAAQ,UAAU,IACpC,EAAE;AAAA,gBAAA;AAAA,cACR;AAAA,YAEN,OAAO;AAEL,kBAAI,EAAE;AAAA,gBACJA,IAAAA,IAAI,OAAA,EAAS,IAAI,aAAa,OAAO,EAAE,UAAU,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO;AAAA,cAAA;AAEhF,kBAAI,EAAE;AAAA,gBACJA,IAAAA,IACG,SACA;AAAA,kBACC,aAAa,OAAO,EAAE,UAClB,OAAO,SAAS,EAAE,QAAQ,UAAU,IACpC,EAAE;AAAA,gBAAA;AAAA,cACR;AAAA,YAEN;AACA,gBAAI,IAAIA,IAAAA,IAAI,aAAa,GAAG,CAAC;AAC7B,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKc,gBAAAA,iCAAwC,QAAQ,GAAG;AACtD,kBAAM,IACJ;AACF,gBAAI,IAAId,IAAAA,IAAI,OAAA,EAAS,OAAA;AACrB,gBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,UAAU,SAAS,EAAE,UAAU,CAAC;AAC1D,gBAAI,EAAE,kBAAkB;AACtB,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,KAAK,EAAE,OAAO,CAAC;AAAA,YAC3C,OAAO;AACL,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,OAAO,CAAC;AAAA,YAC1C;AACA,gBAAI,EAAE,kBAAkB;AACtB,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,QAAQ,EAAE,OAAO,CAAC;AAAA,YAC9C,OAAO;AACL,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,OAAO,CAAC;AAAA,YAC1C;AACA,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKe,gBAAAA,wBAA+B,QAAQ,GAAG;AAC7C,kBAAM,IAA2B;AACjC,gBAAI,IAAIf,IAAAA,IAAI,OAAA;AACZ,gBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAS,EAAE,UAAU,CAAC;AAChD,gBAAI,EAAE,kBAAkB;AACtB,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,KAAK,EAAE,OAAO,CAAC;AAAA,YAC3C,OAAO;AACL,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,OAAO,CAAC;AAAA,YAC1C;AACA,gBAAI,EAAE,kBAAkB;AACtB,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,QAAQ,EAAE,OAAO,CAAC;AAAA,YAC9C,OAAO;AACL,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,OAAO,CAAC;AAAA,YAC1C;AACA,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKgB,gBAAAA,yBAAgC,QAAQ,GAAG;AAC9C,gBAAI,IAAIhB,IAAAA,IAAI,QAAA;AACZ,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKiB,gBAAAA,wBAA+B,QAAQ,GAAG;AAC7C,kBAAM,IAA2B;AAGjC,kBAAM,eAA6C,CAAA;AAEnD,mBAAO,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,SAAS,OAAO,MAAM;AAC3D,kBAAI;AAEJ,kBAAI,WAAW,SAAS;AAEtB,sBAAM,eAAe,QAAQ,MAAM;AAAA,kBAAI,CAAC,SACtC,KAAK;AAAA,oBACH;AAAA,oBACA,KAAK,YAAY;AAAA,oBACjB;AAAA,oBACA,EAAE,KAAK,YAAY;AAAA,kBAAA;AAAA,gBACrB;AAEF,gCAAgBjB,IAAAA,IAAI,aAAa,GAAG,YAAY;AAAA,cAClD,WAAW,WAAW,SAAS;AAE7B,sBAAM,UAAU,QAAQ,MAAM;AAAA,kBAAI,CAAC,SACjC,KAAK;AAAA,oBACH;AAAA,oBACA,KAAK,YAAY;AAAA,oBACjB;AAAA,oBACA,EAAE,KAAK,YAAY;AAAA,kBAAA;AAAA,gBACrB;AAEF,gCAAgB,QAAQ,OAAO,CAAC,KAAK,WAAW,IAAI,OAAO,MAAM,GAAGA,IAAAA,IAAI,IAAA,CAAK;AAAA,cAC/E,WAAW,WAAW,SAAS;AAE7B,sBAAM,eAAe,QAAQ,MAAM;AAAA,kBAAI,CAAC,SACtC,KAAK;AAAA,oBACH;AAAA,oBACA,KAAK,YAAY;AAAA,oBACjB;AAAA,oBACA,EAAE,KAAK,YAAY;AAAA,kBAAA;AAAA,gBACrB;AAEF,gCAAgBA,IAAAA,IAAI,aAAa,GAAG,YAAY;AAAA,cAClD,WAAW,SAAS,SAAS;AAE3B,sBAAM,aAAa,QAAQ,IAAI;AAAA,kBAAI,CAAC,SAClC,KAAK;AAAA,oBACH;AAAA,oBACA,KAAK,YAAY;AAAA,oBACjB;AAAA,oBACA,EAAE,KAAK,YAAY;AAAA,kBAAA;AAAA,gBACrB;AAEF,gCAAgBA,IAAAA,IAAI,IAAA;AACpB,2BAAW,QAAQ,CAAC,cAAc;AAChC,kCAAgB,cAAc;AAAA,oBAC5BA,IAAAA,IAAI,KAAK,WAAW,EAAE,MAAMA,IAAAA,IAAI,aAAa;AAAA,kBAAA;AAAA,gBAEjD,CAAC;AAAA,cACH,OAAO;AAEL,gCAAgB,KAAK;AAAA,kBACnB;AAAA,kBACA,QAAQ,YAAY;AAAA,kBACpB;AAAA,kBACA,EAAE,QAAQ,YAAY;AAAA,gBAAA;AAExB,oBAAI,MAAM,QAAQ,EAAE,QAAQ,KAAK,EAAE,SAAS,SAAS,OAAO,GAAG;AAE7D,kCAAgB,cAAc,OAAOA,IAAAA,IAAI,IAAA,EAAM,UAAU;AAAA,gBAC3D;AAAA,cACF;AAGA,kBAAI,EAAE,YAAY,EAAE,SAAS,SAAS,OAAO,GAAG;AAC9C,8BAAc,SAAA;AAAA,cAChB;AAEA,2BAAa,OAAO,IAAI;AAAA,YAC1B,CAAC;AACD,gBAAI,IAAIA,IAAAA,IAAI,OAAO,YAAY;AAE/B,gBAAI,EAAE,kBAAkB,QAAW;AACjC,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,aAAa,CAAC;AAAA,YAChD;AAEA,gBAAI,EAAE,kBAAkB,QAAW;AACjC,kBAAI,EAAE,OAAOA,IAAAA,IAAI,OAAA,EAAS,IAAI,EAAE,aAAa,CAAC;AAAA,YAChD;AAEA,gBAAIkB,oBAAAA,WAAgB,EAAE,oBAAoB,GAAG;AAC3C,oBAAM,2BAA2B,EAAE;AACnC,kBAAI,EAAE;AAAA,gBACJlB,IAAAA,IACG,SACA;AAAA,kBACCA,IAAAA,IAAI,OAAA;AAAA,kBACJ,KAAK;AAAA,oBACH;AAAA,oBACA,yBAAyB,YAAY;AAAA,oBACrC;AAAA,oBACA,EAAE,yBAAyB,YAAY;AAAA,kBAAA;AAAA,gBACzC;AAAA,cACF;AAAA,YAEN,OAAO;AACL,kBAAI,EAAE,OAAOA,QAAI,SAAS,QAAQ,SAAS,EAAE,oBAAoB,CAAC;AAAA,YACpE;AACA,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AAEA,mBAAO;AAAA,UACT;AAAA,UACA,KAAKmB,gBAAAA,uBAA8B,QAAQ,GAAG;AAC5C,kBAAM,IAA0B;AAChC,gBAAI,IAAInB,IAAAA,IAAI,MAAA;AAEZ,gBAAI;AACJ,gBAAI,WAAW,EAAE,OAAO;AAEtB,oBAAM,eAAe,EAAE,MAAM,MAAM;AAAA,gBAAI,CAAC,SACtC,KAAK;AAAA,kBACH;AAAA,kBACA,KAAK,YAAY;AAAA,kBACjB;AAAA,kBACA,EAAE,KAAK,YAAY;AAAA,gBAAA;AAAA,cACrB;AAEF,8BAAgBA,IAAAA,IAAI,aAAa,GAAG,YAAY;AAAA,YAClD,WAAW,WAAW,EAAE,OAAO;AAE7B,oBAAM,UAAU,EAAE,MAAM,MAAM;AAAA,gBAAI,CAAC,SACjC,KAAK;AAAA,kBACH;AAAA,kBACA,KAAK,YAAY;AAAA,kBACjB;AAAA,kBACA,EAAE,KAAK,YAAY;AAAA,gBAAA;AAAA,cACrB;AAEF,8BAAgB,QAAQ,OAAO,CAAC,KAAK,WAAW,IAAI,OAAO,MAAM,GAAGA,IAAAA,IAAI,IAAA,CAAK;AAAA,YAC/E,WAAW,WAAW,EAAE,OAAO;AAE7B,oBAAM,eAAe,EAAE,MAAM,MAAM;AAAA,gBAAI,CAAC,SACtC,KAAK;AAAA,kBACH;AAAA,kBACA,KAAK,YAAY;AAAA,kBACjB;AAAA,kBACA,EAAE,KAAK,YAAY;AAAA,gBAAA;AAAA,cACrB;AAEF,8BAAgBA,IAAAA,IAAI,aAAa,GAAG,YAAY;AAAA,YAClD,WAAW,SAAS,EAAE,OAAO;AAE3B,oBAAM,aAAa,EAAE,MAAM,IAAI;AAAA,gBAAI,CAAC,SAClC,KAAK;AAAA,kBACH;AAAA,kBACA,KAAK,YAAY;AAAA,kBACjB;AAAA,kBACA,EAAE,KAAK,YAAY;AAAA,gBAAA;AAAA,cACrB;AAEF,8BAAgBA,IAAAA,IAAI,IAAA;AACpB,yBAAW,QAAQ,CAAC,cAAc;AAChC,gCAAgB,cAAc,OAAOA,IAAAA,IAAI,KAAK,WAAW,EAAE,MAAMA,IAAAA,IAAI,UAAA,EAAU,CAAG,CAAC;AAAA,cACrF,CAAC;AAAA,YACH,OAAO;AAEL,8BAAgB,KAAK;AAAA,gBACnB,EAAE;AAAA,gBACF,EAAE,MAAM,YAAY;AAAA,gBACpB;AAAA,gBACA,EAAE,EAAE,MAAM,YAAY;AAAA,cAAA;AAAA,YAE1B;AACA,gBAAI,EAAE,OAAOA,IAAAA,IAAI,QAAQ,MAAM,aAAa,CAAC;AAC7C,gBAAI,EAAE,aAAa,QAAW;AAC5B,kBAAI,EAAE,OAAOA,IAAAA,IAAI,MAAA,EAAQ,IAAI,EAAE,QAAQ,CAAC;AAAA,YAC1C;AACA,gBAAI,EAAE,aAAa,QAAW;AAC5B,kBAAI,EAAE,OAAOA,IAAAA,IAAI,MAAA,EAAQ,IAAI,EAAE,QAAQ,CAAC;AAAA,YAC1C;AACA,gBAAI,EAAE,aAAa;AACjB,kBAAI,EAAE,OAAOA,IAAAA,IAAI,MAAA,EAAQ,QAAQ;AAAA,YACnC;AACA,gBAAI,UAAU;AACZ,kBAAI,EAAE,MAAM,IAAI;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AAAA,UACA;AACE,mBAAOA,IAAAA,IAAI,IAAA,EAAM,UAAA;AAAA,QAAU;AAAA,MAEjC;AAAA,MAEA,aAAuB,yBACrB,KACA,KACA,KACA,iBAIA,iBAAmD,CAAA,GACnD,kBAAoD,CAAA,GACpD,MACA,WAAoB,OAC8B;AAClD,cAAM,WAAW,YAAY,KAAK,eAAe;AACjD,YAAI,SAAS,UAAU;AAIrB,cAAI,iBAAiB,sBAAsB;AACzC,mBAAO,EAAE,SAAS,OAAO,UAAU,MAAA;AAAA,UACrC;AAAA,QACF;AACA,cAAM,UACJ,SAAS,WAAW,QAAQ,MAAM,KAAK,wBAAwB,KAAK,KAAK,cAAc;AACzF,cAAM,WACJ,mBAAmB,QAAS,uBAAuB,QAAQ,CAAC,WACxD,QACA,MAAM,KAAK;AAAA,UACT;AAAA,UACA;AAAA,UACA,gBAAgB,SAAS,IAAI,kBAAkB;AAAA,QAAA;AAEvD,eAAO,EAAE,SAAS,SAAA;AAAA,MACpB;AAAA,MAEA,aAAuB,wBACrB,KACA,KACA,OAAyC,CAAA,GACvB;AAClB,YAAI,KAAK,WAAW,GAAG;AACrB,iBAAO;AAAA,QACT;AACA,cAAM,UAAU,MAAM;AAAA,UACpB;AAAA,UACA,OAAO,QAAQ;AACb,gBAAI;AACF,qBAAO,MAAM,IAAI,KAAK,GAAG;AAAA,YAC3B,SAAS,KAAK;AACZ,2CAA6B,KAAK,aAAa,KAAK,KAAK,KAAK,MAAS;AACvE,sBAAQ,iBAAiB,YAAA;AAAA,gBACvB,KAAK;AACH,yBAAO;AAAA,gBACT,KAAK;AACH,yBAAO;AAAA,gBACT;AACE,wBAAM;AAAA,cAAA;AAAA,YAEZ;AAAA,UACF;AAAA,UACA;AAAA,YACE,aAAa,iBAAiB,SAAS;AAAA,UAAA;AAAA,QACzC;AAEF,eAAO,QAAQ,MAAM,CAAC,WAAW,WAAW,IAAI;AAAA,MAClD;AAAA,MAEA,aAAa,uBACX,KACA,KACA,YAA8B,QAC9B,gBAA4C,CAAA,GAC5C,eACwC;AACxC,cAAM,0BAA0B;AAAA,UAC9B,kBAAkB,cAAc,oBAAoB;AAAA,UACpD,oBAAoB,cAAc,sBAAsB;AAAA,UACxD;AAAA,UACA;AAAA,QAAA;AAGF,cAAM,6BACJ,iBAAkB,MAAM,KAAK,4BAA4B,KAAK,GAAG;AAEnE,cAAM,UAAU,IAAI,qBAAA;AAEpB,eAAO,MAAM,QAAQ;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAAA,MAEA,aAAa,iCACX,KACA,KACA,YAAqB,OACrB;AACA,cAAM,UAAuB,CAAA;AAC7B,cAAM;AAAA,UACJ,YACI,iBAAiB,iCAAiC,UAAU,CAAA,IAC5D,iBAAiB,iCAAiC,UAAU,CAAA;AAAA,UAChE,OAAO,YAAY;AACjB,kBAAM,SAAS,MAAM,QAAQ,KAAK,GAAG;AACrC,gBAAI,QAAQ;AACV,sBAAQ,KAAK,MAAM;AAAA,YACrB;AAAA,UACF;AAAA,UACA,EAAE,aAAa,EAAA;AAAA,QAAE;AAEnB,YAAI,MAAMA,IAAAA,IAAI,IAAA;AACd,gBAAQ,QAAQ,CAAC,WAAW;AAC1B,gBAAM,IAAI,OAAO,MAAM;AAAA,QACzB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MAEA,aAAa,qCACX,KACA,KACA,YAAqB,OACrB;AACA,cAAM,gBAAgB,MAAM,KAAK,4BAA4B,KAAK,GAAG;AACrE,cAAM,SAAS,MAAM,KAAK,uBAAuB,KAAK,KAAK,SAAS,CAAA,GAAI,aAAa;AACrF,cAAM,iBAAiB,MAAM,KAAK,iCAAiC,KAAK,KAAK,SAAS;AAEtF,YAAI,kBAAkBA,IAAAA,IAAI;AAAA,UACxB,OAAO;AAAA,YACL,CAAA;AAAA,YACA,GAAG,OAAO,KAAK,OAAO,UAAW,EAC9B,OAAO,CAAC,MAAM;AACb,kBAAI,MAAM,KAAK,WAAY,QAAO;AAClC,oBAAM,aAAkC,OAAO,WAAY,CAAC;AAC5D,kBAAIP,SAAAA,SAAS,UAAU,GAAG;AACxB,oBACE,cACC,WAAW,2BAA2B,MAAM,QAC3C,WAAW,yBAAyB,MAAM,OAC5C;AACA,yBAAO;AAAA,gBACT;AACA,oBACE,CAAC,cACA,WAAW,2BAA2B,MAAM,QAC3C,WAAW,2BAA2B,MAAM,OAC9C;AACA,yBAAO;AAAA,gBACT;AAAA,cACF;AACA,qBAAO;AAAA,YACT,CAAC,EACA,IAAI,CAAC,yBAAyB;AAC7B,kBAAI,mBAA2BO,IAAAA,IAAI,IAAA;AAEnC,oBAAM,OAAO,cAAc,WAAW,oBAAoB;AAC1D,oBAAM,aAAa,OAAO,WAAY,oBAAoB;AAC1D,kBAAI,MAAM;AACR,sBAAM,gBAAgB,KAAK;AAC3B,oBAAI,eAAe;AACjB,qCAAmB,iBAAiB,OAAO,aAAa;AAAA,gBAC1D;AAAA,cACF;AAEA,kBAAI;AACF,sBAAM,YAAY,eAAe,QAAQ,oBAAoB;AAC7D,oBAAI,WAAW;AACb,qCAAmB,iBAAiB,OAAO,SAAS;AAAA,gBACtD;AAAA,cACF,QAAQ;AAAA,cAER;AAEA,oBAAM,WACJ,CAAC,aACD,MAAM,QAAQ,OAAO,QAAQ,KAC7B,OAAO,SAAS,SAAS,oBAAoB;AAC/C,oBAAM,WAAW,QAAQ,KAAK,cAAc,KAAK,WAAW,aAAa;AAEzE,kBAAI,UAAU;AACZ,mCAAmB,iBAAiB,SAAA;AAAA,cACtC,OAAO;AACL,mCAAmB,iBAAiB,SAAA;AAAA,cACtC;AAEA,kBAAI,UAAU;AACZ,oBAAI,cAAc,UAAU,cAAc,WAAW,SAAS,UAAU;AACtE,qCAAmB,iBAAiB,MAAM,IAAI;AAAA,gBAChD,OAAO;AACL,qCAAmBA,IAAAA,IAAI,aAAa,kBAAkBA,IAAAA,IAAI,MAAM,IAAI,CAAC;AAAA,gBACvE;AAAA,cACF;AAEA,qBAAO;AAAA,gBACL,CAAC,oBAAoB,GAAG;AAAA,cAAA;AAAA,YAE5B,CAAC;AAAA,UAAA;AAAA,QACL;AAIF;AAAA;AAAA,UAEE,eAAe;AAAA,UAEf,MAAM,QAAQ,eAAe,MAAM;AAAA,UAEnC,eAAe,OAAO;AAAA,UACtB;AAGA,yBAAe,OAAO,QAAQ,CAAC,SAAc;AAC3C,gBACE,KAAK,SAAS,YACd,KAAK,WAAW,YAChB,OAAO,KAAK,KAAK,WAAW,YAC5B;AACA,gCAAkB,gBAAgB,OAAO,KAAK,KAAK,MAAM;AACzD;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAGA,YAAI,eAAe,SAAS,cAAc,QAAQ;AAChD,yBAAe,SAAS,aAAa,QAAQ,CAAC,QAAa;AAEzD,gBACE,IAAI,QAAQ,QACZ,MAAM,QAAQ,IAAI,KAAK,KACvB,IAAI,MAAM,MAAM,CAAC,SAAkC,OAAO,SAAS,QAAQ,GAC3E;AACA,gCAAkB,gBAAgB,GAAG,GAAG,IAAI,KAAK;AACjD;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO;AAAA,UACL;AAAA,UACA,WAAW;AAAA,QAAA;AAAA,MAEf;AAAA,MAEA,aAAuB,wBACrB,QACuC;AACvC,cAAM,EAAE,KAAK,KAAK,WAAW,aAAa;AAC1C,cAAM,2CAA2B,IAAA;AACjC,cAAM,wCAAwB,IAAA;AAC9B,cAAM,4BAA4B,iBAAiB,qBAAqB,SAAS;AAEjF,YAAI,2BAA2B;AAC7B,gBAAM,2BAA2B,MAAM,QAAQ;AAAA,YAC7C,0BAA0B,IAAI,CAAC,SAAS,KAAK,KAAK,KAAK,QAAe,CAAC;AAAA,UAAA;AAEzE,gBAAM,0BAA0B,yBAAyB,MAAM,OAAO;AAEtE,cAAI,CAAC,yBAAyB;AAC5B,mBAAO;AAAA,cACL,aAAa;AAAA,cACb,SAAS;AAAA,cACT,sBAAsB;AAAA,YAAA;AAAA,UAE1B;AAAA,QACF;AAGA,YAAI,cAAcoB,SAAAA,mBAAmB,QAAQ;AAC3C,iBAAO;AAAA,YACL,aAAa;AAAA,YACb;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAEA,cAAM,iBAAiB,KAAK,oBAAoB,OAAA;AAChD,cAAM,eAAeC,SAAAA,mBAAmB,SAAS;AACjD,cAAM,wCAAwC,CAAC,gBAAwB;AACrE,gBAAM,iBAAiB,KAAK,MAAM,uBAAuB,QAAQ,WAAW;AAC5E,gBAAM,aAAa,KAAK,MAAM,oBAAoB,QAAQ,cAAc;AAIxE,cAAI,iBAAiBC,SAAAA,kBAAkB,SAAS,mBAAmB,MAAM;AAEvE,gBAAI,YAAY;AACd,mCAAqB,IAAI,YAAY,IAAI;AACzC,gCAAkB,IAAI,YAAY,IAAI;AAAA,YACxC;AAAA,UACF,WAAW,aAAa,OAAO,gBAAgB;AAC7C,iCAAqB,IAAI,gBAAgB,IAAI;AAC7C,gBAAI,YAAY;AACd,gCAAkB,IAAI,YAAY,IAAI;AAAA,YACxC;AAAA,UACF;AAAA,QACF;AAEA,mBAAW,iBAAiB,gBAAgB;AAC1C,gBAAM,qBACJ,iBAAiBA,SAAAA,kBAAkB,OAC/B,cAAc,2BACd,cAAc;AAGpB,cAAI,CAAC,oBAAoB;AACvB,kDAAsC,cAAc,WAAW;AAE/D;AAAA,UACF;AAEA,gBAAM,YAAY,MAAM,KAAK,wBAAwB,KAAK,KAAK,kBAAkB;AAEjF,cAAI,WAAW;AACb,kDAAsC,cAAc,WAAW;AAAA,UACjE;AAAA,QACF;AAGA,YAAI,iBAAiBA,SAAAA,kBAAkB,MAAM;AAC3C,gBAAM,2BAA2B,KAAK,8BAA8B,OAAA;AAEpE,qBAAW,2BAA2B,0BAA0B;AAC9D,kBAAM,qBAAqB,wBAAwB;AAGnD,gBAAI,CAAC,oBAAoB;AAEvB,mCAAqB,IAAI,wBAAwB,aAAa,IAAI;AAClE;AAAA,YACF;AAEA,kBAAM,YAAY,MAAM,KAAK,wBAAwB,KAAK,KAAK,kBAAkB;AAEjF,gBAAI,WAAW;AACb,mCAAqB,IAAI,wBAAwB,aAAa,IAAI;AAAA,YACpE;AAAA,UACF;AAGA,gBAAM,sBAAsB,KAAK,0BAA0B,OAAA;AAE3D,qBAAW,sBAAsB,qBAAqB;AACpD,kBAAM,qBAAqB,mBAAmB;AAG9C,gBAAI,CAAC,oBAAoB;AAEvB,mCAAqB,IAAI,mBAAmB,aAAa,IAAI;AAC7D;AAAA,YACF;AAEA,kBAAM,YAAY,MAAM,KAAK,wBAAwB,KAAK,KAAK,kBAAkB;AAEjF,gBAAI,WAAW;AACb,mCAAqB,IAAI,mBAAmB,aAAa,IAAI;AAAA,YAC/D;AAAA,UACF;AAAA,QACF;AAEA,cAAM,qBAAqB,CAAC,qBAAqB;AAEjD,YAAI,oBAAoB;AACtB,iBAAO;AAAA,YACL,aAAa;AAAA,YACb,SAAS;AAAA,UAAA;AAAA,QAEb;AAEA,eAAO;AAAA,UACL,aAAa;AAAA,UACb;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAAA,MAEA,OAAe,0BAA0B;AACvC,YAAI;AACJ,aAAK,oBAAoB,QAAQ,CAAC,eAAe,cAAc;AAC7D,cACE,cAAc,gBAAgB,SAC7B,cAAc,aAAa,cAAc,eAAe,KAAK,aAC9D;AACA,kBAAM,cAAc,eAAe;AAAA,UACrC;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MAEA,OAAO,yCAAyC;AAC9C,cAAM,mBAAmB,MAAM,KAAK,KAAK,0BAA0B,QAAA,CAAS,EACzE,OAAO,CAAC,CAAC,WAAW,MAAM;AAEzB,gBAAM,WAAW,KAAK,aAAa,WAAW;AAC9C,iBAAO,CAAC,WAAW,QAAQ;AAAA,QAC7B,CAAC,EACA,IAAI,CAAC,CAAC,WAAW,MAAM,WAAW;AACrC,cAAM,wBAAwB,MAAM,KAAK,KAAK,0BAA0B,QAAA,CAAS,EAC9E,OAAO,CAAC,CAAC,WAAW,MAAM;AAEzB,gBAAM,WAAW,KAAK,aAAa,WAAW;AAC9C,cAAI,CAAC,SAAU,QAAO;AACtB,cAAI,SAAS,gBAAgB,KAAM,QAAO;AAE1C,iBAAO,SAAS,SAAS,eAAe,SAAS,SAAS;AAAA,QAC5D,CAAC,EACA,IAAI,CAAC,CAAC,WAAW,MAAM,WAAW;AACrC,cAAM,kBAAkB,MAAM,KAAK,KAAK,oBAAoB,SAAS,EAClE,IAAI,CAAC,CAAC,WAAW,MAAM,WAAW,EAClC,OAAO,CAAC,gBAAgB;AACvB,gBAAM,qBAAqB,KAAK,WAAW,WAAW;AACtD,cAAI,CAAC,mBAAoB,QAAO;AAChC,cAAI,mBAAmB,gBAAgB,KAAM,QAAO;AACpD,iBAAO,mBAAmB,gBAAgB;AAAA,QAC5C,CAAC;AACH,cAAM,mBAAmB,MAAM,KAAK,KAAK,8BAA8B,SAAS,EAC7E,IAAI,CAAC,CAAC,WAAW,MAAM,WAAW,EAClC,OAAO,CAAC,gBAAgB;AACvB,gBAAM,uBAAuB,KAAK,aAAa,WAAW;AAC1D,cAAI,CAAC,qBAAsB,QAAO;AAClC,cAAI,qBAAqB,gBAAgB,KAAM,QAAO;AACtD,iBAAO,qBAAqB,gBAAgB;AAAA,QAC9C,CAAC;AACH,cAAM,iBAAiB,MAAM;AAAA,UAC3B,oBAAI,IAAI,CAAC,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;AAAA,QAAA,EAE1E,IAAI,CAAC,SAAS,KAAK,MAAM,uBAAuB,IAAI,IAAI,KAAK,IAAI,EACjE,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC;AACtC,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6DA,OAAiB,yBACf,QACA,gBACA,yBAAmC,CAAA,GACnC,sBACyF;AACzF,YAAI,SAAS,UAAU,WAAc,QAAQ;AAC3C,iBAAO;AAAA,QACT;AACA,cAAM,SAEF,CAAA;AACJ,cAAM,EAAE,gBAAgB,sBAAsB,KAAK,uCAAA;AACnD,yBAAiB,eAAe;AAAA,UAC9B,CAAC,UAAU,kBAAkB,SAAS,KAAK,KAAK,uBAAuB,SAAS,KAAK;AAAA,QAAA;AAEvF,uBAAe,QAAQ,CAAC,UAAU;AAChC,gBAAM,YAAY,KAAK,MAAM,uBAAuB,IAAI,KAAK,KAAK;AAClE,cAAI,CAAC,UAAW;AAChB,gBAAM,QAAQ,OAAO,SAAgC;AACrD,cAAI,UAAU,QAAW;AACvB,kBAAM,iCAAiC,KAAK,0BAA0B,IAAI,SAAS;AACnF,gBAAI,gCAAgC;AAElC,oBAAM,eAAe,+BAA+B,aAAA;AACpD,kBACE,eAAe,OAAO,aAAa,4BACnC,eAAe,OAAO,aAAa,wCACnC;AACA,sBAAM;AAAA,kBACJ,gBAAgB;AAAA,kBAChB,uBAAuB;AAAA,gBAAA,IACrB,aAAa,uCAAA;AAWjB,sBAAM,2BAA2B,sBAAsB,IAAI,KAAK;AAChE,oBAAI;AACJ,oBAAI;AACJ,oBAAI,0BAA0B;AAE5B,qCAAmB,sBAAsB;AAAA,oBACvC,CAAC,MACC,CAAC,6BAA6B,SAAS,CAAC,KACxC,yBAAyB,SAAS,CAAC;AAAA,kBAAA;AAGvC,+CAA6B,IAAI;AAAA,oBAC/B,yBAAyB,IAAI,CAAC,MAAc,CAAC,GAAG,CAAA,CAAE,CAAC;AAAA,kBAAA;AAAA,gBAEvD,OAAO;AAEL,qCAAmB;AACnB,+CAA6B;AAAA,gBAC/B;AACA,uBACE,KAGF,IAAI,aAAa;AAAA,kBACf;AAAA,kBACA;AAAA,kBACA,CAAA;AAAA,kBACA;AAAA,gBAAA;AAAA,cAEJ,WAAW,eAAe,OAAO,MAAM,WAAW;AAChD,uBACE,KAGF,IAAI,MAAM,UAAA;AAAA,cACZ;AAAA,YACF,OAAO;AACL,qBACE,KAGF,IAAI;AAAA,YACN;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAOzB,SAAAA,+BAA+B,MAAM;AAAA,MAG9C;AAAA,MAEA,aAAuB,sCACrB,KACA,KACA,SACA,eACiC;AACjC,cAAM,EAAE,aAAa,iBAAiB,CAAA;AACtC,cAAM,EAAE,cAAc,MAAM,KAAK,qCAAqC,KAAK,KAAK,QAAQ;AAExF,cAAM,eAAe,YAA6C;AAChE,cAAI;AACF,kBAAM,UACH,GAAG,KAAK,SAAS,uBAAuB,IAAI,CAAQ,EACpD,cAAc,SAAS,EAAE,YAAY,OAAO;AAE/C,mBAAO;AAAA,UACT,SAAS,KAAK;AACZ,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,cAAM,kBAAkB,MAAM,aAAA;AAE9B,YAAI,iBAAiB;AAEnB,cACE,gBAAgB,SAAS,WAAW,KACpC,gBAAgB,QAAQ,CAAC,EAAE,SAAS,oBACpC;AACA,kBAAM,oBAAoB,gBAAgB,QAAQ,CAAC;AAEnD,gBAAI,kBAAkB,SAAS,QAAQ,QAAQ;AAC7C,8BAAgB,UAAU,kBAAkB,QAAQ;AACpD,8BAAgB,UAAU,kBAAkB,QAAQ,QAAQ,CAAC,EAAE;AAAA,YACjE;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,aAAuB,yCACrB,KACA,KACA,SACA,sBACA;AACA,cAAM,WAAW,MAAM,QAAQ,IAAI,qBAAqB,IAAI,CAAC,WAAW,OAAO,KAAK,GAAG,CAAC,CAAC;AACzF,cAAM,UAAU,SAAS,OAAO,CAAC,WAAW,WAAW,QAAQ,WAAW,MAAS;AAEnF,mBAAW,UAAU,SAAS;AAC5B,gBAAM,EAAE,OAAO,YAAA,IAAgB,OAAO,SAAS,OAAO;AAEtD,cAAI,aAAa;AACf,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,aAAuB,wBACrB,KACA,KACA,SACA,mBACA,sBACA;AACA,cAAM,UAAoB,CAAA;AAC1B,cAAM,CAAC,8BAA8B,+BAA+B,IAAI,MAAM,QAAQ,IAAI;AAAA,UACxF,KAAK,mBAAmB,OAAO,WAAW,MAAM,OAAO,KAAK,GAAG,GAAG,EAAE,aAAa,GAAG;AAAA,UACpF,KAAK,sBAAsB,OAAO,WAAW,MAAM,OAAO,KAAK,GAAG,GAAG,EAAE,aAAa,EAAA,CAAG;AAAA,QAAA,CACxF;AACD,qCACG,OAAO,CAAC,MAAM,MAAM,QAAQ,MAAM,MAAS,EAC3C,QAAQ,CAAC,MAAM;AACd,kBAAQ,KAAK,CAAC;AAAA,QAChB,CAAC;AACH,wCACG,OAAO,CAAC,MAAM,MAAM,QAAQ,MAAM,MAAS,EAC3C,QAAQ,CAAC,MAAM;AACd,kBAAQ,KAAK,CAAC;AAAA,QAChB,CAAC;AACH,cAAM,YAAY,MAAM;AAAA,UACtB;AAAA,UACA,OAAO,WAAW;AAChB,gBAAI;AACF,qBAAO,MAAM,OAAO,cAAc,SAAS,EAAE,YAAY,MAAM,SAAS,MAAM;AAAA,YAChF,QAAQ;AACN,qBAAO,CAAA;AAAA,YACT;AAAA,UACF;AAAA,UACA,EAAE,aAAa,EAAA;AAAA,QAAE;AAEnB,eAAO,OAAO,OAAO,CAAA,GAAI,SAAgC,GAAG,SAAS;AAAA,MAIvE;AAAA,MAEA,OAAiB,8BAA8B;AAC7C,eAAO,KAAK,SAAS,uBAAuB,IAAI,EAAE,QAAQ,KAAK,KAAK,KAAK;AAAA,MAC3E;AAAA,MAEA,aAAa,oBACXlC,SACA,MACA,SACA,QACA,MACA,KACA,KACA,QAA+B,IAC/B,eAAiD,CAAA,GACQ;AAMzD,cAAM,aAAa,KAAK,wBAAA;AAExB,YAAI,CAAC,YAAY;AACf,gBAAM,IAAI4D,SAAAA,gCAAgC,KAAK,gBAAgB;AAAA,QACjE;AAEA,YAAI,CAAC/B,SAAAA,SAAS7B,OAAM,GAAG;AACrB,UAAAA,UAAS;AAAA,QACX;AAEA,iBAAS6D,SAAAA,cAAc,QAAQ,UAAU;AAOzC,cAAM,EAAE,aAAa,sBAAsB,YAAY,MAAM,KAAK,wBAAwB;AAAA,UACxF;AAAA,UACA;AAAA,UACA,WAAWJ,SAAAA,mBAAmB;AAAA,QAAA,CAC/B;AAED,YAAI,aAAa;AACf,gBAAM,IAAIK,SAAAA,YAAY,OAAO;AAAA,QAC/B;AAOA,cAAM,EAAE,kBAAkB,uBAAuB,iBAAiB,iBAAA,IAChE,KAAK,uCAAA;AAEP,cAAM,iBAAiB,MAAM,KAAK,qBAAqB,KAAA,CAAM,EAAE;AAAA,UAC7D,CAAC,MACC,gBAAgB,SAAS,CAAC,KAC1B,iBAAiB,SAAS,CAAC,KAC3B,CAAC,iBAAiB,SAAS,CAAC,KAC5B,sBAAsB,SAAS,CAAC;AAAA,QAAA;AAEpC,YAAI,eAAe,WAAW,GAAG;AAC/B,gBAAM,IAAIC,SAAAA,wBAAwB,gCAAgC;AAAA,QACpE;AA8BA,cAAM,wCAA+C,IAAA;AACrD,cAAM,mCAAgC,IAAA;AACtC,YAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,qBAAW,KAAK,QAAQ;AACtB,kBAAM,WAAW,EAAE,QAAQ,GAAG;AAC9B,gBAAI,WAAW,GAAG;AAChB,oBAAM,OAAO,EAAE,UAAU,GAAG,QAAQ;AACpC,oBAAM,SAAS,EAAE,UAAU,WAAW,CAAC;AAEvC,kBAAI,OAAO,SAAS,GAAG,GAAG;AACxB,sBAAM,IAAIA,SAAAA;AAAAA,kBACR,kEAAkE,IAAI,IAAI,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,4BAA4B,CAAC;AAAA,gBAAA;AAAA,cAE/H;AAEA,kBAAI,CAAC,sBAAsB,SAAS,IAAI,GAAG;AACzC,sBAAM,IAAIA,SAAAA;AAAAA,kBACR,eAAe,CAAC,iBAAiB,IAAI;AAAA,gBAAA;AAAA,cAEzC;AAEA,oBAAM,SAAS,KAAK,0BAA0B,IAAI,IAAI;AACtD,kBAAI,QAAQ;AACV,sBAAM,eAAe,OAAO,aAAA;AAC5B,oBAAI,eAAe,OAAO,aAAa,wCAAwC;AAC7E,wBAAM,EAAE,uBAAuB,6BAC7B,aAAa,uCAAA;AACf,sBAAI,CAAC,yBAAyB,SAAS,MAAM,GAAG;AAC9C,0BAAM,IAAIA,SAAAA;AAAAA,sBACR,eAAe,CAAC,iBAAiB,MAAM,oDAAoD,IAAI;AAAA,oBAAA;AAAA,kBAEnG;AAAA,gBACF,OAAO;AAGL,wBAAM,IAAIA,SAAAA;AAAAA,oBACR,eAAe,CAAC,2BAA2B,IAAI;AAAA,kBAAA;AAAA,gBAEnD;AAAA,cACF;AACA,kBAAI,CAAC,kBAAkB,IAAI,IAAI,GAAG;AAChC,kCAAkB,IAAI,MAAM,EAAE;AAAA,cAChC;AACA,gCAAkB,IAAI,IAAI,EAAG,KAAK,MAAM;AAExC,2BAAa,IAAI,IAAI;AAAA,YACvB,OAAO;AACL,2BAAa,IAAI,CAAC;AAAA,YACpB;AAAA,UACF;AACA,mBAAS,MAAM,KAAK,YAAY;AAAA,QAClC;AACA,cAAM,SAAS1B,IAAAA,IAAI,OAAO;AAAA,UACxB,QAAQA,IAAAA,IAAI,OAAA,EAAS,MAAM,EAAE,EAAE,SAAA;AAAA,UAC/B,MAAMA,IAAAA,IAAI,SAAS,UAAU,IAAI,CAAC,EAAE,SAAA;AAAA,UACpC,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAA,EAAU,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;AAAA,UAChD,QAAQA,IAAAA,IACL,MAAA,EACA,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,GAAG,cAAc,CAAC,EAC3C,SAAA;AAAA,QAAS,CACb;AACD,cAAM,EAAE,OAAO,uBAAuB,OAAO,uBAAA,IAA2B,OAAO;AAAA,UAC7E;AAAA,YACE,QAAArC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAEF;AAAA,YACE,YAAY;AAAA,UAAA;AAAA,QACd;AAEF,YAAI,uBAAuB;AACzB,gBAAM,IAAIgE,SAAAA,6CAA6C,qBAAqB;AAAA,QAC9E;AAMA,YAAI,QAAQ;AAAA,UACV,uBAAuB;AAAA,UACvB,KAAK,SAAS,uBAAuB,IAAI;AAAA,UACzC,KAAK,MAAM;AAAA,UACX;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QAAA;AAOF,mBAAW,iBAAiB;AAAA,UAC1B,GAAI,KAAK,gCAAgC,QAAQ,CAAA;AAAA,UACjD,GAAG;AAAA,QAAA,GACF;AACD,gBAAM,cAAc,KAAK,KAAK,OAAO,IAAI;AAAA,QAC3C;AAMA,cAAM,aAAa,MAAM,MAAA;AACzB,cAAM,eAAe,MAAM,MAAA;AAC3B,cAAM,mBAAmB,KAAK,MAAM,oBAAoB,IAAI,UAAU;AACtE,mBAAW,MAAM,KAAK,OAAO;AAC7B,eAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,WAAW;AAC5C,gBAAM,UAAU,aAAa,MAAM;AACnC,gBAAM,cAAc,KAAK,MAAM,oBAAoB,IAAI,MAAM;AAC7D,gBAAM,wBAAwB,KAAK,oBAAoB,IAAI,MAAM;AACjE,cAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,sBAAsB,cAAc;AACjF,kBAAM,IAAIC,SAAAA,4BAA4B,QAAQ,KAAK,gBAAgB;AAAA,UACrE;AACA,gBAAM,gBAAgB,IAAI,IAAI,OAAO;AACrC,wBAAc,QAAQ,CAAC,uBAAuB;AAC5C,oBAAQ,oBAAA;AAAA,cACN,KAAK;AACH,2BAAW,IAAI,aAAa,CAAC,QAAQ,KAAK,EAAE,KAAK,EAAE,CAAC;AACpD;AAAA,cACF,KAAK;AACH,2BAAW,IAAI,aAAa,CAAC,QAAQ,KAAK,EAAE,KAAK,EAAE,CAAC;AACpD;AAAA,cACF,KAAK;AACH,2BAAW,IAAI,aAAa,CAAC,QAAQ,KAAK,EAAE,KAAK,EAAE,CAAC;AACpD;AAAA,cACF,KAAK;AACH,2BAAW,IAAI,aAAa,CAAC,QAAQ,KAAK,EAAE,KAAK,EAAE,CAAC;AACpD;AAAA,cACF,KAAK;AACH,2BAAW,cAAc,aAAa,CAAC,QAAQ,eAAe,EAAE,KAAK,EAAE,CAAC;AACxE;AAAA,cACF,KAAK;AACH,2BAAW,YAAY,aAAa,CAAC,QAAQ,aAAa,EAAE,KAAK,EAAE,CAAC;AACpE;AAAA,cACF,KAAK;AACH,2BAAW,YAAY,aAAa,CAAC,QAAQ,aAAa,EAAE,KAAK,EAAE,CAAC;AACpE;AAAA,cACF;AACE,sBAAM,IAAIC,SAAAA;AAAAA,kBACR;AAAA,kBACA,KAAK;AAAA,kBACL;AAAA,gBAAA;AAAA,YACF;AAAA,UAEN,CAAC;AAAA,QACH,CAAC;AACD,qBACG,OAAO,gBAAgB,EACvB,QAAQ,uBAAuB,MAAM,uBAAuB,OAAO;AAEtE,YAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AAC1C,eAAK,QAAQ,CAAC,CAAC,OAAO,SAAS,MAAM;AACnC,kBAAM,aAAa,KAAK,MAAM,oBAAoB,IAAI,KAAK;AAC3D,gBAAI,qBAAqB,IAAI,KAAK,KAAK,YAAY;AACjD,2BAAa,QAAQ,YAAY,SAAS;AAAA,YAC5C;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,kBAAkB,WAAW,QAAA;AACnC,cAAM,oBAAoB,aAAa,QAAA;AAMvC,cAAM,KAAK,OAAO,OAAO,iBAAiB,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC;AAClE,cAAM,CAAC,cAAc,YAAY,IAAI,MAAM,QAAQ,IAAI,CAAC,YAAY,YAAY,CAAC;AACjF,cAAM,WAAW,OAAO,eAAe,CAAC,GAAG,KAAK;AAChD,cAAM,0BAA0B,KAAK,MAAA,EAAQ;AAAA,UAC3C;AAAA,UACA,aAAa,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAAA,QAAA;AAE7C,cAAM,oBAAoB,uBAAuB,OAAO;AAAA,UACtD,CAAC,UACC,qBAAqB,IAAI,KAAK,KAAK,sBAAsB,SAAS,KAAK;AAAA,QAAA;AAE3E,0BAAkB,QAAQ,CAAC,SAAc;AACvC,gBAAM,kBAAkB,kBAAkB,IAAI,IAAI;AAClD,cAAI,mBAAmB,gBAAgB,SAAS,GAAG;AAEjD,oCAAwB,QAAQ,MAAM,CAAC,aAAkB;AACvD,yBAAW,UAAU,iBAAiB;AACpC,yBAAS,QAAQ,MAAM;AAAA,cACzB;AAAA,YACF,CAAC;AAAA,UACH,OAAO;AACL,oCAAwB,QAAQ,IAAI;AAAA,UACtC;AAAA,QACF,CAAC;AACD,aAAK,6BAA6B,QAAQ,CAAC,SAAiB;AAC1D,cAAI,CAAC,sBAAsB,SAAS,IAAI,GAAG;AACzC,kBAAM,MAAM,KAAK,aAAa,IAAI;AAClC,gBAAI,KAAK;AACP,sCAAwB,QAAQ,IAAW;AAAA,YAC7C;AAAA,UACF;AAAA,QACF,CAAC;AACD,cAAM,qBAAqB,MAAM;AACjC,cAAM,aAAa,mBAAmB,KAAK,CAAC,GAAG,MAAM;AACnD,gBAAM,MAAM,EAAE,cAAc,UAAU;AACtC,gBAAM,MAAM,EAAE,cAAc,UAAU;AACtC,gBAAM,2BAA2B,aAAa;AAAA,YAC5C,CAAC,MAAM,EAAE,UAAU,EAAE,SAAA,MAAe,IAAI,SAAA;AAAA,UAAS;AAEnD,gBAAM,2BAA2B,aAAa;AAAA,YAC5C,CAAC,MAAM,EAAE,UAAU,EAAE,SAAA,MAAe,IAAI,SAAA;AAAA,UAAS;AAEnD,iBAAO,2BAA2B;AAAA,QACpC,CAAC;AAMD,cAAM,mBAAmB,eAAe;AAAA,UAAO,CAAC,MAC9C,CAAC,MAAM,QAAQ,MAAM,IACjB,MAAM,aACN,OAAO,WAAW,IAChB,MAAM,aACN,OAAO,SAAS,CAAC;AAAA,QAAA;AAEzB,YAAI,CAAC,iBAAiB,SAAS,UAAU,GAAG;AAC1C,2BAAiB,QAAQ,UAAU;AAAA,QACrC;AACA,cAAM,MAAM;AAAA,UACV,OAAO,OAAO,MAAM,QAAQ,IAAI,IAAI;AAAA,UACpC,MAAM,uBAAuB;AAAA,UAC7B,SAAS,uBAAuB;AAAA,UAChC,SAAS,WAAW;AAAA,YAAI,CAAC,WACvB,KAAK,yBAAyB,QAAe,kBAAkB,CAAA,GAAI,iBAAiB;AAAA,UAAA;AAAA,UAItF,cAAc,sBAAsB,cAAc,aAAc,CAAC,CAAC;AAAA,UAClE,YAAY;AAAA,UACZ,cAAc;AAAA,QAAA;AAEhB,cAAM,YAAY,IAAIC,yBAAgB,IAAI,OAAO,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,OAAO;AACtF,cAAM,KAAK,OAAO,OAAO,gBAAgB,EAAE,IAAI,SAAS;AACxD,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAwBA,aAAa,mBACX,KACA,KACA,KACA,QAA+B,CAAA,GAC4C;AAM3E,cAAM,aAAa,KAAK,wBAAA;AAExB,YAAI,CAAC,YAAY;AACf,gBAAM,IAAIP,SAAAA,gCAAgC,KAAK,gBAAgB;AAAA,QACjE;AAOA,cAAM,QAAQ,KAAK,4BAAA;AAEnB,cAAM,oBAAoB,CAAC,GAAI,KAAK,gCAAgC,QAAQ,CAAA,GAAK,GAAG,KAAK;AAEzF,mBAAW,iBAAiB,mBAAmB;AAC7C,gBAAM,cAAc,KAAK,KAAK,OAAO,IAAI;AAAA,QAC3C;AAEA,cAAM,YAAY,MAAM,MAAM,MAAM,KAAK,YAAY,GAAG,EAAE,OAAO,KAAK,UAAU,EAAE,MAAA;AAElF,YAAI,CAAC,WAAW;AACd,gBAAM,IAAIQ,SAAAA,6BAAA;AAAA,QACZ;AAEA,cAAM,MAAM,UAAU,KAAK,UAAU;AAErC,cAAM,cAAc,KAAK,MAAA,EAAQ,MAAM,KAAK,YAAY,GAAG;AAC3D,cAAM,EAAE,uBAAuB,mBAC7B,KAAK,uCAAA;AACP,8BAAsB,QAAQ,CAAC,SAAc;AAC3C,sBAAY,QAAQ,IAAI;AAAA,QAC1B,CAAC;AACD,aAAK,6BAA6B,QAAQ,CAAC,SAAiB;AAC1D,cAAI,CAAC,sBAAsB,SAAS,IAAI,GAAG;AACzC,kBAAM,MAAM,KAAK,aAAa,IAAI;AAClC,gBAAI,KAAK;AACP,0BAAY,QAAQ,IAAW;AAAA,YACjC;AAAA,UACF;AAAA,QACF,CAAC;AACD,cAAM,SAAS,MAAM,YAAY,MAAA;AACjC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAIA,SAAAA,6BAAA;AAAA,QACZ;AAEA,cAAM,EAAE,aAAa,sBAAsB,YAAY,MAAM,KAAK,wBAAwB;AAAA,UACxF;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,WAAWX,SAAAA,mBAAmB;AAAA,QAAA,CAC/B;AAED,YAAI,aAAa;AACf,gBAAM,IAAIK,SAAAA,YAAY,OAAO;AAAA,QAC/B;AAOA,cAAM,yBAAmC,CAAA;AACzC,YAAI,IAAI,QAAQ,OAAO,mBAAmB,MAAM,kBAAkB;AAUhE,eAAK,oBAAoB,QAAQ,CAAC,MAAM,QAAQ;AAE9C,kBAAM,+BAAoC,IAAA;AAC1C,kBAAM,sBAAsB,CAC1B,UACA,oBACG;AACH,uBAAS,KAAA;AACT,sBAAQ,SAAS,MAAA;AAAA,gBACf,KAAK;AAAA,gBACL,KAAK,aAAa;AAChB,sBAAI,SAAS,eAAe,KAAK;AAC/B,0BAAM,eAAe,KAAK,0BAA0B,IAAI,eAAe;AACvE,0BAAM,oBAAoB,KAAK,sBAAsB,IAAI,eAAe;AACxE,wBAAI,CAAC,gBAAgB,CAAC,kBAAmB;AACzC,0BAAM,eAAe,aAAa,aAAA;AAClC,wBAAI,CAAC3B,gBAAAA,mBAA0B,YAAY,EAAG;AAC9C,0BAAM,QAAQkC,gBAAAA,SAAgB,kBAAkB,WAAW,IACvD,kBAAkB,eAAe,kBACjC;AACJ,6BAAS,IAAI,KAAK,SAAS,GAAG;AAAA,kBAChC;AACA;AAAA,gBACF;AAAA,cAAA;AAAA,YAEJ;AACA,gBACE,qBAAqB,QACrB,aAAa,OAAO,KAAK,mBACzB,KAAK,gBAAgB,OAAO,SAAS,GACrC;AACA,oBAAM,oBAAoB,KAAK,sBAAsB,IAAI,KAAK,eAAe;AAC7E,kBAAI,KAAK,0BAA0B,IAAI,KAAK,eAAe,KAAK,mBAAmB;AACjF,oCAAoB,mBAAmB,KAAK,eAAe;AAAA,cAC7D;AAAA,YACF,OAAO;AACL,mBAAK,sBAAsB,QAAQ,mBAAmB;AAAA,YACxD;AACA,gBAAI,SAAS,OAAO,GAAG;AACrB,kBAAI,SAAS,OAAO,EAAG;AAKvB,oBAAM,MAAM,MAAM,KAAK,SAAS,KAAA,CAAM,EAAE,CAAC;AACzC,mCAAqB,IAAI,KAAK,IAAI;AAClC,kBAAI,CAAC,eAAe,SAAS,GAAG,GAAG;AACjC,+BAAe,KAAK,GAAG;AAAA,cACzB;AACA,kBAAI,CAAC,uBAAuB,SAAS,GAAG,GAAG;AACzC,uCAAuB,KAAK,GAAG;AAAA,cACjC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,eAAO,KAAK;AAAA,UACV;AAAA,UACA,eAAe,OAAO,CAAC,MAAM,qBAAqB,IAAI,CAAC,MAAM,IAAI;AAAA,UACjE;AAAA,QAAA;AAAA,MAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA6DA,aAAa,+BACX,KACA,iBACArE,SACA,MACA,SACA,QACA,MACA,KACA,KACA,QAA+B,CAAA,GAC/B,eAAiD,CAAA,GACQ;AAMzD,cAAM,aAAa,KAAK,wBAAA;AAExB,YAAI,CAAC,YAAY;AACf,gBAAM,IAAI4D,SAAAA,gCAAgC,KAAK,gBAAgB;AAAA,QACjE;AAOA,cAAM,yBAAyB,KAAK,0BAA0B,IAAI,eAAe;AACjF,YAAI,CAAC,wBAAwB;AAC3B,gBAAM,IAAIU,SAAAA;AAAAA,YACR,iBAAiB,eAAe,yBAAyB,KAAK,gBAAgB;AAAA,UAAA;AAAA,QAElF;AAEA,cAAM,8BAA8B,KAAK,aAAa,eAAe;AACrE,YAAI,CAAC,6BAA6B;AAChC,gBAAM,IAAIA,SAAAA;AAAAA,YACR,uBAAuB,eAAe,yBAAyB,KAAK,gBAAgB;AAAA,UAAA;AAAA,QAExF;AAEA,cAAM,eAAe,uBAAuB,aAAA;AAC5C,YAAI,OAAQ,aAAqB,wBAAwB,YAAY;AACnE,gBAAM,IAAIA,SAAAA;AAAAA,YACR,sBAAsB,eAAe;AAAA,UAAA;AAAA,QAEzC;AAOA,cAAM,mBAAuD,OAC3D,MACA,UACA,UACA,UACG;AACH,gBAAM,mBAAoB,4BAAoC;AAE9D,kBAAQ,kBAAA;AAAA,YACN,KAAK;AACH;AAEE,sBAAM,aAAc,4BAAoC,QAAQ;AAChE,oBAAI,CAAC,YAAY;AACf,wBAAM,IAAIA,SAAAA;AAAAA,oBACR,yBAAyB,eAAe;AAAA,kBAAA;AAAA,gBAE5C;AACA,sBAAM,gBAAgB,aAAa,MAAM,oBAAoB,IAAI,UAAU;AAC3E,oBAAI,CAAC,eAAe;AAClB,wBAAM,IAAIA,SAAAA;AAAAA,oBACR,gBAAgB,UAAU;AAAA,kBAAA;AAAA,gBAE9B;AACA,sBAAM,MAAM,eAAe,IAAI;AAAA,cACjC;AACA;AAAA,YAEF,KAAK;AACH;AAEE,sBAAM,aAAc,4BAAoC,QAAQ;AAChE,sBAAM,WAAY,4BAAoC,QAAQ;AAC9D,sBAAM,aAAc,4BAAoC,QAAQ;AAChE,sBAAM,kBAAmB,4BAAoC,QAAQ;AACrE,sBAAM,yBAA0B,4BAAoC,QACjE;AAEH,oBACE,CAAC,cACD,CAAC,YACD,CAAC,cACD,CAAC,mBACD,CAAC,wBACD;AACA,wBAAM,IAAIA,SAAAA;AAAAA,oBACR,4BAA4B,eAAe;AAAA,kBAAA;AAAA,gBAE/C;AAEA,sBAAM,gBAAgB,aAAa,MAAM,oBAAoB,IAAI,UAAU;AAC3E,oBAAI,CAAC,eAAe;AAClB,wBAAM,IAAIA,SAAAA;AAAAA,oBACR,gBAAgB,UAAU;AAAA,kBAAA;AAAA,gBAE9B;AAEA,sBAAM,YAAY,CAAC,aAAa;AAC9B,2BACG,KAAK,UAAU,EACf,OAAO,CAAC,EACR;AAAA,oBACC,GAAG,UAAU,IAAI,sBAAsB;AAAA,oBACvC,GAAG,aAAa,KAAK,IAAI,aAAa;AAAA,kBAAA,EAEvC,MAAM,GAAG,UAAU,IAAI,eAAe,IAAI,GAAG;AAAA,gBAClD,CAAC;AAAA,cACH;AACA;AAAA,YAEF,KAAK;AACH;AAEE,sBAAM,eAAgB,4BAAoC,QAAQ,eAC7D,4BAAoC,QAAQ,iBAC7C;AACJ,sBAAM,aACH,4BAAoC,QAAQ,cAAc,aAAa;AAC1E,sBAAM,WACH,4BAAoC,QAAQ,YAAY,KAAK;AAChE,sBAAM,oBAAqB,4BAAoC,QAC5D;AACH,sBAAM,kBACH,4BAAoC,QAAQ,mBAC7C,cAAc;AAEhB,oBACE,CAAC,gBACD,CAAC,cACD,CAAC,YACD,CAAC,qBACD,CAAC,iBACD;AACA,wBAAM,IAAIA,SAAAA;AAAAA,oBACR,gCAAgC,eAAe;AAAA,kBAAA;AAAA,gBAEnD;AAIA,sBAAM,0BACJ,aAAa,MAAM,oBAAoB,IAAI,UAAU,KAAK;AAE5D,sBAAM,wBACJ,aAAa,MAAM,oBAAoB,IAAI,eAAe,KAAK;AAEjE,sBAAM,iCACJ,aAAa,MAAM,oBAAoB,IAAI,iBAAiB,KAAK;AAEnE,oBACE,CAAC,2BACD,CAAC,yBACD,CAAC,gCACD;AACA,wBAAM,UAAU;AAAA,oBACd,CAAC,0BAA0B,4BAA4B;AAAA,oBACvD,CAAC,wBAAwB,0BAA0B;AAAA,oBACnD,CAAC,iCAAiC,mCAAmC;AAAA,kBAAA,EACrE,OAAO,CAAC,MAAM,MAAM,MAAS;AAC/B,wBAAM,IAAIA,SAAAA;AAAAA,oBACR,gCAAgC,eAAe,wCAAwC,QAAQ,KAAK,IAAI,CAAC;AAAA,kBAAA;AAAA,gBAE7G;AAEA,sBAAM,YAAY,CAAC,aAAa;AAC9B,2BACG,KAAK,aAAa,KAAK,EACvB,OAAO,CAAC,EACR,MAAM,GAAG,aAAa,KAAK,IAAI,uBAAuB,IAAI,GAAG,EAC7D;AAAA,oBACC,GAAG,aAAa,KAAK,IAAI,qBAAqB;AAAA,oBAC9C,GAAG,aAAa,KAAK,IAAI,8BAA8B;AAAA,kBAAA,EAExD,MAAM,CAAC;AAAA,gBACZ,CAAC;AAAA,cACH;AACA;AAAA,YAEF;AACE,oBAAM,IAAIA,SAAAA;AAAAA,gBACR,sBAAsB,gBAAgB;AAAA,cAAA;AAAA,UACxC;AAAA,QAEN;AAOA,cAAM,WAAW,CAAC,iBAAiB,KAAK,MAAM,GAAG,GAAG,GAAG,KAAK;AAE5D,YAAI;AACF,iBAAQ,aAAqB;AAAA,YAC3BtE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ,SAAS,KAAK;AACZ,cAAI,eAAegE,SAAAA,8CAA8C;AAC/D,kBAAM,IAAIO,SAAAA,yDAAyD,GAAG;AAAA,UACxE,OAAO;AACL,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBA,aAAa,qBACX,SACA,KACA,KACA,QAAoC,CAAA,GACuC;AAM3E,cAAM,aAAa,KAAK,wBAAA;AAExB,YAAI,CAAC,YAAY;AACf,gBAAM,IAAIX,SAAAA,gCAAgC,KAAK,gBAAgB;AAAA,QACjE;AAMA,cAAM,0BAA0B,CAAC,GAAI,QAAQ,iCAAiC,UAAU,CAAA,CAAG;AAC3F,cAAM,4BAA4B,MAAM,KAAK;AAAA,UAC3C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAGF,YAAI,2BAA2B;AAC7B,gBAAM,IAAIY,SAAAA,8BAA8B,yBAAyB;AAAA,QACnE;AAEA,cAAM,EAAE,aAAa,sBAAsB,YAAY,MAAM,KAAK,wBAAwB;AAAA,UACxF;AAAA,UACA;AAAA,UACA,WAAWf,SAAAA,mBAAmB;AAAA,QAAA,CAC/B;AAED,YAAI,aAAa;AACf,gBAAM,IAAIK,SAAAA,YAAY,OAAO;AAAA,QAC/B;AAOA,cAAM,kBAAuC,CAAA;AAC7C,cAAM,kBAAkB,MAAM,KAAK;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAIF,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC1D,cAAI,YAAY,KAAK,MAAM,uBAAuB,IAAI,GAAG;AACzD,gBAAM,cAAc,UAAU,QAAQ,UAAU;AAIhD,cAAI,CAAC,WAAW;AAEd,kBAAM,eAAe,OAAO,KAAK,MAAM,oBAAoB,IAAI,GAAG,MAAM;AACxE,gBAAI,cAAc;AAChB,0BAAY;AAAA,YACd,OAAO;AACL;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,4BAA4B,qBAAqB,IAAI,GAAG;AAC9D,gBAAM,wBAAwB,qBAAqB,IAAI,SAAS;AAChE,gBAAM,YAAY,6BAA6B;AAE/C,cAAI,CAAC,eAAe,CAAC,WAAW;AAC9B,kBAAM,IAAIA,SAAAA,YAAY,2CAA2C,GAAG,GAAG;AAAA,UACzE;AAEA,0BAAgB,SAAS,IAAI;AAAA,QAC/B;AAOA,cAAM,YAAY,MAAM,KAAK,OAAO,eAAsC;AAS1E,eAAO,MAAM,KAAK,mBAAmB,UAAU,cAAc,UAAU,GAAG,KAAK,GAAG;AAAA,MACpF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA0BA,aAAa,qBACX,KACA,SACA,KACA,KACA,QAAmC,IACwC;AAM3E,cAAM,aAAa,KAAK,wBAAA;AAExB,YAAI,CAAC,YAAY;AACf,gBAAM,IAAIF,SAAAA,gCAAgC,KAAK,gBAAgB;AAAA,QACjE;AAOA,cAAM,0BAA0B,CAAC,GAAI,QAAQ,iCAAiC,UAAU,CAAA,CAAG;AAC3F,cAAM,4BAA4B,MAAM,KAAK;AAAA,UAC3C;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM,4BAA4B,CAAA;AAAA,QAAC;AAGrC,YAAI,2BAA2B;AAC7B,gBAAM,IAAIY,SAAAA,8BAA8B,yBAAyB;AAAA,QACnE;AAIA,cAAM,KAAK,mBAAmB,KAAK,KAAK,KAAK,MAAM,uBAAuB,EAAE;AAG5E,cAAM,SAAS,MAAM,KAAK,MAAA,EAAQ,MAAM,YAAY,GAAG,EAAE,MAAA;AACzD,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAIJ,SAAAA,6BAAA;AAAA,QACZ;AAEA,cAAM,EAAE,aAAa,sBAAsB,YAAY,MAAM,KAAK,wBAAwB;AAAA,UACxF;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,WAAWX,SAAAA,mBAAmB;AAAA,QAAA,CAC/B;AAED,YAAI,aAAa;AACf,gBAAM,IAAIK,SAAAA,YAAY,OAAO;AAAA,QAC/B;AAOA,cAAM,kBAAuC,CAAA;AAC7C,cAAM,kBAAkB,MAAM,KAAK;AAAA,UACjC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,MAAM,4BAA4B,CAAA;AAAA,QAAC;AAIrC,mBAAW,CAAC,eAAe,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AACpE,cAAI,YAAY,KAAK,MAAM,uBAAuB,IAAI,aAAa;AACnE,gBAAM,cAAc,UAAU,QAAQ,UAAU;AAIhD,cAAI,CAAC,WAAW;AAEd,kBAAM,eACJ,OAAO,KAAK,MAAM,oBAAoB,IAAI,aAAa,MAAM;AAC/D,gBAAI,cAAc;AAChB,0BAAY;AAAA,YACd,OAAO;AACL;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,4BAA4B,qBAAqB,IAAI,aAAa;AACxE,gBAAM,wBAAwB,qBAAqB,IAAI,SAAS;AAChE,gBAAM,YAAY,6BAA6B;AAE/C,cAAI,CAAC,eAAe,CAAC,WAAW;AAC9B,kBAAM,IAAIA,SAAAA,YAAY,2CAA2C,SAAS,GAAG;AAAA,UAC/E;AAEA,0BAAgB,SAAS,IAAI;AAAA,QAC/B;AAQA,eAAO,MAAM,eAA+C;AAE5D,cAAM,OAAO,KAAA;AASb,eAAO,KAAK,mBAAmB,KAAK,KAAK,GAAG;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBA,aAAa,qBACX,KACA,KACA,KACA,QAA+B,CAAA,GAChB;AAMf,cAAM,aAAa,KAAK,wBAAA;AAExB,YAAI,CAAC,YAAY;AACf,gBAAM,IAAIF,SAAAA,gCAAgC,KAAK,gBAAgB;AAAA,QACjE;AAOA,cAAM,QAAQ,KAAK,4BAAA;AAEnB,mBAAW,iBAAiB;AAAA,UAC1B,GAAI,KAAK,gCAAgC,UAAU,CAAA;AAAA,UACnD,GAAG;AAAA,QAAA,GACF;AACD,gBAAM,cAAc,KAAK,KAAK,OAAO,IAAI;AAAA,QAC3C;AAEA,cAAM,YAAY,MAAM,MAAM,MAAM,YAAY,GAAG,EAAE,MAAA;AAErD,YAAI,CAAC,WAAW;AACd,gBAAM,IAAIQ,SAAAA,6BAAA;AAAA,QACZ;AACA,cAAM,EAAE,eAAA,IAAmB,KAAK,uCAAA;AAChC,cAAM,SAAS,IAAI,OAAO,MAAM,KAAK,yBAAyB,WAAW,cAAc,CAAC;AAOxF,cAAM,EAAE,aAAa,QAAA,IAAY,MAAM,KAAK,wBAAwB;AAAA,UAClE;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,WAAWX,SAAAA,mBAAmB;AAAA,QAAA,CAC/B;AAED,YAAI,aAAa;AACf,gBAAM,IAAIK,SAAAA,YAAY,OAAO;AAAA,QAC/B;AAQA,cAAM,OAAO,OAAA;AAAA,MACf;AAAA,MAEA,aAAa,yBACX9D,SACA,SACA,KACA,KACA,QAAmC,IAMnC;AACA,cAAM,aAAa,KAAK,wBAAA;AAExB,YAAI,CAAC,YAAY;AACf,gBAAM,IAAI4D,SAAAA,gCAAgC,KAAK,gBAAgB;AAAA,QACjE;AAMA,cAAM,OAAO;AACb,wBAAgB,kCAAkC,GAA8B;AAC9E,cAAI,OAAO;AACX,cAAI,QAAQ;AACZ,gBAAM,KAAK,KAAK,wBAAA;AAChB,cAAI,CAAC,GAAI;AACT,gBAAM,uBAAuB,IAAI,gBAAA;AACjC,kBAAQ,UAAU,KAAK,QAAQ,UAAU,qBAAqB,OAAO,YAAY,OAAO;AACtF,gBAAI;AACF,oBAAM,SAAS,MAAM,KAAK;AAAA,gBACxB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,CAAC,EAAE;AAAA,gBACH,CAAC,CAAC,IAAI,KAAK,CAAC;AAAA,gBACZ;AAAA,gBACA;AAAA,gBACA,MAAM,uBAAuB,CAAA;AAAA,cAAC;AAEhC,kBAAI,OAAO,UAAU,GAAG;AAEtB,qCAAqB,MAAA;AACrB;AAAA,cACF;AACA,sBAAQ,KAAK,KAAK,OAAO,QAAQ,OAAO,OAAO;AAC/C;AACA,oBAAM,OAAO;AAAA,YACf,SAAS,KAAK;AAEZ,mCAAqB,MAAA;AACrB,kBAAI,eAAe,OAAO;AACxB,sBAAM;AAAA,cACR,OAAO;AACL,sBAAM,IAAIa,SAAAA,uCAAA;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,cAAM,2BAAiC,IAAA;AACvC,yBAAiB,WAAW,kCAAkCzE,OAAM,GAAG;AACrE,qBAAW,UAAU,SAAS;AAC5B,kBAAM,MAAM,OAAO,UAAU;AAC7B,gBAAI,QAAQ,UAAa,QAAQ,MAAM;AACrC,mBAAK,IAAI,GAAG;AAAA,YACd;AAAA,UACF;AAAA,QACF;AACA,eAAO,MAAM,KAAK,8BAA8B,MAAM,KAAK,IAAI,GAAG,SAAS,KAAK,KAAK,KAAK;AAAA,MAC5F;AAAA,MAEA,aAAa,8BACX,MACA,SACA,KACA,KACA,OACA,cAAc,GAGb;AACD,cAAM,UAEF,CAAA;AAQJ,cAAM;AAAA,UACJ;AAAA,UACA,OAAO,QAAQ;AACb,gBAAI;AACF,sBAAQ,GAAG,IAAI,MAAM,KAAK,qBAAqB,KAAK,SAAS,KAAK,KAAK,KAAK;AAAA,YAC9E,SAAS,KAAK;AACZ,oBAAM,IAAI,eAAe,QAAQ,MAAM,IAAI,MAAM,6BAA6B;AAC9E,sBAAQ,GAAG,IAAI;AAAA,YACjB;AAAA,UACF;AAAA,UACA,EAAE,YAAA;AAAA,QAAY;AAEhB,eAAO;AAAA,MACT;AAAA,IAAA;AAptFa,oBAAA;AAAA,MADZ0E,IAAAA,aAAA;AAAA,IAAa,GA3BV,mBA4BS,kCAAA;AAcA,oBAAA;AAAA,MADZC,IAAAA,aAAA;AAAA,IAAa,GAzCV,mBA0CS,kCAAA;AA1Cf,QAAM,mBAAN;AAkvFA,WAAO,eAAe,kBAAkB,oBAAoB;AAAA,MAC1D,OAAO,iBAAiB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,2BAA2B;AAAA,MACjE,OAAO,iBAAiB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,+BAA+B;AAAA,MACrE,OAAO,iBAAiB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,gCAAgC;AAAA,MACtE,OAAO,iBAAiB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,2BAA2B;AAAA,MACjE,OAAO,iBAAiB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,oCAAoC;AAAA,MAC1E,OAAO,iBAAiB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,0BAA0B;AAAA,MAChE,OAAO,iBAAiB;AAAA,MACxB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,mCAAmC;AAAA,MACzE,OAAO,iBAAiB,uBAAuB,EAAE,MAAM,CAAA,GAAI,QAAQ,GAAC;AAAA,MACpE,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,+CAA+C;AAAA,MACrF,OAAO,iBAAiB,mCAAmC,EAAE,QAAQ,CAAA,GAAI,QAAQ,GAAC;AAAA,MAClF,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,kBAAkB,gCAAgC;AAAA,MACtE,OAAO,IAAI,IAAI,iBAAiB,oBAAoB,CAAA,CAAE;AAAA,MACtD,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO;AAAA,EACT;AACF;ACh/HO,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUtC,OAAO,aACL,aACA,UACA,gBACA,eACmC;AAEnC,QAAI,CAAC,kBAAkB,CAAC,eAAe;AACrC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,kBAAkB,eAAe;AACpC,aAAO;AAAA,IACT;AAGA,QAAI,kBAAkB,CAAC,eAAe;AACpC,aAAO,CAAC,UAAmB,eAAe,aAAa,OAAO,QAAQ;AAAA,IACxE;AAGA,WAAO,CAAC,UAAmB;AACzB,YAAM,gBAAgB,eAAgB,aAAa,OAAO,QAAQ;AAElE,aAAO,cAAe,aAAa;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,aACL,aACA,UACA,gBACA,eACmC;AAEnC,QAAI,CAAC,kBAAkB,CAAC,eAAe;AACrC,aAAO;AAAA,IACT;AAGA,QAAI,CAAC,kBAAkB,eAAe;AACpC,aAAO;AAAA,IACT;AAGA,QAAI,kBAAkB,CAAC,eAAe;AACpC,aAAO,CAAC,UAAmB,eAAe,aAAa,OAAO,QAAQ;AAAA,IACxE;AAGA,WAAO,CAAC,UAAmB;AACzB,YAAM,eAAe,cAAe,KAAK;AAEzC,aAAO,eAAgB,aAAa,cAAc,QAAQ;AAAA,IAC5D;AAAA,EACF;AACF;ACxEA,MAAM,wCAAwC,CAAC,MAAW,aAAqB;AAC7E,SAAO;AAAA,IACLtC,IAAAA,IAAI,OAAA,EAAS,SAAS,IAAI;AAAA,IAC1BA,IAAAA,IAAI,SAAA,EAAW,SAAS,IAAI;AAAA,IAC5BA,IAAAA,IAAI,OAAO,CAAC,OAAO,YAAY;AAC7B,UAAIkB,oBAAAA,WAAgB,KAAK,KAAK,MAAM,YAAY,SAAS,UAAU;AACjE,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,MAAM,eAAe,EAAE,OAAO,MAAM,UAAU;AAAA,IAC/D,CAAC;AAAA,EAAA;AAEL;AAEO,MAAM,2CAA2C,CACtD,WACA,eACA,QACA,UACe;AACf,QAAM,EAAE,OAAO,MAAA,IAAU,OAAO,SAAS,OAAO;AAAA,IAC9C,SAAS;AAAA,IACT,YAAY;AAAA,EAAA,CACb;AACD,MAAI,OAAO;AACT,UAAM,IAAIqB,SAAAA,wCAAwC,eAAe,WAAW,KAAK;AAAA,EACnF;AACA,SAAO;AACT;AAQA,MAAM,sCAAsCvC,IAAAA,IAAI,OAAO;AAAA,EACrD,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,QAAA,EAAU,QAAQ,KAAK;AACzC,CAAC;AAED,MAAM,4BAA4BA,IAAAA,IAAI;AAAA,EACpC,GAAG,sCAAsCwC,YAAAA,uBAAuB,uBAAuB;AAAA,EACvF,GAAG,sCAAsCC,YAAAA,qBAAqB,qBAAqB;AAAA,EACnF,GAAG,sCAAsCC,YAAAA,yBAAyB,yBAAyB;AAAA,EAC3F,GAAG,sCAAsCC,YAAAA,uBAAuB,uBAAuB;AAAA,EACvF,GAAG,sCAAsCC,YAAAA,uBAAuB,uBAAuB;AAAA,EACvF,GAAG,sCAAsCC,YAAAA,wBAAwB,wBAAwB;AAAA,EACzF,GAAG,sCAAsCC,YAAAA,uBAAuB,uBAAuB;AAAA,EACvF,GAAG;AAAA,IACDC,YAAAA;AAAAA,IACA;AAAA,EAAA;AAAA,EAEF,GAAG,sCAAsCC,YAAAA,wBAAwB,wBAAwB;AAAA,EACzF,GAAG,sCAAsCC,YAAAA,uBAAuB,uBAAuB;AAAA,EACvF,GAAG,sCAAsCC,YAAAA,sBAAsB,sBAAsB;AACvF;AAEA,MAAM,2CAA2C,oCAAoC,KAAK;AAAA,EACxF,MAAM,0BAA0B,SAAA;AAAA;AAAA,EAEhC,YAAYlD,IAAAA,IAAI,UAAU,QAAQ,IAAI;AAAA;AAAA,EAEtC,UAAUA,IAAAA,IAAI,UAAU,QAAQ,IAAI;AAAA;AAAA,EAEpC,cAAcA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAEzC,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAEtC,iBAAiBA,IAAAA,IAAI,OAAA,EAAS,WAAW,MAAM,IAAI,IAAI;AACzD,CAAC;AAUM,MAAM,iCAAiCA,IAAAA,IAAI,OAAO;AAAA;AAAA,EAEvD,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACtC,iBAAiBA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAG5C,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAM,0BAA0B,SAAA;AAAA;AAAA,EAEhC,YAAYA,IAAAA,IAAI,UAAU,QAAQ,IAAI;AAAA;AAAA,EAEtC,UAAUA,IAAAA,IAAI,UAAU,QAAQ,IAAI;AAAA;AAAA,EAEpC,cAAcA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAEzC,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAEtC,iBAAiBA,IAAAA,IAAI,OAAA,EAAS,WAAW,MAAM,IAAI,IAAI;AACzD,CAAC;AAQM,MAAM,8BAA8BA,IAAAA,IAAI,OAAO;AAAA;AAAA,EAEpD,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACtC,iBAAiBA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAG5C,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAM,0BAA0B,SAAA;AAAA;AAAA,EAEhC,YAAYA,IAAAA,IAAI,UAAU,QAAQ,IAAI;AAAA;AAAA,EAEtC,UAAUA,IAAAA,IAAI,UAAU,QAAQ,IAAI;AAAA;AAAA,EAEpC,cAAcA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAEzC,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAEtC,iBAAiBA,IAAAA,IAAI,OAAA,EAAS,WAAW,MAAM,IAAI,IAAI;AACzD,CAAC;AAED,MAAM,8BAA8B,4BAA4B,KAAK;AAAA,EACnE,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,YAAYA,IAAAA,IAAI,QAAA,EAAU,QAAQ,KAAK;AACzC,CAAC;AAQM,MAAM,4BAA4B,4BAA4B,KAAK;AAAA,EACxE,MAAMA,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCwC,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,0BAA0B,4BAA4B,KAAK;AAAA,EACtE,MAAMxC,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCyC,YAAAA,qBAAqB,qBAAqB;AAAA,EAAA,EAEpF;AAAA,IACC,CAAC,WACC,IAAIA,gCAAoB;AAAA,MACtB,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,IAAA,CACpB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,8BAA8B,4BAA4B,KAAK;AAAA,EAC1E,MAAMzC,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC0C,YAAAA,yBAAyB,yBAAyB;AAAA,EAAA,EAE5F;AAAA,IACC,CAAC,WACC,IAAIA,oCAAwB;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO;AAAA,IAAA,CACpB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,4BAA4B,4BAA4B,KAAK;AAAA,EACxE,MAAM1C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC2C,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,4BAA4B,4BAA4B,KAAK;AAAA,EACxE,MAAM3C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC4C,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,6BAA6B,4BAA4B,KAAK;AAAA,EACzE,MAAM5C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC6C,YAAAA,wBAAwB,wBAAwB;AAAA,EAAA,EAE1F;AAAA,IACC,CAAC,WACC,IAAIA,mCAAuB;AAAA,MACzB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,4BAA4B,4BAA4B,KAAK;AAAA,EACxE,MAAM7C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC8C,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,qCAAqC,4BAA4B,KAAK;AAAA,EACjF,MAAM9C,IAAAA,IACH;AAAA,IACC,GAAG;AAAA,MACD+C,YAAAA;AAAAA,MACA;AAAA,IAAA;AAAA,EACF,EAED;AAAA,IACC,CAAC,WACC,IAAIA,2CAA+B;AAAA,MACjC,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,6BAA6B,4BAA4B,KAAK;AAAA,EACzE,MAAM/C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCgD,YAAAA,wBAAwB,wBAAwB;AAAA,EAAA,EAE1F;AAAA,IACC,CAAC,WACC,IAAIA,mCAAuB;AAAA,MACzB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,4BAA4BhD,IAAAA,IAAI,OAAO;AAAA;AAAA,EAElD,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACtC,iBAAiBA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAG5C,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAGtC,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,iBAAiBA,IAAAA,IAAI,OAAA,EAAS,WAAW,MAAM,IAAI,IAAI;AAAA,EACvD,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAMA,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCiD,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,2BAA2BjD,IAAAA,IAAI,OAAO;AAAA;AAAA,EAEjD,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACtC,iBAAiBA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAG5C,WAAWA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA;AAAA,EAGtC,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,iBAAiBA,IAAAA,IAAI,OAAA,EAAS,WAAW,MAAM,IAAI,IAAI;AAAA,EACvD,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAMA,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCkD,YAAAA,sBAAsB,sBAAsB;AAAA,EAAA,EAEtF;AAAA,IACC,CAAC,WACC,IAAIA,iCAAqB;AAAA,MACvB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQkD,yCAAyC,OAAO;AAAA,EACjG,UAAUlD,IAAAA,IAAI,QAAA,EAAU,QAAQ,KAAK;AACvC,CAAC;AAEM,MAAM,mCAAmCA,IAAAA,IAAI,OAAO;AAAA;AAAA,EAEzD,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA;AAAA,EAGnB,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAM,0BAA0B,SAAA;AAAA,EAChC,UAAUA,IAAAA,IAAI,QAAA,EAAU,QAAQ,KAAK;AACvC,CAAC;AAQM,MAAM,gCAAgCA,IAAAA,IAAI,OAAO;AAAA;AAAA,EAEtD,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA;AAAA,EAGnB,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAM,0BAA0B,SAAA;AAAA,EAChC,WAAWA,IAAAA,IAAI,QAAA,EAAU,QAAQ,KAAK;AACxC,CAAC;AAED,MAAM,gCAAgC,8BAA8B,KAAK;AAAA,EACvE,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,YAAYA,IAAAA,IAAI,QAAA,EAAU,QAAQ,KAAK;AACzC,CAAC;AAQM,MAAM,8BAA8B,8BAA8B,KAAK;AAAA,EAC5E,MAAMA,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCwC,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,4BAA4B,8BAA8B,KAAK;AAAA,EAC1E,MAAMxC,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCyC,YAAAA,qBAAqB,qBAAqB;AAAA,EAAA,EAEpF;AAAA,IACC,CAAC,WACC,IAAIA,gCAAoB;AAAA,MACtB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,gCAAgC,8BAA8B,KAAK;AAAA,EAC9E,MAAMzC,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC0C,YAAAA,yBAAyB,yBAAyB;AAAA,EAAA,EAE5F;AAAA,IACC,CAAC,WACC,IAAIA,oCAAwB;AAAA,MAC1B,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,8BAA8B,8BAA8B,KAAK;AAAA,EAC5E,MAAM1C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC2C,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,8BAA8B,8BAA8B,KAAK;AAAA,EAC5E,MAAM3C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC4C,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,+BAA+B,8BAA8B,KAAK;AAAA,EAC7E,MAAM5C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC6C,YAAAA,wBAAwB,wBAAwB;AAAA,EAAA,EAE1F;AAAA,IACC,CAAC,WACC,IAAIA,mCAAuB;AAAA,MACzB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,8BAA8B,8BAA8B,KAAK;AAAA,EAC5E,MAAM7C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsC8C,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,uCAAuC,8BAA8B,KAAK;AAAA,EACrF,MAAM9C,IAAAA,IACH;AAAA,IACC,GAAG;AAAA,MACD+C,YAAAA;AAAAA,MACA;AAAA,IAAA;AAAA,EACF,EAED;AAAA,IACC,CAAC,WACC,IAAIA,2CAA+B;AAAA,MACjC,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,+BAA+B,8BAA8B,KAAK;AAAA,EAC7E,MAAM/C,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCgD,YAAAA,wBAAwB,wBAAwB;AAAA,EAAA,EAE1F;AAAA,IACC,CAAC,WACC,IAAIA,mCAAuB;AAAA,MACzB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAQM,MAAM,8BAA8BhD,IAAAA,IAAI,OAAO;AAAA;AAAA,EAEpD,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA;AAAA,EAGnB,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAMA,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCiD,YAAAA,uBAAuB,uBAAuB;AAAA,EAAA,EAExF;AAAA,IACC,CAAC,WACC,IAAIA,kCAAsB;AAAA,MACxB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAEM,MAAM,6BAA6BjD,IAAAA,IAAI,OAAO;AAAA;AAAA,EAEnD,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,WAAWA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA;AAAA,EAGnB,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACvC,MAAMA,IAAAA,IACH;AAAA,IACC,GAAG,sCAAsCkD,YAAAA,sBAAsB,sBAAsB;AAAA,EAAA,EAEtF;AAAA,IACC,CAAC,WACC,IAAIA,iCAAqB;AAAA,MACvB,UAAU,OAAO;AAAA,IAAA,CAClB;AAAA,EAAA;AAET,CAAC;AAaM,MAAM,uCAAuClD,IAAAA,IAAI,OAAO;AAAA;AAAA,EAE7D,aAAaA,IAAAA,IAAI,SAAS,QAAQ,EAAE;AAAA,EACpC,0BAA0BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACtE,2BAA2BA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,SAAA,CAAU,EAAE,QAAQ,EAAE;AAAA,EACvE,UAAUA,IAAAA,IAAI,UAAU,QAAQ,KAAK;AAAA,EACrC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,cAAcA,IAAAA,IACX,OAAO;AAAA,IACN,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAAA,EAAS,CAClC,EACA,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,YAAYA,IAAAA,IAAI,QAAA,EAAU,QAAQ,KAAK;AACzC,CAAC;AAGM,MAAM,wBAAwB,qCAAqC,KAAK;AAAA;AAAA,EAE7E,UAAUA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACvB,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,cAAcA,IAAAA,IAAI,SAAA;AACpB,CAAC;AAGM,MAAM,kCAAkC,qCAAqC,KAAK;AAAA;AAAA,EAEvF,UAAUA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACvB,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,iBAAiBA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC9B,wBAAwBA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACrC,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,iBAAiBA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC/B,cAAcA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,EAC9C,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,cAAcA,IAAAA,IAAI,SAAA;AACpB,CAAC;AAGM,MAAM,sCAAsC,qCAAqC,KAAK;AAAA;AAAA,EAE3F,UAAUA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACvB,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,iBAAiBA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC9B,mBAAmBA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAChC,aAAaA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,MAAM,IAAI,CAAC,EAAE,SAAA;AAAA,EACnE,SAASA,IAAAA,IAAI,SAAA,EAAW,SAAA;AAAA,EACxB,cAAcA,IAAAA,IAAI,SAAA;AACpB,CAAC;ACpnBD,MAAM,uCAAuC,CAI3C,SACA,MACA,cACuC;AACvC,QAAM,YAAgD,CAAA;AACtD,SAAO,QAAQ,OAAa,EAAE,QAAQ,CAAC,UAAU;AAC/C,UAAM,CAAC,KAAK,KAAK,IAAI;AACrB,QAAI,KAAK,SAAS,GAAsC,GAAG;AACzD,YAAM,IAAI;AACV,YAAM,IAAI;AACV,gBAAU,CAAC,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AACD,MAAIkB,oBAAAA,WAAgB,SAAS,GAAG;AAC9B,WAAO,OAAO,WAAW,SAAS;AAAA,EACpC;AACA,SAAO;AACT;AAEA,MAAM,6CAA6C,CACjD,SACA,cACG;AACH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,EAAA;AAEJ;AAEA,MAAM,+CAA+C,CACnD,SACA,cACG;AACH,SAAO;AAAA,IACL;AAAA,IACA,CAAC,eAAe,MAAM;AAAA,IACtB;AAAA,EAAA;AAEJ;AAEA,MAAM,mDAAmD,CACvD,SACA,cACG;AACH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,EAAA;AAEJ;AAEA,MAAM,qDAAqD,CACzD,SACA,cACG;AACH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,EAAA;AAEJ;AAEA,MAAM,0BAA0B,CAAuD,WAUjF;AACJ,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,CAAA;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAMJ,kBAAgB,WACd,gBAAgB,aAAa,QAC5B,gBAAgB,mBAAmB,gBAAgB,eAAe,QAClE,gBAAgB,mBAAmB,gBAAgB,eAAe,QACnE;AAcF,MACE,EAAE,eAAe,qBAChB,gBAAgB,eACf,gBAAgB,gBACf,gBAAgB,mBACf,gBAAgB,eAAe,SAC9B,EAAE,gBAAgB,oBAAoB,gBAAgB,eAAe,UACvE,eAAe,mBAAmB,gBAAgB,cAAc,OACnE;AACA,oBAAgB,YAAY;AAAA,EAC9B,OAAO;AAML,oBAAgB,YAAY,gBAAgB,aAAa;AAAA,EAC3D;AACA,QAAM,OAAO,yCAGX,aAAa,eAAe,kCAAkC;AAAA,IAC9D,GAAG;AAAA,IACH;AAAA,EAAA,CACD;AACD,QAAM,gBAAgB,KAAK;AAC3B,QAAM,gBAAgB,KAAK;AAC3B,QAAM,WAAW,KAAK,YAAY;AAGlC,QAAM,iBAAiB,2BAA2B;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,iBAAiB,2BAA2B;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAIF,QAAM,eAAe;AAAA,IACnB;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,GAAI,kBAAkB,EAAE,SAAS,eAAA;AAAA,MACjC,GAAI,kBAAkB,EAAE,SAAS,eAAA;AAAA,IAAe;AAAA,EAClD;AAGF,yBAAuB,YAAY,EAAE,QAAQ,WAAW;AAExD,QAAM,MAAM,wBAAwB,QAAQ,qBAAqB;AACjE,MAAI,IAAI,aAAa,IAAI;AAC3B;AAEA,MAAM,4BAA4B,CAAuD,WAMnF;AACJ,QAAM,EAAE,eAAe,QAAQ,aAAa,iBAAiB,qCAC3D;AACF,QAAM,OAAO,yCAGX,aAAa,eAAe,kCAAkC;AAAA,IAC9D,GAAG;AAAA,IACH;AAAA,EAAA,CACD;AAED,QAAM,eAAe;AAAA,IACnB;AAAA,EAAA;AAGFiC,MAAAA,SAAc,YAAY,EAAE,QAAQ,WAAW;AAE/C,QAAM,MAAM,wBAAwB,QAAQ,+BAA+B;AAC3E,MAAI,IAAI,aAAa,IAAI;AAC3B;AAEA,SAAS,wBAAwB,QAAa,QAAgB;AAC5D,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,MAAM,GAAG;AACvD,SAAK,MAAM,IAAI,oBAAI,IAAA;AAAA,EACrB;AACA,SAAO,KAAK,MAAM;AACpB;AAuBO,SAAS,kBACd,UAAiF,IACjF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,UAAM,OAAO,yCAGX,aAAa,eAAe,kCAAkC,EAAE,GAAG,SAAS,aAAa;AAC3F,UAAM,eAAe,2CAA2C,IAAI;AAEpEC,QAAAA,OAAY,YAAY,EAAE,QAAQ,WAAW;AAE7C,UAAM,MAAM,wBAAwB,QAAQ,qBAAqB;AACjE,QAAI,IAAI,aAAa,IAAI;AAAA,EAC3B;AACF;AAmBA,kBAAkB,SAAS,SACzB,UAAuF,IACvF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBA,IAAAA;AAAAA,MACxB,gBAAgBC,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAkBA,kBAAkB,OAAO,SACvB,UAAyF,IACzF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBF,IAAAA,OAAY;AAAA,MACpC,gBAAgBG,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAkBA,kBAAkB,WAAW,SAC3B,UAAyF,IACzF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBJ,IAAAA,OAAY;AAAA,MACpC,gBAAgBK,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,SAAS,SACzB,UAAuF,IACvF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBN,IAAAA;AAAAA,MACxB,gBAAgBO,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,SAAS,SACzB,UAAuF,IACvF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBR,IAAAA;AAAAA,MACxB,gBAAgBS,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,UAAU,SAC1B,UAAuF,IACvF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBV,IAAAA;AAAAA,MACxB,gBAAgBW,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,SAAS,SACzB,UAAuF,IACvF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBZ,IAAAA;AAAAA,MACxB,gBAAgBa,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,cAAc,SAC9B,UAAuF,IACvF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBd,IAAAA;AAAAA,MACxB,gBAAgBe,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,UAAU,SAC1B,UAAwF,IACxF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBhB,IAAAA;AAAAA,MACxB,gBAAgBiB,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,SAAS,SACzB,UAAuF,IACvF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBlB,IAAAA;AAAAA,MACxB,gBAAgBmB,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAmBA,kBAAkB,QAAQ,SACxB,UAAsF,IACtF;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,4BAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,wBAAwBpB,IAAAA;AAAAA,MACxB,gBAAgBqB,gBAAAA;AAAAA,MAChB,gBAAgBC,gBAAAA;AAAAA,IAAA,CACjB;AAAA,EACH;AACF;AAqBO,SAAS,oBACd,UAA6F,IAC7F;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,UAAM,OAAO,yCAGX,aAAa,eAAe,kCAAkC,EAAE,GAAG,SAAS,aAAa;AAC3F,UAAM,eAAe,6CAA6C,IAAI;AAEtEvB,QAAAA,SAAc,YAAY,EAAE,QAAQ,WAAW;AAE/C,UAAM,MAAM,wBAAwB,QAAQ,+BAA+B;AAC3E,QAAI,IAAI,aAAa,IAAI;AAAA,EAC3B;AACF;AAoBA,oBAAoB,SAAS,SAC3B,UACiE,IACjE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,OAAO,SACzB,UAC+D,IAC/D;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,WAAW,SAC7B,UAC+D,IAC/D;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,SAAS,SAC3B,UACiE,IACjE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,SAAS,SAC3B,UACiE,IACjE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,UAAU,SAC5B,UACiE,IACjE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,SAAS,SAC3B,UACiE,IACjE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,cAAc,SAChC,UACiE,IACjE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,UAAU,SAC5B,UACkE,IAClE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,SAAS,SAC3B,UACiE,IACjE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAoBA,oBAAoB,QAAQ,SAC1B,UACgE,IAChE;AACA,QAAM,gBAAgB;AACtB,QAAM,mCAAmC;AAEzC,SAAO,SAAU,QAAa,aAAqB;AACjD,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,IAAA,CACD;AAAA,EACH;AACF;AAmBO,SAAS,qBACd,OACA,UAC+C,IAC/C;AACA,SAAO,SAAU,QAAa,aAAqB;AACjD,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,GAAG,SAAS,aAAa,cAAc,MAAA;AAAA,IAAM;AAEjD,UAAM,eAAe,iDAAiD,IAAI;AAC1EwB,QAAAA,UAAe,OAAO,YAAmB,EAAE,QAAQ,WAAW;AAC9D,UAAM,MAAM,wBAAwB,QAAQ,2BAA2B;AACvE,QAAI,IAAI,aAAa,IAAI;AAAA,EAC3B;AACF;AAmBO,SAAS,kBACd,OACA,UAC+C,IAC/C;AACA,SAAO,SAAU,QAAa,aAAqB;AACjD,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,GAAG,SAAS,aAAa,cAAc,MAAA;AAAA,IAAM;AAEjD,UAAM,eAAe,iDAAiD,IAAI;AAC1EC,QAAAA,OAAY,OAAO,YAAmB,EAAE,QAAQ,WAAW;AAC3D,UAAM,MAAM,wBAAwB,QAAQ,2BAA2B;AACvE,QAAI,IAAI,aAAa,IAAI;AAAA,EAC3B;AACF;AAmBO,SAAS,mBACd,OACA,UAC+C,IAC/C;AACA,SAAO,SAAU,QAAa,aAAqB;AACjD,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,GAAG,SAAS,aAAa,cAAc,MAAA;AAAA,IAAM;AAEjD,UAAM,eAAe,iDAAiD,IAAI;AAC1EC,QAAAA,QAAa,OAAO,YAAmB,EAAE,QAAQ,WAAW;AAC5D,UAAM,MAAM,wBAAwB,QAAQ,2BAA2B;AACvE,QAAI,IAAI,aAAa,IAAI;AAAA,EAC3B;AACF;AAmBO,SAAS,sBACd,OACA,UAC+C,IAC/C;AACA,SAAO,SAAU,QAAa,aAAqB;AACjD,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,GAAG,SAAS,aAAa,cAAc,MAAA;AAAA,IAAM;AAEjD,UAAM,eAAe,iDAAiD,IAAI;AAC1EC,QAAAA,WAAgB,OAAO,YAAmB,EAAE,QAAQ,WAAW;AAC/D,UAAM,MAAM,wBAAwB,QAAQ,2BAA2B;AACvE,QAAI,IAAI,aAAa,IAAI;AAAA,EAC3B;AACF;AAsBO,SAAS,0BACd,OACA,UAC+C,IAC/C;AACA,SAAO,SAAU,QAAa,aAAqB;AACjD,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,GAAG,SAAS,aAAa,cAAc,MAAM,CAAC,EAAA;AAAA,IAAE;AAEpD,UAAM,eAAe,mDAAmD,IAAI;AAC5EC,QAAAA,eAAoB,OAAO,YAAmB,EAAE,QAAQ,WAAW;AACnE,UAAM,MAAM,wBAAwB,QAAQ,2BAA2B;AACvE,QAAI,IAAI,aAAa,IAAI;AAAA,EAC3B;AACF;ACt9CA,MAAM,wBAAwB/E,IAAAA,IAAI,OAAkC;AAAA,EAClE,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AACrB,CAAC;AAED,MAAM,oCAAoCA,IAAAA,IAAI,OAA8C;AAAA,EAC1F,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAC1B,CAAC;AAED,MAAM,sBAAsBA,IAAAA,IAAI,OAAgC;AAAA,EAC9D,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,KAAKA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,EACxB,OAAOA,IAAAA,IAAI,SAAS,MAAA,EAAQ,SAAA;AAC9B,CAAC;AAED,MAAM,sBAAsBA,IAAAA,IAAI,OAAgC;AAAA,EAC9D,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,KAAKA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AAC1B,CAAC;AAED,MAAM,mBAAmBA,IAAAA,IAAI,OAA6B;AAAA,EACxD,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,gBAAgBA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC7B,SAAS,oBAAoB,SAAA;AAAA,EAC7B,SAAS,oBAAoB,SAAA;AAAA,EAC7B,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AACxB,CAAC;AAED,MAAM,6BAA6BA,IAAAA,IAAI,OAAuC;AAAA,EAC5E,MAAMA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,EACtC,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAC5B,CAAC;AAED,MAAM,qBAAqBA,IAAAA,IAAI,OAA+B;AAAA,EAC5D,KAAKA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAClB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,WAAWA,IAAAA,IAAI,SAAS,QAAQA,IAAAA,IAAI,OAAA,GAAU,0BAA0B,EAAE,SAAA;AAC5E,CAAC;AAED,MAAM,kBAAkBA,IAAAA,IAAI,OAA4B;AAAA,EACtD,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,WAAWA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACxB,QAAQA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACrB,WAAWA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACzB,SAASA,IAAAA,IAAI,QAAA,EAAU,SAAA;AACzB,CAAC;AAED,MAAM,4BAA4BA,IAAAA,IAAI,OAAsC;AAAA,EAC1E,cAAcA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC3B,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAC5D,CAAC;AAED,MAAM,sBAAsBA,IAAAA,IAAI,OAAgC;AAAA,EAC9D,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,OAAOA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACjB,eAAeA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAC9B,CAAC;AAGD,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AAGJ,MAAM,6BAA6B;AAAA,EACjC,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,QAAQA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACrB,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,YAAYA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACzB,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,kBAAkBA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAChC,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,kBAAkBA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAChC,WAAWA,IAAAA,IAAI,SAAS,UAAU,IAAI,CAAC,EAAE,SAAA;AAAA,EACzC,WAAWA,IAAAA,IAAI,SAAS,UAAU,IAAI,CAAC,EAAE,SAAA;AAAA,EACzC,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,UAAUA,IAAAA,IAAI,SAAS,UAAU,IAAI,CAAC,EAAE,SAAA;AAAA,EACxC,UAAUA,IAAAA,IAAI,SAAS,UAAU,IAAI,CAAC,EAAE,SAAA;AAAA,EACxC,aAAaA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC3B,eAAeA,IAAAA,IAAI,SAAS,UAAU,IAAI,CAAC,EAAE,SAAA;AAAA,EAC7C,eAAeA,IAAAA,IAAI,SAAS,UAAU,IAAI,CAAC,EAAE,SAAA;AAAA,EAC7C,UAAUA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,EAC1C,MAAMA,IAAAA,IAAI,MAAA,EAAQ,SAAA;AAAA,EAClB,UAAUA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACxB,eAAe,0BAA0B,SAAA;AAAA,EACzC,UAAUA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACxB,WAAWA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACzB,KAAK,gBAAgB,SAAA;AAAA,EACrB,cAAc,kCAAkC,SAAA;AAAA,EAChD,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,YAAYA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAC5B;AAGA,qBAAqBA,IAAAA,IAClB,eACA;AAAA;AAAA,EAECA,IAAAA,IAAI,OAAoC;AAAA,IACtC,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,OAAO,EAAE,SAAA;AAAA,IAClC,OAAOA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,EAAE,SAAA;AAAA,IAChF,GAAG;AAAA,IACH,sBAAsBA,IAAAA,IACnB,eACA,IAAIA,IAAAA,IAAI,WAAW,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,EACnE,SAAA;AAAA,IACH,YAAYA,IAAAA,IACT,OAAA,EACA;AAAA,MACCA,IAAAA,IAAI,OAAA;AAAA,MACJA,IAAAA,IAAI,eAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC;AAAA,IAAA,EAExE,SAAA;AAAA,IACH,OAAOA,IAAAA,IACJ,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,CAAC,EAC9E,SAAA;AAAA,IACH,OAAOA,IAAAA,IACJ,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,CAAC,EAC9E,SAAA;AAAA,IACH,OAAOA,IAAAA,IACJ,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,CAAC,EAC9E,SAAA;AAAA,IACH,KAAKA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,EAAE,SAAA;AAAA,EAAS,CACxF;AAAA;AAAA,EAEDA,IAAAA,IAAI,OAAuC;AAAA,IACzC,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,WAAW,UAAU,UAAU,UAAU,SAAS,EAAE,SAAA;AAAA,IAC7E,GAAG;AAAA,IACH,sBAAsBA,IAAAA,IACnB,eACA,IAAIA,IAAAA,IAAI,WAAW,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,EACnE,SAAA;AAAA,IACH,YAAYA,IAAAA,IACT,OAAA,EACA;AAAA,MACCA,IAAAA,IAAI,OAAA;AAAA,MACJA,IAAAA,IAAI,eAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC;AAAA,IAAA,EAExE,SAAA;AAAA,IACH,OAAOA,IAAAA,IACJ,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,CAAC,EAC9E,SAAA;AAAA,IACH,OAAOA,IAAAA,IACJ,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,CAAC,EAC9E,SAAA;AAAA,IACH,OAAOA,IAAAA,IACJ,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,CAAC,EAC9E,SAAA;AAAA,IACH,KAAKA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,eAAe,CAAC,EAAE,SAAA;AAAA,EAAS,CACxF;AACH,EACC,GAAG,cAAc;AAEpB,MAAM,gCAAgCA,IAAAA,IACnC,aAAA,EACA,IAAI,uBAAuB,kBAAkB;AAEhD,MAAM,qBAAqBA,IAAAA,IAAI,OAA+B;AAAA,EAC5D,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,UAAUA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACxB,YAAYA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC1B,iBAAiBA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC/B,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,SAASA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACvB,eAAeA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC7B,QAAQA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,kBAAkB,EAAE,SAAA;AAAA,EAC1E,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,UAAUA,IAAAA,IACP,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,mBAAmB,CAAC,EACxF,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,QAAI,KAAK,kBAAkB,CAAC,EAAE,SAAA;AAC5E,CAAC;AAED,MAAM,wBAAwBA,IAAAA,IAAI,OAAkC;AAAA,EAClE,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,IAAIA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACjB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,UAAUA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACxB,YAAYA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC1B,iBAAiBA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC/B,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,SAASA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACvB,eAAeA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC7B,QAAQA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,kBAAkB,EAAE,SAAA;AAAA,EAC1E,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,UAAUA,IAAAA,IACP,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,mBAAmB,CAAC,EACxF,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,QAAI,KAAK,kBAAkB,CAAC,EAAE,SAAA;AAC5E,CAAC;AAED,MAAM,uBAAuBA,IAAAA,IAAI,OAAiC;AAAA,EAChE,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IACN,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,kBAAkB,CAAC,EACvF,SAAA;AAAA,EACH,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,SAASA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EACvB,eAAeA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAC/B,CAAC;AAED,wBAAwBA,IAAAA,IACrB,OAAkC;AAAA,EACjC,QAAQA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,kBAAkB,EAAE,SAAA;AAAA,EAC1E,SAASA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACnB,UAAUA,IAAAA,IACP,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,mBAAmB,CAAC,EACxF,SAAA;AAAA,EACH,UAAUA,IAAAA,IAAI,SAAS,QAAQA,IAAAA,IAAI,OAAA,GAAU,oBAAoB,EAAE,SAAA;AACrE,CAAC,EACA,GAAG,iBAAiB;AAEvB,MAAM,mBAAmBA,IAAAA,IAAI,OAA6B;AAAA,EACxD,cAAcA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC3B,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,YAAYA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,IAAA,CAAK,EAAE,SAAA;AAAA,EAC1D,aAAaA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,EACvB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,QAAQ,mBAAmB,SAAA;AAC7B,CAAC;AAED,MAAM,uBAAuBA,IAAAA,IAAI,OAAiC;AAAA,EAChE,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IACN,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,kBAAkB,CAAC,EACvF,SAAA;AAAA,EACH,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAU,qBAAqB,EAAE,SAAA;AAAA,EACnE,OAAOA,IAAAA,IACJ,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,gBAAgB,CAAC,EACrF,SAAA;AACL,CAAC;AAED,MAAM,wBAAwBA,IAAAA,IAC3B,SACA,QAAQA,IAAAA,IAAI,UAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,oBAAoB,CAAC;AAE5F,MAAM,0BAA0BA,IAAAA,IAAI,OAAoC;AAAA,EACtE,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAU,qBAAqB,EAAE,SAAA;AAAA,EACnE,UAAUA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAC1B,CAAC;AAED,MAAM,kCAAkCA,IAAAA,IACrC,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,CAAC;AAExD,MAAM,wBAAwB,MAC5BA,IAAAA,IACG,OAAqC;AAAA,EACpC,MAAMA,IAAAA,IAAI,QAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,EACtC,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,cAAc,kCAAkC,SAAA;AAAA,EAChD,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,YAAYA,IAAAA,IACT,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,qBAAqB,CAAC,EAC1E,SAAA;AAAA,EACH,aAAaA,IAAAA,IACV,aAAA,EACA,IAAI,uBAAuB,uBAAuB,EAClD,SAAA;AAAA,EACH,WAAW,sBAAsB,SAAA;AAAA,EACjC,WAAWA,IAAAA,IACR,OAAA,EACA;AAAA,IACCA,IAAAA,IAAI,OAAA;AAAA,IACJA,IAAAA,IAAI,eAAe,IAAI,uBAAuBA,IAAAA,IAAI,KAAK,iBAAiB,CAAC;AAAA,EAAA,EAE1E,SAAA;AAAA,EACH,YAAYA,IAAAA,IAAI,QAAA,EAAU,SAAA;AAAA,EAC1B,UAAUA,IAAAA,IAAI,MAAA,EAAQ,MAAM,+BAA+B,EAAE,SAAA;AAAA,EAC7D,SAASA,IAAAA,IAAI,MAAA,EAAQ,MAAM,kBAAkB,EAAE,SAAA;AACjD,CAAC,EACA,QAAQ,IAAI;AAEjB,wBAAwB,MACtBA,IAAAA,IACG,OAAoC;AAAA,EACnC,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACtB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASA,IAAAA,IAAI,MAAA,EAAQ,MAAM,kBAAkB,EAAE,SAAA;AAAA,EAC/C,YAAYA,IAAAA,IACT,MAAA,EACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,qBAAqB,CAAC,EAC1E,SAAA;AAAA;AAAA,EAEH,KAAK,sBAAA,EAA2B,SAAA;AAAA,EAChC,KAAK,sBAAA,EAA2B,SAAA;AAAA,EAChC,MAAM,sBAAA,EAA2B,SAAA;AAAA,EACjC,QAAQ,sBAAA,EAA2B,SAAA;AAAA,EACnC,SAAS,sBAAA,EAA2B,SAAA;AAAA,EACpC,MAAM,sBAAA,EAA2B,SAAA;AAAA,EACjC,OAAO,sBAAA,EAA2B,SAAA;AAAA,EAClC,OAAO,sBAAA,EAA2B,SAAA;AACpC,CAAC,EACA,QAAQ,IAAI,EACZ,GAAG,gBAAgB,GAAA;AAExB,uBAAuBA,IAAAA,IACpB,OAAA,EACA,QAAQA,IAAAA,IAAI,UAAU,oBAAoB,EAC1C,GAAG,gBAAgB;AAOEA,IAAAA,IAAI,OAA4B;AAAA,EACtD,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,cAAc,kCAAkC,SAAA;AAClD,CAAC;AAGD,MAAM,2BAA2BA,IAAAA,IAAI,OAAqC;AAAA,EACxE,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,MAAM,EAAE,SAAA;AAAA,EACjC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,QAAQA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACrB,cAAcA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAC7B,CAAC;AAED,MAAM,6BAA6BA,IAAAA,IAAI,OAAuC;AAAA,EAC5E,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,QAAQ,EAAE,SAAA;AAAA,EACnC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACnB,IAAIA,IAAAA,IAAI,OAAA,EAAS,SAAA;AACnB,CAAC;AAED,MAAM,6BAA6BA,IAAAA,IAAI,OAAuC;AAAA,EAC5E,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,QAAQ,EAAE,SAAA;AAAA,EACnC,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,OAAOA,IAAAA,IACJ,OAAO;AAAA,IACN,UAAUA,IAAAA,IACP,OAAO;AAAA,MACN,kBAAkBA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MACrC,YAAYA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MAC/B,QAAQA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,IAAS,CACnE,EACA,SAAA;AAAA,IACH,UAAUA,IAAAA,IACP,OAAO;AAAA,MACN,UAAUA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MAC7B,YAAYA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MAC/B,QAAQA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,IAAS,CACnE,EACA,SAAA;AAAA,IACH,mBAAmBA,IAAAA,IAChB,OAAO;AAAA,MACN,UAAUA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MAC7B,YAAYA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MAC/B,QAAQA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,IAAS,CACnE,EACA,SAAA;AAAA,IACH,mBAAmBA,IAAAA,IAChB,OAAO;AAAA,MACN,kBAAkBA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MACrC,UAAUA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MAC7B,YAAYA,IAAAA,IAAI,OAAA,EAAS,IAAA,EAAM,SAAA;AAAA,MAC/B,QAAQA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,OAAA,CAAQ,EAAE,SAAA;AAAA,IAAS,CACnE,EACA,SAAA;AAAA,EAAS,CACb,EACA,SAAA;AACL,CAAC;AAED,MAAM,6BAA6BA,IAAAA,IAAI,OAAuC;AAAA,EAC5E,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,eAAe,EAAE,SAAA;AAAA,EAC1C,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,kBAAkBA,IAAAA,IAAI,SAAS,IAAA,EAAM,SAAA;AACvC,CAAC;AAED,MAAM,6BAA6BA,IAAAA,IAChC,aAAA,EACA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAE6BA,IAAAA,IAAI,OAAmC;AAAA,EACpE,SAASA,IAAAA,IACN,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,kBAAkB,CAAC,EACvF,SAAA;AAAA,EACH,WAAWA,IAAAA,IACR,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,oBAAoB,CAAC,EACzF,SAAA;AAAA,EACH,YAAYA,IAAAA,IACT,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,qBAAqB,CAAC,EAC1F,SAAA;AAAA,EACH,UAAUA,IAAAA,IACP,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,mBAAmB,CAAC,EACxF,SAAA;AAAA,EACH,eAAeA,IAAAA,IACZ,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,uBAAuB,CAAC,EAC5F,SAAA;AAAA,EACH,SAASA,IAAAA,IACN,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,kBAAkB,CAAC,EACvF,SAAA;AAAA,EACH,iBAAiBA,IAAAA,IACd,OAAA,EACA;AAAA,IACCA,IAAAA,IAAI,OAAA;AAAA,IACJA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,0BAA0B;AAAA,EAAA,EAEzE,SAAA;AAAA,EACH,OAAOA,IAAAA,IACJ,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,gBAAgB,CAAC,EACrF,SAAA;AAAA,EACH,WAAWA,IAAAA,IACR,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,aAAA,EAAe,IAAI,uBAAuB,oBAAoB,CAAC,EACzF,SAAA;AACL,CAAC;ACtbD,MAAMgF,wBAAsBhF,IAAAA,IAAI,SAAA,EAA0B,SAAA;AAE1D,MAAMiF,4CAA0CjF,IAAAA,IAAI,OAA0C;AAAA,EAC5F,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASgF;AAAAA,EACT,YAAYhF,IAAAA,IAAI,MAAA,EAAQ,MAAMkF,qBAAqB,EAAE,SAAA;AAAA,EACrD,sBAAsBC,8BAA8B,SAAA;AAAA,EACpD,uBAAuBA,8BAA8B,SAAA;AAAA,EACrD,MAAMnF,IAAAA,IAAI,aAAaA,IAAAA,IAAI,UAAUA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,CAAC,EAAE,SAAA;AACxE,CAAC;AAEM,MAAM,sCAAsC,CACjD,UAC+C;AAC/C,MAAI,CAACP,oBAAAA,WAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,EAAE,UAAUwF,0CAAwC,SAAS,OAAO,EAAE,YAAY,MAAM;AAC9F,SAAO,CAAC;AACV;ACxBA,MAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAQ,OAAO,OAAA;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAGO,MAAM,aAAa,CAAC,OAAY,WAAyB;AAC9D,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,MAAO,SAAS,EAAE,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,WAAW,CAAC,CAAE;AAAA,EACjG;AACA,MAAIxF,oBAAAA,WAAS,KAAK,GAAG;AACnB,UAAM,MAAsB,CAAA;AAC5B,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM;AACxC,UAAI,cAAc,CAAC,GAAG;AACpB,YAAI,CAAC,IAAI,aAAa;AACpB,cAAI,cAAc,CAAA;AAAA,QACpB;AACA,YAAI,YAAY,CAAC,IAAI,OAAO,CAAC;AAC7B;AAAA,MACF,OAAO;AACL,YAAI,CAAC,IAAI,WAAW,GAAG,CAAC;AAAA,MAC1B;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,WAAW,cAAc,KAAK,GAAG;AAC/B,WAAO,EAAE,OAAO,OAAO,KAAK,EAAA;AAAA,EAC9B,WAAW,UAAU,QAAW;AAC9B,WAAO;AAAA,EACT,OAAO;AACL,WAAO,CAAA;AAAA,EACT;AAgCF;AChCA,MAAM2F,YAAU,CAAC,MAAc,UAAe;AAC5C,MAAI,iBAAiB,MAAM;AACzB,WAAOC,eAAS,WAAW,KAAK,EAAE,MAAA;AAAA,EACpC;AACA,MAAI,iBAAiBA,MAAAA,UAAU;AAC7B,WAAO,MAAM,MAAA;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,SAAA;AAAA,EACf;AACA,SAAO;AACT;AAEA,MAAMC,kBAAgB,CAAC,SAAmB;AACxC,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,CAAC,SAASA,gBAAc,IAAI,CAAC;AAAA,EAC/C;AACA,MAAI,gBAAgB,MAAM;AACxB,WAAOD,eAAS,WAAW,IAAI,EAAE,MAAA;AAAA,EACnC;AACA,MAAI,gBAAgBA,MAAAA,UAAU;AAC5B,WAAO,KAAK,MAAA;AAAA,EACd;AACA,MAAI5F,oBAAAA,WAAS,IAAI,GAAG;AAClB,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK6F,gBAAc,KAAK,CAAC,CAAC;AAAA,IAAA;AAAA,EAE1E;AACA,SAAO;AACT;AAEA,MAAM,yBAAyBtF,IAAAA,IAC5B,OAAO;AAAA,EACN,cAAcA,IAAAA,IACX,OAAA,EACA;AAAA,IACCA,QAAI,OAAA,EAAS,SAAA;AAAA,IACbA,IAAAA,IACG,QACA;AAAA,MACCA,QACG,SACA,MAAM,OAAO,OAAO,OAAO,OAAO,iBAAiB,eAAe,aAAa;AAAA,IAAA,EAEnF,OAAA,EACA,SAAA;AAAA,EAAS,EAEb,SAAA;AAAA,EACH,QAAQA,IAAAA,IAAI,SAAS,MAAM,IAAI,IAAI,EAAE,QAAQ,EAAE;AAAA,EAC/C,MAAMA,IAAAA,IAAI,OAAA,EAAS,QAAA,EAAU,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC7C,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAA,EAAU,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA,EAC1D,MAAMA,IAAAA,IACH,OAAA,EACA,QAAQA,IAAAA,IAAI,OAAA,EAAS,SAAA,GAAYA,QAAI,OAAA,EAAS,MAAM,OAAO,MAAM,EAAE,QAAQ,KAAK,CAAC,EACjF,QAAQ,EAAE,IAAI,MAAA,CAAO;AAC1B,CAAC,EACA,QAAQ,KAAK;AAEhB,MAAM,kCAAkC,uBAAuB;AAAA,EAC7DA,IAAAA,IAAI,OAAO;AAAA,IACT,QAAQA,IAAAA,IAAI;AAAA,MACVA,IAAAA,IACG,OAAA,EACA,QAAQ,sEAAsE,EAC9E,MAAM,IAAI,IAAI,EACd,QAAQ,EAAE;AAAA,MACbA,QAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,QAAQ,EAAE,OAAA,EAAS,SAAA;AAAA,IAAS;AAAA,EACpD,CACD;AACH;AAEA,MAAM,mCAAmC,uBAAuB;AAAA,EAC9DA,IAAAA,IAAI,OAAO;AAAA,IACT,QAAQA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,EAAE,OAAA,EAAS,SAAA;AAAA,EAAS,CAC3D;AACH;AAOA,MAAMuF,uCAAqCvF,IAAAA,IACxC,OAAqC;AAAA,EACpC,MAAMA,IAAAA,IACH,aAAA,EACA,IAAIA,IAAAA,IAAI,SAAS,SAAA,GAAYA,IAAAA,IAAI,SAAS,QAAA,EAAU,SAAA,CAAU,EAC9D,SAAA;AACL,CAAC,EACA,QAAQA,QAAI,SAAS,YAAYA,IAAAA,IAAI,IAAA,CAAK,EAC1C,QAAQ,IAAI;AACf,MAAM,0CAA0CA,IAAAA,IAC7C,QACA,MAAMuF,oCAAkC;AAyBpC,IAAA,+BAAA,MAAM,2BAA2B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACT,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YACE,SACA,OACA,SACA,SAGA,qCACA,sCACA,sCACA,0BACA;AACA,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,YAAY,IAAI,MAAA;AACrB,SAAK,oBAAoB;AAAA,MACvB,GAAI,uCAAuC,CAAA;AAAA,MAC3C,GAAI,KAAK,SAAS,oBAAoB,CAAA;AAAA,IAAC;AAEzC,SAAK,sBAAsB;AAAA,MACzB,GAAI,wCAAwC,CAAA;AAAA,MAC5C,GAAI,KAAK,SAAS,sBAAsB,CAAA;AAAA,IAAC;AAE3C,QAAI9F,oBAAAA,WAAS,oCAAoC,GAAG;AAClD,UACE,WAAW,wCACX+F,oBAAAA,QAAQ,qCAAqC,KAAK,GAClD;AACA,6CAAqC,MAAM,QAAQ,CAAC,SAAS;AAC3D,eAAK,UAAU,IAAI,SAAS,IAAoC;AAAA,QAClE,CAAC;AAAA,MACH;AACA,UACE,YAAY,wCACZA,oBAAAA,QAAQ,qCAAqC,MAAM,GACnD;AACA,6CAAqC,OAAO,QAAQ,CAAC,SAAS;AAC5D,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AACA,UACE,UAAU,wCACVA,oBAAAA,QAAQ,qCAAqC,IAAI,GACjD;AACA,6CAAqC,KAAK,QAAQ,CAAC,SAAS;AAC1D,eAAK,UAAU,IAAI,QAAQ,IAA6C;AAAA,QAC1E,CAAC;AAAA,MACH;AACA,UACE,iBAAiB,wCACjBA,oBAAAA,QAAQ,qCAAqC,WAAW,GACxD;AACA,6CAAqC,YAAY,QAAQ,CAAC,SAAS;AACjE,eAAK,UAAU,IAAI,eAAe,IAA6C;AAAA,QACjF,CAAC;AAAA,MACH;AACA,UACE,YAAY,wCACZA,oBAAAA,QAAQ,qCAAqC,MAAM,GACnD;AACA,6CAAqC,OAAO,QAAQ,CAAC,SAAS;AAC5D,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI/F,+BAAS,KAAK,SAAS,QAAQ,GAAG;AACpC,UAAI,WAAW,KAAK,SAAS,YAAY+F,4BAAQ,KAAK,SAAS,SAAS,KAAK,GAAG;AAC9E,aAAK,SAAS,SAAS,MAAM,QAAQ,CAAC,SAAS;AAC7C,eAAK,UAAU,IAAI,SAAS,IAAoC;AAAA,QAClE,CAAC;AAAA,MACH;AACA,UAAI,YAAY,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,MAAM,GAAG;AAChF,aAAK,SAAS,SAAS,OAAO,QAAQ,CAAC,SAAS;AAC9C,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AACA,UAAI,UAAU,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,IAAI,GAAG;AAC5E,aAAK,SAAS,SAAS,KAAK,QAAQ,CAAC,SAAS;AAC5C,eAAK,UAAU,IAAI,QAAQ,IAA6C;AAAA,QAC1E,CAAC;AAAA,MACH;AACA,UAAI,iBAAiB,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,WAAW,GAAG;AAC1F,aAAK,SAAS,SAAS,YAAY,QAAQ,CAAC,SAAS;AACnD,eAAK,UAAU,IAAI,eAAe,IAA6C;AAAA,QACjF,CAAC;AAAA,MACH;AACA,UAAI,YAAY,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,MAAM,GAAG;AAChF,aAAK,SAAS,SAAS,OAAO,QAAQ,CAAC,SAAS;AAC9C,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,0BAA0B;AAC5B,+BAAyB,QAAQ,CAAC,WAAW;AAC3C,YAAI,OAAO,OAAO;AAChB,eAAK,kBAAkB,KAAK,OAAO,KAAK;AAAA,QAC1C;AACA,YAAI,OAAO,SAAS;AAClB,eAAK,oBAAoB,KAAK,OAAO,OAAO;AAAA,QAC9C;AACA,YAAI/F,oBAAAA,WAAS,OAAO,QAAQ,GAAG;AAC7B,cAAI,WAAW,OAAO,YAAY+F,oBAAAA,QAAQ,OAAO,SAAS,KAAK,GAAG;AAChE,mBAAO,SAAS,MAAM,QAAQ,CAAC,SAAS;AACtC,mBAAK,UAAU,IAAI,SAAS,IAAoC;AAAA,YAClE,CAAC;AAAA,UACH;AACA,cAAI,YAAY,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,MAAM,GAAG;AAClE,mBAAO,SAAS,OAAO,QAAQ,CAAC,SAAS;AACvC,mBAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,YAC5E,CAAC;AAAA,UACH;AACA,cAAI,UAAU,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,IAAI,GAAG;AAC9D,mBAAO,SAAS,KAAK,QAAQ,CAAC,SAAS;AACrC,mBAAK,UAAU,IAAI,QAAQ,IAA6C;AAAA,YAC1E,CAAC;AAAA,UACH;AACA,cAAI,iBAAiB,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,WAAW,GAAG;AAC5E,mBAAO,SAAS,YAAY,QAAQ,CAAC,SAAS;AAC5C,mBAAK,UAAU,IAAI,eAAe,IAA6C;AAAA,YACjF,CAAC;AAAA,UACH;AACA,cAAI,YAAY,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,MAAM,GAAG;AAClE,mBAAO,SAAS,OAAO,QAAQ,CAAC,SAAS;AACvC,mBAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,YAC5E,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,2BAA2B,KAAkB;AACjD,UAAM,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClD,KAAK;AAAA,MACL,OAAO,6BAA6B;AAAA,IAAA,CACrC;AACD,UAAM,UAAUC,6BAAAA,iBAAiB,GAAG;AACpC,UAAM,SAAS,IAAI,QAAQ,OAAA,KAAY;AACvC,UAAM,MAAM,IAAI,QAAQ,IAAA,KAAS;AACjC,QAAI,iBAAiBC,SAAAA,sBAAsB;AACzC,YAAM,IAAIC,SAAAA,kBAAkB,CAAC,QAAQ,GAAG,CAAC;AAAA,IAC3C;AACA,UAAM,UAAU,CAAC,QAAgB,MAAW,UAAqC,CAAA,MAAO;AACtF,UAAI,SAAS,OAAO,MAAM;AAE1B,aAAO,QAAQ,KAAK,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACtD,YAAI,SAAS,OAAO,KAAK,KAAK;AAAA,MAChC,CAAC;AAED,aAAO,QAAQ,KAAK,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9D,YAAI,SAAS,OAAO,KAAK,KAAK;AAAA,MAChC,CAAC;AAED,aAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,YAAI,SAAS,OAAO,KAAK,KAAK;AAAA,MAChC,CAAC;AAED,UAAI,IAAI,QAAQ,OAAO,gCAAgC,MAAM,KAAK;AAChE,YAAI,SAAS;AAAA,UACX;AAAA,UACA,sEAAsE,OAAO;AAAA,QAAA;AAE/E,cAAM,YAAYL,gBAAc,IAAI;AACpC,YAAI,SAAS,KAAK1F,SAAAA,OAAO,SAAS,CAAC;AACnC;AAAA,MACF;AAEA,cAAQ,SAAA;AAAA,QACN,KAAK;AACH,cAAI,SAAS,OAAO,gBAAgB,oBAAoB;AACxD;AAAA,QACF;AACE,cAAI,SAAS,OAAO,gBAAgB,kBAAkB;AACtD;AAAA,MAAA;AAEJ,UAAI,gBAAgB,OAAO,QAAQ,QAAQ,QAAQ;AACjD,gBAAQ,SAAA;AAAA,UACN,KAAK;AACH,gBAAI,SAAS,KAAKgG,6BAAAA,KAAK,UAAU,MAAMR,SAAO,CAAC;AAC/C;AAAA,UACF;AACE,gBAAI,SAAS,KAAK,KAAK,UAAU,MAAMA,SAAO,CAAC;AAC/C;AAAA,QAAA;AAAA,MAEN;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,qBAAqB,WAAgB,KAAkB;AAK3D,QAAI,YAAY,aAAa3F,oBAAAA,WAAS,UAAU,MAAM,KAAK,CAAC,MAAM,QAAQ,UAAU,MAAM,GAAG;AAC3F,YAAM,OAAO,OAAO,KAAK,UAAU,MAAM;AACzC,UAAI,KAAK,SAAS,KAAK,KAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC,GAAG;AACzD,oBAAY;AAAA,UACV,GAAG;AAAA,UACH,QAAQ,KAAK,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,UAAU,OAAO,CAAC,CAAC;AAAA,QAAA;AAAA,MAErF;AAAA,IACF;AACA,UAAM,EAAE,OAAO,oBAAoB,OAAO,SAAA,IAAa,gCAAgC;AAAA,MACrF;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,SAAS;AAAA,MAAA;AAAA,IACX;AAEF,QAAI,oBAAoB;AACtB,YAAM;AAAA,IACR;AACA,QAAI,YAAY,YAAY,aAAa,OAAO,SAAS,QAAQ;AAC/D,eAAS,SAAS,SAAS,OACxB,MAAM,GAAG,EACT,IAAI,CAAC,QAAgB,IAAI,KAAA,CAAM,EAC/B,OAAO,CAAC,QAAgB,IAAI,SAAS,CAAC;AAAA,IAC3C;AACA,UAAM,EAAE,OAAO,qBAAqB,OAAO,cACzC,iCAAiC,SAAS,UAAU;AAAA,MAClD,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACH,QAAI,qBAAqB;AACvB,YAAM;AAAA,IACR;AACA,UAAM,OAAO,OAAO,QAAQ,UAAU,IAAI;AAC1C,UAAM,UAAUG,SAAAA,OAAO,SAAS;AAChC,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3B,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,UAAU;AAAA,IAAA;AAEZ,QAAI,UAAU,IAAI,QAAQ,YAAY,KAAK;AAC3C,QAAI,IAAI,OAAO,SAAS;AACtB,gBAAU,QAAQ,QAAQ,YAAY,GAAG;AAAA,IAC3C;AACA,WAAO,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC7B,iBAAW;AAAA,IACb;AACA,UAAM,UAAU,GAAG,OAAO;AAC1B,QAAI,YAAY,IAAI,OAAO,UACvB,GAAG,OAAO,GAAG,GAAG,UAAU,WAAW,EAAE,gBAAgB,KAAA,CAAM,CAAC,KAC9D,GAAG,OAAO,KAAK,mBAAmB,OAAO,CAAC;AAC9C,UAAM,eAAe,IAAI,OAAO,UAAU,eAAe;AACzD,UAAM,MAAgC;AAAA,MACpC,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,cAAc,SAAS;AAAA,IAAA;AAEzB,UAAM,SAAS,KAAK,UAAU,OAAO,OAAO;AAC5C,UAAM,OAAO,IAAI,KAAK,GAAG;AACzB,WAAO,QAAQ,KAAK,KAAK;AAAA,MACvB,kBAAkB;AAAA,MAClB,CAAC,YAAY,GAAG;AAAA,IAAA,CACjB;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAkB;AACtC,WAAO,MAAM,KAAK,qBAAqB,IAAI,QAAQ,GAAA,GAAM,GAAG;AAAA,EAC9D;AAAA;AAAA,EAGA,MAAM,mBAAmB,KAAkB;AACzC,UAAM,EAAE,YAAY,IAAI;AACxB,UAAM,UAAUiG,SAAAA,OAAO,mBAAmB,OAAO,CAAC;AAClD,WAAO,MAAM,KAAK,qBAAqB,SAAS,GAAG;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,oBAAoB,KAAkB;AAC1C,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,SAAS,MAAM,MAAM,uBAAuB,KAAK,KAAK,MAAM;AAClE,UAAM,aAAa,OAAO,0BAA0B,KAAK,CAAA;AACzD,UAAM,WAAW,OAAO,wBAAwB,KAAK,CAAA;AACrD,UAAM,eAAe,OAAO,4BAA4B,KAAK,CAAA;AAC7D,WAAO;AAAA,MACL;AAAA,MACA,KAAK;AAAA,QACH,KAAK;AAAA,UACH;AAAA,YACE,YAAY,OAAO;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,UAEFT;AAAAA,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EAEJ;AAAA,EAEA,MAAM,0BACJ,KACA,OACA,KACA,YAAqB,OACrB;AACA,WAAO,MAAM,MAAM,qCAAqC,KAAK,KAAK,SAAS;AAAA,EAC7E;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAkB;AACvC,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,EAAE,cAAc,MAAM,KAAK,0BAA0B,KAAK,OAAO,GAAG;AAC1E,UAAM,EAAE,OAAO,OAAO,UAAA,IAAc,UAAU,SAAS,IAAI,QAAQ,OAAO;AAAA,MACxE,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACD,QAAI,OAAO;AACT,YAAMU,SAAAA,eAAe,KAAK;AAAA,IAC5B;AACA,QAAI,UAAU,IAAI,QAAQ,YAAY,KAAK;AAC3C,WAAO,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC7B,iBAAW;AAAA,IACb;AACA,UAAM,UAAU,GAAG,OAAO;AAC1B,QAAI;AACF,YAAM,MAAuD,MAAM,MAAM;AAAA,QACvE;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MAAA;AAEP,YAAM,SAAS,KAAK,UAAU,OAAO,QAAQ;AAC7C,YAAM,OAAO,IAAI,KAAK,GAAG;AACzB,aAAO,QAAQ,KAAK,KAAK;AAAA,QACvB,kBAAkB;AAAA,MAAA,CACnB;AAAA,IACH,SAAS,GAAG;AACV,YAAMA,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAkB;AAC3C,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,EAAE,QAAQ,cAAc,MAAM,KAAK,0BAA0B,KAAK,OAAO,GAAG;AAClF,UAAM,MAAM;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,WAAWC,IAAAA,OAAU,SAAS;AAAA,MAC9B,sBAAsB,UAAU,SAAA;AAAA,IAAS;AAE3C,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,eAAe,KAAkB;AACrC,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,KAAK,IAAI,OAAO;AACtB,UAAM,MAAuD,MAAM,MAAM;AAAA,MACvE;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IAAA;AAEP,UAAM,SAAS,KAAK,UAAU,OAAO,MAAM;AAC3C,UAAM,OAAO,IAAI,KAAK,GAAG;AACzB,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAAA,EAEA,MAAM,gCAAgC,WAAgB,KAAkB;AACtE,UAAM,EAAE,IAAI,aAAA,IAAiB,IAAI;AAEjC,QAAI,YAAY,aAAatG,oBAAAA,WAAS,UAAU,MAAM,KAAK,CAAC,MAAM,QAAQ,UAAU,MAAM,GAAG;AAC3F,YAAM,OAAO,OAAO,KAAK,UAAU,MAAM;AACzC,UAAI,KAAK,SAAS,KAAK,KAAK,MAAM,CAAC,MAAM,QAAQ,KAAK,CAAC,CAAC,GAAG;AACzD,oBAAY;AAAA,UACV,GAAG;AAAA,UACH,QAAQ,KAAK,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,UAAU,OAAO,CAAC,CAAC;AAAA,QAAA;AAAA,MAErF;AAAA,IACF;AACA,UAAM,EAAE,OAAO,oBAAoB,OAAO,SAAA,IAAa,gCAAgC;AAAA,MACrF;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,SAAS;AAAA,MAAA;AAAA,IACX;AAEF,QAAI,oBAAoB;AACtB,YAAM;AAAA,IACR;AACA,QAAI,YAAY,YAAY,aAAa,OAAO,SAAS,QAAQ;AAC/D,eAAS,SAAS,SAAS,OACxB,MAAM,GAAG,EACT,IAAI,CAAC,QAAgB,IAAI,KAAA,CAAM,EAC/B,OAAO,CAAC,QAAgB,IAAI,SAAS,CAAC;AAAA,IAC3C;AACA,UAAM,EAAE,OAAO,qBAAqB,OAAO,cACzC,iCAAiC,SAAS,UAAU;AAAA,MAClD,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACH,QAAI,qBAAqB;AACvB,YAAM;AAAA,IACR;AACA,UAAM,OAAO,OAAO,QAAQ,UAAU,IAAI;AAC1C,UAAM,UAAUG,SAAAA,OAAO,SAAS;AAChC,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU,UAAU;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL,UAAU;AAAA,IAAA;AAEZ,QAAI,UAAU,IAAI,QAAQ,YAAY,KAAK;AAC3C,QAAI,IAAI,OAAO,SAAS;AACtB,gBAAU,QAAQ,QAAQ,YAAY,GAAG;AAAA,IAC3C;AACA,WAAO,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC7B,iBAAW;AAAA,IACb;AACA,UAAM,UAAU,GAAG,OAAO;AAC1B,QAAI,YAAY,IAAI,OAAO,UACvB,GAAG,OAAO,GAAG,GAAG,UAAU,WAAW,EAAE,gBAAgB,KAAA,CAAM,CAAC,KAC9D,GAAG,OAAO,KAAK,mBAAmB,OAAO,CAAC;AAC9C,UAAM,eAAe,IAAI,OAAO,UAAU,eAAe;AACzD,UAAM,MAAgC;AAAA,MACpC,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,cAAc,SAAS;AAAA,IAAA;AAEzB,UAAM,SAAS,KAAK,UAAU,OAAO,aAAa;AAClD,UAAM,OAAO,IAAI,KAAK,GAAG;AACzB,WAAO,QAAQ,KAAK,KAAK;AAAA,MACvB,kBAAkB;AAAA,MAClB,CAAC,YAAY,GAAG;AAAA,IAAA,CACjB;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,sBAAsB,KAAkB;AAC5C,WAAO,MAAM,KAAK,gCAAgC,IAAI,QAAQ,GAAA,GAAM,GAAG;AAAA,EACzE;AAAA;AAAA,EAGA,MAAM,8BAA8B,KAAkB;AACpD,UAAM,EAAE,YAAY,IAAI;AACxB,UAAM,UAAUiG,SAAAA,OAAO,mBAAmB,OAAO,CAAC;AAClD,WAAO,MAAM,KAAK,gCAAgC,SAAS,GAAG;AAAA,EAChE;AAAA;AAAA,EAGA,MAAM,0BAA0B,KAAkB;AAChD,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,EAAE,iBAAiB,IAAI;AAC7B,UAAM,oCAAoC,MAAM,0BAA0B,IAAI,YAAY;AAC1F,QAAI,CAAC,mCAAmC;AACtC,YAAM,IAAIG,SAAAA,mCAAA;AAAA,IACZ;AACA,UAAM,8BAA8B,MAAM,aAAa,YAAY;AACnE,QAAI,CAAC,6BAA6B;AAChC,YAAM,IAAIA,SAAAA,mCAAA;AAAA,IACZ;AACA,YAAQ,4BAA4B,MAAA;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AACH,cAAM,IAAIA,SAAAA,mCAAA;AAAA,IAAmC;AAEjD,UAAM,0BAA0B,kCAAkC,aAAA;AAClE,QAAI,CAACtG,gBAAAA,mBAAmB,uBAAuB,GAAG;AAChD,YAAM,IAAIsG,SAAAA,mCAAA;AAAA,IACZ;AACA,UAAM,SAAS,MAAM,wBAAwB,uBAAuB,KAAK,KAAK,MAAM;AACpF,UAAM,aAAa,OAAO,cAAc,CAAA;AACxC,UAAM,aAAa,OAAO,0BAA0B,KAAK,CAAA;AACzD,UAAM,WAAW,OAAO,wBAAwB,KAAK,CAAA;AACrD,UAAM,eAAe,OAAO,4BAA4B,KAAK,CAAA;AAC7D,WAAO,QAAQ,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAkB;AACvC,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,KAAK,IAAI,OAAO,MAAM,IAAI,QAAQ,MAAM,MAAM,UAAU;AAC9D,UAAM,EAAE,cAAc,MAAM,KAAK,0BAA0B,KAAK,OAAO,KAAK,IAAI;AAChF,UAAM,EAAE,OAAO,OAAO,UAAA,IAAc,UAAU;AAAA,MAC5CnG,wCAA+B;AAAA,QAC7B,GAAG,IAAI,QAAQ,IAAA;AAAA,QACf,CAAC,MAAM,UAAU,GAAG;AAAA,MAAA,CACrB;AAAA,MACD;AAAA,QACE,YAAY;AAAA,QACZ,SAAS;AAAA,MAAA;AAAA,IACX;AAEF,QAAI,OAAO;AACT,YAAMiG,SAAAA,eAAe,KAAK;AAAA,IAC5B;AACA,QAAI,UAAU,IAAI,QAAQ,YAAY,KAAK;AAC3C,WAAO,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC7B,iBAAW;AAAA,IACb;AACA,UAAM,UAAU,GAAG,OAAO;AAC1B,QAAI;AACF,YAAM,MAAuD,MAAM,MAAM;AAAA,QACvE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,qBAAqB,KAAK;AAAA,UAC1B,0BAA0B,KAAK;AAAA,QAAA;AAAA,MACjC;AAEF,YAAM,SAAS,KAAK,UAAU,OAAO,QAAQ;AAC7C,YAAM,OAAO,IAAI,KAAK,GAAG;AACzB,aAAO,QAAQ,KAAK,KAAK;AAAA,QACvB,kBAAkB;AAAA,MAAA,CACnB;AAAA,IACH,SAAS,GAAG;AACV,YAAMA,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,qBAAqB,KAAkB;AAC3C,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,EAAE,QAAQ,UAAA,IAAc,MAAM,KAAK,0BAA0B,KAAK,OAAO,KAAK,IAAI;AACxF,UAAM,MAAM;AAAA,MACV,QAAQ,OAAO;AAAA,MACf,WAAWC,IAAAA,OAAU,SAAS;AAAA,MAC9B,sBAAsB,UAAU,SAAA;AAAA,IAAS;AAE3C,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAAA,EAEA,MAAM,iCACJ,OACA,KACA,OACA,KACA;AACA,UAAM,EAAE,cAAc,MAAM,KAAK,0BAA0B,KAAK,OAAO,KAAK,IAAI;AAChF,UAAM,EAAE,OAAO,OAAO,cAAc,UAAU,SAAS,OAAO;AAAA,MAC5D,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACD,QAAI,OAAO;AACT,YAAMD,SAAAA,eAAe,KAAK;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,uCAAuCnI,SAAuB,KAAkB;AACpF,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,UAAU,MAAM,KAAK;AAAA,MACzBkC,wCAA+B;AAAA,QAC7B,GAAG,IAAI,QAAQ,IAAA;AAAA,QACf,QAAQ;AAAA,MAAA,CACT;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,QAAI;AACF,YAAM,MAAM,yBAAyBlC,SAAQ,SAAS,KAAK,KAAK;AAAA,QAC9D,qBAAqB,KAAK;AAAA,QAC1B,0BAA0B,KAAK;AAAA,MAAA,CAChC;AACD,aAAO,QAAQ,KAAK,MAAS;AAAA,IAC/B,SAAS,GAAG;AACV,YAAMmI,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,mCAAmC,KAAa,KAAkB;AACtE,UAAM,EAAE,OAAO,oBAAoB,OAAO,aAAa9F,IAAAA,IACpD,OAAA,EACA,QAAQ,oBAAoB,EAC5B,SAAA,EACA,SAAS,KAAK;AAAA,MACb,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACH,QAAI,oBAAoB;AACtB,YAAM;AAAA,IACR;AACA,UAAM,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,OAAe,GAAG,MAAM;AACnE,UAAM,EAAE,OAAO,qBAAqB,OAAO,UAAA,IAAcA,QACtD,QACA,MAAMA,IAAAA,IAAI,aAAaA,IAAAA,IAAI,OAAA,EAAS,QAAA,GAAWA,QAAI,OAAA,CAAQ,CAAC,EAC5D,OAAA,EACA,IAAI,CAAC,EACL,SAAS,WAAW;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACH,QAAI,qBAAqB;AACvB,YAAM;AAAA,IACR;AACA,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,UAAU,MAAM,KAAK;AAAA,MACzBH,wCAA+B;AAAA,QAC7B,GAAG,IAAI,QAAQ,IAAA;AAAA,QACf,KAAK;AAAA,MAAA,CACN;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,QAAI;AACF,YAAM,MAAM,8BAA8B,WAAW,SAAS,KAAK,KAAK;AAAA,QACtE,qBAAqB,KAAK;AAAA,QAC1B,0BAA0B,KAAK;AAAA,MAAA,CAChC;AACD,aAAO,QAAQ,KAAK,MAAS;AAAA,IAC/B,SAAS,GAAG;AACV,YAAMiG,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAqB,KAAkB;AAC3C,UAAM,MAAM,IAAI,OAAO,OAAO,IAAI,QAAQ,KAAK;AAC/C,QAAI,KAAK;AACP,aAAO,MAAM,KAAK,mCAAmC,KAAK,GAAG;AAAA,IAC/D;AACA,WAAO,MAAM,KAAK,uCAAuC,IAAI,QAAQ,KAAK,UAAU,MAAM,GAAG;AAAA,EAC/F;AAAA;AAAA,EAGA,MAAM,yBAAyB,KAAkB;AAC/C,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,UAAM,WAAW,MAAM,MAAM,uBAAuB,KAAK,KAAK,MAAM;AACpE,UAAM,SAAS,MAAM,MAAM,uBAAuB,KAAK,KAAK,OAAO;AACnE,UAAM,gBAAgB,MAAM,MAAM,4BAA4B,KAAK,GAAG;AACtE,UAAM,iBACJ,MAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEJ,UAAM,oBAAoB9F,IAAAA,IAAI;AAAA,MAC5B,OAAO;AAAA,QACL,CAAA;AAAA,QACA,GAAG,OAAO,KAAK,OAAO,UAAW,EAC9B,OAAO,CAAC,MAAM,MAAM,MAAM,UAAU,EACpC,IAAI,CAAC,yBAAyB;AAC7B,gBAAM,aAAa,EAAE,CAAC,oBAAoB,GAAGA,IAAAA,IAAI,MAAI;AACrD,gBAAM,OAAO,cAAc,WAAW,oBAAoB;AAC1D,cAAI,MAAM;AACR,kBAAM,YAAY,KAAK;AACvB,gBAAI,WAAW;AACb,yBAAW,oBAAoB,IAAI;AAAA,YACrC;AAAA,UACF;AACA,cAAI;AACF,kBAAM,YAAY,eAAe,QAAQ,oBAAoB;AAC7D,gBAAI,WAAW;AACb,yBAAW,oBAAoB,IAC7B,WAAW,oBAAoB,EAAE,OAAO,SAAS;AAAA,YACrD;AAAA,UACF,QAAQ;AAAA,UAER;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MAAA;AAAA,IACL;AAEF,UAAM,aAAa,SAAS,0BAA0B,KAAK,CAAA;AAC3D,UAAM,cAAc,OAAO;AAAA,MACzB,OAAO,QAAQ,OAAO,cAAc,CAAA,CAAE,EAAE;AAAA,QACtC,CAAC,CAAC,GAAG,CAAC,MACJ,MAAM,MAAM,cAAc,CAAC,EAAE,2BAA2B,KAAK,CAAC,EAAE,yBAAyB;AAAA,MAAA;AAAA,IAC7F;AAEF,UAAM,MAAM;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,KAAK,MAAM,KAAK,UAAU,YAAYoF,SAAO,CAAC;AAAA,MAC1D,WAAWW,IAAAA,OAAU,iBAAiB;AAAA,MACtC,sBAAsB,kBAAkB,SAAA;AAAA,IAAS;AAEnD,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAAA;AAAA;AAAA,EAIA,MAAM,sBAAsB,KAAkB;AAC5C,UAAM,UAAU,OAAO,OAAO,IAAI,QAAQ,KAAK;AAC/C,UAAM,EAAE,OAAO,MAAA,IAAU,wCAAwC,SAAS,SAAS;AAAA,MACjF,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACD,QAAI,OAAO;AACT,YAAMD,SAAAA,eAAe,KAAK;AAAA,IAC5B;AACA,UAAM,EAAE,OAAO,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACpE,UAAM,EAAE,IAAI,aAAA,IAAiB,IAAI;AAEjC,UAAM,WAAW,MAAM,MAAM,MAAA,EAAQ,MAAM,MAAM,YAAY,EAAE,EAAE,MAAA;AACjE,QAAI,CAAC,UAAU;AACb,YAAM,IAAI/D,SAAAA,6BAAA;AAAA,IACZ;AACA,UAAM,oCAAoC,MAAM,0BAA0B,IAAI,YAAY;AAC1F,QAAI,CAAC,mCAAmC;AACtC,YAAM,IAAIiE,SAAAA,mCAAA;AAAA,IACZ;AACA,UAAM,8BAA8B,MAAM,aAAa,YAAY;AACnE,QAAI,CAAC,6BAA6B;AAChC,YAAM,IAAIA,SAAAA,mCAAA;AAAA,IACZ;AACA,YAAQ,4BAA4B,MAAA;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AACH,cAAM,IAAIA,SAAAA,mCAAA;AAAA,MACZ,KAAK;AACH,cAAM,IAAIC,SAAAA,oCAAA;AAAA,IAAoC;AAElD,QAAI,4BAA4B,SAAS,cAAc;AACrD,YAAM,WAAsD,OAAO;AAAA,QACjE,CAAA;AAAA,QACA,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,UACnB,CAAC,EAAE,KAAK,SAAA,CAAU,GAAGpG,SAAAA,+BAA+B;AAAA,YAClD,GAAG;AAAA,YACH,MAAM;AAAA,UAAA,CACP;AAAA,QAAA,EACD;AAAA,MAAA;AAEJ,UAAI;AACF,cAAM,SAAS,QAAQ,YAAY,EAAE,KAAK,QAAQ;AAAA,MACpD,SAAS,GAAG;AACV,cAAMiG,SAAAA,eAAe,CAAC;AAAA,MACxB;AAAA,IACF;AACA,QAAI,4BAA4B,SAAS,WAAW;AAGlD,YAAM,aAAc,4BAAoC,QAAQ;AAChE,UAAI,CAAC,YAAY;AACf,cAAM,IAAI7D,SAAAA;AAAAA,UACR,yBAAyB,YAAY;AAAA,QAAA;AAAA,MAEzC;AACA,YAAM,eAAe,kCAAkC,aAAA;AACvD,YAAM,eAAe,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAC5C,YAAM,CAAC,8BAA8B,8BAA8B,IAAI,MAAM,QAAQ,IAAI;AAAA,QACvF,SAAS,QAAQ,YAAY,EAAE,QAAQ,WAAW,aAAa,YAAY,YAAY;AAAA;AAAA,QAEvF,aAAa,MAAA,EAAQ,QAAQ,aAAa,YAAY,YAAY;AAAA,MAAA,CACnE;AACD,YAAM,sCAAsC,MAAM;AAAA,QAChD;AAAA,QACA,OAAO,oBAAoB;AACzB,0BAAgB,MAAM;AAAA,YACpB,CAAC,UAAU,GAAG;AAAA,UAAA,CACf;AACD,cAAI;AACF,kBAAM,gBAAgB,KAAA;AAAA,UACxB,SAAS,GAAG;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG,aAAa,MAAA;AAAA,MAAM;AAEvC,YAAM,yCAAyC,oCAAoC;AAAA,QACjF,CAAC,WAAW,gBAAgB,OAAO;AAAA,MAAA;AAErC,UAAI,uCAAuC,SAAS,GAAG;AACrD,cAAM,uCAAuC,CAAC;AAAA,MAChD;AACA,YAAM,wCAAwC,MAAM;AAAA,QAClD;AAAA,QACA,OAAO,oBAAoB;AACzB,0BAAgB,MAAM;AAAA,YACpB,CAAC,UAAU,GAAG,SAAS,cAAc,MAAM,UAAU;AAAA,UAAA,CACtD;AACD,cAAI;AACF,kBAAM,gBAAgB,KAAA;AAAA,UACxB,SAAS,GAAG;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG,aAAa,MAAA;AAAA,MAAM;AAEvC,YAAM,2CAA2C,sCAAsC;AAAA,QACrF,CAAC,WAAW,gBAAgB,OAAO;AAAA,MAAA;AAErC,UAAI,yCAAyC,SAAS,GAAG;AACvD,cAAM,yCAAyC,CAAC;AAAA,MAClD;AAAA,IACF;AACA,WAAO,QAAQ,KAAK,MAAS;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAM,iBAAiB,KAAkB;AACvC,UAAM,EAAE,OAAO,KAAK,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AACzE,QAAI;AACF,YAAM,MAAM,qBAAqB,IAAI,OAAO,IAAI,KAAK,KAAK,KAAK,iBAAiB;AAChF,aAAO,QAAQ,KAAK,MAAS;AAAA,IAC/B,SAAS,GAAG;AACV,YAAM6D,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,OAAO,mCACL,QACgC;AAChC,WAAOjG,wCAA+B;AAAA,MACpC,GAAG;AAAA,MACH,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AAAA,EACH;AAAA,EAEA,OAAO,sCAAsC,QAAgC;AAC3E,UAAM,WACJ,2BAA2B,mCAAmC,MAAM;AACtE,UAAM,MAAsBA,SAAAA,+BAA+B;AAAA,MACzD,cAAc,EAAE,aAAa,EAAE,SAAS,OAAO,UAAU,UAAQ;AAAA,MACjE,SAAS;AAAA,QACP,aAAa;AAAA,UACX,OAAO,SAAS;AAAA,UAChB,MAAM,SAAS;AAAA,UACf,SAAS,SAAS;AAAA,QAAA;AAAA,QAEpB,SAAS,SAAS,QAAQ;AAAA,UAAI,CAAC,WAC7B,WAAW,MAAM;AAAA,QAAA;AAAA,MACnB;AAAA,MAEF,cACE,OAAO,KAAK,SAAS,YAAY,EAAE,WAAW,IAC1C,SACA,OAAO,QAAQ,SAAS,YAAY,EAAE;AAAA,QAAI,CAAC,CAAC,KAAK,IAAI,MACnDA,wCAA+B;AAAA,UAC7B,CAAC,GAAG,GAAG;AAAA,YACL,aAAa;AAAA,UAAA;AAAA,QACf,CACD;AAAA,MAAA;AAAA,IACH,CACP;AACD,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,iDACX,OACA,KACA,KACA;AACA,UAAM,UAAuB,CAAA;AAC7B,UAAM;AAAA,MACJ,MAAM,4CAA4C;AAAA,MAClD,OAAO,YAAY;AACjB,cAAM,SAAS,MAAM,QAAQ,KAAK,GAAG;AACrC,YAAI,QAAQ;AACV,kBAAQ,KAAK,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,MACA,EAAE,aAAa,EAAA;AAAA,IAAE;AAEnB,QAAI,MAAMG,IAAAA,IAAI,IAAA;AACd,YAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAM,IAAI,OAAO,MAAM;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,EACT;AACF;;;;;;AC7iCA,WAAS,SAAU,GAAG,KAAK;AACzB,QAAI;AACJ,QAAI;AAEJ,QAAI,OAAO,QAAQ,YAAY;AAC7B,UAAI,IAAI,CAAC;AACT,UAAI,MAAM,QAAW;AACnB,YAAI;AAAA,MACV;AAAA,IACA,WAAa,MAAM,QAAQ,GAAG,GAAG;AAC7B,WAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AAC/B,YAAI,IAAI,CAAC,EAAE,CAAC;AACZ,YAAI,MAAM,QAAW;AACnB,cAAI;AAAA,QACZ;AAAA,MACA;AAAA,IACA;AAEE,WAAO;AAAA,EACT;AAEA,WAAS,SAAU,KAAK,KAAK;AAE3B,QAAI,IAAI,CAAC,MAAM,OAAO,MAAM,QAAQ,GAAG,KAAK,SAAS,KAAK,GAAG,GAAG;AAC9D,aAAO,IAAI,SAAS,SAAS,KAAK,EAAE;AAAA,IACxC;AACE,WAAO;AAAA,EACT;AAEA,WAAS,QAAS,GAAG;AACnB,WAAO,QAAQ,KAAK,CAAC;AAAA,EACvB;AAEA,WAAS,SAAU,KAAK;AACtB,WAAO,OAAO,UAAU,SAAS,KAAK,GAAG,MAAM;AAAA,EACjD;AAEA,WAAS,gBAAiB,KAAK;AAC7B,WAAO,OAAO,GAAG,MAAM;AAAA,EACzB;AAEA,WAAS,cAAe,KAAK;AAC3B,WAAO,OAAO,KAAK,GAAG,EAAE,WAAW;AAAA,EACrC;AAEA,MAAI,YAAY,CAAC,aAAa,aAAa,aAAa;AACxD,MAAI,kBAAkB,SAAU,MAAM;AAAE,WAAO,UAAU,QAAQ,IAAI,MAAM;AAAA,EAAE;AAE7E,WAAS,UAAW,MAAM,KAAK;AAC7B,QAAI,KAAK,QAAQ,GAAG,KAAK,GAAG;AAC1B,aAAO,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,EAAE;AAAA,IACpD;AAEE,QAAI,QAAQ,KAAK,MAAM,GAAG;AAE1B,QAAI,QAAQ,MAAM,OAAO,eAAe;AAExC,QAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,YAAM,MAAM,6CAA6C,IAAI;AAAA,IACjE;AAEE,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,OAAO,UAAU;AAEtC,WAAS,UAAW,WAAW,UAAU,UAAU,aAAa;AAC9D,QAAI,EAAE,gBAAgB,YAAY;AAChC,aAAO,IAAI,UAAU,WAAW,UAAU,UAAU,WAAW;AAAA,IACnE;AAEE,QAAI,OAAO,aAAa,YAAa,YAAW;AAChD,QAAI,OAAO,aAAa,YAAa,YAAW;AAChD,QAAI,OAAO,gBAAgB,YAAa,eAAc;AACtD,SAAK,YAAY,aAAa;AAC9B,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,cAAc;AACnB,SAAK,YAAY;AAGjB,SAAK,UAAU,CAAA;AAAA,EACjB;AAEA,MAAI,aAAa,IAAI,UAAU,KAAK,OAAO,MAAM,IAAI;AACrD,WAAS,KAAM,QAAQ;AACrB,WAAO,WAAY;AACjB,aAAO,WAAW,MAAM,EAAE,MAAM,YAAY,SAAS;AAAA,IACzD;AAAA,EACA;AAEA,YAAU,UAAU,QAAQ,SAAU,GAAG,KAAK,GAAG,KAAK;AACpD,QAAI,IAAI,EAAE,MAAK;AAEf,QAAI,EAAE,SAAS,GAAG;AAChB,UAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAA,IAAK,CAAA;AAE1D,UAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG;AAC5B,YAAI,KAAK,UAAU;AACjB,cAAI,CAAC,IAAI,CAAA;AAAA,QACjB,OAAa;AACL,cAAI,EAAE,gBAAgB,CAAC,KAAK,cAAc,CAAC,IAAI;AAC7C,kBAAM,IAAI;AAAA,cACR,yBAAyB,IAAI,kBAAkB,OAAO,IAAI,CAAC;AAAA,YACvE;AAAA,UACA;AAEQ;AAAA,QACR;AAAA,MACA;AAEI,WAAK,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG;AAAA,IAChC,OAAS;AACL,UAAI,CAAC,KAAK,YAAY,gBAAgB,IAAI,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG;AACvE,YAAI,EAAE,gBAAgB,CAAC,KAAK,cAAc,CAAC,IAAI;AAC7C,gBAAM,IAAI,MAAM,uCAAuC,IAAI,IAAI;AAAA,QACvE;AAEM;AAAA,MACN;AAEI,UAAI,CAAC,IAAI,SAAS,GAAG,GAAG;AAAA,IAC5B;AAAA,EACA;AAwBA,YAAU,UAAU,SAAS,SAAU,KAAK,MAAM;AAChD,QAAI,OAAO;AAEX,WAAO,KAAK,GAAG,EAAE,QAAQ,SAAU,GAAG;AACpC,UAAI,MAAM,SAAS,SAAY,OAAO,KAAK,CAAC;AAE5C,UAAI,KAAK,UAAU,GAAG,KAAK,SAAS,EAAE,KAAK,KAAK,SAAS;AAEzD,UAAI,GAAG,QAAQ,KAAK,SAAS,MAAM,IAAI;AACrC,aAAK,MAAM,GAAG,MAAM,KAAK,SAAS,GAAG,KAAK,IAAI,CAAC,GAAG,GAAG;AACrD,eAAO,IAAI,CAAC;AAAA,MAClB,OAAW;AACL,YAAI,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,GAAG;AAAA,MACnC;AAAA,IACA,CAAG;AAED,WAAO;AAAA,EACT;AAQA,YAAU,UAAU,MAAM,SAAU,MAAM,GAAG,KAAK,KAAK;AACrD,QAAI,KAAK,UAAU,MAAM,KAAK,SAAS,EAAE,KAAK,KAAK,SAAS;AAE5D,QAAI,KAAK,QAAQ,KAAK,SAAS,MAAM,IAAI;AACvC,WAAK,MAAM,GAAG,MAAM,KAAK,SAAS,GAAG,KAAK,GAAG,GAAG;AAAA,IACpD,OAAS;AACL,UAAI,IAAI,IAAI,SAAS,GAAG,GAAG;AAAA,IAC/B;AAEE,WAAO;AAAA,EACT;AAYA,YAAU,UAAU,OAAO,SAAU,MAAM,KAAK,QAAQ,cAAc;AACpE,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,WAAO,UAAU,MAAM,KAAK,SAAS;AACrC,SAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAChC,YAAM,SAAS,KAAK,CAAC,GAAG,GAAG;AAC3B,UAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,KAAK;AAChD,YAAI,MAAM,KAAK,SAAS,GAAG;AACzB,cAAI,QAAQ;AACV,kBAAM,IAAI,GAAG;AACb,gBAAI,gBAAgB,MAAM,QAAQ,GAAG,GAAG;AACtC,kBAAI,OAAO,KAAK,CAAC;AAAA,YAC7B,OAAiB;AACL,qBAAO,IAAI,GAAG;AAAA,YAC1B;AACU,gBAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,mBAAK,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAC/B,kBAAI,KAAK,QAAQ,QAAQ,EAAE,MAAM,IAAI;AACnC,qBAAK,QAAQ,KAAK,EAAE;AAAA,cAClC;AAAA,YACA;AACU,mBAAO;AAAA,UACjB,OAAe;AACL,mBAAO,IAAI,GAAG;AAAA,UACxB;AAAA,QACA,OAAa;AACL,gBAAM,IAAI,GAAG;AAAA,QACrB;AAAA,MACA,OAAW;AACL,eAAO;AAAA,MACb;AAAA,IACA;AACE,QAAI,UAAU,MAAM,QAAQ,GAAG,GAAG;AAChC,YAAM,IAAI,OAAO,SAAU,GAAG;AAC5B,eAAO,MAAM;AAAA,MACnB,CAAK;AAAA,IACL;AACE,WAAO;AAAA,EACT;AASA,YAAU,UAAU,SAAS,SAAU,MAAM,KAAK;AAChD,WAAO,KAAK,OAAO,MAAM,KAAK,IAAI;AAAA,EACpC;AAiBA,YAAU,UAAU,SAAS,SAAU,MAAM,KAAK,cAAc;AAC9D,QAAI;AAEJ,SAAK,UAAU,CAAA;AACf,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAChC,aAAK,KAAK,KAAK,CAAC,GAAG,KAAK,MAAM,YAAY;AAAA,MAChD;AACI,UAAI,CAAC,cAAc;AACjB,aAAK,SAAS,GAAG;AAAA,MACvB;AACI,aAAO;AAAA,IACX,OAAS;AACL,aAAO,KAAK,KAAK,MAAM,KAAK,MAAM,YAAY;AAAA,IAClD;AAAA,EACA;AAEA,YAAU,UAAU,WAAW,SAAU,KAAK;AAC5C,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,QAAQ,QAAQ;AACvB,WAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;AACxC,eAAO,KAAK,QAAQ,CAAC,EAAE,MAAM,GAAG;AAChC,eAAO,KAAK,OAAO,GAAG,EAAE,EAAE,KAAK,GAAG;AAClC,cAAM,OAAO,KAAK,KAAK,MAAM,GAAG,IAAI;AACpC,cAAM,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,SAAU,GAAG;AACrC,iBAAO,MAAM;AAAA,QACrB,CAAO;AACD,aAAK,IAAI,KAAK,QAAQ,CAAC,GAAG,KAAK,GAAG;AAAA,MACxC;AACI,WAAK,UAAU,CAAA;AAAA,IACnB;AAAA,EACA;AAYA,YAAU,UAAU,MAAM,UAAU,UAAU;AAe9C,YAAU,UAAU,OAAO,SAAU,QAAQ,QAAQ,KAAK,MAAM,OAAO;AACrE,QAAI,OAAO,SAAS,cAAc,MAAM,QAAQ,IAAI,GAAG;AACrD,WAAK,IAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK;AAAA,IAC7E,OAAS;AACL,cAAQ;AACR,WAAK,IAAI,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK;AAAA,IAC7D;AAEE,WAAO;AAAA,EACT;AAgBA,YAAU,UAAU,WAAW,SAC7B,QACA,QACA,MACA,MACA,MACA,OACA;AACA,QAAI,OAAO,SAAS,cAAc,MAAM,QAAQ,IAAI,GAAG;AACrD,WAAK;AAAA,QACH;AAAA,QACA,SAAS,KAAK,KAAK,QAAQ,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5C;AAAA,QACA;AAAA,MACN;AAAA,IACA,OAAS;AACL,cAAQ;AACR,WAAK,IAAI,QAAQ,KAAK,KAAK,QAAQ,MAAM,IAAI,GAAG,MAAM,KAAK;AAAA,IAC/D;AAEE,WAAO;AAAA,EACT;AAgBA,YAAU,UAAU,OAAO,SAAU,QAAQ,QAAQ,MAAM,MAAM,MAAM,OAAO;AAC5E,QAAI,OAAO,SAAS,cAAc,MAAM,QAAQ,IAAI,GAAG;AACrD,WAAK;AAAA,QACH;AAAA,QACA;AAAA;AAAA,UAEE,KAAK,MAAM,KAAK,UAAU,KAAK,KAAK,QAAQ,MAAM,KAAK,CAAC,CAAC;AAAA,UACzD;AAAA;QAEF;AAAA,QACA;AAAA,MACN;AAAA,IACA,OAAS;AACL,cAAQ;AACR,WAAK,IAAI,QAAQ,KAAK,KAAK,QAAQ,MAAM,KAAK,GAAG,MAAM,KAAK;AAAA,IAChE;AAEE,WAAO;AAAA,EACT;AAWA,YAAU,UAAU,MAAM,SAAU,MAAM,KAAK,KAAK,OAAO;AACzD,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AAGJ,QAAI,OAAO,QAAQ,aAAa;AAC9B,aAAO;AAAA,IACX;AACE,WAAO,UAAU,MAAM,KAAK,SAAS;AAErC,SAAK,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAChC,YAAM,KAAK,CAAC;AACZ,UAAI,MAAM,KAAK,SAAS,GAAG;AACzB,YAAI,SAAS,SAAS,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG;AAChD,eAAK,KAAK,KAAK;AACb,gBAAI,eAAe,KAAK,KAAK,CAAC,GAAG;AAC/B,kBAAI,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC;AAAA,YAC/B;AAAA,UACA;AAAA,QACA,WAAiB,SAAS,MAAM,QAAQ,IAAI,GAAG,CAAC,KAAK,MAAM,QAAQ,GAAG,GAAG;AACjE,mBAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,gBAAI,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAAA,UAClC;AAAA,QACA,OAAa;AACL,cAAI,GAAG,IAAI;AAAA,QACnB;AAAA,MACA;AAAA;AAAA,QAEM,CAAC,eAAe,KAAK,KAAK,GAAG,KAC5B,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,QAAQ,IAAI,GAAG,CAAC;AAAA,QAC/C;AAEA,YAAI,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG;AAC7B,cAAI,GAAG,IAAI,CAAA;AAAA,QACnB,OAAa;AACL,cAAI,GAAG,IAAI,CAAA;AAAA,QACnB;AAAA,MACA;AACI,YAAM,IAAI,GAAG;AAAA,IACjB;AACE,WAAO;AAAA,EACT;AA0BA,YAAU,UAAU,YAAY,SAAU,QAAQ,KAAK,KAAK;AAC1D,UAAM,OAAO,CAAA;AACb,UAAM,OAAO,CAAA;AACb,WAAO,KAAK,MAAM,EAAE;AAAA,OAClB,SAAU,KAAK;AACb,aAAK,IAAI,OAAO,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG,GAAG,GAAG;AAAA,MACpD,GAAM,KAAK,IAAI;AAAA,IACf;AACE,WAAO;AAAA,EACT;AAmBA,YAAU,UAAU,MAAM,SAAU,KAAK,KAAK,MAAM;AAClD,UAAM,OAAO,CAAA;AACb,WAAO,QAAQ,CAAA;AACf,QAAI,UAAU,MAAM,QAAQ,GAAG;AAE/B,WAAO,KAAK,GAAG,EAAE;AAAA,OACf,SAAU,KAAK;AACb,YAAIzD,SAAQ,WAAW,KAAK,cAAc,MAAM,MAAM,MAAM;AAC5D,YACE,gBAAgB,IAAI,GAAG,CAAC,MACtB,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,GAAG,CAAC,KAC5C,MAAM,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,aAAa,IAAI,GAAG,EAAE,WAAW,IACrE;AACA,cAAI,WAAW,KAAK,aAAa;AAC/B,gBAAI,cAAc,KAAK,KAAK,SAAS,CAAC,KAAK;AAC3C,mBAAO,KAAK;AAAA,cACV,IAAI,GAAG;AAAA,cACP;AAAA,cACA,KAAK,MAAM,GAAG,EAAE,EAAE,OAAO,cAAcA,MAAK;AAAA,YACxD;AAAA,UACA,OAAe;AACL,mBAAO,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,KAAK,OAAOA,MAAK,CAAC;AAAA,UAC3D;AAAA,QACA,OAAa;AACL,cAAI,WAAW,KAAK,aAAa;AAC/B,gBAAI,KAAK,KAAK,KAAK,SAAS,EAAE,OAAO,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG;AAAA,UAC1E,OAAe;AACL,gBAAI,KAAK,OAAOA,MAAK,EAAE,KAAK,KAAK,SAAS,CAAC,IAAI,IAAI,GAAG;AAAA,UAChE;AAAA,QACA;AAAA,MACA,GAAM,KAAK,IAAI;AAAA,IACf;AACE,WAAO;AAAA,EACT;AAEA,YAAU,OAAO,KAAK,MAAM;AAC5B,YAAU,OAAO,KAAK,MAAM;AAC5B,YAAU,WAAW,KAAK,UAAU;AACpC,YAAU,YAAY,KAAK,WAAW;AACtC,YAAU,OAAO,KAAK,MAAM;AAC5B,YAAU,SAAS,KAAK,QAAQ;AAChC,YAAU,MAAM,KAAK,KAAK;AAC1B,YAAU,MAAM,KAAK,KAAK;AAC1B,YAAU,SAAS,KAAK,QAAQ;AAChC,YAAU,MAAM,UAAU,SAAS,KAAK,QAAQ;AAChD,YAAU,MAAM,KAAK,KAAK;AAC1B,GAAC,YAAY,WAAW,EAAE,QAAQ,SAAU,MAAM;AAChD,WAAO,eAAe,WAAW,MAAM;AAAA,MACrC,KAAK,WAAY;AACf,eAAO,WAAW;AAAA,MACxB;AAAA,MACI,KAAK,SAAU,KAAK;AAClB,mBAAW,WAAW,CAAC,CAAC;AAAA,MAC9B;AAAA,KACG;AAAA,EACH,CAAC;AACD,GAAC,YAAY,aAAa,aAAa,EAAE,QAAQ,SAAU,MAAM;AAC/D,WAAO,eAAe,WAAW,MAAM;AAAA,MACrC,KAAK,WAAY;AACf,eAAO,WAAW,IAAI;AAAA,MAC5B;AAAA,MACI,KAAK,SAAU,KAAK;AAClB,mBAAW,IAAI,IAAI;AAAA,MACzB;AAAA,KACG;AAAA,EACH,CAAC;AAED,YAAU,WAAW;AAErB,cAAiB;;;;;AC9iBjB,MAAM,qCAA+D;AAAA,EACnE,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY,CAAA;AAAA,EACZ,QAAQ,CAAA;AAAA,EACR,YAAY,CAAA;AAAA,EACZ,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,SAAS;AAAA,EAAA;AAAA,EAEX,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,EAAA;AAAA,EAEd,aAAa;AAAA,EACb,SAAS,CAAA;AAAA,EACT,UAAU,CAAA;AAAA,EACV,kBAAkB,CAAA;AAAA,EAClB,oBAAoB,CAAA;AAAA,EACpB,UAAU,CAAA;AAAA,EACV,UAAU,CAAA;AACZ;AAEA,MAAM2J,0BAAwB,CAAC,OAAO;AAEtC,MAAM,gCAAgC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,oCAAoClG,IAAAA,IAAI,OAAA;AAC5C,8BAA8B,QAAQ,CAAC,MAAM;AAC3C,sCAAoC,kCAAkC;AAAA,IACpEA,IAAAA,IAAI,SAAS,MAAM,GAAG,EAAE,QAAQ,MAAM;AAAA,EAAA;AAE1C,CAAC;AAED,MAAMgF,wBAAsBhF,IAAAA,IAAI,SAAA,EAA0B,SAAA;AAE1D,MAAMiF,4CAA0CjF,IAAAA,IAAI,OAA0C;AAAA,EAC5F,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAASgF;AAAAA,EACT,sBAAsBG,8BAA8B,SAAA;AAAA,EACpD,uBAAuBA,8BAA8B,SAAA;AAAA,EACrD,MAAMnF,IAAAA,IAAI,aAAaA,IAAAA,IAAI,UAAUA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,CAAC,EAAE,SAAA;AACxE,CAAC;AAED,MAAMmG,8CAA4CnG,IAAAA,IAAI,aAEpDgF,uBAAqBC,yCAAuC;AAE9D,MAAM,2CAA2CjF,IAAAA,IAAI;AAAA,EACnDA,IAAAA,IAAI,SAAA;AAAA,EACJA,IAAAA,IACG,OAAO;AAAA,IACN,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IACnB,MAAMA,IAAAA,IAAI,MAAA,EAAQ,SAAA;AAAA,EAAS,CAC5B,EACA,QAAQ,IAAI;AACjB;AAEA,MAAM,4CAA4CA,IAAAA,IAAI,OAA4C;AAAA,EAChG,KAAKA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAClB,QAAQ,2BAA2B,SAAA;AAAA,EACnC,eAAeA,IAAAA,IAAI;AAAA,IACjBA,IAAAA,IAAI,QAAA;AAAA,IACJA,IAAAA,IACG,SACA;AAAA,MACCA,IAAAA,IAAI,OAAA;AAAA,MACJA,IAAAA,IAAI;AAAA,QACFA,IAAAA,IAAI,QAAA;AAAA,QACJA,IAAAA,IACG,SACA;AAAA,UACCA,IAAAA,IAAI,OAAA,EAAS,MAAM,GAAGoG,6BAAAA,qBAAqB;AAAA,UAC3CpG,IAAAA,IAAI,aAAaA,QAAI,WAAWA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,QAAI,QAAQ,CAAC;AAAA,QAAA;AAAA,MACjE;AAAA,IACJ,EAED,SAAA;AAAA,EAAS;AAAA,EAEd,mBAAmBA,IAAAA,IAChB;AAAA,IACCA,IAAAA,IAAI,QAAA;AAAA,IACJA,IAAAA,IACG,SACA;AAAA,MACCA,IAAAA,IACG,SACA;AAAA,QACC;AAAA,MAAA;AAAA,MAEJA,IAAAA,IAAI,aAAaA,QAAI,WAAWA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,QAAI,QAAQ,CAAC;AAAA,IAAA;AAAA,EACjE,EAEH,SAAA;AACL,CAAC;AAED,MAAM,qCAAqCA,IAAAA,IACxC,MAAA,EACA;AAAA,EACCA,IAAAA,IAAI,aAAaA,QAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,CAAC;AAC5F;AACF,MAAM,8CAA8CA,IAAAA,IACjD,MAAA,EACA;AAAA,EACCA,IAAAA,IAAI,aAAaA,QAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,CAAC;AAC5F;AAEK,MAAM,wCAAwCA,IAAAA,IAAI,OAAwC;AAAA,EAC/F,OAAO,mCAAmC,SAAA;AAAA,EAC1C,QAAQ,4CAA4C,SAAA;AAAA,EACpD,MAAM,4CAA4C,SAAA;AAAA,EAClD,aAAa,4CAA4C,SAAA;AAAA,EACzD,QAAQ,4CAA4C,SAAA;AACtD,CAAC;AAEM,MAAM,0BAA0BA,IAAAA,IACpC,OAA0B;AAAA,EACzB,OAAOA,IAAAA,IACJ;AAAA,IACCA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,IACtBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,IACtBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,IACtBA,QAAI,WAAW,MAAM,CAAC;AAAA,EAAA,EAEvB,SAAA;AAAA,EACH,SAASA,IAAAA,IACN,aAAaA,IAAAA,IAAI,WAAW,MAAM,CAAC,GAAGA,QAAI,SAAA,EAAW,MAAM,CAAC,GAAGA,QAAI,SAAA,EAAW,MAAM,CAAC,CAAC,EACtF,SAAA;AAAA,EACH,UAAU,sCAAsC,SAAA;AAClD,CAAC,EACA,QAAQ,KAAK,EACb,GAAG,SAAS,WAAW,UAAU;AAEpC,MAAM,iCAAiCA,IAAAA,IAAI,OAAiC;AAAA,EAC1E,QAAQA,IAAAA,IAAI,OAAA,EAAS,QAAQ,KAAK,EAAE,SAAA;AAAA,EACpC,QAAQA,IAAAA,IAAI,OAAA,EAAS,SAAA,EAAW,MAAM,IAAI;AAAA,EAC1C,YAAYA,IAAAA,IACT;AAAA,IACC;AAAA,IACAA,QAAI,QAAQ,MAAM,wCAAwC;AAAA,EAAA,EAE3D,SAAA;AAAA,EACH,QAAQA,IAAAA,IACL,MAAA,EACA,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,GAAGqG,uDAA0B,CAAC,EACvD,SAAA;AAAA,EACH,YAAYrG,IAAAA,IACT,OAAA,EACA;AAAA,IACCA,IAAAA,IACG,SACA;AAAA,MACC;AAAA,IAAA,EAED,SAAS,GAAGkG,uBAAqB,EACjC,OAAO,iCAAiC;AAAA,IAE3CC;AAAAA,EAAA,EAED,SAAA;AAAA,EACH,MAAMG,iBAAiB,SAAA;AAAA,EACvB,cAAcC,kCAAmB,SAAA;AAAA,EACjC,QAAQvG,IAAAA,IACL,OAAO;AAAA,IACN,SAASA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAAS,CAChC,EACA,QAAQ,IAAI,EACZ,SAAA;AAAA,EACH,aAAaA,IAAAA,IAAI,UAAU,QAAQ,IAAI;AAAA,EACvC,uBAAuBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC,EAAE,SAAA;AAAA,EAC/C,sBAAsBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC,EAAE,SAAA;AAAA,EAC9C,aAAaA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC,EAAE,SAAA;AAAA,EACrC,SAASA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC,EAAE,SAAA;AAAA,EACjC,WAAWA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC,EAAE,SAAA;AAAA,EACnC,OAAOA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC,EAAE,SAAA;AAAA,EAC/B,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,OAAA,CAAQ,EAAE,QAAQ,CAAA,CAAE;AAAA,EACpE,UAAUA,IAAAA,IAAI,QAAQ,MAAM,yCAAyC;AAAA,EACrE,kBAAkBA,IAAAA,IACf,MAAA,EACA;AAAA,IACCA,IAAAA,IAAI;AAAA,MACFA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,MACtBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,MACtBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,MACtBA,QAAI,WAAW,MAAM,CAAC;AAAA,IAAA;AAAA,EACxB,EAED,SAAA,EACA,QAAQ,EAAE;AAAA,EACb,oBAAoBA,IAAAA,IACjB,MAAA,EACA;AAAA,IACCA,IAAAA,IAAI,aAAaA,QAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,CAAC;AAAA,EAAA,EAE3F,SAAA,EACA,QAAQ,EAAE;AAAA,EACb,UAAUA,IAAAA,IAAI,MAAA,EAAQ,MAAM,uBAAuB,EAAE,SAAA,EAAW,QAAQ,EAAE;AAAA,EAC1E,UAAU,sCAAsC,SAAA,EAAW,QAAQ,CAAA,CAAE;AACvE,CAAC;AAEM,MAAM,gCAAgC;AAAA,EAClC;AAAA,EAED,YAAY,SAAmC;AACrD,UAAM,WAAW,EAAE,GAAG,QAAA;AACtB,QAAI,QAAQ,gBAAgB,MAAM;AAChC,YAAM,yBAA4D;AAAA,QAChE,uBAAuB,QAAQ;AAAA,QAC/B,sBAAsB,QAAQ;AAAA,QAC9B,aAAa,QAAQ;AAAA,QACrB,SAAS,QAAQ;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,QACf,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,MAAA;AAEnB,UAAI,CAAC,MAAM,QAAQ,SAAS,UAAU,GAAG;AACvC,iBAAS,aAAa,CAAC,SAAS,UAAU,EAAE,OAAO,OAAO;AAAA,MAC5D;AACA,eAAS,WAAW,QAAQwG,6BAAAA,2BAA2B,OAAO,sBAAsB,CAAC;AAAA,IACvF;AACA,SAAK,WAAW,OAAO,OAAO7G,MAAAA,UAAU,CAAA,GAAI,QAAQ,CAAC;AACrD,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,cAAc;AAAA,MACxC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,cAAc;AAAA,MACxC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,QAAQ;AAAA,MAClC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,gBAAgB;AAAA,MAC1C,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,eAAe;AAAA,MACzC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,yBAAyB;AAAA,MACnD,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,wBAAwB;AAAA,MAClD,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,eAAe;AAAA,MACzC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,WAAW;AAAA,MACrC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,aAAa;AAAA,MACvC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,SAAS;AAAA,MACnC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,WAAW;AAAA,MACrC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,YAAY;AAAA,MACtC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,oBAAoB;AAAA,MAC9C,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,sBAAsB;AAAA,MAChD,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,YAAY;AAAA,MACtC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,YAAY;AAAA,MACtC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AAAA,EACH;AAAA,EAwBA,IAAI,KAAkB;AACpB,WAAO,IAAI,KAAK,KAAK,KAAK,UAAU,KAAK;AAAA,EAC3C;AAAA,EAEA,OAAc,KAAK,SAAmD;AAEpE,UAAM,EAAE,OAAO,mBAAA,IAAuBK,IAAAA,IAAI,OAAA,EAAS,QAAQ,IAAI,EAAE,WAAW,SAAS,SAAS;AAAA,MAC5F,YAAY;AAAA,IAAA,CACb;AACD,QAAI,oBAAoB;AACtB,YAAM,IAAIyG,SAAAA,qCAAqC,kBAAkB;AAAA,IACnE;AAEA,UAAM,gBAAgB9G,MAAAA;AAAAA,MACpB;AAAA,MACA;AAAA,IAAA;AAGF,UAAM,EAAE,OAAO,wCAAA,IACb,+BAA+B,SAAS,eAAe;AAAA,MACrD,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAc;AAAA,IAAA,CACf;AACH,QAAI,yCAAyC;AAC3C,YAAM,IAAI8G,SAAAA,qCAAqC,uCAAuC;AAAA,IACxF;AACA,UAAM,WAAW,IAAI,gCAAgC,aAAa;AAClE,WAAO;AAAA,EACT;AACF;AC/aA,SAAS,KAAK,OAAO,UAAU;AAC7B,WAAS,OAAO;AACd,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AACA,SAAK,SAAS;AACd,WAAO,SAAS,KAAK;AAAA,EACvB;AACA,OAAK,SAAS;AACd,SAAO;AACT;AACA,MAAM,wBAAwB,MAAM,QAAQ,QAAO;AACnD,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA,EAIX;AAAA;AAAA;AAAA;AAAA,EAIA,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIhB;AAAA;AAAA;AAAA;AAAA,EAIA,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIhB;AAAA,EACA,YAAY,YAAY;AACtB,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,MAAM;AACZ,UAAM,aAAa,KAAK,YAAY,KAAK,eAAe;AACxD,QAAI,CAAC,YAAY;AACf,aAAO,KAAK,cAAa;AAAA,IAC3B;AACA,WAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,OAAO,CAAC;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,2BAA2B,MAAM;AAC/B,UAAM,aAAa,KAAK,YAAY,KAAK,eAAe;AACxD,QAAI,CAAC,YAAY;AACf,aAAO,KAAK,cAAa,EAAG,MAAM,KAAK,aAAa;AAAA,IACtD;AACA,WAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,0BAA0B,CAAC,EAAE,MAAM,KAAK,aAAa;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,aAAa,cAAc;AACzB,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,aAAa,cAAc;AACzB,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,MAAM,IAAI,IAAI;AACZ,SAAK,YAAY;AACjB,QAAI,KAAK,eAAe;AACtB,aAAO,KAAK,2BAA2B,IAAI;AAAA,IAC7C;AACA,WAAO,KAAK,QAAQ,IAAI;AAAA,EAC1B;AACF;AACA,MAAM,WAAW;AAAA,EACf,cAA8B,oBAAI,IAAG;AAAA,EACrC;AAAA,EACA,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,MAAM;AACJ,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,SAAS;AACX,WAAO,KAAK,YAAY,IAAI,OAAO;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,SAAS;AACX,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AACA,SAAK,YAAY,IAAI,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,SAAS;AACd,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,WAAO,KAAK,YAAY,OAAO,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ;AACN,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AACA,SAAK,YAAY,MAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO;AACX,QAAI,KAAK,WAAW;AAClB,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AACA,UAAM,IAAG,EAAG,QAAQ,CAAC,YAAY;AAC/B,WAAK,IAAI,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS;AACP,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AACA,SAAK,YAAY;AACjB,SAAK,mBAAmB,CAAC,GAAG,KAAK,IAAG,CAAE;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS;AACP,SAAK,OAAM;AACX,WAAO,IAAI,OAAO,KAAK,gBAAgB;AAAA,EACzC;AACF;ACjPA,MAAMrB,YAAU,CAAC,MAAc,UAAe;AAC5C,MAAI,iBAAiB,MAAM;AACzB,WAAOC,eAAS,WAAW,KAAK,EAAE,MAAA;AAAA,EACpC;AACA,MAAI,iBAAiBA,MAAAA,UAAU;AAC7B,WAAO,MAAM,MAAA;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,SAAA;AAAA,EACf;AACA,SAAO;AACT;AAEA,MAAM,gBAAgB,CAAC,SAAmB;AACxC,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC;AAAA,EAC/C;AACA,MAAI,gBAAgB,MAAM;AACxB,WAAOA,eAAS,WAAW,IAAI,EAAE,MAAA;AAAA,EACnC;AACA,MAAI,gBAAgBA,MAAAA,UAAU;AAC5B,WAAO,KAAK,MAAA;AAAA,EACd;AACA,MAAI5F,oBAAAA,WAAS,IAAI,GAAG;AAClB,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,cAAc,KAAK,CAAC,CAAC;AAAA,IAAA;AAAA,EAE1E;AACA,SAAO;AACT;AAoBO,MAAM,gCAAgC;AAAA,EAClC;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,SACA,QACA,aACA;AACA,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAM,4BAA4B,KAAkB;AAClD,UAAM,EAAE,SAAS,QAAQ,MAAM,OAAO,6BAA6B;AACnE,UAAM,UAAUgG,6BAAAA,iBAAiB,GAAG;AACpC,UAAM,SAAS,IAAI,QAAQ,OAAA,KAAY;AACvC,UAAM,MAAM,IAAI,QAAQ,IAAA,KAAS;AACjC,UAAM,UAAU,CAAC,QAAgB,MAAW,UAAqC,CAAA,MAAO;AACtF,UAAI,SAAS,OAAO,MAAM;AAE1B,aAAO,QAAQ,KAAK,SAAS,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC9D,YAAI,SAAS,OAAO,KAAK,KAAK;AAAA,MAChC,CAAC;AAED,aAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,YAAI,SAAS,OAAO,KAAK,KAAK;AAAA,MAChC,CAAC;AAED,UAAI,IAAI,QAAQ,OAAO,gCAAgC,MAAM,KAAK;AAChE,YAAI,SAAS;AAAA,UACX;AAAA,UACA,sEAAsE,OAAO;AAAA,QAAA;AAE/E,cAAM,YAAY,cAAc,IAAI;AACpC,YAAI,SAAS,KAAK7F,SAAAA,OAAO,SAAS,CAAC;AACnC;AAAA,MACF;AAEA,cAAQ,SAAA;AAAA,QACN,KAAK;AACH,cAAI,SAAS,OAAO,gBAAgB,oBAAoB;AACxD;AAAA,QACF;AACE,cAAI,SAAS,OAAO,gBAAgB,kBAAkB;AACtD;AAAA,MAAA;AAEJ,UAAI,gBAAgB,OAAO,QAAQ,QAAQ,QAAQ;AACjD,gBAAQ,SAAA;AAAA,UACN,KAAK;AACH,gBAAI,SAAS,KAAKgG,6BAAAA,KAAK,UAAU,MAAMR,SAAO,CAAC;AAC/C;AAAA,UACF;AACE,gBAAI,SAAS,KAAK,KAAK,UAAU,MAAMA,SAAO,CAAC;AAC/C;AAAA,QAAA;AAAA,MAEN;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,cAAc,WAA0D;AAC5E,UAAM,uBAAuB,MAAM;AAAA,MACjC,OAAO,oBAAoB,KAAK,OAAO;AAAA,MACvC,OAAO,SAAS;AACd,cAAM,eAAe,MAAM,KAAK,QAAQ,IAAI;AAC5C,YAAI,CAAC1F,gBAAAA,mBAAmB,YAAY,GAAG;AACrC,iBAAO,CAAC,MAAM,MAAS;AAAA,QACzB;AACA,eAAO,CAAC,aAAa,MAAM,YAAY;AAAA,MACzC;AAAA,MACA,EAAE,aAAa,EAAA;AAAA,IAAE;AAEnB,UAAM,iBAAiB,OAAO,YAAY,oBAAoB;AAC9D,WAAO,eAAe,SAAS;AAAA,EACjC;AAAA,EAEA,kCACE,WACA,QACA,KAC0D;AAC1D,UAAM,WAAW,IAAI,QAAQ,MAAM,SAAS;AAC5C,QAAI,gBAAgB,OAAO,YAAY,SAAS,UAAU;AACxD,aAAO;AAAA,IACT;AACA,UAAM,EAAE,OAAO,MAAA,IAAU,OAAO,SAAS,UAAU,EAAE,YAAY,MAAM,SAAS,KAAA,CAAM;AACtF,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAsB,OAAgB,QAAqB,UAAgB;AACzE,UAAM,EAAE,OAAO,OAAO,UAAA,IAAc,OAAO,SAAS,OAAO,EAAE,YAAY,MAAM,SAAS,MAAM;AAC9F,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,KAAkB;AACpC,UAAM,EAAE,SAAS,IAAA,IAAQ,MAAM,KAAK,4BAA4B,GAAG;AAMnE,UAAM,gBAAgB,MAAM,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,EAAE,CAAC,IAAI,IAAI,OAAO,GAAG;AAC1F,QAAI,aAAa,OAAO,eAAe;AACrC,aAAO,QAAQ,KAAK,EAAE;AAAA,IACxB;AACA,UAAM,UAAU,mBAAmB,aAAa;AAChD,QAAI,UAAe,CAAA;AACnB,QAAI;AACF,gBAAUmG,SAAAA,OAAO,OAAO;AAAA,IAC1B,QAAQ;AACN,aAAO,QAAQ,KAAK,EAAE;AAAA,IACxB;AACA,UAAM,EAAE,kBAAkB,aAAA,IAAiB;AAS3C,UAAM,QAAQ,MAAM,KAAK,cAAc,gBAAgB;AACvD,QAAI,CAAC,OAAO;AACV,aAAO,QAAQ,KAAK,EAAE;AAAA,IACxB;AAMA,UAAM,0BAA0B,MAAM,0BAA0B,IAAI,YAAY;AAChF,QAAI,CAAC,yBAAyB;AAC5B,aAAO,QAAQ,KAAK,EAAE;AAAA,IACxB;AACA,UAAM,eAAe,wBAAwB,aAAA;AAC7C,QAAI,CAACnG,gBAAAA,mBAAmB,YAAY,GAAG;AACrC,aAAO,QAAQ,KAAK,EAAE;AAAA,IACxB;AAOA,UAAM,uBAAuB,MAAM;AAAA,MACjC,wBAAwB;AAAA,MACxB,OAAO/B,YAAWA,QAAO,KAAK,GAAG;AAAA,MACjC,EAAE,aAAa,EAAA;AAAA,IAAE;AAEnB,QAAI,qBAAqB,SAAS,KAAK,GAAG;AACxC,aAAO,QAAQ,KAAK,EAAE;AAAA,IACxB;AAMA,UAAM,aAAa,IAAI,WAAA;AAMvB,UAAM,cAAc,aAAa;AACjC,UAAM,gBAAgB,0BAA0B,YAAY;AASzC,SAAK;AAAA,MACtB;AAAA,MACA+I,QAAU,aAAaA,IAAAA,IAAU,OAAA,GAAUA,IAAAA,IAAU,OAAA,GAAUA,QAAU,QAAQ;AAAA,MACjF;AAAA,IAAA;AAGa,SAAK,kCAAkC,UAAUA,IAAAA,IAAU,OAAA,EAAS,KAAA,GAAQ,GAAG;AAE9E,SAAK;AAAA,MACnB;AAAA,MACAA,IAAAA,IACG,MAAA,EACA,MAAMA,IAAAA,IAAU,aAAaA,IAAAA,IAAU,OAAA,GAAUA,IAAAA,IAAU,OAAA,GAAUA,IAAAA,IAAU,OAAA,CAAQ,CAAC;AAAA,MAC3F;AAAA,IAAA;AAGF,UAAM,mBAAmB,aAAa,SAAS,uBAAuB,YAAY;AAClF,UAAM,aAAa,aAAa;AAChC,UAAM,QAAsC,iBAAiB,MAAA,EAAQ,KAAK,UAAU;AACpF,QAAI,MAAM,QAAQ,KAAK,SAAS,gBAAgB,GAAG;AACjD,WAAK,SAAS,iBAAiB,QAAQ,CAAC,eAAe;AACrD,mBAAW,IAAI,OAAO,GAAG,SAAS;AAChC,gBAAM,WAAW,KAAK,KAAK,OAAO,YAAY;AAC9C,gBAAM,KAAA;AAAA,QACR,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,QAAI,MAAM,QAAQ,aAAa,gCAAgC,IAAI,GAAG;AACpE,mBAAa,gCAAgC,KAAK,QAAQ,CAAC,kBAAkB;AAC3E,mBAAW,IAAI,OAAO,GAAG,SAAS;AAChC,gBAAM,cAAc,KAAK,KAAK,OAAO,YAAY;AACjD,gBAAM,KAAA;AAAA,QACR,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,QAAI,MAAM,UAAU,aAAa,OAAO;AAStC,YAAM,yBAAyB,KAAK;AAAA,QAClC;AAAA,QACAA,QAAU,aAAaA,IAAAA,IAAU,OAAA,GAAUA,IAAAA,IAAU,OAAA,GAAUA,QAAU,QAAQ;AAAA,QACjF;AAAA,MAAA;AAEF,UAAI,CAAC,wBAAwB;AAC3B,cAAM,IAAIC,SAAAA,8BAAA;AAAA,MACZ;AACA,iBAAW,IAAI,OAAO,GAAG,SAAS;AAGhC,cAAM,SAAS,GAAG,UAAU,IAAI,WAAW,IAAI,uBAAuB,UAAU;AAChF,cAAM,KAAA;AAAA,MACR,CAAC;AAAA,IACH;AACA,UAAM,WAAW,OAAA,EAAS,IAAI,OAAO,IAAI,SAAS,GAAG,EAAE,KAAK,KAAK,MAAA,GAAS,IAAI,CAAC;AAC/E,UAAM,aAAa,MAAM,MAAA,EAAQ,MAAM,GAAG,WAAW,WAAW;AAoBhE,UAAM,eAAe,MAClB,MAAA,EACA,OAAO,GAAG,WAAW,aAAa,GAAG,aAAa,WAAW;AAChE,UAAM,CAAC,cAAc,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,WAAW,SAAS,YAAY,CAAC;AACpF,UAAM,QAAQ,KAAK,mBAA2B,cAAc,OAAOD,QAAU,SAAS,IAAI,CAAC,GAAG,CAAC;AAC/F,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,aAAoB,MAClB,KACA,SACA,QACA,aACA;AACA,UAAM,WAAW,IAAI,gCAAgC,SAAS,QAAQ,WAAW;AACjF,WAAO,MAAM,SAAS,cAAc,GAAG;AAAA,EACzC;AACF;AC7VA,MAAM,uBAAuB1G,IAAAA,IAAI,OAAA,EAAyB;AAAA,EACxDA,IAAAA,IAAI,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;AAAA,EACpBA,IAAAA,IACG,OAA4C;AAAA,IAC3C,OAAOA,IAAAA,IAAI;AAAA,MACTA,QAAI,SAAA,EAAW,MAAA;AAAA,MACfA,QACG,SACA,SAAS,OAAO,EAChB,OAAO,CAAC,OAAO,YAAY;AAC1B,YACE,OAAO,MAAM,SAAS,cACtB,MAAM,KAAK,WAAW,KACtB,OAAO,MAAM,UAAU,cACvB,MAAM,MAAM,WAAW,GACvB;AACA,iBAAO,QAAQ,MAAM,aAAa;AAAA,QACpC;AACA,eAAO;AAAA,MACT,GAAG,oBAAoB;AAAA,MACzBA,QACG,WACA,MAAM,CAAC,EACP,OAAO,CAAC,OAAO,YAAY;AAC1B,YAAI;AACF,gBAAM,SAAS,MAAA;AACf,cACE,OAAO,WAAW,YAClB,WAAW,QACX,OAAQ,OAA4B,SAAS,cAC5C,OAA4B,KAAK,SAAS,KAC3C,OAAQ,OAA4B,UAAU,cAC7C,OAA4B,MAAM,SAAS,GAC5C;AACA,mBAAO;AAAA,UACT,WAAW,OAAO,WAAW,YAAY;AACvC,mBAAO,QAAQ,MAAM,aAAa;AAAA,UACpC,WAAW,OAAO,WAAW,YAAY,WAAW,QAAQ,aAAa,QAAQ;AAC/E,mBAAO,OAAO;AAAA,UAChB,OAAO;AACL,mBAAO;AAAA,UACT;AAAA,QACF,QAAQ;AACN,iBAAO,QAAQ,MAAM,aAAa;AAAA,QACpC;AAAA,MACF,GAAG,wBAAwB;AAAA,IAAA;AAAA,IAE/B,uBAAuBA,IAAAA,IACpB;AAAA,MACC,OAAO,YAAY,CAAC,GAAGoG,6BAAAA,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAMpG,IAAAA,IAAI,IAAA,EAAM,SAAA,CAAU,CAAC,CAAC;AAAA,IAAA,EAE1F,SAAA;AAAA,EAAS,CACb,EACA,QAAQ,IAAI;AACjB;AAEO,MAAM,sCAAsC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EAID,YAAY,KAAqB;AACvC,SAAK,6BAAa,IAAA;AAClB,SAAK,8BAAc,IAAA;AACnB,SAAK,oDAAoC,IAAA;AAIzC,WAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,aAAa,sBAAA,CAAuB,MAAM;AACrF,WAAK,OAAO,IAAI,MAAM,KAAK,kBAAkB,MAAM,WAAW,CAAC;AAC/D,WAAK,8BAA8B,IAAI,MAAM,qBAAqB;AAClE,aAAO,eAAe,MAAM,MAAM;AAAA,QAChC,KAAK,MAAM,KAAK,QAAQ,IAAI,IAAI,KAAK,KAAK,OAAO,IAAI,IAAI;AAAA,QACzD,YAAY;AAAA,QACZ,cAAc;AAAA,MAAA,CACf;AAAA,IACH,CAAC;AAAA,EACH;AAAA;AAAA,EAGO,iCACL,WAC6D;AAC7D,WAAO,KAAK,8BAA8B,IAAI,SAAS;AAAA,EACzD;AAAA,EAEA,MAAM,kBACJ,MACA,aACkD;AAClD,QAAIN,gBAAAA,mBAAmB,WAAW,GAAG;AACnC,aAAO;AAAA,IACT;AACA,QAAI;AACJ,QAAI;AACF,UAAI,OAAO,gBAAgB,YAAY;AACrC,mBAAW,MAAM,QAAQ,QAAQ,YAAA,CAAa;AAAA,MAChD,OAAO;AACL,mBAAW,MAAM,QAAQ,QAAQ,WAAW;AAAA,MAC9C;AAAA,IACF,SAAS,KAAK;AACZ,YAAMkH,KAAI,IAAIlB,8BAAqB,MAAM,GAAG;AAC5C,WAAK,QAAQ,IAAI,MAAMkB,EAAC;AACxB,aAAOA;AAAAA,IACT;AACA,QAAIlH,gBAAAA,mBAAmB,QAAQ,GAAG;AAChC,aAAO;AAAA,IACT;AACA,QAAID,oBAAAA,WAAS,QAAQ,KAAK,aAAa,YAAYC,mCAAmB,SAAS,OAAO,GAAG;AACvF,aAAO,SAAS;AAAA,IAClB;AACA,UAAM,IAAI,IAAIgG,SAAAA,qBAAqB,IAAI;AACvC,SAAK,QAAQ,IAAI,MAAM,CAAC;AACxB,WAAO;AAAA,EACT;AAAA,EAIA,OAAc,KAAK,KAAqD;AACtE,UAAM,EAAE,OAAO,MAAA,IAAU,qBAAqB,SAAS,KAAK;AAAA,MAC1D,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAc;AAAA,IAAA,CACf;AACD,QAAI,OAAO;AACT,YAAM,IAAImB,SAAAA,iCAAiC,KAAK;AAAA,IAClD;AACA,WAAO,IAAI,sCAAsC,KAAK;AAAA,EACxD;AACF;AChHA,IAAK,wCAAAC,yBAAL;AACEA,uBAAAA,qBAAA,SAAQ,CAAA,IAAR;AACAA,uBAAAA,qBAAA,UAAS,CAAA,IAAT;AACAA,uBAAAA,qBAAA,SAAQ,CAAA,IAAR;AACAA,uBAAAA,qBAAA,WAAU,CAAA,IAAV;AACAA,uBAAAA,qBAAA,YAAW,CAAA,IAAX;AACAA,uBAAAA,qBAAA,UAAS,CAAA,IAAT;AACAA,uBAAAA,qBAAA,aAAY,CAAA,IAAZ;AAPG,SAAAA;AAAA,GAAA,uBAAA,CAAA,CAAA;AAUL,MAAM1B,YAAU,CAAC,MAAc,UAAe;AAC5C,MAAI,iBAAiB,MAAM;AACzB,WAAOC,eAAS,WAAW,KAAK,EAAE,MAAA;AAAA,EACpC;AACA,MAAI,iBAAiBA,MAAAA,UAAU;AAC7B,WAAO,MAAM,MAAA;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,SAAA;AAAA,EACf;AACA,SAAO;AACT;AAEO,MAAM,wCAAwC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,MACA,UACA,aACA,KACA;AACA,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,OAAO;AACZ,SAAK,8BAAc,IAAA;AACnB,SAAK,wCAAwB,IAAA;AAC7B,SAAK,yCAAyB,IAAA;AAAA,EAChC;AAAA,EAEA,MAAM,KAAK,KAAkB;AAC3B,UAAM,QAAQ,OAAO,oBAAoB,KAAK,SAAS;AACvD,UAAM;AAAA,MACJ;AAAA,MACA,OAAO,SAAS;AACd,cAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;AACpC,YAAI,QAAQ;AACV,gBAAM,CAAC,UAAU,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,YAC9C,OAAO,uBAAuB,KAAK,KAAK,MAAM,MAAM;AAAA,YACpD,OAAO,uBAAuB,KAAK,KAAK,MAAM,OAAO;AAAA,UAAA,CACtD;AACD,eAAK,kBAAkB,IAAI,QAAQ,QAAQ;AAC3C,eAAK,mBAAmB,IAAI,QAAQ,SAAS;AAC7C;AAAA,QACF;AACA,cAAM,iBAAiB,KAAK,UAAU,IAAI;AAC1C,YAAI,0BAA0BK,SAAAA,qBAAsB;AACpD,cAAM,WAAW,MAAM;AACvB,YAAIhG,gBAAAA,mBAAmB,QAAQ,GAAG;AAChC,eAAK,QAAQ,IAAI,MAAM,QAAQ;AAC/B,gBAAM,CAAC,UAAU,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,YAC9C,SAAS,uBAAuB,KAAK,KAAK,MAAM,MAAM;AAAA,YACtD,SAAS,uBAAuB,KAAK,KAAK,MAAM,OAAO;AAAA,UAAA,CACxD;AACD,eAAK,kBAAkB,IAAI,UAAU,QAAQ;AAC7C,eAAK,mBAAmB,IAAI,UAAU,SAAS;AAAA,QACjD;AAAA,MACF;AAAA,MACA;AAAA,QACE,aAAa;AAAA,MAAA;AAAA,IACf;AAAA,EAEJ;AAAA,EAEA,YAAY,SAA0B;AACpC,UAAM,WAAW,QAAQ,SAAA;AACzB,UAAM,OAAO,QAAQ,KAAA;AACrB,UAAM,MAAM,QAAQ,IAAA;AACpB,UAAM,iBAAiB,IAAI,QAAQ,6CAA6C,EAAE;AAClF,WAAO,GAAG,QAAQ,MAAM,IAAI,GAAG,cAAc;AAAA,EAC/C;AAAA,EAEA,iBAAiB,KAAkB,MAAsB;AACvD,UAAM,UAAU,KAAK,YAAY,IAAI,OAAO;AAC5C,WAAO,KAAK,WAAW,GAAG,GAAG;AAC3B,aAAO,KAAK,MAAM,CAAC;AAAA,IACrB;AACA,WAAO,CAAC,SAAS,IAAI,EAClB,OAAO,CAAC,MAAM,aAAa,OAAO,KAAK,EAAE,KAAA,EAAO,SAAS,CAAC,EAC1D,IAAI,CAAC,MAAM,EAAE,KAAA,CAAM,EACnB,KAAK,GAAG;AAAA,EACb;AAAA,EAEA,sBAAsB,KAAkB;AACtC,WAAO,GAAG,UAAU,KAAK,EAAE,aAAa,YAAY,QAAQ,OAAO;AAAA,EACrE;AAAA,EAEA,mBAAmB,KAAkB;AACnC,UAAM,cAAc,KAAK,sBAAsB,GAAG;AAClD,WAAO,YAAY,QAAQ,QAAQ,EAAE;AAAA,EACvC;AAAA,EAEA,sCACE,gBACA,oBACA,gBACQ;AACR,QAAI,MAAM;AACV,QAAI,eAAe,SAAS,GAAG;AAC7B,aAAO;AAAA;AAAA,GAAQ,kBAAkB;AAAA;AAAA,KAAW,eAAe,KAAK,OAAO,CAAC;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AAAA,EAEA,6BACE,QAGA,OAGA,YAG2C;AAC3C,UAAM,MAAiD,CAAA;AACvD,UAAM,UAAU,CAAC,QAAQ,OAAO,UAAU,EAAE,OAAOD,8BAAQ;AAC3D,UAAM,MAAME,gBAAU,GAAG,OAAO;AAChC,WAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,QAAQ;AAChC,UAAI,GAAG,IAAI,CAAA;AAAA,IACb,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAmD;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAA6C;AACjD,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEA,MAAM,SAAS,KAA0D;AACvE,WAAO;AAAA,MACL;AAAA,QACE,KAAK,KAAK,YAAY,IAAI,OAAO;AAAA,MAAA;AAAA,IACnC;AAAA,EAEJ;AAAA,EAEA,6BACE,YACA,YACA,UACA,cACA,SAAoC,QACpC;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,YAAY;AAAA,YACV,aAAa;AAAA,YACb,YAAY,OAAO;AAAA,cACjB,CAAA;AAAA,cACA,GAAG,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC,MAAM;AACpC,sBAAM,UAAU,UAAU,WAAW,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,MAAM,SAAA;AAClE,uBAAO;AAAA,kBACL,CAAC,CAAC,GAAG;AAAA,oBACH,MAAM;AAAA,oBACN,YAAY;AAAA,sBACV,MAAM;AAAA,wBACJ,MAAM;AAAA,wBACN,aAAa;AAAA,wBACb,MAAM,CAAC,WAAW,UAAU,UAAU,SAAS;AAAA,sBAAA;AAAA,oBACjD;AAAA,oBAEF,sBAAsB;AAAA,oBACtB,UAAU,CAAC,MAAM;AAAA,oBACjB,SAAS,WAAW,SAAS,UAAUiG,6BAAAA,KAAK,UAAU,OAAO;AAAA,kBAAA;AAAA,gBAC/D;AAAA,cAEJ,CAAC;AAAA,YAAA;AAAA,UACH;AAAA,UAEF,YAAY;AAAA,YACV,aAAa;AAAA,YACb,MAAM;AAAA,YACN,YAAY,OAAO;AAAA,cACjB,CAAA;AAAA,cACA,GAAG,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC,OAAO;AAAA,gBACrC,CAAC,CAAC,GAAG;AAAA,kBACH,MAAM;AAAA,kBACN,YAAY;AAAA,oBACV,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,aAAa;AAAA,sBACb,MAAM,CAAC,WAAW,UAAU,UAAU,SAAS;AAAA,oBAAA;AAAA,kBACjD;AAAA,kBAEF,sBAAsB;AAAA,kBACtB,UAAU,CAAC,MAAM;AAAA,kBACjB,SAAS,WAAW,SAAS,WAAW,CAAC,IAAIA,kCAAK,UAAU,WAAW,CAAC,CAAC;AAAA,gBAAA;AAAA,cAC3E,EACA;AAAA,YAAA;AAAA,UACJ;AAAA,UAEF,UAAU;AAAA,YACR,aAAa;AAAA,YACb,MAAM;AAAA,YACN,OAAO;AAAA,cACL,MAAM;AAAA,YAAA;AAAA,YAER,aAAa;AAAA,YACb,SAAS,WAAW,SAAS,WAAWA,6BAAAA,KAAK,UAAU,QAAQ;AAAA,UAAA;AAAA,UAEjE,cAAc;AAAA,YACZ,aACE;AAAA,YACF,MAAM;AAAA,YACN,OAAO;AAAA,cACL,MAAM;AAAA,YAAA;AAAA,YAER,aAAa;AAAA,YACb,SAAS,WAAW,SAAS,eAAeA,6BAAAA,KAAK,UAAU,YAAY;AAAA,UAAA;AAAA,QACzE;AAAA,QAEF,UAAU,CAAC,cAAc,cAAc,YAAY,cAAc;AAAA,MAAA;AAAA,MAEnE,SACE,WAAW,SACPA,6BAAAA,KAAK,UAAU;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD,IACD;AAAA,QACE,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EAEV;AAAA,EAEA,sCACE,YACA,QACA,SACA,SAAoC,QACpC;AACA,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,QAAQ;AAAA,YACN,aAAa;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,cACN;AAAA,YAAA;AAAA,YAEF,SACE,WAAW,SACPA,6BAAAA,KAAK,UAAU,YAAYR,SAAO,IAClC,KAAK,UAAU,YAAYA,WAAS,CAAC;AAAA,UAAA;AAAA,UAE7C,WAAW;AAAA,YACT,aAAa;AAAA,YACb,MAAM;AAAA,YACN,SAAS;AAAA,UAAA;AAAA,UAEX,sBAAsB;AAAA,YACpB,aAAa;AAAA,YACb,MAAM;AAAA,YACN,QAAQ;AAAA,cACN,sBAAsB;AAAA,YAAA;AAAA,YAExB,SACE,WAAW,SACPQ,6BAAAA,KAAK,UAAU,OAAO,SAAA,GAAYR,SAAO,IACzC,KAAK,UAAU,OAAO,SAAA,GAAYA,WAAS,CAAC;AAAA,UAAA;AAAA,QACpD;AAAA,MACF;AAAA,MAEF,SACE,WAAW,SACPQ,6BAAAA,KAAK;AAAA,QACH;AAAA,UACE,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,sBAAsB,OAAO,SAAA;AAAA,QAAS;AAAA,QAExCR;AAAAA,MAAA,IAEF;AAAA,QACE,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,sBAAsB,OAAO,SAAA;AAAA,MAAS;AAAA,IACxC;AAAA,EAEV;AAAA,EAEA,8BACE,QACA,MACA,wBAC2B;AAC3B,UAAM,cAAc,OAAO,UAAU,GAAG,MAAM,IAAI,KAAK,QAAQ,OAAO,GAAG,CAAC,EAAE;AAC5E,QAAI,oCAAoC,sBAAsB,GAAG;AAC/D,YAAM,YAAuC;AAAA,QAC3C,MAAM,MAAM,QAAQ,uBAAuB,IAAI,IAC3C,uBAAuB,OACvB,aAAa,OAAO,uBAAuB,OACzC,CAAC,uBAAuB,IAAI,IAC5B,CAAA;AAAA,QACN,SAAS,uBAAuB;AAAA,QAChC,aAAa,uBAAuB;AAAA,QACpC;AAAA,QACA,YAAY,uBAAuB;AAAA,QACnC,aAAa,uBAAuB,uBAChC;AAAA,UACE,SAAS;AAAA,YACP,oBAAoB;AAAA,cAClB,QAAQ,uBAAuB;AAAA,YAAA;AAAA,YAEjC,qCAAqC;AAAA,cACnC,QAAQ,uBAAuB;AAAA,YAAA;AAAA,YAEjC,uBAAuB;AAAA,cACrB,QAAQ,uBAAuB;AAAA,YAAA;AAAA,YAEjC,sBAAsB;AAAA,cACpB,QAAQ,uBAAuB;AAAA,YAAA;AAAA,UACjC;AAAA,QACF,IAEF;AAAA,QACJ,WAAW,uBAAuB,wBAC9B;AAAA,UACE,OAAO;AAAA,YACL,aAAa;AAAA,YACb,SAAS,KAAK,6BAA6B,KAAK,MAAM,OAAO;AAAA,YAC7D,SAAS;AAAA,cACP,oBAAoB;AAAA,gBAClB,QAAQ,uBAAuB;AAAA,cAAA;AAAA,cAEjC,sBAAsB;AAAA,gBACpB,QAAQ,uBAAuB;AAAA,cAAA;AAAA,YACjC;AAAA,UACF;AAAA,QACF,IAEF,CAAA;AAAA,MAAC;AAEP,aAAO;AAAA,IACT,OAAO;AACL,YAAM,YAAuC;AAAA,QAC3C,MAAM,CAAC,KAAK,MAAM,OAAO,UAAU;AAAA,QACnC,SAAS,UAAU,OAAO,YAAA,CAAa;AAAA,QACvC;AAAA,QACA,WAAW,CAAA;AAAA,MAAC;AAEd,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,KAAwD;AACnE,UAAM,MAA6B;AAAA,MACjC,KAAK;AAAA,QACH,KAAK;AAAA,UACH,SAAS,GAAG,KAAK,MAAM,KAAK,KAAK;AAAA,UACjC,aAAa;AAAA,UACb,MAAM,CAAC,KAAK,MAAM,OAAO,OAAO;AAAA,UAChC,WAAW;AAAA,YACT,OAAO;AAAA,cACL,aAAa;AAAA,cACb,SAAS,KAAK,6BAA6B,KAAK,MAAM,SAAS,QAAW;AAAA,gBACxE,iBAAiB,KAAK,MAAM,KAAK;AAAA,gBACjC,kBAAkB,KAAK,YAAY,IAAI,OAAO;AAAA,cAAA,CAC/C;AAAA,cACD,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,oBACN,MAAM;AAAA,oBACN,sBAAsB;AAAA,kBAAA;AAAA,gBACxB;AAAA,gBAEF,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,oBACN,MAAM;AAAA,oBACN,sBAAsB;AAAA,kBAAA;AAAA,gBACxB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEF,UAAM,oBAAoB,MAAM,KAAK,KAAK,QAAQ,SAAS;AAC3D,UAAM;AAAA,MACJ;AAAA,MACA,OAAO,CAAC,QAAQ,KAAK,MAAM;AACzB,YAAI,CAAC1F,gBAAAA,mBAAmB,KAAK,EAAG;AAChC,cAAM,kBAAkB,KAAK,aAAa,IAAI,MAAM;AACpD,YAAI,CAAC,gBAAiB;AACtB,cAAM,gBAAgB,MAAM,MAAM,4BAA4B,KAAK,KAAK,IAAI;AAC5E,cAAM,OAAO,IAAI,MAAM;AACvB,cAAM,uBAAuB,MAAM;AACnC,cAAM,WAAW,KAAK,kBAAkB,IAAI,KAAK;AACjD,cAAM,WAAW,KAAK,mBAAmB,IAAI,KAAK;AAClD,YAAI,CAAC,YAAY,CAAC,SAAU;AAC5B,cAAM,YAAY,EAAE,GAAG,SAAA;AACvB,kBAAU,aAAaG,wCAA+B;AAAA,UACpD,GAAG,UAAU;AAAA,UACb,IAAI;AAAA,QAAA,CACL;AACD,kBAAU,WAAW,UAAU,WAC3B,UAAU,SAAS,OAAO,CAAC,MAAM,MAAM,QAAQ,KAAK,UAAU,UAAW,IACzE,CAAA;AACJ,cAAM,iBACJ,MAAMkH,6BAA2B;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QAAA;AAET,cAAM,oBAAoB/G,IAAAA,IAAI;AAAA,UAC5B,OAAO;AAAA,YACL,CAAA;AAAA,YACA,GAAG,OAAO,KAAK,UAAU,UAAW,EAAE,IAAI,CAAC,yBAAyB;AAClE,oBAAM,aAAa,EAAE,CAAC,oBAAoB,GAAGA,IAAAA,IAAI,MAAI;AACrD,oBAAM,OAAO,cAAc,WAAW,oBAAoB;AAC1D,kBAAI,MAAM;AACR,sBAAM,YAAY,KAAK;AACvB,oBAAI,WAAW;AACb,6BAAW,oBAAoB,IAAI;AAAA,gBACrC;AAAA,cACF;AACA,kBAAI;AACF,sBAAM,YAAY,eAAe,QAAQ,oBAAoB;AAC7D,oBAAI,WAAW;AACb,6BAAW,oBAAoB,IAC7B,WAAW,oBAAoB,EAAE,OAAO,SAAS;AAAA,gBACrD;AAAA,cACF,QAAQ;AAAA,cAER;AACA,qBAAO;AAAA,YACT,CAAC;AAAA,UAAA;AAAA,QACH;AAEF,cAAM,oBAAoBA,IAAAA,IAAI;AAAA,UAC5B,OAAO;AAAA,YACL,CAAA;AAAA,YACA,GAAG,OAAO,KAAK,SAAS,UAAW,EAAE,IAAI,CAAC,wBAAwB;AAChE,oBAAM,aAAa,EAAE,CAAC,mBAAmB,GAAGA,IAAAA,IAAI,MAAI;AACpD,oBAAM,OAAO,cAAc,WAAW,mBAAmB;AACzD,kBAAI,MAAM;AACR,sBAAM,YAAY,KAAK;AACvB,oBAAI,WAAW;AACb,6BAAW,mBAAmB,IAAI;AAAA,gBACpC;AAAA,cACF;AACA,kBAAI;AACF,sBAAM,YAAY,eAAe,QAAQ,mBAAmB;AAC5D,oBAAI,WAAW;AACb,6BAAW,mBAAmB,IAC5B,WAAW,mBAAmB,EAAE,OAAO,SAAS;AAAA,gBACpD;AAAA,cACF,QAAQ;AAAA,cAER;AACA,qBAAO;AAAA,YACT,CAAC;AAAA,UAAA;AAAA,QACH;AAEF,cAAM,2BAA2BJ,IAAAA,OAAO,iBAAiB;AACzD,cAAM,2BAA2BA,IAAAA,OAAO,iBAAiB;AACzD,cAAM,gBAAgB,SAAS,aAAa,OAAO,KAAK,SAAS,UAAU,IAAI,CAAA;AAC/E,cAAM,aAAa,SAAS,0BAA0B,KAAK,CAAA;AAC3D,cAAM,WAAW,SAAS,wBAAwB,KAAK,CAAA;AACvD,cAAM,eAAe,SAAS,4BAA4B,KAAK,CAAA;AAE/D,cAAM,mBAAmB,CACvB,QACA,eAC2B;AAC3B,gBAAM,gBAAwC;AAAA,YAC5C,SAAS;AAAA,cACP,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,EAAA;AAAA,cACN,EAAE,IAAI,GAAA;AAAA,YAAG;AAAA,YAEX,OAAO;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,YACT,cACE,aAAa,WAAW,IACpB,CAAA,IACA;AAAA,cACE,CAAC,aAAa,CAAC,CAAC,GAAG;AAAA,gBACjB,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,eAAe;AAAA,gBACf,aAAa;AAAA,gBACb,aAAa;AAAA,cAAA;AAAA,YACf;AAAA,YAER,YAAY;AAAA,YACZ,cAAc;AAAA,UAAA;AAEhB,iBAAOC,wCAA+B;AAAA,YACpC,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,YAAY;AAAA,gBACV,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN;AAAA,kBAAA;AAAA,gBACF;AAAA,gBAEF,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,aAAa;AAAA,gBAAA;AAAA,gBAEf,MAAM;AAAA,kBACJ,MAAM;AAAA,kBACN,aAAa;AAAA,gBAAA;AAAA,gBAEf,SAAS;AAAA,kBACP,MAAM;AAAA,kBACN,aAAa;AAAA,gBAAA;AAAA,gBAEf,cAAc;AAAA,kBACZ,MAAM;AAAA,kBACN,YAAY,OAAO;AAAA,oBACjB,CAAA;AAAA,oBACA,GAAG,aAAa,IAAI,CAAC,OAAO;AAAA,sBAC1B,CAAC,CAAC,GAAG;AAAA,wBACH,MAAM;AAAA,wBACN,YAAY;AAAA,0BACV,KAAK;AAAA,4BACH,MAAM;AAAA,0BAAA;AAAA,0BAER,KAAK;AAAA,4BACH,MAAM;AAAA,0BAAA;AAAA,0BAER,KAAK;AAAA,4BACH,MAAM;AAAA,0BAAA;AAAA,0BAER,KAAK;AAAA,4BACH,MAAM;AAAA,0BAAA;AAAA,0BAER,eAAe;AAAA,4BACb,MAAM;AAAA,0BAAA;AAAA,0BAER,aAAa;AAAA,4BACX,MAAM;AAAA,0BAAA;AAAA,0BAER,aAAa;AAAA,4BACX,MAAM;AAAA,0BAAA;AAAA,wBACR;AAAA,sBACF;AAAA,oBACF,EACA;AAAA,kBAAA;AAAA,gBACJ;AAAA,cACF;AAAA,YACF;AAAA,YAEF,SACE,WAAW,SACP,KAAK;AAAA,cACHkH,6BAA2B,mCAAmC,aAAa;AAAA,cAC3E;AAAA,cACA;AAAA,YAAA,IAEF,WAAW,SACTnB,6BAAAA,KAAK;AAAA,cACHmB,6BAA2B,mCAAmC,aAAa;AAAA,YAAA,IAE7E;AAAA,UAAA,CACT;AAAA,QACH;AAEA,YAAI,IAAI,IAAI;AAAA,UACV,KAAK;AAAA,YACH,SAAS,uBAAuB,oBAAoB;AAAA,YACpD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO,UAAU,CAAC,SAAS,sBAAsB,OAAO,EAAE,KAAK,GAAG,CAAC;AAAA,YAChF,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,eAAe;AAAA,gBACf,aAAa,KAAK;AAAA,kBAChB;AAAA,kBACA;AAAA,kBACA,OAAO,KAAK,UAAU;AAAA,gBAAA;AAAA,gBAExB,UAAU;AAAA,gBACV,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,gBAEX,SAAS,KAAK,mBAAmB;AAAA,kBAC/B,QAAQ;AAAA,gBAAA,CACT;AAAA,cAAA;AAAA,cAEH;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa;AAAA,gBACb,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,SAAS;AAAA,gBAAA;AAAA,gBAEX,SAAS,KAAK,mBAAmB;AAAA,kBAC/B,MAAM;AAAA,gBAAA,CACP;AAAA,cAAA;AAAA,cAEH;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa;AAAA,gBACb,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,SAAS;AAAA,gBAAA;AAAA,gBAEX,SAAS,KAAK,mBAAmB;AAAA,kBAC/B,SAAS;AAAA,gBAAA,CACV;AAAA,cAAA;AAAA,cAEH;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,KAAK;AAAA,kBAChB;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAEF,UAAU;AAAA,gBACV,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,gBAEF,SAAS,KAAK,mBAAmB;AAAA,kBAC/B,QAAQ,cAAc,SAAS,IAAI,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,gBAAA,CAC1E;AAAA,cAAA;AAAA,cAEH;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aACE;AAAA,gBACF,UAAU;AAAA,gBACV,iBAAiB;AAAA,gBACjB,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,YAAY,OAAO;AAAA,oBACjB,CAAA;AAAA,oBACA,GAAG,SAAS,IAAI,CAAC,WAAW;AAAA,sBAC1B,CAAC,KAAK,GAAG;AAAA,wBACP,MAAM;AAAA,wBACN,MAAM,CAAC,OAAO,MAAM;AAAA,wBACpB,SAAS;AAAA,wBACT,SAAS;AAAA,sBAAA;AAAA,oBACX,EACA;AAAA,kBAAA;AAAA,gBACJ;AAAA,gBAEF,SAAS,KAAK,sBAAsB;AAAA,kBAClC,MACE,SAAS,SAAS,IACd,OAAO;AAAA,oBACL,CAAA;AAAA,oBACA,GAAG,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,kBAAA,IAE9D,EAAE,IAAI,OAAA;AAAA,gBAAO,CACpB;AAAA,cAAA;AAAA,cAEH,aAAa,SAAS,IAClB;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,KAAK;AAAA,kBAChB;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAEF,UAAU;AAAA,gBACV,iBAAiB;AAAA,gBACjB,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,YAAY,OAAO;AAAA,oBACjB,CAAA;AAAA,oBACA,GAAG,aAAa,IAAI,CAAC,WAAW;AAAA,sBAC9B,CAAC,KAAK,GAAG;AAAA,wBACP,MAAM;AAAA,wBACN,OAAO;AAAA,0BACL,MAAM;AAAA,0BACN,MAAM;AAAA,0BACN,aAAa,KAAK;AAAA,4BAChB,2CAA2C,KAAK;AAAA,4BAChD;AAAA,4BACA,MAAM,KAAK,2BAA2B;AAAA,0BAAA;AAAA,wBACxC;AAAA,sBACF;AAAA,oBACF,EACA;AAAA,kBAAA;AAAA,gBACJ;AAAA,gBAEF,SAAS,KAAK,sBAAsB;AAAA,kBAClC,cAAc,OAAO;AAAA,oBACnB,CAAA;AAAA,oBACA,GAAG,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOxK,YAAW;AAAA,sBACjD,CAAC,KAAK,GAAG,4BAA4B,MAAM,GAAGA,SAAQ,CAAC,EAAE,KAAK,GAAG;AAAA,oBAAA,EACjE;AAAA,kBAAA;AAAA,gBACJ,CACD;AAAA,cAAA,IAEH;AAAA,YAAA,EACJ,OAAO,OAAO;AAAA,YAChB,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa;AAAA,gBACb,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,kBACxB;AAAA,oBACE,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,IAAI,cAAc;AAAA,oBAClE,kBAAkB,KAAK;AAAA,sBACrB;AAAA,sBACA;AAAA,wBACE;AAAA,wBACA;AAAA,wBACAyK,SAAAA;AAAAA,0BACEnH,wCAA+B;AAAA,4BAC7B,QAAQ;AAAA,4BACR,MAAM;AAAA,4BACN,SAAS;AAAA,4BACT,QACE,cAAc,SAAS,IAAI,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,4BACnE,MACE,SAAS,SAAS,IACd,OAAO;AAAA,8BACL,CAAA;AAAA,8BACA,GAAG,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,4BAAA,IAE9D,EAAE,IAAI,OAAA;AAAA,4BACZ,cAAc,aAAa,SACvB,OAAO;AAAA,8BACL,CAAA;AAAA,8BACA,GAAG,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOtD,YAAW;AAAA,gCACjD,CAAC,KAAK,GAAG,4BAA4B,MAAM,GAAGA,SAAQ,CAAC,EAAE;AAAA,kCACvD;AAAA,gCAAA;AAAA,8BACF,EACA;AAAA,4BAAA,IAEJ;AAAA,0BAAA,CACL;AAAA,wBAAA;AAAA,sBACH,EACA,KAAK,GAAG;AAAA,oBAAA;AAAA,kBACZ;AAAA,gBACF;AAAA,gBAEF,SAAS;AAAA,kBACP,oBAAoB,iBAAiB,QAAQ,SAAS,UAAU;AAAA,kBAChE,sBAAsB,iBAAiB,QAAQ,SAAS,UAAU;AAAA,gBAAA;AAAA,cACpE;AAAA,YACF;AAAA,UACF;AAAA,UAEF,MAAM;AAAA,YACJ,SAAS,gBAAgB,oBAAoB;AAAA,YAC7C,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO,UAAU,CAAC,SAAS,sBAAsB,QAAQ,EAAE,KAAK,GAAG,CAAC;AAAA,YACjF,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,qCAAqC;AAAA,kBACnC,QAAQ;AAAA,gBAAA;AAAA,gBAEV,uBAAuB;AAAA,kBACrB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,gBAAA;AAAA,cACV;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,qBAAqB,oBAAoB;AAAA,gBACtD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,kBACxB;AAAA,oBACE,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,IAAI,eAAe;AAAA,kBAAA;AAAA,gBACrE;AAAA,gBAEF,SAAS;AAAA,kBACP,oBAAoB;AAAA,oBAClB,QAAQ;AAAA,kBAAA;AAAA,kBAEV,sBAAsB;AAAA,oBACpB,QAAQ;AAAA,kBAAA;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEF,KAAK;AAAA,YACH,SAAS,sBAAsB,oBAAoB;AAAA,YACnD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,0BAA0B,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAEtE,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQsD,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,qCAAqC;AAAA,kBACnC,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,uBAAuB;AAAA,kBACrB,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,sBAAsB;AAAA,kBACpB,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,cACH;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,eAAe,oBAAoB;AAAA,gBAChD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,kBACxB;AAAA,oBACE,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,IAAI,eAAe;AAAA,kBAAA;AAAA,gBACrE;AAAA,gBAEF,SAAS;AAAA,kBACP,oBAAoB;AAAA,oBAClB,QAAQ;AAAA,kBAAA;AAAA,kBAEV,sBAAsB;AAAA,oBACpB,QAAQ;AAAA,kBAAA;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGF,cAAM,0BAA0B,KAAK;AAAA,UACnC,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAGF,cAAM,oCAAoC,KAAK;AAAA,UAC7C,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QAAA;AAGF,cAAM,oCAAoC,KAAK;AAAA,UAC7C,SAAS;AAAA,UACT;AAAA,UACA;AAAA,QAAA;AAGF,cAAM,wCAAwC;AAAA,UAC5C,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,YAAYF,MAAAA;AAAAA,cACVE,wCAA+B;AAAA,gBAC7B,YAAY;AAAA,kBACV,GAAG,wBAAwB,OAAO,WAAY;AAAA,kBAC9C,aAAa,KAAK;AAAA,oBAChB;AAAA,oBACA;AAAA,oBACA,OAAO,KAAK,UAAU;AAAA,kBAAA;AAAA,gBACxB;AAAA,cACF,CACD;AAAA,cACD,kCAAkC,OAAO;AAAA,YAAA;AAAA,UAC3C;AAAA,QACF;AAGF,YAAI,GAAG,IAAI,cAAc,IAAI;AAAA,UAC3B,KAAK;AAAA,YACH,SAAS,GAAG,oBAAoB;AAAA,YAChC,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAElE,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,wBAAwB,oBAAoB;AAAA,gBACzD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,gBAAA;AAAA,gBAE1B,SAAS;AAAA,kBACP,oBAAoB;AAAA,kBACpB,sBAAsB;AAAA,gBAAA;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEF,YAAI,GAAG,IAAI,eAAe,IAAI;AAAA,UAC5B,KAAK;AAAA,YACH,SAAS,GAAG,oBAAoB;AAAA,YAChC,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,QAAQ,OAAO,QAAQ,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAEnE,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,wBAAwB,oBAAoB;AAAA,gBACzD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,gBAAA;AAAA,gBAE1B,SAAS;AAAA,kBACP,oBAAoB;AAAA,kBACpB,sBAAsB;AAAA,gBAAA;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEF,YAAI,GAAG,IAAI,eAAe,IAAI;AAAA,UAC5B,KAAK;AAAA,YACH,SAAS,GAAG,oBAAoB;AAAA,YAChC,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,QAAQ,OAAO,QAAQ,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAEnE,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,wBAAwB,oBAAoB;AAAA,gBACzD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,gBAAA;AAAA,gBAE1B,SAAS;AAAA,kBACP,oBAAoB;AAAA,kBACpB,sBAAsB;AAAA,gBAAA;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEF,YAAI,GAAG,IAAI,oBAAoB,IAAI;AAAA,UACjC,KAAK;AAAA,YACH,SAAS,GAAG,oBAAoB;AAAA,YAChC,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,QAAQ,OAAO,YAAY,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAEvE,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,wBAAwB,oBAAoB;AAAA,gBACzD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,gBAAA;AAAA,gBAE1B,SAAS;AAAA,kBACP,oBAAoB;AAAA,kBACpB,sBAAsB;AAAA,gBAAA;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGF,cAAM,sBAAsB;AAAA,UAC1B,OAAO;AAAA,YACL,aAAa,eAAe,oBAAoB;AAAA,YAChD,SAAS,KAAK;AAAA,cACZ,KAAK,MAAM;AAAA,cACX,gBAAgB,QAAQ;AAAA,cACxB;AAAA,gBACE,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,IAAI,oBAAoB;AAAA,cAAA;AAAA,YAC1E;AAAA,YAEF,SAAS;AAAA,cACP,oBAAoB;AAAA,gBAClB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,OAAO;AAAA,oBACL,GAAG;AAAA,oBACH,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,cACF;AAAA,cAEF,sBAAsB;AAAA,gBACpB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,OAAO;AAAA,oBACL,GAAG;AAAA,oBACH,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGF,YAAI,GAAG,IAAI,QAAQ,IAAI;AAAA,UACrB,KAAK;AAAA,YACH,SAAS,wBAAwB,oBAAoB;AAAA,YACrD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,yBAAyB,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAErE,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,eAAe;AAAA,gBACf,aAAa,KAAK;AAAA,kBAChB;AAAA,kBACA;AAAA,kBACA,OAAO,KAAK,UAAU;AAAA,gBAAA;AAAA,gBAExB,UAAU;AAAA,gBACV,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,gBAEX,SAAS,KAAK,mBAAmB;AAAA,kBAC/B,QAAQ;AAAA,gBAAA,CACT;AAAA,cAAA;AAAA,YACH;AAAA,YAEF,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,qCAAqC;AAAA,kBACnC,QAAQ;AAAA,gBAAA;AAAA,gBAEV,uBAAuB;AAAA,kBACrB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,gBAAA;AAAA,cACV;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,UAAA;AAAA,UAEb,OAAO;AAAA,YACL,SAAS,wBAAwB,oBAAoB;AAAA,YACrD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,2BAA2B,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAEvE,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,eAAe;AAAA,gBACf,aAAa,KAAK;AAAA,kBAChB;AAAA,kBACA;AAAA,kBACA,OAAO,KAAK,UAAU;AAAA,gBAAA;AAAA,gBAExB,UAAU;AAAA,gBACV,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,gBAEX,SAAS,KAAK,mBAAmB;AAAA,kBAC/B,QAAQ;AAAA,gBAAA,CACT;AAAA,cAAA;AAAA,YACH;AAAA,YAEF,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,qCAAqC;AAAA,kBACnC,QAAQ;AAAA,gBAAA;AAAA,gBAEV,uBAAuB;AAAA,kBACrB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,gBAAA;AAAA,cACV;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,UAAA;AAAA,QACb;AAEF,YAAI,GAAG,IAAI,eAAe,IAAI;AAAA,UAC5B,KAAK;AAAA,YACH,SAAS,wBAAwB,oBAAoB;AAAA,YACrD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,4BAA4B,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAExE,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,sDAAsD,oBAAoB;AAAA,gBACvF,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,cACX;AAAA,YACF;AAAA,YAEF,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,qCAAqC;AAAA,kBACnC,QAAQ;AAAA,gBAAA;AAAA,gBAEV,uBAAuB;AAAA,kBACrB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,gBAAA;AAAA,cACV;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,UAAA;AAAA,UAEb,OAAO;AAAA,YACL,SAAS,wBAAwB,oBAAoB;AAAA,YACrD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,8BAA8B,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAE1E,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,sDAAsD,oBAAoB;AAAA,gBACvF,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,cACX;AAAA,YACF;AAAA,YAEF,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,qCAAqC;AAAA,kBACnC,QAAQ;AAAA,gBAAA;AAAA,gBAEV,uBAAuB;AAAA,kBACrB,QAAQ;AAAA,gBAAA;AAAA,gBAEV,sBAAsB;AAAA,kBACpB,QAAQ;AAAA,gBAAA;AAAA,cACV;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,UAAA;AAAA,QACb;AAGF,YAAI,GAAG,IAAI,cAAc,IAAI;AAAA,UAC3B,KAAK;AAAA,YACH,SAAS,gCAAgC,oBAAoB;AAAA,YAC7D,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,SAAS,UAAU,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAE/D,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa;AAAA,gBACb,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAASmH,SAAAA;AAAAA,oBACPnH,wCAA+B;AAAA,sBAC7B,QAAQ;AAAA,sBACR,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,QAAQ,cAAc,SAAS,IAAI,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,sBACzE,MACE,SAAS,SAAS,IACd,OAAO;AAAA,wBACL,CAAA;AAAA,wBACA,GAAG,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,sBAAA,IAE9D,EAAE,IAAI,OAAA;AAAA,sBACZ,cAAc,aAAa,SACvB,OAAO;AAAA,wBACL,CAAA;AAAA,wBACA,GAAG,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOtD,YAAW;AAAA,0BACjD,CAAC,KAAK,GAAG,4BAA4B,MAAM,GAAGA,SAAQ,CAAC,EAAE,KAAK,GAAG;AAAA,wBAAA,EACjE;AAAA,sBAAA,IAEJ;AAAA,oBAAA,CACL;AAAA,kBAAA;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa;AAAA,gBACb,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,kBACxB;AAAA,oBACE,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,IAAI,cAAc;AAAA,oBAClE,cAAc,KAAK;AAAA,sBACjB;AAAA,sBACA;AAAA,wBACE;AAAA,wBACA;AAAA,wBACA,GAAG;AAAA,0BACDsD,wCAA+B;AAAA,4BAC7B,QAAQ;AAAA,4BACR,MAAM;AAAA,4BACN,SAAS;AAAA,4BACT,QACE,cAAc,SAAS,IAAI,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,4BACnE,MACE,SAAS,SAAS,IACd,OAAO;AAAA,8BACL,CAAA;AAAA,8BACA,GAAG,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,4BAAA,IAE9D,EAAE,IAAI,OAAA;AAAA,4BACZ,cAAc,aAAa,SACvB,OAAO;AAAA,8BACL,CAAA;AAAA,8BACA,GAAG,aAAa,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOtD,YAAW;AAAA,gCACjD,CAAC,KAAK,GAAG,4BAA4B,MAAM,GAAGA,SAAQ,CAAC,EAAE;AAAA,kCACvD;AAAA,gCAAA;AAAA,8BACF,EACA;AAAA,4BAAA,IAEJ;AAAA,0BAAA,CACL;AAAA,0BACD,EAAE,gBAAgB,KAAA;AAAA,wBAAK;AAAA,sBACzB,EACA,KAAK,GAAG;AAAA,oBAAA;AAAA,kBACZ;AAAA,gBACF;AAAA,gBAEF,SAAS;AAAA,kBACP,oBAAoB,iBAAiB,QAAQ,SAAS,UAAU;AAAA,kBAChE,sBAAsB,iBAAiB,QAAQ,SAAS,UAAU;AAAA,gBAAA;AAAA,cACpE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGF,YAAI,GAAG,IAAI,QAAQ,IAAI;AAAA,UACrB,KAAK;AAAA,YACH,SAAS,uBAAuB,oBAAoB;AAAA,YACpD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO,UAAU,CAAC,SAAS,sBAAsB,MAAM,EAAE,KAAK,GAAG,CAAC;AAAA,YAC/E,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,gCAAgC,oBAAoB;AAAA,gBACjE,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,cACX;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,iBAAiB,oBAAoB;AAAA,gBAClD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,gBAAA;AAAA,gBAE1B,SAAS;AAAA,kBACP,oBAAoB;AAAA,oBAClB,QAAQ;AAAA,kBAAA;AAAA,kBAEV,sBAAsB;AAAA,oBACpB,QAAQ;AAAA,kBAAA;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEF,KAAK;AAAA,YACH,SAAS,qBAAqB,oBAAoB;AAAA,YAClD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,OAAO,QAAQ,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAE3D,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,gCAAgC,oBAAoB;AAAA,gBACjE,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,cACX;AAAA,YACF;AAAA,YAEF,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQsD,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,qCAAqC;AAAA,kBACnC,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,uBAAuB;AAAA,kBACrB,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,sBAAsB;AAAA,kBACpB,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,cACH;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,eAAe,oBAAoB;AAAA,gBAChD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,kBACxB;AAAA,oBACE,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,IAAI,eAAe;AAAA,kBAAA;AAAA,gBACrE;AAAA,gBAEF,SAAS;AAAA,kBACP,oBAAoB;AAAA,oBAClB,QAAQ;AAAA,kBAAA;AAAA,kBAEV,sBAAsB;AAAA,oBACpB,QAAQ;AAAA,kBAAA;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEF,OAAO;AAAA,YACL,SAAS,+BAA+B,oBAAoB;AAAA,YAC5D,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,SAAS,QAAQ,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAE7D,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,gCAAgC,oBAAoB;AAAA,gBACjE,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,cACX;AAAA,YACF;AAAA,YAEF,aAAa;AAAA,cACX,SAAS;AAAA,gBACP,oBAAoB;AAAA,kBAClB,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,qCAAqC;AAAA,kBACnC,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,uBAAuB;AAAA,kBACrB,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,gBAEH,sBAAsB;AAAA,kBACpB,QAAQA,SAAAA,+BAA+B;AAAA,oBACrC,GAAG;AAAA,oBACH,UAAU;AAAA,kBAAA,CACX;AAAA,gBAAA;AAAA,cACH;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,eAAe,oBAAoB;AAAA,gBAChD,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,kBACxB;AAAA,oBACE,kBAAkB,KAAK,iBAAiB,KAAK,GAAG,IAAI,eAAe;AAAA,kBAAA;AAAA,gBACrE;AAAA,gBAEF,SAAS;AAAA,kBACP,oBAAoB;AAAA,oBAClB,QAAQ;AAAA,kBAAA;AAAA,kBAEV,sBAAsB;AAAA,oBACpB,QAAQ;AAAA,kBAAA;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UAEF,QAAQ;AAAA,YACN,SAAS,qBAAqB,oBAAoB;AAAA,YAClD,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,YACtC,aAAa,OAAO;AAAA,cAClB,CAAC,SAAS,sBAAsB,UAAU,QAAQ,EAAE,KAAK,GAAG;AAAA,YAAA;AAAA,YAE9D,YAAY;AAAA,cACV;AAAA,gBACE,MAAM;AAAA,gBACN,IAAI;AAAA,gBACJ,aAAa,gCAAgC,oBAAoB;AAAA,gBACjE,UAAU;AAAA,gBACV,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,cACX;AAAA,YACF;AAAA,YAEF,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,aAAa,OAAO,oBAAoB;AAAA,gBACxC,SAAS,KAAK;AAAA,kBACZ,KAAK,MAAM;AAAA,kBACX,gBAAgB,QAAQ;AAAA,gBAAA;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEF,cAAM,wCAAqC,IAAA;AAC3C,cAAM;AAAA,UACJ,MAAM,KAAK,MAAM,0BAA0B,SAAS;AAAA,UACpD,OAAO,CAAC,MAAM,YAAY,MAAM;AAC9B,kBAAM,8BAA8B,MAAM,aAAa,IAAI;AAC3D,gBAAI,CAAC,4BAA6B;AAClC,oBAAQ,4BAA4B,MAAA;AAAA,cAClC,KAAK;AAAA,cACL,KAAK;AACH;AAAA,YAAA;AAEJ,kBAAM,0BAA0B,aAAa,aAAA;AAC7C,gBAAI,CAACH,gBAAAA,mBAAmB,uBAAuB,EAAG;AAClD,gBAAI,kBAAkB,KAAK,kBAAkB,IAAI,uBAAuB;AACxE,gBAAI,CAAC,iBAAiB;AACpB,gCAAkB,MAAM,wBAAwB;AAAA,gBAC9C;AAAA,gBACA,KAAK;AAAA,gBACL;AAAA,cAAA;AAEF,mBAAK,kBAAkB,IAAI,yBAAyB,eAAe;AAAA,YACrE;AACA,gBAAI,CAAC,gBAAiB;AACtB,kBAAM,8BAA8B,wBAAwB;AAC5D,kBAAM,uBAAuB,gBAAgB,aACzC,OAAO,KAAK,gBAAgB,UAAU,IACtC,CAAA;AACJ,kBAAM,oBAAoB,gBAAgB,0BAA0B,KAAK,CAAA;AACzE,kBAAM,kBAAkB,gBAAgB,wBAAwB,KAAK,CAAA;AACrE,kBAAM,sBAAsB,gBAAgB,4BAA4B,KAAK,CAAA;AAC7E,kBAAM,uBAAuB,GAAG,IAAI,UAAU,IAAI;AAClD,8BAAkB,IAAI,oBAAoB;AAC1C,gBAAI,oBAAoB,IAAI;AAAA,cAC1B,KAAK;AAAA,gBACH,SAAS,wBAAwB,IAAI,IAAI,2BAA2B,mCAAmC,oBAAoB;AAAA,gBAC3H,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,gBACtC,aAAa,OAAO;AAAA,kBAClB,CAAC,SAAS,sBAAsB,QAAQ,WAAW,IAAI,EAAE,KAAK,GAAG;AAAA,gBAAA;AAAA,gBAEnE,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa,gCAAgC,oBAAoB;AAAA,oBACjE,UAAU;AAAA,oBACV,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,kBAEF;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa,KAAK;AAAA,sBAChB;AAAA,sBACA;AAAA,sBACA,OAAO,KAAK,iBAAiB;AAAA,oBAAA;AAAA,oBAE/B,UAAU;AAAA,oBACV,iBAAiB;AAAA,oBACjB,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAAS;AAAA,oBAAA;AAAA,oBAEX,SAAS,KAAK,mBAAmB;AAAA,sBAC/B,QAAQ;AAAA,oBAAA,CACT;AAAA,kBAAA;AAAA,kBAEH;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa;AAAA,oBACb,UAAU;AAAA,oBACV,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,SAAS;AAAA,oBAAA;AAAA,oBAEX,SAAS,KAAK,mBAAmB;AAAA,sBAC/B,MAAM;AAAA,oBAAA,CACP;AAAA,kBAAA;AAAA,kBAEH;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa;AAAA,oBACb,UAAU;AAAA,oBACV,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,SAAS;AAAA,sBACT,SAAS;AAAA,oBAAA;AAAA,oBAEX,SAAS,KAAK,mBAAmB;AAAA,sBAC/B,SAAS;AAAA,oBAAA,CACV;AAAA,kBAAA;AAAA,kBAEH;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa,KAAK;AAAA,sBAChB;AAAA,sBACA;AAAA,sBACA;AAAA,oBAAA;AAAA,oBAEF,UAAU;AAAA,oBACV,iBAAiB;AAAA,oBACjB,OAAO;AAAA,oBACP,SAAS;AAAA,oBACT,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,OAAO;AAAA,wBACL,MAAM;AAAA,wBACN,MAAM;AAAA,sBAAA;AAAA,oBACR;AAAA,oBAEF,SAAS,KAAK,mBAAmB;AAAA,sBAC/B,QACE,qBAAqB,SAAS,IAC1B,qBAAqB,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IACzC;AAAA,oBAAA,CACP;AAAA,kBAAA;AAAA,kBAEH;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aACE;AAAA,oBACF,UAAU;AAAA,oBACV,iBAAiB;AAAA,oBACjB,SAAS;AAAA,oBACT,OAAO;AAAA,oBACP,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,YAAY,OAAO;AAAA,wBACjB,CAAA;AAAA,wBACA,GAAG,gBAAgB,IAAI,CAAC,WAAW;AAAA,0BACjC,CAAC,KAAK,GAAG;AAAA,4BACP,MAAM;AAAA,4BACN,MAAM,CAAC,OAAO,MAAM;AAAA,4BACpB,SAAS;AAAA,4BACT,SAAS;AAAA,0BAAA;AAAA,wBACX,EACA;AAAA,sBAAA;AAAA,oBACJ;AAAA,oBAEF,SAAS,KAAK,sBAAsB;AAAA,sBAClC,MACE,gBAAgB,SAAS,IACrB,OAAO;AAAA,wBACL,CAAA;AAAA,wBACA,GAAG,gBAAgB,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,sBAAA,IAErE,EAAE,IAAI,OAAA;AAAA,oBAAO,CACpB;AAAA,kBAAA;AAAA,kBAEH,oBAAoB,SAAS,IACzB;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa,KAAK;AAAA,sBAChB;AAAA,sBACA;AAAA,sBACA;AAAA,oBAAA;AAAA,oBAEF,UAAU;AAAA,oBACV,iBAAiB;AAAA,oBACjB,SAAS;AAAA,oBACT,OAAO;AAAA,oBACP,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,YAAY,OAAO;AAAA,wBACjB,CAAA;AAAA,wBACA,GAAG,oBAAoB,IAAI,CAAC,WAAW;AAAA,0BACrC,CAAC,KAAK,GAAG;AAAA,4BACP,MAAM;AAAA,4BACN,OAAO;AAAA,8BACL,MAAM;AAAA,8BACN,MAAM;AAAA,8BACN,aAAa,KAAK;AAAA,gCAChB,2CAA2C,KAAK;AAAA,gCAChD;AAAA,gCACA,MAAM,KAAK,2BAA2B;AAAA,8BAAA;AAAA,4BACxC;AAAA,0BACF;AAAA,wBACF,EACA;AAAA,sBAAA;AAAA,oBACJ;AAAA,oBAEF,SAAS,KAAK,sBAAsB;AAAA,sBAClC,cAAc,OAAO;AAAA,wBACnB,CAAA;AAAA,wBACA,GAAG,oBAAoB,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOnD,YAAW;AAAA,0BACxD,CAAC,KAAK,GAAG,4BAA4B,MAAM,GAAGA,SAAQ,CAAC,EAAE,KAAK,GAAG;AAAA,wBAAA,EACjE;AAAA,sBAAA;AAAA,oBACJ,CACD;AAAA,kBAAA,IAEH;AAAA,gBAAA,EACJ,OAAO,OAAO;AAAA,gBAChB,WAAW;AAAA,kBACT,OAAO;AAAA,oBACL,aAAa,+BAA+B,2BAA2B;AAAA,oBACvE,SAAS,KAAK;AAAA,sBACZ,KAAK,MAAM;AAAA,sBACX,gBAAgB,QAAQ;AAAA,sBACxB;AAAA,wBACE,kBAAkB,KAAK;AAAA,0BACrB;AAAA,0BACA,GAAG,oBAAoB;AAAA,wBAAA;AAAA,wBAEzB,kBAAkB,KAAK;AAAA,0BACrB;AAAA,0BACA;AAAA,4BACE;AAAA,4BACA;AAAA,4BACAyK,SAAAA;AAAAA,8BACEnH,wCAA+B;AAAA,gCAC7B,QAAQ;AAAA,gCACR,MAAM;AAAA,gCACN,SAAS;AAAA,gCACT,QACE,qBAAqB,SAAS,IAC1B,qBAAqB,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IACzC;AAAA,gCACN,MACE,gBAAgB,SAAS,IACrB,OAAO;AAAA,kCACL,CAAA;AAAA,kCACA,GAAG,gBACA,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,gCAAA,IAEzC,EAAE,IAAI,OAAA;AAAA,gCACZ,cAAc,oBAAoB,SAC9B,OAAO;AAAA,kCACL,CAAA;AAAA,kCACA,GAAG,oBAAoB,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOtD,YAAW;AAAA,oCACxD,CAAC,KAAK,GAAG,4BAA4B;AAAA,sCACnC;AAAA,sCACAA,SAAQ;AAAA,oCAAA,EACR,KAAK,GAAG;AAAA,kCAAA,EACV;AAAA,gCAAA,IAEJ;AAAA,8BAAA,CACL;AAAA,4BAAA;AAAA,0BACH,EACA,KAAK,GAAG;AAAA,wBAAA;AAAA,sBACZ;AAAA,oBACF;AAAA,oBAEF,SAAS;AAAA,sBACP,oBAAoB,iBAAiB,QAAQ,gBAAgB,UAAU;AAAA,sBACvE,sBAAsB,iBAAiB,QAAQ,gBAAgB,UAAU;AAAA,oBAAA;AAAA,kBAC3E;AAAA,gBACF;AAAA,cACF;AAAA,cAEF,KAAK;AAAA,gBACH,SAAS,oBAAoB,IAAI,IAAI,2BAA2B,mCAAmC,oBAAoB;AAAA,gBACvH,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,gBACtC,aAAa,OAAO;AAAA,kBAClB,CAAC,SAAS,sBAAsB,UAAU,WAAW,MAAM,KAAK,EAAE,KAAK,GAAG;AAAA,gBAAA;AAAA,gBAE5E,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa,gCAAgC,oBAAoB;AAAA,oBACjE,UAAU;AAAA,oBACV,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,gBACF;AAAA,gBAEF,aAAa;AAAA,kBACX,MAAM;AAAA,gBAAA;AAAA,gBAER,WAAW;AAAA,kBACT,KAAK;AAAA,oBACH,aAAa,eAAe,2BAA2B;AAAA,oBACvD,SAAS,KAAK;AAAA,sBACZ,KAAK,MAAM;AAAA,sBACX,gBAAgB,QAAQ;AAAA,oBAAA;AAAA,kBAC1B;AAAA,gBACF;AAAA,cACF;AAAA,cAEF,OAAO;AAAA,gBACL,SAAS,oBAAoB,IAAI,IAAI,2BAA2B,mCAAmC,oBAAoB;AAAA,gBACvH,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,gBACtC,aAAa,OAAO;AAAA,kBAClB,CAAC,SAAS,sBAAsB,UAAU,WAAW,MAAM,OAAO,EAAE,KAAK,GAAG;AAAA,gBAAA;AAAA,gBAE9E,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa,gCAAgC,oBAAoB;AAAA,oBACjE,UAAU;AAAA,oBACV,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,gBACF;AAAA,gBAEF,aAAa;AAAA,kBACX,MAAM;AAAA,gBAAA;AAAA,gBAER,WAAW;AAAA,kBACT,KAAK;AAAA,oBACH,aAAa,eAAe,2BAA2B;AAAA,oBACvD,SAAS,KAAK;AAAA,sBACZ,KAAK,MAAM;AAAA,sBACX,gBAAgB,QAAQ;AAAA,oBAAA;AAAA,kBAC1B;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEF,gBAAI,GAAG,oBAAoB,cAAc,IAAI;AAAA,cAC3C,KAAK;AAAA,gBACH,SAAS,oCAAoC,IAAI,IAAI,2BAA2B,mCAAmC,oBAAoB;AAAA,gBACvI,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,gBACtC,aAAa,OAAO;AAAA,kBAClB,CAAC,SAAS,sBAAsB,QAAQ,WAAW,MAAM,UAAU,EAAE,KAAK,GAAG;AAAA,gBAAA;AAAA,gBAE/E,YAAY;AAAA,kBACV;AAAA,oBACE,MAAM;AAAA,oBACN,IAAI;AAAA,oBACJ,aAAa;AAAA,oBACb,UAAU;AAAA,oBACV,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAASyK,SAAAA;AAAAA,wBACPnH,wCAA+B;AAAA,0BAC7B,QAAQ;AAAA,0BACR,MAAM;AAAA,0BACN,SAAS;AAAA,0BACT,QACE,qBAAqB,SAAS,IAC1B,qBAAqB,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IACzC;AAAA,0BACN,MACE,gBAAgB,SAAS,IACrB,OAAO;AAAA,4BACL,CAAA;AAAA,4BACA,GAAG,gBACA,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,0BAAA,IAEzC,EAAE,IAAI,OAAA;AAAA,0BACZ,cAAc,oBAAoB,SAC9B,OAAO;AAAA,4BACL,CAAA;AAAA,4BACA,GAAG,oBAAoB,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOtD,YAAW;AAAA,8BACxD,CAAC,KAAK,GAAG,4BAA4B,MAAM,GAAGA,SAAQ,CAAC,EAAE;AAAA,gCACvD;AAAA,8BAAA;AAAA,4BACF,EACA;AAAA,0BAAA,IAEJ;AAAA,wBAAA,CACL;AAAA,sBAAA;AAAA,oBACH;AAAA,kBACF;AAAA,gBACF;AAAA,gBAEF,WAAW;AAAA,kBACT,OAAO;AAAA,oBACL,aAAa;AAAA,oBACb,SAAS,KAAK;AAAA,sBACZ,KAAK,MAAM;AAAA,sBACX,gBAAgB,QAAQ;AAAA,sBACxB;AAAA,wBACE,kBAAkB,KAAK;AAAA,0BACrB;AAAA,0BACA,GAAG,oBAAoB;AAAA,wBAAA;AAAA,wBAEzB,cAAc,KAAK;AAAA,0BACjB;AAAA,0BACA;AAAA,4BACE;AAAA,4BACA;AAAA,4BACA,GAAG;AAAA,8BACDsD,wCAA+B;AAAA,gCAC7B,QAAQ;AAAA,gCACR,MAAM;AAAA,gCACN,SAAS;AAAA,gCACT,QACE,qBAAqB,SAAS,IAC1B,qBAAqB,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IACzC;AAAA,gCACN,MACE,gBAAgB,SAAS,IACrB,OAAO;AAAA,kCACL,CAAA;AAAA,kCACA,GAAG,gBACA,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,SAAS;AAAA,gCAAA,IAEzC,EAAE,IAAI,OAAA;AAAA,gCACZ,cAAc,oBAAoB,SAC9B,OAAO;AAAA,kCACL,CAAA;AAAA,kCACA,GAAG,oBAAoB,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,OAAOtD,YAAW;AAAA,oCACxD,CAAC,KAAK,GAAG,4BAA4B;AAAA,sCACnC;AAAA,sCACAA,SAAQ;AAAA,oCAAA,EACR,KAAK,GAAG;AAAA,kCAAA,EACV;AAAA,gCAAA,IAEJ;AAAA,8BAAA,CACL;AAAA,8BACD,EAAE,gBAAgB,KAAA;AAAA,4BAAK;AAAA,0BACzB,EACA,KAAK,GAAG;AAAA,wBAAA;AAAA,sBACZ;AAAA,oBACF;AAAA,oBAEF,SAAS;AAAA,sBACP,oBAAoB,iBAAiB,QAAQ,gBAAgB,UAAU;AAAA,sBACvE,sBAAsB,iBAAiB,QAAQ,gBAAgB,UAAU;AAAA,oBAAA;AAAA,kBAC3E;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAEF,gBAAI,GAAG,oBAAoB,cAAc,IAAI;AAAA,cAC3C,KAAK;AAAA,gBACH,SAAS,WAAW,2BAA2B;AAAA,gBAC/C,MAAM,CAAC,GAAG,oBAAoB,QAAQ;AAAA,gBACtC,aAAa,OAAO;AAAA,kBAClB,CAAC,SAAS,sBAAsB,QAAQ,WAAW,MAAM,UAAU,EAAE,KAAK,GAAG;AAAA,gBAAA;AAAA,gBAE/E,WAAW;AAAA,kBACT,OAAO;AAAA,oBACL,aAAa,wBAAwB,oBAAoB;AAAA,oBACzD,SAAS,KAAK;AAAA,sBACZ,KAAK,MAAM;AAAA,sBACX,gBAAgB,QAAQ;AAAA,oBAAA;AAAA,oBAE1B,SAAS;AAAA,sBACP,oBAAoB,KAAK;AAAA,wBACvB,gBAAgB;AAAA,wBAChB;AAAA,wBACA;AAAA,wBACA;AAAA,sBAAA;AAAA,sBAEF,sBAAsB,KAAK;AAAA,wBACzB,gBAAgB;AAAA,wBAChB;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA;AAAA,sBAAA;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UAEJ;AAAA,UACA,EAAE,aAAa,EAAA;AAAA,QAAE;AAEnB,aAAK,MAAM,SAAS,QAAQ,CAAC,QAAQ;AACnC,gBAAM,eAAekD,+BAAS,IAAI,aAAa,IAC3C,IAAI,cAAc,MAAM,IACxB,IAAI;AACR,cAAI,iBAAiB,SAAS,CAAC,aAAc;AAC7C,gBAAM,8BAAkC,IAAA;AACxC,cAAI,iBAAiB,MAAM;AACzB,oBAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE;AACvC,oBAAQ,IAAI,CAAC,MAAM,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE;AACxC,oBAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE;AACvC,oBAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE;AACzC,oBAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AAClD,oBAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AAClD,oBAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AACpD,oBAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,QAAQ,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AACrD,oBAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AAClD,oBAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AACpD,oBAAQ,IAAI,CAAC,GAAG,IAAI,iBAAiB,KAAK,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AACzD,oBAAQ,IAAI,CAAC,GAAG,IAAI,iBAAiB,OAAO,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AAC3D,oBAAQ,IAAI,CAAC,GAAG,IAAI,gBAAgB,KAAK,EAAE,KAAK,GAAG,GAAG,CAAA,CAAE;AACxD,8BAAkB,QAAQ,CAAC,SAAS;AAClC,sBAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE;AACvC,sBAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE;AACvC,sBAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,GAAG,GAAG,EAAE;AAAA,YAC3C,CAAC;AAAA,UACH,WAAWA,+BAAS,YAAY,GAAG;AACjC,mBAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,uBAAuB,mBAAmB,MAAM;AACrF,kBAAI,CAAC,oBAAqB;AAC1B,oBAAM,qBAAqB,SAAS,sBAAsB,CAAA,IAAK;AAC/D,sBAAQ,uBAAA;AAAA,gBACN,KAAK;AACH,0BAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACvD,0BAAQ,IAAI,CAAC,GAAG,IAAI,gBAAgB,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACxE;AAAA,gBACF,KAAK;AACH,0BAAQ,IAAI,CAAC,MAAM,MAAM,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACxD;AAAA,gBACF,KAAK;AACH,0BAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAClE;AAAA,gBACF,KAAK;AACH,oCAAkB,QAAQ,CAAC,SAAS;AAClC,4BAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACvD,4BAAQ,IAAI,CAAC,GAAG,IAAI,gBAAgB,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAAA,kBAC1E,CAAC;AACD;AAAA,gBACF,KAAK;AACH,0BAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACvD,0BAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACzD,0BAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAClE,0BAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACpE;AAAA,gBACF,KAAK;AACH,0BAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAClE,0BAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACpE,0BAAQ,IAAI,CAAC,GAAG,IAAI,iBAAiB,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACzE,0BAAQ,IAAI,CAAC,GAAG,IAAI,iBAAiB,OAAO,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAC3E;AAAA,gBACF,KAAK;AACH,oCAAkB,QAAQ,CAAC,SAAS;AAClC,4BAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACvD,4BAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,GAAG,GAAG,kBAAkB;AAAA,kBAC3D,CAAC;AACD;AAAA,gBACF,KAAK;AACH,0BAAQ,IAAI,CAAC,GAAG,IAAI,UAAU,QAAQ,EAAE,KAAK,GAAG,GAAG,kBAAkB;AACrE;AAAA,cAAA;AAAA,YAEN,CAAC;AAAA,UACH;AACA,kBAAQ,QAAQ,CAAC,aAAa,0BAA0B;AACtD,kBAAM,CAAC,cAAc,MAAM,IAAI,sBAAsB,MAAM,GAAG;AAI9D,gBACE,OAAO,IAAI,YAAY,MAAM,eAC7B,CAACA,+BAAS,IAAI,YAAY,CAAC,KAC3B,OAAO,IAAI,YAAY,EAAE,MAAM,MAAM,eACrC,CAACA,oBAAAA,WAAS,IAAI,YAAY,EAAE,MAAM,CAAC;AAEnC,qBAAO;AACT,gBAAI,CAAC,MAAM,QAAQ,IAAI,YAAY,EAAE,MAAM,EAAE,QAAQ,GAAG;AACtD,kBAAI,YAAY,EAAE,MAAM,EAAE,WAAW,CAAA;AAAA,YACvC;AACA,gBAAI,YAAY,EAAE,MAAM,EAAE,SAAS,KAAK;AAAA,cACtC,CAAC,IAAI,GAAG,GAAG;AAAA,YAAA,CACZ;AAAA,UACH,CAAC;AAAA,QACH,CAAC;AACD2G,2DAAsB,QAAQ,CAAC,SAAS;AACtC,cAAI,KAAK,MAAM,OAAO,SAAS,IAAI,KAAK,gBAAgB,QAAQ,OAAO,SAAS,IAAI,GAAG;AACrF,oBAAQ,MAAA;AAAA,cACN,KAAK;AACH,uBAAO,IAAI,GAAG,IAAI,cAAc;AAChC,uBAAO,IAAI,GAAG,IAAI,cAAc;AAChC,uBAAO,IAAI,IAAI,GAAG;AAClB;AAAA,cACF,KAAK;AACH,uBAAO,IAAI,GAAG,IAAI,eAAe;AACjC,uBAAO,IAAI,IAAI,GAAG;AAClB;AAAA,cACF,KAAK;AACH,uBAAO,IAAI,GAAG,IAAI,QAAQ,GAAG;AAC7B,uBAAO,IAAI,GAAG,IAAI,aAAa;AAC/B;AAAA,cACF,KAAK;AACH,uBAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM;AACrC,sBAAI,IAAI,WAAW,GAAG,IAAI,SAAS,GAAG;AACpC,2BAAO,IAAI,GAAG,GAAG;AAAA,kBACnB;AAAA,gBACF,CAAC;AACD;AAAA,cACF,KAAK;AACH,uBAAO,IAAI,IAAI,GAAG;AAClB,uBAAO,IAAI,IAAI,GAAG;AAClB,uBAAO,IAAI,GAAG,IAAI,QAAQ,GAAG;AAC7B,uBAAO,IAAI,GAAG,IAAI,QAAQ,GAAG;AAC7B,uBAAO,IAAI,GAAG,IAAI,eAAe;AACjC;AAAA,cACF,KAAK;AACH,uBAAO,IAAI,GAAG,IAAI,QAAQ,GAAG;AAC7B,uBAAO,IAAI,GAAG,IAAI,QAAQ,GAAG;AAC7B,uBAAO,IAAI,GAAG,IAAI,eAAe,GAAG;AACpC,uBAAO,IAAI,GAAG,IAAI,eAAe,GAAG;AACpC,uBAAO,IAAI,GAAG,IAAI,oBAAoB;AACtC;AAAA,cACF,KAAK;AACH,uBAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,MAAM;AACrC,sBAAI,IAAI,WAAW,GAAG,IAAI,SAAS,GAAG;AACpC,2BAAO,IAAI,GAAG,GAAG;AACjB,2BAAO,IAAI,GAAG,GAAG;AAAA,kBACnB;AAAA,gBACF,CAAC;AACD;AAAA,cACF,KAAK;AACH,uBAAO,IAAI,GAAG,IAAI,QAAQ,GAAG;AAC7B;AAAA,YAAA;AAAA,UAEN;AAAA,QACF,CAAC;AACD,eAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,QAAQ;AAChC,cAAI3G,+BAAS,IAAI,GAAG,CAAC,KAAK,OAAO,KAAK,IAAI,GAAG,CAAC,EAAE,WAAW,GAAG;AAC5D,mBAAO,IAAI,GAAG;AAAA,UAChB;AAAA,QACF,CAAC;AACD,eAAO,QAAQ,gBAAgB,QAAQ,UAAU,EAAE;AAAA,UACjD,CAAC,CAAC,uBAAuB,sBAAsB,MAAM;AACnD,kBAAM,CAAC,QAAQ,YAAY,IAAI,sBAAsB,MAAM,GAAG;AAC9D,gBAAI,CAACwH,6BAAAA,oBAAoB,SAAS,OAAO,YAAA,CAAoB,EAAG;AAChE,kBAAM,wBAAwB,OAAO,YAAA;AACrC,kBAAM,UAAU,GAAG,IAAI,IAAI,YAAY,GAAG,QAAQ,MAAM,GAAG;AAC3D,kBAAM,SAAS,KAAK;AAAA,cAClB;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAEF,kBAAM,oCAAoC,KAAK,MAAM,SAClD;AAAA,cACC,CAAC,QACC,IAAI,sBAAsB,QAC1B,OAAO,KAAK,IAAI,iBAAiB,EAAE,SAAS,OAAO;AAAA,YAAA,EAEtD,IAAI,CAAC,SAAS;AAAA,cACb,KAAK,IAAI;AAAA,cACT,aAAaxH,oBAAAA,WAAS,IAAI,iBAAiB,IACvC,IAAI,kBAAkB,OAA6C,IACnE,IAAI;AAAA,YAAA,EACR,EACD,OAAO,CAAC,QAAQ,IAAI,gBAAgB,KAAK;AAC5C,gBAAI,kCAAkC,SAAS,GAAG;AAChD,kBAAI,CAAC,OAAO,UAAU;AACpB,uBAAO,WAAW,CAAA;AAAA,cACpB;AACA,gDAAkC,QAAQ,CAAC,QAAQ;AACjD,oBAAI,IAAI,gBAAgB,MAAO;AAC/B,uBAAO,SAAU,KAAK;AAAA,kBACpB,CAAC,IAAI,GAAG,GAAG,IAAI,gBAAgB,OAAO,CAAA,IAAK,IAAI;AAAA,gBAAA,CAChD;AAAA,cACH,CAAC;AAAA,YACH;AACA,gBAAI,CAAC,IAAI,OAAO,EAAG,KAAI,OAAO,IAAI,CAAA;AAClC,gBAAI,CAAC,IAAI,OAAO,EAAE,qBAAqB,EAAG,KAAI,OAAO,EAAE,qBAAqB,IAAI;AAAA,UAClF;AAAA,QAAA;AAAA,MAEJ;AAAA,MACA,EAAE,aAAa,GAAA;AAAA,IAAG;AAEpB,WAAO,QAAQ,KAAK,MAAM,UAAU,EAAE;AAAA,MACpC,CAAC,CAAC,uBAAuB,sBAAsB,MAAM;AACnD,cAAM,CAAC,QAAQ,YAAY,IAAI,sBAAsB,MAAM,GAAG;AAC9D,YAAI,CAACwH,6BAAAA,oBAAoB,SAAS,OAAO,YAAA,CAAoB,EAAG;AAChE,cAAM,wBAAwB,OAAO,YAAA;AACrC,cAAM,UAAU;AAChB,cAAM,SAAS,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,cAAM,oCAAoC,KAAK,MAAM,SAClD;AAAA,UACC,CAAC,QACC,IAAI,sBAAsB,QAC1B,OAAO,KAAK,IAAI,iBAAiB,EAAE,SAAS,qBAAqB;AAAA,QAAA,EAEpE,IAAI,CAAC,SAAS;AAAA,UACb,KAAK,IAAI;AAAA,UACT,aAAaxH,oBAAAA,WAAS,IAAI,iBAAiB,IACvC,IAAI,kBAAkB,OAA6C,IACnE,IAAI;AAAA,QAAA,EACR,EACD,OAAO,CAAC,QAAQ,IAAI,gBAAgB,KAAK;AAC5C,YAAI,kCAAkC,SAAS,GAAG;AAChD,cAAI,CAAC,OAAO,UAAU;AACpB,mBAAO,WAAW,CAAA;AAAA,UACpB;AACA,4CAAkC,QAAQ,CAAC,QAAQ;AACjD,gBAAI,IAAI,gBAAgB,MAAO;AAC/B,mBAAO,SAAU,KAAK;AAAA,cACpB,CAAC,IAAI,GAAG,GAAG,IAAI,gBAAgB,OAAO,CAAA,IAAK,IAAI;AAAA,YAAA,CAChD;AAAA,UACH,CAAC;AAAA,QACH;AACA,YAAI,CAAC,IAAI,OAAO,EAAG,KAAI,OAAO,IAAI,CAAA;AAClC,YAAI,CAAC,IAAI,OAAO,EAAE,qBAAqB,EAAG,KAAI,OAAO,EAAE,qBAAqB,IAAI;AAAA,MAClF;AAAA,IAAA;AAEF,UAAM,0BAA0ByH,6BAAAA,0BAAA,EAA4B,IAAI,CAAC,OAAO;AAAA,MACtE,CAAC,EAAE,UAAU,GAAG;AAAA,QACd,MAAM,0BAA0B,OAAO,UAAU,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AAAA,MAAA;AAAA,IAC1E,EACA;AACF,WAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM,UAAU,MAAM;AAClD,aAAO,QAAQ,UAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,SAAS,MAAM;AAC3D,YAAIzH,oBAAAA,WAAS,SAAS,GAAG;AACvB,cAAI,KAAK,MAAM,aAAa;AAC1B,gBAAI,CAAC,UAAU,WAAW;AACxB,wBAAU,YAAY,CAAA;AAAA,YACxB;AACA,sBAAU,YAAYE,MAAAA;AAAAA,cACpB,UAAU;AAAA,cACV,GAAG;AAAA,YAAA;AAGL,gBAAI,IAAI,EAAE,MAAM,IAAI;AAAA,UACtB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,WAAO,OAAO;AAAA,MACZ,CAAA;AAAA,MACA,GAAG,OAAO,QAAQ,GAAG,EAClB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EACrC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO;AAAA,QAChB,CAAC,CAAC,GAAG,OAAO;AAAA,UACV,CAAA;AAAA,UACA,GAAG,OAAO,QAAQ,CAAE,EACjB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM;AAClB,kBAAM,SAAS,oBAAoB,CAAqC;AACxE,kBAAM,SAAS,oBAAoB,CAAqC;AACxE,gBAAI,CAAC,UAAU,CAAC,OAAQ,QAAO,EAAE,cAAc,CAAC;AAChD,mBAAO,SAAS;AAAA,UAClB,CAAC,EACA,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,KAAK;AAAA,QAAA;AAAA,MACrC,EACA;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,MAAM,cAAyD;AAC7D,UAAM,6BAA6B;AAAA,MACjC,MAAM;AAAA,MACN,OAAO;AAAA,QACL,aAAa;AAAA,QACb,MAAM;AAAA,QACN,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,aAAa;AAAA,YACb,SAAS;AAAA,UAAA;AAAA,QACX;AAAA,QAEF,sBAAsB;AAAA,QACtB,UAAU,CAAC,MAAM;AAAA,MAAA;AAAA,MAEnB,aAAa;AAAA,IAAA;AAGf,UAAM,MAAkC;AAAA,MACtC,SAAS,CAAA;AAAA,MACT,eAAe;AAAA,QACb,iCAAiC;AAAA,UAC/B,aACE;AAAA,UACF,SAAS;AAAA,YACP,oBAAoB;AAAA,cAClB,QAAQ;AAAA,cACR,SAAS,KAAK;AAAA,gBACZ,CAAC,EAAE,MAAM,IAAA,GAAO,EAAE,MAAM,KAAK,YAAY,MAAA,GAAS,EAAE,MAAM,KAAK;AAAA,gBAC/D;AAAA,gBACA;AAAA,cAAA;AAAA,YACF;AAAA,YAEF,qCAAqC;AAAA,cACnC,QAAQ;AAAA,cACR,SAAS,GAAG,UAAU;AAAA,gBACpB,EAAE,MAAM,IAAA;AAAA,gBACR,EAAE,MAAM,KAAK,YAAY,MAAA;AAAA,gBACzB,EAAE,MAAM,IAAA;AAAA,cAAI,CACb;AAAA,YAAA;AAAA,YAEH,uBAAuB;AAAA,cACrB,QAAQ;AAAA,cACR,SAAS,CAAC,EAAE,MAAM,OAAO,EAAE,MAAM,KAAK,YAAY,MAAA,GAAS,EAAE,MAAM,KAAK;AAAA,YAAA;AAAA,YAE1E,sBAAsB;AAAA,cACpB,QAAQ;AAAA,cACR,SAASiG,6BAAAA,KAAK,UAAU;AAAA,gBACtB,EAAE,MAAM,IAAA;AAAA,gBACR,EAAE,MAAM,KAAK,YAAY,MAAA;AAAA,gBACzB,EAAE,MAAM,IAAA;AAAA,cAAI,CACb;AAAA,YAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEF,QAAI,KAAK,MAAM,aAAa;AAC1B,UAAI,CAAC,IAAI,WAAW;AAClB,YAAI,YAAY,CAAA;AAAA,MAClB;AACA,YAAM,iBAA8D,CAAA;AACpE,YAAM,aAAasB,6BAAAA,0BAAA;AACnB,iBAAW,QAAQ,CAAC,SAAS;AAC3B,cAAM,MAAM,OAAO,UAAU,CAAC,SAAS,IAAI,EAAE,KAAK,GAAG,CAAC;AACtD,cAAM,kBAA6C;AAAA,UACjD,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,UAAU,CAAC,UAAU,QAAQ,SAAS;AAAA,YACtC,YAAY;AAAA,cACV,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,MAAM,CAAC,IAAI;AAAA,gBACX,SAAS;AAAA,gBACT,aAAa;AAAA,cAAA;AAAA,cAEf,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,aACE;AAAA,cAAA;AAAA,cAEJ,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,aAAa;AAAA,cAAA;AAAA,cAEf,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,aAAa;AAAA,cAAA;AAAA,cAEf,SAAS;AAAA,gBACP,aAAa;AAAA,gBACb,MAAM;AAAA,gBACN,OAAO;AAAA,kBACL,aACE;AAAA,kBACF,MAAM;AAAA,kBACN,UAAU,CAAC,QAAQ,SAAS;AAAA,kBAC5B,YAAY;AAAA,oBACV,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,aACE;AAAA,oBAAA;AAAA,oBAEJ,SAAS;AAAA,sBACP,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,aAAa;AAAA,oBAAA;AAAA,oBAEf,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,aACE;AAAA,oBAAA;AAAA,oBAEJ,SAAS;AAAA,sBACP,MAAM;AAAA,sBACN,SAAS,CAAA;AAAA,sBACT,aAAa;AAAA,sBACb,sBAAsB;AAAA,oBAAA;AAAA,kBACxB;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEF,uBAAe,GAAG,IAAI;AAAA,UACpB,aAAaC,6BAAAA,kBAAkB,IAAI;AAAA,UACnC,SAAS,KAAK,6BAA6B,KAAK,MAAM,OAAO;AAAA,UAC7D,SAAS;AAAA,YACP,oBAAoB;AAAA,YACpB,qCAAqC;AAAA,YACrC,uBAAuB;AAAA,YACvB,sBAAsB;AAAA,UAAA;AAAA,QACxB;AAAA,MAEJ,CAAC;AACD,UAAI,YAAYxH,MAAAA,UAAU,IAAI,WAAW,cAAc;AAAA,IACzD;AACA,UAAM,oBAAoB,MAAM,KAAK,KAAK,QAAQ,SAAS;AAC3D,UAAM;AAAA,MACJ;AAAA,MACA,OAAO,CAAC,SAAS,KAAK,MAAM;AAC1B,YAAI,CAACD,gBAAAA,mBAAmB,KAAK,EAAG;AAChC,cAAM,WAAW,KAAK,kBAAkB,IAAI,KAAK;AACjD,cAAM,MAAM,MAAM;AAClB,YAAI,YAAY,KAAK;AACnB,cAAI,UAAU,IAAI,WAAW,CAAA;AAC7B,cAAI,QAAQ,GAAG,IAAI;AAAA,QACrB;AAAA,MACF;AAAA,MACA;AAAA,QACE,aAAa;AAAA,MAAA;AAAA,IACf;AAEF,UAAM,kBAAqE,CAAA;AAC3E,SAAK,MAAM,SAAS,QAAQ,CAAC,QAAQ;AACnC,sBAAgB,IAAI,GAAG,IAAI,IAAI;AAAA,IACjC,CAAC;AACD,QAAI,kBAAkB;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAqD;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAA6C;AACjD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAA6D;AACjE,WAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC;AAAA,EAEA,MAAM,gCAAgC,KAA+C;AACnF,UAAM,CAAC,SAAS,MAAM,SAAS,OAAO,YAAY,UAAU,MAAM,YAAY,IAC5E,MAAM,QAAQ,IAAI;AAAA,MAChB,KAAK,SAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,SAAS,GAAG;AAAA,MACjB,KAAK,OAAO,GAAG;AAAA,MACf,KAAK,YAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,cAAA;AAAA,IAAc,CACpB;AACH,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,aAAa,KAAiC;AAClD,UAAM,OAAO,MAAM,KAAK,gCAAgC,GAAG;AAC3D,WAAO,IAAI,SACR,OAAO,gBAAgB,kBAAkB,EACzC,OAAO,GAAG,EACV,KAAK,KAAK,UAAU,MAAM0F,SAAO,CAAC;AAAA,EACvC;AAAA,EAEA,MAAM,aAAa,KAAiC;AAClD,UAAM,OAAO,MAAM,KAAK,gCAAgC,GAAG;AAC3D,WAAO,IAAI,SACR,OAAO,gBAAgB,oBAAoB,EAC3C,OAAO,GAAG,EACV,KAAKQ,6BAAAA,KAAK,UAAU,MAAMR,SAAO,CAAC;AAAA,EACvC;AAAA,EAEA,MAAM,QAAQ,QAAmC,KAAiC;AAChF,YAAQ,QAAA;AAAA,MACN,KAAK;AACH,eAAO,MAAM,KAAK,aAAa,GAAG;AAAA,MACpC;AACE,eAAO,MAAM,KAAK,aAAa,GAAG;AAAA,IAAA;AAAA,EAExC;AACF;ACl8EA,MAAM,2CAAiF;AAAA,EACrF,YAAY,CAAA;AAAA,EACZ,QAAQ,CAAA;AAAA,EACR,YAAY,CAAA;AAAA,EACZ,SAAS,CAAA;AAAA,EACT,kBAAkB,CAAA;AAAA,EAClB,oBAAoB,CAAA;AAAA,EACpB,UAAU,CAAA;AAAA,EACV,UAAU,CAAA;AACZ;AAEA,MAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,sBAAsBpF,IAAAA,IAAI,SAAA,EAA0B,SAAA;AAE1D,MAAM,0CAA0CA,IAAAA,IAAI,OAA0C;AAAA,EAC5F,OAAOA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EACpB,aAAaA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,EAC1B,SAAS;AAAA,EACT,sBAAsBmF,8BAA8B,SAAA;AAAA,EACpD,uBAAuBA,8BAA8B,SAAA;AAAA,EACrD,MAAMnF,IAAAA,IAAI,aAAaA,IAAAA,IAAI,UAAUA,IAAAA,IAAI,MAAA,EAAQ,MAAMA,IAAAA,IAAI,OAAA,CAAQ,CAAC,EAAE,SAAA;AACxE,CAAC;AAED,MAAM,4CAA4CA,IAAAA,IAAI,aAEpD,qBAAqB,uCAAuC;AAE9D,MAAM,uDAAuDA,IAAAA,IAAI;AAAA,EAC/DA,IAAAA,IAAI,SAAA;AAAA,EACJA,IAAAA,IACG,OAAO;AAAA,IACN,MAAMA,IAAAA,IAAI,OAAA,EAAS,SAAA;AAAA,IACnB,MAAMA,IAAAA,IAAI,MAAA,EAAQ,SAAA;AAAA,EAAS,CAC5B,EACA,QAAQ,IAAI;AACjB;AAEA,MAAM,6CAA6CA,IAAAA,IAAI;AAAA,EACrD;AAAA,IACE,YAAYA,IAAAA,IACT;AAAA,MACC;AAAA,MACAA,QAAI,QAAQ,MAAM,oDAAoD;AAAA,IAAA,EAEvE,SAAA;AAAA,IACH,QAAQA,IAAAA,IACL,MAAA,EACA,MAAMA,IAAAA,IAAI,OAAA,EAAS,MAAM,GAAGqG,uDAA0B,CAAC,EACvD,SAAA;AAAA,IACH,YAAYrG,IAAAA,IACT,OAAA,EACA;AAAA,MACCA,IAAAA,IACG,aAAaA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,SAAS,SAAS,GAAG,qBAAqB,CAAC,EAC1E,MAAM,KAAK;AAAA,MACd;AAAA,IAAA,EAED;AAAA,MACC,OAAO,OAAO,CAAA,GAAI,GAAG,sBAAsB,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAGA,IAAAA,IAAI,UAAA,EAAU,EAAI,CAAC;AAAA,IAAA,EAE1F,OAAO,CAAC,OAAO,YAAY;AAC1B,YAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,YAAM,SAAS,KAAK,MAAM,CAAC,QAAQ,wCAAwC,KAAK,GAAG,CAAC;AACpF,UAAI,CAAC,QAAQ;AACX,eAAO,QAAQ,MAAM,aAAa;AAAA,MACpC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,IACH,SAASA,IAAAA,IAAI,OAAA,EAAS,QAAQA,IAAAA,IAAI,OAAA,GAAUA,IAAAA,IAAI,OAAA,CAAQ,EAAE,QAAQ,CAAA,CAAE;AAAA,IACpE,kBAAkBA,IAAAA,IACf,MAAA,EACA;AAAA,MACCA,IAAAA,IAAI;AAAA,QACFA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,QACtBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,QACtBA,IAAAA,IAAI,SAAA,EAAW,MAAM,CAAC;AAAA,QACtBA,QAAI,WAAW,MAAM,CAAC;AAAA,MAAA;AAAA,IACxB,EAED,SAAA,EACA,QAAQ,EAAE;AAAA,IACb,oBAAoBA,IAAAA,IACjB,MAAA,EACA;AAAA,MACCA,IAAAA,IAAI,aAAaA,QAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,GAAGA,IAAAA,IAAI,WAAW,MAAM,CAAC,CAAC;AAAA,IAAA,EAE3F,SAAA,EACA,QAAQ,EAAE;AAAA,IACb,UAAUA,IAAAA,IAAI,MAAA,EAAQ,MAAM,uBAAuB,EAAE,SAAA,EAAW,QAAQ,EAAE;AAAA,IAC1E,UAAU,sCAAsC,SAAA,EAAW,QAAQ,CAAA,CAAE;AAAA,EAAA;AAEzE;AAEO,MAAM,4CAA4C;AAAA,EAC9C;AAAA,EAED,YAAY,SAA+C;AACjE,SAAK,WAAW,OAAO,OAAOL,MAAAA,UAAU,CAAA,GAAI,OAAO,CAAC;AACpD,WAAO,eAAe,MAAM,cAAc;AAAA,MACxC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,UAAU;AAAA,MACpC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,cAAc;AAAA,MACxC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,WAAW;AAAA,MACrC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,oBAAoB;AAAA,MAC9C,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,sBAAsB;AAAA,MAChD,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,YAAY;AAAA,MACtC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AACD,WAAO,eAAe,MAAM,YAAY;AAAA,MACtC,KAAK,MAAM,KAAK,SAAS;AAAA,MACzB,YAAY;AAAA,MACZ,cAAc;AAAA,IAAA,CACf;AAAA,EACH;AAAA,EAWA,IAAI,KAAkB;AACpB,WAAO,IAAI,KAAK,KAAK,KAAK,UAAU,KAAK;AAAA,EAC3C;AAAA,EAEA,OAAc,KAAK,SAA+D;AAEhF,UAAM,EAAE,OAAO,mBAAA,IAAuBK,IAAAA,IAAI,OAAA,EAAS,QAAQ,IAAI,EAAE,WAAW,SAAS,SAAS;AAAA,MAC5F,YAAY;AAAA,IAAA,CACb;AACD,QAAI,oBAAoB;AACtB,YAAM,IAAIyG,SAAAA,qCAAqC,kBAAkB;AAAA,IACnE;AAEA,UAAM,gBAAgB9G,MAAAA,UAAU,0CAA0C,OAAO;AAEjF,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,IACL,2CAA2C,SAAS,eAAe;AAAA,MACrE,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAc;AAAA,IAAA,CACf;AACD,QAAI,qDAAqD;AACvD,YAAM,IAAI8G,SAAAA;AAAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AACA,UAAM,WAAW,IAAI;AAAA,MACnB;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AACF;AC1LA,MAAM,yBAAyB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGT,YACE,QACA,aACA,SACA;AACA,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,WAAW;AAChB,SAAK,mCAAmB,IAAA;AACxB,SAAK,QAAQ,gCAAgC,KAAK,KAAK,QAAQ;AAC/D,SAAK,YAAY,sCAAsC,KAAK,KAAK,YAAY;AAC7E,UAAM,qBAA6C,CAAA;AACnD,WAAO,oBAAoB,KAAK,SAAS,EAAE,QAAQ,CAAC,SAAS;AAC3D,YAAM,iBAAiB,KAAK,UAAU,IAAI;AAC1C,UAAI,0BAA0Bf,SAAAA,sBAAsB;AAClD,2BAAmB,KAAK,cAAc;AAAA,MACxC,WAAW,gBAAgB,OAAO,gBAAgB;AAChD,cAAM,eAAe,4CAA4C;AAAA,UAC/D,KAAK,aAAa,IAAW;AAAA,QAAA;AAE/B,cAAM,aAAa,IAAIqB;AAAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,QAAA;AAEb,aAAK,aAAa,IAAI,MAAM,UAAU;AAAA,MACxC;AAAA,IACF,CAAC;AACD,QAAI,mBAAmB,SAAS,GAAG;AACjC,YAAM,IAAIK,SAAAA,2CAA2C,kBAAkB;AAAA,IACzE;AACA,SAAK,SAAS,KAAK,QAAQ,MAAM,KAAK,eAAe,KAAK,IAAI,CAAC;AAC/D,QAAI,KAAK,MAAM,WAAW,KAAK;AAC7B,WAAK,OAAO,OAAO,KAAK,MAAM,MAAM;AAAA,IACtC;AACA,QAAI,MAAM,QAAQ,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,WAAW,SAAS,GAAG;AAC5E,WAAK,OAAO,IAAI,MAAM,KAAK,KAAK,MAAM,UAAU,CAAC;AAAA,IACnD,WAAW,CAAC,MAAM,QAAQ,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,YAAY;AACzE,WAAK,OAAO,IAAI,KAAK,MAAM,UAAiB;AAAA,IAC9C;AACA,QAAI,aAAa,OAAO,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,GAAG;AACzE,WAAK,OAAO,OAAO,KAAK,MAAM,MAAM;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,iBAAiB;AACf,SAAK,aAAa,QAAQ,CAAC,YAAY,SAAS;AAC9C,YAAM,kBAAkB,KAAK,QAC1B,MAAM,MAAM;AACX,YAAI,wBAAwB,KAAK,UAAU,iCAAiC,IAAI;AAChF,YAAI,gBAAgB,OAAO,uBAAuB;AAChD,kCAAwB,OAAO;AAAA,YAC7B,CAAC,GAAGhB,6BAAAA,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;AAAA,UAAA;AAAA,QAEvD;AACAA,2DAAsB,QAAQ,CAAC,SAAS;AACtC,gCAAuB,IAAI,IAAI,MAAM,QAAQ,sBAAuB,IAAI,CAAC,IACrE,sBAAuB,IAAI,IAC3B,gBAAgB,OAAO,sBAAuB,IAAI,IAChD,CAAA,IACA,CAAC,sBAAuB,IAAI,CAAC;AAAA,QACrC,CAAC;AACD,cAAM,yBAEF;AACJ,aAAK,QAAQ;AAAA,UACX;AAAA,UACA,KAAK,gBAAgB,KAAK,MAAM,KAAK,yBAAyB,KAAK,IAAI,CAAC;AAAA,QAAA;AAE1E,eAAO,QAAQ,WAAW,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,eAAe,QAAQ,MAAM;AACnF,gBAAM,CAAC,QAAQ,IAAI,IAAI,cAAc,MAAM,GAAG;AAC9C,cAAI,CAAC,UAAU,CAAC,KAAM;AACtB,kBAAQ,QAAA;AAAA,YACN,KAAK;AACH,kBAAI,oCAAoC,QAAQ,GAAG;AACjD,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC;AAAA,sBACzC;AAAA,sBACA;AAAA,sBACA,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,gBACF;AAAA,cAEJ,OAAO;AACL,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,kBAAA;AAAA,gBAC5E;AAAA,cAEJ;AACA;AAAA,YACF,KAAK;AACH,kBAAI,oCAAoC,QAAQ,GAAG;AACjD,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC;AAAA,sBACzC;AAAA,sBACA;AAAA,sBACA,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,gBACF;AAAA,cAEJ,OAAO;AACL,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,kBAAA;AAAA,gBAC5E;AAAA,cAEJ;AACA;AAAA,YACF,KAAK;AACH,kBAAI,oCAAoC,QAAQ,GAAG;AACjD,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC;AAAA,sBACzC;AAAA,sBACA;AAAA,sBACA,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,gBACF;AAAA,cAEJ,OAAO;AACL,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,kBAAA;AAAA,gBAC5E;AAAA,cAEJ;AACA;AAAA,YACF,KAAK;AACH,kBAAI,oCAAoC,QAAQ,GAAG;AACjD,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC;AAAA,sBACzC;AAAA,sBACA;AAAA,sBACA,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,gBACF;AAAA,cAEJ,OAAO;AACL,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,kBAAA;AAAA,gBAC5E;AAAA,cAEJ;AACA;AAAA,YACF,KAAK;AACH,kBAAI,oCAAoC,QAAQ,GAAG;AACjD,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC;AAAA,sBACzC;AAAA,sBACA;AAAA,sBACA,SAAS;AAAA,oBAAA;AAAA,kBACX;AAAA,gBACF;AAAA,cAEJ,OAAO;AACL,qBAAK,QAAQ;AAAA,kBACX;AAAA,kBACA,KAAK,gBAAgB;AAAA,oBACnB;AAAA,oBACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,kBAAA;AAAA,gBAC5E;AAAA,cAEJ;AACA;AAAA,YACF;AACE,oBAAM,IAAIiB,SAAAA,gCAAgC,CAAC,QAAQ,IAAI,CAAC;AAAA,UAAA;AAAA,QAE9D,CAAC;AACD,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,OAAO,KACnC,CAAC,WAAW,QAAQ,OAAO,SAAS,OAAO,GAC3C;AACA,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,gBAAgB,KAAK,UAAU,CAAC;AAAA,UAAA,EAE5E,IAAI,uBAAuB,OAAO,CAAQ;AAC7C,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,mBAAmB,KAAK,UAAU,CAAC;AAAA,UAAA,EAE/E,IAAI,uBAAuB,OAAO,CAAQ;AAC7C,eAAK,QAAQ;AAAA,YACX;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,oBAAoB,KAAK,UAAU,CAAC;AAAA,UAAA;AAAA,QAEnF;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,QAAQ,KACpC,CAAC,WAAW,QAAQ,OAAO,SAAS,QAAQ,GAC5C;AACA,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,iBAAiB,KAAK,UAAU,CAAC;AAAA,UAAA,EAE7E,IAAI,uBAAuB,QAAQ,CAAQ;AAC9C,eAAK,QAAQ;AAAA,YACX;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,qBAAqB,KAAK,UAAU,CAAC;AAAA,UAAA;AAAA,QAEpF;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,QAAQ,KACpC,CAAC,WAAW,QAAQ,OAAO,SAAS,QAAQ,GAC5C;AACA,eAAK,QAAQ;AAAA,YACX;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,qBAAqB,KAAK,UAAU,CAAC;AAAA,UAAA;AAAA,QAEpF;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,YAAY,KACxC,CAAC,WAAW,QAAQ,OAAO,SAAS,YAAY,GAChD;AACA,eAAK,QAAQ;AAAA,YACX;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,yBAAyB,KAAK,UAAU,CAAC;AAAA,UAAA;AAAA,QAExF;AACA,YAAI,CAAC,KAAK,MAAM,OAAO,SAAS,MAAM,KAAK,CAAC,WAAW,QAAQ,OAAO,SAAS,MAAM,GAAG;AACtF,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,eAAe,KAAK,UAAU,CAAC;AAAA,UAAA,EAE3E,IAAI,uBAAuB,MAAM,CAAQ;AAAA,QAC9C;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,aAAa,KACzC,CAAC,WAAW,QAAQ,OAAO,SAAS,aAAa,GACjD;AACA,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,sBAAsB,KAAK,UAAU,CAAC;AAAA,UAAA,EAElF,IAAI,uBAAuB,aAAa,CAAQ;AACnD,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB;AAAA,cACnB;AAAA,cACA,WAAW,8BAA8B,KAAK,UAAU;AAAA,YAAA;AAAA,UAC1D,EAED,IAAI,uBAAuB,aAAa,CAAQ;AACnD,eAAK,QAAQ;AAAA,YACX;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,0BAA0B,KAAK,UAAU,CAAC;AAAA,UAAA;AAAA,QAEzF;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,YAAY,KACxC,CAAC,WAAW,QAAQ,OAAO,SAAS,YAAY,GAChD;AACA,eAAK,QACF,IAAI,UAAU,WAAW,qBAAqB,KAAK,UAAU,CAAC,EAC9D,IAAI,uBAAuB,YAAY,CAAQ;AAClD,eAAK,QACF,IAAI,eAAe,WAAW,qBAAqB,KAAK,UAAU,CAAC,EACnE,IAAI,uBAAuB,YAAY,CAAQ;AAClD,eAAK,QACF,MAAM,UAAU,WAAW,qBAAqB,KAAK,UAAU,CAAC,EAChE,IAAI,uBAAuB,YAAY,CAAQ;AAClD,eAAK,QACF,MAAM,eAAe,WAAW,qBAAqB,KAAK,UAAU,CAAC,EACrE,IAAI,uBAAuB,YAAY,CAAQ;AAAA,QACpD;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,aAAa,KACzC,CAAC,WAAW,QAAQ,OAAO,SAAS,aAAa,GACjD;AACA,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,sBAAsB,KAAK,UAAU,CAAC;AAAA,UAAA,EAElF,IAAI,uBAAuB,aAAa,CAAQ;AACnD,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,sBAAsB,KAAK,UAAU,CAAC;AAAA,UAAA,EAElF,IAAI,uBAAuB,aAAa,CAAQ;AAAA,QACrD;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,QAAQ,KACpC,CAAC,WAAW,QAAQ,OAAO,SAAS,QAAQ,GAC5C;AACA,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,iBAAiB,KAAK,UAAU,CAAC;AAAA,UAAA,EAE7E,IAAI,uBAAuB,QAAQ,CAAQ;AAC9C,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,iBAAiB,KAAK,UAAU,CAAC;AAAA,UAAA,EAE7E,IAAI,uBAAuB,QAAQ,CAAQ;AAC9C,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,iBAAiB,KAAK,UAAU,CAAC;AAAA,UAAA,EAE7E,IAAI,uBAAuB,QAAQ,CAAQ;AAAA,QAChD;AACA,YACE,CAAC,KAAK,MAAM,OAAO,SAAS,QAAQ,KACpC,CAAC,WAAW,QAAQ,OAAO,SAAS,QAAQ,GAC5C;AACA,eAAK,QACF;AAAA,YACC;AAAA,YACA,KAAK,gBAAgB,KAAK,MAAM,WAAW,iBAAiB,KAAK,UAAU,CAAC;AAAA,UAAA,EAE7E,IAAI,uBAAuB,QAAQ,CAAQ;AAAA,QAChD;AAAA,MACF,CAAC,EACA,OAAO,IAAI;AACd,UAAI,WAAW,QAAQ,YAAY;AACjC,YACE,MAAM,QAAQ,WAAW,QAAQ,UAAU,KAC3C,WAAW,QAAQ,WAAW,SAAS,GACvC;AACA,0BAAgB,IAAI,MAAM,KAAK,WAAW,QAAQ,UAAU,CAAC;AAAA,QAC/D,WAAW,CAAC,MAAM,QAAQ,WAAW,QAAQ,UAAU,KAAK,WAAW,QAAQ,YAAY;AACzF,0BAAgB,IAAI,WAAW,QAAQ,UAAiB;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,KAAK,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC,eAAe,QAAQ,MAAM;AAC3E,YAAM,CAAC,QAAQ,IAAI,IAAI,cAAc,MAAM,GAAG;AAC9C,UAAI,CAAC,UAAU,CAAC,KAAM;AACtB,UAAI,oCAAoC,QAAQ,GAAG;AACjD,aAAK,QAAQ,MAAM,EAAE,MAAM,KAAK,gBAAgB,KAAK,MAAM,SAAS,OAAO,CAAC;AAAA,MAC9E,OAAO;AACL,aAAK,QAAQ,MAAM,EAAE,MAAM,KAAK,gBAAgB,KAAK,MAAM,QAAQ,CAAC;AAAA,MACtE;AAAA,IACF,CAAC;AACD,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,gBAAgB,KAAK,MAAM,KAAK,yBAAyB,KAAK,IAAI,CAAC;AAAA,IAAA;AAE1E,SAAK,QAAQ,IAAI,KAAK,KAAK,4BAA4B,KAAK,IAAI,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,gBAAgB,UAAyB,KAAkB;AAC/D,QAAI;AACJ,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA,IACtC,WAAW,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAC3D,YAAM,CAAC,2BAA2B,MAAM,IAAI;AAC5C,UACE,UAAU,6BACV,OAAO,0BAA0B,MAAM,MAAM,YAC7C;AAEA,eAAO,OAAO,MAAM,MAAM,0BAA0B,MAAM,EAAE,CAAC;AAAA,MAC/D,OAAO;AAEL,cAAM,qBAAqB,0BAAA;AAC3B,YAAI,OAAO,mBAAmB,MAAM,MAAM,YAAY;AACpD,iBAAO,OAAO,MAAM,MAAM,mBAAmB,MAAM,EAAE,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAM;AACX,QAAI;AACF,YAAM,KAAK,GAAG;AAAA,IAChB,SAAS,OAAO;AACd,UAAI,KAAK,MAAM,eAAeb,6BAAAA,2BAA2B,aAAa,GAAG,GAAG;AAC1E,eAAO,MAAMA,6BAAAA,2BAA2B,OAAO,OAAO,KAAK;AAAA,UACzD,uBAAuB,KAAK,MAAM;AAAA,UAClC,sBAAsB,KAAK,MAAM;AAAA,UACjC,aAAa,KAAK,MAAM;AAAA,UACxB,SAAS,KAAK,MAAM;AAAA,UACpB,WAAW,KAAK,MAAM;AAAA,UACtB,OAAO,KAAK,MAAM;AAAA,UAClB,QAAQ;AAAA,UACR,SAAS,KAAK,MAAM;AAAA,QAAA,CACrB;AAAA,MACH,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,sCACJ,YACA,UACA,KACA;AACA,UAAM,WAA2C,WAAW,2BAA2B;AAAA,MACrF;AAAA,MACA;AAAA,IAAA;AAEF,UAAMc,0DAAuB,IAAI,EAAE,SAAA,GAAY,YAAY;AACzD,UAAI,OAAO,aAAa,YAAY;AAClC,cAAM,SAAS,GAAG;AAAA,MACpB,WAAW,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAC3D,cAAM,CAAC,2BAA2B,MAAM,IAAI;AAC5C,YACE,UAAU,6BACV,OAAO,0BAA0B,MAAM,MAAM,YAC7C;AAEA,gBAAM,0BAA0B,MAAM,EAAE,GAAG;AAAA,QAC7C,OAAO;AAEL,gBAAM,qBAAqB,0BAAA;AAC3B,cAAI,OAAO,mBAAmB,MAAM,MAAM,YAAY;AACpD,kBAAM,mBAAmB,MAAM,EAAE,GAAG;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,yBAAyB,KAAkB;AAC/C,WAAO,MAAM,gCAAgC;AAAA,MAC3C;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAAA,EAET;AAAA,EAEA,MAAM,4BAA4B,KAAkB;AAClD,UAAM,UAAU7B,6BAAAA,iBAAiB,GAAG;AACpC,QAAI,YAAY,QAAQ;AACtB,aAAO,MAAM,KAAK,gCAAgC,GAAG;AAAA,IACvD;AACA,UAAM,EAAE,SAAS,QAAQ,MAAM,OAAO,6BAA6B;AACnE,UAAM,UAAU,IAAI;AAAA,MAClB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,IAAA;AAEF,UAAM,QAAQ,KAAK,GAAG;AACtB,WAAO,MAAM,QAAQ,QAAQ,SAAS,GAAG;AAAA,EAC3C;AAAA,EAEA,MAAM,gCAAgC,KAAkB;AACtD,UAAM,OAAO,uIAAuI,KAAK,MAAM,KAAK,KAAK,uTAAsT,KAAK,UAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAChgB,QAAI,SAAS,KAAK,WAAW;AAC7B,QAAI,SAAS,OAAO,GAAG;AACvB,QAAI,SAAS,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAc,KACZ,QACA,aACA,SACY;AACZ,UAAM,WAAW,IAAI,yBAAyB,QAAQ,aAAa,OAAO;AAC1E,WAAO,SAAS;AAAA,EAClB;AACF;AAEO,MAAM,yBAAiD,SAE5D,QACA,UAA6C,IACjC;AACZ,SAAO,yBAAyB,KAAK,MAAM,QAAQ,OAAO;AAC5D;AAQO,MAAM,mDAAmD,IAC3D,SACAsB,6BAA2B,iDAAiD,GAAG,IAAI;AC5iBjF,MAAM,qBAAqB,CAAC,SAA2B;AAC5D,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK;AAC3D,WAAO;AAAA,EACT;AAMA,QAAM,wBAAwB;AAE9B,SAAO,sBAAsB,KAAK,IAAI;AACxC;AAEO,MAAM,iBAAiB,OAC5B,OACA,OACA,KACA,QACiE;AACjE,QAAM,YAAsB,CAAA;AAC5B,MAAI,OAAO,MAAM,SAAS,MAAM,UAAU;AACxC,cAAU;AAAA,MACR,GAAG,MAAM,SAAS,EACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAA,CAAM,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAAA;AAAA,EAEjC,WAAW,MAAM,QAAQ,MAAM,SAAS,CAAC,GAAG;AAC1C,cAAU,KAAK,GAAG,MAAM,SAAS,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,KAAA,CAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,EAC7F;AACA,QAAM,aAAa,MAAM,MAAM,uBAAuB,KAAK,KAAK,MAAM;AACtE,QAAM,WACJ,CAACtH,+BAAS,UAAU,KAAK,EAAE,gBAAgB,eAAe,CAACA,oBAAAA,WAAS,WAAW,UAAU,IACrF,CAAA,IACA,OAAO,KAAK,WAAW,UAAU;AACvC,MAAI,EAAE,aAAa,QAAQ;AAGzB,UAAM,oBAAoB,IAAI;AAAA,MAC5B,MAAM,KAAK,MAAM,0BAA0B,KAAA,CAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAA,CAAa;AAAA,IAAA;AAE/E,UAAM,eAAe,SAAS,OAAO,CAAC,MAAM,CAAC,kBAAkB,IAAI,OAAO,CAAC,EAAE,YAAA,CAAa,CAAC;AAC3F,QAAI,CAAC,aAAa,SAAS,MAAM,UAAU,GAAG;AAC5C,mBAAa,QAAQ,MAAM,UAAU;AAAA,IACvC;AACA,WAAO,EAAE,OAAO,cAAc,WAAW,KAAA;AAAA,EAC3C;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,EAAE,OAAO,QAAW,WAAW,MAAA;AAAA,EACxC;AACA,MAAI,UAAU,SAAS,GAAG,GAAG;AAE3B,WAAO,EAAE,OAAO,SAAS,OAAO,CAAC,MAAM,MAAM,MAAM,UAAU,GAAG,WAAW,KAAA;AAAA,EAC7E;AACA,QAAM,QAAQ,UAAU,OAAO,CAAC,MAAM,SAAS,SAAS,CAAC,CAAC;AAC1D,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,OAAO,QAAW,WAAW,MAAA;AAAA,EACxC;AACA,MAAI,CAAC,MAAM,SAAS,MAAM,UAAU,GAAG;AACrC,UAAM,QAAQ,MAAM,UAAU;AAAA,EAChC;AACA,SAAO,EAAE,OAAO,WAAW,MAAM,WAAW,SAAS,SAAS,EAAA;AAChE;AAEO,MAAM,iBAAiB,CAAC,UAAqD;AAClF,QAAM,YAAsB,CAAA;AAC5B,MAAI,OAAO,MAAM,SAAS,MAAM,UAAU;AACxC,cAAU;AAAA,MACR,GAAG,MAAM,SAAS,EACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAA,CAAM,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,IAAA;AAAA,EAEjC,WAAW,MAAM,QAAQ,MAAM,SAAS,CAAC,GAAG;AAC1C,cAAU,KAAK,GAAG,MAAM,SAAS,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,KAAA,CAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,EAC7F;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,EACF;AACA,SAAO;AACT;AAEO,MAAM,yBAAyB,CACpC,SACA,YACA,aAA8B,qBACtB;AACR,MAAI,CAACA,oBAAAA,WAAS,OAAO,GAAG;AACtB,WAAO;AAAA,EACT;AACA,MAAI,cAAc,cAAc,CAAC,MAAM,QAAQ,UAAU,GAAG;AAC1D,WAAO;AAAA,EACT;AACA,QAAM,MAAW,CAAA;AACjB,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,eAAW,OAAO,YAAY;AAC5B,UAAI,OAAO,SAAS;AAClB,YAAI,GAAG,IAAI,QAAQ,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO,OAAO,KAAK,OAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAgB,OAAwB,oBAAI,WAAoB;AAChG,MACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,KACpB,EAAE,iBAAiB,SACnB,EAAE,OAAO8H,QAAAA,WAAW,eAAe,iBAAiBA,QAAAA,SACpD;AACA,QAAK,MAAc,oBAAoB,MAAM;AAC3C,aAAO;AAAA,IACT;AACA,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,KAAK;AAEd,UAAM,SAAkC,CAAA;AACxC,eAAW,OAAO,OAAkC;AAClD,YAAM,eAAe,IAAI,WAAW,GAAG,IAAI,MAAM,IAAI,QAAQ,OAAO,IAAI;AACxE,aAAO,YAAY,IAAI,kBAAmB,MAAkC,GAAG,GAAG,IAAI;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,kBAAkB,MAAM,IAAI,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;ACtGO,MAAM,iCAAiC,CAAgC,QAAc;AAC1F,SAAO,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,MAAM,UAAU,MAAS,CAAC;AAC3F;AC6DA,MAAM,eAAe,CACnB,UACwC;AACxC,MAAI,MAAM,YAAY;AACpB,UAAM,aAAa;AACnB,UAAM,YAAY;AAClB,UAAM,gBAAgB;AAAA,EACxB;AACA,MAAI,MAAM,oBAAoB;AAC5B,QAAI,eAAe,MAAM,YAAY;AACnC,YAAM,aAAa;AAAA,IACrB;AAAA,EACF;AACA,MAAI,MAAM,aAAa,OAAO;AAC5B,UAAM,aAAa;AACnB,UAAM,aAAa;AACnB,UAAM,WAAW;AAAA,EACnB;AACA,MAAI,MAAM,eAAe,OAAO;AAC9B,UAAM,aAAa;AACnB,UAAM,WAAW;AAAA,EACnB;AACA,MAAI,MAAM,cAAc,OAAO;AAC7B,UAAM,gBAAgB;AAAA,EACxB;AACA,SAAO;AACT;AAEA,MAAM,8BAA8B,CAClC,iBACA,uBACA,gBACA,oBACY;AACZ,MAAI,CAAC,gBAAgB,aAAa,CAACC,gBAAAA,uBAAuB,eAAe,GAAG;AAC1E,WAAO;AAAA,EACT;AACA,MACE,CAACC,oBAAAA;AAAAA,IACC,sBAAsB;AAAA,IACtB;AAAA,IACA5E,YAAAA;AAAAA,EAAA,KAEF,CAAC4E,oBAAAA;AAAAA,IACC,sBAAsB;AAAA,IACtB;AAAA,IACA1E,YAAAA;AAAAA,EAAA,KAEF,CAAC0E,oBAAAA;AAAAA,IACC,sBAAsB;AAAA,IACtB;AAAA,IACA3E,YAAAA;AAAAA,EAAA,GAEF;AACA,WAAO;AAAA,EACT;AACA,MACG0E,gBAAAA,uBAAuB,cAAc,KAAK,eAAe,YAC1D,CAACA,gBAAAA,uBAAuB,eAAe,KACtCA,gBAAAA,uBAAuB,cAAc,KAAK,CAAC,gBAAgB,YAC5D,gBAAgB,WAChB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMA,MAAM,aAAa,CACjB,KACA,UACG;AACH,QAAM,MAAsB;AAAA,IAC1B,aAAa;AAAA,MACX,UAAU;AAAA,IAAA;AAAA,EACZ;AAEF,UAAQ,OAAO,OAAA;AAAA,IACb,KAAK;AACH,UAAI,YAAa,OAAO,QAAQ,SAAS;AACzC;AAAA,IACF,KAAK;AACH,UAAI,YAAa,MAAM;AACvB;AAAA,IACF,KAAK;AACH,UAAI,YAAa,SAAS;AAC1B;AAAA,EAAA;AAEJ,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;AAC5C,QAAI,aAAa;AAAA,MACf,cAAc,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI;AAAA,IAAA;AAAA,EAEjD;AACA,MAAI/H,oBAAAA,WAAS,KAAK,GAAG;AACnB,QAAI,SAAS;AAAA,MACX,eAAe,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAAA,IAAA;AAAA,EAEzE;AACA,SAAO;AACT;AAEA,MAAM,iCAAiC,CACrC,MACA,aAAmD,CAAA,GACnD,aAA4C,CAAA,MACzB;AACnB,QAAM,UAAU,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,WAAW,KAAK,KAAK,CAAC;AACvF,QAAM,MAAsB;AAAA,IAC1B,aAAa;AAAA,MACX,GAAG;AAAA,MACH,MAAM;AAAA,IAAA;AAAA,IAER,QAAQ,QAAQ,SAAS,IAAI,EAAE,eAAe,YAAY;AAAA,EAAA;AAE5D,SAAO,+BAA+B,GAAG;AAC3C;AAEO,MAAM,aAAa,IAAI,UAAoB;AAChD,QAAM,aAAuB,CAAA;AAC7B,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,QAAQ,KAAK,KAAA,EAAO,MAAM,YAAY;AAC5C,UAAM,QAAQ,CAAC,SAAS;AACtB,UAAI,KAAK,SAAS,MAAM,GAAG;AACzB,mBAAW,KAAK,UAAU;AAAA,MAC5B,OAAO;AACL,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACD,SAAO,OAAO,WAAW,WAAW,KAAK,GAAG,CAAC;AAC/C;AAcO,MAAM,qBAAqB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,MACA,aACA;AACA,SAAK,QAAQ;AACb,SAAK,eAAe;AACpB,SAAK,8BAAc,IAAA;AACnB,SAAK,2CAA2B,IAAA;AAChC,SAAK,wCAAwB,IAAA;AAC7B,SAAK,wCAAwB,IAAA;AAC7B,SAAK,yCAAyB,IAAA;AAC9B,SAAK,2CAA2B,IAAA;AAChC,SAAK,8CAA8B,IAAA;AACnC,SAAK,4CAA4B,IAAA;AAAA,EACnC;AAAA,EAEA,iBAAiB,MAA6B,YAAkD;AAC9F,QAAI,CAAC,YAAY;AACf,aAAO,CAAC,KAAK,MAAM,OAAO,SAAS,IAAI;AAAA,IACzC;AAEA,UAAM,mBAAmB,YAAY,SAAS,UAAU,CAAA;AACxD,WAAO,CAAC,KAAK,MAAM,OAAO,SAAS,IAAI,KAAK,CAAC,iBAAiB,SAAS,IAAW;AAAA,EACpF;AAAA,EAEA,MAAM,YACJ,KACA,KACA,OACA,gBACA;AACA,UAAM,YAAY,MAAM;AACxB,QAAI,CAAC,KAAK,QAAQ,IAAI,SAAS,GAAG;AAEhC,WAAK,QAAQ,IAAI,WAAW,KAAK;AAAA,IACnC;AACA,QAAI,CAAC,KAAK,kBAAkB,IAAI,KAAK,GAAG;AACtC,YAAM,gBAAgB,MAAM,MAAM,4BAA4B,KAAK,GAAG;AACtE,WAAK,kBAAkB,IAAI,OAAO,aAAa;AAAA,IACjD;AACA,QAAI,CAAC,KAAK,kBAAkB,IAAI,KAAK,KAAK,CAAC,KAAK,mBAAmB,IAAI,KAAK,GAAG;AAC7E,YAAM,CAAC,YAAY,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QAClD,MAAM,uBAAuB,KAAK,KAAK,MAAM;AAAA,QAC7C,MAAM,uBAAuB,KAAK,KAAK,OAAO;AAAA,MAAA,CAC/C;AACD,WAAK,kBAAkB,IAAI,OAAO,UAAU;AAC5C,WAAK,mBAAmB,IAAI,OAAO,WAAW;AAAA,IAChD,WAAW,CAAC,KAAK,kBAAkB,IAAI,KAAK,GAAG;AAC7C,YAAM,aAAa,MAAM,MAAM,uBAAuB,KAAK,KAAK,MAAM;AACtE,WAAK,kBAAkB,IAAI,OAAO,UAAU;AAAA,IAC9C,WAAW,CAAC,KAAK,mBAAmB,IAAI,KAAK,GAAG;AAC9C,YAAM,cAAc,MAAM,MAAM,uBAAuB,KAAK,KAAK,OAAO;AACxE,WAAK,mBAAmB,IAAI,OAAO,WAAW;AAAA,IAChD;AACA,UAAM;AAAA,MACJ,MAAM,KAAK,MAAM,sBAAsB,QAAQ;AAAA,MAC/C,OAAO,aAAa;AAClB,iBAAS,KAAA;AACT,cAAM,UAAU,SAAS,aAAA;AACzB,YAAIC,gBAAAA,mBAAmB,OAAO,GAAG;AAC/B,yBAAe,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,MACA,EAAE,aAAa,GAAA;AAAA,IAAG;AAAA,EAEtB;AAAA,EAEA,MAAM,MAAM,KAAkB;AAC5B,UAAM,6CAA6B,IAAA;AACnC,UAAM;AAAA,MACJ,MAAM,KAAK,KAAK,aAAa,SAAS;AAAA,MACtC,OAAO,CAAC,WAAW,UAAU,MAAM;AACjC,cAAM,EAAE,OAAO,IAAA,IAAQ,MAAM,WAAW,wBAAA;AACxC,YAAI,CAACA,gBAAAA,mBAAmB,KAAK,GAAG;AAC9B;AAAA,QACF;AACA,cAAM,SAA+B;AAAA,UACnC,OAAO,KAAK,iBAAiB,SAAS,UAAU;AAAA,UAChD,QAAQ,KAAK,iBAAiB,UAAU,UAAU;AAAA,UAClD,MAAM,KAAK,iBAAiB,QAAQ,UAAU;AAAA,UAC9C,aAAa,KAAK,iBAAiB,eAAe,UAAU;AAAA,UAC5D,QAAQ,KAAK,iBAAiB,UAAU,UAAU;AAAA,UAClD,YAAY,KAAK,iBAAiB,cAAc,UAAU;AAAA,UAC1D,aAAa,KAAK,iBAAiB,eAAe,UAAU;AAAA,UAC5D,QAAQ,KAAK,iBAAiB,UAAU,UAAU;AAAA,QAAA;AAEpD,aAAK,qBAAqB,IAAI,MAAM,kBAAkB,MAAM;AAC5D,aAAK,qBAAqB,IAAI,OAAO,MAAM;AAC3C,aAAK,wBAAwB,IAAI,OAAO,UAAU;AAClD,aAAK,sBAAsB,IAAI,OAAO,SAAS;AAC/C,cAAM,KAAK,YAAY,KAAK,KAAK,OAAO,CAAC,YAAY;AACnD,gBAAM,mBAAmB,QAAQ;AACjC,cACE,CAAC,KAAK,QAAQ,IAAI,gBAAgB,KAClC,CAAC,uBAAuB,IAAI,gBAAgB,GAC5C;AACA,mCAAuB,IAAI,kBAAkB,OAAO;AAAA,UACtD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,EAAE,aAAa,EAAA;AAAA,IAAE;AAEnB,WAAO,uBAAuB,OAAO,GAAG;AACtC,YAAM,kBAAkB,MAAM,KAAK,uBAAuB,QAAQ;AAClE,6BAAuB,MAAA;AACvB,YAAM;AAAA,QACJ;AAAA,QACA,OAAO,UAAU;AACf,gBAAM,EAAE,SAAS,QAAQ,MAAM,OAAO,6BAA6B;AACnE,gBAAM,KAAK,YAAY,KAAK,KAAK,OAAO,CAAC,YAAY;AACnD,kBAAM,mBAAmB,QAAQ;AACjC,gBACE,CAAC,KAAK,QAAQ,IAAI,gBAAgB,KAClC,CAAC,uBAAuB,IAAI,gBAAgB,GAC5C;AACA,qCAAuB,IAAI,kBAAkB,OAAO;AAAA,YACtD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,EAAE,aAAa,EAAA;AAAA,MAAE;AAAA,IAErB;AAAA,EACF;AAAA,EAEA,MAAM,yBAAyB,KAA2C;AACxE,UAAM,KAAK,MAAM,GAAG;AACpB,UAAM,MAAsB;AAAA,MAC1B,aAAa;AAAA,QACX,eAAe;AAAA,UACb,WAAW;AAAA,UACX,cAAc;AAAA,QAAA;AAAA,QAEhB,kBAAkB;AAAA,UAChB;AAAA,YACE,eAAe;AAAA,cACb,KAAK;AAAA,YAAA;AAAA,YAEP,gBAAgB;AAAA,cACd,aAAa;AAAA,gBACX,WAAW;AAAA,gBACX,OAAO;AAAA,cAAA;AAAA,YACT;AAAA,UACF;AAAA,UAEF;AAAA,YACE,eAAe;AAAA,cACb,KAAK;AAAA,YAAA;AAAA,YAEP,gBAAgB;AAAA,cACd,aAAa;AAAA,gBACX,WAAW;AAAA,gBACX,OAAO;AAAA,cAAA;AAAA,YACT;AAAA,UACF;AAAA,UAEF;AAAA,YACE,eAAe;AAAA,cACb,KAAK;AAAA,YAAA;AAAA,YAEP,gBAAgB;AAAA,cACd,aAAa;AAAA,gBACX,WAAW;AAAA,gBACX,OAAO;AAAA,cAAA;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,QAEF,qBAAqB;AAAA,UACnB,QAAQ;AAAA,YACN,aAAa;AAAA,cACX,WAAW;AAAA,cACX,OAAO;AAAA,cACP,OAAO;AAAA,YAAA;AAAA,YAET,GAAI,MAAM,KAAK,oBAAA;AAAA,UAAoB;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEF,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,MAA+D;AAClF,QAAI,MAAc,OAAO;AACzB,QACE+H,oBAAAA;AAAAA,MACE;AAAA,MACA;AAAA,MACA1E,YAAAA;AAAAA,IAAA,GAEF;AACA,YAAM;AAAA,IACR,OAAO;AACL,YAAM,KAAK,mBAAmB,KAAK,UAAU,IAAI,KAAK;AAAA,IACxD;AACA,UAAM,MAAM,KAAK,mBACb,KAAK,UACL,OAAO,KAAK,YAAY,WACtB,KAAK,UAAU,OAAO,CAAC,IACvB,KAAK,UAAU;AACrB,WAAO,MAAM,eAAkB,MAAM,aAAgB,cAAc;AAAA,EACrE;AAAA,EAEA,oCAAoC,MAAwD;AAC1F,YAAQ,MAAA;AAAA,MACN,KAAK0E,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACAjF,YAAAA;AAAAA,MAAA;AAEA,eAAO;AAAA,MACT,KAAKiF,iCAAkC,MAAM,uBAAuBhF,+BAAmB;AACrF,eAAO;AAAA,MACT,KAAKgF,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACA/E,YAAAA;AAAAA,MAAA;AAEA,eAAO;AAAA,MACT,KAAK+E,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACA9E,YAAAA;AAAAA,MAAA;AAEA,eAAO;AAAA,MACT,KAAK8E,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACA7E,YAAAA;AAAAA,MAAA;AAEA,eAAO;AAAA,MACT,KAAK6E,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACA3E,YAAAA;AAAAA,MAAA;AAEA,eAAO;AAAA,MACT,KAAK2E,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACA5E,YAAAA;AAAAA,MAAA;AAAA,MAEF,KAAK4E,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACA1E,YAAAA;AAAAA,MAAA;AAEA,eAAO,KAAK,qBAAqB,IAAI;AAAA,MACvC,KAAK0E,oBAAAA;AAAAA,QACH;AAAA,QACA;AAAA,QACAzE,YAAAA;AAAAA,MAAA;AAEA,eAAO;AAAA,MACT,KAAKyE,iCAAa,MAAM,yBAAyBxE,iCAAqB;AACpE,eAAO;AAAA,MACT,KAAKwE,iCAAmC,MAAM,wBAAwBvE,YAAAA,oBAAoB,GAAG;AAC3F,cAAM,IAA0B;AAChC,YAAI,WAAW,EAAE,SAAS,WAAW,EAAE,SAAS,WAAW,EAAE,SAAS,SAAS,EAAE,OAAO;AACtF,iBAAO;AAAA,QACT;AACA,cAAM,KAAK,KAAK;AAAA,UACd,EAAE;AAAA,QAAA;AAEJ,eAAO,cAAc,EAAE;AAAA,MACzB;AAAA,MACA;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,kBACE,gBACA;AACA,WAAO,KAAK,oCAAoC,eAAe,IAAI;AAAA,EACrE;AAAA,EAEA,qCACE,YACA,QACwB;AACxB,UAAM,MAA8B,CAAA;AACpC,QAAIzD,oBAAAA,WAAS,MAAM,KAAK,YAAY,OAAO,MAAM;AAC/C,YAAM,IAAoC;AAC1C,YAAM,WAAW,WACd,QAAQ,UAAU,EAAE,EACpB,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,EAAE;AACpB,UAAI,iBAAiB,cAAc,EAAE,SAAS;AAC5C,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,QAAQ,EAAE;AAAA,QAAA,CACX;AAAA,MACH;AACA,UAAI,gBAAgB,OAAO,EAAE,SAAS;AACpC,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,CAAC,QAAQ,GAAG,EAAE,QAAQ,SAAA;AAAA,UACtB,WAAW,EAAE,mBAAmB,SAAS;AAAA,QAAA,CAClB;AAAA,MAC3B;AACA,UAAI,gBAAgB,OAAO,EAAE,SAAS;AACpC,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,CAAC,QAAQ,GAAG,EAAE,QAAQ,SAAA;AAAA,UACtB,WAAW,EAAE,mBAAmB,SAAS;AAAA,QAAA,CAClB;AAAA,MAC3B;AACA,UAAI,gBAAgB,OAAO,EAAE,YAAY;AACvC,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,CAAC,QAAQ,GAAG,EAAE,WAAW,SAAA;AAAA,QAAS,CACX;AAAA,MAC3B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,8BACE,QAA+E,CAAA,GAC/E,OAAyB,QACzB,QAAgB,GACqB;AACrC,UAAM,0BAAU,IAAA;AAChB,QAAI,QAAQ,GAAG;AACb,aAAO;AAAA,IACT;AACA,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,UAAU,UAAU,MAAM;AACxD,UAAI,UAAU,YAAY;AACxB,cAAM,sBAAsB,WAAW,KAAK,MAAM,GAAG,EAAE,SAAS;AAChE,cAAM,kBAAkB,KAAK,QAAQ,IAAI,mBAAmB;AAE5D,YAAI,CAAC,gBAAiB;AACtB,cAAM,wBACJ,WAAW,OACP,KAAK,kBAAkB,IAAI,eAAe,IAC1C,KAAK,mBAAmB,IAAI,eAAe;AAEjD,YAAI,CAAC,sBAAuB;AAC5B,cAAM,yCAAyC,KAAK;AAAA,UAClD,sBAAsB;AAAA,UACtB;AAAA,UACA,QAAQ;AAAA,QAAA;AAEV,cAAM,8CAEF,OAAO;AAAA,UACT,CAAA;AAAA,UACA,GAAG,MAAM,KAAK,uCAAuC,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO;AAAA,YAC/E,CAAC,CAAC,GAAG;AAAA,UAAA,EACL;AAAA,QAAA;AAEJ,YAAI,IAAI,UAAU;AAAA,UAChB,GAAG;AAAA,UACH,YAAY;AAAA,QAAA,CACb;AAAA,MACH,OAAO;AACL,YAAI,IAAI,UAAU,UAAU;AAAA,MAC9B;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,oBACE,gBACA,UACA;AACA,QACE,CAACgI,oBAAAA;AAAAA,MACC,eAAe;AAAA,MACf;AAAA,MACAhF,YAAAA;AAAAA,IAAA,KAEF,CAACgF,oBAAAA;AAAAA,MACC,eAAe;AAAA,MACf;AAAA,MACA/E,YAAAA;AAAAA,IAAA,GAEF;AACA,aAAO;AAAA,IACT;AACA,UAAM,oBAAuC;AAC7C,WAAO,SAAS,kBAAkB;AAAA,EACpC;AAAA,EAEA,MAAM,sBAA+C;AACnD,UAAM,MAAsB,CAAA;AAC5B,UAAM,oCAAoB,IAAA;AAC1B,UAAM,qCAAqB,IAAA;AAC3B,UAAM,kCAAkB,IAAA;AACxB,UAAM,mCAAmB,IAAA;AACzB,UAAM,mBAA0C;AAAA,MAC9C;AAAA,QACE,aAAa,EAAE,QAAQ,iBAAA;AAAA,QACvB,YAAY;AAAA,UACV;AAAA,YACE,aAAa,EAAE,MAAM,4BAAA;AAAA,YACrB,QAAQ;AAAA,cACN,eAAe;AAAA,gBACb;AAAA,kBACE,aAAa;AAAA,oBACX,UAAU;AAAA,oBACV,MAAM;AAAA,kBAAA;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEF,UAAM,gCAAgB,IAAA;AACtB,UAAM,kCAAkB,IAAA;AACxB,UAAM,sCAAsB,IAAA;AAC5B,UAAM,wCAAwB,IAAA;AAE9B,UAAM,+BAAe,IAAA;AACrB,UAAM,mBAAmB,CAAC,WAA6B,QAAyB;AAC9E,YAAM,MAAM,SAAS,IAAI,SAAS,KAAK,CAAA;AACvC,eAAS,IAAI,WAAW,IAAI,OAAO,GAAG,CAAC;AAAA,IACzC;AACA,QAAI,2BAA2B;AAC/B,SAAK,QAAQ,QAAQ,CAAC,OAAO,cAAc;AACzC,YAAM,aAAa,KAAK,wBAAwB,IAAI,KAAK;AACzD,YAAM,aAAa,KAAK,kBAAkB,IAAI,KAAK;AACnD,YAAM,cAAc,KAAK,mBAAmB,IAAI,KAAK;AACrD,YAAM,aAAuBjD,oBAAAA,WAAS,WAAW,0BAA0B,CAAC,IACxE,OAAO,KAAK,WAAW,0BAA0B,CAAC,IAClD,CAAA;AACJ,YAAM,WAAqB,WAAW,wBAAwB,KAAK,CAAA;AACnE,YAAM,0BAA0B,KAAK;AAAA,QACnC,WAAW;AAAA,QACX;AAAA,MAAA;AAEF,YAAM,0BAA0B,KAAK;AAAA,QACnC,YAAY;AAAA,QACZ;AAAA,MAAA;AAEF,YAAM,cAAc,KAAK,qBAAqB,IAAI,KAAK,KAAK;AAAA,QAC1D,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,QAAQ;AAAA,MAAA;AAEV,YAAM,iBAAiB,MAAM;AAC7B,YAAM,mBAAmB,KAAK,sBAAsB,IAAI,KAAK;AAC7D,YAAM,gBAAgB,oBAAoB;AAC1C,YAAM,qBAAqB,MAAM,KAAK,MAAM,oBAAoB,SAAS;AACzE,YAAM,+BAA+B,MAAM,KAAK,MAAM,8BAA8B,SAAS;AAC7F,YAAM,2BAA2B,MAAM,KAAK,MAAM,0BAA0B,SAAS;AAErF,YAAM,2CAAkF,CAAA;AACxF,YAAM,4BAA8C,CAAA;AACpD,YAAM,uCAAuB,IAAA;AAC7B,YAAM,kDAAkC,IAAA;AACxC,YAAM,gEAAgD,IAAA;AACtD,YAAM,iDAAiC,IAAA;AACvC,YAAM,uEAAuD,IAAA;AAC7D,YAAM,4DAA4C,IAAA;AAClD,YAAM,0EAA0D,IAAA;AAIhE,YAAM,+CAA+B,IAAA;AACrC,YAAM,8CAA8B,IAAA;AACpC,YAAM,6CAA6B,IAAA;AACnC,YAAM,iDAAiC,IAAA;AACvC,YAAM,8CAA8B,IAAA;AACpC,YAAM,4CAA4B,IAAA;AAClC,YAAM,8CAA8B,IAAA;AACpC,YAAM,4CAA4B,IAAA;AAClC,YAAM,6CAA6B,IAAA;AACnC,YAAM,8CAA8B,IAAA;AACpC,YAAM,4CAAwD,IAAA;AAC9D,YAAM,6BAA+C,CAAA;AAGrD,yBAAmB,QAAQ,CAAC,CAAC,UAAU,cAAc,MAAM;AACzD,cAAM,kBAAkB,MAAM,oBAAoB,IAAI,QAAQ;AAM9D,YAAI,gBAAgB,gBAAgB,KAAM;AAC1C,cAAM,iBAAiB,wBAAwB,IAAI,QAAQ;AAC3D,cAAM,kBAAkB,wBAAwB,IAAI,QAAQ;AAC5D,cAAM,OAAO,KAAK,kBAAkB,cAAc;AAClD,YAAI,KAAK,SAAS,4BAA4B,GAAG;AAC/C,qCAA2B;AAAA,QAC7B;AACA,cAAM,yBAA6C;AAAA,UACjD,MAAM;AAAA,UACN;AAAA,UACA,UAAU,SAAS,eAAe,WAAW,SAAY;AAAA,QAAA;AAE3D,cAAM,2BAAmD,CAAA;AACzD,cAAM,yBAA2C,CAAA;AACjD,aAAK,qCAAqC,MAAM,cAAc,EAAE;AAAA,UAAQ,CAAC,MACvE,yBAAyB,KAAK,CAAC;AAAA,QAAA;AAEjC,YAAI+H,gBAAAA,uBAAuB,cAAc,KAAK,MAAM,QAAQ,eAAe,IAAI,GAAG;AAChF,iCAAuB,KAAK;AAAA,YAC1B,aAAa;AAAA,cACX,MAAM;AAAA,YAAA;AAAA,YAER,YAAY;AAAA,cACV,cAAc,eAAe,KAAK,IAAI,CAAC,eAAe;AAAA,gBACpD,aAAa;AAAA,kBACX,OAAO,OAAO/H,oBAAAA,WAAS,SAAS,IAAI,UAAU,QAAQ,SAAS;AAAA,gBAAA;AAAA,cACjE,EACA;AAAA,YAAA;AAAA,UACJ,CACD;AAAA,QACH;AACA,cAAM,QAAQ,aAAa;AAAA,UACzB,YAAY,YAAY,SAASA,oBAAAA,WAAS,cAAc;AAAA,UACxD,YACE,YAAY,SAASA,oBAAAA,WAAS,cAAc,KAAK,WAAW,SAAS,QAAQ;AAAA,UAC/E,UAAU,YAAY,SAASA,oBAAAA,WAAS,cAAc,KAAK,SAAS,SAAS,QAAQ;AAAA,UACrF,UAAU,YAAY,QAAQA,oBAAAA,WAAS,cAAc;AAAA,UACrD,YACE,YAAY,UACZA,oBAAAA,WAAS,eAAe,KACxB,CAAC;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,IAEE,YAAY,UAAU,SAAS,QAAQ,IACrC,aACA,OACF;AAAA,UACN,WAAW,YAAY,UAAUA,oBAAAA,WAAS,eAAe;AAAA,UACzD,eAAe,YAAY,cAAcA,oBAAAA,WAAS,eAAe;AAAA,UACjE,YAAY;AAAA,UACZ,oBAAoB,KAAK,oBAAoB,gBAAgB,eAAe;AAAA,QAAA,CAC/B;AAC/C,YAAI,UAAU,MAAM,YAAY;AAC9B,kCAAwB,IAAI,QAAQ;AAAA,QACtC;AACA,YAAI,UAAU,MAAM,YAAY;AAC9B,kCAAwB,IAAI,QAAQ;AAAA,QACtC;AACA,YAAI,UAAU,MAAM,UAAU;AAC5B,gCAAsB,IAAI,QAAQ;AAAA,QACpC;AACA,YAAI,UAAU,MAAM,UAAU;AAC5B,gCAAsB,IAAI,QAAQ;AAAA,QACpC;AACA,YAAI,UAAU,MAAM,YAAY;AAC9B,kCAAwB,IAAI,QAAQ;AAAA,QACtC,WAAW,eAAe,MAAM,YAAY;AAC1C,mCAAyB,IAAI,QAAQ;AAAA,QACvC;AACA,YAAI,UAAU,MAAM,WAAW;AAC7B,iCAAuB,IAAI,QAAQ;AAAA,QACrC;AACA,YAAI,UAAU,MAAM,eAAe;AACjC,qCAA2B,IAAI,QAAQ;AAAA,QACzC;AACA,YAAI,MAAM,YAAY;AACpB,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AACA,YAAI,MAAM,oBAAoB;AAC5B,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AACA,YAAI,MAAM,YAAY,CAAC,MAAM,cAAc,CAAC,MAAM,WAAW;AAC3D,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,YAAY;AAAA,UAAA,CACb;AAAA,QACH;AACA,YAAI,CAAC,MAAM,YAAY,MAAM,cAAc,MAAM,WAAW;AAC1D,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,YAAY;AAAA,UAAA,CACb;AAAA,QACH;AACA,yBAAiB,IAAI,UAAU,sBAAsB;AACrD,YAAI,yBAAyB,SAAS,GAAG;AACvC,sCAA4B,IAAI,UAAU,wBAAwB;AAAA,QACpE;AACA,YAAI,uBAAuB,SAAS,GAAG;AACrC,oDAA0C,IAAI,UAAU,sBAAsB;AAAA,QAChF;AAAA,MACF,CAAC;AACD,mCAA6B,QAAQ,CAAC,CAAC,UAAU,cAAc,MAAM;AACnE,cAAM,iBAAiB,wBAAwB,IAAI,QAAQ;AAC3D,cAAM,kBAAkB,wBAAwB,IAAI,QAAQ;AAC5D,cAAM,OAAO,KAAK,kBAAkB,cAAc;AAClD,YAAI,KAAK,SAAS,4BAA4B,GAAG;AAC/C,qCAA2B;AAAA,QAC7B;AACA,cAAM,yBAA6C;AAAA,UACjD,MAAM;AAAA,UACN;AAAA,UACA,UAAU,SAAS,eAAe,WAAW,SAAY;AAAA,QAAA;AAE3D,cAAM,2BAAmD,CAAA;AACzD,cAAM,yBAA2C,CAAA;AACjD,aAAK,qCAAqC,MAAM,cAAc,EAAE;AAAA,UAAQ,CAAC,MACvE,yBAAyB,KAAK,CAAC;AAAA,QAAA;AAEjC,YAAI+H,gBAAAA,uBAAuB,cAAc,KAAK,MAAM,QAAQ,eAAe,IAAI,GAAG;AAChF,iCAAuB,KAAK;AAAA,YAC1B,aAAa;AAAA,cACX,MAAM;AAAA,YAAA;AAAA,YAER,YAAY;AAAA,cACV,cAAc,eAAe,KAAK,IAAI,CAAC,eAAe;AAAA,gBACpD,aAAa;AAAA,kBACX,OAAO,OAAO/H,oBAAAA,WAAS,SAAS,IAAI,UAAU,QAAQ,SAAS;AAAA,gBAAA;AAAA,cACjE,EACA;AAAA,YAAA;AAAA,UACJ,CACD;AAAA,QACH;AACA,cAAM,QAAQ,aAAa;AAAA,UACzB,YAAY,YAAY,SAASA,oBAAAA,WAAS,cAAc;AAAA,UACxD,YACE,YAAY,SAASA,oBAAAA,WAAS,cAAc,KAAK,WAAW,SAAS,QAAQ;AAAA,UAC/E,UAAU,YAAY,SAASA,oBAAAA,WAAS,cAAc,KAAK,SAAS,SAAS,QAAQ;AAAA,UACrF,UAAU,YAAY,QAAQA,oBAAAA,WAAS,cAAc;AAAA,UACrD,YACE,YAAY,UAAU,eAAe,YAAYA,oBAAAA,WAAS,eAAe,IACrE,YAAY,UAAU,SAAS,QAAQ,IACrC,aACA,OACF;AAAA,UACN,WAAW,YAAY,UAAU,eAAe,YAAYA,oBAAAA,WAAS,eAAe;AAAA,UACpF,eAAe;AAAA,UACf,YAAY,CAAC,eAAe;AAAA,UAC5B,oBAAoB;AAAA,QAAA,CACyB;AAC/C,YAAI,UAAU,MAAM,YAAY;AAC9B,kCAAwB,IAAI,QAAQ;AAAA,QACtC;AACA,YAAI,UAAU,MAAM,YAAY;AAC9B,kCAAwB,IAAI,QAAQ;AAAA,QACtC;AACA,YAAI,UAAU,MAAM,UAAU;AAC5B,gCAAsB,IAAI,QAAQ;AAAA,QACpC;AACA,YAAI,UAAU,MAAM,UAAU;AAC5B,gCAAsB,IAAI,QAAQ;AAAA,QACpC;AACA,YAAI,UAAU,MAAM,YAAY;AAC9B,kCAAwB,IAAI,QAAQ;AAAA,QACtC,WAAW,eAAe,MAAM,YAAY;AAC1C,mCAAyB,IAAI,QAAQ;AAAA,QACvC;AACA,YAAI,UAAU,MAAM,WAAW;AAC7B,iCAAuB,IAAI,QAAQ;AAAA,QACrC;AACA,YAAI,UAAU,MAAM,eAAe;AACjC,qCAA2B,IAAI,QAAQ;AAAA,QACzC;AACA,YAAI,MAAM,YAAY;AACpB,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AACA,YAAI,MAAM,oBAAoB;AAC5B,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,MAAM;AAAA,UAAA,CACP;AAAA,QACH;AACA,YAAI,MAAM,YAAY,CAAC,MAAM,cAAc,CAAC,MAAM,WAAW;AAC3D,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,YAAY;AAAA,UAAA,CACb;AAAA,QACH;AACA,YAAI,CAAC,MAAM,YAAY,MAAM,cAAc,MAAM,WAAW;AAC1D,mCAAyB,KAAK;AAAA,YAC5B,MAAM;AAAA,YACN,YAAY;AAAA,UAAA,CACb;AAAA,QACH;AACA,yBAAiB,IAAI,UAAU,sBAAsB;AACrD,YAAI,yBAAyB,SAAS,GAAG;AACvC,sCAA4B,IAAI,UAAU,wBAAwB;AAAA,QACpE;AACA,YAAI,uBAAuB,SAAS,GAAG;AACrC,oDAA0C,IAAI,UAAU,sBAAsB;AAAA,QAChF;AAAA,MACF,CAAC;AACD,YAAM,8CAA8C,CAClD,UACA,iBACG;AACH,cAAM,YAAY,KAAK,sBAAsB,IAAI,YAAY;AAC7D,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AACA,cAAM,iBAAiB;AACvB,iDAAyC,KAAK;AAAA,UAC5C,MAAM;AAAA,UACN,QAAQ;AAAA,QAAA,CACT;AAAA,MACH;AACA,YAAM,mCAAmC,CACvC,UACA,UAGA,mBACG;AACH,YAAI,CAAC+H,gBAAAA,uBAAuB,cAAc,KAAM,CAAC,YAAY,SAAS,CAAC,YAAY;AACjF;AACF,cAAM,eAAe,SAAS,aAAA;AAC9B,YAAI,CAAC9H,gBAAAA,mBAAmB,YAAY,GAAG;AACrC;AAAA,QACF;AACA,oDAA4C,UAAU,YAAY;AAClE,cAAM,aAAa,aAAa;AAChC,cAAM,SAAS,SAAS;AACxB,cAAM,QACJ,gBAAgB,SAAS,OACrB,MAAM,oBAAoB,IAAI,MAAM,IACpC,aAAa,oBAAoB,IAAI,MAAM;AACjD,cAAM,WAAW,QAAQ,SAAS,MAAM,WAAW;AACnD,cAAM,mCAAiE;AAAA,UACrE,MAAM;AAAA,UACN,MAAM,QAAQ,UAAU;AAAA,UACxB,UAAU;AAAA,QAAA;AAEZ,cAAM,+CAAiE,CAAA;AACvE,YAAI,SAAS,SAAS,aAAa;AACjC,gBAAM,wBAAwB;AAAA,YAC5B,aAAa;AAAA,cACX,UAAU,SAAS;AAAA,cACnB,oBAAoB,SAAS;AAAA,YAAA;AAAA,UAC/B;AAEF,uDAA6C,KAAK,qBAAqB;AAAA,QACzE;AACA,cAAM,oCAA4D,CAAA;AAClE,0CAAkC,KAAK;AAAA,UACrC,MAAM;AAAA,UACN,MAAM;AAAA,QAAA,CACP;AACD,mCAA2B,IAAI,UAAU,gCAAgC;AACzE,YAAI,6CAA6C,SAAS,GAAG;AAC3D,2DAAiD;AAAA,YAC/C;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AACA,YAAI,kCAAkC,SAAS,GAAG;AAChD,gDAAsC,IAAI,UAAU,iCAAiC;AAAA,QACvF;AACA,+BAAuB,IAAI,QAAQ;AACnC,gCAAwB,IAAI,QAAQ;AAAA,MACtC;AACA,YAAM,gCAAgC,CACpC,UACA,aAIG;AACH,cAAM,eAAe,SAAS,aAAA;AAC9B,YAAI,CAACA,gBAAAA,mBAAmB,YAAY,GAAG;AACrC;AAAA,QACF;AACA,oDAA4C,UAAU,YAAY;AAClE,cAAM,aAAa,aAAa;AAChC,cAAM,mCAAiE;AAAA,UACrE,MAAM;AAAA,UACN,MAAM,mBAAmB,UAAU;AAAA,QAAA;AAErC,mCAA2B,IAAI,UAAU,gCAAgC;AACzE,YAAI,CAAC,YAAY,aAAa;AAC5B,iCAAuB,IAAI,QAAQ;AAAA,QACrC;AACA,gCAAwB,IAAI,QAAQ;AACpC,YAAI,YAAY,aAAa;AAC3B,gBAAM,SAAS,OAAO;AAAA,YACpB,CAAC,QAAQ,MAAM,kBAAkB,WAAW,QAAQ,EAAE,KAAK,GAAG;AAAA,UAAA;AAEhE,cAAI,CAAC,sBAAsB,IAAI,MAAM,GAAG;AACtC,kBAAM,SAAwB;AAAA,cAC5B,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,cACN,QAAQ,CAAC,EAAE,MAAM,SAAS,MAAM,0BAA0B,UAAU,OAAO;AAAA,cAC3E,YAAY;AAAA,cACZ,eAAe;AAAA,cACf,cAAc;AAAA,cACd,SAAS,MAAM;AAAA,YAAA;AAEjB,kCAAsB,IAAI,QAAQ,MAAM;AACxC,uCAA2B,KAAK;AAAA,cAC9B,eAAe;AAAA,gBACb;AAAA,kBACE,aAAa;AAAA,oBACX,UAAU;AAAA,oBACV,QAAQ,WAAW,MAAM;AAAA,kBAAA;AAAA,gBAC3B;AAAA,gBAEF;AAAA,kBACE,aAAa;AAAA,oBACX,UAAU;AAAA,oBACV,wBAAwB;AAAA,kBAAA;AAAA,gBAC1B;AAAA,cACF;AAAA,YACF,CACD;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,+BAAyB,QAAQ,CAAC,CAAC,QAAQ,MAAM;AAC/C,cAAM,kBAAkB,MAAM,sBAAsB,IAAI,QAAQ;AAChE,cAAM,iBAAiB,wBAAwB,IAAI,QAAQ;AAE3D,YAAI,CAAC,WAAW,cAAc,gBAAgB,EAAE,SAAS,gBAAgB,IAAI,GAAG;AAE9E;AAAA,YACE;AAAA,YACA;AAAA,UAAA;AAAA,QAKJ,OAAO;AAEL;AAAA,YACE;AAAA,YACA;AAAA,YAGA;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF,CAAC;AAED,YAAM,kBAAkC,+BAA+B;AAAA,QACrE,aAAa;AAAA,UACX,MAAM;AAAA,QAAA;AAAA,QAER,KAAK;AAAA,UACH,aAAa;AAAA,YACX,aAAa,EAAE,MAAM,MAAM,WAAA;AAAA,UAAW;AAAA,QACxC;AAAA,QAEF,UACE,iBAAiB,OAAO,IACpB,MAAM,KAAK,iBAAiB,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AAC5D,gBAAM,kBAAkB,4BAA4B,IAAI,IAAI,KAAK,CAAA;AACjE,gBAAM,yBACJ,0CAA0C,IAAI,IAAI,KAAK,CAAA;AACzD,gBAAM,aAAa;AAAA,YACjB,GAAG,gBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI;AAAA,YAClD,GAAG;AAAA,UAAA;AAEL,iBAAO,+BAA+B;AAAA,YACpC,aAAa;AAAA,YACb,YAAY,WAAW,SAAS,IAAI,aAAa;AAAA,UAAA,CAClD;AAAA,QACH,CAAC,IACD;AAAA,QACN,oBACE,2BAA2B,OAAO,IAC9B,MAAM,KAAK,2BAA2B,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AACtE,gBAAM,6BACJ,iDAAiD,IAAI,IAAI,KAAK,CAAA;AAChE,gBAAM,kBAAkB,sCAAsC,IAAI,IAAI,KAAK,CAAA;AAC3E,gBAAM,yBACJ,oDAAoD,IAAI,IAAI,KAAK,CAAA;AACnE,gBAAM,aAAa;AAAA,YACjB,GAAG,gBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI;AAAA,YAClD,GAAG;AAAA,UAAA;AAEL,iBAAO,+BAA+B;AAAA,YACpC,aAAa;AAAA,YACb,uBACE,2BAA2B,SAAS,IAAI,6BAA6B;AAAA,YACvE,YAAY,WAAW,SAAS,IAAI,aAAa;AAAA,UAAA,CAClD;AAAA,QACH,CAAC,IACD;AAAA,MAAA,CACP;AACD,oBAAc,IAAI,WAAW,eAAe;AAE5C,YAAM,iBAAiC,+BAA+B;AAAA,QACpE,aAAa;AAAA,UACX,MAAM;AAAA,UACN,YAAY,QAAQ,cAAc;AAAA,QAAA;AAAA,QAEpC,2BACE,yCAAyC,WAAW,IAChD,SACA,yCAAyC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAA,EAAI;AAAA,MAAA,CAC/E;AACD,mBAAa,IAAI,eAAe,cAAc;AAE9C,YAAM,oBAAoB,kBAAkB,aAAa;AACzD,UAAI,YAAY,OAAO;AACrB,kCAA0B;AAAA,UACxB,+BAA+B,mCAAmC,EAAE,YAAY,MAAM;AAAA,QAAA;AAExF,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,+BAA+B;AAAA,cAC7B,YAAY;AAAA,cACZ,yBACE,wBAAwB,OAAO,IAAI,MAAM,KAAK,uBAAuB,IAAI;AAAA,YAAA,CACpC;AAAA,UAAA;AAAA,QAC3C;AAEF,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,+BAA+B;AAAA,cAC7B,UAAU;AAAA,cACV,uBACE,sBAAsB,OAAO,IAAI,MAAM,KAAK,qBAAqB,IAAI;AAAA,YAAA,CAChC;AAAA,UAAA;AAAA,QAC3C;AAEF,kCAA0B;AAAA,UACxB,+BAA+B,kCAAkC;AAAA,YAC/D,WAAW;AAAA,UAAA,CACZ;AAAA,QAAA;AAEH,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,CAAA;AAAA,YACA;AAAA,cACE,MAAM;AAAA,YAAA;AAAA,UACR;AAAA,QACF;AAEF,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,CAAA;AAAA,YACA;AAAA,cACE,MAAM;AAAA,YAAA;AAAA,UACR;AAAA,QACF;AAEF,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,+BAA+B;AAAA,cAC7B,WAAW;AAAA,cACX,yBACE,wBAAwB,OAAO,IAAI,MAAM,KAAK,uBAAuB,IAAI;AAAA,YAAA,CACpC;AAAA,UAAA;AAAA,QAC3C;AAAA,MAEJ,OAAO;AACL,kCAA0B;AAAA,UACxB,+BAA+B,mCAAmC,EAAE,YAAY,OAAO;AAAA,QAAA;AAEzF,kCAA0B;AAAA,UACxB,+BAA+B,mCAAmC,EAAE,YAAY,OAAO;AAAA,QAAA;AAEzF,kCAA0B;AAAA,UACxB,+BAA+B,iCAAiC,EAAE,UAAU,OAAO;AAAA,QAAA;AAErF,kCAA0B;AAAA,UACxB,+BAA+B,kCAAkC;AAAA,YAC/D,WAAW;AAAA,UAAA,CACZ;AAAA,QAAA;AAEH,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,CAAA;AAAA,YACA;AAAA,cACE,MAAM;AAAA,YAAA;AAAA,UACR;AAAA,QACF;AAEF,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,CAAA;AAAA,YACA;AAAA,cACE,MAAM;AAAA,YAAA;AAAA,UACR;AAAA,QACF;AAEF,kCAA0B;AAAA,UACxB,+BAA+B,8BAA8B;AAAA,YAC3D,WAAW;AAAA,UAAA,CACZ;AAAA,QAAA;AAAA,MAEL;AACA,UAAI,YAAY,SAAS,YAAY,MAAM;AACzC,kCAA0B;AAAA,UACxB,+BAA+B,iCAAiC;AAAA,YAC9D,UAAU;AAAA,YACV,uBAAuB;AAAA,cACrB,UAAU,YAAY;AAAA,YAAA;AAAA,UACxB,CACD;AAAA,QAAA;AAEH,YAAI,2BAA2B,OAAO,GAAG;AACvC,cAAI,2BAA2B,SAAS,wBAAwB,MAAM;AACpE,sCAA0B,KAAK;AAAA,cAC7B,aAAa;AAAA,gBACX,MAAM;AAAA,cAAA;AAAA,cAER,QAAQ;AAAA,gBACN,eAAe;AAAA,kBACb,EAAE,aAAa,EAAE,UAAU,cAAc,MAAM,SAAO;AAAA,kBACtD,EAAE,aAAa,EAAE,UAAU,aAAa,KAAK,MAAI;AAAA,kBACjD,wBAAwB,OAAO,IAC3B;AAAA,oBACE,aAAa,EAAE,UAAU,0BAAA;AAAA,oBACzB,YAAY;AAAA,sBACV,wBAAwB,MAAM,KAAK,uBAAuB,EAAE,IAAI,CAAC,OAAO;AAAA,wBACtE,OAAO;AAAA,sBAAA,EACP;AAAA,oBAAA;AAAA,kBACJ,IAEF;AAAA,gBAAA,EACJ,OAAOD,oBAAAA,UAAQ;AAAA,cAAA;AAAA,YACnB,CACD;AACD,gBAAI,uBAAuB,OAAO,GAAG;AACnC,wCAA0B,KAAK;AAAA,gBAC7B,aAAa;AAAA,kBACX,MAAM;AAAA,gBAAA;AAAA,gBAER,QAAQ;AAAA,kBACN,eAAe;AAAA,oBACb,aAAa,EAAE,UAAU,uBAAA;AAAA,oBACzB,YAAY;AAAA,sBACV,QAAQ,MAAM,KAAK,sBAAsB,EAAE,IAAI,CAAC,UAAU;AAAA,wBACxD,eAAe;AAAA,0BACb;AAAA,4BACE,aAAa;AAAA,8BACX,UAAU;AAAA,8BACV,wBAAwB;AAAA,4BAAA;AAAA,0BAC1B;AAAA,0BAEF;AAAA,4BACE,aAAa;AAAA,8BACX,UAAU;AAAA,8BACV,YAAY;AAAA,4BAAA;AAAA,0BACd;AAAA,wBACF;AAAA,sBACF,EACA;AAAA,oBAAA;AAAA,kBACJ;AAAA,gBACF;AAAA,cACF,CACD;AAAA,YACH;AAAA,UACF,OAAO;AACL,sCAA0B;AAAA,cACxB,+BAA+B,mCAAmC;AAAA,gBAChE,YAAY;AAAA,cAAA,CACb;AAAA,YAAA;AAAA,UAEL;AAAA,QACF,OAAO;AACL,oCAA0B;AAAA,YACxB,+BAA+B,mCAAmC;AAAA,cAChE,YAAY;AAAA,YAAA,CACb;AAAA,UAAA;AAAA,QAEL;AAAA,MACF,OAAO;AACL,kCAA0B;AAAA,UACxB,+BAA+B,iCAAiC;AAAA,YAC9D,UAAU;AAAA,UAAA,CACX;AAAA,QAAA;AAEH,YAAI,2BAA2B,OAAO,GAAG;AACvC,oCAA0B;AAAA,YACxB,+BAA+B,mCAAmC;AAAA,cAChE,YAAY;AAAA,YAAA,CACb;AAAA,UAAA;AAAA,QAEL;AAAA,MACF;AACA,UAAI,YAAY,QAAQ;AACtB,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,+BAA+B;AAAA,cAC7B,YAAY;AAAA,cACZ,oBACE,yBAAyB,OAAO,IAC5B,MAAM,KAAK,wBAAwB,IACnC;AAAA,cACN,yBACE,wBAAwB,OAAO,IAAI,MAAM,KAAK,uBAAuB,IAAI;AAAA,YAAA,CAC5E;AAAA,UAAA;AAAA,QACH;AAAA,MAEJ,OAAO;AACL,kCAA0B;AAAA,UACxB,+BAA+B,mCAAmC;AAAA,YAChE,YAAY;AAAA,UAAA,CACb;AAAA,QAAA;AAAA,MAEL;AACA,UAAI,YAAY,QAAQ;AACtB,kCAA0B;AAAA,UACxB;AAAA,YACE;AAAA,YACA,+BAA+B;AAAA,cAC7B,WAAW;AAAA,cACX,wBACE,uBAAuB,OAAO,IAAI,MAAM,KAAK,sBAAsB,IAAI;AAAA,cACzE,wBAAwB,YAAY;AAAA,cACpC,0BAA0B,YAAY;AAAA,cACtC,sBAAsB;AAAA,YAAA,CACiB;AAAA,UAAA;AAAA,QAC3C;AAAA,MAEJ,OAAO;AACL,kCAA0B;AAAA,UACxB,+BAA+B,mCAAmC;AAAA,YAChE,WAAW;AAAA,UAAA,CACZ;AAAA,QAAA;AAAA,MAEL;AACA,UAAI,YAAY,QAAQ;AACtB,kCAA0B;AAAA,UACxB,+BAA+B,mCAAmC;AAAA,YAChE,WAAW;AAAA,UAAA,CACZ;AAAA,QAAA;AAAA,MAEL,OAAO;AACL,kCAA0B;AAAA,UACxB,+BAA+B,mCAAmC;AAAA,YAChE,WAAW;AAAA,UAAA,CACZ;AAAA,QAAA;AAAA,MAEL;AACA,UAAI,YAAY;AACd,cAAM,aAAa,WAAW,SAAS,cAAc,CAAA;AACrD,eAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,aAAa,MAAM;AACtD,gBAAM,CAAC,QAAQ,IAAI,IAAI,cAAc,MAAM,GAAG;AAC9C,cAAI,CAAC,UAAU,CAAC,KAAM;AACtB,gBAAM,SAAS,WAAW,QAAQ,MAAM,kBAAkB,IAAI;AAC9D,cAAI,CAAC,sBAAsB,IAAI,MAAM,GAAG;AACtC,kBAAM,YAAuB,KAAK,SAAS,OAAQ,IAAI,WAAW;AAClE,kBAAM,SAAiB,CAAC,QAAQ,SAAS,OAAO,QAAQ,EAAE,SAAS,MAAM,IACrE,WACA;AACJ,kBAAM,SAAwB;AAAA,cAC5B,MAAM;AAAA,cACN,SAAS;AAAA,cACT,MAAM;AAAA,cACN,QACE,aAAa,SACT,CAAC,EAAE,MAAM,WAAW,MAAM,cAAc,UAAU,KAAA,CAAM,IACxD,CAAA;AAAA,cACN,YAAY;AAAA,cACZ,eAAe,KAAK,QAAQ,YAAY,EAAE;AAAA,cAC1C,cAAc;AAAA,cACd,SAAS,MAAM;AAAA,YAAA;AAEjB,kCAAsB,IAAI,QAAQ,MAAM;AACxC,uCAA2B,KAAK;AAAA,cAC9B,eAAe;AAAA,gBACb;AAAA,kBACE,aAAa;AAAA,oBACX,UAAU;AAAA,oBACV,QAAQ,WAAW,MAAM;AAAA,kBAAA;AAAA,gBAC3B;AAAA,gBAEF;AAAA,kBACE,aAAa;AAAA,oBACX,UAAU;AAAA,oBACV,wBAAwB,OAAO;AAAA,kBAAA;AAAA,gBACjC;AAAA,cACF;AAAA,YACF,CACD;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAEA,uBAAiB,OAAO,MAAM,KAAK,sBAAsB,OAAA,CAAQ,CAAC;AAElE,UAAI,2BAA2B,SAAS,GAAG;AACzC,kCAA0B,KAAK;AAAA,UAC7B,aAAa;AAAA,YACX,MAAM;AAAA,UAAA;AAAA,UAER,YAAY;AAAA,YACV,QAAQ;AAAA,UAAA;AAAA,QACV,CACD;AAAA,MACH;AAEA,YAAM,mCAAmD;AAAA,QACvD,aAAa;AAAA,UACX,QAAQ;AAAA,QAAA;AAAA,QAEV,YAAY;AAAA,MAAA;AAEd,uBAAiB,KAAK,gCAAgC;AAAA,IACxD,CAAC;AAED,UAAM,iBAAiB,CACrB,gBACA,SACA,MACA,SAAsB,CAAA,GACtB,YACA,SAAiD,CAAA,GACjD,gBACG;AACH,YAAM,cACJ,YAAY,eAAe,mBAAmB,cAAc,MAAM,QAAQ,cAAc;AAE1F,YAAM,KAAqB,+BAA+B;AAAA,QACxD,aAAa,EAAE,MAAM,MAAM,SAAS,QAAQ,GAAG,OAAA;AAAA,QAC/C,WAAW,CAAC,EAAE,aAAa,EAAE,MAAM,oBAAoB,MAAM,cAAY,CAAG,EAAE;AAAA,UAC5E,OAAO;AAAA,YAAI,CAAC,MACV,+BAA+B;AAAA,cAC7B,aAAa;AAAA,gBACX,MAAM,EAAE;AAAA,gBACR,MAAM,EAAE;AAAA,gBACR,UAAU,EAAE,WAAW,SAAY;AAAA,cAAA;AAAA,YACrC,CACD;AAAA,UAAA;AAAA,QACH;AAAA,QAEF,YAAY,aAAa,EAAE,aAAa,EAAE,MAAM,WAAA,MAAiB;AAAA,QACjE,YAAY,eAAe,YAAY,SAAS,cAAc;AAAA,MAAA,CAC/D;AAED,YAAM,MAAM,UAAU,IAAI,cAAc,KAAK,CAAA;AAC7C,UAAI,KAAK,EAAE;AACX,gBAAU,IAAI,gBAAgB,GAAG;AAAA,IACnC;AACA,UAAM,mBAAmB,CACvB,gBACA,SACA,MACA,SAAsB,IACtB,YACA,OAKI,OACD;AACH,YAAM,cACJ,YAAY,eAAe,mBAAmB,cAAc,MAAM,QAAQ,cAAc;AAE1F,YAAM,KAAqB,+BAA+B;AAAA,QACxD,aAAa,+BAA+B;AAAA,UAC1C,MAAM;AAAA,UACN,SAAS;AAAA,UACT,cAAc,KAAK,eAAe,SAAS;AAAA,UAC3C,GAAI,KAAK,UAAU,CAAA;AAAA,QAAC,CACrB;AAAA,QACD,WAAW,CAAC,EAAE,aAAa,EAAE,MAAM,oBAAoB,MAAM,cAAY,CAAG,EAAE;AAAA,UAC5E,OAAO;AAAA,YAAI,CAAC,MACV,+BAA+B;AAAA,cAC7B,aAAa;AAAA,gBACX,MAAM,EAAE;AAAA,gBACR,MAAM,EAAE;AAAA,gBACR,UAAU,EAAE,WAAW,SAAY;AAAA,cAAA;AAAA,YACrC,CACD;AAAA,UAAA;AAAA,QACH;AAAA,QAEF,YAAY,EAAE,aAAa,EAAE,MAAM,aAAW;AAAA,QAC9C,YAAY,KAAK,eAAe,KAAK,YAAY,SAAS,KAAK,cAAc;AAAA,MAAA,CAC9E;AAED,YAAM,MAAM,YAAY,IAAI,cAAc,KAAK,CAAA;AAC/C,UAAI,KAAK,EAAE;AACX,kBAAY,IAAI,gBAAgB,GAAG;AAAA,IACrC;AACA,aAAS,QAAQ,CAAC,KAAK,UAAU;AAC/B,UAAI,QAAQ,CAAC,OAAO;AAClB,YAAI,GAAG,SAAS,UAAU;AACxB;AAAA,YACE,MAAM;AAAA,YACN,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG,UAAU,CAAA;AAAA,YACb,GAAG;AAAA,YACH,CAAA;AAAA,YACA,GAAG;AAAA,UAAA;AAAA,QAEP,OAAO;AACL;AAAA,YACE,MAAM;AAAA,YACN,GAAG;AAAA,YACH,GAAG;AAAA,YACH,GAAG,UAAU,CAAA;AAAA,YACb,GAAG;AAAA,YACH;AAAA,cACE,cAAc,GAAG;AAAA,cACjB,eAAe,GAAG;AAAA,cAClB,aAAa,GAAG;AAAA,YAAA;AAAA,UAClB;AAAA,QAEJ;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,WAAO,QAAQ,KAAK,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC,aAAa,MAAM;AACjE,YAAM,CAAC,QAAQ,IAAI,IAAI,cAAc,MAAM,GAAG;AAC9C,UAAI,CAAC,UAAU,CAAC,KAAM;AACtB,YAAM,SAAS,WAAW,QAAQ,IAAI;AACtC,YAAM,SAAiB,CAAC,QAAQ,SAAS,OAAO,QAAQ,EAAE,SAAS,MAAM,IACrE,WACA;AACJ,YAAM,KAAqB,+BAA+B;AAAA,QACxD,aAAa,+BAA+B;AAAA,UAC1C,MAAM;AAAA,UACN,GAAI,WAAW,aAAa,EAAE,cAAc,QAAA,IAAY,CAAA;AAAA,QAAC,CAC1D;AAAA,QACD,WACE,WAAW,WAAW,CAAC,EAAE,aAAa,EAAE,MAAM,WAAW,MAAM,aAAA,EAAa,CAAG,IAAI,CAAA;AAAA,QACrF,YAAY,WAAW,WAAW,SAAY,EAAE,aAAa,EAAE,MAAM,aAAA,EAAa;AAAA,MAAE,CACrF;AACD,UAAI,WAAW,UAAU;AACvB,cAAM,MAAM,UAAU,IAAI,SAAS,KAAK,CAAA;AACxC,YAAI,KAAK,EAAE;AACX,kBAAU,IAAI,WAAW,GAAG;AAC5B,wBAAgB,IAAI,MAAM;AAAA,MAC5B,OAAO;AACL,cAAM,MAAM,YAAY,IAAI,SAAS,KAAK,CAAA;AAC1C,YAAI,KAAK,EAAE;AACX,oBAAY,IAAI,WAAW,GAAG;AAC9B,0BAAkB,IAAI,MAAM;AAAA,MAC9B;AAAA,IACF,CAAC;AAED,QAAI,0BAA0B;AAC5B,qBAAe,IAAI,yBAAyB;AAAA,QAC1C,aAAa,EAAE,MAAM,yBAAyB,UAAU,OAAA;AAAA,MAAO,CAChE;AAAA,IACH;AACA,QAAI,aAAa,MAAM,KAAK,cAAc,QAAQ;AAClD,QAAI,cAAc,MAAM,KAAK,eAAe,QAAQ;AACpD,QAAI,WAAW,MAAM,KAAK,YAAY,QAAQ;AAC9C,QAAI,kBACF,aAAa,OAAO,IAChB,+BAA+B;AAAA,MAC7B,aAAa;AAAA,QACX,MAAM;AAAA,MAAA;AAAA,MAER,WAAW,MAAM,KAAK,aAAa,QAAQ;AAAA,MAC3C,cACE,gBAAgB,OAAO,IACnB,MAAM,KAAK,gBAAgB,OAAA,CAAQ,EAAE,IAAI,CAAC,UAAU;AAAA,QAClD,aAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ,WAAW,IAAI;AAAA,QAAA;AAAA,MACzB,EACA,IACF;AAAA,MACN,gBACE,kBAAkB,OAAO,IACrB,MAAM,KAAK,kBAAkB,OAAA,CAAQ,EAAE,IAAI,CAAC,UAAU;AAAA,QACpD,aAAa;AAAA,UACX,MAAM;AAAA,UACN,UAAU,WAAW,IAAI;AAAA,UACzB,0BAA0B;AAAA,QAAA;AAAA,MAC5B,EACA,IACF;AAAA,IAAA,CACP,IACD;AACN,QAAI,SAAS,MAAM,KAAK,UAAU,OAAA,CAAQ,EAAE,KAAA;AAC5C,QAAI,WAAW,MAAM,KAAK,YAAY,OAAA,CAAQ,EAAE,KAAA;AAChD,QAAI,cAAc,iBAAiB,SAAS,IAAI,mBAAmB;AACnE,WAAO,+BAA+B,GAAG;AAAA,EAC3C;AAAA,EAEA,aAAa,kBACX,MACA,aACA,KACyB;AACzB,UAAM,UAAU,IAAI,qBAAqB,MAAM,WAAW;AAC1D,WAAO,QAAQ,yBAAyB,GAAG;AAAA,EAC7C;AACF;ACxlDO,MAAM,uBAAuB;AAAA,EAClC,OAAgB,qBAAqB,CAAC,OAAO,MAAM,KAAK;AAAA,EACxD,OAAgB,wBAAwB,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,EACxF,OAAgB,oBAAoB;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,OAAgB,kBAAkB,CAAC,QAAQ,SAAS,OAAO,QAAQ,UAAU,QAAQ;AAAA,EACrF,OAAgB,kBAAkB,CAAC,SAAS,SAAS,SAAS;AAAA,EAE9D,UAAmB,CAAA;AAAA,EACnB,YAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE9B,SACA,SACA,aACA,UAAmB,YACnB;AACA,SAAK,UAAUA;AACf,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,OAAc,MACZ,SACA,UAA+B,oBAAI,IAAA,GACnC,cAAmC,oBAAI,IAAA,GACvC,UAAmB,YACnB,SAC8B;AAC9B,UAAM,aAAa,IAAI,uBAAuB,SAAS,SAAS,aAAa,OAAO;AACpF,WAAO,WAAW,WAAW,OAAO;AAAA,EACtC;AAAA,EAEA,OAAc,OACZ,SACA,UAA+B,oBAAI,IAAA,GACnC,cAAmC,oBAAI,IAAA,GACvC,UAAmB,YACY;AAC/B,UAAM,QAAQ,uBAAuB,MAAM,KAAK,MAAM,SAAS,SAAS,aAAa,OAAO;AAC5F,WAAO,CAAC,MAAmB,MAA0B,UAAwC;AAC3F,YAAM,KAAK;AAAA,IACb;AAAA,EACF;AAAA,EAEA,WAAW,OAAsC;AAE/C,QAAI,WAAoB,KAAK;AAC7B,QAAI,OAAO;AACT,YAAM,SAAS,KAAK,SAAS,KAAK;AAClC,UAAI,WAAW,KAAM,YAAW;AAAA,eACvB,WAAW,WAAW,WAAW,SAAU,YAAW;AAAA,eACtD,WAAW,UAAW,YAAW;AAAA,IAC5C;AAEA,YAAQ,UAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,UACL,KAAK,CAAC,QAAgB,UAAU,GAAG;AAAA,UACnC,OAAO,CAAC,QAAgB,iBAAiB,GAAG;AAAA,UAC5C,SAAS,CAAC,KAAa,UAAkB,aAAa,GAAG,SAAS,KAAK;AAAA,UACvE,SAAS,CAAC,KAAa,OAAe,QACpC,aAAa,GAAG,SAAS,KAAK,QAAQ,GAAG;AAAA,UAC3C,MAAM,CAAC,QAAgB,qBAAqB,GAAG;AAAA,UAC/C,OAAO,CAAC,QAAgB,sBAAsB,GAAG;AAAA,UACjD,KAAK,CAAC,QAAgB,oBAAoB,GAAG;AAAA,UAC7C,MAAM,CAAC,QAAgB,qBAAqB,GAAG;AAAA,UAC/C,QAAQ,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UACnD,QAAQ,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UACnD,OAAO,CAAC,QAAgB,SAAS,GAAG;AAAA,UACpC,MAAM,CAAC,QAAgB,WAAW,GAAG;AAAA,UACrC,OAAO,CAAC,KAAa,MAAgB,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,SAAS,GAAG;AAAA,UAC7E,QAAQ,CAAC,GAAW,MAAc,GAAG,CAAC,OAAO,CAAC;AAAA,QAAA;AAAA,MAElD,KAAK;AACH,eAAO;AAAA,UACL,KAAK,CAAC,QAAgB,eAAe,GAAG;AAAA,UACxC,OAAO,CAAC,QAAgB,SAAS,GAAG;AAAA,UACpC,SAAS,CAAC,KAAa,UAAkB,aAAa,GAAG,KAAK,KAAK;AAAA,UACnE,SAAS,CAAC,KAAa,OAAe,QACpC,aAAa,GAAG,KAAK,KAAK,KAAK,GAAG;AAAA,UACpC,MAAM,CAAC,QAAgB,QAAQ,GAAG;AAAA,UAClC,OAAO,CAAC,QAAgB,SAAS,GAAG;AAAA,UACpC,KAAK,CAAC,QAAgB,OAAO,GAAG;AAAA,UAChC,MAAM,CAAC,QAAgB,QAAQ,GAAG;AAAA,UAClC,QAAQ,CAAC,QAAgB,UAAU,GAAG;AAAA,UACtC,QAAQ,CAAC,QAAgB,UAAU,GAAG;AAAA,UACtC,OAAO,CAAC,QAAgB,SAAS,GAAG;AAAA,UACpC,MAAM,CAAC,QAAgB,QAAQ,GAAG;AAAA,UAClC,OAAO,CAAC,KAAa,MAAgB,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,SAAS,GAAG;AAAA,UAC7E,QAAQ,CAAC,GAAW,MAAc,UAAU,CAAC,KAAK,CAAC;AAAA,QAAA;AAAA,MAEvD,KAAK;AACH,eAAO;AAAA,UACL,KAAK,CAAC,QAAgB,UAAU,GAAG;AAAA,UACnC,OAAO,CAAC,QAAgB,SAAS,GAAG;AAAA,UACpC,SAAS,CAAC,KAAa,UAAkB,UAAU,GAAG,KAAK,KAAK;AAAA,UAChE,SAAS,CAAC,KAAa,OAAe,QAAgB,UAAU,GAAG,KAAK,KAAK,KAAK,GAAG;AAAA,UACrF,MAAM,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UACjD,OAAO,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UAClD,KAAK,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UAChD,MAAM,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UACjD,QAAQ,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UACnD,QAAQ,CAAC,QAAgB,uBAAuB,GAAG;AAAA,UACnD,OAAO,CAAC,QACN,cAAc,GAAG,WAAW,GAAG,gCAAgC,GAAG,0BAA0B,GAAG;AAAA;AAAA;AAAA,UAGjG,MAAM,CAAC,QACL,QAAQ,GAAG,4BAA4B,GAAG,WAAW,GAAG;AAAA,UAC1D,OAAO,CAAC,KAAa,MAAgB,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,SAAS,GAAG;AAAA,UAC7E,QAAQ,CAAC,GAAW,MAAc,GAAG,CAAC,OAAO,CAAC;AAAA,QAAA;AAAA,IAChD;AAAA,EAEN;AAAA,EAEA,WAAW,MAA+C;AACxD,QAAI,KAAK,SAAS,YAAY;AAC5B,aAAO,EAAE,KAAK,MAAM,QAAQ,CAAC,KAAK,eAAe,KAAK,IAAI,CAAC,EAAA;AAAA,IAC7D;AACA,QAAI,KAAK,SAAS,WAAW;AAC3B,aAAO,EAAE,KAAK,KAAK,QAAQ,CAAC,KAAK,KAAK,EAAA;AAAA,IACxC;AACA,UAAM,IAAI+J,SAAAA,uCAAuC,IAAI;AAAA,EACvD;AAAA,EAEA,WAAW,SAAqE;AAC9E,SAAK,UAAU,KAAK,UAAU,KAAK,OAAO;AAC1C,SAAK,YAAY;AAEjB,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,iBAAA;AACjB,WAAO,KAAK,iBAAiB,KAAK,OAAO;AAAA,EAC3C;AAAA,EAEA,UAAU,OAAwB;AAChC,UAAM,SAAkB,CAAA;AACxB,QAAI,IAAI;AAER,WAAO,IAAI,MAAM,QAAQ;AAEvB,UAAI,KAAK,KAAK,MAAM,CAAC,CAAC,GAAG;AACvB,eAAO,IAAI,MAAM,UAAU,KAAK,KAAK,MAAM,CAAC,CAAC,EAAG;AAChD;AAAA,MACF;AAGA,UAAI,MAAM,CAAC,MAAM,KAAK;AACpB,YAAI,IAAI,IAAI;AACZ,eAAO,IAAI,MAAM,UAAU,eAAe,KAAK,MAAM,CAAC,CAAC,EAAG;AAC1D,YAAI,MAAM,IAAI,GAAG;AAEf,gBAAM,IAAIC,SAAAA,oCAAoC,MAAM,CAAC,GAAG,CAAC;AAAA,QAC3D;AACA,eAAO,KAAK,EAAE,MAAM,aAAa,OAAO,MAAM,UAAU,IAAI,GAAG,CAAC,EAAA,CAAG;AACnE,YAAI;AACJ;AAAA,MACF;AAGA,UAAI,MAAM,CAAC,MAAM,KAAK;AACpB,YAAI,IAAI,IAAI;AACZ,YAAI,QAAQ;AACZ,YAAI,SAAS;AACb,eAAO,IAAI,MAAM,QAAQ;AACvB,cAAI,MAAM,CAAC,MAAM,KAAK;AACpB,gBAAI,IAAI,IAAI,MAAM,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK;AAChD,uBAAS;AACT,mBAAK;AAAA,YACP,OAAO;AACL;AACA,uBAAS;AACT;AAAA,YACF;AAAA,UACF,OAAO;AACL,qBAAS,MAAM,CAAC;AAChB;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAIC,SAAAA,uCAAA;AAAA,QACZ;AACA,eAAO,KAAK,EAAE,MAAM,UAAU,OAAO;AACrC,YAAI;AACJ;AAAA,MACF;AAGA,UACE,QAAQ,KAAK,MAAM,CAAC,CAAC,KACpB,MAAM,CAAC,MAAM,OAAO,IAAI,IAAI,MAAM,UAAU,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,GACtE;AACA,YAAI,IAAI;AACR,YAAI,MAAM,CAAC,MAAM,IAAK;AACtB,eAAO,IAAI,MAAM,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAG;AACnD,YAAI,IAAI,MAAM,UAAU,MAAM,CAAC,MAAM,KAAK;AACxC;AACA,iBAAO,IAAI,MAAM,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAG;AAAA,QACrD;AACA,YAAI,IAAI,MAAM,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,GAAG;AAC7C;AACA,cAAI,IAAI,MAAM,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,EAAG;AAC/C,iBAAO,IAAI,MAAM,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAG;AAAA,QACrD;AACA,eAAO,KAAK,EAAE,MAAM,UAAU,OAAO,MAAM,UAAU,GAAG,CAAC,GAAG;AAC5D,YAAI;AACJ;AAAA,MACF;AAGA,UAAI,MAAM,CAAC,MAAM,KAAK;AACpB,eAAO,KAAK,EAAE,MAAM,UAAU,OAAO,KAAK;AAC1C;AACA;AAAA,MACF;AACA,UAAI,MAAM,CAAC,MAAM,KAAK;AACpB,eAAO,KAAK,EAAE,MAAM,UAAU,OAAO,KAAK;AAC1C;AACA;AAAA,MACF;AAGA,UAAI,MAAM,CAAC,MAAM,KAAK;AACpB,eAAO,KAAK,EAAE,MAAM,SAAS,OAAO,KAAK;AACzC;AACA;AAAA,MACF;AAGA,UAAI,aAAa,KAAK,MAAM,CAAC,CAAC,GAAG;AAC/B,YAAI,IAAI;AACR,eAAO,IAAI,MAAM,UAAU,kBAAkB,KAAK,MAAM,CAAC,CAAC,EAAG;AAC7D,cAAM,QAAQ,MAAM,UAAU,GAAG,CAAC;AAGlC,YAAI,UAAU,UAAU,UAAU,SAAS;AACzC,iBAAO,KAAK,EAAE,MAAM,WAAW,OAAO;AAAA,QACxC,WAES,UAAU,QAAQ;AACzB,iBAAO,KAAK,EAAE,MAAM,QAAQ,OAAO;AAAA,QACrC,WAGE;AAAA,UACE,GAAG,uBAAuB;AAAA,UAC1B,GAAG,uBAAuB;AAAA,QAAA,EAC1B,SAAS,MAAM,YAAA,CAAa,GAC9B;AACA,iBAAO,KAAK,EAAE,MAAM,YAAY,OAAO,MAAM,YAAA,GAAe;AAAA,QAC9D,OAEK;AACH,iBAAO,KAAK,EAAE,MAAM,cAAc,OAAO;AAAA,QAC3C;AACA,YAAI;AACJ;AAAA,MACF;AAGA,YAAM,IAAID,SAAAA,oCAAoC,MAAM,CAAC,GAAG,CAAC;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,QAAsB;AACpB,QAAI,KAAK,aAAa,KAAK,QAAQ,OAAQ,QAAO;AAClD,WAAO,KAAK,QAAQ,KAAK,SAAS;AAAA,EACpC;AAAA,EAEA,WAAyB;AACvB,QAAI,KAAK,aAAa,KAAK,QAAQ,OAAQ,QAAO;AAClD,WAAO,KAAK,QAAQ,KAAK,WAAW;AAAA,EACtC;AAAA,EAEA,QAAQ,MAAqB,OAAuB;AAClD,UAAM,QAAQ,KAAK,SAAA;AACnB,QAAI,CAAC,SAAS,MAAM,SAAS,QAAS,UAAU,UAAa,MAAM,UAAU,OAAQ;AACnF,YAAM,IAAIE,SAAAA,+BAA+B,MAAM,OAAO,KAAK;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAA4B;AAC1B,WAAO,KAAK,gBAAA;AAAA,EACd;AAAA,EAEA,kBAA2B;AACzB,QAAI,OAAO,KAAK,iBAAA;AAEhB,WAAO,KAAK,SAAS,SAAS,cAAc,KAAK,MAAA,GAAS,UAAU,MAAM;AACxE,WAAK,SAAA;AACL,YAAM,QAAQ,KAAK,iBAAA;AACnB,aAAO,EAAE,MAAM,WAAW,UAAU,MAAM,MAAM,MAAA;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,mBAA4B;AAC1B,QAAI,OAAO,KAAK,UAAA;AAEhB,WAAO,KAAK,SAAS,SAAS,cAAc,KAAK,MAAA,GAAS,UAAU,OAAO;AACzE,WAAK,SAAA;AACL,YAAM,QAAQ,KAAK,UAAA;AACnB,aAAO,EAAE,MAAM,WAAW,UAAU,OAAO,MAAM,MAAA;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAqB;AACnB,QAAI,KAAK,SAAS,SAAS,cAAc,KAAK,MAAA,GAAS,UAAU,OAAO;AACtE,WAAK,SAAA;AACL,aAAO,EAAE,MAAM,WAAW,UAAU,OAAO,SAAS,KAAK,YAAU;AAAA,IACrE;AAEA,WAAO,KAAK,iBAAA;AAAA,EACd;AAAA,EAEA,mBAA4B;AAC1B,QAAI,OAAO,KAAK,cAAA;AAEhB,UAAM,QAAQ,KAAK,MAAA;AACnB,QACE,OAAO,SAAS,cAChB,uBAAuB,sBAAsB,SAAS,MAAM,KAAK,GACjE;AACA,YAAM,WAAW,KAAK,SAAA,EAAY;AAElC,UAAI,aAAa,MAAM;AAErB,aAAK,QAAQ,QAAQ;AACrB,cAAM,SAAoB,CAAA;AAC1B,YAAI,KAAK,SAAS,SAAS,UAAU;AACnC,iBAAO,KAAK,KAAK,eAAe;AAChC,iBAAO,KAAK,SAAS,SAAS,SAAS;AACrC,iBAAK,SAAA;AACL,mBAAO,KAAK,KAAK,eAAe;AAAA,UAClC;AAAA,QACF;AACA,aAAK,QAAQ,QAAQ;AACrB,eAAO,EAAE,MAAM,cAAc,UAAU,MAAM,MAAM,OAAO,OAAA;AAAA,MAC5D,OAAO;AACL,cAAM,QAAQ,KAAK,cAAA;AACnB,eAAO,EAAE,MAAM,cAAc,UAAU,MAAM,MAAA;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAyB;AACvB,UAAM,QAAQ,KAAK,MAAA;AAEnB,QAAI,CAAC,OAAO;AACV,YAAM,IAAID,SAAAA,uCAAA;AAAA,IACZ;AAGA,QAAI,MAAM,SAAS,UAAU;AAC3B,WAAK,SAAA;AACL,YAAM,OAAO,KAAK,iBAAA;AAClB,WAAK,QAAQ,QAAQ;AACrB,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,SAAS,cAAc;AAC/B,YAAM,YAAY,KAAK,QAAQ,KAAK,YAAY,CAAC;AACjD,UAAI,WAAW,SAAS,UAAU;AAChC,eAAO,KAAK,mBAAA;AAAA,MACd;AAEA,YAAM,aAAa,KAAK,SAAA;AACxB,aAAO,EAAE,MAAM,YAAY,MAAM,WAAW,MAAA;AAAA,IAC9C;AAGA,QAAI,MAAM,SAAS,UAAU;AAC3B,WAAK,SAAA;AACL,aAAO,EAAE,MAAM,WAAW,UAAU,UAAU,OAAO,MAAM,MAAA;AAAA,IAC7D;AAGA,QAAI,MAAM,SAAS,UAAU;AAC3B,WAAK,SAAA;AACL,aAAO,EAAE,MAAM,WAAW,UAAU,UAAU,OAAO,OAAO,WAAW,MAAM,KAAK,EAAA;AAAA,IACpF;AAGA,QAAI,MAAM,SAAS,WAAW;AAC5B,WAAK,SAAA;AACL,aAAO,EAAE,MAAM,WAAW,UAAU,WAAW,OAAO,MAAM,UAAU,OAAA;AAAA,IACxE;AAGA,QAAI,MAAM,SAAS,QAAQ;AACzB,WAAK,SAAA;AACL,aAAO,EAAE,MAAM,WAAW,UAAU,QAAQ,OAAO,KAAA;AAAA,IACrD;AAGA,QAAI,MAAM,SAAS,aAAa;AAC9B,WAAK,SAAA;AACL,YAAM,aAAa,KAAK,SAAS,IAAI,MAAM,KAAK;AAChD,UAAI,CAAC,YAAY;AACf,cAAM,IAAIE,SAAAA,gCAAgC,MAAM,KAAK;AAAA,MACvD;AAEA,aAAO,KAAK,mBAAmB,UAAU;AAAA,IAC3C;AACA,UAAM,IAAIC,SAAAA,gCAAgC,KAAK;AAAA,EACjD;AAAA,EAEA,qBAA8B;AAC5B,UAAM,WAAW,KAAK,SAAA,EAAY,MAAM,YAAA;AACxC,SAAK,QAAQ,QAAQ;AAErB,UAAM,OAAkB,CAAA;AACxB,QAAI,KAAK,SAAS,SAAS,UAAU;AACnC,WAAK,KAAK,KAAK,kBAAkB;AACjC,aAAO,KAAK,SAAS,SAAS,SAAS;AACrC,aAAK,SAAA;AACL,aAAK,KAAK,KAAK,kBAAkB;AAAA,MACnC;AAAA,IACF;AAEA,SAAK,QAAQ,QAAQ;AACrB,WAAO,EAAE,MAAM,YAAY,MAAM,UAAU,WAAW,KAAA;AAAA,EACxD;AAAA,EAEA,mBAAmB,OAAwB;AAEzC,QAAI,iCAAiC,KAAK,KAAK,GAAG;AAChD,aAAO,EAAE,MAAM,WAAW,UAAU,UAAU,OAAO,OAAO,WAAW,KAAK,EAAA;AAAA,IAC9E;AAGA,QAAI,UAAU,UAAU,UAAU,SAAS;AACzC,aAAO,EAAE,MAAM,WAAW,UAAU,WAAW,OAAO,UAAU,OAAA;AAAA,IAClE;AAGA,QAAI,UAAU,QAAQ;AACpB,aAAO,EAAE,MAAM,WAAW,UAAU,QAAQ,OAAO,KAAA;AAAA,IACrD;AAGA,QAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAChD,cAAQ,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG;AAAA,IAC/C;AAEA,WAAO,EAAE,MAAM,WAAW,UAAU,UAAU,MAAA;AAAA,EAChD;AAAA,EAEA,iBACE,MACA,OAC8B;AAE9B,QAAI,KAAK,SAAS,YAAY;AAC5B,aAAO,KAAK;AAAA,QACV;AAAA,UACE,MAAM;AAAA,UACN,UAAU;AAAA,UACV,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,WAAW,UAAU,WAAW,OAAO,KAAA;AAAA,QAAK;AAAA,QAE7D;AAAA,MAAA;AAAA,IAEJ;AACA,QAAI,KAAK,SAAS,YAAY;AAC5B,aAAO,KAAK;AAAA,QACV;AAAA,UACE,MAAM;AAAA,UACN,UAAU;AAAA,UACV,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,WAAW,UAAU,WAAW,OAAO,KAAA;AAAA,QAAK;AAAA,QAE7D;AAAA,MAAA;AAAA,IAEJ;AAEA,YAAQ,KAAK,MAAA;AAAA,MACX,KAAK;AACH,eAAO,KAAK,sBAAsB,MAAM,KAAK;AAAA,MAC/C,KAAK;AACH,eAAO,KAAK,yBAAyB,MAAM,KAAK;AAAA,MAClD;AACE,cAAM,IAAIC,SAAAA,sCAAsC,IAAI;AAAA,IAAA;AAAA,EAE1D;AAAA,EAEA,sBACE,MACA,OAC8B;AAC9B,YAAQ,KAAK,UAAA;AAAA,MACX,KAAK;AACH,eAAO,MACJ,MAAM,CAAC,aAAa;AACnB,eAAK,iBAAiB,KAAK,MAAM,QAAQ;AAAA,QAC3C,CAAC,EACA,MAAM,CAAC,aAAa;AACnB,eAAK,iBAAiB,KAAK,OAAO,QAAQ;AAAA,QAC5C,CAAC;AAAA,MAEL,KAAK;AACH,eAAO,MAAM,MAAM,CAAC,aAAa;AAC/B,mBACG,MAAM,CAAC,OAAO,KAAK,iBAAiB,KAAK,MAAM,EAAE,CAAC,EAClD,QAAQ,CAAC,OAAO,KAAK,iBAAiB,KAAK,OAAO,EAAE,CAAC;AAAA,QAC1D,CAAC;AAAA,MAEH,KAAK;AACH,eAAO,MAAM,SAAS,CAAC,aAAa;AAClC,eAAK,iBAAiB,KAAK,SAAS,QAAQ;AAAA,QAC9C,CAAC;AAAA,MAEH;AACE,cAAM,IAAIC,SAAAA,wCAAwC,IAAI;AAAA,IAAA;AAAA,EAE5D;AAAA,EAEA,yBACE,MACA,OAC8B;AAC9B,UAAM,OAAO,KAAK,cAAc,KAAK,IAAI;AACzC,UAAM,QACJ,KAAK,aAAa,OACd,KAAK,MAAM,IAAI,CAAC,MAAe,KAAK,cAAc,CAAC,CAAC,IACpD,KAAK,cAAc,KAAK,KAAK;AAGnC,QAAI,OAAO,SAAS,YAAY,KAAK,SAAS,UAAU;AACtD,YAAM,SAAS,KAAK,eAAe,KAAK,IAAI;AAE5C,UAAI,KAAK,aAAa,QAAQ,UAAU,KAAM,QAAO,MAAM,UAAU,MAAM;AAC3E,UAAI,KAAK,aAAa,QAAQ,UAAU,KAAM,QAAO,MAAM,aAAa,MAAM;AAE9E,cAAQ,KAAK,UAAA;AAAA,QACX,KAAK;AACH,iBAAO,UAAU,OAAO,MAAM,UAAU,MAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,QAClF,KAAK;AACH,iBAAO,UAAU,OAAO,MAAM,aAAa,MAAM,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,QACtF,KAAK;AACH,iBAAO,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,QACvC,KAAK;AACH,iBAAO,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,QACxC,KAAK;AACH,iBAAO,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,QACvC,KAAK;AACH,iBAAO,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,QACxC,KAAK;AACH,iBAAO,MAAM,QAAQ,QAAQ,KAAc;AAAA,QAC7C,KAAK;AAGH,gBAAM,OAAO;AACb,iBAAO,MAAM,SAAS,gBAAgB,CAAC,QAAQ,MAAM,IAAI,CAAC;AAAA,QAC5D;AACE,gBAAM,IAAIC,SAAAA,2CAA2C,IAAI;AAAA,MAAA;AAAA,IAE/D;AAIA,QACE,EAAE,OAAO,SAAS,YAAY,KAAK,SAAS,aAC5C,OAAO,UAAU,YACjB,MAAM,SAAS,UACf;AACA,YAAM,SAAS,KAAK,eAAe,MAAM,IAAI;AAC7C,YAAM,QAAQ;AAEd,cAAQ,KAAK,UAAA;AAAA,QACX,KAAK;AACH,iBAAO,UAAU,OAAO,MAAM,UAAU,MAAM,IAAI,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,QAClF,KAAK;AACH,iBAAO,UAAU,OAAO,MAAM,aAAa,MAAM,IAAI,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,QACtF,KAAK;AAEH,iBAAO,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,QACvC,KAAK;AAEH,iBAAO,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,QACxC,KAAK;AAEH,iBAAO,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,QACvC,KAAK;AAEH,iBAAO,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA;AAAA,QAExC;AACE,gBAAM,IAAIA,SAAAA,2CAA2C,IAAI;AAAA,MAAA;AAAA,IAE/D;AAGA,QAAI,OAAO,SAAS,YAAY,KAAK,SAAS,YAAY;AACxD,aAAO,KAAK,yBAAyB,MAAM,KAAK,UAAU,OAAO,KAAK;AAAA,IACxE;AAEA,UAAM,IAAIC,SAAAA,uCAAA;AAAA,EACZ;AAAA,EAEA,cAAc,MAAoB;AAChC,YAAQ,KAAK,MAAA;AAAA,MACX,KAAK;AACH,eAAO,KAAK;AAAA,MAEd,KAAK;AACH,eAAO,EAAE,MAAM,UAAU,MAAM,KAAK,KAAA;AAAA,MAEtC,KAAK;AACH,eAAO,KAAK,kBAAkB,IAAI;AAAA,MAEpC;AACE,cAAM,IAAIT,SAAAA,uCAAuC,IAAI;AAAA,IAAA;AAAA,EAE3D;AAAA,EAEA,kBAAkB,MAAoB;AACpC,UAAM,WAAW,KAAK,KAAK,YAAA;AAG3B,QACE,uBAAuB,kBAAkB,SAAS,QAAQ,KAC1D,uBAAuB,gBAAgB,SAAS,QAAQ,KACxD,uBAAuB,gBAAgB,SAAS,QAAQ,GACxD;AACA,aAAO,EAAE,MAAM,YAAY,MAAM,UAAU,WAAW,KAAK,UAAA;AAAA,IAC7D;AAGA,QAAI,aAAa,aAAa,KAAK,UAAU,WAAW,GAAG;AACzD,YAAM,MAAM,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC;AAChD,UAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,YAAA;AAAA,IAC1C;AAEA,QAAI,aAAa,aAAa,KAAK,UAAU,WAAW,GAAG;AACzD,YAAM,MAAM,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC;AAChD,UAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,YAAA;AAAA,IAC1C;AAEA,WAAO,EAAE,MAAM,YAAY,MAAM,UAAU,WAAW,KAAK,UAAA;AAAA,EAC7D;AAAA,EAEA,YAAY,GAAW,MAAM,MAAM;AACjC,WAAO,EAAE,QAAQ,WAAW,CAAC,MAAM,MAAM,CAAC;AAAA,EAC5C;AAAA,EAEA,SAAS,OAAqC;AAC5C,UAAM,SACH,MAAc,QAAQ,QAAQ,QAAQ,UAAW,MAAc,QAAQ,SAAS;AAEnF,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAqC;AAC3C,WAAO,KAAK,SAAS,KAAK,MAAM,OAAO,UAAU;AAAA,EACnD;AAAA,EAEA,yBACE,MACA,UACA,OACA,OAC8B;AAC9B,UAAM,WAAW,KAAK,KAAK,YAAA;AAG3B,QAAI,aAAa,cAAc,KAAK,UAAU,WAAW,GAAG;AAC1D,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,MAAM,OAAO,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC,KAAK,EAAE;AAC9D,YAAM,OAAO,IAAI,KAAK,YAAY,GAAG,CAAC;AACtC,YAAM,OAAO,KAAK,QAAQ,KAAK;AAM/B,YAAM,eAAe,KAAK,iBAAiB,UAAU,KAAK;AAE1D,UAAI,aAAa,MAAM;AACrB,eAAO,UAAU,OACb,MAAM,SAAS,MAAM,IAAI,KAAK,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,IAC5D,MAAM,SAAS,WAAW,IAAI,KAAK,YAAY,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,MACxE;AAAA,IACF;AACA,QAAI,aAAa,gBAAgB,KAAK,UAAU,WAAW,GAAG;AAC5D,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,MAAM,OAAO,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC,KAAK,EAAE;AAC9D,YAAM,OAAO,GAAG,KAAK,YAAY,GAAG,CAAC;AACrC,YAAM,OAAO,KAAK,QAAQ,KAAK;AAM/B,YAAM,eAAe,KAAK,iBAAiB,UAAU,KAAK;AAC1D,UAAI,aAAa,MAAM;AACrB,eAAO,UAAU,OACb,MAAM,SAAS,MAAM,IAAI,KAAK,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,IAC5D,MAAM,SAAS,WAAW,IAAI,KAAK,YAAY,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,MACxE;AAAA,IACF;AAEA,QAAI,aAAa,cAAc,KAAK,UAAU,WAAW,GAAG;AAC1D,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,MAAM,OAAO,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC,KAAK,EAAE;AAC9D,YAAM,OAAO,IAAI,KAAK,YAAY,GAAG,CAAC;AACtC,YAAM,OAAO,KAAK,QAAQ,KAAK;AAM/B,YAAM,eAAe,KAAK,iBAAiB,UAAU,KAAK;AAC1D,UAAI,aAAa,MAAM;AACrB,eAAO,UAAU,OACb,MAAM,SAAS,MAAM,IAAI,KAAK,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,IAC5D,MAAM,SAAS,WAAW,IAAI,KAAK,YAAY,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,MACxE;AAAA,IACF;AAEA,QAAI,aAAa,YAAY,KAAK,UAAU,WAAW,GAAG;AACxD,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,YAAM,IAAI,KAAK,WAAA;AACf,aAAO,MAAM,SAAS,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC;AAAA,IACpE;AAEA,QAAI,aAAa,aAAa,KAAK,UAAU,WAAW,GAAG;AACzD,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,cAAc,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,YAAM,IAAI,KAAK,WAAA;AAGf,YAAM,OAAO,KAAK,iBAAiB;AACnC,YAAM,SAAS,OAAO,CAAC,aAAa,QAAQ,KAAK,IAAI,CAAC,QAAQ,aAAa,KAAK;AAChF,aAAO,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,MAAM;AAAA,IACnE;AAEA,QAAI,aAAa,eAAe,KAAK,UAAU,UAAU,GAAG;AAC1D,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,aAAa,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC;AACvD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,YAAM,IAAI,KAAK,WAAA;AAEf,UAAI,KAAK,UAAU,WAAW,GAAG;AAE/B,eAAO,MAAM,SAAS,GAAG,EAAE,QAAQ,MAAM,SAAS,CAAC,IAAI,KAAK,MAAM;AAAA,UAChE;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH,WAAW,KAAK,UAAU,WAAW,GAAG;AAEtC,cAAM,SAAS,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC;AACnD,eAAO,MAAM,SAAS,GAAG,EAAE,QAAQ,MAAM,WAAW,GAAG,CAAC,IAAI,KAAK,MAAM;AAAA,UACrE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IACF;AAEA,QAAI,aAAa,UAAU,KAAK,UAAU,WAAW,GAAG;AACtD,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,aAAO,MAAM,SAAS,YAAY,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC;AAAA,IAC9D;AAEA,QAAI,aAAa,YAAY,KAAK,UAAU,WAAW,GAAG;AACxD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,YAAM,IAAI,KAAK,WAAA;AAEf,YAAM,IAAI,KAAK,WAAW,KAAK,UAAU,CAAC,CAAC;AAC3C,YAAM,IAAI,KAAK,WAAW,KAAK,UAAU,CAAC,CAAC;AAC3C,aAAO,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM;AAAA,QAC5D,GAAG,EAAE;AAAA,QACL,GAAG,EAAE;AAAA,QACL;AAAA,MAAA,CACD;AAAA,IACH;AAGA,QAAI,aAAa,aAAa,KAAK,UAAU,WAAW,GAAG;AACzD,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,aAAO,MAAM,SAAS,aAAa,KAAK,aAAa,CAAC,QAAQ,KAAK,CAAC;AAAA,IACtE;AAEA,QAAI,aAAa,aAAa,KAAK,UAAU,WAAW,GAAG;AACzD,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,aAAO,MAAM,SAAS,aAAa,KAAK,aAAa,CAAC,QAAQ,KAAK,CAAC;AAAA,IACtE;AACA,QAAI,uBAAuB,gBAAgB,SAAS,QAAQ,KAAK,KAAK,UAAU,WAAW,GAAG;AAC5F,YAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AACrD,YAAM,IAAI,KAAK,WAAA;AACf,UAAI;AACJ,cAAQ,UAAA;AAAA,QACN,KAAK;AACH,iBAAO,EAAE,KAAK,IAAI;AAClB;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,MAAM,IAAI;AACnB;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,IAAI,IAAI;AACjB;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,KAAK,IAAI;AAClB;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,OAAO,IAAI;AACpB;AAAA,QACF,KAAK;AACH,iBAAO,EAAE,OAAO,IAAI;AACpB;AAAA,QACF;AACE,gBAAM,IAAIU,SAAAA,+CAA+C,QAAQ;AAAA,MAAA;AAErE,aAAO,MAAM,SAAS,GAAG,IAAI,IAAI,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC;AAAA,IAC7D;AAGA,QAAI,uBAAuB,gBAAgB,SAAS,QAAQ,GAAG;AAC7D,YAAM,IAAI,KAAK,WAAA;AACf,YAAM,QAAQ,KAAK,0BAA0B,QAAQ;AAErD,UAAI,aAAa,YAAY,KAAK,UAAU,WAAW,KAAK,KAAK,UAAU,WAAW,IAAI;AACxF,cAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,YAAI,KAAK,UAAU,WAAW,GAAG;AAE/B,iBAAO,MAAM,SAAS,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC;AAAA,QACtE,OAAO;AAEL,gBAAM,YAAY,KAAK,cAAc,KAAK,UAAU,CAAC,CAAC;AACtD,iBAAO,MAAM,SAAS,GAAG,EAAE,MAAM,MAAM,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,WAAW,KAAK,CAAC;AAAA,QACtF;AAAA,MACF,WAAW,aAAa,WAAW,KAAK,UAAU,WAAW,GAAG;AAC9D,cAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,eAAO,MAAM,SAAS,GAAG,EAAE,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC;AAAA,MACtE,WAAW,aAAa,aAAa,KAAK,UAAU,WAAW,GAAG;AAChE,cAAM,SAAS,KAAK,mBAAmB,KAAK,UAAU,CAAC,CAAC;AACxD,eAAO,MAAM,SAAS,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC;AAAA,MACrE;AAAA,IACF;AACA,UAAM,IAAIA,SAAAA,+CAA+C,QAAQ;AAAA,EACnE;AAAA,EAEA,mBAAmB,MAAuB;AACxC,UAAM,SAAS,KAAK,cAAc,IAAI;AACtC,QAAI,OAAO,WAAW,YAAY,OAAO,SAAS,UAAU;AAC1D,aAAO,KAAK,eAAe,OAAO,IAAI;AAAA,IACxC;AACA,UAAM,IAAIC,SAAAA,yCAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,eAAe,KAAqB;AAElC,QAAI,KAAK,aAAa,IAAI,GAAG,GAAG;AAC9B,aAAO,KAAK,aAAa,IAAI,GAAG;AAAA,IAClC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,0BAA0B,UAA0B;AAClD,UAAM,UAAkC;AAAA,MACtC,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAEN,WAAO,QAAQ,QAAQ,KAAK;AAAA,EAC9B;AAAA;AAGF;ACr2BA,MAAM,UAAU,CAAC,MAAc,UAAe;AAC5C,MAAI,iBAAiB,MAAM;AACzB,WAAOhD,eAAS,WAAW,KAAK,EAAE,MAAA;AAAA,EACpC;AACA,MAAI,iBAAiBA,MAAAA,UAAU;AAC7B,WAAO,MAAM,MAAA;AAAA,EACf;AAEA,MACE,SACA,OAAO,UAAU,YACjB,MAAM,oBAAoB,QAC1B,OAAO,MAAM,UAAU,YACvB;AACA,WAAO,MAAM,MAAA;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,SAAA;AAAA,EACf;AACA,MAAI,OAAO,UAAU,UAAU;AAI7B,QAAI,OAAO,sBAAsB,OAAO;AACtC,aAAO;AAAA,IACT;AACA,QAAI,OAAO,sBAAsB,OAAO;AACtC,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,KAAK,GAAG;AACvB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,MAAM,oBAAoB,CAAC,QAAkB;AAC3C,QAAM,kBAAkB,GAAG;AAC3B,MAAI,CAAC5F,oBAAAA,WAAS,GAAG,GAAG;AAClB,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAAA,IACZ,CAAA;AAAA,IACA,GAAG,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC3C,cAAQ,QAAQ,KAAK,KAAK;AAC1B,UAAIA,oBAAAA,WAAS,KAAK,GAAG;AACnB,eAAO,EAAE,CAAC,QAAQ,GAAG,EAAE,GAAG,kBAAkB,KAAK,EAAA;AAAA,MACnD,WAAW+F,4BAAQ,KAAK,GAAG;AACzB,eAAO,EAAE,CAAC,QAAQ,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,kBAAkB,CAAC,CAAC,EAAA;AAAA,MACjE;AACA,aAAO,EAAE,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,OAAO,OAAO,KAAK,IAAE;AAAA,IACnD,CAAC;AAAA,EAAA;AAEL;AAEA,MAAM,2CAA2C,CAC/C,WACmB;AACnB,WAAS,kBAAkB,MAAM;AACjC,QAAM,MAAsB;AAAA,IAC1B,uBAAuB,kBAAkB,MAAM;AAAA,EAAA;AAEjD,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,WAAgB;AACpC,MAAI,UAAU,OAAO,OAAO,WAAW,YAAY;AACjD,QAAI;AACF,aAAO,kBAAkB,OAAO,QAAQ;AAAA,IAC1C,QAAQ;AACN,aAAO,kBAAkB,EAAE,GAAG,QAAQ;AAAA,IACxC;AAAA,EACF;AACA,SAAO,kBAAkB,MAAM;AACjC;AAWA,MAAM,kCAAkC,CAAC,SAAuC;AAC9E,MAAIiC,iCAAa,MAAM,yBAAyB3E,YAAAA,qBAAqB,GAAG;AACtE,WAAO;AAAA,EACT;AACA,MAAI2E,iCAAa,MAAM,yBAAyB7E,YAAAA,qBAAqB,GAAG;AACtE,WAAO;AAAA,EACT;AACA,QAAM,YAAY6E,oBAAAA,aAAa,MAAM,0BAA0B5E,YAAAA,sBAAsB;AACrF,QAAM,aAAa4E,oBAAAA;AAAAA,IACjB;AAAA,IACA;AAAA,IACA1E,YAAAA;AAAAA,EAAA;AAEF,MAAI,CAAC,aAAa,CAAC,YAAY;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU;AAChB,QAAM,MAAM,aAAa,IAAI,QAAQ,mBAAmB,QAAQ,UAAU,IAAI,QAAQ;AACtF,QAAM,MAAM,QAAQ,mBAChB,QAAQ,UACR,OAAO,QAAQ,YAAY,WACxB,QAAQ,UAAgC,OAAO,CAAC,IAChD,QAAQ,UAAqB;AAEpC,SAAO,MAAM,eAAmB,MAAiB;AACnD;AAYA,MAAM,sBAAsB,OAC1B,WACA,KACA,QACuC;AACvC,QAAM,4BAAuC,IAAA;AAE7C,QAAM,QAAQ,OAAO,UAA2C;AAC9D,QAAI,MAAM,IAAI,KAAK,EAAG;AACtB,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,MAAM,4BAA4B,KAAK,GAAG;AAAA,IACzD,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,IAAI,OAAO,IAAI;AAErB,eAAW,QAAQ,OAAO,OAAO,KAAK,UAAU,GAAG;AACjD,UAAI,KAAK,SAAS,eAAgB;AAClC,UAAI;AACF,cAAM,UAAU,KAAK,aAAA;AACrB,YAAIrD,gBAAAA,mBAAmB,OAAO,GAAG;AAC/B,gBAAM,MAAM,OAAO;AAAA,QACrB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,QAAM,MAAM,SAAS;AACrB,SAAO;AACT;AAcA,MAAM,qBAAqB,CACzB,QACA,SACA,sBACS;AACT,QAAM,QAAQ,OAAO,OAAO;AAE5B,MAAI,UAAU,QAAQ,UAAU,OAAW;AAG3C,MAAI,mBAAmB;AAErB,QAAI,OAAO,UAAU,SAAU;AAC/B,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,OAAO,IAAI,MAAM,SAAA;AACxB;AAAA,IACF;AAGA,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,aAAO,OAAO,IAAI,OAAO,KAAK;AAAA,IAChC;AACA;AAAA,EACF;AAMA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,IAAI,OAAO,KAAK;AAC9B;AAAA,EACF;AACA,MAAI,OAAO,UAAU,SAAU;AAC/B,QAAM,MAAM,OAAO,KAAK;AAExB,MAAI,OAAO,MAAM,GAAG,KAAK,CAAC,OAAO,SAAS,GAAG,EAAG;AAChD,SAAO,OAAO,IAAI;AACpB;AASA,MAAM,yBAAyB,CAC7B,QACA,OACA,mBACA,WACA,UAAiC,oBAAI,UAC5B;AACT,MAAI,QAAQ,IAAI,KAAK,EAAG;AACxB,QAAM,OAAO,UAAU,IAAI,KAAK;AAGhC,MAAI,CAAC,KAAM;AACX,QAAM,cAAc,IAAI,IAAI,OAAO;AACnC,cAAY,IAAI,KAAK;AAErB,aAAW,CAAC,aAAa,IAAI,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAEjE,QAAI,KAAK,SAAS,YAAY,KAAK,SAAS,oBAAoB;AAC9D,YAAM,cAAe,KAAK,kBACtB;AAGJ,UAAI,gBAAgB,KAAM;AAC1B,YAAM,UAAU,eAAe;AAG/B,UAAI,EAAE,WAAW,QAAS;AAI1B,UAAI,CAAC,gCAAgC,KAAK,WAAW,IAAI,EAAG;AAC5D,yBAAmB,QAAQ,SAAS,iBAAiB;AACrD;AAAA,IACF;AACA,QAAI,KAAK,SAAS,eAAgB;AAGlC,QAAI,EAAE,eAAe,QAAS;AAC9B,UAAM,SAAS,OAAO,WAAW;AACjC,QAAI,WAAW,QAAQ,WAAW,OAAW;AAC7C,QAAI,eAAwC;AAC5C,QAAI;AACF,YAAM,UAAU,KAAK,aAAA;AACrB,UAAIA,mCAAmB,OAAO,EAAG,gBAAe;AAAA,IAClD,QAAQ;AAAA,IAER;AACA,QAAI,CAAC,aAAc;AAKnB,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,iBAAW,QAAQ,QAAQ;AACzB,YAAI,QAAQ,OAAO,SAAS,UAAU;AACpC;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AACF;AAkDA,MAAM,qCAAqCM,IAAAA,IAAI,OAAqC;AAAA,EAClF,OAAOA,IAAAA,IACJ,QACA,MAAMA,IAAAA,IAAI,aAAA,EAAe,IAAIA,IAAAA,IAAI,OAAA,EAAS,SAAA,GAAYA,IAAAA,IAAI,OAAA,EAAS,UAAU,UAAU,CAAC,EACxF,SAAA;AACL,CAAC;AAiCM,MAAM+G,4BAA2B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YACE,SACA,OACA,SACA,SAGA,qCACA,sCACA,sCACA,0BACA;AACA,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,YAAY,IAAI,MAAA;AACrB,SAAK,oBAAoB;AAAA,MACvB,GAAI,uCAAuC,CAAA;AAAA,MAC3C,GAAI,KAAK,SAAS,oBAAoB,CAAA;AAAA,IAAC;AAEzC,SAAK,sBAAsB;AAAA,MACzB,GAAI,wCAAwC,CAAA;AAAA,MAC5C,GAAI,KAAK,SAAS,sBAAsB,CAAA;AAAA,IAAC;AAE3C,QAAItH,oBAAAA,WAAS,oCAAoC,GAAG;AAClD,UACE,WAAW,wCACX+F,oBAAAA,QAAQ,qCAAqC,KAAK,GAClD;AACA,6CAAqC,MAAM,QAAQ,CAAC,SAAS;AAC3D,eAAK,UAAU,IAAI,SAAS,IAAoC;AAAA,QAClE,CAAC;AAAA,MACH;AACA,UACE,YAAY,wCACZA,oBAAAA,QAAQ,qCAAqC,MAAM,GACnD;AACA,6CAAqC,OAAO,QAAQ,CAAC,SAAS;AAC5D,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AACA,UACE,UAAU,wCACVA,oBAAAA,QAAQ,qCAAqC,IAAI,GACjD;AACA,6CAAqC,KAAK,QAAQ,CAAC,SAAS;AAC1D,eAAK,UAAU,IAAI,QAAQ,IAA6C;AAAA,QAC1E,CAAC;AAAA,MACH;AACA,UACE,iBAAiB,wCACjBA,oBAAAA,QAAQ,qCAAqC,WAAW,GACxD;AACA,6CAAqC,YAAY,QAAQ,CAAC,SAAS;AACjE,eAAK,UAAU,IAAI,eAAe,IAA6C;AAAA,QACjF,CAAC;AAAA,MACH;AACA,UACE,YAAY,wCACZA,oBAAAA,QAAQ,qCAAqC,MAAM,GACnD;AACA,6CAAqC,OAAO,QAAQ,CAAC,SAAS;AAC5D,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI/F,+BAAS,KAAK,SAAS,QAAQ,GAAG;AACpC,UAAI,WAAW,KAAK,SAAS,YAAY+F,4BAAQ,KAAK,SAAS,SAAS,KAAK,GAAG;AAC9E,aAAK,SAAS,SAAS,MAAM,QAAQ,CAAC,SAAS;AAC7C,eAAK,UAAU,IAAI,SAAS,IAAoC;AAAA,QAClE,CAAC;AAAA,MACH;AACA,UAAI,YAAY,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,MAAM,GAAG;AAChF,aAAK,SAAS,SAAS,OAAO,QAAQ,CAAC,SAAS;AAC9C,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AACA,UAAI,UAAU,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,IAAI,GAAG;AAC5E,aAAK,SAAS,SAAS,KAAK,QAAQ,CAAC,SAAS;AAC5C,eAAK,UAAU,IAAI,QAAQ,IAA6C;AAAA,QAC1E,CAAC;AAAA,MACH;AACA,UAAI,iBAAiB,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,WAAW,GAAG;AAC1F,aAAK,SAAS,SAAS,YAAY,QAAQ,CAAC,SAAS;AACnD,eAAK,UAAU,IAAI,eAAe,IAA6C;AAAA,QACjF,CAAC;AAAA,MACH;AACA,UAAI,YAAY,KAAK,SAAS,YAAYA,4BAAQ,KAAK,SAAS,SAAS,MAAM,GAAG;AAChF,aAAK,SAAS,SAAS,OAAO,QAAQ,CAAC,SAAS;AAC9C,eAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,QAC5E,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,0BAA0B;AAC5B,+BAAyB,QAAQ,CAAC,WAAW;AAC3C,YAAI,OAAO,OAAO;AAChB,eAAK,kBAAkB,KAAK,OAAO,KAAK;AAAA,QAC1C;AACA,YAAI,OAAO,SAAS;AAClB,eAAK,oBAAoB,KAAK,OAAO,OAAO;AAAA,QAC9C;AACA,YAAI/F,oBAAAA,WAAS,OAAO,QAAQ,GAAG;AAC7B,cAAI,WAAW,OAAO,YAAY+F,oBAAAA,QAAQ,OAAO,SAAS,KAAK,GAAG;AAChE,mBAAO,SAAS,MAAM,QAAQ,CAAC,SAAS;AACtC,mBAAK,UAAU,IAAI,SAAS,IAAoC;AAAA,YAClE,CAAC;AAAA,UACH;AACA,cAAI,YAAY,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,MAAM,GAAG;AAClE,mBAAO,SAAS,OAAO,QAAQ,CAAC,SAAS;AACvC,mBAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,YAC5E,CAAC;AAAA,UACH;AACA,cAAI,UAAU,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,IAAI,GAAG;AAC9D,mBAAO,SAAS,KAAK,QAAQ,CAAC,SAAS;AACrC,mBAAK,UAAU,IAAI,QAAQ,IAA6C;AAAA,YAC1E,CAAC;AAAA,UACH;AACA,cAAI,iBAAiB,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,WAAW,GAAG;AAC5E,mBAAO,SAAS,YAAY,QAAQ,CAAC,SAAS;AAC5C,mBAAK,UAAU,IAAI,eAAe,IAA6C;AAAA,YACjF,CAAC;AAAA,UACH;AACA,cAAI,YAAY,OAAO,YAAYA,oBAAAA,QAAQ,OAAO,SAAS,MAAM,GAAG;AAClE,mBAAO,SAAS,OAAO,QAAQ,CAAC,SAAS;AACvC,mBAAK,UAAU,IAAI,UAAU,IAA6C;AAAA,YAC5E,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,SAAK,kCAAkB,IAAA;AAAA,EACzB;AAAA,EAEA,aAAa,iDACX,OACA,KACA,KACA;AACA,UAAM,UAAuB,CAAA;AAC7B,UAAM;AAAA,MACJ,MAAM,4CAA4C;AAAA,MAClD,OAAO,YAAY;AACjB,cAAM,SAAS,MAAM,QAAQ,KAAK,GAAG;AACrC,YAAI,QAAQ;AACV,kBAAQ,KAAK,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,MACA,EAAE,aAAa,EAAA;AAAA,IAAE;AAEnB,QAAI,MAAMxF,IAAAA,IAAI,IAAA;AACd,YAAQ,QAAQ,CAAC,WAAW;AAC1B,YAAM,IAAI,OAAO,MAAM;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,0BACJ,KACA,OACA,KACA,YAAqB,OACrB;AACA,UAAM,SAAS,MAAM,MAAM,uBAAuB,KAAK,KAAK,OAAO;AACnE,UAAM,gBAAgB,MAAM,MAAM,4BAA4B,KAAK,GAAG;AACtE,UAAM,iBACJ,MAAM+G,4BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEJ,WAAO/G,IAAAA,IAAI;AAAA,MACT,OAAO;AAAA,QACL,CAAA;AAAA,QACA,GAAG,OAAO,KAAK,OAAO,UAAW,EAC9B,OAAO,CAAC,MAAM,MAAM,MAAM,UAAU,EACpC,IAAI,CAAC,yBAAyB;AAC7B,gBAAM,WACJ,CAAC,aACD,MAAM,QAAQ,OAAO,QAAQ,KAC7B,OAAO,SAAS,SAAS,oBAAoB;AAC/C,gBAAM,aAAa;AAAA,YACjB,CAAC,oBAAoB,GAAGA,IAAAA,IAAI,IAAA;AAAA,UAAI;AAElC,gBAAM,OAAO,cAAc,WAAW,oBAAoB;AAC1D,cAAI,MAAM;AACR,kBAAM,YAAY,KAAK;AACvB,gBAAI,WAAW;AACb,yBAAW,oBAAoB,IAAI;AAAA,YACrC;AAAA,UACF;AACA,cAAI;AACF,kBAAM,YAAY,eAAe,QAAQ,oBAAoB;AAC7D,gBAAI,WAAW;AACb,yBAAW,oBAAoB,IAAI,WAAW,oBAAoB,IAC9D,WAAW,oBAAoB,EAAE,OAAO,SAAS,IACjD;AAAA,YACN;AAAA,UACF,QAAQ;AAAA,UAER;AACA,cAAI,UAAU;AACZ,uBAAW,oBAAoB,IAAI,WAAW,oBAAoB,EAAE;AAAA,cAClEA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,YAAS;AAAA,UAEvB,OAAO;AACL,uBAAW,oBAAoB,IAAI,WAAW,oBAAoB,EAAE;AAAA,cAClEA,IAAAA,IAAI,IAAA,EAAM,SAAA;AAAA,YAAS;AAAA,UAEvB;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MAAA;AAAA,IACL;AAAA,EAEJ;AAAA,EAEA,MAAM,mBAAmB,UAAkB;AACzC,UAAM,eAAe,MAAMsI,8BAAA;AAC3B,QAAI,OAAO,aAAa;AACxB,QAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,cAAQ;AAAA,IACV;AACA,UAAM,QAAQ,CAAC,MAAM,aAAa,KAAK,QAAQ;AAC/C,WAAO,MAAM,KAAK,EAAE;AAAA,EACtB;AAAA,EAEA,MAAM,eAAe,aAAqB,MAAgB;AACxD,UAAM,eAAe,MAAMA,8BAAA;AAC3B,QAAI,OAAO,aAAa;AACxB,QAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,cAAQ;AAAA,IACV;AACA,UAAM,QAAQ,CAAC,MAAM,UAAU,GAAG,IAAI;AACtC,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA,EAEA,MAAM,0BAA0B;AAC9B,UAAM,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClD,KAAK;AAAA,MACL,OAAO,6BAA6B;AAAA,IAAA,CACrC;AACD,WAAO,EAAE,OAAO,IAAA;AAAA,EAClB;AAAA,EAEA,mBAAmB,KAAkB;AACnC,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,QAAI,WAAW,MAAM,QAAQ,IAAI,IAC7B,IAAI,KAAK,KAAK,GAAG,CAAC,KAClB,OAAO,SAAS,WACd,KAAK,WAAW,GAAG,IACjB,OACA,IAAI,IAAI,KACV;AACN,eAAW,SAAS,QAAQ,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,2BAA2B,KAAkB;AACjD,UAAM,EAAE,OAAO,IAAA,IAAQ,MAAM,KAAK,wBAAA;AAClC,UAAM,UAAU7C,uBAAAA,iBAAiB,GAAG;AACpC,UAAM,gBAAgB8C,uBAAAA,kBAAkB,GAAG;AAC3C,UAAM,aAAaC,uBAAAA,oBAAoB,GAAG;AAC1C,UAAM,oBAAoBC,uBAAAA,2BAA2B,GAAG;AACxD,UAAM,SAAS,IAAI,QAAQ,OAAA,KAAY;AACvC,UAAM,MAAM,IAAI,QAAQ,IAAA,KAAS;AACjC,QAAI,iBAAiB/C,SAAAA,sBAAsB;AACzC,YAAM,IAAIC,SAAAA,kBAAkB,CAAC,QAAQ,GAAG,CAAC;AAAA,IAC3C;AAMA,QAAI,gCAA2C,IAAA;AAC/C,QAAIjG,gBAAAA,mBAAmB,KAAK,GAAG;AAC7B,UAAI;AACF,oBAAY,MAAM,oBAAoB,OAAO,KAAK,GAAG;AAAA,MACvD,QAAQ;AACN,wCAAgB,IAAA;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,UAAU,CAAC,YAA4B;AAC3C,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU,CAAA;AAAA,QACV,MAAM;AAAA,MAAA,IACJ;AAEJ,UAAI,SAAS,OAAO,MAAM;AAE1B,aAAO,QAAQ,KAAK,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AAEvF,aAAO,QAAQ,KAAK,SAAS,OAAO,EAAE;AAAA,QAAQ,CAAC,CAAC,KAAK,KAAK,MACxD,IAAI,SAAS,OAAO,KAAK,KAAK;AAAA,MAAA;AAGhC,aAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC;AAEjF,UAAI,CAAC,IAAI,SAAS,UAAU,eAAe,GAAG;AAC5C,YAAI,SAAS,OAAO,iBAAiB,KAAK;AAAA,MAC5C;AACA,UAAI,SAAS,MAAM;AACjB,YAAI,SAAS,OAAO,QAAQ,SAAS,IAAI;AAAA,MAC3C;AAEA,UAAI,WAAW,OAAO,WAAW,OAAO,SAAS,QAAQ,OAAO,SAAS,aAAa;AACpF,YAAI,SAAS,KAAK,IAAI;AACtB;AAAA,MACF;AACA,UAAI,KAAK;AACP,YAAI,SAAS,OAAO,gBAAgB,YAAY;AAChD,YAAI,SAAS,KAAK,OAAO,IAAI,CAAC;AAC9B;AAAA,MACF;AAEA,cAAQ,SAAA;AAAA,QACN,KAAK,OAAO;AACV,gBAAM,YAAY,eAAe,SAAS;AAC1C,cAAI,SAAS;AAAA,YACX;AAAA,YACA,6BAA6B,SAAS,mBAAmB,aAAa;AAAA,UAAA;AAExE;AAAA,QACF;AAAA,QACA,SAAS;AAUP,cAAI,SAAS;AAAA,YACX;AAAA,YACA,mCAAmC,aAAa,sBAC9C,oBAAoB,SAAS,OAC/B;AAAA,UAAA;AAEF;AAAA,QACF;AAAA,MAAA;AAGF,YAAM,UAAU,CAAC,SAA8B;AAC7C,YAAI,YAAY,MAAO,QAAO;AAC9B,YAAI,kBAAkB,OAAQ,QAAO;AACrC,YAAI,kBAAkB,WAAW;AAC/B,iBAAO,CAAC,WAAW,SAAS,YAAY,aAAa,MAAM,MAAM,EAAE,SAAS,IAAI;AAAA,QAClF;AACA,eAAO;AAAA,MACT;AAKA,YAAM,uBAAuB,CAAC,eAA8B;AAC1D,YAAI,CAAC,cAAe;AACpB,YAAI,CAAC,cAAc,OAAO,eAAe,YAAY,MAAM,QAAQ,UAAU,EAAG;AAEhF;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AAGA,UAAI,YAAY,OAAO;AACrB,YAAI,cAAc;AAChB,gBAAM,UAAU;AAChB,gBAAM,QAAQ,QAAQ,IAAI,CAAC,SAAS;AAClC,kBAAM,aAAa,aAAa,IAAI;AACpC,iCAAqB,UAAU;AAC/B,mBAAO;AAAA,UACT,CAAC;AACD,gBAAM,UAA+BG,SAAAA,+BAA+B;AAAA;AAAA,YAElE,CAAC,gBAAgB,GAAG,QAAQ,SAAS,IAAI,SAAS,UAAU;AAAA,YAC5D,CAAC,cAAc,GAAG,QAAQ,OAAO,IAAI,SAAS,QAAQ;AAAA,YACtD,CAAC,iBAAiB,GAAG,QAAQ,UAAU,IAAI,SAAS,WAAW;AAAA,YAC/D,CAAC,kBAAkB,GAAG,QAAQ,WAAW,IAAI,SAAS,YAAY;AAAA;AAAA,YAElE;AAAA,UAAA,CACD;AACD,cAAI,SAAS,KAAK,KAAK,UAAU,SAAS,OAAO,CAAC;AAClD;AAAA,QACF;AAGA,cAAM,SAAS,aAAa,IAAI;AAChC,YAAIJ,oBAAAA,WAAS,MAAM,GAAG;AACpB,+BAAqB,MAAM;AAC3B,gBAAM,UAA+BI,SAAAA,+BAA+B;AAAA,YAClE,CAAC,gBAAgB,GAAG,QAAQ,SAAS,IAAI,SAAS,UAAU;AAAA,YAC5D,CAAC,WAAW,GACV,QAAQ,IAAI,KAAK,SAAS,OAAO,SAAY,OAAO,SAAS,EAAE,IAAI;AAAA,YACrE,CAAC,aAAa,GAAG,QAAQ,MAAM,IAAI,SAAS,OAAO;AAAA,YACnD,CAAC,iBAAiB,GAAG,QAAQ,UAAU,IAAI,SAAS,WAAW;AAAA,YAC/D,CAAC,iBAAiB,GAAG,QAAQ,UAAU,IAAI,SAAS,WAAW;AAAA,YAC/D,CAAC,aAAa,GAAG,QAAQ,MAAM,IAAI,SAAS,OAAO;AAAA,YACnD,CAAC,sBAAsB,GAAG,QAAQ,eAAe,IAAI,SAAS,gBAAgB;AAAA,YAC9E,CAAC,sBAAsB,GAAG,QAAQ,eAAe,IAAI,SAAS,gBAAgB;AAAA,YAC9E,CAAC,yBAAyB,GAAG,QAAQ,kBAAkB,IACnD,SAAS,mBACT;AAAA,YACJ,CAAC,kBAAkB,GAAG,QAAQ,WAAW,IAAI,SAAS,YAAY;AAAA,YAClE,GAAG;AAAA,UAAA,CACJ;AACD,cAAI,SAAS,KAAK,KAAK,UAAU,SAAS,OAAO,CAAC;AAClD;AAAA,QACF,OAAO;AAEL,gBAAM,UAA+BA,SAAAA,+BAA+B;AAAA,YAClE,CAAC,gBAAgB,GAAG,QAAQ,SAAS,IAAI,SAAS,UAAU;AAAA,YAC5D,OAAO;AAAA,UAAA,CACR;AACD,cAAI,SAAS,KAAK,KAAK,UAAU,SAAS,OAAO,CAAC;AAClD;AAAA,QACF;AAAA,MACF;AAGA,YAAM,SAAS;AACf,YAAM,MAAM;AACZ,YAAM,MAAM;AAEZ,YAAM,aAAa,CAAC,QAAa,SAAwC;AACvE,cAAM,MAAM,aAAa,MAAM;AAC/B,cAAM,aAAkCA,SAAAA,+BAA+B;AAAA,UACrE,oBAAoB,QAAQ,SAAS,IAAI,KAAK,UAAU;AAAA,UACxD,iBAAiB,QAAQ,MAAM,IAAI,KAAK,OAAO;AAAA,QAAA,CAChD;AAED,cAAM,YAA4B;AAAA,UAChC,OAAO;AAAA,YACL,aAAa;AAAA,cACX,SAAS;AAAA,cACT,kBAAkB;AAAA,cAClB,cAAc;AAAA,cACd,GAAG;AAAA,YAAA;AAAA;AAAA,YAGL,GAAI,QAAQ,IAAI,KAAK,KAAK,OAAO,SAAY,EAAE,IAAI,EAAE,OAAO,OAAO,KAAK,EAAE,EAAA,EAAE,IAAM,CAAA;AAAA,YAClF,GAAI,QAAQ,UAAU,KAAK,KAAK,WAC5B,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,KAAK,QAAQ,MAAM,KAAK,WAAS,CAAG,EAAA,IAC9D,CAAA;AAAA,YACJ,GAAI,QAAQ,UAAU,KAAK,KAAK,WAC5B;AAAA,cACE,MAAM;AAAA,gBACJ,GAAI,KAAK,WACL,CAAC,EAAE,aAAa,EAAE,KAAK,QAAQ,MAAM,KAAK,SAAA,EAAS,CAAG,IACtD,CAAA;AAAA,gBACJ,EAAE,aAAa,EAAE,KAAK,QAAQ,MAAM,KAAK,WAAS;AAAA,cAAE;AAAA,YACtD,IAEF,CAAA;AAAA,YACJ,SAAS;AAAA,cACP,aAAa,EAAE,MAAM,kBAAA;AAAA,cACrB,GAAG,yCAAyC,GAAG;AAAA,YAAA;AAAA,UACjD;AAAA,QACF;AAEF,eAAO,UAAU;AAAA,MACnB;AAEA,UAAI,cAAc;AAChB,cAAM,YAAiCA,SAAAA,+BAA+B;AAAA,UACpE,oBAAoB,QAAQ,SAAS,IAAI,SAAS,UAAU;AAAA,QAAA,CAC7D;AAED,cAAM,WACJ,QAAQ,UAAU,KAAK,SAAS,WAC5B;AAAA,UACE;AAAA,YACE,aAAa,EAAE,KAAK,QAAQ,MAAM,SAAS,SAAA;AAAA,UAAS;AAAA,QACtD,IAEF;AAEN,cAAM,UAA0B;AAAA,UAC9B,cAAc,EAAE,aAAa,EAAE,SAAS,OAAO,UAAU,UAAQ;AAAA,UACjE,MAAMA,SAAAA,+BAA+B;AAAA,YACnC,aAAa;AAAA,cACX,SAAS;AAAA,cACT,kBAAkB;AAAA,cAClB,cAAc;AAAA,cACd,GAAG;AAAA,YAAA;AAAA,YAEL,GAAI,QAAQ,OAAO,KAAK,OAAO,SAAS,UAAU,WAC9C,EAAE,kBAAkB,EAAE,OAAO,OAAO,SAAS,KAAK,EAAA,EAAE,IACpD,CAAA;AAAA,YACJ,GAAI,WAAW,EAAE,MAAM,SAAA,IAAa,CAAA;AAAA,YACpC,OAAQ,KAA6B,IAAI,CAAC,SAAS,WAAW,MAAM,QAAQ,CAAC;AAAA,UAAA,CAC9E;AAAA,QAAA;AAGH,cAAM6I,OAAMC,QAAAA,WAAAA,OAAO,SAAS,EAAE,SAAS,MAAM;AAC7C,YAAI,SAAS,KAAKD,IAAG;AACrB;AAAA,MACF;AAEA,YAAM,WAA2B;AAAA,QAC/B,cAAc,EAAE,aAAa,EAAE,SAAS,OAAO,UAAU,UAAQ;AAAA,QACjE,IAAI,MAAM;AACR,gBAAM,QAAQ,WAAW,MAAM,QAAQ;AACvC,iBAAO,EAAE,MAAA;AAAA,QACX,GAAA;AAAA,MAAG;AAEL,YAAM,MAAMC,QAAAA,WAAAA,OAAO,UAAU,EAAE,SAAS,MAAM;AAC9C,UAAI,SAAS,KAAK,GAAG;AAAA,IACvB;AACA,UAAM,QAAQ,IAAI,QAAQ,GAAA;AAE1B,UAAM,kBACJ,OAAO,MAAM,SAAS,MAAM,WAAW,MAAM,SAAS,EAAE,KAAA,IAAS;AACnE,QAAI,mBAAmB,CAAC,gBAAgB,SAAS,MAAM,KAAK,CAAC,gBAAgB,SAAS,KAAK,GAAG;AAC5F,YAAM,IAAIC,SAAAA,sBAAsB,eAAe;AAAA,IACjD;AAKA,UAAM,SAAS,OAAO,IAAI,QAAQ,OAAO,QAAQ,KAAK,EAAE,EAAE,YAAA;AAC1D,QACE,UACA,CAAC,OAAO,SAAS,KAAK,KACtB,CAAC,OAAO,SAAS,kBAAkB,KACnC,CAAC,OAAO,SAAS,iBAAiB,KAClC,CAAC,OAAO,SAAS,UAAU,KAC3B,CAAC,OAAO,SAAS,OAAO,KACxB,CAAC,OAAO,SAAS,MAAM,GACvB;AACA,YAAM,IAAIA,SAAAA,sBAAsB,MAAM;AAAA,IACxC;AAEA,UAAM,2CAA2B,IAAI;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AACD,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,UAAI,IAAI,WAAW,GAAG,KAAK,CAAC,qBAAqB,IAAI,GAAG,GAAG;AACzD,cAAM,IAAIC,MAAAA,UAAU,0CAA0C,GAAG,IAAI;AAAA,UACnE,QAAQ;AAAA,UACR,MAAM;AAAA,QAAA,CACP;AAAA,MACH;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,eAAe,UAAA,IAAc,MAAM,eAAe,OAAO,OAAO,KAAK,GAAG;AACvF,UAAM,aAAa,MAAM,QAAQ,aAAa,IAAI,CAAC,GAAG,aAAa,IAAI;AACvE,UAAM,aAAa,MAAM,eAAe,KAAK;AAC7C,QAAI,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,GAAG;AACtD,YAAM,aAAa,MAAM,MAAM,uBAAuB,KAAK,KAAK,MAAM;AACtE,YAAM,WACJ,CAACpJ,+BAAS,UAAU,KAAK,EAAE,gBAAgB,eAAe,CAACA,oBAAAA,WAAS,WAAW,UAAU,IACrF,CAAA,IACA,OAAO,KAAK,WAAW,UAAU;AACvC,YAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;AACrE,YAAM,kBAAkB,IAAI;AAAA,QAC1B,MAAM,KAAK,MAAM,0BAA0B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,YAAA,GAAe,CAAC,CAAC;AAAA,MAAA;AAGpF,YAAM,cAAwB,CAAA;AAC9B,YAAM,qBAA+B,CAAA;AACrC,iBAAW,aAAa,YAAY;AAClC,cAAM,cAAc,UAAU,YAAA;AAC9B,cAAM,WAAW,gBAAgB,IAAI,WAAW,KAAK,YAAY,IAAI,WAAW;AAChF,YAAI,CAAC,UAAU;AACb,sBAAY,KAAK,SAAS;AAC1B;AAAA,QACF;AACA,2BAAmB,KAAK,QAAQ;AAAA,MAClC;AACA,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,IAAIqJ,SAAAA,yBAAyB,MAAM,kBAAkB,WAAW;AAAA,MACxE;AACA,UAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,mBAAW,aAAa,YAAY;AAClC,cAAI,CAAC,WAAW,SAAS,SAAS,GAAG;AACnC,uBAAW,KAAK,SAAS;AAAA,UAC3B;AAAA,QACF;AACA,mBAAW,aAAa,oBAAoB;AAC1C,cAAI,CAAC,WAAW,SAAS,SAAS,GAAG;AACnC,uBAAW,KAAK,SAAS;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,KAAK,mBAAmB,GAAG;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,sCAAsC,UAAkB;AACtD,UAAM,MAAM,CAAC,MAAc,EAAE,QAAQ,uBAAuB,MAAM;AAElE,UAAM,OAAO,MAAM;AACjB,UAAI,IAAI,KAAK,YAAY;AACzB,UAAI,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAChD,UAAI,CAAC,EAAE,WAAW,GAAG,EAAG,KAAI,IAAI,CAAC;AACjC,aAAO;AAAA,IACT,GAAA;AAEA,UAAM,UAAU,IAAI,OAAO,IAAI,IAAI,GAAG,CAAC,wBAAwB;AAC/D,UAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,QAAI,SAAS,MAAM,CAAC,MAAM,QAAW;AACnC,UAAI,IAAI,MAAM,CAAC;AACf,UAAK,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,KAAO,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,GAAI;AACpF,YAAI,EAAE,MAAM,GAAG,EAAE;AACjB,YAAI,EAAE,SAAS,IAAI,OAAO,EAAE,QAAQ,OAAO,GAAG;AAAA,MAChD;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,yDACE,UAC0C;AAC1C,UAAM,MAAM,CAAC,MAAc,EAAE,QAAQ,uBAAuB,MAAM;AAGlE,UAAM,OAAO,MAAM;AACjB,UAAI,IAAI,KAAK,YAAY;AACzB,UAAI,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAChD,UAAI,CAAC,EAAE,WAAW,GAAG,EAAG,KAAI,IAAI,CAAC;AACjC,aAAO;AAAA,IACT,GAAA;AAGA,UAAM,UAAU,IAAI,OAAO,IAAI,IAAI,GAAG,CAAC,4CAA4C;AACnF,UAAM,QAAQ,SAAS,MAAM,OAAO;AAEpC,QAAI,SAAS,MAAM,CAAC,MAAM,UAAa,MAAM,CAAC,MAAM,QAAW;AAE7D,UAAI,MAAM,MAAM,CAAC;AACjB,UACG,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,KACvC,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,GACxC;AACA,cAAM,IAAI,MAAM,GAAG,EAAE;AACrB,YAAI,IAAI,SAAS,IAAI,SAAS,IAAI,QAAQ,OAAO,GAAG;AAAA,MACtD;AAGA,YAAM,eAAe,MAAM,CAAC;AAG5B,YAAM,iBAAiB,SAAS,SAAS,SAAS;AAElD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAGA,WAAO;AAAA,MACL,KAAK;AAAA,MACL,cAAc;AAAA,MACd,gBAAgB;AAAA,IAAA;AAAA,EAEpB;AAAA,EAEA,0CAA0C,UAAkB;AAC1D,WAAO,SAAS,WAAW,GAAG,GAAG;AAC/B,iBAAW,SAAS,MAAM,CAAC;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,kCACE,YACA,WACA,OACQ;AACR,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC/B,QAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,YAAM,KAAK,GAAG,WAAW,OAAO,CAAC,MAAM,MAAM,MAAM,UAAU,CAAC;AAAA,IAChE;AACA,WAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EAC5B;AAAA,EAEA,YAAY,QAAiC;AAC3C,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,OAAO,aAAa,OAAO,aAAa,OAAO;AAC7D,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,WAAO,MAAM,OAAO,KAAK,CAAC;AAAA,EAC5B;AAAA,EAEA,eAAe,OAAuB;AACpC,WAAO,MAAM,KAAA,EAAO,QAAQ,SAAS,EAAE;AAAA,EACzC;AAAA,EAEA,MAAM,gBAAgB,KAAkB;AACtC,YAAQ,IAAI,4CAA4C;AACxD,UAAM,EAAE,UAAU,OAAO,KAAK,SAAS,YAAY,eACjD,MAAM,KAAK,2BAA2B,GAAG;AAC3C,UAAM,MAAM,KAAK,sCAAsC,QAAQ;AAC/D,QAAI,CAAC,KAAK;AACR,YAAM,IAAInD,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,QAAI,CAAC,OAAO,CAAC,UAAU,KAAK,GAAG,GAAG;AAChC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,KAAK,OAAO,GAAG;AACrB,QAAI,CAAC,OAAO,cAAc,EAAE,GAAG;AAC7B,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,MAAuD,MAAM,MAAM;AAAA,MACvE;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IAAA;AAEP,UAAM,SAAS,KAAK,UAAU,OAAO,MAAM;AAC3C,UAAM,OAAO,IAAI,KAAK,GAAG;AACzB,UAAM,aAAa,KAAK,0CAA0C,QAAQ;AAC1E,UAAM,OAAO,KAAK,YAAY,GAAG;AAEjC,UAAM,cAAc,IAAI,QAAQ,OAAO,eAAe;AACtD,QAAI,QAAQ,OAAO,gBAAgB,UAAU;AAC3C,YAAM,SAAS,YACZ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAA,CAAM,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,YAAM,UAAU,KAAK,eAAe,IAAI;AACxC,YAAM,UAAU,OAAO,KAAK,CAAC,MAAM,MAAM,OAAO,KAAK,eAAe,CAAC,MAAM,OAAO;AAClF,UAAI,SAAS;AACX,eAAO,QAAQ;AAAA,UACb,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,UAAU;AAAA,YACR,SAAS,MAAM,KAAK,mBAAmB,GAAG,KAAK,QAAQ,UAAU;AAAA,YACjE;AAAA,UAAA;AAAA,QACF,CACD;AAAA,MACH;AAAA,IACF;AAEA,UAAM,WAA0B;AAAA,MAC9B,SAAS,MAAM,KAAK;AAAA,QAClB,GAAG,KAAK,QAAQ,GAAG,KAAK,kCAAkC,YAAY,gBAAgB,OAAO,YAAY,KAAK,CAAC;AAAA,MAAA;AAAA,MAEjH,IAAI,MAAM,KAAK,eAAe,UAAU;AAAA,MACxC,UAAU;AAAA,MACV,UAAU;AAAA,MACV;AAAA,IAAA;AAEF,WAAO,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,uBAAuB,KAAK,YAAY,UAAU;AAAA,MACxD;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,KAAkB;AACxC,UAAM,EAAE,UAAU,OAAO,KAAK,SAAS,YAAY,eACjD,MAAM,KAAK,2BAA2B,GAAG;AAC3C,UAAM,MAAM,KAAK,sCAAsC,QAAQ;AAC/D,QAAI,CAAC,KAAK;AACR,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,QAAI,CAAC,OAAO,CAAC,UAAU,KAAK,GAAG,GAAG;AAChC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,KAAK,OAAO,GAAG;AACrB,QAAI,CAAC,OAAO,cAAc,EAAE,GAAG;AAC7B,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,SAAS,MAAM,KAAK,0BAA0B,KAAK,OAAO,KAAK,IAAI;AACzE,UAAM,EAAE,OAAO,OAAO,UAAA,IAAc,OAAO;AAAA,MACzC9F,wCAA+B;AAAA,QAC7B,GAAG,IAAI,QAAQ,IAAA;AAAA,QACf,CAAC,MAAM,UAAU,GAAG;AAAA,MAAA,CACrB;AAAA,MACD;AAAA,QACE,YAAY;AAAA,QACZ,SAAS;AAAA,MAAA;AAAA,IACX;AAEF,QAAI,OAAO;AACT,YAAMiG,SAAAA,eAAe,KAAK;AAAA,IAC5B;AACA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,mBAAmB,IAAI,KAAK,KAAK,KAAK,iBAAiB;AACpF,YAAM,eAAe,KAAK,YAAY,QAAQ;AAC9C,YAAM,UAAU,IAAI,QAAQ,OAAO,UAAU;AAC7C,UAAI,gBAAgB,OAAO,YAAY,YAAY,QAAQ,KAAA,MAAW,KAAK;AACzE,cAAM,YAAY,QACf,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAA,CAAM,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,cAAM,UAAU,KAAK,eAAe,YAAY;AAChD,cAAM,UAAU,UAAU,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,MAAM,OAAO;AACxE,YAAI,CAAC,SAAS;AACZ,iBAAO,QAAQ;AAAA,YACb,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,cAAA;AAAA,YACX;AAAA,YAEF,UAAU;AAAA,cACR,SAAS,MAAM,KAAK,mBAAmB,GAAG,KAAK,QAAQ,UAAU;AAAA,cACjE,MAAM;AAAA,YAAA;AAAA,UACR,CACD;AAAA,QACH;AAAA,MACF;AAEA,YAAM,MAAuD,MAAM,MAAM;AAAA,QACvE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,qBAAqB,KAAK;AAAA,UAC1B,0BAA0B,KAAK;AAAA,QAAA;AAAA,MACjC;AAEF,YAAM,SAAS,KAAK,UAAU,OAAO,QAAQ;AAC7C,YAAM,OAAO,IAAI,KAAK,GAAG;AACzB,YAAM,aAAa,KAAK,0CAA0C,QAAQ;AAC1E,YAAM,WAA0B;AAAA,QAC9B,SAAS,MAAM,KAAK;AAAA,UAClB,GAAG,KAAK,QAAQ,GAAG,KAAK,kCAAkC,YAAY,gBAAgB,OAAO,YAAY,KAAK,CAAC;AAAA,QAAA;AAAA,QAEjH,IAAI,MAAM,KAAK,eAAe,UAAU;AAAA,QACxC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM,KAAK,YAAY,GAAG;AAAA,MAAA;AAE5B,UAAI,eAAe,WAAW;AAC5B,eAAO,QAAQ;AAAA,UACb,QAAQ;AAAA,UACR,MAAM;AAAA,UACN;AAAA,UACA,SAAS,EAAE,sBAAsB,iBAAA;AAAA,QAAiB,CACnD;AAAA,MACH;AACA,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR,MAAM,uBAAuB,KAAK,YAAY,UAAU;AAAA,QACxD;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,SAAS,EAAE,sBAAsB,wBAAA;AAAA,MAAwB,CAC1D;AAAA,IACH,SAAS,GAAG;AACV,YAAMA,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,KAAkB;AACxC,UAAM,EAAE,UAAU,OAAO,KAAK,YAAY,MAAM,KAAK,2BAA2B,GAAG;AACnF,UAAM,MAAM,KAAK,sCAAsC,QAAQ;AAC/D,QAAI,CAAC,KAAK;AACR,YAAM,IAAIH,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,QAAI,CAAC,OAAO,CAAC,UAAU,KAAK,GAAG,GAAG;AAChC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,KAAK,OAAO,GAAG;AACrB,QAAI,CAAC,OAAO,cAAc,EAAE,GAAG;AAC7B,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,QAAI;AACF,YAAM,MAAM,qBAAqB,IAAI,KAAK,KAAK,KAAK,iBAAiB;AACrE,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,UACR,SAAS,MAAM,KAAK,mBAAmB,GAAG,KAAK,QAAQ,UAAU;AAAA,QAAA;AAAA,MACnE,CACD;AAAA,IACH,SAAS,GAAG;AACV,YAAMG,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,KAAkB;AACxC,UAAM,EAAE,OAAO,KAAK,SAAS,YAAY,eACvC,MAAM,KAAK,2BAA2B,GAAG;AAC3C,UAAM,SAAS,MAAM,KAAK,0BAA0B,KAAK,OAAO,GAAG;AACnE,UAAM,EAAE,OAAO,OAAO,UAAA,IAAc,OAAO,SAAS,IAAI,QAAQ,OAAO;AAAA,MACrE,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACD,QAAI,OAAO;AACT,YAAMA,SAAAA,eAAe,KAAK;AAAA,IAC5B;AACA,QAAI;AACF,YAAM,MAAW,MAAM,MAAM;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MAAA;AAEP,YAAM,SAAS,KAAK,UAAU,OAAO,QAAQ;AAC7C,YAAM,OAAO,IAAI,KAAK,GAAG;AACzB,YAAM,WAAW,IAAI,KAAK,QAAQ,IAAI,mBAAmB,OAAO,IAAI,MAAM,UAAU,CAAC,CAAC,CAAC;AACvF,YAAM,aAAa,KAAK,0CAA0C,QAAQ;AAC1E,YAAM,WAA0B;AAAA,QAC9B,SAAS,MAAM,KAAK,mBAAmB,GAAG,KAAK,QAAQ,UAAU;AAAA,QACjE,IAAI,MAAM,KAAK,eAAe,UAAU;AAAA,QACxC,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAEZ,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR,MAAM,uBAAuB,KAAK,YAAY,UAAU;AAAA,QACxD;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,SAAS,EAAE,UAAU,OAAO,SAAS,EAAG,EAAA;AAAA,MAAE,CAC3C;AAAA,IACH,SAAS,GAAG;AACV,YAAMA,SAAAA,eAAe,CAAC;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,KAAkB;AAC7C,UAAM,EAAE,UAAU,OAAO,KAAK,SAAS,YAAY,UACjD,MAAM,KAAK,2BAA2B,GAAG;AAE3C,QAAI,EAAE,KAAK,cAAc,mBACvB,KAAK,yDAAyD,QAAQ;AAIxE,QAAI,CAAC,OAAO,CAAC,cAAc;AACzB,YAAM,MAAM,CAAC,MAAc,EAAE,QAAQ,uBAAuB,MAAM;AAClE,YAAM,OAAO,MAAM;AACjB,YAAI,IAAI,KAAK,YAAY;AACzB,YAAI,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAChD,YAAI,CAAC,EAAE,WAAW,GAAG,EAAG,KAAI,IAAI,CAAC;AACjC,eAAO;AAAA,MACT,GAAA;AAEA,YAAM,aAAa,SAAS;AAAA,QAC1B,IAAI,OAAO,IAAI,IAAI,GAAG,CAAC,wDAAwD;AAAA,MAAA;AAEjF,UAAI,cAAc,WAAW,CAAC,KAAK,WAAW,CAAC,GAAG;AAChD,cAAM,WAAW,CAAC;AAClB,uBAAe,WAAW,CAAC;AAC3B,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,CAAC,KAAK;AACR,YAAM,IAAIH,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AAIA,QAAI;AACJ,UAAM,cAAc,IAAI,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI;AAClF,QAAI,UAAU,KAAK,WAAW,GAAG;AAC/B,YAAM,QAAQ,OAAO,WAAW;AAChC,UAAI,CAAC,OAAO,cAAc,KAAK,GAAG;AAChC,cAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,MACvE;AACA,mBAAa;AAAA,IACf,WAAW,YAAY,SAAS,GAAG;AAEjC,mBAAa;AAAA,IACf,OAAO;AACL,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AAEA,QAAI,CAAC,cAAc;AACjB,YAAM,IAAIK,SAAAA,mCAAA;AAAA,IACZ;AAGA,UAAM,cAAc,GAAG,YAAY;AACnC,QACE,SAAS,SAAS,IAAI,WAAW,EAAE,KACnC,CAAC,MAAM,0BAA0B,IAAI,YAAY,GACjD;AACA,UAAI;AACJ,UAAI;AACF,iBAAU,MAAM,MAAM;AAAA,UACpB;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QAAA;AAAA,MAET,QAAQ;AAEN,cAAM,IAAIL,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,MACvE;AACA,UAAI,EAAE,gBAAgB,SAAS;AAC7B,cAAM,IAAIK,SAAAA,mCAAA;AAAA,MACZ;AACA,YAAM,QAAQ,OAAO,YAAY;AACjC,UAAI,SAAS,OAAO,gBAAgB,2BAA2B;AAC/D,aAAO,IAAI,SAAS,OAAO,GAAG,EAAE,KAAK,UAAU,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,IAC1E;AAEA,UAAM,oCAAoC,MAAM,0BAA0B,IAAI,YAAY;AAC1F,QAAI,CAAC,mCAAmC;AACtC,YAAM,IAAIA,SAAAA,mCAAA;AAAA,IACZ;AACA,UAAM,8BAA8B,MAAM,aAAa,YAAY;AACnE,QAAI,CAAC,6BAA6B;AAChC,YAAM,IAAIA,SAAAA,mCAAA;AAAA,IACZ;AACA,UAAM,eAAe,kCAAkC,aAAA;AACvD,QAAI,CAACtG,gBAAAA,mBAAmB,YAAY,GAAG;AACrC,YAAM,IAAIsG,SAAAA,mCAAA;AAAA,IACZ;AACA,UAAM,EAAE,OAAO,YAAY,UAAA,IAAc,MAAM,eAAe,OAAO,cAAc,KAAK,GAAG;AAC3F,UAAM,EAAE,QAAArI,SAAQ,MAAM,SAAS,QAAQ,MAAM,OAAO,cAAA,IAClD,KAAK,gCAAgC,OAAO,YAAY,UAAU,YAAY;AAChF,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,QAAI,gBAAgB;AAClB,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,QACf,UAAU;AAAA,UACR,SAAS;AAAA;AAAA,QAAA;AAAA,QAEX,KAAK;AAAA,MAAA,CACN;AAAA,IACH;AACA,UAAM,MAAgC;AAAA,MACpC,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,cAAc,SAAS;AAAA,IAAA;AAEzB,UAAM,SAAS,KAAK,UAAU,OAAO,aAAa;AAClD,UAAM,OAAO,IAAI,KAAK,GAAG;AACzB,UAAM,WAA0BkC,SAAAA,+BAA+B;AAAA,MAC7D,SAAS,MAAM,KAAK;AAAA,QAClB,sBAAsB,aAAa,gBAAgB,IAAI,KAAK,kCAAkC,YAAY,WAAW,YAAY,CAAC;AAAA,MAAA;AAAA,MAEpI,OAAO,iBAAiB,CAAC,iBAAiB,IAAI,QAAQ;AAAA,MACtD,UAAU,KAAK,sBAAsB,IAAI,MAAM,IAAI,SAAS,IAAI,OAAO,OAAO,GAAG;AAAA,IAAA,CAClF;AACD,WAAO,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,uBAAuB,IAAI,SAAS,YAAY,UAAU;AAAA,MAChE;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAAA,EAEA,kDAAkD,UAAkB,OAAyB;AAC3F,UAAM,oBAAoB,SAAS,YAAY,eAAe;AAC9D,QAAI,sBAAsB,IAAI;AAC5B,aAAO;AAAA,IACT;AACA,UAAM,iBAAiB,SAAS,MAAM,oBAAoB,CAAC;AAC3D,UAAM,UAAU,eAAe,OAAO,WAAW,CAAC,KAAK,UAAU,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC;AACtF,QAAI,mBAAmB,eAAe,QAAQ,SAAS,EAAE;AACzD,QAAI,iBAAiB,WAAW,GAAG,GAAG;AACpC,yBAAmB,iBAAiB,MAAM,CAAC;AAAA,IAC7C;AACA,QAAI,iBAAiB,SAAS,OAAO,GAAG;AACtC,yBAAmB,iBAAiB,MAAM,GAAG,EAAE;AAAA,IACjD;AACA,QAAI,iBAAiB,SAAS,GAAG,GAAG;AAClC,yBAAmB,iBAAiB,MAAM,GAAG,EAAE;AAAA,IACjD;AACA,QAAI,CAAC,kBAAkB;AACrB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,CAAC,kBAAkB,OAAO,UAAU,gBAAgB,CAAC;AACxE,eAAW,aAAa,YAAY;AAClC,YAAM,oCAAoC,MAAM,0BAA0B,IAAI,SAAS;AACvF,UAAI,CAAC,mCAAmC;AACtC;AAAA,MACF;AACA,YAAM,8BAA8B,MAAM,aAAa,SAAS;AAChE,UAAI,CAAC,6BAA6B;AAChC;AAAA,MACF;AACA,YAAM,eAAe,kCAAkC,aAAA;AACvD,UAAI,CAACH,gBAAAA,mBAAmB,YAAY,GAAG;AACrC;AAAA,MACF;AACA,aAAO;AAAA,QACL,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,uBAAuB,KAAkB;AAC7C,UAAM,EAAE,UAAU,OAAO,QAAA,IAAY,MAAM,KAAK,2BAA2B,GAAG;AAC9E,UAAM,MAAM,KAAK,sCAAsC,QAAQ;AAC/D,QAAI,CAAC,KAAK;AACR,YAAM,IAAIiG,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,QAAI,CAAC,OAAO,CAAC,UAAU,KAAK,GAAG,GAAG;AAChC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,KAAK,OAAO,GAAG;AACrB,QAAI,CAAC,OAAO,cAAc,EAAE,GAAG;AAC7B,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,UAAU,KAAK,kDAAkD,UAAU,KAAK;AACtF,QAAI,CAAClG,oBAAAA,WAAS,OAAO,GAAG;AACtB,YAAM,IAAIuG,SAAAA,mCAAA;AAAA,IACZ;AACA,UAAM,EAAE,cAAc,6BAA6B,aAAA,IAAiB;AACpE,YAAQ,4BAA4B,MAAA;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AACH,cAAM,IAAIA,SAAAA,mCAAA;AAAA,MACZ,KAAK;AACH,cAAM,IAAIC,SAAAA,oCAAA;AAAA,IAAoC;AAElD,UAAM,EAAE,OAAO,UAAU,mCAAmC,SAAS,IAAI,QAAQ,OAAO;AAAA,MACtF,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA,CACV;AACD,QAAI,OAAO;AACT,YAAMH,SAAAA,eAAe,KAAK;AAAA,IAC5B;AACA,UAAM,WAAW,MAAM,MAAM,MAAA,EAAQ,MAAM,MAAM,YAAY,EAAE,EAAE,MAAA;AACjE,QAAI,CAAC,UAAU;AACb,YAAM,IAAI/D,SAAAA,6BAAA;AAAA,IACZ;AACA,UAAM,eAAe,MAAM,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAC3D,QAAI,4BAA4B,SAAS,cAAc;AACrD,UAAI;AAEF,cAAM,SAAS,QAAQ,YAAY,EAAE,KAAK,YAAY;AAAA,MACxD,SAAS,GAAG;AACV,cAAM+D,SAAAA,eAAe,CAAC;AAAA,MACxB;AAAA,IACF;AACA,QAAI,4BAA4B,SAAS,WAAW;AAGlD,YAAM,aAAc,4BAAoC,QAAQ;AAChE,UAAI,CAAC,YAAY;AACf,cAAM,IAAI7D,SAAAA;AAAAA,UACR,yBAAyB,YAAY;AAAA,QAAA;AAAA,MAEzC;AACA,YAAM,CAAC,8BAA8B,8BAA8B,IAAI,MAAM,QAAQ,IAAI;AAAA;AAAA,QAEvF,SAAS,QAAQ,YAAY,EAAE,QAAQ,WAAW,aAAa,YAAY,YAAY;AAAA;AAAA,QAEvF,aAAa,MAAA,EAAQ,QAAQ,aAAa,YAAY,YAAY;AAAA,MAAA,CACnE;AACD,YAAM,sCAAsC,MAAM;AAAA,QAChD;AAAA,QACA,OAAO,oBAAoB;AACzB,0BAAgB,MAAM;AAAA,YACpB,CAAC,UAAU,GAAG;AAAA,UAAA,CACf;AACD,cAAI;AACF,kBAAM,gBAAgB,KAAA;AAAA,UACxB,SAAS,GAAG;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG,aAAa,MAAA;AAAA,MAAM;AAEvC,YAAM,yCAAyC,oCAAoC;AAAA,QACjF,CAAC,WAAW,gBAAgB,OAAO;AAAA,MAAA;AAErC,UAAI,uCAAuC,SAAS,GAAG;AACrD,cAAM,uCAAuC,CAAC;AAAA,MAChD;AACA,YAAM,wCAAwC,MAAM;AAAA,QAClD;AAAA,QACA,OAAO,oBAAoB;AACzB,0BAAgB,MAAM;AAAA,YACpB,CAAC,UAAU,GAAG,SAAS,cAAc,MAAM,UAAU;AAAA,UAAA,CACtD;AACD,cAAI;AACF,kBAAM,gBAAgB,KAAA;AAAA,UACxB,SAAS,GAAG;AACV,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,QACA,EAAE,aAAa,GAAG,aAAa,MAAA;AAAA,MAAM;AAEvC,YAAM,2CAA2C,sCAAsC;AAAA,QACrF,CAAC,WAAW,gBAAgB,OAAO;AAAA,MAAA;AAErC,UAAI,yCAAyC,SAAS,GAAG;AACvD,cAAM,yCAAyC,CAAC;AAAA,MAClD;AAAA,IACF;AACA,WAAO,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,QACR,SAAS;AAAA;AAAA,MAAA;AAAA,IACX,CACD;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB;AACvB,QACE,KAAK,YAAY,OAAO,KACxB,CAACxC,oBAAAA,WAAS,KAAK,SAAS,UAAU,KAClC,OAAO,KAAK,KAAK,SAAS,UAAU,EAAE,WAAW;AAEjD;AACF,UAAM,QAAQ,MAAM,KAAK;AACzB,QAAI,iBAAiBiG,SAAAA,sBAAsB;AACzC;AAAA,IACF;AACA,QAAIjG,+BAAS,KAAK,SAAS,UAAU,GAAG;AACtC,aAAO,QAAQ,KAAK,SAAS,UAAU,EAAE,QAAQ,CAAC,CAAC,eAAe,QAAQ,MAAM;AAC9E,cAAM,CAAC,QAAQ,IAAI,IAAI,cAAc,MAAM,GAAG;AAC9C,YAAI,CAAC,UAAU,CAAC,KAAM;AACtB,cAAM,SAAS,WAAW,QAAQ,MAAM,kBAAkB,IAAI;AAC9D,aAAK,YAAY,IAAI,QAAQ,QAAQ;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,wCAAwC,UAAkB;AACxD,UAAM,UAAU;AAChB,UAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,QAAI,SAAS,MAAM,CAAC,MAAM,QAAW;AACnC,aAAO,MAAM,CAAC;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,mBAAmB,KAAkB,QAA6B;AAChE,UAAM,UAAuB,OAAO,OAAO,GAAG;AAC9C,YAAQ,SAAS,OAAO,OAAO,MAAM;AACrC,WAAO,OAAO,OAAO,OAAO;AAAA,EAC9B;AAAA,EAEA,MAAM,kBAAkB,UAAyB,KAAkB;AACjE,QAAI;AACJ,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA,IACtC,WAAW,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAC3D,YAAM,CAAC,2BAA2B,MAAM,IAAI;AAC5C,UACE,UAAU,6BACV,OAAO,0BAA0B,MAAM,MAAM,YAC7C;AAEA,eAAO,OAAO,MAAM,MAAM,0BAA0B,MAAM,EAAE,CAAC;AAAA,MAC/D,OAAO;AAEL,cAAM,qBAAqB,0BAAA;AAC3B,YAAI,OAAO,mBAAmB,MAAM,MAAM,YAAY;AACpD,iBAAO,OAAO,MAAM,MAAM,mBAAmB,MAAM,EAAE,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAM;AACX,UAAM,KAAK,GAAG;AAAA,EAChB;AAAA,EAEA,MAAM,oDACJ,UACA,KACA;AACA,QAAI,oCAAoC,QAAQ,GAAG;AACjD,YAAM,KAAK,kBAAkB,SAAS,SAAS,GAAG;AAAA,IACpD,OAAO;AACL,YAAM,KAAK,kBAAkB,UAAU,GAAG;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,KAAkB;AAC1C,UAAM,EAAE,SAAA,IAAa,MAAM,KAAK,2BAA2B,GAAG;AAC9D,UAAM,KAAK,iBAAA;AACX,UAAM,SAAS,KAAK,wCAAwC,QAAQ;AACpE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAIkG,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,WAAW,KAAK,YAAY,IAAI,MAAM;AAC5C,QAAI,gBAAgB,OAAO,UAAU;AACnC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,aAAa,KAAK,mBAAmB,KAAK,CAAA,CAAE;AAClD,UAAM,KAAK,oDAAoD,UAAU,UAAU;AAAA,EACrF;AAAA,EAEA,MAAM,kBAAkB,KAAkB;AACxC,UAAM,EAAE,SAAA,IAAa,MAAM,KAAK,2BAA2B,GAAG;AAC9D,UAAM,KAAK,iBAAA;AACX,UAAM,SAAS,KAAK,wCAAwC,QAAQ;AACpE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,WAAW,KAAK,YAAY,IAAI,MAAM;AAC5C,QAAI,gBAAgB,OAAO,UAAU;AACnC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,aAAa,KAAK,mBAAmB,KAAK,CAAA,CAAE;AAClD,UAAM,KAAK,oDAAoD,UAAU,UAAU;AAAA,EACrF;AAAA,EAEA,MAAM,4BAA4B,KAAkB;AAClD,UAAM,EAAE,SAAA,IAAa,MAAM,KAAK,2BAA2B,GAAG;AAC9D,UAAM,KAAK,iBAAA;AACX,UAAM,SAAS,KAAK,wCAAwC,QAAQ;AACpE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,WAAW,KAAK,YAAY,IAAI,MAAM;AAC5C,QAAI,gBAAgB,OAAO,UAAU;AACnC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,MAAM,KAAK,sCAAsC,QAAQ;AAC/D,QAAI,CAAC,KAAK;AACR,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,QAAI,CAAC,OAAO,CAAC,UAAU,KAAK,GAAG,GAAG;AAChC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,KAAK,OAAO,GAAG;AACrB,QAAI,CAAC,OAAO,cAAc,EAAE,GAAG;AAC7B,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,aAAa,KAAK,mBAAmB,KAAK,EAAE,KAAK,IAAI;AAC3D,UAAM,KAAK,oDAAoD,UAAU,UAAU;AAAA,EACrF;AAAA,EAEA,MAAM,0BAA0B,KAAkB;AAChD,UAAM,EAAE,SAAA,IAAa,MAAM,KAAK,2BAA2B,GAAG;AAC9D,UAAM,KAAK,iBAAA;AACX,UAAM,SAAS,KAAK,wCAAwC,QAAQ;AACpE,QAAI,CAAC,QAAQ;AACX,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,WAAW,KAAK,YAAY,IAAI,MAAM;AAC5C,QAAI,gBAAgB,OAAO,UAAU;AACnC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,MAAM,KAAK,sCAAsC,QAAQ;AAC/D,QAAI,CAAC,KAAK;AACR,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,QAAI,CAAC,OAAO,CAAC,UAAU,KAAK,GAAG,GAAG;AAChC,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,KAAK,OAAO,GAAG;AACrB,QAAI,CAAC,OAAO,cAAc,EAAE,GAAG;AAC7B,YAAM,IAAIA,SAAAA,kBAAkB,CAAC,IAAI,QAAQ,OAAA,GAAU,IAAI,QAAQ,IAAA,CAAK,CAAC;AAAA,IACvE;AACA,UAAM,aAAa,KAAK,mBAAmB,KAAK,EAAE,KAAK,IAAI;AAC3D,UAAM,KAAK,oDAAoD,UAAU,UAAU;AAAA,EACrF;AAAA,EAEA,iCAAiC,OAA4B,gBAAyB;AACpF,QAAI,gBAAgB;AAClB,aAAO,EAAE,MAAM,GAAG,SAAS,EAAA;AAAA,IAC7B;AACA,UAAM,SAASoD,yBAAgB,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,EAAE,KAAA,IAAS;AACvE,UAAM,UAAUA,yBAAgB,MAAM,OAAO,CAAC,IAAI,MAAM,OAAO,EAAE,KAAA,IAAS;AAC1E,UAAM,YAAY,OAAO,SAAS,QAAQ,EAAE;AAC5C,UAAM,aAAa,OAAO,SAAS,SAAS,EAAE;AAC9C,UAAM,MAAM,OAAO,cAAc,SAAS,KAAK,YAAY,IAAI,YAAY;AAC3E,UAAM,OAAO,OAAO,cAAc,UAAU,KAAK,cAAc,IAAI,aAAa;AAChF,UAAM,OAAO,KAAK,MAAM,OAAO,GAAG,IAAI;AACtC,UAAM,UAAU,MAAM,MAAM,MAAM;AAClC,WAAO,EAAE,MAAM,QAAA;AAAA,EACjB;AAAA,EAEA,oBAAoB,QAA4B;AAC9C,UAAM,MAAkC,CAAA;AACxC,QAAI,gBAAgB,OAAO,UAAU,CAACA,SAAAA,gBAAgB,MAAM,GAAG;AAC7D,aAAO;AAAA,IACT;AACA,UAAM,YAAY,OAAO,MAAM,GAAG;AAClC,cAAU,QAAQ,CAAC,aAAa;AAC9B,YAAM,CAAC,OAAO,GAAG,IAAI,SAClB,KAAA,EACA,MAAM,KAAK,EACX,IAAI,CAAC,MAAM,EAAE,MAAM;AACtB,UAAI,KAAK,CAAC,OAAO,QAAQ,SAAS,SAAS,KAAK,CAAC;AAAA,IACnD,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,OAAkC;AACrD,UAAM,UAAU,MAAM;AACtB,UAAM,SAAS,QAAQ,uBAAuB,KAAK;AACnD,UAAM,gBAAgB,OAAO,QAAQ;AACrC,YAAQ,eAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AACE,cAAM,IAAIC,SAAAA,+BAA+B,iBAAiB,SAAS;AAAA,IAAA;AAAA,EAEzE;AAAA,EAEA,gCACE,OACA,YACA,UACA,OACA;AACA,YAAQ,IAAI,4DAA4D;AACxE,UAAM,iBAAiB,SAAS,SAAS,SAAS;AAClD,UAAM,gBAAgB,YAAY,SAAS,MAAM,QAAQ,MAAM;AAC/D,QAAID,yBAAgB,MAAM,SAAS,CAAC,GAAG;AACrC,YAAM,IAAIF,MAAAA,UAAU,sDAAsD;AAAA,QACxE,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAEA,UAAMlL,UAA6B;AACnC,UAAM,EAAE,MAAM,QAAA,IAAY,KAAK,iCAAiC,OAAO,cAAc;AACrF,UAAM,OAAO,KAAK,oBAAoB,MAAM,UAAU,CAAC;AACvD,UAAM,8BAAmC,IAAA;AACzC,UAAM,kCAAuC,IAAA;AAC7C,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM;AACxC,UAAIoL,SAAAA,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG;AAC3C,gBAAQ,IAAI,GAAGA,SAAAA,gBAAgB,CAAC,IAAI,EAAE,KAAA,IAAS,EAAE;AAAA,MACnD;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,MAAM,MAAM,oBAAoB,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAC5E,kBAAY,IAAI,KAAK,GAAG;AAAA,IAC1B,CAAC;AACD,UAAM,UAAU,KAAK,qBAAqB,KAAK;AAC/C,UAAM,UAAUA,yBAAgB,MAAM,SAAS,CAAC,IAAI,MAAM,SAAS,EAAE,KAAA,IAAS;AAC9E,UAAM,QAAQ;AAAA,MACZ,GAAG,KAAK;AAAA,MACR,uBAAuB,OAAO,SAAS,SAAS,aAAa,OAAO;AAAA,IAAA;AAEtE,WAAO;AAAA,MACL,QAAApL;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,sBACE,aACA,SACA,YACA,OACA,KACoB;AACpB,UAAM,sBAAsB,cAAc;AAC1C,UAAM,cAAc,sBAAsB,aAAa,aAAa;AACpE,QAAI,eAAe,YAAY;AAC7B,aAAO;AAAA,IACT;AACA,UAAM,eAAe,EAAE,GAAG,MAAA;AAC1B,iBAAa,MAAM,IAAI,OAAO,OAAO;AACrC,iBAAa,OAAO,IAAI,OAAO,WAAW;AAC1C,UAAM,SAAS,IAAI,QAAQ,YAAY,KAAK;AAC5C,WAAO,CAAC,QAAQ,GAAG,UAAU,cAAc,EAAE,gBAAgB,KAAA,CAAM,CAAC,EAAE,KAAK,EAAE;AAAA,EAC/E;AAAA,EAEA,MAAM,iBAAiB,KAAkB;AACvC,YAAQ,IAAI,6CAA6C;AACzD,UAAM,EAAE,OAAO,KAAK,SAAS,YAAY,WAAW,YAAY,OAAO,SAAA,IACrE,MAAM,KAAK,2BAA2B,GAAG;AAG3C,UAAM,oBAAoB,IAAI;AAAA,MAC5B,MAAM,KAAK,MAAM,0BAA0B,KAAA,CAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAA,CAAa;AAAA,IAAA;AAE/E,UAAM,iBAAiB,MAAM,QAAQ,UAAU,IAC3C,WAAW,OAAO,CAAC,MAAM,CAAC,kBAAkB,IAAI,OAAO,CAAC,EAAE,YAAA,CAAa,CAAC,IACxE;AAEJ,UAAM,EAAE,QAAAA,SAAQ,MAAM,SAAS,QAAQ,MAAM,OAAO,eAAe,eAAA,IACjE,KAAK,gCAAgC,OAAO,gBAAgB,UAAU,KAAK;AAC7E,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3BA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGF,YAAQ,IAAI,wDAAwD;AACpE,YAAQ,IAAI,QAAQ;AAEpB,QAAI,gBAAgB;AAClB,aAAO,QAAQ;AAAA,QACb,QAAQ;AAAA,QACR,MAAM,SAAS;AAAA,QACf,UAAU;AAAA,UACR,SAAS;AAAA;AAAA,QAAA;AAAA,QAEX,KAAK;AAAA,MAAA,CACN;AAAA,IACH;AACA,UAAM,MAAgC;AAAA,MACpC,SAAS,SAAS;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,MAClB,cAAc,SAAS;AAAA,IAAA;AAEzB,UAAM,SAAS,KAAK,UAAU,OAAO,OAAO;AAC5C,UAAM,OAAO,IAAI,KAAK,GAAG;AAOzB,UAAM,2BAA2B;AACjC,UAAM,aAAa,eAAe,KAAK;AACvC,QAAI,kBAAkB;AACtB,QAAI,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,GAAG;AAEtD,UAAI,IAAI,QAAQ,SAAS,0BAA0B;AACjD,YAAI,UAAU,IAAI,QAAQ,MAAM,GAAG,wBAAwB;AAC3D,0BAAkB;AAAA,MACpB;AACA,YAAM,kBAAkB,IAAI;AAAA,QAC1B,MAAM,KAAK,MAAM,0BAA0B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,YAAA,GAAe,CAAC,CAAC;AAAA,MAAA;AAEpF,YAAM,WAAqB,CAAA;AAC3B,iBAAW,KAAK,YAAY;AAC1B,cAAM,IAAI,gBAAgB,IAAI,OAAO,CAAC,EAAE,aAAa;AACrD,YAAI,EAAG,UAAS,KAAK,CAAC;AAAA,MACxB;AACA,UAAI,SAAS,SAAS,GAAG;AACvB,mBAAW,eAAe,YAAY;AACpC,gBAAM,MAAM,gBAAgB,IAAI,OAAO,WAAW,EAAE,aAAa;AACjE,cAAI,CAAC,IAAK;AACV,qBAAW,UAAU,IAAI,SAAS;AAChC,gBAAI;AACF,oBAAM,UAAU,MAAM,MAAM;AAAA,gBAC1B,OAAO,OAAO,MAAM,UAAU,CAAC;AAAA,gBAC/B;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,CAAA;AAAA,cAAC;AAGH,qBAAO,WAAW,IAAI,MAAM,QAAQ,WAAY,QAAgB,OAAO,IAClE,QAAgB,UACjB,CAAA;AAAA,YACN,SAAS,GAAG;AACV,qBAAO,WAAW,IAAI,CAAA;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAKA,UAAM,mBAAmB,kBAAkB,2BAA2B,IAAI;AAC1E,UAAM,gBAAgB,kBAAkB,IAAI,IAAI;AAChD,UAAM,WAA0BkC,SAAAA,+BAA+B;AAAA,MAC7D,SAAS,MAAM,KAAK;AAAA,QAClB,GAAG,KAAK,QAAQ,GAAG,KAAK,kCAAkC,YAAY,WAAW,KAAK,CAAC;AAAA,MAAA;AAAA,MAEzF,OAAO,iBAAiB,CAAC,iBAAiB,IAAI,QAAQ;AAAA,MACtD,UAAU,KAAK,sBAAsB,eAAe,kBAAkB,IAAI,OAAO,OAAO,GAAG;AAAA,IAAA,CAC5F;AACD,WAAO,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,uBAAuB,IAAI,SAAS,YAAY,UAAU;AAAA,MAChE;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IAAA,CACV;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,KAAkB,MAA2C;AACnF,UAAM,aAAa,IAAIoJ,aAAA;AACvB,QAAI,KAAK,SAAS,YAAY;AAC5B,UAAI,MAAM,QAAQ,KAAK,SAAS,UAAU,GAAG;AAC3C,aAAK,SAAS,WAAW,QAAQ,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC;AAAA,MAC3D,WAAWxJ,+BAAS,KAAK,SAAS,UAAU,KAAK,YAAY,KAAK,SAAS,YAAY;AACrF,mBAAW,IAAI,KAAK,SAAS,WAAW,MAAsB;AAAA,MAChE,WAAW,OAAO,KAAK,SAAS,eAAe,YAAY;AACzD,mBAAW,IAAI,KAAK,SAAS,UAA0B;AAAA,MACzD;AAAA,IACF;AACA,eAAW,IAAI,OAAO,MAAM;AAC1B,YAAM,KAAK,CAAC;AAAA,IACd,CAAC;AACD,WAAO,MAAM,WAAW,OAAA,EAAS,IAAI,OAAO,IAAI,QAAQ,GAAG,KAAK,GAAG,CAAC;AAAA,EACtE;AAAA,EAEA,MAAM,eAAe,KAAkB;AACrC,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,gBAAgB,KAAK,MAAM,GAAG,CAAC;AAAA,EAC/E;AAAA,EACA,MAAM,iBAAiB,KAAkB;AACvC,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,KAAK,MAAM,GAAG,CAAC;AAAA,EACjF;AAAA,EACA,MAAM,iBAAiB,KAAkB;AACvC,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,KAAK,MAAM,GAAG,CAAC;AAAA,EACjF;AAAA,EACA,MAAM,iBAAiB,KAAkB;AACvC,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,KAAK,MAAM,GAAG,CAAC;AAAA,EACjF;AAAA,EACA,MAAM,sBAAsB,KAAkB;AAC5C,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,uBAAuB,KAAK,MAAM,GAAG,CAAC;AAAA,EACtF;AAAA,EACA,MAAM,sBAAsB,KAAkB;AAC5C,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,uBAAuB,KAAK,MAAM,GAAG,CAAC;AAAA,EACtF;AAAA,EACA,MAAM,mBAAmB,KAAkB;AACzC,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,oBAAoB,KAAK,MAAM,GAAG,CAAC;AAAA,EACnF;AAAA,EACA,MAAM,iBAAiB,KAAkB;AACvC,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,KAAK,MAAM,GAAG,CAAC;AAAA,EACjF;AAAA,EACA,MAAM,2BAA2B,KAAkB;AACjD,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,4BAA4B,KAAK,MAAM,GAAG,CAAC;AAAA,EAC3F;AAAA,EACA,MAAM,yBAAyB,KAAkB;AAC/C,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,0BAA0B,KAAK,MAAM,GAAG,CAAC;AAAA,EACzF;AAAA,EACA,MAAM,gBAAgB,KAAkB;AACtC,WAAO,MAAM,KAAK,kBAAkB,KAAK,KAAK,iBAAiB,KAAK,MAAM,GAAG,CAAC;AAAA,EAChF;AACF;ACxmEA,MAAM,mBAAmB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGT,YACE,QACA,aACA,SACA;AACA,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,WAAW;AAChB,SAAK,mCAAmB,IAAA;AACxB,SAAK,QAAQ,gCAAgC,KAAK,KAAK,QAAQ;AAC/D,SAAK,YAAY,sCAAsC,KAAK,KAAK,YAAY;AAC7E,UAAM,qBAA6C,CAAA;AACnD,UAAM,4CAAyC,IAAA;AAC/C,WAAO,oBAAoB,KAAK,SAAS,EAAE,QAAQ,CAAC,SAAS;AAC3D,YAAM,iBAAiB,KAAK,UAAU,IAAI;AAC1C,UAAI,CAAC,mBAAmB,IAAI,GAAG;AAC7B,8BAAsB,IAAI,IAAI;AAC9B;AAAA,MACF;AACA,UAAI,0BAA0BiG,SAAAA,sBAAsB;AAClD,2BAAmB,KAAK,cAAc;AAAA,MACxC,WAAW,gBAAgB,OAAO,gBAAgB;AAChD,cAAM,eAAe,4CAA4C;AAAA,UAC/D,KAAK,aAAa,IAAW;AAAA,QAAA;AAE/B,cAAM,aAAa,IAAIqB;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,UACX,KAAK,MAAM;AAAA,QAAA;AAEb,aAAK,aAAa,IAAI,MAAM,UAAU;AAAA,MACxC;AAAA,IACF,CAAC;AACD,QAAI,mBAAmB,SAAS,GAAG;AACjC,YAAM,IAAIK,SAAAA,2CAA2C,kBAAkB;AAAA,IACzE;AACA,QAAI,sBAAsB,OAAO,GAAG;AAClC,YAAM,IAAI8B,SAAAA,gCAAgC,qBAAqB;AAAA,IACjE;AACA,SAAK,SAAS,KAAK,QAAQ,MAAM,KAAK,eAAe,KAAK,IAAI,CAAC;AAC/D,QAAI,KAAK,MAAM,WAAW,KAAK;AAC7B,WAAK,OAAO,OAAO,KAAK,MAAM,MAAM;AAAA,IACtC;AACA,QAAI,MAAM,QAAQ,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,WAAW,SAAS,GAAG;AAC5E,WAAK,OAAO,IAAI,MAAM,KAAK,KAAK,MAAM,UAAU,CAAC;AAAA,IACnD,WAAW,CAAC,MAAM,QAAQ,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,YAAY;AACzE,WAAK,OAAO,IAAI,KAAK,MAAM,UAAiB;AAAA,IAC9C;AACA,QAAI,aAAa,OAAO,KAAK,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,GAAG;AACzE,WAAK,OAAO,OAAO,KAAK,MAAM,MAAM;AAAA,IACtC;AACA,SAAK,8BAAc,IAAA;AACnB,SAAK,YAAA;AAAA,EACP;AAAA,EAEA,cAAc;AACZ,UAAM,gCAAgB,IAAA;AACtB,UAAM,iCAAiB,IAAA;AACvB,UAAM,gCAAgB,IAAA;AACtB,UAAM,kCAAkB,IAAA;AACxB,UAAM,mCAAmB,IAAA;AACzB,UAAM,KAAK,KAAK,aAAa,QAAA,CAAS,EACnC,KAAK,CAAC,GAAG,MAAM;AACd,UAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ;AAC/B,eAAO,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;AAAA,MAChC;AACA,aAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;AAAA,IAC5B,CAAC,EACA,QAAQ,CAAC,CAAC,MAAM,UAAU,MAAM;AAC/B,YAAM,uBAAuB,CAAC,OAAmD;AAC/E,eAAO,CAAC,KAAK,MAAM,OAAO,SAAS,EAAE,KAAK,CAAC,WAAW,QAAQ,OAAO,SAAS,EAAE;AAAA,MAClF;AACA,UAAI,qBAAqB,OAAO,GAAG;AACjC,cAAM,UAAU,IAAI,OAAO,KAAM,IAAI,iBAAkB;AACvD,cAAM,WAAW,KAAK,qBAAqB;AAAA,UACzC;AAAA,UACA,WAAW,gBAAgB,KAAK,UAAU;AAAA,QAAA;AAE5C,kBAAU;AAAA,UACR;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAE5E,kBAAU;AAAA,UACR,IAAI,IAAI;AAAA,UACR,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAAA,MAE9E;AACA,UAAI,qBAAqB,QAAQ,GAAG;AAClC,cAAM,UAAU,IAAI,IAAI;AACxB,cAAM,WAAW,KAAK,qBAAqB;AAAA,UACzC;AAAA,UACA,WAAW,iBAAiB,KAAK,UAAU;AAAA,QAAA;AAE7C,mBAAW;AAAA,UACT;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAAA,MAE9E;AACA,UAAI,qBAAqB,MAAM,GAAG;AAChC,cAAM,UAAU,IAAI,OAAO,KAAM,IAAI,gBAAgB;AACrD,cAAM,WAAW,KAAK,qBAAqB;AAAA,UACzC;AAAA,UACA,WAAW,eAAe,KAAK,UAAU;AAAA,QAAA;AAE3C,kBAAU;AAAA,UACR;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAAA,MAE9E;AACA,UAAI,qBAAqB,aAAa,GAAG;AACvC,cAAM,UAAU,IAAI,OAAO,KAAM,IAAI,yCAA2C;AAChF,cAAM,WAAW,KAAK,qBAAqB;AAAA,UACzC;AAAA,UACA,WAAW,sBAAsB,KAAK,UAAU;AAAA,QAAA;AAElD,kBAAU;AAAA,UACR;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAAA,MAE9E;AACA,UAAI,qBAAqB,aAAa,GAAG;AACvC,cAAM,UAAU,IAAI,OAAO,KAAM,IAAI,wCAAyC;AAC9E,cAAM,WAAW,KAAK,qBAAqB;AAAA,UACzC;AAAA,UACA,WAAW,sBAAsB,KAAK,UAAU;AAAA,QAAA;AAElD,mBAAW;AAAA,UACT;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAAA,MAE9E;AACA,UAAI,qBAAqB,QAAQ,GAAG;AAClC,cAAM,UAAU,IAAI,OAAO,KAAM,IAAI,gBAAgB;AACrD,cAAM,WAAW,KAAK,qBAAqB;AAAA,UACzC;AAAA,UACA,WAAW,iBAAiB,KAAK,UAAU;AAAA,QAAA;AAE7C,mBAAW;AAAA,UACT;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAE5E,kBAAU;AAAA,UACR;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAE5E,oBAAY;AAAA,UACV;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAAA,MAE9E;AACA,UAAI,qBAAqB,QAAQ,GAAG;AAClC,cAAM,UAAU,IAAI,OAAO,KAAM,IAAI,gBAAgB;AACrD,cAAM,WAAW,KAAK,qBAAqB;AAAA,UACzC;AAAA,UACA,WAAW,iBAAiB,KAAK,UAAU;AAAA,QAAA;AAE7C,qBAAa;AAAA,UACX;AAAA,UACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,QAAA;AAAA,MAE9E;AACA,aAAO,QAAQ,WAAW,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,aAAa,MAAM;AACzE,cAAM,CAAC,QAAQ,IAAI,IAAI,cAAc,MAAM,GAAG;AAC9C,YAAI,CAAC,UAAU,CAAC,KAAM;AACtB,cAAM,SAAS,CAAC,QAAQ,SAAS,OAAO,QAAQ,EAAE,SAAS,MAAM,IAAI,WAAW;AAChF,cAAM,kBAAkB,KAAK,SAAS,OAAQ;AAC9C,cAAM,UAAU,kBACZ,WAAW,WACT,IAAI;AAAA,UACF,KAAM,IAAI;AAAA,QAAA,IAEZ,IAAI;AAAA,UACF,KAAM,IAAI;AAAA,QAAA,IAEd,WAAW,WACT,IAAI,OAAO,KAAM,IAAI,sDAAuD,IAC5E,IAAI,OAAO,KAAM,IAAI,4DAA6D;AACxF,cAAM,WAAW,kBACb,aAAa,SACX,KAAK,qBAAqB;AAAA,UACxB;AAAA,UACA,WAAW,yBAAyB,KAAK,UAAU;AAAA,QAAA,IAErD,KAAK,qBAAqB;AAAA,UACxB;AAAA,UACA,WAAW,2BAA2B,KAAK,UAAU;AAAA,QAAA,IAEzD,aAAa,SACX,KAAK,qBAAqB,KAAK,MAAM,WAAW,iBAAiB,KAAK,UAAU,CAAC,IACjF,KAAK,qBAAqB,KAAK,MAAM,WAAW,mBAAmB,KAAK,UAAU,CAAC;AACzF,gBAAQ,QAAA;AAAA,UACN,KAAK;AACH,uBAAW;AAAA,cACT;AAAA,cACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,YAAA;AAE5E;AAAA,UACF,KAAK;AACH,sBAAU;AAAA,cACR;AAAA,cACA,KAAK,sCAAsC,KAAK,MAAM,YAAY,QAAQ;AAAA,YAAA;AAE5E;AAAA,QAAA;AAAA,MAEN,CAAC;AAAA,IACH,CAAC;AACH,SAAK,QAAQ,IAAI,OAAO,SAAS;AACjC,SAAK,QAAQ,IAAI,QAAQ,UAAU;AACnC,SAAK,QAAQ,IAAI,OAAO,SAAS;AACjC,SAAK,QAAQ,IAAI,SAAS,WAAW;AACrC,SAAK,QAAQ,IAAI,UAAU,YAAY;AAAA,EACzC;AAAA,EAEA,iBAAiB;AACf,WAAO,QAAQ,KAAK,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC,eAAe,QAAQ,MAAM;AAC3E,YAAM,CAAC,QAAQ,IAAI,IAAI,cAAc,MAAM,GAAG;AAC9C,UAAI,CAAC,UAAU,CAAC,KAAM;AACtB,YAAM,SAAS,WAAW,QAAQ,IAAI;AAEtC,YAAM,eAAe,CAAC,QAAQ,OAAO,SAAS,QAAQ,EAAE,SAAS,OAAO,aAAa,IACjF,SACA;AACJ,YAAM,SAAS,CAAC,QAAQ,OAAO,SAAS,QAAQ,EAAE,SAAS,OAAO,YAAA,CAAa,IAC3E,YAAY,MAAM,KAClB,YAAY,MAAM;AACtB,UAAI,oCAAoC,QAAQ,GAAG;AACjD,aAAK,QAAQ,YAAY,EAAE,QAAQ,KAAK,qBAAqB,KAAK,MAAM,SAAS,OAAO,CAAC;AAAA,MAC3F,OAAO;AACL,aAAK,QAAQ,YAAY,EAAE,QAAQ,KAAK,qBAAqB,KAAK,MAAM,QAAQ,CAAC;AAAA,MACnF;AAAA,IACF,CAAC;AACD,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,qBAAqB,KAAK,MAAM,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,IAAA;AAEzE,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,qBAAqB,KAAK,MAAM,KAAK,0BAA0B,KAAK,IAAI,CAAC;AAAA,IAAA;AAGhF,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,qBAAqB,KAAK,MAAM,KAAK,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAAA;AAE5E,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,qBAAqB,KAAK,MAAM,KAAK,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAAA;AAE5E,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,qBAAqB,KAAK,MAAM,KAAK,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAAA;AAE5E,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,qBAAqB,KAAK,MAAM,KAAK,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAAA;AAE5E,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,qBAAqB,KAAK,MAAM,KAAK,sBAAsB,KAAK,IAAI,CAAC;AAAA,IAAA;AAAA,EAE9E;AAAA,EAEA,MAAM,gBAAgB,UAAyB,KAAkB;AAC/D,QAAI;AACJ,QAAI,OAAO,aAAa,YAAY;AAClC,aAAO,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA,IACtC,WAAW,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAC3D,YAAM,CAAC,2BAA2B,MAAM,IAAI;AAC5C,UACE,UAAU,6BACV,OAAO,0BAA0B,MAAM,MAAM,YAC7C;AAEA,eAAO,OAAO,MAAM,MAAM,0BAA0B,MAAM,EAAE,CAAC;AAAA,MAC/D,OAAO;AAEL,cAAM,qBAAqB,0BAAA;AAC3B,YAAI,OAAO,mBAAmB,MAAM,MAAM,YAAY;AACpD,iBAAO,OAAO,MAAM,MAAM,mBAAmB,MAAM,EAAE,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAAC,KAAM;AACX,QAAI;AACF,YAAM,KAAK,GAAG;AAAA,IAChB,SAAS,OAAO;AACd,UAAI,KAAK,MAAM,eAAeC,uBAAAA,qBAAqB,aAAa,GAAG,GAAG;AACpE,eAAO,MAAMA,uBAAAA,qBAAqB,OAAO,OAAO,KAAK;AAAA,UACnD,uBAAuB,KAAK,MAAM;AAAA,UAClC,sBAAsB,KAAK,MAAM;AAAA,UACjC,aAAa,KAAK,MAAM;AAAA,UACxB,SAAS,KAAK,MAAM;AAAA,UACpB,WAAW,KAAK,MAAM;AAAA,UACtB,OAAO,KAAK,MAAM;AAAA,UAClB,QAAQ;AAAA,UACR,SAAS,KAAK,MAAM;AAAA,QAAA,CACrB;AAAA,MACH,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,UACA,wBACA,uBACA,KACA;AACA,UAAM,WAA4C,KAAK,sBAAsB;AAAA,MAC3E;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO,MAAMC,cAAAA,aAAa,IAAI,EAAE,SAAA,GAAY,YAAY;AACtD,UAAI,OAAO,aAAa,YAAY;AAClC,eAAO,MAAM,SAAS,GAAG;AAAA,MAC3B,WAAW,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAC3D,cAAM,CAAC,2BAA2B,MAAM,IAAI;AAC5C,YACE,UAAU,6BACV,OAAO,0BAA0B,MAAM,MAAM,YAC7C;AAEA,gBAAM,0BAA0B,MAAM,EAAE,GAAG;AAAA,QAC7C,OAAO;AAEL,gBAAM,qBAAqB,0BAAA;AAC3B,cAAI,OAAO,mBAAmB,MAAM,MAAM,YAAY;AACpD,kBAAM,mBAAmB,MAAM,EAAE,GAAG;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,qBACJ,UACA,KACA,yBAA8C,QAC9C,wBAA4C,WAC5C;AACA,WAAO,MAAM,KAAK;AAAA,MAChB,KAAK,qBAAqB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEF;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,sBACJ,KACA,yBAA8C,QAC9C,wBAA4C,WACb;AAC/B,UAAM,UAAU,IAAI,QAAQ,YAAA;AAC5B,UAAM,gBAAgB,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACvD,UAAM,eAAe,QAAQ,UAAU,GAAG,kBAAkB,KAAK,QAAQ,SAAS,aAAa;AAC/F,UAAM,MAA4B;AAAA,MAChC,gBAAgB,eAAe,KAAK,MAAM;AAAA,MAC1C,SAAS3D,uBAAAA,iBAAiB,KAAK,sBAAsB;AAAA,MACrD,eAAe8C,uBAAAA,kBAAkB,KAAK,qBAAqB;AAAA,IAAA;AAE7D,QAAI,SAAS,OAAO,iBAAiB,KAAK;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sCACJ,YACA,UACA,KACA;AACA,UAAM,WAA2C,WAAW,2BAA2B;AAAA,MACrF;AAAA,MACA;AAAA,IAAA;AAEF,UAAMjB,0DAAuB,IAAI,EAAE,SAAA,GAAY,YAAY;AACzD,UAAI,OAAO,aAAa,YAAY;AAClC,cAAM,SAAS,GAAG;AAAA,MACpB,WAAW,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAC3D,cAAM,CAAC,2BAA2B,MAAM,IAAI;AAC5C,YACE,UAAU,6BACV,OAAO,0BAA0B,MAAM,MAAM,YAC7C;AAEA,gBAAM,0BAA0B,MAAM,EAAE,GAAG;AAAA,QAC7C,OAAO;AAEL,gBAAM,qBAAqB,0BAAA;AAC3B,cAAI,OAAO,mBAAmB,MAAM,MAAM,YAAY;AACpD,kBAAM,mBAAmB,MAAM,EAAE,GAAG;AAAA,UACtC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,0BAA0B,KAAkB;AAChD,UAAM,EAAE,YAAY,MAAMgB,8BAAA;AAC1B,QAAI,UAAU,SAAS;AACrB,aAAO,MAAM,KAAK,6BAAA;AAAA,IACpB,OAAO;AACL,aAAO,MAAM,KAAK,8BAA8B,GAAG;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,8BAA8B,KAAkB;AACpD,UAAM,UAAU;AAAA,MACd,kBAAkB;AAAA,MAClB,SAAS,MAAM,KAAK,KAAK,aAAa,MAAM,EAAE,IAAI,CAAC,UAAU;AAAA,QAC3D;AAAA,QACA,MAAM;AAAA,QACN,KAAK;AAAA,MAAA,EACL;AAAA,IAAA;AAEJ,WAAO,IAAI,SAAS,KAAK,OAAO;AAAA,EAClC;AAAA,EAEA,MAAM,+BAA+B;AACnC,UAAM,IAAIM,SAAAA,sBAAsB,KAAK;AAAA,EACvC;AAAA,EAEA,MAAM,mBAAmB,KAAkB;AACzC,UAAM,EAAE,YAAY,MAAMN,8BAAA;AAC1B,UAAM,eAAe7C,uBAAAA,iBAAiB,KAAK,KAAK;AAChD,QAAI,WAAW,WAAW,WAAW,cAAc;AACjD,YAAM,IAAImD,SAAAA,sBAAsB,MAAM;AAAA,IACxC,OAAO;AACL,YAAM,WAAW,MAAM,qBAAqB;AAAA,QAC1C,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,MAAA;AAEF,aAAO,IAAI,SAAS,KAAK,KAAK,QAAQ;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,sBAAsB,KAAkB;AAE5C,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,QAAI,WAAW,MAAM,QAAQ,IAAI,IAC7B,IAAI,KAAK,KAAK,GAAG,CAAC,KAClB,OAAO,SAAS,WACd,KAAK,WAAW,GAAG,IACjB,OACA,IAAI,IAAI,KACV;AACN,eAAW,SAAS,QAAQ,WAAW,GAAG;AAC1C,UAAM,UAAU,IAAI,QAAQ,OAAA,KAAY,OAAO,YAAA;AAG/C,QAAI,aAAa,OAAO,CAAC,CAAC,OAAO,MAAM,EAAE,SAAS,MAAM,GAAG;AACzD,YAAM,IAAIC,MAAAA,UAAU,UAAU,OAAO,YAAA,CAAa,0CAA0C;AAAA,QAC1F,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA,CACP;AAAA,IACH;AAEA,UAAM,kBAAmB,WAAW,SAAS,QAAQ;AACrD,UAAM,SAAS,KAAK,QAAQ,IAAI,eAAe;AAC/C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAIlD,SAAAA,kBAAkB,CAAC,OAAO,YAAA,GAAe,IAAI,QAAQ,SAAS,GAAG,CAAC;AAAA,IAC9E;AAEA,UAAM,UAAU,aAAa,MAAM,SAAS,QAAQ,QAAQ,EAAE,IAAI;AAClE,UAAM,QAAQ,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,OAAO;AACxD,QAAI,OAAO;AACT,aAAO,MAAM,MAAM,GAAG;AAAA,IACxB;AAEA,UAAM,aAAa,YAAY,WAAW,CAAC,QAAQ,IAAI,CAAC,UAAU,OAAO;AACzE,UAAM,UAAU,MAAM,KAAK,OAAO,SAAS,EACxC,OAAO,CAAC,CAAC,OAAO,MAAM,mBAAmB,MAAM,EAC/C,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM;AACtB,UAAI,OAAuE;AAC3E,iBAAW,QAAQ,YAAY;AAC7B,cAAM,IAAK,QAAmB,KAAK,IAAI;AACvC,YAAI,GAAG;AACL,gBAAM,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,QAAS,QAAmB,OAAO,QAAQ,GAAA;AAC3E,cAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,OAAQ,IAAI,QAAQ,KAAK,OAAO,IAAI,SAAS,KAAK,QAAS;AACrF,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC,EACA,OAAO,CAAC,MAAoE,CAAC,CAAC,CAAC,EAC/E,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM;AAEtD,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO,MAAM,QAAQ,CAAC,EAAE,GAAG,GAAG;AAAA,IAChC;AAEA,UAAM,IAAIA,SAAAA,kBAAkB,CAAC,OAAO,YAAA,GAAe,IAAI,QAAQ,SAAS,GAAG,CAAC;AAAA,EAC9E;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAc,KACZ,QACA,aACA,SACY;AACZ,UAAM,WAAW,IAAI,mBAAmB,QAAQ,aAAa,OAAO;AACpE,WAAO,SAAS;AAAA,EAClB;AACF;AAEO,MAAM,mBAAqC,SAEhD,QACA,UAA6C,IACjC;AACZ,SAAO,mBAAmB,KAAK,MAAM,QAAQ,OAAO;AACtD;ACxjBA,eAAsB,UAAU,SAAoB;AAClD,QAAM,WAAW,MAAM,QAAQ,eAAA;AAC/B,QAAM,SAAS,aAAa,CAAC,WAAW;AACtC,WAAO,YAAY,+CAA+C;AAAA,EACpE,CAAC;AACD,QAAM,SAAS,mBAAmB,UAAU;AAAA,IAC1C;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACZ,CACD;AACH;ACJO,MAAM,UAAU;;;;;;;;;;;;;;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,34,36]}