zeed 0.9.21 → 0.9.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.node.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.node.ts","../src/common/global.ts","../src/common/log-filter.ts","../src/common/log-console.ts","../src/common/log-base.ts","../src/common/log.ts","../src/common/data/json.ts","../src/common/data/bin.ts","../src/common/crypto.ts","../src/common/data/math.ts","../src/common/data/orderby.ts","../src/common/data/array.ts","../src/common/data/basex.ts","../src/common/data/camelcase.ts","../src/common/data/convert.ts","../src/common/data/day.ts","../src/common/exec/promise.ts","../src/common/data/day-legacy.ts","../src/common/data/decimal.ts","../src/common/data/is.ts","../src/common/data/deep.ts","../src/common/data/html.ts","../src/common/data/list.ts","../src/common/data/object.ts","../src/common/data/path.ts","../src/common/data/regexp.ts","../src/common/data/rounding.ts","../src/common/data/sortable.ts","../src/common/data/sorted.ts","../src/common/data/url.ts","../src/common/data/utils.ts","../src/common/data/xrx.ts","../src/common/csv.ts","../src/common/dispose-defer.ts","../src/common/exec/mutex.ts","../src/common/msg/emitter.ts","../src/common/time.ts","../src/common/uuid.ts","../src/common/msg/channel.ts","../src/common/msg/encoder.ts","../src/common/msg/messages.ts","../src/common/msg/pubsub.ts","../src/common/msg/rpc.ts","../src/common/exec/progress.ts","../src/common/exec/pool.ts","../src/common/exec/queue.ts","../src/common/exec/throttle-debounce.ts","../src/common/localhost.ts","../src/common/log-memory.ts","../src/common/network.ts","../src/common/platform.ts","../src/common/storage/memstorage.ts","../src/common/utils.ts","../src/node/args.ts","../src/node/clipboard.ts","../src/node/crypto.ts","../src/node/env.ts","../src/node/filestorage.ts","../src/node/fs.ts","../src/node/log-file.ts","../src/node/log-node.ts","../src/node/log-util.ts","../src/node/log-context-node.ts"],"sourcesContent":["// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport * from './common/index'\nexport * from './node/index'\n","// Global context across build systems etc.\n\ndeclare global {\n interface ZeedGlobalContext {}\n}\n\ninterface ZeedGlobalIntegration {\n _zeedGlobal?: ZeedGlobalContext\n}\n\nfunction _global(): ZeedGlobalIntegration {\n if (typeof self !== 'undefined')\n return self as ZeedGlobalIntegration\n if (typeof window !== 'undefined')\n return window as ZeedGlobalIntegration\n if (typeof global !== 'undefined')\n return global as ZeedGlobalIntegration\n if (typeof globalThis !== 'undefined')\n return globalThis as ZeedGlobalIntegration\n throw new Error('unable to locate global object')\n}\n\nexport function getGlobalContext(): ZeedGlobalContext {\n const gcontext = _global()\n if (gcontext._zeedGlobal == null)\n gcontext._zeedGlobal = {}\n\n return gcontext._zeedGlobal\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { LogLevelAliasType } from './log-base'\nimport { LogLevel, LogLevelAlias } from './log-base'\n\ninterface NamespaceFilter {\n (name: string): boolean\n accept: RegExp[]\n reject: RegExp[]\n filter: string\n}\n\nexport function getNamespaceFilterString(defaultNamespaceFilter: any): string {\n if (\n defaultNamespaceFilter === true\n || defaultNamespaceFilter === 'true'\n || defaultNamespaceFilter === '1'\n || (typeof defaultNamespaceFilter === 'number' && defaultNamespaceFilter !== 0)\n )\n defaultNamespaceFilter = '*'\n else if (\n defaultNamespaceFilter === false\n || defaultNamespaceFilter === 'false'\n || defaultNamespaceFilter === 0\n || defaultNamespaceFilter === '0'\n || defaultNamespaceFilter == null\n || defaultNamespaceFilter === 'null'\n || defaultNamespaceFilter === 'undefined'\n )\n defaultNamespaceFilter = ''\n else\n defaultNamespaceFilter = String(defaultNamespaceFilter)\n\n return defaultNamespaceFilter\n}\n\n// todo sideffects\nconst defaultNamespaceFilter: string = getNamespaceFilterString(\n typeof process !== 'undefined'\n ? process.env.ZEED ?? process.env.DEBUG\n : typeof localStorage !== 'undefined'\n ? localStorage.zeed ?? localStorage.debug\n : '*',\n)\n\n/**\n * Filter as described here https://github.com/visionmedia/debug#wildcards\n *\n * @param filter Namespace filter\n * @returns Function to check if filter applies\n */\nexport function useNamespaceFilter(\n filter: string = defaultNamespaceFilter,\n): NamespaceFilter {\n let fn: any // (name: string) => boolean\n const reject = [] as RegExp[]\n const accept = [] as RegExp[]\n\n if (!filter) {\n fn = function (_name: string) {\n return false\n }\n }\n else if (filter === '*') {\n fn = function (_name: string) {\n return true\n }\n }\n else {\n let i\n const split = filter.split(/[\\s,]+/)\n const len = split.length\n for (i = 0; i < len; i++) {\n if (!split[i]) {\n // ignore empty strings\n continue\n }\n const template = split[i].replace(/\\*/g, '.*?')\n if (template[0] === '-')\n reject.push(new RegExp(`^${template.substr(1)}$`))\n else\n accept.push(new RegExp(`^${template}$`))\n }\n\n fn = function (name: string) {\n if (reject.length === 0 && accept.length === 0)\n return true\n\n let i, len\n for (i = 0, len = reject.length; i < len; i++) {\n if (reject[i].test(name))\n return false\n }\n for (i = 0, len = accept.length; i < len; i++) {\n if (accept[i].test(name))\n return true\n }\n return false\n }\n }\n fn.accept = accept\n fn.reject = reject\n fn.filter = filter\n return fn as NamespaceFilter\n}\n\n// todo sideffects\nconst defaultLevelFilter: any\n = typeof process !== 'undefined'\n ? process.env.ZEED_LEVEL ?? process.env.LEVEL ?? process.env.DEBUG_LEVEL\n : typeof localStorage !== 'undefined'\n ? localStorage.zeed_level ?? localStorage.level ?? localStorage.debug_level\n : undefined\n\nexport function parseLogLevel(filter: LogLevelAliasType): LogLevel {\n if (filter === false)\n return LogLevel.off\n if (typeof filter === 'number')\n return filter as number\n if (typeof filter === 'string') {\n const l = LogLevelAlias[filter.toLocaleLowerCase().trim()]\n if (l != null)\n return l\n }\n return LogLevel.all\n}\n\nexport function useLevelFilter(\n filter: string | number | boolean | LogLevelAliasType = defaultLevelFilter,\n): (level: LogLevel) => boolean {\n const filterLevel = parseLogLevel(filter)\n return level => level >= filterLevel\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-console */\n\nimport type { LogHandler, LogHandlerOptions, LogMessage } from './log-base'\nimport { LogLevel } from './log-base'\nimport { useLevelFilter, useNamespaceFilter } from './log-filter'\n\n/**\n * Very basic logger. Please take a look at the browser and node\n * optimized loggers. This one is just the absolute fallback option.\n *\n * @param level Log level\n * @returns Logger\n */\nexport function LoggerConsoleHandler(opt: LogHandlerOptions = {}): LogHandler {\n const {\n level = undefined,\n filter = undefined,\n // colors = true,\n // levelHelper = false,\n // nameBrackets = true,\n // padding = 16,\n } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n const name = msg.name ? `[${msg.name}]` : ''\n switch (msg.level) {\n case LogLevel.info:\n console.info(`I|* ${name}`, ...msg.messages)\n break\n case LogLevel.warn:\n console.warn(`W|** ${name}`, ...msg.messages)\n break\n case LogLevel.error:\n console.error(`E|*** ${name}`, ...msg.messages)\n break\n default:\n console.debug(`D| ${name}`, ...msg.messages)\n break\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { LoggerConsoleHandler } from './log-console'\nimport { parseLogLevel, useNamespaceFilter } from './log-filter'\n\nexport enum LogLevel {\n all = -1,\n debug = 0,\n info,\n warn,\n error,\n fatal,\n off = Infinity,\n}\n\nexport const LogLevelAlias: Record<string, LogLevel> = {\n '*': LogLevel.all,\n 'a': LogLevel.all,\n 'all': LogLevel.all,\n 'd': LogLevel.debug,\n 'dbg': LogLevel.debug,\n 'debug': LogLevel.debug,\n 'i': LogLevel.info,\n 'inf': LogLevel.info,\n 'info': LogLevel.info,\n 'w': LogLevel.warn,\n 'warn': LogLevel.warn,\n 'warning': LogLevel.warn,\n 'e': LogLevel.error,\n 'err': LogLevel.error,\n 'error': LogLevel.error,\n 'fatal': LogLevel.fatal,\n 'off': LogLevel.off,\n '-': LogLevel.off,\n}\n\nexport type LogLevelAliasKey = keyof typeof LogLevelAlias\nexport type LogLevelAliasType = LogLevel | boolean | LogLevelAliasKey\n\nexport interface LogMessage {\n level: LogLevel\n name: string\n messages: any[]\n line?: number\n file?: string\n timestamp?: number\n}\n\nexport type LogHandler = (msg: LogMessage) => void\n\nexport interface LoggerInterface {\n (...messages: any[]): void\n\n /** @deprecated use .level = LogLevel.off or LogLevel.all */\n active: boolean\n\n level: LogLevel\n\n debug(...messages: any[]): void\n\n info(...messages: any[]): void\n\n warn(...messages: any[]): void\n\n error(...messages: any[]): void\n\n /**\n * Throws if condition is not truthy.\n *\n * **Attention!** Due to a bug in typescript you will need to explicitly set the `LoggerInterface` type in\n * order to have the assertions having an effect on unreachable code. Example:\n *\n * ```ts\n * const log: LoggerInterface = Logger('xxx')\n * ```\n *\n * Bug https://github.com/microsoft/TypeScript/issues/50363#issuecomment-1219811447\n */\n assert(condition: unknown, ...messages: any[]): asserts condition\n\n /**\n * Always throws.\n *\n * **Attention!** Due to a bug in typescript you will need to explicitly set the `LoggerInterface` type in\n * order to have the assertions having an effect on unreachable code. Example:\n *\n * ```ts\n * const log: LoggerInterface = Logger('xxx')\n * ```\n *\n * Bug https://github.com/microsoft/TypeScript/issues/50363#issuecomment-1219811447\n */\n fatal(...messages: any[]): never\n\n extend(prefix: string): LoggerInterface\n\n factory?: LoggerContextInterface\n\n label: string\n}\n\nexport interface LoggerContextInterface {\n (name?: string, level?: LogLevelAliasType): LoggerInterface\n\n registerHandler(handler: LogHandler): void\n\n setFilter(namespaces: string): void\n\n setHandlers(handlers?: (LogHandler | undefined | null)[]): void\n\n setLock(lock: boolean): void\n\n /** When true emits a short log message for each Logger when being set up first time. */\n setDebug(debug: boolean): void\n\n setLogLevel(level?: LogLevel): void\n\n setFactory(factory: (name?: string) => LoggerInterface): void\n}\n\nexport interface LogHandlerOptions {\n level?: LogLevel\n filter?: string\n colors?: boolean\n levelHelper?: boolean\n nameBrackets?: boolean\n padding?: number\n fill?: number\n stack?: boolean | number\n time?: boolean\n pretty?: boolean\n}\n\nexport function LoggerContext(_prefix = ''): LoggerContextInterface {\n let logHandlers: LogHandler[] = [LoggerConsoleHandler()]\n let logCheckNamespace = (_name: string) => true\n let logLock = false\n let logFactory = LoggerBaseFactory\n let logDebug = false\n\n function LoggerBaseFactory(\n name = '',\n level?: LogLevelAliasType,\n ): LoggerInterface {\n const logLevel = parseLogLevel(level ?? LogLevel.all)\n\n function defineForLogLevel(fnLevel: LogLevel, fn: any) {\n if (logLevel <= fnLevel)\n return fn\n return () => {}\n }\n\n const log = defineForLogLevel(LogLevel.debug, (...messages: any[]) => {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n emit({\n name,\n messages,\n level: LogLevel.debug,\n })\n })\n\n log.label = name\n // log.active = true\n\n log.extend = function (prefix: string): LoggerInterface {\n return logFactory(name ? `${name}:${prefix}` : prefix)\n }\n\n const emit = (msg: LogMessage) => {\n // if (log.active === true) {\n // if (msg.level >= Logger.level && msg.level >= log.level) {\n if (logCheckNamespace(name)) {\n for (const handler of logHandlers) {\n if (handler)\n handler(msg)\n }\n }\n // }\n // }\n }\n\n log.debug = defineForLogLevel(LogLevel.debug, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.debug })\n })\n\n log.info = defineForLogLevel(LogLevel.info, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.info })\n })\n\n log.warn = defineForLogLevel(LogLevel.warn, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.warn })\n })\n\n log.error = defineForLogLevel(LogLevel.error, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.error })\n })\n\n log.fatal = defineForLogLevel(LogLevel.fatal, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.fatal })\n throw new Error(`${messages.map(String).join(' ')}`)\n })\n\n log.assert = defineForLogLevel(LogLevel.fatal, (cond: unknown, ...args: any) => {\n if (!cond)\n log.fatal(...args)\n })\n\n return log\n }\n\n function Logger(\n name = '',\n level?: LogLevelAliasType,\n ): LoggerInterface {\n const log = logFactory(name, level)\n if (logDebug)\n log.debug(`+++ init of logger \"${name}\" on level \"${LogLevel[log.level]}\".`)\n return log\n }\n\n Logger.registerHandler = function (handler: LogHandler) {\n logHandlers.push(handler)\n }\n\n /** @deprecated */\n Logger.setFilter = function (namespaces: string) {\n logCheckNamespace = useNamespaceFilter(namespaces)\n }\n\n Logger.setLock = (lock = true) => (logLock = lock)\n\n Logger.setDebug = (debug = true) => (logDebug = debug)\n\n Logger.setHandlers = function (handlers: LogHandler[] = []) {\n if (logFactory !== LoggerBaseFactory)\n logFactory = LoggerBaseFactory\n\n if (logLock)\n return\n logHandlers = [...handlers].filter(h => typeof h === 'function')\n }\n\n Logger.level = LogLevel.all\n\n /** @deprecated */\n Logger.setLogLevel = function (level: LogLevel = LogLevel.all) {\n if (logLock)\n return\n Logger.level = level\n }\n\n Logger.setFactory = function (\n factory: (name?: string) => LoggerInterface,\n ): void {\n if (logLock)\n return\n logFactory = factory\n }\n\n return Logger\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getGlobalContext } from './global'\nimport type { LoggerContextInterface } from './log-base'\nimport { LoggerContext } from './log-base'\nimport { LoggerConsoleHandler } from './log-console'\n\n// Global logger to guarantee all submodules use the same logger instance\n\nlet globalLogger: LoggerContextInterface\n\ndeclare global {\n interface ZeedGlobalContext {\n logger?: any // Should be LoggerContextInterface, but avoid compiler issues this way\n }\n}\n\nfunction getLoggerContext() {\n const logger = LoggerContext()\n logger.setHandlers([LoggerConsoleHandler()])\n return logger\n}\n\nexport function getGlobalLogger(): LoggerContextInterface {\n if (globalLogger == null) {\n try {\n const gcontext = getGlobalContext()\n if (gcontext != null) {\n if (gcontext?.logger == null) {\n globalLogger = getLoggerContext()\n gcontext.logger = globalLogger\n }\n else {\n globalLogger = gcontext.logger\n }\n }\n else {\n globalLogger = getLoggerContext()\n }\n }\n catch (e) {\n globalLogger = getLoggerContext()\n }\n }\n return globalLogger\n}\n\n// todo sideffects\nexport const Logger = getGlobalLogger()\n","// From https://github.com/moll/json-stringify-safe License ISC\n\nconst _sortedReplacer = (key: string, value: any) =>\n (value instanceof Object && !(Array.isArray(value)))\n ? Object.keys(value)\n .sort()\n // .filter((key) => value[key] != null) // Remove null and undefined\n .reduce((sorted: any, key: string) => {\n // Sorted copy\n sorted[key] = value[key]\n return sorted\n }, {})\n : value\n\n// https://gist.github.com/davidfurlong/463a83a33b70a3b6618e97ec9679e490\nexport function jsonStringifySorted(\n obj: any,\n indent: number | undefined = undefined,\n) {\n return JSON.stringify(obj, _sortedReplacer, indent)\n}\n\n//\n\ntype EntryProcessor = (key: string, value: any) => any\n\nfunction serializer(replacer: EntryProcessor, cycleReplacer?: EntryProcessor) {\n const stack: any[] = []\n const keys: string[] = []\n\n if (cycleReplacer == null) {\n cycleReplacer = function (key, value) {\n if (stack[0] === value)\n return '[Circular ~]'\n return (\n `[Circular ~.${keys.slice(0, stack.indexOf(value)).join('.')}]`\n )\n }\n }\n\n return function (this: EntryProcessor, key: string, value: any): any {\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this)\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\n if (~stack.indexOf(value))\n value = cycleReplacer?.call(this, key, value)\n }\n else {\n stack.push(value)\n }\n\n value = _sortedReplacer(key, value)\n\n try {\n return replacer == null ? value : replacer.call(this, key, value)\n }\n catch (err) { }\n return String(value)\n }\n}\n\n/**\n * Similar to JSON.stringify but can handle circular references\n */\nexport function jsonStringifySafe(\n obj: any,\n replacer?: EntryProcessor | null,\n spaces?: string | number | null,\n cycleReplacer?: EntryProcessor,\n): string {\n // @ts-expect-error xxx\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)\n}\n\nexport const jsonStringify = jsonStringifySafe\n\n//\n\n// From https://github.com/unjs/destr MIT\n// https://github.com/fastify/secure-json-parse\n// https://github.com/hapijs/bourne\nconst suspectProtoRx\n = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/\nconst suspectConstructorRx\n = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/\n\nconst JsonSigRx = /^[\"{[]|^-?[0-9][0-9.]{0,14}$/\n\nfunction jsonParseTransform(key: string, value: any): any {\n if (key === '__proto__' || key === 'constructor')\n return\n\n return value\n}\n\nexport default function jsonParse(val: string): any {\n if (typeof val !== 'string')\n return val\n\n const _lval = val.toLowerCase()\n if (_lval === 'true')\n return true\n\n if (_lval === 'false')\n return false\n\n if (_lval === 'null')\n return null\n\n if (_lval === 'nan')\n return NaN\n\n if (_lval === 'infinity')\n return Infinity\n\n if (_lval === 'undefined')\n return undefined\n\n if (!JsonSigRx.test(val))\n return val\n\n try {\n if (suspectProtoRx.test(val) || suspectConstructorRx.test(val))\n return JSON.parse(val, jsonParseTransform)\n\n return JSON.parse(val)\n }\n catch (_e) {\n return val\n }\n}\n","/* eslint-disable no-control-regex */\n/* eslint-disable prefer-spread */\n\nimport { Logger } from '../log'\nimport { jsonStringifySafe } from './json'\n\nconst log = Logger('zeed:bin', 'error')\n\nexport type BinInput = Uint8Array | ArrayBuffer | string | number[]\n\n// From https://github.com/dmonad/lib0/blob/main/string.js#L44\n\nexport function _encodeUtf8Polyfill(str: string): Uint8Array {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++)\n buf[i] = encodedString.codePointAt(i) || 0\n\n return buf\n}\n\nexport function _decodeUtf8Polyfill(buf: Uint8Array) {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n // @ts-expect-error xxx\n encodedString += String.fromCodePoint.apply(null, bytes)\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\nlet _textEncoder: (data: string) => Uint8Array\n\nexport function stringToUInt8Array(text: string): Uint8Array {\n if (_textEncoder == null) {\n _textEncoder = _encodeUtf8Polyfill\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder()\n _textEncoder = data => encoder.encode(data)\n }\n }\n return _textEncoder(text.normalize('NFC'))\n}\n\nlet _textDecoder: (data: Uint8Array) => string\n\nexport function Uint8ArrayToString(bin: Uint8Array): string {\n if (_textDecoder == null) {\n _textDecoder = _decodeUtf8Polyfill\n if (typeof TextDecoder !== 'undefined') {\n const decoder = new TextDecoder('utf-8', { ignoreBOM: true })\n _textDecoder = data => decoder.decode(data)\n }\n }\n return _textDecoder(bin).normalize('NFC')\n}\n\nexport function toUint8Array(data: BinInput): Uint8Array {\n if (data instanceof ArrayBuffer)\n return new Uint8Array(data)\n if (typeof data === 'string')\n return stringToUInt8Array(data)\n if (data.length)\n return new Uint8Array(data)\n return data as Uint8Array\n}\n\nexport function joinToUint8Array(...args: BinInput[] | BinInput[][]) {\n let length = 0\n const bins = args.flat(1).map((d) => {\n const b = toUint8Array(d as BinInput)\n length += b.length\n return b\n })\n const bin = new Uint8Array(length)\n let cursor = 0\n for (const b of bins) {\n bin.set(b, cursor)\n cursor += b.length\n }\n return bin\n}\n\nexport function toHex(bin: BinInput): string {\n if (typeof Buffer !== 'undefined')\n return Buffer.from(toUint8Array(bin)).toString('hex')\n const h = '0123456789abcdef'\n let s = ''\n for (const v of [...toUint8Array(bin)])\n s += h[v >> 4] + h[v & 15]\n return s\n}\n\nexport function fromHex(hexString: string): Uint8Array {\n return Uint8Array.from(\n hexString.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16)),\n )\n}\n\n/** Regular base64 */\nexport function toBase64(bin: BinInput, stripPadding = false): string {\n const bytes = toUint8Array(bin)\n let sb = ''\n if (typeof Buffer !== 'undefined') {\n sb = Buffer.from(bytes).toString('base64')\n }\n else {\n let s = ''\n for (let i = 0; i < bytes.byteLength; i++)\n s += String.fromCharCode(bytes[i])\n sb = btoa(s)\n }\n if (stripPadding)\n return sb.replaceAll('=', '')\n return sb\n}\n\nexport function toBase64Url(bin: BinInput): string {\n const bytes = toUint8Array(bin)\n if (typeof Buffer !== 'undefined')\n return Buffer.from(bytes).toString('base64url').replaceAll('=', '')\n let s = ''\n for (let i = 0; i < bytes.byteLength; i++)\n s += String.fromCharCode(bytes[i])\n return btoa(s).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '')\n}\n\nexport function fromBase64(s: string): Uint8Array {\n s = s.replaceAll('-', '+').replaceAll('_', '/')\n if (typeof Buffer !== 'undefined') {\n const buf = Buffer.from(s, 'base64')\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n const a = atob(s)\n const bytes = new Uint8Array(a.length)\n for (let i = 0; i < a.length; i++)\n bytes[i] = a.charCodeAt(i)\n return bytes\n}\n\nexport function fromBase64String(s: string): string {\n return Uint8ArrayToString(fromBase64(s))\n}\n\n/** Compare contents of binary arrays */\nexport function equalBinary(\n a: ArrayBuffer | Uint8Array,\n b: ArrayBuffer | Uint8Array,\n): boolean {\n if (a.byteLength !== b.byteLength)\n return false\n const aa = toUint8Array(a)\n const bb = toUint8Array(b)\n for (let i = 0; i < aa.length; i++) {\n if (aa[i] !== bb[i])\n return false\n }\n return true\n}\n\nexport function jsonToUint8Array(json: any): Uint8Array | never {\n try {\n return stringToUInt8Array(jsonStringifySafe(json))\n }\n catch (err) {\n log.warn('jsonToUint8Array', json)\n throw err\n }\n}\n\nexport function Uint8ArrayToJson<T = any>(data: Uint8Array): T | never {\n try {\n return JSON.parse(Uint8ArrayToString(data))\n }\n catch (err) {\n log.warn('Uint8ArrayToJson', data)\n throw err\n }\n}\n\n// https://gist.github.com/igorgatis/d294fe714a4f523ac3a3\nexport function Uint8ArrayToHexDump(\n buffer: Uint8Array | ArrayBuffer | String | Array<number>,\n blockSize?: number,\n) {\n if (typeof buffer === 'string') {\n // log(\"buffer is string\")\n // do nothing\n }\n else if (buffer instanceof ArrayBuffer && buffer.byteLength !== undefined) {\n // log(\"buffer is ArrayBuffer\")\n buffer = String.fromCharCode.apply(\n String,\n [].slice.call(new Uint8Array(buffer)),\n )\n }\n else if (Array.isArray(buffer)) {\n // log(\"buffer is Array\")\n buffer = String.fromCharCode.apply(String, buffer)\n }\n else if (buffer.constructor === Uint8Array) {\n // log(\"buffer is Uint8Array\")\n buffer = String.fromCharCode.apply(String, [].slice.call(buffer))\n }\n else {\n // log(\"Error: buffer is unknown...\")\n return false\n }\n\n blockSize = blockSize || 16\n const lines = []\n const hex = '0123456789ABCDEF'\n for (let b = 0; b < buffer.length; b += blockSize) {\n const block = buffer.slice(b, Math.min(b + blockSize, buffer.length))\n const addr = (`0000${b.toString(16)}`).slice(-4)\n let codes = block\n .split('')\n .map((ch: any) => {\n const code = ch.charCodeAt(0)\n return ` ${hex[(0xF0 & code) >> 4]}${hex[0x0F & code]}`\n })\n .join('')\n codes += ' '.repeat(blockSize - block.length)\n let chars = block.replace(/[\\x00-\\x1F\\x20]/g, '.')\n chars += ' '.repeat(blockSize - block.length)\n lines.push(`${addr} ${codes} ${chars}`)\n }\n return lines.join('\\n')\n}\n","import type { BinInput } from './data/bin'\nimport { equalBinary, toUint8Array } from './data/bin'\n\n/** Get random bytes using window.crypto if available. Else use a poor fallback solution. */\nexport function randomUint8Array(length = 16): Uint8Array {\n const randomBytes = new Uint8Array(length)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(randomBytes)\n }\n else {\n // hack: not state of the art secure\n // throw \"crypto.getRandomValues is required\"\n for (let i = 0; i < length; i++) {\n // Math.random: \"...range 0 to less than 1 (inclusive of 0, but not 1)\"\n // 0.9... * 0xff < 255 therefore * 0x100\n randomBytes[i] = Math.floor(Math.random() * 0x100) // 0...255\n }\n }\n return randomBytes\n}\n\nexport const CRYPTO_DEFAULT_HASH_ALG = 'SHA-256'\nexport const CRYPTO_DEFAULT_ALG = 'AES-GCM'\nexport const CRYPTO_DEFAULT_DERIVE_ALG = 'PBKDF2'\nexport const CRYPTO_DEFAULT_DERIVE_ITERATIONS = 100000\n\nexport async function digest(\n message: BinInput,\n algorithm: AlgorithmIdentifier = CRYPTO_DEFAULT_HASH_ALG,\n): Promise<Uint8Array> {\n return toUint8Array(\n await crypto.subtle.digest(algorithm, toUint8Array(message)),\n )\n}\n\nexport async function deriveKeyPbkdf2(\n secret: BinInput,\n opt: {\n iterations?: number\n salt?: BinInput\n } = {},\n): Promise<CryptoKey> {\n const secretBuffer = toUint8Array(secret)\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n secretBuffer,\n CRYPTO_DEFAULT_DERIVE_ALG,\n false,\n ['deriveKey'],\n )\n return await crypto.subtle.deriveKey(\n {\n name: CRYPTO_DEFAULT_DERIVE_ALG,\n salt: opt.salt ? toUint8Array(opt.salt) : new Uint8Array(0),\n iterations: opt.iterations ?? CRYPTO_DEFAULT_DERIVE_ITERATIONS,\n hash: CRYPTO_DEFAULT_HASH_ALG,\n },\n keyMaterial,\n {\n name: CRYPTO_DEFAULT_ALG,\n length: 256,\n },\n true,\n ['encrypt', 'decrypt'],\n )\n}\n\nconst MAGIC_ID = new Uint8Array([1, 1])\n\nexport async function encrypt(\n data: Uint8Array,\n key: CryptoKey,\n): Promise<Uint8Array> {\n const iv = randomUint8Array(12)\n const cipher = await crypto.subtle.encrypt(\n { name: CRYPTO_DEFAULT_ALG, iv },\n key,\n data,\n )\n const binCypher = new Uint8Array(cipher)\n const bufferLength = MAGIC_ID.length + iv.length + binCypher.length\n const buffer = new Uint8Array(bufferLength)\n let pos = 0\n buffer.set(MAGIC_ID, pos)\n pos += MAGIC_ID.length\n buffer.set(iv, pos)\n pos += iv.length\n buffer.set(binCypher, pos)\n return buffer\n}\n\nexport async function decrypt(\n data: Uint8Array,\n key: CryptoKey,\n): Promise<Uint8Array> {\n const magic = data.subarray(0, 2)\n if (!equalBinary(magic, MAGIC_ID))\n return Promise.reject(new Error(`Unknown magic ${magic}`))\n\n const iv = data.subarray(2, 2 + 12)\n const cipher = data.subarray(2 + 12, data.length)\n const plain = await crypto.subtle.decrypt(\n { name: CRYPTO_DEFAULT_ALG, iv },\n key,\n cipher,\n )\n return new Uint8Array(plain)\n}\n","export function getSecureRandom(): number {\n return crypto.getRandomValues(new Uint32Array(1))[0] / 0xFFFFFFFF\n}\n\nexport function getSecureRandomIfPossible(): number {\n return typeof crypto !== 'undefined' ? getSecureRandom() : Math.random()\n}\n\nexport function randomBoolean(bias = 0.25): boolean {\n return getSecureRandomIfPossible() < bias\n}\n\n/** max is not included, min is included */\nexport function randomInt(max = 100, min = 0): number {\n return min + Math.floor(getSecureRandomIfPossible() * (max - min))\n}\n\nexport function randomFloat(max = 100, min = 0): number {\n return min + getSecureRandomIfPossible() * (max - min)\n}\n\nexport function between(min: number, value: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\n/** See also arraySum */\nexport function sum(array: number[]): number {\n return array.reduce((acc, value) => acc + value, 0)\n}\n\n/** See also arrayAvg */\nexport function avg(array: number[]): number {\n return sum(array) / array.length\n}\n\n// export const clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\n\n// https://www.noulakaz.net/2007/03/18/a-regular-expression-to-check-for-prime-numbers/\n/** Fancy prime number check ;) */\nexport function isPrimeRX(value: number): boolean {\n return !/^1?$|^(11+?)\\1+$/.test('1'.repeat(value))\n}\n\nexport function isPrime(value: number): boolean {\n for (let i = 2; i < value; i++) {\n if (value % i === 0)\n return false\n }\n return value > 1\n}\n\n// http://indiegamr.com/generate-repeatable-random-numbers-in-js/\n// https://softwareengineering.stackexchange.com/questions/260969/original-source-of-seed-9301-49297-233280-random-algorithm\n\nlet _seed = 6\n\n/** Deterministic random */\nexport function seededRandom(max = 0, min = 1, seed?: number) {\n _seed = ((seed ?? _seed) * 9301 + 49297) % 233280\n const rnd = _seed / 233280\n return min + rnd * (max - min)\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function parseOrderby(value = ''): {\n field: string\n orderby: string\n asc: boolean\n desc: boolean\n} {\n let [field = '', orderby = 'asc'] = value.split(' ')\n orderby = orderby.toLowerCase()\n return {\n field,\n orderby,\n asc: orderby !== 'desc',\n desc: orderby === 'desc',\n }\n}\n\nexport function composeOrderby(field: string, asc = true): string {\n return `${field} ${asc ? 'asc' : 'desc'}`\n}\n\n// Classic compare function with direction flag\nexport function cmp(a: any, b: any, asc = true): -1 | 0 | 1 {\n const aa = a || 0\n const bb = b || 0\n return aa > bb ? (asc ? 1 : -1) : aa < bb ? (asc ? -1 : 1) : 0\n}\n\n// todo: support localeCompare()\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n const orderByList = orderby.map(parseOrderby)\n // let { field, asc } = parseOrderby(orderby)\n // if (field != null && typeof field === \"string\") {\n // let bigger = asc ? 1 : -1\n // let smaller = asc ? -1 : 1\n const sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (const { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0)\n return result\n }\n return 0\n // const aa = a[field] || 0\n // const bb = b[field] || 0\n // return aa > bb ? bigger : aa < bb ? smaller : 0\n })\n return sortValues\n }\n return values\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-cond-assign */\n\nimport type { NestedArray } from '../types'\nimport { getSecureRandomIfPossible } from './math'\nimport { cmp } from './orderby'\n\nexport function arrayUnique<T>(x: T[]): T[] {\n return x.filter((n: any, index: any) => x.indexOf(n) === index)\n}\n\nexport function arrayMinus<T>(x: T[], y: T[]): T[] {\n return arrayUnique(x.filter((n: any) => !y.includes(n)))\n}\n\nexport function arrayUnion<T>(...a: T[][]): T[] {\n return arrayUnique(a.reduce((acc: T[] = [], value) => acc.concat(value), []))\n}\n\n/** `[1,[2,3]]` becomes `[1,2,3]` */\nexport function arrayFlatten<T>(...list: NestedArray<T>[]): T[] {\n return (list as any).flat(Infinity)\n}\n\nexport function arrayIntersection<T>(x: T[], y: T[]): T[] {\n return arrayUnique<T>(x).filter((n: any) => y.includes(n))\n}\n\nexport function arraySymmetricDifference<T>(x: T[], y: T[]): T[] {\n return arrayMinus(arrayUnion(x, y), arrayIntersection(x, y))\n // return arrayUnique(x.filter(n => !y.includes(n)).concat(y.filter(n => !x.includes(n))))\n}\n\n// export function arrayApply<T>(fn: any, a: T[]): T[] {\n// return a.reduce(fn, [])\n// }\n\nexport function arrayRemoveElement<T>(arr: T[], el: T): T[] {\n if (arr && Array.isArray(arr)) {\n let index\n while ((index = arr.indexOf(el)) !== -1) {\n // log(\"arrayRemoveElement remove\", index, el)\n arr.splice(index, 1)\n }\n // log(\"arrayRemoveElement result\", arr)\n return arr\n }\n // log(\"arrayRemoveElement no array\", arr, el)\n return []\n}\n\n/** Only have it once in the set */\nexport function arraySetElement<T>(arr: T[], el: T): T[] {\n if (!arr.includes(el))\n arr.push(el)\n return arr\n}\n\n// via https://stackoverflow.com/a/49587869 and Erwin\nexport function arrayFilterInPlace<T>(array: T[], fn: (el: T) => boolean): T[] {\n array.splice(0, array.length, ...array.filter(fn))\n return array\n}\n\n// via https://stackoverflow.com/a/49587869 and Erwin\nexport function arrayToggleInPlace<T>(array: T[], el: T): T[] {\n const index = array.findIndex(e => e === el)\n if (index >= 0)\n array.splice(index, 1)\n else array.push(el)\n return array\n}\n\nexport function arrayEmptyInPlace<T>(array: T[]): T[] {\n array.splice(0, array.length)\n return array\n}\n\nexport function arraySorted<T>(\n arr: Iterable<T> | ArrayLike<T>,\n cond: ((a: T, b: T) => number) | undefined = cmp,\n): T[] {\n return Array.from(arr).sort(cond)\n}\n\nexport function arraySortedNumbers(arr: number[]): number[] {\n return arraySorted(arr, (l: number, r: number) => l - r)\n}\n\nexport function arrayIsEqual<T>(array1: T[], array2: T[]): boolean {\n return (\n array1.length === array2.length\n && array1.every((value, index) => value === array2[index])\n )\n}\n\nexport function arrayShuffleInPlace<T>(array: T[]): T[] {\n array.sort(() => (getSecureRandomIfPossible() > 0.5 ? 1 : -1))\n\n // Alternative https://github.com/sindresorhus/array-shuffle/blob/main/index.js#L8\n // for (let index = array.length - 1; index > 0; index--) {\n // const newIndex = Math.floor(Math.random() * (index + 1));\n // [array[index], array[newIndex]] = [array[newIndex], array[index]];\n // }\n\n return array\n}\n\nexport function arrayShuffle<T>(array: T[]): T[] {\n return arrayShuffleInPlace(Array.from(array))\n}\n\n/** Randomly shuffle the order of the array's elements. Force to have a different order if array has more than one element. */\nexport function arrayShuffleForce<T>(array: T[]): T[] {\n while (array.length > 1) {\n const copy = Array.from(array)\n arrayShuffleInPlace(copy)\n if (!arrayIsEqual(array, copy))\n return copy\n }\n return array\n}\n\nexport function arrayRandomElement<T>(array: T[]): T {\n return array[Math.floor(getSecureRandomIfPossible() * array.length)]\n}\n\nexport function arrayMax<T>(...array: NestedArray<T>[]): T {\n // @ts-expect-error xxx\n return arrayFlatten(array).reduce(\n (acc, value) => (acc != null ? (value > acc ? value : acc) : value),\n undefined,\n )\n}\n\nexport function arrayMin<T>(...array: NestedArray<T>[]): T {\n // @ts-expect-error xxx\n return arrayFlatten(array).reduce(\n (acc, value) => (acc != null ? (value < acc ? value : acc) : value),\n undefined,\n )\n}\n\nexport function arraySum(...array: NestedArray<number>[]): number {\n return arrayFlatten(array).reduce((acc, value) => acc + value, 0)\n}\n\nexport function arrayAvg(...array: NestedArray<number>[]): number {\n const flatArray = arrayFlatten(array)\n return flatArray.reduce((acc, value) => acc + value, 0) / flatArray.length\n}\n\nexport function arrayBatches<T>(array: T[], chunckLength: number): T[][] {\n const chunks = []\n let i = 0\n const n = array.length\n while (i < n)\n chunks.push(array.slice(i, (i += chunckLength)))\n return chunks\n}\n\nexport function createArray<T>(\n size = 0,\n item?: T | ((index: number) => T),\n): T[] {\n if (size <= 0)\n return []\n const arr = new Array(size)\n for (let i = 0; i < size; i++)\n arr[i] = item instanceof Function ? item(i) : item\n\n return arr\n}\n","// Originial code at https://github.com/cryptocoinjs/base-x/blob/master/ts_src/index.ts\n//\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n\n// \"Fast base encoding / decoding of any given alphabet using bitcoin style leading zero compression.\"\n// \"WARNING: This module is NOT RFC3548 compliant, it cannot be used for base16 (hex), base32, or base64 encoding in a standards compliant manner.\"\n\nimport { Logger } from '../log'\nimport type { BinInput } from './bin'\nimport { toUint8Array } from './bin'\n\nconst log = Logger('zeed:basex', 'error')\n\nconst alphabets = {\n '2': '01',\n '8': '01234567',\n '11': '0123456789a',\n '16': '0123456789abcdef',\n '32': '0123456789abcdefghjkmnpqrtuvwxyz', // Agnoster, because least mix up and good sorting\n '32-crockford': '0123456789ABCDEFGHJKMNPQRSTVWXYZ', // Crockford\n '32-geohash': '0123456789bcdefghjkmnpqrstuvwxyz', // https://en.wikipedia.org/wiki/Base32#Geohash\n '32-agnoster': '0123456789abcdefghjkmnpqrtuvwxyz', // https://github.com/agnoster/base32-js/blob/master/lib/base32.js#L6 without i(1), l(1), o(0), s(5); keeps sort order\n '32-rfc': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', // https://datatracker.ietf.org/doc/html/rfc4648#section-6\n '32-hex': '0123456789ABCDEFGHIJKLMNOPQRSTUV', // https://datatracker.ietf.org/doc/html/rfc4648#section-7\n '32-zbase': 'ybndrfg8ejkmcpqxot1uwisza345h769', // https://en.wikipedia.org/wiki/Base32#z-base-32\n '36': '0123456789abcdefghijklmnopqrstuvwxyz',\n '58': '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',\n '62': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', // Correct sort order\n '64': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n '64-url': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', // https://datatracker.ietf.org/doc/html/rfc4648#section-5\n '66': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~',\n '85': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~', // https://datatracker.ietf.org/doc/html/rfc1924#section-4.2\n}\n\nexport function useBase(alphaOrBase: string | number) {\n let ALPHABET: string | undefined = (alphabets as any)[String(alphaOrBase)]\n\n if (!ALPHABET) {\n if (typeof alphaOrBase === 'string')\n ALPHABET = alphaOrBase\n else\n throw new Error(`Unknown base ${alphaOrBase}`)\n }\n\n if (ALPHABET.length >= 255)\n throw new TypeError('Alphabet too long')\n\n const BASE_MAP = new Uint8Array(256)\n for (let j = 0; j < BASE_MAP.length; j++)\n BASE_MAP[j] = 255\n\n for (let i = 0; i < ALPHABET.length; i++) {\n const x = ALPHABET.charAt(i)\n const xc = x.charCodeAt(0)\n\n if (BASE_MAP[xc] !== 255)\n throw new TypeError(`${x} is ambiguous`)\n BASE_MAP[xc] = i\n }\n\n const BASE = ALPHABET.length\n const LEADER = ALPHABET.charAt(0)\n const FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\n const iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\n\n function encode(source: BinInput, padToLength = -1): string {\n const data = toUint8Array(source)\n if (data.byteLength === 0)\n return ''\n\n // Skip & count leading zeroes.\n let length = 0\n let pbegin = 0\n const pend = data.byteLength\n\n while (pbegin !== pend && data[pbegin] === 0) pbegin++\n\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0\n const dataEncoded = new Uint8Array(size)\n\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = data[pbegin]\n\n // Apply \"dataEncoded = dataEncoded * 256 + ch\".\n let i = 0\n for (\n let it1 = size - 1;\n (carry !== 0 || i < length) && it1 !== -1;\n it1--, i++\n ) {\n carry += (256 * dataEncoded[it1]) >>> 0\n dataEncoded[it1] = carry % BASE >>> 0\n carry = (carry / BASE) >>> 0\n }\n\n if (carry !== 0) {\n log.warn('Non-zero carry', data, padToLength, i, size)\n throw new Error('Non-zero carry')\n }\n\n length = i\n pbegin++\n }\n\n let it2 = size - length\n\n // Skip leading zeroes\n while (it2 !== size && dataEncoded[it2] === 0) it2++\n\n // Translate the result into a string.\n let str = ''\n for (; it2 < size; ++it2) str += ALPHABET!.charAt(dataEncoded[it2])\n\n if (padToLength > 0) {\n // const pad = Math.ceil(source.length * iFACTOR)\n return str.padStart(padToLength, LEADER)\n }\n return str\n }\n\n function decode(source: string, padToLength = -1): Uint8Array {\n if (typeof source !== 'string')\n throw new TypeError('Expected String')\n if (source.length === 0)\n return new Uint8Array()\n\n // Normalize\n source = source.replace(/\\s+/gi, '')\n\n let psz = 0\n let length = 0\n\n while (source[psz] === LEADER) psz++\n\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0 // log(58) / log(256), rounded up.\n const dataDecoded = new Uint8Array(size)\n\n // Process the characters.\n while (source[psz]) {\n let carry = BASE_MAP[source.charCodeAt(psz)]\n\n // Invalid character\n if (carry === 255)\n throw new Error(`Unsupported character \"${source[psz]}\"`)\n\n let i = 0\n for (\n let it3 = size - 1;\n (carry !== 0 || i < length) && it3 !== -1;\n it3--, i++\n ) {\n carry += (BASE * dataDecoded[it3]) >>> 0\n dataDecoded[it3] = carry % 256 >>> 0\n carry = (carry / 256) >>> 0\n }\n\n if (carry !== 0)\n throw new Error('Non-zero carry')\n length = i\n psz++\n }\n\n // Skip leading zeroes\n let it4 = size - length\n while (it4 !== size && dataDecoded[it4] === 0) it4++\n\n if (padToLength > 0) {\n return new Uint8Array([\n ...new Uint8Array(padToLength - dataDecoded.length + it4),\n ...dataDecoded.slice(it4),\n ])\n }\n\n return dataDecoded.slice(it4)\n }\n\n return {\n encode,\n decode,\n }\n}\n\n// Shortcuts\n\nconst { encode: encodeBase32, decode: _decodeBase32 } = useBase(32)\n\nfunction decodeBase32(s: string) {\n return _decodeBase32(s\n .toLocaleLowerCase()\n .replaceAll('l', '1')\n .replaceAll('s', '5')\n .replaceAll('o', '0')\n .replaceAll('i', '1'))\n}\n\nexport { encodeBase32, decodeBase32 }\n\nexport const { encode: encodeBase16, decode: decodeBase16 } = useBase(16)\nexport const { encode: encodeBase58, decode: decodeBase58 } = useBase(58)\nexport const { encode: encodeBase62, decode: decodeBase62 } = useBase(62)\n\n// export const { encode: encodeBase32, decode: decodeBase32 } = useBase(32)\n// export const { encode: encodeBase64, decode: decodeBase64 } = useBase(64)\n\nexport function estimateSizeForBase(bytes: number, base: number) {\n return Math.ceil(bytes * (Math.log(256) / Math.log(base)))\n}\n","/*\nhttps://matthiashager.com/converting-snake-case-to-camel-case-object-keys-with-javascript\n\ncamelCase\nsnake_case\nkebab-case\nPascalCase // I won't be using this here, but it's only one small step further if you want to use it\n*/\n\nexport const toCamelCase = (s: string) => {\n // if only capital letters, convert to lower case\n if (s.length > 0) {\n if (/^[A-Z0-9_\\-\\ ]*$/g.test(s))\n s = s.toLowerCase()\n\n s = s\n // strip trailing non chars\n .replace(/^[-_\\ ]+/gi, '')\n .replace(/[-_\\ ]+$/gi, '')\n // strip separators and upper case first char\n .replace(/[-_\\ ]+([a-z0-9])/gi, ($0, $1) => $1.toUpperCase())\n // lower case first char\n s = s[0].toLowerCase() + s.substring(1)\n }\n return s\n}\n\nexport function toCapitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.toLowerCase().slice(1)\n}\n\nexport function toCapitalizeWords(s: string) {\n return s.replace(/\\w\\S*/g, toCapitalize)\n}\n\n// export function camelize(str: string) {\n// return str\n// .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word: string, index: number) =>\n// index === 0 ? word.toLowerCase() : word.toUpperCase()\n// )\n// .replace(/\\s+/g, \"\")\n// }\n\nexport function fromCamelCase(str: string, separator = '-') {\n separator = typeof separator === 'undefined' ? '_' : separator\n return str\n .replace(/([a-z\\d])([A-Z])/g, `$1${separator}$2`)\n .replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, `$1${separator}$2`)\n .toLowerCase()\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Uint8ArrayToHexDump } from './bin'\n// import { jsonStringify } from './json'\n\nconst TRUE_VALUES_LIST = ['1', 'true', 'yes', 'y', 'on']\n\nexport function stringToBoolean(value?: string, defaultValue = false): boolean {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\nexport function stringToInteger(value?: string, defaultValue = 0): number {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return parseInt(value.trim(), 10) ?? defaultValue\n}\n\nexport function stringToFloat(value?: string, defaultValue = 0.0): number {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return parseFloat(value.trim()) ?? defaultValue\n}\n\nexport function valueToBoolean(value?: any, defaultValue = false): boolean {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value\n if (typeof value === 'number')\n return value !== 0\n return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\nexport function valueToInteger(value?: any, defaultValue = 0): number {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value ? 1 : 0\n if (typeof value === 'number')\n return Math.floor(value)\n return parseInt(String(value).trim(), 10) ?? defaultValue\n}\n\nexport function valueToFloat(value?: any, defaultValue = 0.0): number {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value ? 1 : 0\n if (typeof value === 'number')\n return Math.floor(value)\n return parseFloat(String(value).trim()) ?? defaultValue\n}\n\nexport function valueToString(value?: any, defaultValue = ''): string {\n if (value == null)\n return defaultValue\n // if (value == \"\") return defaultValue // ???\n return String(value) ?? defaultValue\n}\n\n// todo: toDate, toTimestamp, toData(value, base=64)\n\n// export function mapToObject<T>(map: Map<string, T>): { [key: string]: T } {\n// return Object.fromEntries(map)\n// }\n\n// export function objectToMap<T>(obj: { [key: string]: T }): Map<string, T> {\n// return new Map(Object.entries(obj))\n// }\n\n// Shortcuts\n\nexport const toFloat = valueToFloat\nexport const toInt = valueToInteger\nexport const toString = valueToString\nexport const toBool = valueToBoolean\n\n// Strings\n\nexport interface RenderMessagesOptions {\n trace?: boolean // = true\n pretty?: boolean // = true\n}\n\nexport function formatMessages(\n messages: any[],\n opt: RenderMessagesOptions = {},\n): any[] {\n const { trace = true, pretty = true } = opt\n return messages.map((obj) => {\n if (obj && typeof obj === 'object') {\n if (pretty && (obj instanceof Uint8Array || obj instanceof ArrayBuffer))\n return `\\n${Uint8ArrayToHexDump(obj)}\\n`\n\n if (obj instanceof Error) {\n if (!trace)\n return `${obj.name || 'Error'}: ${obj.message}`\n\n return `${obj.name || 'Error'}: ${obj.message}\\n${obj.stack}`\n }\n\n try {\n return pretty ? JSON.stringify(obj, null, 2) : JSON.stringify(obj)\n }\n catch (err) {}\n }\n return String(obj)\n })\n}\n\nexport function renderMessages(\n messages: any[],\n opt: RenderMessagesOptions = {},\n): string {\n return formatMessages(messages, opt).join(' ')\n}\n\n//\n\n// Awesome trick from https://stackoverflow.com/a/5396742/140927\nexport function fixBrokenUth8String(brokenString: string): string {\n try {\n return decodeURIComponent(escape(brokenString))\n }\n catch (e) {\n // log.debug(\"fixString failed for\", s)\n }\n return brokenString\n}\n","// Functional Variant\n\nexport const DAY_MS = 86400000 // 1000 * 60 * 60 * 24\n\nexport type DayValue = number\n\nexport type DayInput =\n | DayValue\n | number\n | string\n | Date\n | [number, number?, number?]\n\nexport function dayYear(day: DayValue): DayValue {\n return Math.floor(day / 10000)\n}\n\nexport function dayMonth(day: DayValue): DayValue {\n return Math.floor((day / 100) % 100)\n}\n\nexport function dayDay(day: DayValue): DayValue {\n return Math.floor(day % 100)\n}\n\nexport function dayToParts(day: DayValue): [number, number, number] {\n return [dayYear(day), dayMonth(day), dayDay(day)]\n}\n\nexport function dayToDate(day: DayValue, gmt = false): Date {\n return gmt\n ? new Date(`${dayToString(day)}T00:00:00.000Z`)\n : new Date(\n day / 10000, // year\n ((day / 100) % 100) - 1, // month\n day % 100, // day\n )\n}\n\nexport function dayFromToday(): DayValue {\n return dayFromDate(new Date())\n}\n\nexport function dayFromAny(\n value: DayInput,\n gmt = false,\n): DayValue | undefined {\n if (typeof value === 'number') {\n if (value < 100)\n return\n return value\n }\n else if (typeof value === 'string') {\n return dayFromString(value)\n }\n else if (Array.isArray(value) && value.length === 3) {\n const [year, month, day] = value\n return dayFromParts(year, month, day)\n }\n else if (value instanceof Date) {\n return dayFromDate(value, gmt)\n // } else if (value instanceof Day) {\n // return value.days\n }\n}\n\nexport function dayToDateGMT(day: DayValue): Date {\n return dayToDate(day, true)\n}\n\nexport function dayFromDate(date: Date, gmt = false): DayValue {\n return (\n gmt\n ? dayFromString(date.toISOString())\n : date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate()\n )!\n}\n\nexport function dayFromDateGMT(date: Date): DayValue {\n return dayFromDate(date, true)\n}\n\nexport function dayToTimestamp(day: DayValue, gmt = true): number {\n return dayToDate(day, gmt).getTime()\n}\n\nexport function dayFromTimestamp(ms: number, gmt = true): DayValue {\n return dayFromDate(new Date(ms), gmt)\n}\n\nexport function dayToString(day: DayValue, sep = '-') {\n const baseString = String(day)\n return (\n baseString.slice(0, 4) + sep\n + baseString.slice(4, 6) + sep\n + baseString.slice(6, 8)\n )\n}\n\nexport function dayFromParts(\n year: number,\n month = 1,\n day = 1,\n): DayValue | undefined {\n if (month < 1 || month > 12 || day < 1 || day > 31)\n return\n return year * 10000 + month * 100 + day\n}\n\nexport function dayFromString(value: string): DayValue | undefined {\n const string = String(value)\n .replace(/[^0-9]/g, '')\n .slice(0, 8)\n if (string.length === 8)\n return +string\n}\n\nexport function dayMonthStart(day: DayValue, offset = 0): DayValue {\n let year = dayYear(day)\n let month = dayMonth(day)\n if (offset !== 0) {\n month += offset\n year += Math.floor((month - 1) / 12)\n month = Math.floor((month - 1) % 12) + 1\n if (month === 0)\n month = 12\n }\n return dayFromParts(year, month, 1)!\n}\n\nexport function dayYearStart(day: DayValue, offset = 0): DayValue {\n const year = dayYear(day)\n return dayFromParts(year + offset, 1, 1)!\n}\n\nexport function dayOffset(day: DayValue, offset: number): DayValue {\n // Important! Don't use local time here due to summer/winter time days can\n // be longer or shorter!\n return dayFromTimestamp(dayToTimestamp(day) + offset * DAY_MS)\n}\n\nexport function dayDiff(left: DayValue, right: DayValue): number {\n return Math.round((dayToTimestamp(right) - dayToTimestamp(left)) / DAY_MS)\n}\n\n/** List of dates for loops */\nexport function dayRange(left: DayValue, right?: DayValue): number[] {\n const list: number[] = []\n\n if (right == null)\n right = dayFromToday()\n\n if (left < 0)\n left = dayOffset(right, left + 1)\n\n while (left <= right) {\n list.push(left)\n left = dayOffset(left, +1)\n }\n return list\n}\n\n/** Iterator, see dayRange */\nexport function* dayIterator(left: DayValue, right?: DayValue) {\n const list: number[] = []\n\n if (right == null)\n right = dayFromToday()\n\n if (left < 0)\n left = dayOffset(right, left + 1)\n\n while (left <= right) {\n yield left\n left = dayOffset(left, +1)\n }\n return list\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable no-async-promise-executor */\n\nimport { Logger } from '../log'\n\nconst log = Logger('zeed:promise', 'error')\n\n/**\n * Promise to be used with `await`. Example:\n *\n * ```\n * const [promise, resolve, reject] = createPromise()\n * setTimeout(() => {\n * resolve(5)\n * }, 50)\n * const result = await promise\n * ```\n */\nexport function createPromise<T>(): [Promise<T>, any, any] {\n let resolve, reject\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve\n reject = _reject\n })\n return [promise, resolve, reject]\n}\n\n/** Sleep for `milliSeconds`. Example 1s: `await sleep(1000)` */\nexport async function sleep(milliSeconds: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, milliSeconds))\n}\n\n/** Same as `await sleep(0)`, just let the event loop execute. */\nexport async function immediate(): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, 0))\n}\n\nexport const timeoutReached = Symbol('timeout')\n\n// type Unwrap<T> = T extends Promise<infer U>\n// ? U\n// : T extends (...args: any) => Promise<infer U>\n// ? U\n// : T extends (...args: any) => infer U\n// ? U\n// : T\n\nexport async function timeout<T>(\n promise: Promise<T>,\n milliSeconds: number,\n timeoutValue = timeoutReached,\n): Promise<T | typeof timeoutValue> {\n return new Promise(async (resolve, reject) => {\n let done = false\n\n const timeout = setTimeout(() => {\n done = true\n resolve(timeoutValue)\n }, milliSeconds)\n\n try {\n const result = await promise\n clearTimeout(timeout)\n if (!done)\n resolve(result)\n }\n catch (err) {\n clearTimeout(timeout)\n if (!done)\n reject(err)\n }\n })\n}\n\nexport const timoutError = new Error('Timeout reached')\n\nexport function isTimeout(value: any): boolean {\n return value === timeoutReached || value === timoutError\n}\n\nexport async function tryTimeout<T>(\n promise: Promise<T>,\n milliSeconds: number,\n): Promise<T | undefined> {\n if (milliSeconds <= 0)\n return await promise\n\n return new Promise(async (resolve, reject) => {\n let done = false\n\n const timeout = setTimeout(() => {\n done = true\n reject(timoutError)\n }, milliSeconds)\n\n try {\n const result = await promise\n clearTimeout(timeout)\n if (!done)\n resolve(result)\n }\n catch (err) {\n clearTimeout(timeout)\n if (!done)\n reject(err)\n }\n })\n}\n\n/** Wait for `event` on `obj` to emit. Resolve with result or reject on `timeout` */\nexport function waitOn(\n obj: any,\n event: string,\n timeoutMS = 1000,\n): Promise<any> {\n return new Promise((resolve, reject) => {\n const fn = (value: any) => {\n if (timer) {\n clearTimeout(timer)\n done()\n resolve(value)\n }\n }\n\n let done = () => {\n timer = null\n if (obj.off)\n obj.off(event, fn)\n else if (obj.removeEventListener)\n obj.removeEventListener(event, fn)\n else\n log.warn('No remove listener method found for', obj, event)\n }\n\n let timer: any = setTimeout(() => {\n done()\n reject(new Error('Did not response in time'))\n }, timeoutMS)\n\n if (obj.on)\n obj.on(event, fn)\n else if (obj.addEventListener)\n obj.addEventListener(event, fn)\n else\n log.warn('No listener method found for', obj)\n })\n}\n\nexport function isPromise<T>(value: Promise<T> | T): value is Promise<T> {\n return Boolean(\n value\n && (value instanceof Promise\n // @ts-expect-error xxx\n || typeof value.then === 'function'),\n )\n}\n\n/** This is exactly what Prose.resolve(x) is supposed to be: return a Promise no matter what type x is */\nexport function promisify<T>(value: Promise<T> | T): Promise<T> {\n return Promise.resolve(value)\n}\n\n// // https://github.com/unjs/items-promise\n\n// /**\n// * Run tasks one by one by calling fn(task, previous) in a promise chain.\n// * Return value is of type Promise<*> which resolves to the last fn result.\n// */\n// export async function serial(tasks: any, fn: any) {\n// return tasks.reduce(\n// (promise: Promise<any>, task: any) =>\n// promise.then((previous) => fn(task, previous)),\n// Promise.resolve(null)\n// )\n// }\n\n// /**\n// * Run all tasks in parallel by calling fn(tasks) and await using Promise.all.\n// * Return value is of type Promise<*[]> which resolves to results of all fns in an array.\n// */\n// export async function parallel(tasks: any[], fn: any): Promise<any[]> {\n// return Promise.all(tasks.map((task) => fn(task)))\n// }\n\n//\n\n/**\n * Like ReturnType but for async functions.\n * From https://www.jpwilliams.dev/how-to-unpack-the-return-type-of-a-promise-in-typescript\n */\nexport type AsyncReturnType<T extends (...args: any) => any> = T extends (\n ...args: any\n) => Promise<infer U>\n ? U\n : T extends (...args: any) => infer U\n ? U\n : any\n","import { isPromise } from '../exec/promise'\nimport type { DayInput, DayValue } from './day'\nimport { DAY_MS } from './day'\n\n// See also and alternatives:\n// https://blog.openreplay.com/is-it-time-for-the-javascript-temporal-api\n// https://github.com/iamkun/dayjs\n// https://github.com/date-fns/date-fns\n\nexport type DayInputLegacy = DayInput | Day\n\n/**\n * Date represented as positive integer value. Years smaller 0 are not supported.\n * @deprecated\n */\nexport class Day {\n days: DayValue\n\n get value() {\n return this.days\n }\n\n constructor(days?: DayInputLegacy) {\n if (typeof days === 'number') {\n this.days = days\n return\n }\n\n if (days != null)\n days = Day.from(days)?.days\n\n if (days == null) {\n const date = new Date()\n this.days\n = date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate()\n }\n else {\n this.days = days\n }\n }\n\n static fromNumber(n: number): Day {\n return new Day(n)\n }\n\n static fromString(dateString: string): Day | undefined {\n return Day.from(+dateString.replace(/[^0-9]/g, '').slice(0, 8))\n }\n\n static fromDate(date: Date, gmt = false): Day {\n return (\n gmt\n ? Day.fromString(date.toISOString().substr(0, 10))\n : Day.from(\n date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate(),\n )\n ) as Day\n }\n\n static fromDateGMT(date: Date): Day {\n return Day.fromDate(date, true)\n }\n\n static from(value: DayInputLegacy, gmt = false): Day | undefined {\n if (typeof value === 'number') {\n if (value < 100)\n return\n return new Day(value)\n }\n else if (typeof value === 'string') {\n return Day.fromString(value)\n }\n else if (Array.isArray(value) && value.length === 3) {\n const [year, month = 1, day = 1] = value\n if (month < 1 || month > 12 || day < 1 || day > 31)\n return\n return new Day(year * 10000 + month * 100 + day)\n }\n else if (value instanceof Date) {\n return Day.fromDate(value, gmt)\n }\n else if (value instanceof Day) {\n return value\n }\n }\n\n toNumber(): number {\n return this.days\n }\n\n // Transformer\n\n /** Just for future extensions */\n toJson() {\n return this.days\n }\n\n toString(sep = '-') {\n const baseString = String(this.days)\n return (\n baseString.slice(0, 4)\n + sep\n + baseString.slice(4, 6)\n + sep\n + baseString.slice(6, 8)\n )\n }\n\n toDate(gmt = false): Date {\n return gmt\n ? new Date(`${this.toString()}T00:00:00.000Z`)\n : new Date(\n this.days / 10000, // year\n ((this.days / 100) % 100) - 1, // month\n this.days % 100, // day\n )\n }\n\n toDateGMT() {\n return this.toDate(true)\n }\n\n get year() {\n return Math.floor(this.days / 10000)\n }\n\n get month() {\n return Math.floor((this.days / 100) % 100)\n }\n\n get day() {\n return Math.floor(this.days % 100)\n }\n\n // Calculations\n\n dayOffset(offset: number): Day {\n // Important! Don't use local time here due to summer/winter time days can\n // be longer or shorter!\n return Day.fromDateGMT(\n new Date(this.toDateGMT().getTime() + offset * DAY_MS),\n )\n }\n\n monthStart(): Day {\n return Day.from([this.year, this.month, 1])!\n }\n\n yearStart(): Day {\n return Day.from([this.year, 1, 1])!\n }\n\n /** Very stupid approach, only works for days <= 28 */\n monthOffset(offset: number): Day {\n const m = this.month + offset\n let mm = Math.floor((m - 1) % 12) + 1\n if (mm === 0)\n mm = 12\n const yy = Math.floor((m - 1) / 12)\n // log(\"calc\", m, mm, yy, [this.year + yy, mm, this.day])\n return Day.from([this.year + yy, mm, this.day])!\n }\n\n daysUntil(otherDay: DayInputLegacy): number {\n return Math.round(\n (new Day(otherDay)?.toDateGMT().getTime() - this.toDateGMT().getTime())\n / DAY_MS,\n )\n }\n\n // Shortcuts\n\n yesterday() {\n return this.dayOffset(-1)\n }\n\n tomorrow() {\n return this.dayOffset(+1)\n }\n}\n\nexport async function forEachDay(\n from: DayInputLegacy,\n to: DayInputLegacy,\n handler: (date: Day) => Promise<void> | void,\n) {\n let start = Day.from(from)\n const end = Day.from(to)\n // eslint-disable-next-line no-unmodified-loop-condition\n while (start && end && start?.days <= end?.days) {\n const result = handler(start)\n if (isPromise(result))\n await result\n\n start = start.dayOffset(+1)\n }\n}\n\nexport function today(): Day {\n return new Day()\n}\n\n/** @deprecated */\nexport function day(days?: DayInputLegacy): Day {\n return new Day(days)\n}\n\nexport function dateStringToDays(dateString: string): number {\n return Day.fromDate(new Date(dateString)).days\n}\n","export type DecimalValue = number\nexport type DecimalInput = number | string | DecimalValue\n\nexport function decimal(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return +(+value).toFixed(decimalPlaces)\n}\n\nexport function decimalFromCents(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return +(+value / 10 ** decimalPlaces).toFixed(decimalPlaces)\n}\n\nexport function decimalToCents(\n value: DecimalInput,\n decimalPlaces = 2,\n): number {\n return Math.round(+value * 10 ** decimalPlaces)\n}\n\nexport function decimalCentsPart(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return decimalPlaces * (decimal(value, decimalPlaces) % 1)\n}\n","// https://github.com/sindresorhus/is/ MIT\n// https://github.com/sindresorhus/ts-extras\n// https://github.com/sindresorhus/type-fest\n// https://github.com/antfu/utils\n\nexport type Primitive =\n | null\n | undefined\n | string\n | number\n | boolean\n | symbol\n | bigint\n\nexport function isObject(obj: unknown): obj is object {\n return obj != null && typeof obj === 'object'\n}\n\n/** Something like number, string, boolean */\nexport function isPrimitive(obj: unknown): obj is Primitive {\n return Object(obj) !== obj\n}\n\nexport function isArray(obj: unknown): obj is Array<any> {\n return Array.isArray(obj)\n}\n\n/** Object that is not an array. But could also be an object defined by a class. */\nexport function isRecord(obj: unknown): obj is Record<string, any> {\n return isObject(obj) && !isArray(obj)\n}\n\n/** Just data, like constructed via `{...}`. */\nexport function isRecordPlain(obj: unknown): obj is Record<string, any> {\n return obj?.constructor === Object\n}\n\nexport function isString(obj: unknown): obj is string {\n return typeof obj === 'string'\n}\n\nexport function isNumber(obj: unknown): obj is number {\n return typeof obj === 'number' && !isNaN(obj) // wtf! Nan === type number\n}\n\nexport function isInteger(obj: unknown): obj is number {\n return isNumber(obj) && Number.isInteger(obj)\n}\n\n/** Integer with full precision i.e. its value is in the signed 53 bit range. */\nexport function isSafeInteger(obj: unknown): obj is number {\n return isNumber(obj) && Number.isSafeInteger(obj)\n}\n\nexport function isBoolean(obj: unknown): obj is boolean {\n return typeof obj === 'boolean'\n}\n\n/** @deprecated use `isNull` */\nexport function isNullOrUndefined(obj: unknown): obj is null | undefined {\n return obj == null\n}\n\nexport function isNull(obj: unknown): obj is null | undefined {\n return obj == null\n}\nexport function isUint8Array(obj: unknown): obj is Uint8Array {\n return isObject(obj) && obj.constructor.name === 'Uint8Array'\n}\n\n// https://stackoverflow.com/a/46700791/140927\n\n/// Not `null` or `undefined`, use like `.filter(isNotEmpty)`\nexport function isNotNull<T>(value: T | null | undefined): value is T {\n return value != null\n}\n\n/// Not `null` or `undefined` or `boolean`, use like `.filter(isValue)`.\n// Usefull e.g. on conditional list: `[x && 'value', ...]`\nexport function isValue<T>(value: T | null | undefined | boolean): value is T {\n return value != null && value !== false && value !== true\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-prototype-builtins */\n\nimport { isArray, isObject, isPrimitive, isRecord } from './is'\n\nexport function deepEqual(a: any, b: any, hash = new WeakSet()) {\n // if both x and y are null or undefined and exactly the same\n if (a === b)\n return true\n\n // Cyclic\n if (hash.has(b)) {\n // console.log('cyclic')\n return false\n }\n\n if (!isPrimitive(b))\n hash.add(b)\n\n // if they are not strictly equal, they both need to be Objects\n if (!(a instanceof Object) || !(b instanceof Object))\n return false\n\n // they must have the exact same prototype chain, the closest we can do is\n // test there constructor.\n if (a.constructor !== b.constructor)\n return false\n\n // Shortcut to avoid to many loops\n if (a.length !== b.length)\n return false\n\n for (const p in a) {\n // other properties were tested using x.constructor === y.constructor\n if (!a.hasOwnProperty(p))\n continue\n\n // allows to compare x[ p ] and y[ p ] when set to undefined\n if (!b.hasOwnProperty(p))\n return false\n\n const aa = a[p]\n const bb = b[p]\n\n // if they have the same strict value or identity then they are equal\n // if (aa === bb) {\n // console.log('eq', typeof bb)\n // if (bb != null) hash.set(bb, true)\n // continue\n // }\n //\n // // Numbers, Strings, Functions, Booleans must be strictly equal\n // if (typeof (aa) !== 'object') {\n // return false\n // }\n\n // Objects and Arrays must be tested recursively\n if (!deepEqual(aa, bb, hash))\n return false\n }\n\n // allows x[ p ] to be set to undefined\n for (const p in b) {\n if (b.hasOwnProperty(p) && !a.hasOwnProperty(p))\n return false\n }\n\n return true\n}\n\n/** Strip properties with value `undefined` in place */\nexport function deepStripUndefinedInPlace(a: any, hash = new WeakSet()) {\n // Cyclic\n if (hash.has(a))\n return '[Circular ~]'\n if (!isPrimitive(a))\n hash.add(a)\n\n if (isRecord(a)) {\n for (const p in a) {\n if (!a.hasOwnProperty(p))\n continue\n if (a[p] === undefined) {\n delete a[p]\n continue\n }\n deepStripUndefinedInPlace(a[p], hash)\n }\n }\n else if (isArray(a)) {\n for (let i = a.length - 1; i >= 0; i--) {\n if (a[i] === undefined)\n a.splice(i, 1)\n }\n }\n // else ignore\n\n return a\n}\n\nexport function deepMerge(target: any, ...sources: any[]) {\n // todo cyclic protection\n for (const source of sources) {\n if (!isObject(target))\n target = {}\n\n if (source == null || !isObject(source))\n continue\n\n Object.keys(source).forEach((key) => {\n const targetValue = target[key]\n const sourceValue = (source as any)[key]\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue))\n target[key] = targetValue.concat(sourceValue)\n else if (isObject(targetValue) && isObject(sourceValue))\n target[key] = deepMerge(Object.assign({}, targetValue), sourceValue)\n else\n target[key] = sourceValue\n })\n }\n\n return target\n}\n\n// // https://stackoverflow.com/a/40294058/140927\n// // Handles cyclic references\n// export function deepClonePrimitives(obj, hash = new WeakMap()) {\n//\n// // primitives\n// if (Object(obj) !== obj) {\n// // log('Primitive', obj)\n// return obj\n// }\n//\n// // cyclic reference\n// if (hash.has(obj)) {\n// return hash.get(obj)\n// }\n//\n// let result\n//\n// // primitives as objects like new String(), new Number()\n// if (\n// obj instanceof String ||\n// obj instanceof Number ||\n// obj instanceof BigInt ||\n// obj instanceof Boolean ||\n// obj instanceof Symbol\n// ) {\n// result = new obj.constructor(obj.valueOf())\n// // hash.set(obj, result)\n// return result\n// }\n//\n// // log('Obj', obj)\n//\n// if (obj instanceof Set) {\n// result = new Set(obj)\n// } else if (obj instanceof Map) {\n// result = new Map(Array.from(obj, ([key, val]) => [key, deepClonePrimitives(val, hash)]))\n// } else if (obj instanceof Date) {\n// result = new Date(obj)\n// } else if (obj instanceof RegExp) {\n// result = new RegExp(obj.source, obj.flags)\n// } else if (Array.isArray(obj)) {\n// result = Array.from(obj, val => deepClonePrimitives(val, hash))\n// } else if (obj.constructor) {\n// result = new obj.constructor()\n// log('bj object', result)\n// } else if (obj instanceof Function || typeof obj === 'function') {\n// log('Keep object', obj, Object.getPrototypeOf(obj))\n// result = obj\n// } else {\n// result = Object.create(null)\n// }\n//\n// hash.set(obj, result)\n//\n// return Object.assign(result, ...Object.keys(obj).map(key => ({\n// [key]: deepClonePrimitives(obj[key], hash),\n// })))\n// }\n","export const escapeHTML = (s: string): string =>\n s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n\nexport const unescapeHTML = (s: string): string =>\n s\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/"/gi, '\"')\n .replace(/'/gi, '\\'')\n .replace(/&/gi, '&')\n","export type FilterFunction<T> = (o: T) => boolean\nexport type MapperFunction<T> = (o: T) => any\n\n/** Apply multiple filters, optionally transform through mappers, filter null/undefined items. */\nexport function listQuery<T>(\n list: T[],\n filters: FilterFunction<T>[],\n mappers: MapperFunction<T>[] = [],\n): T | any[] {\n return list\n .filter((o: T) => !filters.some(a => !a(o)))\n .map((o) => {\n for (const m of mappers)\n o = m(o)\n return o\n })\n .filter(o => o != null)\n}\n\n/** Split up a list by `key` resulting in a Record of `key` and sub-list. */\nexport function listGroupBy<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): Record<string, T[]> {\n return list.reduce((result: any, currentValue: T) => {\n const groupValue = String(currentValue[key])\n ;(result[groupValue] = result[groupValue] || []).push(currentValue)\n return result\n }, {})\n}\n\n/** Returns a list of values of a certain `key`. No duplicates. */\nexport function listDistinctUnion<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): any[] {\n return Array.from(\n list.reduce(\n (result: Set<any>, currentValue: T) => result.add(currentValue[key]),\n new Set(),\n ),\n )\n}\n\n/** Returns a list of values of a certain `key`. */\nexport function listOfKey<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): any[] {\n return list.map(item => item[key])\n}\n","import { isArray, isObject } from './is'\n\n/** Like `.map()` for object. Return new key and value or `undefined` to delete. */\nexport function objectMap<T = any>(\n obj: any,\n fn: (\n key: string,\n value: any\n ) => [key: string, value: T] | T | undefined | null,\n): Record<string, T> {\n if (!isObject(obj))\n return {}\n return Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => {\n const r = fn(k, v)\n if (isArray(r) && r.length === 2)\n return r\n\n return [k, r]\n })\n .filter(v => v != null),\n )\n}\n\n/** Merge right into left object. If dispose is defined, it will be combined. Left can be a complex object i.e. a insantiated class. */\nexport function objectMergeDisposable<A extends object, B extends object>(\n a: A,\n b: B,\n): A & B {\n // @ts-expect-error xxx\n if (b.dispose && a.dispose) {\n // @ts-expect-error xxx\n b.dispose.add(a.dispose)\n }\n return Object.assign(a, b)\n}\n\n// export function objectMerge<A, B>(a: A, b: B): A & B {\n// return Object.assign({}, a, b)\n// }\n\nexport function objectIsEmpty(obj: object) {\n return Object.keys(obj).length <= 0\n}\n","// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n\n/* eslint-disable no-control-regex */\n\nconst MAX_FILENAME_LENGTH = 100\n\nconst reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\n\nfunction filenameReservedRegex() {\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\n/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */\nexport function toValidFilename(\n string: string,\n replacement = '_',\n): string | never {\n if (typeof string !== 'string')\n throw new TypeError('Expected a string')\n\n if (\n filenameReservedRegex().test(replacement)\n && reControlChars.test(replacement)\n ) {\n throw new Error(\n 'Replacement string cannot contain reserved filename characters',\n )\n }\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reControlChars, replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, '')\n\n string = windowsReservedNameRegex().test(string)\n ? string + replacement\n : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n","const rxEscape = /[\\\\\\-\\[\\]\\/{}()*+?.^$|]/g // Finds: \\ - [ ] / { } ( ) * + ? . ^ $ |\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value)\n return ''\n if (value instanceof RegExp)\n return value.source\n\n return value.replace(rxEscape, '\\\\$&')\n}\n","// From https://v2.dinerojs.com/docs/api/formatting/to-unit MIT\n\nexport type RoundingMode = (value: number) => number\n\nexport const isHalf = (value: number) => Math.abs(value) % 1 === 0.5\nexport const isEven = (value: number) => value % 2 === 0\n\nexport const roundUp: RoundingMode = value => Math.ceil(value)\nexport const roundDown: RoundingMode = value => Math.floor(value)\nexport const roundHalfUp: RoundingMode = value => Math.round(value)\n\n/**\n * Round a number with half values to nearest odd integer.\n */\nexport const roundHalfOdd: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded - 1 : rounded\n}\n\n/**\n * Round a number with half values to nearest integer farthest from zero.\n */\nexport const roundHalfAwayFromZero: RoundingMode = (value) => {\n return isHalf(value)\n ? Math.sign(value) * Math.ceil(Math.abs(value))\n : Math.round(value)\n}\n\n/**\n * Round a number with half values down.\n */\nexport const roundHalfDown: RoundingMode = value =>\n isHalf(value) ? Math.floor(value) : Math.round(value)\n\n/**\n * Round a number with half values to nearest even integer.\n * https://wiki.c2.com/?BankersRounding\n */\nexport const roundHalfEven: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded : rounded - 1\n}\n\n/**\n * Round a number with half values to nearest integer closest to zero.\n */\nexport const roundHalfTowardsZero: RoundingMode = value =>\n isHalf(value)\n ? Math.sign(value) * Math.floor(Math.abs(value))\n : Math.round(value)\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getSecureRandomIfPossible } from './math'\n\n// Get a sort_weight suitable for adding to top of list\n// Original idea https://holtwick.de/en/blog/smart-table-reordering\n\nexport interface SortableItem {\n sort_weight: number\n}\n\nexport function startSortWeight(items: SortableItem[]): number {\n return (\n items.reduce((acc, item) => Math.min(acc, item.sort_weight || 0), 0)\n - 1\n - getSecureRandomIfPossible()\n )\n}\n\n// Get a sort_weight suitable for adding to end of list\nexport function endSortWeight(items: SortableItem[]): number {\n return (\n items.reduce((acc, item) => Math.max(acc, item.sort_weight || 0), 0)\n + 1\n + getSecureRandomIfPossible()\n )\n}\n\n// The real magic\nexport function moveSortWeight(\n newIndex: number,\n oldIndex: number,\n items: SortableItem[],\n): number {\n const count = items.length\n\n const moveLower = newIndex < oldIndex\n if (count <= 0 || newIndex >= count - 1)\n return endSortWeight(items)\n\n if (newIndex <= 0)\n return startSortWeight(items)\n\n // Make sure they are sorted\n items = sortedItems([...items])\n\n const step = moveLower ? -1 : 0\n const lower = items[newIndex + step].sort_weight || 0\n const upper = items[newIndex + step + 1].sort_weight || 0\n const distance = upper - lower\n if (distance === 0) {\n // Ugly list with no presets, make the best guess\n if (moveLower)\n return startSortWeight(items)\n\n return endSortWeight(items)\n }\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n}\n\nexport function sortedItems<T extends SortableItem>(items: T[]): T[] {\n items.sort((a, b) => (a.sort_weight || 0) - (b.sort_weight || 0))\n return items\n}\n","import { getSecureRandomIfPossible } from './math'\n\n/** CRDT compatible sorting with a single operation. Default name is `sort` */\nexport function useSorted<S extends Record<string, any>>(\n config: {\n getter?: (item: S) => number\n // setter?: (item: S, value: number) => void\n } = {},\n) {\n const {\n getter = (item: any): number => item.sort,\n // setter = (item: any, value) => (item.sort = value),\n } = config\n\n /** Return sorted list from low to high. */\n function items<T extends S>(items: T[]): T[] {\n items.sort((a, b) => (getter(a) || 0) - (getter(b) || 0))\n return items\n }\n\n /** Get a sort suitable for adding to start of list. */\n function start(items: S[]): number {\n return (\n items.reduce((acc, item) => Math.min(acc, getter(item) || 0), 0) - 1 - getSecureRandomIfPossible()\n )\n }\n\n /** Get a sort suitable for adding to end of list. */\n function end(items: S[]): number {\n return (\n items.reduce((acc, item) => Math.max(acc, getter(item) || 0), 0) + 1 + getSecureRandomIfPossible()\n )\n }\n\n /** Find a suitable value inbetween a lower and upper bound. */\n function between(lower?: number, upper?: number): number {\n if (lower == null)\n lower = (upper ?? 0) - 1\n if (upper == null)\n upper = (lower ?? 0) + 1\n\n const distance = upper - lower\n // if (distance === 0)\n\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n }\n\n /** Mainly for drag and drop movements, where an item has to be moved to another index. Respects its own move as well. */\n function move(\n newIndex: number,\n oldIndex: number,\n sortableItems: S[],\n ): number {\n const count = sortableItems.length\n\n const moveLower = newIndex < oldIndex\n if (count <= 0 || newIndex >= count - 1)\n return end(sortableItems)\n\n if (newIndex <= 0)\n return start(sortableItems)\n\n // Make sure they are sorted\n sortableItems = items([...sortableItems])\n\n const step = moveLower ? -1 : 0\n const lower = getter(sortableItems[newIndex + step]) || 0\n const upper = getter(sortableItems[newIndex + step + 1]) || 0\n const distance = upper - lower\n if (distance === 0) {\n // Ugly list with no presets, make the best guess\n if (moveLower)\n return start(sortableItems)\n\n return end(sortableItems)\n }\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n }\n\n return {\n start,\n end,\n between,\n move,\n items,\n }\n}\n","// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\nconst findURL\n = /((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00A1-\\uFFFF][a-z0-9\\u00A1-\\uFFFF_-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+(?:[a-z\\u00A1-\\uFFFF]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?)/gim\n\nexport function linkifyPlainText(text: string): string {\n return text\n .split(findURL)\n .map((part, i) => {\n const escapedPart = escapeHTML(part)\n return i % 2\n ? `<a target=\"_blank\" href=\"${escapedPart}\">${toHumanReadableUrl(\n escapedPart,\n )}</a>`\n : escapedPart\n })\n .join('')\n}\n\nexport function toHumanReadableUrl(url: string): string {\n return url.replace(/^https?:\\/\\/(www\\.)?/, '').replace(/\\/$/, '')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>) {\n const pairs = []\n for (let [key, value] of Object.entries(data)) {\n if (value != null) {\n if (!Array.isArray(value))\n value = [value]\n for (const v of value) {\n if (v != null) {\n pairs.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`,\n )\n }\n }\n }\n }\n return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n const query: any = {}\n const pairs = (\n queryString[0] === '?' ? queryString.substr(1) : queryString\n ).split('&')\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i].split('=')\n const key = decodeURIComponent(pair[0])\n const value = decodeURIComponent(pair[1] || '')\n if (query[key] != null) {\n if (!Array.isArray(query[key]))\n query[key] = [query[key]]\n\n query[key].push(value)\n }\n else {\n query[key] = value\n }\n }\n return query\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { Json } from '../types'\nimport { jsonStringifySafe } from './json'\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * function createRoom(room, rooms) { return new Room() }\n * ensureKey(rooms, room, createRoom).enter()\n * ```\n */\nexport function ensureKey<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => T,\n): T {\n let value = obj[key]\n if (value === undefined) {\n value = createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * async function fetchItem(id, cache) { ... }\n * let data = await ensureKey(cache, id, fetchItem)\n * ```\n */\nexport async function ensureKeyAsync<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => Promise<T>,\n): Promise<T> {\n let value = obj[key]\n if (value === undefined) {\n value = await createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\nexport function size(obj: any) {\n if (obj != null) {\n if (obj.size != null)\n return obj.size\n\n if (obj.length != null)\n return obj.length\n\n return Object.keys(obj).length\n }\n return 0\n}\n\nexport function last<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[array.length - 1] : undefined\n}\n\n// True for [], {}, \"\", Map(), Set() and all primitives\nexport function empty(value: any): boolean {\n try {\n if (value != null) {\n if (Array.isArray(value))\n return value.length <= 0\n else if (typeof value === 'string')\n return value.length <= 0\n else if (value?.size != null)\n return value.size <= 0\n else\n return Object.keys(value).length <= 0\n }\n }\n catch (err) {\n console.warn('Failed to check if empty for', value, err)\n }\n return true\n}\n\n// Also see common/data/deep.ts\nexport function cloneObject<T>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// Also see common/data/deep.ts\nexport function cloneJsonObject<T = Json>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export function cloneStructuredObject<T>(obj: T): T {\n// // Primitives are immutable anyway\n// if (Object(obj) !== obj) return obj\n\n// // https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n// // @ts-ignore\n// return typeof structuredClone !== \"undefined\"\n// ? // @ts-ignore\n// structuredClone(obj)\n// : // Rude but very efficient way to clone\n// JSON.parse(JSON.stringify(obj))\n// }\n\n/**\n * Cache result of a function. Same arguments have to always return the same result in order to get expected optimization!\n *\n * ```\n * const square = memoize((value) => value * value)`\n * square(2) // == 2\n * ```\n */\nexport function memoize<In, Out>(\n fn: (arg: In) => Out,\n): (arg: In) => Out {\n const cache = new Map<In, Out>()\n return (n: In): Out => {\n if (cache.has(n))\n return cache.get(n)!\n\n const result = fn(n)\n cache.set(n, result)\n return result\n }\n}\n\nexport function memoizeAsync<In extends any[], Out extends Promise<any>>(\n fn: (...arg: In) => Out,\n): (...arg: In) => Promise<Out> {\n const cache = new Map<string, Out>()\n return async (...n: In): Promise<Out> => {\n const key = jsonStringifySafe(n)\n if (cache.has(key))\n return cache.get(key)!\n\n const result = await fn(...n)\n cache.set(key, result)\n return result\n }\n}\n\n/** Repeat `count` times. Starts with `0` */\nexport function forTimes<T = undefined>(\n count: number,\n fn: (i: number, count: number) => T,\n): T[] {\n const result = []\n for (let i = 0; i < count; i++)\n result.push(fn(i, count))\n\n return result\n}\n","/* eslint-disable no-cond-assign */\n\nimport { Logger } from '../log'\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/gm\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w[\\w\\d_]+)>|\\((?!\\?(:|\\!|=|<=|<\\!))/gm\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nconst log = Logger('zeed:xrx', 'error')\n\nexport function regExpString(rx: string | RegExp): string {\n return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n return str.replace(/[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n lookBehind\n namedGroups: Record<string, number> = {}\n names: string[] = []\n rx: RegExp\n\n constructor(pattern: string | RegExp, flags?: string) {\n let _flags: string = flags ?? ''\n let _rx: string\n\n if (pattern instanceof RegExp) {\n if (flags == null)\n _flags = pattern.flags\n\n _rx = pattern.source\n }\n else {\n _rx = pattern\n }\n\n // eXtended / Ignore Whitespace\n const extended = _flags && _flags.includes('x')\n if (extended) {\n _flags = _flags.replace('x', '')\n _rx = _rx.replace(RX_WHITESPACE, (r) => {\n // log('rp', r)\n return r[0] === '\\\\' ? r : ''\n })\n }\n\n // Named Groups\n if (!(pattern instanceof RegExp)) {\n let index = 0\n _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n // log('>>>', name)\n index += 1\n if (name) {\n if (\n name !== 'index'\n && name !== 'length'\n && !this.namedGroups[name]\n )\n this.namedGroups[name] = index\n else\n log.error(`Unallowed or duplicate group name: ${name}`)\n\n return '('\n }\n return str\n })\n this.names = Object.keys(this.namedGroups)\n }\n\n // http://www.rexegg.com/regex-best-trick.html\n\n _rx = regExpString(_rx)\n RX_LOOK_BEHIND.lastIndex = 0\n const parts = RX_LOOK_BEHIND.exec(_rx)\n if (parts) {\n this.lookBehind = {\n rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n expect: parts ? parts[2] === '=' : !parts,\n }\n _rx = _rx.substr(parts[0].length)\n }\n\n this.rx = new RegExp(_rx, _flags)\n }\n\n // flagsString() {\n // let hash = this.rx.toString() + '/'\n // if (this.rx.global) {\n // hash += 'g'\n // }\n // if (this.rx.multiline) {\n // hash += 'm'\n // }\n // if (this.rx.ignoreCase) {\n // hash += 'i'\n // }\n // if (this.rx.unicode) {\n // hash += 'u'\n // }\n // if (this.rx.sticky) {\n // hash += 'y'\n // }\n // }\n\n get lastIndex(): number {\n return this.rx.lastIndex\n }\n\n set lastIndex(index: number) {\n this.rx.lastIndex = index\n }\n\n _handleMatch(m: any) {\n if (this.lookBehind) {\n const leftContext = m.input.slice(0, m.index)\n if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n return null\n }\n for (const name of this.names)\n m[name] = m[this.namedGroups[name]]\n\n return m\n }\n\n exec(str: string) {\n let m\n while ((m = this.rx.exec(str))) {\n if (this.rx.lastIndex === m.index)\n this.rx.lastIndex++\n m = this._handleMatch(m)\n if (m != null)\n return m\n }\n }\n\n execAll(str: string) {\n const matches = []\n let m\n this.rx.lastIndex = 0\n while ((m = this.exec(str)))\n matches.push(m)\n\n this.rx.lastIndex = 0\n // log('execAll:', matches)\n return matches\n }\n\n replace(str: string, replacement: string | Function) {\n const fn = typeof replacement === 'function' ? replacement : () => replacement\n return str.replace(this.rx, (m) => {\n // m = this._handleMatch(m)\n return fn(m)\n })\n }\n}\n","import { escapeRegExp, isArray, isBoolean, isRecord, jsonStringifySafe } from './data'\n\nconst defaultSeparator = ','\n\nexport function csvStringify(data: any[], opt: {\n // header?: string[]\n separator?: string\n} = {}): string {\n const { separator = defaultSeparator } = opt\n let body = ''\n\n // Append the header row to the response if requested\n // if (header)\n // body = `${header.join(separator)}\\n`\n\n // Convert the data to a CSV-like structure\n for (let i = 0; i < data.length; i++) {\n body += `${data[i].map((field: string) => {\n if (field == null || field === '')\n return ''\n if (isBoolean(field))\n return field ? 1 : 0\n let s = String(field)\n if (isRecord(field) || isArray(field))\n s = jsonStringifySafe(field)\n if (s.includes('\"') || s.includes('\\n') || s.includes(separator))\n return `\"${s.replace(/\"/g, '\"\"')}\"`\n return s\n }).join(separator)}\\n`\n }\n\n return body\n}\n\nexport function csvParse(raw: string, opt: {\n separator?: string\n} = {}) {\n // https://regex101.com/r/BCpKyV/1\n let rxOneValueWithSeparator = /(\"((?:(?:[^\"]*?)(?:\"\")?)*)\"|([^,;\\t\\n]*))([,;\\t]|\\n|\\r\\n)/g\n if (opt.separator)\n rxOneValueWithSeparator = new RegExp(rxOneValueWithSeparator.source.replaceAll(',;\\\\t', escapeRegExp(opt.separator)), rxOneValueWithSeparator.flags)\n\n const lines: any[][] = []\n let row: any[] = []\n let m: any\n const text = `${raw.replaceAll('\\r\\n', '\\n').trim()}\\n`\n\n // eslint-disable-next-line no-cond-assign\n while (m = rxOneValueWithSeparator.exec(text)) {\n let value = m[2] ?? m[3] ?? ''\n value = value.replaceAll('\"\"', '\"')\n row.push(value)\n if (m[4] === '\\n') {\n lines.push(row)\n row = []\n }\n }\n return lines\n}\n\nexport function csvParseToObjects(raw: string, opt: {\n separator?: string\n} = {}) {\n const lines = csvParse(raw, opt)\n const header = lines[0]\n return lines.slice(1).map(l =>\n Object.fromEntries (l.map((v, i) => [header[i], v])),\n )\n}\n","import { isString } from './data'\nimport { arrayFilterInPlace } from './data/array'\nimport { isPromise, promisify } from './exec/promise'\nimport { Logger } from './log'\nimport type { LoggerInterface } from './log-base'\n\nconst logDispose = Logger('zeed:dispose')\n\n// https://blog.hediet.de/post/the_disposable_pattern_in_typescript\n\nexport type DisposerFunction = () => any | Promise<any>\n\nexport type Disposer =\n | DisposerFunction\n | {\n dispose?: Function | Promise<unknown>\n cleanup?: Function | Promise<unknown> // deprecated, but used often in my old code\n }\n\nexport interface Disposable {\n dispose: UseDispose\n}\n\n/** Different kinds of implementations have grown, this should unify them */\nasync function callDisposer(disposable: Disposer): Promise<void> {\n if (typeof disposable === 'function')\n await promisify(disposable())\n\n else if (isPromise(disposable))\n await disposable\n\n else if (typeof disposable.dispose === 'function')\n await promisify(disposable.dispose())\n\n else if (isPromise(disposable.dispose))\n await disposable.dispose\n\n else if (typeof disposable.cleanup === 'function')\n await promisify(disposable.cleanup())\n\n else if (isPromise(disposable.cleanup))\n await disposable.cleanup\n}\n\n// export function disposeFn()\n\ninterface UseDisposeConfig {\n name?: string\n log?: LoggerInterface\n}\n\nexport function useDispose(config?: string | UseDisposeConfig | LoggerInterface) {\n let opt = config as any\n if (opt != null) {\n if (isString(opt))\n opt = { name: opt }\n else if ('debug' in opt && 'label' in opt)\n opt = { name: opt.label, log: opt }\n }\n\n const name = opt?.name\n const log = opt?.log ?? logDispose\n const tracked: Disposer[] = []\n\n const untrack = async (disposable: Disposer): Promise<void> => {\n if (disposable != null && tracked.includes(disposable)) {\n arrayFilterInPlace(tracked, el => el !== disposable)\n await callDisposer(disposable)\n }\n }\n\n /** Dispose all tracked entries */\n const dispose = async (): Promise<void> => {\n if (name)\n log.debug(`dispose \"${name}\": ${tracked.length} entries`)\n while (tracked.length > 0)\n await untrack(tracked[0]) // LIFO\n }\n\n const track = (obj?: Disposer): DisposerFunction | undefined => {\n if (obj == null)\n return\n tracked.unshift(obj) // LIFO\n return () => untrack(obj)\n }\n\n return Object.assign(dispose, {\n track,\n add: track, // ?\n untrack, // ?\n dispose,\n exec: dispose, // ?\n getSize() {\n return tracked.length\n },\n isDisposed() {\n return tracked.length <= 0\n },\n })\n}\n\nexport type UseDispose = ReturnType<typeof useDispose>\n\n/** @deprecated use `useDispose` instead */\nexport const useDisposer = useDispose\n\nexport function useDefer(\n config: {\n mode?: 'lifo' | 'fifo'\n } = {},\n) {\n const { mode = 'fifo' } = config\n const steps: Disposer[] = []\n\n /**\n * Excutes all steps. If all steps are not Promises, they are executed immediately,\n * otherwise a Promise is returned\n */\n const exec = async (expectSync = false) => {\n while (steps.length > 0) {\n const step = steps[0]\n arrayFilterInPlace(steps, el => el !== step)\n if (typeof step === 'function') {\n const result = step()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else if (isPromise(step)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await step\n }\n else {\n throw new Error(`Unhandled disposable: ${step}`)\n }\n }\n }\n\n const add = (obj: Disposer) => {\n if (mode === 'lifo')\n steps.unshift(obj)\n\n else\n steps.push(obj)\n }\n\n return Object.assign(exec, {\n add,\n exec,\n getSize() {\n return steps.length\n },\n })\n}\n\nexport type UseDefer = ReturnType<typeof useDefer>\n\nexport function useTimeout(\n fn: Function,\n timeout = 0,\n): DisposerFunction {\n let timeoutHandle: any = setTimeout(fn, timeout)\n return () => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle)\n timeoutHandle = undefined\n }\n }\n}\n\nexport function useInterval(fn: Function, interval: number): DisposerFunction {\n let intervalHandle: any = setInterval(fn, interval)\n return () => {\n if (intervalHandle) {\n clearInterval(intervalHandle)\n intervalHandle = undefined\n }\n }\n}\n\nexport function useEventListener(\n emitter: any,\n eventName: string,\n fn: (ev?: any) => void,\n ...args: any[]\n): DisposerFunction {\n if (emitter == null)\n return () => {}\n\n if (emitter.on)\n emitter.on(eventName, fn, ...args)\n\n else if (emitter.addEventListener)\n emitter.addEventListener(eventName, fn, ...args)\n\n return () => {\n if (emitter.off)\n emitter.off(eventName, fn, ...args)\n\n else if (emitter.removeEventListener)\n emitter.removeEventListener(eventName, fn, ...args)\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { isPromise } from './promise'\n\nexport type Mutex = (fn: Function, elseFn?: Function) => boolean\nexport type AsyncMutex = (fn: Function, elseFn?: Function) => Promise<boolean>\n\nexport function useMutex(): Mutex {\n let token = true\n return (fn, elseFn) => {\n let executed = false\n if (token) {\n token = false\n try {\n fn()\n executed = true\n }\n finally {\n token = true\n }\n }\n else if (elseFn !== undefined) {\n elseFn()\n }\n return executed\n }\n}\n\nexport function useAsyncMutex(): AsyncMutex {\n let token = true\n return async (fn, elseFn) => {\n let executed = false\n if (token) {\n token = false\n try {\n const result = fn()\n if (isPromise(result))\n await result\n executed = true\n }\n finally {\n token = true\n }\n }\n else if (elseFn !== undefined) {\n const result = elseFn()\n if (isPromise(result))\n await result\n }\n return executed\n }\n}\n\n// export type Lock = ({lock: () => Promise<void>, unlock: () => void})\n\n// export function createLock() {\n// let lockCtr = []\n// return {\n// lock() {\n\n// },\n// unlock() {\n\n// }\n// }\n// }\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getSecureRandomIfPossible } from '../data/math'\nimport type { Disposable, DisposerFunction } from '../dispose-defer'\nimport { useDispose } from '../dispose-defer'\nimport { getGlobalContext } from '../global'\nimport { Logger } from '../log'\nimport { promisify } from '../exec/promise'\n\nconst log = Logger('zeed:emitter', 'error')\n\nexport type EmitterHandler = (...objs: any[]) => void\nexport type EmitterAllHandler<T = string> = (key: T, ...objs: any[]) => void\n\n// For magic see https://www.npmjs.com/package/tiny-typed-emitter / License MIT\n// https://stackoverflow.com/a/61609010/140927\n// https://basarat.gitbook.io/typescript/main-1/typed-event\n// https://github.com/andywer/typed-emitter#extending-an-emitter\n\n// TODO: Allow symbols? https://github.com/sindresorhus/emittery\n\nexport declare type ListenerSignature<L> = {\n [E in keyof L]: (...args: any[]) => any\n}\n\nexport declare interface DefaultListener {\n [k: string]: (...args: any[]) => any\n}\n\nexport class Emitter<\n RemoteListener extends ListenerSignature<RemoteListener> = DefaultListener,\n LocalListener extends ListenerSignature<LocalListener> = RemoteListener,\n> implements Disposable {\n subscribers: any = {}\n subscribersOnAny: any[] = []\n\n /** Unused, but here for historical reasons */\n dispose = useDispose()\n\n call: RemoteListener = new Proxy<RemoteListener>({} as any, {\n get:\n (target: any, name: any) =>\n async (...args: any): Promise<boolean> =>\n await this.emit(name, ...args),\n })\n\n public async emit<U extends keyof RemoteListener>(\n event: U,\n ...args: Parameters<RemoteListener[U]>\n ): Promise<boolean> {\n let ok = false\n\n try {\n const subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n // log.debug(\"emit\", this?.constructor?.name, event, ...args, subscribers)\n\n this.subscribersOnAny.forEach(fn => fn(event, ...args))\n\n if (subscribers.length > 0) {\n const all = subscribers.map((fn) => {\n try {\n return promisify(fn(...args))\n }\n catch (err) {\n log.warn('emit warning:', err)\n }\n return null\n }).filter(fn => fn != null)\n ok = true\n await Promise.all(all)\n }\n }\n catch (err) {\n log.error('emit exception', err)\n }\n return ok\n }\n\n public onAny(fn: EmitterHandler) {\n this.subscribersOnAny.push(fn)\n }\n\n public on<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): DisposerFunction {\n const subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n subscribers.push(listener)\n this.subscribers[event] = subscribers\n return () => {\n this.off(event, listener)\n }\n }\n\n public onCall(handlers: Partial<LocalListener>) {\n for (const [name, handler] of Object.entries(handlers))\n this.on(name as any, handler as any)\n }\n\n public once<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): DisposerFunction {\n const onceListener = async (...args: any[]) => {\n this.off(event, onceListener as any)\n return await promisify(listener(...args))\n }\n this.on(event, onceListener as any)\n return () => {\n this.off(event, listener)\n }\n }\n\n public off<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): this {\n // log(\"off\", key)\n this.subscribers[event] = (this.subscribers[event] || []).filter(\n (f: any) => listener && f !== listener,\n )\n return this\n }\n\n public removeAllListeners(): this {\n this.subscribers = {}\n return this\n }\n}\n\ndeclare global {\n interface ZeedGlobalContext {\n emitter?: Emitter\n }\n\n interface ZeedGlobalEmitter {}\n}\n\n/** Global emitter that will listen even across modules */\nexport function getGlobalEmitter(): Emitter<ZeedGlobalEmitter> {\n let emitter = getGlobalContext().emitter\n if (!emitter) {\n emitter = new Emitter()\n getGlobalContext().emitter = emitter\n }\n return emitter as any\n}\n\n// This can be used as a global messaging port to connect loose\n// parts of your app\nexport const messages = new Emitter()\n\n// For debugging\n\ninterface LazyEvent {\n key: string\n obj: any\n}\n\nexport function lazyListener(\n emitter: any,\n listenerKey?: string,\n): (key?: string, skipUnmatched?: boolean) => Promise<any> {\n const name = Math.round(getSecureRandomIfPossible() * 100)\n\n const events: LazyEvent[] = []\n let lazyResolve: (() => void) | undefined\n\n const incoming = (key: string, obj: any) => {\n const ev = { key, obj }\n // debug(name, \" lazy push\", ev)\n events.push(ev)\n lazyResolve && lazyResolve()\n }\n\n if (listenerKey) {\n if (emitter.on) {\n emitter.on(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n }\n else if (emitter.addEventListener) {\n emitter.addEventListener(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n }\n else {\n log.error(name, 'Cannot listen to key')\n }\n }\n else {\n if (emitter.onAny) {\n emitter.onAny((key: string, obj: any) => {\n incoming(key, obj)\n })\n }\n else {\n log.error(name, 'cannot listen to all for', emitter)\n }\n }\n\n const on = (key?: string, skipUnmatched = true): Promise<any> => {\n return new Promise((resolve, reject) => {\n if (!key) {\n key = listenerKey\n if (!key) {\n if (events.length) {\n // no key specified? just take the first one!\n key = events[0].key\n }\n }\n }\n // debug(name, \"lazy resolve on2\", key, skipUnmatched, events)\n lazyResolve = () => {\n // debug(name, \"lazy resolve\", key, listenerKey, events)\n while (events.length > 0) {\n const ev = <LazyEvent>events.shift()\n // debug(name, \" lazy analyze\", ev)\n if (ev.key === key) {\n lazyResolve = undefined\n resolve(ev.obj)\n }\n else {\n if (skipUnmatched) {\n log.warn(name, `Unhandled event ${key} with value: ${ev.obj}`)\n continue\n }\n reject(new Error(`Expected ${key}, but found ${ev.key} with value=${ev.obj}`))\n log.error(name, `Unhandled event ${key} with value: ${ev.obj}`)\n }\n break\n }\n }\n lazyResolve()\n })\n }\n\n return on\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/**\n * @returns Timestamp in miliseconds\n */\nexport const getTimestamp = (): number => Date.now()\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)}s` : `${ms.toFixed(2)}ms`\n}\n\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { randomUint8Array } from './crypto'\nimport { fromHex, toHex } from './data'\nimport { useBase } from './data/basex'\nimport { getTimestamp } from './time'\n\nconst { encode: encode62, decode: decode62 } = useBase(62)\nconst { encode: encode32, decode: decode32 } = useBase(32)\n\n// 128 bit UUID\n\nconst uuidBytesLength = 16\n\nexport function uuidBytes(): Uint8Array {\n return randomUint8Array(uuidBytesLength)\n}\n\n// Base62\n\nexport function uuidB62(bytes = uuidBytes()): string {\n return encode62(bytes, 22)\n}\n\nexport function uuidEncodeB62(bytes: Uint8Array): string {\n return encode62(bytes, 22)\n}\n\nexport function uuidDecodeB62(uuid: string): Uint8Array {\n return decode62(uuid, uuidBytesLength)\n}\n\n// Base32\n\nexport function uuidB32(bytes = uuidBytes()): string {\n return encode32(bytes, 26)\n}\n\nexport function uuidEncodeB32(bytes: Uint8Array): string {\n return encode32(bytes, 26)\n}\n\nexport function uuidDecodeB32(uuid: string): Uint8Array {\n return decode32(uuid, uuidBytesLength)\n}\n\n// UUIDv4\n\n// https://stackoverflow.com/a/2117523/140927\nconst pattern = '10000000-1000-4000-8000-100000000000' // String([1e7] + -1e3 + -4e3 + -8e3 + -1e11)\n\nexport const uuidv4 = (typeof crypto !== 'undefined' && crypto.randomUUID != null)\n ? crypto.randomUUID.bind(crypto) // native!\n : () => pattern.replace(/[018]/g, (c: any) => (c ^ (randomUint8Array(1)[0] & (15 >> (c / 4)))).toString(16))\n\nexport function uuidEncodeV4(bytes: Uint8Array): string {\n const id = toHex(bytes)\n return `${id.slice(0, 8)}-${id.slice(8, 12)}-${id.slice(12, 16)}-${id.slice(16)}` // 10000000 - 1000 - 4000 - 8000 - 100000000000\n}\n\nexport function uuidDecodeV4(uuid: string): Uint8Array {\n return fromHex(uuid.replaceAll('-', ''))\n}\n\n// Sortable UID\n\n// https://github.com/segmentio/ksuid\n// https://pkg.go.dev/github.com/rsms/go-uuid\n\n/**\n * Sortable unique ID\n * Inspired by https://github.com/rsms/go-uuid\n *\n * Bytes 0-5: Current time in miliseconds from 2021-06-01T00:00:00Z\n * Bytes 6-15: Random\n */\n\n// 1622505600000 // new Date('2021-06-01T00:00:00Z').getTime()\nconst ReferenceDateInMS = 1600000000000\n\n// 6 bytes will stay valid until end of time: new Date(1622505600000 + 0xffffffffffff) === Date Sun Jan 01 10941 06:31:50 GMT+0100 (Central European Standard Time)\n\nfunction longToByteArray(long: number) {\n const byteArray = new Uint8Array([0, 0, 0, 0, 0, 0])\n const bytes = byteArray.length - 1\n for (let index = 0; index < byteArray.length; index++) {\n const byte = long & 0xFF\n byteArray[bytes - index] = byte\n long = (long - byte) / 256\n }\n return byteArray\n}\n\n// function byteArrayToLong(byteArray: number[]): number {\n// var value = 0\n// for (var i = byteArray.length - 1; i >= 0; i--) {\n// value = value * 256 + byteArray[i]\n// }\n// return value\n// }\n\nexport function suidBytes(): Uint8Array {\n const ms = getTimestamp() - ReferenceDateInMS\n return new Uint8Array([...longToByteArray(ms), ...randomUint8Array(10)])\n}\n\nexport function suid(): string {\n return uuidEncode(suidBytes())\n}\n\nexport function suidDate(id: string): Date {\n return suidBytesDate(uuidDecode(id))\n}\n\nexport function suidBytesDate(id: Uint8Array): Date {\n return new Date(\n ReferenceDateInMS + id.slice(0, 6).reduce((acc, byte) => acc * 256 + byte, 0),\n )\n}\n\n// 32 bit UUID\n\nexport const uuid32bit = () => new Uint32Array(randomUint8Array(4))[0]\n\n// Global Settings\n\nconst mapModes = {\n base62: {\n uuid: uuidB62,\n uuidDecode: uuidDecodeB62,\n uuidEncode: uuidEncodeB62,\n },\n base32: {\n uuid: uuidB32,\n uuidDecode: uuidDecodeB32,\n uuidEncode: uuidEncodeB32,\n },\n uuidv4: {\n uuid: uuidv4,\n uuidDecode: uuidDecodeV4,\n uuidEncode: uuidEncodeV4,\n },\n}\n\nlet _mode: keyof typeof mapModes = 'base62'\nlet _sorted = false\n\nexport function setUuidDefaultEncoding(mode: keyof typeof mapModes, sorted = false) {\n _mode = mode\n _sorted = sorted\n}\n\nexport function uuid(): string {\n return mapModes[_mode].uuid(_sorted ? suidBytes() : uuidBytes())\n}\n\nexport function uuidDecode(uuid: string): Uint8Array {\n return mapModes[_mode].uuidDecode(uuid)\n}\n\nexport function uuidEncode(bytes: Uint8Array): string {\n return mapModes[_mode].uuidEncode(bytes)\n}\n\nexport function uuidIsValid(uuid: string): boolean {\n try {\n const bin = uuidDecode(uuid)\n return bin.length === uuidBytesLength\n }\n catch (err) {\n // log.warn('Invalid ID:', uuid)\n }\n return false\n}\n\n// Simple Counters\n\nconst _unameCounters: Record<string, number> = {}\n\nexport function uname(name = 'id'): string {\n if (_unameCounters[name] == null)\n _unameCounters[name] = 0\n\n return `${name}-${_unameCounters[name]++}`\n}\n\nlet _qid = 0\n\nexport function qid(): string {\n return `id-${_qid++}`\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n// import { Logger } from \"../log\"\nimport { uuid } from '../uuid'\nimport { Emitter } from './emitter'\n\n// const log = Logger(\"zeed:channel\")\n\n/** See http://developer.mozilla.org/en-US/docs/Web/API/MessageEvent */\nexport interface ChannelMessageEvent {\n data: any\n origin?: string\n lastEventId?: string\n}\n\n/**\n * Inspired by\n * http://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel\n * https://deno.com/deploy/docs/runtime-broadcast-channel\n * */\nexport abstract class Channel extends Emitter<{\n message(event: ChannelMessageEvent): void\n messageerror(event: ChannelMessageEvent): void // optional\n connect(): void // optional\n disconnect(): void // optional\n close(): void\n}> {\n id: string = uuid()\n abstract isConnected?: boolean\n abstract postMessage(data: any): void\n close() {\n void this.dispose()\n }\n}\n\n/** Very basic channel demonstrating local communication */\nexport class LocalChannel extends Channel {\n isConnected = true\n\n other?: LocalChannel\n\n postMessage(data: any) {\n void this.other?.emit('message', {\n data, // : cloneObject(data),\n origin: 'local',\n lastEventId: uuid(),\n })\n }\n}\n\nexport function createLocalChannelPair(): [LocalChannel, LocalChannel] {\n const w1 = new LocalChannel()\n const w2 = new LocalChannel()\n\n w1.other = w2\n w2.other = w1\n\n return [w1, w2]\n}\n","import { decrypt, encrypt } from '../crypto'\nimport { Uint8ArrayToJson, jsonToUint8Array } from '../data/bin'\n\nexport interface Encoder {\n encode(data: any): Promise<Uint8Array>\n decode(data: Uint8Array): Promise<any>\n}\n\nexport class NoopEncoder implements Encoder {\n async encode(data: any): Promise<Uint8Array> {\n return data\n }\n\n async decode(data: Uint8Array): Promise<any> {\n return data\n }\n}\n\nexport class JsonEncoder implements Encoder {\n async encode(data: any): Promise<Uint8Array> {\n return jsonToUint8Array(data)\n }\n\n async decode(data: Uint8Array): Promise<any> {\n return Uint8ArrayToJson(data)\n }\n}\n\nexport class CryptoEncoder implements Encoder {\n key: CryptoKey\n\n constructor(key: CryptoKey) {\n this.key = key\n }\n\n async encode(data: any): Promise<Uint8Array> {\n const plain = jsonToUint8Array(data)\n return await encrypt(plain, this.key)\n }\n\n async decode(data: Uint8Array): Promise<any> {\n const plain = await decrypt(data, this.key)\n return Uint8ArrayToJson(plain)\n }\n}\n","import { valueToString } from '../data/convert'\nimport { isPromise, tryTimeout } from '../exec/promise'\nimport { Logger } from '../log'\nimport type { LogLevelAliasType } from '../log-base'\nimport type { Json } from '../types'\nimport { uname, uuid } from '../uuid'\nimport type { Channel } from './channel'\nimport type { Encoder } from './encoder'\nimport { JsonEncoder } from './encoder'\n\nexport interface MessageAction {\n name: string\n id: string\n args?: Json[]\n}\n\nexport interface MessageResult {\n id: string\n result?: Json\n error?: { stack?: string; name: string; message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport interface MessagesOptions {\n timeout?: number\n}\n\nexport interface MessagesDefaultMethods<L> {\n dispose(): void\n connect?(channel: Channel): void\n options(opt: MessagesOptions): L\n}\n\nexport type MessagesMethods<L> = L & MessagesDefaultMethods<L>\n\n// export type MessageDefinitions = {\n// [key: string]: (...args: any) => Promise<any>\n// }\n\nexport type MessageDefinitions = Record<any, (...args: any) => Promise<any>>\n\nexport interface MessageHub {\n dispose(): void\n connect: (newChannel: Channel) => void\n listen<L extends MessageDefinitions>(newHandlers: L): void\n send<L extends MessageDefinitions>(): MessagesMethods<L>\n}\n\n// The async proxy, waiting for a response\nexport const createPromiseProxy = <P extends object>(\n fn: (name: string, args: any[], opt: any) => Promise<unknown>,\n opt: MessagesOptions,\n predefinedMethods: any = {},\n): P =>\n new Proxy<P>(predefinedMethods, {\n get: (target: any, name: any) => {\n if (name in target)\n return target[name]\n return (...args: any): any => fn(name, args, opt)\n },\n })\n\n/**\n * RPC\n *\n * Features:\n * - Waits for connection\n * - Retries after fail\n * - Timeouts\n */\nexport function useMessageHub(\n opt: {\n name?: string\n channel?: Channel\n encoder?: Encoder\n retryAfter?: number\n ignoreUnhandled?: boolean\n debug?: boolean\n logLevel?: LogLevelAliasType\n } = {},\n): MessageHub {\n const {\n name = uname('hub'),\n encoder = new JsonEncoder(),\n retryAfter = 1000,\n ignoreUnhandled = true,\n logLevel = false,\n } = opt\n\n const log = Logger(name, logLevel)\n\n const handlers = {}\n let channel: Channel | undefined\n const queue: Message[] = []\n let queueRetryTimer: any\n const waitingForResponse: Record<string, [Function, Function]> = {}\n\n const dispose = () => {\n clearTimeout(queueRetryTimer)\n }\n\n const postNext = async () => {\n clearTimeout(queueRetryTimer)\n if (channel) {\n if (channel.isConnected) {\n while (queue.length) {\n const message = queue[0]\n try {\n channel.postMessage(await encoder.encode(message))\n queue.shift() // remove from queue when done\n }\n catch (err) {\n log.warn('postMessage', err)\n break\n }\n }\n }\n if (queue.length > 0 && retryAfter > 0)\n queueRetryTimer = setTimeout(postNext, retryAfter)\n }\n }\n\n const postMessage = async (message: Message) => {\n log('enqueue postMessage', message)\n queue.push(message)\n await postNext()\n }\n\n const connect = async (newChannel: Channel) => {\n channel = newChannel\n channel.on('connect', postNext)\n channel.on('message', async (msg: any) => {\n log('onmessage', typeof msg)\n const { name, args, id, result, error } = await encoder.decode(msg.data)\n\n // Incoming new message\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-expect-error xxx\n if (handlers[name] == null)\n throw new Error(`handler for ${name} was not found`)\n\n // @ts-expect-error xxx\n let result = handlers[name](...args)\n if (isPromise(result))\n result = await result\n log(`result ${result}`)\n if (id)\n await postMessage({ id, result })\n }\n catch (error) {\n const err\n = error instanceof Error ? error : new Error(valueToString(error))\n log.warn('execution error', err.name)\n await postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n\n // Incoming new response\n else if (id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n if (waitingForResponse[id] == null) {\n if (result === undefined)\n log(`skip response for ${id}`)\n else\n log.warn(`no response hook for ${id}`)\n }\n else {\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n const err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log.warn('reject', err.name)\n reject(err)\n }\n else {\n log('resolve', result)\n resolve(result)\n }\n }\n }\n }\n\n // Don't know what to do with it\n else if (!ignoreUnhandled) {\n log.warn('Unhandled message', msg)\n }\n })\n\n await postNext()\n }\n\n const fetchMessage = async (\n name: string,\n args: any[],\n opt: MessagesOptions = {},\n ): Promise<unknown> => {\n const { timeout = 5000 } = opt\n const id = uuid()\n await postMessage({\n name,\n args,\n id,\n })\n return tryTimeout(\n new Promise(\n (resolve, reject) => (waitingForResponse[id] = [resolve, reject]),\n ),\n timeout,\n )\n }\n\n if (opt.channel)\n void connect(opt.channel) // todo async\n\n return {\n dispose,\n connect,\n listen<L extends object>(newHandlers: L) {\n Object.assign(handlers, newHandlers)\n },\n send<L extends object>() {\n // The regular proxy without responding, just send\n return createPromiseProxy<L>(fetchMessage, {}, {\n options(perCallopt: MessagesOptions) {\n return createPromiseProxy<L>(fetchMessage, { ...perCallopt })\n },\n } as MessagesDefaultMethods<L>) as MessagesMethods<L>\n },\n }\n}\n","import { Logger } from '../log'\nimport { uname } from '../uuid'\nimport type { Channel } from './channel'\nimport type { DefaultListener, ListenerSignature } from './emitter'\nimport { Emitter } from './emitter'\nimport type { Encoder } from './encoder'\nimport { JsonEncoder } from './encoder'\n\ninterface PubSubConfig {\n channel: Channel\n encoder?: Encoder\n name?: string\n debug?: boolean\n}\n\nexport class PubSub< L extends ListenerSignature<L> = DefaultListener> extends Emitter<L> {\n name: string\n channel: Channel\n encoder: Encoder\n log: any\n debug: boolean\n\n get shortId() {\n return this.name.substr(0, 6)\n }\n\n constructor(opt: PubSubConfig) {\n super()\n\n const { name, encoder = new JsonEncoder(), channel, debug = false } = opt\n\n this.channel = channel\n this.encoder = encoder\n this.debug = debug\n\n this.name = name ?? this.channel.id ?? uname('pubsub')\n this.log = Logger(`${this.shortId}`)\n\n if (this.debug) {\n this.channel.on('connect', () => {\n this.log('channel connected')\n })\n this.channel.on('disconnect', () => {\n this.log('channel disconnected')\n })\n }\n\n this.channel.on('message', async ({ data }) => {\n const info = await this.encoder.decode(data)\n if (this.debug)\n this.log(`channel message, event=${info?.event}, info=`, info)\n else this.log(`channel message, event=${info?.event}`)\n if (info) {\n const { event, args } = info\n await this.emitSuper(event, ...args)\n }\n })\n }\n\n private async emitSuper<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n return await super.emit(event, ...args)\n }\n\n async emit<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n try {\n if (this.debug)\n this.log(`emit(${String(event)})`, event)\n else this.log(`emit(${String(event)})`, args.length)\n if (!this.channel.isConnected) {\n this.log.warn('channel not connected')\n return false\n }\n const data = await this.encoder.encode({ event, args })\n this.channel.postMessage(data)\n return true\n }\n catch (err) {\n this.log.warn(`emit(${String(event)})`, err)\n }\n return false\n }\n\n publish = this.emit.bind(this)\n subscribe = this.on.bind(this)\n}\n\nexport function usePubSub<L extends ListenerSignature<L> = DefaultListener>(\n opt: PubSubConfig,\n) {\n return new PubSub<L>(opt)\n}\n","// From https://github.com/antfu/birpc/blob/main/src/index.ts MIT\n\nexport type ArgumentsType<T> = T extends (...args: infer A) => any ? A : never\nexport type ReturnType<T> = T extends (...args: any) => infer R ? R : never\n\nexport interface RPCOptions<Remote> {\n /** No return values expected */\n onlyEvents?: boolean\n /** Names of remote functions that do not need response. */\n eventNames?: (keyof Remote)[]\n /** Function to post raw message */\n post: (data: any) => void\n /** Listener to receive raw message */\n on: (fn: (data: any) => void) => void\n /** Custom function to serialize data */\n serialize?: (data: any) => any\n /** Custom function to deserialize data */\n deserialize?: (data: any) => any\n}\n\nexport interface RPCFn<T> {\n /** Call the remote function and wait for the result. */\n (...args: ArgumentsType<T>): Promise<Awaited<ReturnType<T>>>\n /** Send event without asking for response */\n asEvent(...args: ArgumentsType<T>): void\n}\n\nexport type RPCReturn<RemoteFunctions> = {\n [K in keyof RemoteFunctions]: RPCFn<RemoteFunctions[K]>\n}\n\nlet rpcCounter = 1\n\nenum RPCMode {\n request = 1,\n event = 2,\n resolve = 3,\n reject = 4,\n}\n\ntype RPCMessage = [\n RPCMode,\n any, // args\n number | undefined | null, // id\n string | undefined | null, // method\n]\n\nconst defaultSerialize = (i: any) => i\nconst defaultDeserialize = defaultSerialize\n\nexport function useRPC<RemoteFunctions = {}, LocalFunctions = {}>(\n functions: LocalFunctions,\n options: RPCOptions<RemoteFunctions>,\n): RPCReturn<RemoteFunctions> {\n const {\n post,\n on,\n eventNames = [],\n serialize = defaultSerialize,\n deserialize = defaultDeserialize,\n } = options\n\n const rpcPromiseMap = new Map<\n number,\n { resolve: (...args: any) => any; reject: (...args: any) => any }\n >()\n\n on(async (data) => {\n const msg = deserialize(data) as RPCMessage\n const [mode, args, id, method] = msg\n if (mode === RPCMode.request || mode === RPCMode.event) {\n let result, error: any\n if (method != null) {\n try {\n const fn = (functions as any)[method] // todo\n result = await fn(...args)\n }\n catch (e) {\n error = String(e)\n }\n }\n else {\n error = 'Method implementation missing'\n }\n if (mode === RPCMode.request && id) {\n if (error)\n post(serialize([RPCMode.reject, error, id]))\n else\n post(serialize([RPCMode.resolve, result, id]))\n }\n }\n else if (id) {\n const promise = rpcPromiseMap.get(id)\n if (promise != null) {\n if (mode === RPCMode.reject)\n promise.reject(args)\n else promise.resolve(args)\n }\n rpcPromiseMap.delete(id)\n }\n })\n\n return new Proxy(\n {},\n {\n get(_, method) {\n const sendEvent = (...args: any[]) => {\n post(serialize([RPCMode.event, args, null, method]))\n }\n if (options.onlyEvents || eventNames.includes(method as any)) {\n sendEvent.asEvent = sendEvent\n return sendEvent\n }\n const sendCall = (...args: any[]) => {\n return new Promise((resolve, reject) => {\n const id = rpcCounter++\n rpcPromiseMap.set(id, { resolve, reject })\n post(serialize([RPCMode.request, args, id, method]))\n })\n }\n sendCall.asEvent = sendEvent\n return sendCall\n },\n },\n ) as any\n}\n","// Inspired by https://developer.apple.com/documentation/foundation/progress\n\nimport { arrayRemoveElement } from '../data'\nimport { Emitter } from '../msg'\nimport { uname } from '../uuid'\n\ninterface ProgressOptions {\n totalUnits?: number\n completeUnits?: number\n resetWhenFinished?: boolean\n name?: string\n}\n\n/**\n * Progress helper with these properties:\n *\n * - `totalUnits` and `completedUnits` for progress\n * - Can be cancelled\n * - Sends events on cancel, changed and dispose\n * - Supports children and propagates values.\n * Total progress is sum of all units in the tree.\n * - On `dispose` child removes itself from parent.\n */\nexport class Progress extends Emitter<{\n progressCancelled(progress: Progress): void\n progressChanged(progress: Progress): void\n progressDispose(progress: Progress): void\n}> {\n private _totalUnits: number\n private _completedUnits: number\n private _isCancelled = false\n private _resetWhenFinished = true\n private _children: Progress[] = []\n\n name: string\n\n constructor(opt: ProgressOptions = {}) {\n super()\n\n this._totalUnits = opt.totalUnits ?? 0\n this._completedUnits = opt.completeUnits ?? 0\n this._resetWhenFinished = opt.resetWhenFinished ?? true\n this.name = opt.name ?? uname('progress')\n\n // Make sure to cleanup also children\n this.dispose.add(async () => {\n for (const child of this._children)\n await child.dispose()\n await this.emit('progressDispose', this)\n })\n }\n\n /** Notify others about changes and reset on completion, if flag is set. */\n private update() {\n void this.emit('progressChanged', this)\n\n if (this._isCancelled && this._resetWhenFinished) {\n if (this.getTotalUnits() <= this.getCompletedUnits())\n this.reset()\n }\n }\n\n /** Fresh start */\n reset() {\n if (this._isCancelled) {\n this._isCancelled = false\n for (const child of this._children)\n child.reset()\n this.update()\n }\n }\n\n /** Notify and mark as cancelled. May take some time before having an effect. */\n async cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true\n await this.emit('progressCancelled', this)\n for (const child of this._children)\n await child.cancel()\n this.update()\n }\n }\n\n /** Add child progress, which count into its parents units. On `dispose` it will auto remove itself from parent. */\n addChild(child: Progress) {\n child.on('progressDispose', () => this.removeChild(child))\n child.on('progressChanged', () => this.update())\n if (!this._children.includes(child))\n this._children.push(child)\n this.update()\n }\n\n /** Create child progress. */\n createChildProgress(opt?: ProgressOptions) {\n const progress = new Progress(opt)\n this.addChild(progress)\n return progress\n }\n\n removeChild(child: Progress) {\n arrayRemoveElement(this._children, child)\n this.update()\n }\n\n /** Total units including children */\n getTotalUnits(): number {\n if (this.isIndeterminate())\n return 0\n let units = this._totalUnits\n for (const child of this._children)\n units += child.getTotalUnits()\n return units\n }\n\n /** Completed units including children */\n getCompletedUnits(): number {\n if (this.isIndeterminate())\n return 0\n let units = this._completedUnits\n for (const child of this._children)\n units += child.getCompletedUnits()\n return units\n // return Math.min(this.getTotalUnits(), units)\n }\n\n /** Cannot calculate progress, because totalUnits are missing. Special representation in UI. */\n isIndeterminate(): boolean {\n return this._totalUnits <= 0 && this._children.length <= 0\n }\n\n isCancelled() {\n return this._isCancelled\n }\n\n /** Either disposed or all units completed. */\n isFinished() {\n return this.dispose.isDisposed() || (!this.isIndeterminate() && (this.getTotalUnits() <= this.getCompletedUnits()))\n }\n\n /** Value from 0 to 1, where 1 is 100% completeness. */\n getFraction() {\n if (this.isIndeterminate())\n return 0\n let value = this.getCompletedUnits() / this.getTotalUnits()\n if (isNaN(value))\n value = 0\n return Math.min(1, Math.max(0, value))\n }\n\n getChildrenCount() {\n return this._children.length\n }\n\n /** Change total units. */\n setTotalUnits(units: number, completedUnits?: number) {\n this._totalUnits = units\n if (completedUnits != null)\n this._completedUnits = completedUnits\n this.update()\n }\n\n /** Relatively change total units. */\n incTotalUnits(step = 1) {\n this._totalUnits += step\n this.update()\n }\n\n /** Set fixed number of completed units. */\n setCompletetedUnits(units: number) {\n this._completedUnits = units\n this.update()\n }\n\n /** Set to 100% without disposing. */\n setCompleted() {\n this._completedUnits = this._totalUnits\n this.update()\n }\n\n /** Dynamically change completed units. */\n incCompletedUnits(step = 1) {\n this._completedUnits += step\n this.update()\n }\n\n /** Progress tree to string for debuggin purposes. Consider using `name` attribute of Progress. */\n toString(indent = 0) {\n let s = `${' '.repeat(indent)}${this.name}: ${this._completedUnits} of ${this._totalUnits} units, ${Math.floor(this.getFraction() * 100)} %, cancel=${this._isCancelled}\\n`\n for (const child of this._children)\n s += child.toString(indent + 1)\n if (indent === 0)\n return s.trim()\n return s\n }\n}\n","import { useDispose } from '../dispose-defer'\nimport { Emitter } from '../msg/emitter'\nimport { uname, uuid } from '../uuid'\nimport { Progress } from './progress'\nimport { createPromise } from './promise'\n\nexport enum PoolTaskIdConflictResolution {\n /**\n * Tasks with same `id` are replaced. Newest wins.\n */\n replace,\n\n /**\n * Task with same `id` will continue to run. Reference is returned with option to cancel.\n * Named \"memoize\" because the result of the task should always be the same for the same `id`,\n * like e.g. a download.\n */\n memoize,\n\n /** Like memoize, but try to put on top of the list */\n prioritize,\n\n /**\n * Tasks with same `id` throw error\n */\n error,\n\n}\n\nexport interface PoolConfig {\n name?: string\n maxParallel?: number\n idConflictResolution?: PoolTaskIdConflictResolution\n}\n\nexport type PoolTaskFn<T = any> = (taskInfo: PoolTask<T>) => Promise<T>\n\nexport enum PoolTaskState {\n waiting,\n running,\n finished,\n}\n\n/** Task */\nexport interface PoolTask<T> {\n readonly id: string\n readonly task: PoolTaskFn<T>\n readonly done: Function\n readonly setMax: (max: number) => void\n readonly setResolved: (resolved: number) => void\n readonly incResolved: (inc?: number) => void\n state: PoolTaskState\n priority: number\n /** Same groups are executed only one at a time */\n group?: string\n\n progress: Progress\n max: number\n resolved: number\n\n result?: T\n payload?: unknown\n}\n\nexport interface PoolTaskEvents {\n didUpdate(\n max: number,\n resolved: number,\n presentMax: number,\n presentResolved: number\n ): void\n didStart(id: string): void\n didCancel(id: string): void\n didFinish(): void\n didResolve(id: string, value: any): void\n didReject(id: string, error: any): void\n}\n\n// todo: barrier\n// todo: dependents\n\nexport function usePool<T = any>(config: PoolConfig = {}) {\n const {\n maxParallel = 3,\n name = uname('pool'),\n idConflictResolution = PoolTaskIdConflictResolution.memoize,\n } = config\n\n const events = new Emitter<PoolTaskEvents>()\n\n const dispose = useDispose()\n dispose.add(cancelAll)\n\n const progress = new Progress({ name })\n\n progress.on('progressCancelled', cancelAll)\n\n let countMax = 0\n let countResolved = 0\n let currentParallel = 0\n let priority = 0\n const tasks: Record<string, PoolTask<T>> = {}\n\n // const [allFinishedPromise, allFinishedResolve] = createPromise()\n\n async function waitFinishAll() {\n if (countMax > 0) {\n const [promise, resolve] = createPromise()\n events.once('didFinish', resolve)\n return promise\n }\n }\n\n async function cleanupFinished() {\n for (const id of Object.keys(tasks)) {\n const task = tasks[id]\n if (task.state === PoolTaskState.finished) {\n await tasks[id].progress.dispose()\n delete tasks[id]\n }\n }\n }\n\n function didFinish() {\n void events.emit('didFinish')\n // allFinishedResolve(countMax)\n countMax = 0\n countResolved = 0\n void cleanupFinished()\n progress.reset()\n }\n\n function didUpdate() {\n let presentMax = 0\n let presentResolved = 0\n for (const { max, resolved, state } of Object.values(tasks)) {\n presentMax += max\n presentResolved += state === PoolTaskState.finished ? max : Math.min(max, resolved)\n }\n void events.emit(\n 'didUpdate',\n countMax,\n countResolved,\n presentMax,\n presentResolved,\n )\n }\n\n function performNext() {\n didUpdate()\n if (countMax > 0 && countMax === countResolved)\n didFinish()\n if (currentParallel >= maxParallel)\n return\n const waitingTasks = Object.values(tasks).filter(\n t => t.state === PoolTaskState.waiting,\n )\n if (waitingTasks.length > 0) {\n let taskInfo: PoolTask<T> | undefined\n for (const t of waitingTasks) {\n // Skip task if one of same group is running.\n // Forces serialized execution for subgroup of tasks.\n if (\n t.group != null\n && Object.values(tasks).some(\n tt =>\n tt.state === PoolTaskState.running\n && tt.id !== t.id\n && tt.group === t.group,\n )\n )\n continue\n\n // fifo\n if (taskInfo == null || t.priority < taskInfo.priority)\n taskInfo = t\n }\n if (taskInfo != null) {\n const id = taskInfo.id\n const done = taskInfo.done\n taskInfo.state = PoolTaskState.running\n ++currentParallel\n void events.emit('didStart', id)\n\n const taskFinished = (result?: T) => {\n if (taskInfo) {\n taskInfo.result = result\n taskInfo.state = PoolTaskState.finished\n taskInfo.resolved = taskInfo.max\n taskInfo.progress?.setCompleted()\n // void taskInfo.progress.dispose()\n }\n --currentParallel\n ++countResolved\n performNext()\n }\n\n taskInfo\n .task(taskInfo)\n .then((r) => {\n done(r)\n void events.emit('didResolve', id, r)\n taskFinished(r)\n })\n .catch((err) => {\n done()\n void events.emit('didReject', id, err)\n taskFinished()\n })\n }\n }\n }\n\n function cancel(id: string) {\n const taskInfo = tasks[id]\n if (taskInfo && taskInfo.state === PoolTaskState.waiting) {\n tasks[id].state = PoolTaskState.finished\n ++countResolved\n void events.emit('didCancel', id)\n void tasks[id].progress.dispose()\n didUpdate()\n }\n }\n\n function cancelAll() {\n Object.keys(tasks).forEach(cancel)\n // progress.dispose()\n }\n\n function hasById(id: string) {\n return tasks[id] != null\n }\n\n function enqueue<P>(\n task: PoolTaskFn<T>,\n config: {\n id?: string\n max?: number\n resolved?: number\n group?: string\n idConflictResolution?: PoolTaskIdConflictResolution\n payload?: P\n } = {},\n ) {\n let done: any\n const promise: Promise<any> = new Promise(resolve => (done = resolve))\n const id = config.id ?? uuid()\n\n if (tasks[id] != null) {\n const resolution = config.idConflictResolution ?? idConflictResolution\n\n if (resolution === PoolTaskIdConflictResolution.replace) {\n cancel(id)\n }\n else if (resolution === PoolTaskIdConflictResolution.memoize || resolution === PoolTaskIdConflictResolution.prioritize) {\n const runningTask = tasks[id]\n\n if (resolution === PoolTaskIdConflictResolution.prioritize)\n runningTask.priority = ++priority\n\n return {\n id,\n promise: (async () => {\n if (runningTask.state === PoolTaskState.finished)\n return tasks[id].result\n\n // todo: wait for task to finish\n })(),\n dispose: () => cancel(id),\n cancel: () => cancel(id),\n }\n }\n else {\n throw new Error(`Pool task with id=${id} already exists!`)\n }\n }\n\n const taskProgress = new Progress({\n name: id,\n totalUnits: config.max ?? 1,\n completeUnits: config.resolved ?? 0,\n })\n\n progress.addChild(taskProgress)\n\n tasks[id] = {\n id,\n task,\n priority: ++priority,\n group: config.group,\n state: PoolTaskState.waiting,\n max: config.max ?? 1,\n resolved: config.resolved ?? 0,\n done,\n payload: config.payload,\n progress: taskProgress,\n\n /** @deprecated should use `.progress` */\n setMax(units) {\n taskProgress.setTotalUnits(units)\n tasks[id].max = units\n didUpdate()\n },\n\n /** @deprecated should use `.progress` */\n setResolved(units) {\n taskProgress.setCompletetedUnits(units)\n tasks[id].resolved = units\n didUpdate()\n },\n\n /** @deprecated should use `.progress` */\n incResolved(inc = 1) {\n taskProgress.incCompletedUnits(inc)\n tasks[id].resolved += inc\n didUpdate()\n },\n }\n ++countMax\n performNext()\n\n return {\n id,\n promise,\n dispose: () => cancel(id),\n cancel: () => cancel(id),\n }\n }\n\n return {\n events,\n cancel,\n cancelAll,\n hasById,\n progress,\n enqueue,\n dispose,\n waitFinishAll,\n }\n}\n\nexport type Pool = ReturnType<typeof usePool>\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport type { LoggerInterface } from '../log-base'\nimport { LogLevel } from '../log-base'\nimport { Logger } from '../log'\nimport { uname } from '../uuid'\nimport { Emitter } from '../msg/emitter'\n\ntype TaskResolver = any\n\nexport type TaskFn<T = any> = () => Promise<T>\n\ninterface TaskInfo {\n name: string\n task: TaskFn\n resolve: TaskResolver\n}\n\nexport interface TaskEvents {\n didUpdate(max: number, resolved: number): void\n didStart(max: number): void\n didCancel(): void\n didFinish(): void\n // didResolve(value: any): void\n // didReject(error: any): void\n // didPause(max: number): void\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue extends Emitter<TaskEvents> {\n private queue: TaskInfo[] = []\n private waitToFinish: TaskResolver[] = []\n private currentTask?: Promise<any>\n private log: LoggerInterface\n private countMax = 0\n private countResolved = 0\n\n private paused = false\n\n name: string\n\n constructor(opt: { name?: string; logLevel?: LogLevel } = {}) {\n super()\n const { name = uname('queue'), logLevel } = opt\n this.name = name\n this.log = Logger(`zeed:queue:${name}`, logLevel ?? LogLevel.off)\n }\n\n private async performNext() {\n this.log('performNext, queue.length =', this.queue.length)\n\n if (this.currentTask != null) {\n this.log('performNext => skip while another task is running')\n return\n }\n\n if (this.paused) {\n this.log('performNext => skip while is paused')\n return\n }\n\n while (this.currentTask == null && !this.paused) {\n const info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null)\n break\n\n if (this.countResolved === 0)\n void this.emit('didStart', this.countMax)\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n }\n catch (err) {\n this.log.warn('Error performing task', err)\n }\n\n resolve(result)\n this.currentTask = undefined\n\n this.countResolved += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n }\n\n if (this.queue.length === 0) {\n void this.emit('didFinish')\n this.countMax = 0\n this.countResolved = 0\n }\n\n while (this.waitToFinish.length > 0)\n this.waitToFinish.shift()()\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: TaskFn<T>,\n opt: { immediate?: boolean; name?: string } = {},\n ): Promise<T> {\n const { immediate = false, name = uname(this.name) } = opt\n if (immediate) {\n this.log.info(`immediate execution ${name}`)\n return await task()\n }\n\n this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n\n this.countMax += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n\n void this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: TaskFn<T>,\n opt: { name?: string } = {},\n ): Promise<T> {\n return this.enqueue(task, {\n immediate: this.currentTask != null,\n name: opt.name,\n })\n }\n\n /** Remove all tasks from queue that are not yet executing. */\n async cancelAll(_unblock = true) {\n this.log('cancelAll')\n void this.emit('didCancel')\n const resolver = this.queue.map(task => task.resolve)\n this.queue = []\n resolver.forEach(r => r(undefined))\n await this.wait()\n }\n\n /** Pause execution after current task is finished. */\n async pause() {\n this.log('pause')\n this.paused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log('resume')\n this.paused = false\n void this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log('wait')\n if (this.currentTask == null && (this.queue.length === 0 || this.paused))\n return\n\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n\n public get isPaused(): boolean {\n return this.paused\n }\n\n public get hasTasks(): boolean {\n return this.queue.length !== 0\n }\n}\n","// General explaination https://css-tricks.com/debouncing-throttling-explained-examples/\n// From https://github.com/cowboy/jquery-throttle-debounce\n// And https://github.com/wuct/raf-throttle/blob/master/rafThrottle.js\n\nimport { Logger } from '../log'\nimport { promisify } from './promise'\n\nconst DEBUG = false\nconst log = DEBUG ? Logger('zeed:throttle', 'error') : () => {}\n\n/**\n * A special throttle implementation that tries to distribute execution\n * in an optimal way.\n *\n * **Functionality:** For UI usage the function is executed on first occasion (`leading`).\n * If more calls follow it will again be executed at end (`trailing`).\n * If the next call is inside the timeframe, it is delayed until `trailing`.\n * This avoids timewise too close calls.\n * It is possible to `cancel` the timeout and to `flush` a call, e.g. if\n * leaving UI situation where a final call is required to write data or similar.\n */\nexport function throttle<F extends (...args: any[]) => any>(\n callback: F,\n opt: {\n delay?: number\n trailing?: boolean\n leading?: boolean\n } = {},\n): F & {\n /** Stop all timers, do not exec nothing */\n cancel: () => void\n\n /** Stop all timers and execute right now. */\n immediate: (...args: Parameters<F>) => Promise<void>\n\n /** Stop all timers and execute trailing call, if exists. */\n stop: () => void\n\n dispose: () => void\n } {\n const { delay = 100, trailing = true, leading = true } = opt\n\n let timeoutID: any = 0\n let checkpoint = 0\n let visited = 0\n let trailingExec: Function | undefined\n\n const debugCheckpoint = Date.now()\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID)\n timeoutID = undefined\n return true\n }\n return false\n }\n\n function wrapper(this: any, ...args: any[]) {\n const now = Date.now()\n const elapsed = now - checkpoint\n\n function debugElapsed() {\n const dnow = Date.now()\n return `total ${(dnow - debugCheckpoint).toFixed(1)}ms - elapsed ${(\n dnow - checkpoint\n ).toFixed(1)}ms - visited ${visited}x`\n }\n\n const exec = () => {\n visited = 0\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n trailingExec = exec\n\n // Make sure enough time has passed since last call\n if (elapsed > delay || !timeoutID) {\n DEBUG && log('elapsed', debugElapsed())\n\n // Leading execute once immediately\n if (leading) {\n if (elapsed > delay) {\n DEBUG && log('🚀 leading', debugElapsed())\n exec()\n }\n else {\n ++visited // at least trigger trailing this way\n }\n }\n\n const timeout = elapsed > delay ? delay : delay - elapsed\n log(`⏱ start timeout with ${timeout.toFixed(1)}ms`, debugElapsed())\n\n // Prepare for next round\n clearExistingTimeout()\n checkpoint = now\n\n // Delay. We should not get here if timeout has not been reached before\n timeoutID = setTimeout(() => {\n DEBUG && log('⏱ reached timeout', debugElapsed())\n timeoutID = 0\n // Only execute on trailing or when visited again, but do not twice if leading\n if (trailing && (!leading || visited > 0)) {\n DEBUG && log('🚀 trailing', debugElapsed())\n trailingExec?.()\n }\n }, timeout)\n }\n else {\n // Count visits\n ++visited\n DEBUG && log('visited', debugElapsed())\n }\n }\n\n wrapper.cancel = clearExistingTimeout\n\n wrapper.stop = () => {\n if (clearExistingTimeout() && trailingExec)\n trailingExec()\n }\n\n wrapper.immediate = async function immediate(this: any, ...args: Parameters<F>[]) {\n clearExistingTimeout()\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n wrapper.dispose = () => wrapper.stop()\n\n return wrapper as any\n}\n\n/**\n * Debounce fits best for filtering a large peak of events.\n * For UI event filtering throttle is probably a better choice.\n *\n * **Functionality:** It only fires after triggers pause for `delay` ms.\n */\nexport function debounce<F extends (...args: any[]) => any | Promise<any>>(\n callback: F,\n opt: {\n delay?: number\n } = {},\n): F & {\n cancel: () => void\n immediate: (...args: Parameters<F>) => Promise<void>\n dispose: () => void\n } {\n const { delay = 100 } = opt\n let timeoutID: any = 0\n\n let running = false\n let lastArguments: any[] | undefined\n\n function clearExistingTimeout() {\n if (timeoutID) {\n log('clear')\n clearTimeout(timeoutID)\n timeoutID = 0\n }\n }\n\n async function exec() {\n try {\n clearExistingTimeout()\n if (lastArguments != null) {\n log('exec')\n const args = [...lastArguments]\n lastArguments = undefined\n running = true\n await promisify(callback(...args))\n running = false\n log('exec done')\n if (lastArguments != null) {\n clearExistingTimeout()\n log('exec trigger next')\n timeoutID = setTimeout(exec, delay)\n }\n }\n }\n catch (err) { }\n }\n\n function wrapper(this: any, ...args: any[]) {\n lastArguments = [...args]\n clearExistingTimeout()\n log('trigger')\n if (running === false)\n timeoutID = setTimeout(exec, delay)\n }\n\n async function immediate(this: any, ...args: any[]) {\n clearExistingTimeout()\n lastArguments = [...args]\n await exec()\n }\n wrapper.cancel = clearExistingTimeout\n wrapper.dispose = clearExistingTimeout\n wrapper.immediate = immediate\n\n return wrapper as any\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function isLocalHost(\n hostname: string = globalThis?.location?.hostname ?? '',\n): boolean {\n return (\n ['::ffff:127.0.0.1', 'localhost', '127.0.0.1', '', '::1', '::'].includes(\n hostname,\n )\n || hostname.startsWith('192.168.')\n || hostname.startsWith('10.0.')\n || hostname.endsWith('.local')\n )\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { LogHandler, LogHandlerOptions, LogMessage } from './log-base'\nimport { useLevelFilter, useNamespaceFilter } from './log-filter'\n\n/**\n * Collect messages in a list.\n *\n * @param level Log level\n * @returns Logger\n */\nexport function LoggerMemoryHandler(\n opt: LogHandlerOptions & {\n messages: LogMessage[]\n },\n): LogHandler {\n const { level = undefined, filter = undefined, messages = [] } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n messages.push(msg)\n }\n}\n","import {\n arrayFlatten,\n deepMerge,\n isArray,\n jsonStringifySafe,\n toBase64,\n} from './data'\nimport { encodeQuery } from './data/url'\nimport { Logger } from './log'\nimport type { Json } from './types'\n\nconst log = Logger('zeed:network', 'error')\n\ninterface fetchOptionType {\n /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */\n cache?: RequestCache\n /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */\n credentials?: RequestCredentials\n /** Returns the kind of resource requested by request, e.g., \"document\" or \"script\". */\n destination?: RequestDestination\n /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the \"Host\" header. */\n headers?: Record<string, string>\n /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */\n integrity?: string\n /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */\n keepalive?: boolean\n /** Returns request's HTTP method, which is \"GET\" by default. */\n method?: string\n /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */\n mode?: RequestMode\n /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */\n redirect?: RequestRedirect\n /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and \"about:client\" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. */\n referrer?: string\n /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */\n referrerPolicy?: ReferrerPolicy\n /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */\n signal?: AbortSignal\n /** Returns the URL of request as a string. */\n url?: string\n body?: any\n}\n\ntype fetchOptionsType = fetchOptionType | fetchOptionsType[]\n\nconst defaultOptions: fetchOptionType = {\n cache: 'no-cache',\n redirect: 'follow',\n headers: {},\n}\n\n// Source https://developer.mozilla.org/de/docs/Web/HTTP/Methods\nexport type httpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'HEAD'\n | 'CONNECT'\n | 'OPTIONS'\n | 'TRACE'\n | 'PATCH'\n\nexport function parseBasicAuth(url: string) {\n const m = /:\\/\\/([^@]*)@/gi.exec(url)\n if (m && m[1]) {\n const [username, password] = m[1].split(':', 2)\n return {\n url: url.replace(`${m[1]}@`, ''),\n username,\n password,\n }\n }\n}\n\n/** Simplified `fetch` that returns `undefined` on non 200 status */\nexport async function fetchBasic(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<Response | undefined> {\n try {\n if (isArray(fetchOptions))\n fetchOptions = deepMerge({}, ...arrayFlatten(fetchOptions))\n\n const auth = parseBasicAuth(String(url))\n if (auth) {\n url = auth.url\n fetchOptions = deepMerge(\n {},\n fetchOptions,\n fetchOptionsBasicAuth(auth.username, auth.password),\n )\n }\n\n if (\n // @ts-expect-error headers\n fetchOptions.headers != null\n // @ts-expect-error headers\n && !(fetchOptions.headers instanceof Headers)\n ) {\n // @ts-expect-error headers\n fetchOptions.headers = new Headers(fetchOptions.headers)\n }\n\n // log(\"fetch\", url, fetchOptions)\n const response = await fetchFn(String(url), fetchOptions as RequestInit)\n\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n if (response.status < 400)\n return response\n\n try {\n log.warn(`Fetch of ${String(url)} returned status=${response.status}. Options:`, fetchOptions)\n log.warn(`Response: ${await response.text()}`)\n }\n catch (err) {\n log.error('Exception:', err)\n }\n }\n catch (err) {\n log.error('fetchBasic', err)\n }\n}\n\n/** Fetch for JSON */\nexport async function fetchJson<T = Json>(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<T | undefined> {\n try {\n const res = await fetchBasic(\n url,\n [\n {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n },\n fetchOptions,\n ],\n fetchFn,\n )\n if (res)\n return await res.json()\n }\n catch (err) {\n log.error('fetchJSON error:', err)\n }\n}\n\n/** Fetch for text */\nexport async function fetchText(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<string | undefined> {\n try {\n const res = await fetchBasic(\n url,\n [defaultOptions, { method: 'GET' }, fetchOptions],\n fetchFn,\n )\n if (res)\n return await res.text()\n }\n catch (err) {\n log.error('fetchHTML error:', err)\n }\n}\n\n///\n\n/** Options for fetchBasic to send data as application/x-www-form-urlencoded */\nexport function fetchOptionsFormURLEncoded(\n data: object,\n method: httpMethod = 'POST',\n): fetchOptionType {\n return {\n method,\n ...defaultOptions,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',\n },\n body: encodeQuery(data),\n }\n}\n\n/** Options to send data as JSON */\nexport function fetchOptionsJson(\n data: object,\n method: httpMethod = 'POST',\n): fetchOptionType {\n return {\n method,\n ...defaultOptions,\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n // Accept: \"application/json\",\n },\n body: jsonStringifySafe(data),\n }\n}\n\n/** Options to pass basic auth */\nexport function fetchOptionsBasicAuth(\n username: string,\n password: string,\n): fetchOptionType {\n return {\n headers: {\n Authorization: `Basic ${toBase64(`${username}:${password}`)}`,\n },\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function getWindow(): any | undefined {\n if (typeof window !== 'undefined')\n return window\n}\n\nexport function getNavigator(): any | undefined {\n if (typeof navigator !== 'undefined')\n return navigator\n}\n\nexport function getGlobal(): any {\n return getWindow()\n // @ts-expect-error xxx\n ?? typeof WorkerGlobalScope !== 'undefined'\n ? self\n : typeof global !== 'undefined'\n ? global\n // eslint-disable-next-line no-new-func, @typescript-eslint/no-implied-eval\n : Function('return this;')()\n}\n\n// todo sideffects\nconst _navigator = getNavigator()\nconst _window = getWindow()\n\nexport function detect(\n info = {\n ios: false,\n macos: false,\n windows: false,\n beaker: false,\n electron: false,\n wkwebview: false,\n pwa: false,\n pwaInstalled: false,\n browser: false,\n node: false,\n worker: false,\n test: false,\n jest: false,\n macosNative: false,\n iosNative: false,\n appleNative: false,\n touch: false,\n },\n) {\n info.ios = _navigator?.platform?.match(/(iPhone|iPod|iPad)/i) != null\n info.macos = !!_navigator?.platform?.startsWith('Mac')\n info.windows = !!_navigator?.platform?.startsWith('Win')\n\n info.beaker = _window?.beaker != null // https://github.com/beakerbrowser/beaker\n info.electron\n = (_navigator?.userAgent?.toLowerCase()?.indexOf(' electron/') || -1) > -1\n && !info.beaker\n info.wkwebview = _window?.webkit?.messageHandlers != null // Apple embedded\n\n info.pwa = _navigator?.serviceWorker != null\n\n info.pwaInstalled = _navigator?.standalone\n || _window?.matchMedia?.('(display-mode: standalone)')?.matches\n\n info.node\n = typeof process !== 'undefined' && process?.release?.name === 'node'\n info.browser = !info.electron && !info.wkwebview && !info.node\n\n // info.worker = typeof importScripts === 'function'\n info.worker\n // @ts-expect-error xxx\n = typeof WorkerGlobalScope !== 'undefined'\n // @ts-expect-error xxx\n && self instanceof WorkerGlobalScope\n // @ts-expect-error xxx\n info.jest = typeof jest !== 'undefined' || typeof vitest !== 'undefined'\n info.test = info.jest\n\n info.macosNative = info.wkwebview && info.macos\n info.iosNative = info.wkwebview && info.ios\n info.appleNative = info.wkwebview\n\n // https://github.com/viljamis/feature.js/blob/master/feature.js#L203\n info.touch\n = (_window && 'ontouchstart' in _window)\n || (_navigator?.maxTouchPoints || 0) > 1\n || (_navigator?.msPointerEnabled && _window?.MSGesture)\n // @ts-expect-error xxx\n || (_window?.DocumentTouch && document instanceof DocumentTouch)\n\n return info\n}\n\n// https://stackoverflow.com/a/31090240/140927\n// export const isBrowser = new Function(\n// \"try {return this===window;}catch(e){ return false;}\"\n// )\n\n// export const isNode = new Function(\n// \"try {return this===global;}catch(e){return false;}\"\n// )\n\nexport const isBrowser = () =>\n typeof window !== 'undefined' && globalThis === window\n\nexport const platform = detect()\n\n/**\n * Before closing the tab/window or quitting the node process\n * allow to do something important first\n */\nexport function useExitHandler(handler: () => void) {\n if (isBrowser())\n window.addEventListener('beforeunload', handler)\n else if (typeof process !== 'undefined')\n process.on('exit', () => handler)\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { cloneObject } from '../data/utils'\nimport type { Json, ObjectStorage } from '../types'\n\n// const log = Logger('zeed:memstorage', 'error')\n\nexport interface MemStorageOptions {\n objectFromString?: (data: string) => any\n objectToString?: (data: any) => string\n}\n\nexport class MemStorage<T = Json> implements ObjectStorage<T> {\n private store: Record<string, T> = {}\n // private pretty: boolean = false\n // private objectFromString: (data: string) => any\n // private objectToString: (data: any) => string\n\n constructor(_opt: MemStorageOptions = {}) {\n // this.objectToString =\n // opt.objectToString ??\n // ((data: any): string => {\n // return this.pretty\n // ? JSON.stringify(data, null, 2)\n // : JSON.stringify(data)\n // })\n // this.objectFromString =\n // opt.objectFromString ??\n // ((data: string) => {\n // try {\n // return JSON.parse(data)\n // } catch (err) {\n // log.warn(`MemStorage parse error '${err}' in`, data)\n // }\n // })\n }\n\n setItem(key: string, value: T): void {\n // const data = this.objectToString(value)\n this.store[key] = cloneObject(value)\n }\n\n getItem(key: string): T | undefined {\n return cloneObject(this.store[key])\n }\n\n removeItem(key: string): void {\n delete this.store[key]\n }\n\n clear(): void {\n this.store = {}\n }\n\n allKeys(): string[] {\n return Object.keys(this.store)\n }\n}\n","export const noop = () => {}\n","// Inspired by https://github.com/kof/node-argsparser/blob/master/lib/argsparser.js\n\nimport { toCamelCase } from '../common/data/camelcase'\n\ninterface ParseConfig {\n args?: string[]\n alias?: Record<string, string[]>\n normalize?: (value: string) => string\n booleanArgs?: string | string[]\n listArgs?: string | string[]\n numberArgs?: string | string[]\n}\n\nexport function parseArgs(config: ParseConfig = {}) {\n const {\n args = process.argv.slice(1),\n alias = {},\n normalize = toCamelCase,\n booleanArgs = [],\n listArgs = [],\n numberArgs = [],\n } = config\n\n const nameToAlias = Object.entries(alias).reduce((map, curr) => {\n let [name, values] = curr\n if (typeof values === 'string')\n values = [values]\n for (const value of values)\n map[normalize(value)] = normalize(name)\n\n return map\n }, {} as any)\n\n const opts: Record<string, any> = {\n _: [],\n }\n\n function setOpt(name: string, value: any) {\n if (opts[name] == null)\n opts[name] = value\n\n else if (typeof opts[name] === 'boolean')\n opts[name] = value\n\n else if (Array.isArray(opts[name]))\n opts[name].push(value)\n\n else\n opts[name] = [opts[name], value]\n }\n\n const argList = [...args]\n let arg: string | undefined\n\n // eslint-disable-next-line no-cond-assign\n while ((arg = argList.shift())) {\n let value: any\n if (/^--?/.test(arg)) {\n let key = arg.replace(/^--?/, '')\n if (arg.includes('=')) {\n const [name, valuePart] = key.split('=', 2)\n key = name.trim()\n value = valuePart.trim()\n }\n key = normalize(key)\n key = nameToAlias[key] ?? key\n if (booleanArgs.includes(key)) {\n setOpt(key, true)\n }\n else {\n value = value ?? argList.shift() ?? ''\n if (numberArgs.includes(key))\n value = Number(value ?? 0)\n\n if (listArgs.includes(key)) {\n if (Array.isArray(opts[key]))\n opts[key].push(value)\n\n else\n opts[key] = [value]\n }\n else {\n setOpt(key, value)\n }\n }\n }\n else {\n opts._.push(arg)\n }\n }\n\n return opts\n}\n","/** Copy string to clipboard */\nexport function pbcopy(data: string) {\n return new Promise(\n (resolve, reject) => {\n import('child_process').then(({ spawn }) => {\n const proc = spawn('pbcopy')\n proc.on('error', (err: any) => reject(err))\n proc.on('close', () => resolve(data))\n proc.stdin.write(data)\n proc.stdin.end()\n }).catch(() => {})\n })\n}\n","// https://nodejs.org/api/webcrypto.html\nimport nodeCrypto from 'crypto'\n\nexport {}\n\n// declare namespace NodeJS {\n// interface Global {\n// crypto: Crypto\n// }\n// }\n\n// todo sideffects\ntry {\n if (\n typeof globalThis !== 'undefined'\n && typeof globalThis.crypto === 'undefined'\n && nodeCrypto\n && nodeCrypto.webcrypto\n ) {\n // @ts-expect-error this is a workaround for node environment\n globalThis.crypto = nodeCrypto.webcrypto\n }\n}\ncatch (err) {\n console.warn('Failed to polyfill webcrypto', err)\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-unused-vars\n// declare namespace NodeJS {\n// interface Global {\n// crypto: Crypto\n// }\n// }\n\n// export async function getCrypto() {\n// if (!globalThis.crypto) {\n// try {\n// if (typeof globalThis !== 'undefined' && typeof globalThis.crypto === 'undefined') {\n// // https://nodejs.org/api/webcrypto.html\n// // @ts-expect-error this is a workaround for node environment\n// globalThis.crypto = await import('crypto')\n// }\n// }\n// catch (err) {\n// console.warn('Failed to polyfill webcrypto', err)\n// }\n// }\n// return globalThis.crypto\n// }\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n// Adopted from https://github.com/motdotla/dotenv BSD-2\n\nimport fs from 'fs'\nimport { resolve } from 'path'\nimport { Logger } from '../common/log'\nimport { LogLevel } from '../common/log-base'\n\nconst log = Logger('zeed:env', 'error')\n\nconst NEWLINE = '\\n'\nconst RE_INI_KEY_VAL = /^\\s*([\\w_.-]+)\\s*=\\s*(.*)?\\s*$/\nconst RE_NEWLINES = /\\\\n/g\nconst NEWLINES_MATCH = /\\n|\\r|\\r\\n/\n\ninterface csvOptions {\n /** @deprecated will probably be replaced by logLevel */\n debug?: boolean\n path?: string\n filename?: string\n encoding?: BufferEncoding\n prefix?: string\n env?: Record<string, string>\n}\n\n// Parses src into an Object\nfunction parse(src: string, _options: csvOptions = {}) {\n const obj: Record<string, string> = {}\n\n // convert Buffers before splitting into lines and processing\n String(src)\n .split(NEWLINES_MATCH)\n .forEach((line, idx) => {\n // matching \"KEY' and 'VAL' in 'KEY=VAL'\n const keyValueArr = line.match(RE_INI_KEY_VAL)\n // matched?\n\n // log.debug(\"keyValueArr\", keyValueArr)\n\n if (keyValueArr != null) {\n const key = keyValueArr[1]\n // default undefined or missing values to empty string\n let val = keyValueArr[2] || ''\n const end = val.length - 1\n const isDoubleQuoted = val[0] === '\"' && val[end] === '\"'\n const isSingleQuoted = val[0] === '\\'' && val[end] === '\\''\n\n // if single or double quoted, remove quotes\n if (isSingleQuoted || isDoubleQuoted) {\n val = val.substring(1, end)\n\n // if double quoted, expand newlines\n if (isDoubleQuoted)\n val = val.replace(RE_NEWLINES, NEWLINE)\n }\n else {\n // remove surrounding whitespace\n val = val.trim()\n }\n obj[key] = val\n }\n else {\n log.debug(\n `did not match key and value when parsing line ${idx + 1}: ${line}`,\n )\n }\n })\n\n // log.debug(\"obj\", obj)\n return obj\n}\n\n/**\n * Return a path relative to the current working directory\n */\nexport function stringToPath(\n value?: string,\n defaultValue = '.',\n): string {\n return resolve(process.cwd(), value ?? defaultValue)\n}\n\nexport function valueToPath(value?: any, defaultValue = ''): string {\n if (value == null)\n value = defaultValue\n return stringToPath(String(value).trim(), defaultValue)\n}\n\nexport const toPath = valueToPath\n\nexport function getEnvVariableRelaxed(\n name: string,\n env = process.env,\n): string | undefined {\n if (env[name] != null)\n return env[name]\n name = name.toLowerCase()\n for (const [k, v] of Object.entries(env)) {\n if (k.toLowerCase() === name)\n return v\n }\n}\n\n/** Populates process.env from .env file. */\nexport function setupEnv(options: csvOptions = {}) {\n const dotenvPath: string\n = options?.path ?? toPath(options?.filename ?? '.env')\n const encoding: BufferEncoding = options?.encoding ?? 'utf8'\n const debug = options?.debug || false\n\n if (debug !== true)\n log.level = LogLevel.off\n\n try {\n // specifying an encoding returns a string instead of a buffer\n const parsedEnv = fs.existsSync(dotenvPath)\n ? parse(fs.readFileSync(dotenvPath, { encoding }), { debug })\n : {}\n const parsedEnvLocal = fs.existsSync(`${dotenvPath}.local`)\n ? parse(fs.readFileSync(`${dotenvPath}.local`, { encoding }), { debug })\n : {}\n\n const parsed: Record<string, string> = Object.assign(\n {},\n parsedEnv,\n parsedEnvLocal,\n )\n const env = options?.env ?? process.env\n\n Object.entries(parsed).forEach(([key, value]) => {\n if (typeof options?.prefix === 'string')\n key = options?.prefix + key\n\n if (!Object.prototype.hasOwnProperty.call(env, key)) {\n if (value != null) {\n log.info(`set env.${key} = ${value}`)\n env[key] = value\n }\n }\n else {\n log.debug(`\"${key}\" is already defined and will not be overwritten`)\n }\n })\n return { parsed }\n }\n catch (e) {\n log.error(e)\n return { error: e }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport {\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n unlinkSync,\n writeFileSync,\n} from 'fs'\nimport { dirname, resolve } from 'path'\nimport { jsonStringifySafe } from '../common/data/json'\nimport { toValidFilename } from '../common/data/path'\nimport { cloneObject } from '../common/data/utils'\nimport { Logger } from '../common/log'\nimport type { Json, ObjectStorage } from '../common/types'\n\nconst log = Logger('zeed:filestorage', 'error')\n\nexport interface FileStorageOptions {\n pretty?: boolean\n path?: string\n extension?: string\n objectFromString?: (data: string) => any\n objectToString?: (data: any) => string\n keyToFilename?: (key: string) => string\n}\n\nexport class FileStorage<T = Json> implements ObjectStorage<T> {\n private store: Record<string, T | null> = {}\n private dirname: string\n private fileKeys?: string[] = undefined\n private pretty = false\n private extension: string\n private extensionLength: number\n private objectFromString: (data: string) => any\n private objectToString: (data: any) => string\n private keyToFilename: (key: string) => string\n\n constructor(opt: FileStorageOptions = {}) {\n this.dirname = resolve(process.cwd(), opt.path ?? '.fileStorage')\n this.pretty = !!opt.pretty\n this.extension = opt.extension ?? '.json'\n\n if (opt.extension && !this.extension.startsWith('.'))\n this.extension = `.${this.extension}`\n\n this.extensionLength = this.extension.length\n\n this.objectToString\n = opt.objectToString\n ?? ((data: any): string => {\n return this.pretty\n ? jsonStringifySafe(data, null, 2)\n : jsonStringifySafe(data)\n })\n\n this.objectFromString\n = opt.objectFromString\n ?? ((data: string) => {\n try {\n return JSON.parse(data)\n }\n catch (err) {\n log.warn(`fileStorage parse error '${err}' in`, data)\n }\n })\n\n this.keyToFilename = opt.keyToFilename ?? toValidFilename\n }\n\n setItem(key: string, value: T): void {\n this.store[key] = cloneObject(value)\n try {\n const data = this.objectToString(value)\n const path = this.getPath(key)\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, data, 'utf8')\n }\n catch (err) {\n log.error('setItem error', err)\n }\n }\n\n getPath(key: string): string {\n return resolve(this.dirname, this.keyToFilename(key) + this.extension)\n }\n\n getBuffer(key: string): Buffer {\n const path = this.getPath(key)\n return Buffer.from(readFileSync(path))\n }\n\n getItem(key: string): T | undefined {\n const value = this.store[key]\n\n // null is an indicator for not existing!\n if (value === null)\n return\n\n if (value != null)\n return cloneObject(value) // this.objectFromString(value)\n\n try {\n const path = this.getPath(key)\n const data = readFileSync(path, 'utf8')\n if (data != null) {\n const value = this.objectFromString(data)\n this.store[key] = value\n return value\n }\n }\n catch (err) {\n // log.warn(\"getItem error\", err)\n this.store[key] = null // do not retry next time\n }\n }\n\n removeItem(key: string): void {\n delete this.store[key]\n if (this.fileKeys != null) {\n const index: number = this.fileKeys.indexOf(key)\n if (index !== -1)\n this.fileKeys.splice(index, 1)\n }\n try {\n const path = this.getPath(key)\n unlinkSync(path)\n }\n catch (err) {}\n }\n\n clear(): void {\n this.fileKeys = []\n this.store = {}\n rmSync(this.dirname, { recursive: true, force: true })\n }\n\n allKeys(): string[] {\n if (this.fileKeys == null) {\n try {\n this.fileKeys\n = readdirSync(this.dirname, { withFileTypes: true })\n .filter(\n item =>\n !item.isDirectory() && item.name.endsWith(this.extension),\n )\n .map(item => item.name.slice(0, -this.extensionLength)) || []\n }\n catch (err) {}\n }\n const keys = [...(this.fileKeys || [])]\n for (const key of Object.keys(this.store)) {\n if (!keys.includes(key))\n keys.push(key)\n }\n keys.sort()\n return keys\n }\n}\n","import { mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises'\nimport { join as joinPath, normalize } from 'node:path'\n\nexport function toHumanReadableFilePath(path: string) {\n const p = normalize(path)\n const h = process.env.HOME\n if (h && p.startsWith(h))\n return `~${p.slice(h.length)}`\n\n return p\n}\n\nexport async function exists(path: string): Promise<boolean> {\n try {\n await stat(path)\n }\n catch (err) {\n return false\n }\n return true\n}\n\nexport async function ensureFolder(...parts: string[]): Promise<string> {\n const path = joinPath(...parts)\n if (!(await exists(path)))\n await mkdir(path, { recursive: true })\n\n return path\n}\n\nexport async function removeFolder(...parts: string[]): Promise<string> {\n const path = joinPath(...parts)\n if (await exists(path))\n await rm(path, { recursive: true })\n\n return path\n}\n\nexport async function readText(\n ...parts: string[]\n): Promise<string | undefined> {\n const path = joinPath(...parts)\n if (await exists(path))\n return await readFile(path, 'utf-8')\n}\n\nexport async function writeText(path: string, content: string): Promise<void> {\n await writeFile(path, content, 'utf-8')\n}\n\n// todo: writeBinary, readBinary\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { createWriteStream, mkdirSync } from 'fs'\nimport { dirname, resolve } from 'path'\nimport { renderMessages } from '../common/data/convert'\nimport type { LogHandlerOptions, LogMessage } from '../common/log-base'\nimport { LogLevel } from '../common/log-base'\nimport { useLevelFilter, useNamespaceFilter } from '../common/log-filter'\n\nconst namespaces: Record<string, any> = {}\n\nexport function LoggerFileHandler(path: string, opt: LogHandlerOptions = {}) {\n const {\n level = undefined,\n filter = undefined,\n time = true,\n pretty = false,\n } = opt\n path = resolve(process.cwd(), path)\n mkdirSync(dirname(path), { recursive: true })\n const stream = createWriteStream(path, { flags: 'a' })\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n\n const timeNow = time ? `${new Date().toISOString()} ` : ''\n const name = msg.name || ''\n const ninfo = namespaces[name || '']\n if (ninfo == null)\n namespaces[name] = ninfo\n\n const args: string[] = [\n `[${name || '*'}]`,\n renderMessages(msg.messages, { pretty }),\n ]\n\n function write(...args: string[]): void {\n stream.write(`${args.join('\\t')}\\n`)\n }\n\n switch (msg.level) {\n case LogLevel.info:\n write(`${timeNow}I|* `, ...args)\n break\n case LogLevel.warn:\n write(`${timeNow}W|** `, ...args)\n break\n case LogLevel.error:\n write(`${timeNow}E|***`, ...args)\n break\n default:\n write(`${timeNow}D| `, ...args)\n break\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport tty from 'tty'\nimport { renderMessages, valueToBoolean } from '../common/data/convert'\nimport type { LogHandler, LogHandlerOptions, LogMessage } from '../common/log-base'\nimport { LogLevel } from '../common/log-base'\nimport { useLevelFilter, useNamespaceFilter } from '../common/log-filter'\nimport { formatMilliseconds, getTimestamp } from '../common/time'\nimport { getSourceLocation, getSourceLocationByPrecedingPattern, getStack } from './log-util'\n\nfunction shouldUseColor(): boolean {\n try {\n return valueToBoolean(process.env.ZEED_COLOR, tty.isatty(process.stdout.fd))\n }\n catch (err) {}\n return false\n}\n\nlet defaultUseColor: boolean | undefined\n\nconst colors = [6, 2, 3, 4, 5, 1]\n\nfunction selectColor(namespace: string) {\n let hash = 0\n for (let i = 0; i < namespace.length; i++) {\n hash = (hash << 5) - hash + namespace.charCodeAt(i)\n hash |= 0 // Convert to 32bit integer\n }\n return colors[Math.abs(hash) % colors.length]\n}\n\nconst namespaces: Record<string, any> = {}\n\nlet startTime: number | undefined\n\nfunction log(...args: any[]) {\n process.stdout.write(`${renderMessages(args)}\\n`)\n}\n\n// const _browserStyleMap = {\n// [BOLD]: { \"font-weight\": \"bold\" },\n// [UNBOLD]: { \"font-weight\": \"normal\" },\n// [BLUE]: { color: \"blue\" },\n// [GREEN]: { color: \"green\" },\n// [GREY]: { color: \"grey\" },\n// [RED]: { color: \"red\" },\n// [PURPLE]: { color: \"purple\" },\n// [ORANGE]: { color: \"orange\" },\n// [UNCOLOR]: { color: \"black\" },\n// }\n\nconst TTY_STYLE = {\n BOLD: '\\u001B[1m',\n UNBOLD: '\\u001B[2m',\n RED: '\\u001B[31m',\n GREEN: '\\u001B[32m',\n BLUE: '\\u001B[34m',\n PURPLE: '\\u001B[35m',\n GRAY: '\\u001B[37m',\n ORANGE: '\\u001B[38;5;208m',\n UNCOLOR: '\\u001B[0m',\n}\n\nenum COLOR {\n RED = 1,\n GREEN = 2,\n BLUE = 4,\n PURPLE = 5,\n GRAY = 7,\n ORANGE = 8,\n}\n\nconst colorEnd = '\\u001B[0m'\n\nexport function colorString(text: string, colorCode: number) {\n const colorStart = colorCode === COLOR.ORANGE\n ? TTY_STYLE.ORANGE\n : `\\u001B[3${colorCode < 8 ? colorCode : `8;5;${colorCode}`}m`\n return `${colorStart}${text}${colorEnd}`\n}\n\nexport function colorStringList(\n list: Array<any>,\n style: string,\n bold = true,\n) {\n return list.map((value) => {\n if (typeof value !== 'string')\n return value\n let start = style\n let end = colorEnd\n if (bold) {\n start = `${TTY_STYLE.BOLD}${start}`\n end = `${end}${TTY_STYLE.BOLD}`\n }\n return `${start}${value}${end}`\n })\n}\n\nexport const loggerStackTraceDebug = 'loggerStackTraceDebug-7d38e5a9214b58d29734374cdb9521fd964d7485'\n\nexport function LoggerNodeHandler(opt: LogHandlerOptions = {}): LogHandler {\n if (defaultUseColor == null)\n defaultUseColor = shouldUseColor()\n\n if (startTime == null)\n startTime = getTimestamp()\n\n const {\n level = undefined,\n filter = undefined,\n colors = defaultUseColor,\n levelHelper = true,\n nameBrackets = true,\n padding = 0,\n fill = 0,\n stack = true,\n time = true,\n } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n const timeNow = getTimestamp()\n const name = msg.name || ''\n let ninfo = namespaces[name || '']\n if (ninfo == null) {\n ninfo = {\n color: selectColor(name),\n // time: timeNow\n }\n namespaces[name] = ninfo\n }\n const timeDiffString = formatMilliseconds(timeNow - startTime!)\n\n let args: string[]\n\n let displayName = nameBrackets ? `[${name}]` : name\n\n if (padding > 0)\n displayName = displayName.padStart(padding, ' ')\n\n if (fill > 0)\n displayName = displayName.padEnd(fill, ' ')\n\n if (colors) {\n const c = ninfo.color\n args = [`${colorString(displayName, c)} | `] // nameBrackets ? [`%c[${name}]`] : [`%c${name}`]\n if (msg.level === LogLevel.warn)\n args.push(...colorStringList(msg.messages, TTY_STYLE.ORANGE))\n else if (msg.level === LogLevel.error)\n args.push(...colorStringList(msg.messages, TTY_STYLE.RED))\n else\n args.push(...msg.messages)\n if (time)\n args.push(colorString(`+${timeDiffString}`, c))\n }\n else {\n args = [displayName, ...msg.messages]\n if (time)\n args.push(`+${timeDiffString}`)\n }\n\n if (msg.messages?.[0] === loggerStackTraceDebug) {\n // eslint-disable-next-line no-console\n console.log(getStack())\n }\n\n if (stack) {\n let line = ''\n if (typeof stack === 'boolean') {\n line = getSourceLocationByPrecedingPattern(\n ['at Function.', 'at null.log (', 'at log ('],\n true,\n )\n if (!line)\n line = getSourceLocation(0, true)\n }\n else {\n const depth = typeof stack === 'number' ? stack : 3\n line = getSourceLocation(depth, true)\n }\n if (line)\n args.push(colorString(`(${line})`, COLOR.GRAY))\n }\n const sep = '|'\n const charLevel = '.'\n\n switch (msg.level) {\n case LogLevel.info:\n if (levelHelper)\n args[0] = `I${sep}${charLevel} ${args[0]}`\n log(...args)\n break\n case LogLevel.warn:\n if (levelHelper) {\n args[0] = (colors\n ? colorString(`W${sep}${charLevel}${charLevel} `, COLOR.ORANGE)\n : `W${sep}${charLevel}${charLevel} `) + args[0]\n }\n log(...args)\n break\n case LogLevel.error:\n if (levelHelper) {\n args[0] = (colors\n ? colorString(`E${sep}${charLevel}${charLevel}${charLevel} `, COLOR.RED)\n : `E${sep}${charLevel}${charLevel}${charLevel} `) + args[0]\n }\n log(...args)\n break\n default:\n if (levelHelper)\n args[0] = `D${sep} ${args[0]}`\n log(...args)\n break\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { resolve } from 'path'\nimport { isNotNull } from '../common'\n\nexport function getStackLlocationList(stack: string): string[] {\n if (typeof stack !== 'string')\n return []\n // console.log(\"stack\", stack)\n return (\n stack?.split('\\n').map((rawLine) => {\n const m = rawLine.match(\n /^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/,\n )\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return undefined\n })?.filter(isNotNull) ?? []\n )\n}\n\nconst cwd = resolve(process.cwd())\nconst home = process.env?.HOME ? resolve(process.env?.HOME) : ''\n// console.log(`cwd = ${cwd}, home = ${home}}`)\n\nfunction pathStripCwd(path: string) {\n // console.log(\">\", path)\n\n if (path.includes('/node_modules/'))\n return ''\n\n const fileURL = 'file://'\n if (path.startsWith(fileURL))\n return path.substr(fileURL.length)\n\n if (cwd && path.startsWith(cwd))\n return path.substr(cwd.length + 1)\n\n if (home && path.startsWith(home))\n path = `~/${path.substr(home.length + 1)}`\n\n return path\n}\n\nfunction extractFileInfo(stackLine: string): string {\n const m = stackLine.match(/^\\s*at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/)\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return ''\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n * @returns\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n const stack = new Error('stack').stack || ''\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd)\n line = pathStripCwd(line)\n\n return line || ''\n}\n\nexport function getStack(): string {\n return new Error('stack').stack || ''\n}\n\nexport function getSourceLocationByPrecedingPattern(\n patterns: string[],\n stripCwd = true,\n) {\n let line = ''\n const stack = new Error('stack').stack || ''\n if (typeof stack === 'string') {\n const lines = stack.split('\\n').map(l => l.trim())\n // console.log(lines)\n const index = lines.findIndex(l => patterns.some(p => l.startsWith(p)))\n line = lines[index + 1]\n if (line)\n line = extractFileInfo(line)\n\n if (line && stripCwd)\n line = pathStripCwd(line)\n }\n return line\n}\n","import { valueToBoolean } from '../common'\nimport { Logger } from '../common/log'\nimport { toPath } from './env'\nimport { LoggerFileHandler } from './log-file'\nimport { LoggerNodeHandler } from './log-node'\n\nfunction setupLogContextNode() {\n const handlers = [\n LoggerNodeHandler({\n padding: 32,\n nameBrackets: false,\n // levelHelper: false,\n }),\n ]\n\n const logFilePath = process.env.ZEED_LOG ?? process.env.LOG\n const time = valueToBoolean(process.env.ZEED_TIME, true)\n const pretty = valueToBoolean(process.env.ZEED_PRETTY, false)\n if (logFilePath)\n handlers.unshift(LoggerFileHandler(toPath(logFilePath), { time, pretty }))\n\n Logger.setHandlers(handlers)\n}\n\n// todo sideffects\nsetupLogContextNode()\n"],"mappings":"moBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,wBAAAE,GAAA,8BAAAC,GAAA,qCAAAC,GAAA,4BAAAC,GAAA,YAAAC,GAAA,kBAAAC,GAAA,WAAAC,GAAA,QAAAC,EAAA,YAAAC,EAAA,gBAAAC,GAAA,gBAAAC,EAAA,iBAAAC,GAAA,aAAAC,EAAA,kBAAAC,GAAA,WAAAC,EAAA,yBAAAC,GAAA,kBAAAC,GAAA,sBAAAC,GAAA,wBAAAC,GAAA,sBAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,iCAAAC,GAAA,kBAAAC,GAAA,aAAAC,EAAA,WAAAC,GAAA,gBAAAC,GAAA,wBAAAC,GAAA,qBAAAC,GAAA,uBAAAC,GAAA,QAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,aAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,uBAAAC,GAAA,iBAAAC,EAAA,sBAAAC,GAAA,iBAAAC,GAAA,aAAAC,GAAA,aAAAC,GAAA,eAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,wBAAAC,GAAA,gBAAAC,GAAA,uBAAAC,GAAA,aAAAC,GAAA,6BAAAC,GAAA,uBAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,QAAAC,GAAA,YAAAC,GAAA,oBAAAC,GAAA,gBAAAC,GAAA,QAAAC,GAAA,gBAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,2BAAAC,GAAA,kBAAAC,GAAA,uBAAAC,GAAA,aAAAC,GAAA,sBAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,QAAAC,GAAA,WAAAC,GAAA,YAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,GAAA,iBAAAC,GAAA,gBAAAC,GAAA,aAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,aAAAC,GAAA,cAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,YAAAC,GAAA,iBAAAC,GAAA,aAAAC,GAAA,YAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,YAAAC,GAAA,cAAAC,GAAA,cAAAC,GAAA,8BAAAC,GAAA,oBAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,UAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,gBAAAC,GAAA,YAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,eAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,WAAAC,GAAA,eAAAC,GAAA,cAAAC,GAAA,0BAAAC,GAAA,+BAAAC,GAAA,qBAAAC,GAAA,cAAAC,GAAA,wBAAAC,GAAA,eAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,uBAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,kBAAAC,GAAA,YAAAC,GAAA,0BAAAC,GAAA,cAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,oBAAAC,GAAA,6BAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,8BAAAC,EAAA,sBAAAC,GAAA,wCAAAC,GAAA,aAAAC,GAAA,0BAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,cAAAC,GAAA,YAAAC,EAAA,cAAAC,GAAA,cAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,cAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,WAAAC,GAAA,sBAAAC,GAAA,aAAAC,GAAA,aAAAC,EAAA,YAAAC,GAAA,cAAAC,GAAA,gBAAAC,GAAA,cAAAC,EAAA,aAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,aAAAC,GAAA,cAAAC,GAAA,iBAAAC,GAAA,YAAAC,GAAA,qBAAAC,GAAA,kBAAAC,GAAA,sBAAAC,EAAA,wBAAAC,GAAA,qBAAAC,GAAA,SAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,cAAAC,GAAA,0BAAAC,GAAA,YAAAC,GAAA,iBAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,SAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,0BAAAC,GAAA,cAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,WAAAC,GAAA,aAAAC,GAAA,cAAAC,EAAA,QAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,qBAAAC,EAAA,aAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,0BAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,yBAAAC,GAAA,gBAAAC,GAAA,YAAAC,GAAA,iBAAAC,GAAA,2BAAAC,GAAA,aAAAC,GAAA,SAAAC,GAAA,UAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,uBAAAC,GAAA,SAAAC,GAAA,cAAAC,GAAA,kBAAAC,GAAA,aAAAC,GAAA,QAAAC,GAAA,aAAAC,GAAA,YAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,aAAAC,GAAA,gBAAAC,GAAA,WAAAC,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,YAAAC,GAAA,UAAAC,GAAA,4BAAAC,GAAA,uBAAAC,GAAA,UAAAC,GAAA,WAAAC,GAAA,aAAAC,GAAA,iBAAAC,EAAA,oBAAAC,GAAA,UAAAC,GAAA,eAAAC,GAAA,UAAAC,EAAA,iBAAAC,GAAA,kBAAAC,GAAA,YAAAC,EAAA,aAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,mBAAAC,EAAA,kBAAAC,GAAA,aAAAC,GAAA,uBAAAC,EAAA,YAAAC,GAAA,cAAAC,GAAA,WAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,SAAAC,EAAA,cAAAC,GAAA,YAAAC,GAAA,YAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,gBAAAC,GAAA,WAAAC,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,WAAAC,GAAA,cAAAC,KAAA,eAAAC,GAAAtT,ICUA,SAASuT,IAAiC,CACxC,GAAI,OAAO,KAAS,IAClB,OAAO,KACT,GAAI,OAAO,OAAW,IACpB,OAAO,OACT,GAAI,OAAO,OAAW,IACpB,OAAO,OACT,GAAI,OAAO,WAAe,IACxB,OAAO,WACT,MAAM,IAAI,MAAM,gCAAgC,CAClD,CAVSC,EAAAD,GAAA,WAYF,SAASE,IAAsC,CACpD,IAAMC,EAAWH,GAAQ,EACzB,OAAIG,EAAS,aAAe,OAC1BA,EAAS,YAAc,CAAC,GAEnBA,EAAS,WAClB,CANgBF,EAAAC,GAAA,oBCVT,SAASE,GAAyBC,EAAqC,CAC5E,OACEA,IAA2B,IACxBA,IAA2B,QAC3BA,IAA2B,KAC1B,OAAOA,GAA2B,UAAYA,IAA2B,EAE7EA,EAAyB,IAEzBA,IAA2B,IACxBA,IAA2B,SAC3BA,IAA2B,GAC3BA,IAA2B,KAC3BA,GAA0B,MAC1BA,IAA2B,QAC3BA,IAA2B,YAE9BA,EAAyB,GAEzBA,EAAyB,OAAOA,CAAsB,EAEjDA,CACT,CAtBgBC,EAAAF,GAAA,4BAyBhB,IAAMC,GAAiCD,GACrC,OAAO,QAAY,IACf,QAAQ,IAAI,MAAQ,QAAQ,IAAI,MAChC,OAAO,aAAiB,IACtB,aAAa,MAAQ,aAAa,MAClC,GACR,EAQO,SAASG,EACdC,EAAiBH,GACA,CACjB,IAAII,EACEC,EAAS,CAAC,EACVC,EAAS,CAAC,EAEhB,GAAI,CAACH,EACHC,EAAKH,EAAA,SAAUM,EAAe,CAC5B,MAAO,EACT,EAFK,cAIEJ,IAAW,IAClBC,EAAKH,EAAA,SAAUM,EAAe,CAC5B,MAAO,EACT,EAFK,UAIF,CACH,IAAI,EACEC,EAAQL,EAAO,MAAM,QAAQ,EAC7BM,EAAMD,EAAM,OAClB,IAAK,EAAI,EAAG,EAAIC,EAAK,IAAK,CACxB,GAAI,CAACD,EAAM,CAAC,EAEV,SAEF,IAAME,EAAWF,EAAM,CAAC,EAAE,QAAQ,MAAO,KAAK,EAC1CE,EAAS,CAAC,IAAM,IAClBL,EAAO,KAAK,IAAI,OAAO,IAAIK,EAAS,OAAO,CAAC,IAAI,CAAC,EAEjDJ,EAAO,KAAK,IAAI,OAAO,IAAII,IAAW,CAAC,EAG3CN,EAAKH,EAAA,SAAUU,EAAc,CAC3B,GAAIN,EAAO,SAAW,GAAKC,EAAO,SAAW,EAC3C,MAAO,GAET,IAAIM,EAAGH,EACP,IAAKG,EAAI,EAAGH,EAAMJ,EAAO,OAAQO,EAAIH,EAAKG,IACxC,GAAIP,EAAOO,CAAC,EAAE,KAAKD,CAAI,EACrB,MAAO,GAEX,IAAKC,EAAI,EAAGH,EAAMH,EAAO,OAAQM,EAAIH,EAAKG,IACxC,GAAIN,EAAOM,CAAC,EAAE,KAAKD,CAAI,EACrB,MAAO,GAEX,MAAO,EACT,EAdK,MAgBP,OAAAP,EAAG,OAASE,EACZF,EAAG,OAASC,EACZD,EAAG,OAASD,EACLC,CACT,CArDgBH,EAAAC,EAAA,sBAwDhB,IAAMW,GACF,OAAO,QAAY,IACjB,QAAQ,IAAI,YAAc,QAAQ,IAAI,OAAS,QAAQ,IAAI,YAC3D,OAAO,aAAiB,IACtB,aAAa,YAAc,aAAa,OAAS,aAAa,YAC9D,OAED,SAASC,GAAcX,EAAqC,CACjE,GAAIA,IAAW,GACb,WACF,GAAI,OAAOA,GAAW,SACpB,OAAOA,EACT,GAAI,OAAOA,GAAW,SAAU,CAC9B,IAAMY,EAAIC,GAAcb,EAAO,kBAAkB,EAAE,KAAK,CAAC,EACzD,GAAIY,GAAK,KACP,OAAOA,EAEX,QACF,CAXgBd,EAAAa,GAAA,iBAaT,SAASG,EACdd,EAAwDU,GAC1B,CAC9B,IAAMK,EAAcJ,GAAcX,CAAM,EACxC,OAAOgB,GAASA,GAASD,CAC3B,CALgBjB,EAAAgB,EAAA,kBChHT,SAASG,GAAqBC,EAAyB,CAAC,EAAe,CAC5E,GAAM,CACJ,MAAAC,EAAQ,OACR,OAAAC,EAAS,MAKX,EAAIF,EACEG,EAAmBC,EAAmBF,CAAM,EAC5CG,EAAeC,EAAeL,CAAK,EACzC,OAAQM,GAAoB,CAG1B,GAFI,CAACF,EAAaE,EAAI,KAAK,GAEvB,CAACJ,EAAiBI,EAAI,IAAI,EAC5B,OACF,IAAMC,EAAOD,EAAI,KAAO,IAAIA,EAAI,QAAU,GAC1C,OAAQA,EAAI,MAAO,CACjB,OACE,QAAQ,KAAK,SAASC,IAAQ,GAAGD,EAAI,QAAQ,EAC7C,MACF,OACE,QAAQ,KAAK,SAASC,IAAQ,GAAGD,EAAI,QAAQ,EAC7C,MACF,OACE,QAAQ,MAAM,SAASC,IAAQ,GAAGD,EAAI,QAAQ,EAC9C,MACF,QACE,QAAQ,MAAM,SAASC,IAAQ,GAAGD,EAAI,QAAQ,EAC9C,KACJ,CACF,CACF,CAhCgBE,EAAAV,GAAA,wBCVT,IAAKW,OACVA,IAAA,IAAM,IAAN,MACAA,IAAA,MAAQ,GAAR,QACAA,IAAA,eACAA,IAAA,eACAA,IAAA,iBACAA,IAAA,iBACAA,IAAA,IAAM,KAAN,MAPUA,OAAA,IAUCC,GAA0C,CACrD,IAAK,GACL,EAAK,GACL,IAAO,GACP,EAAK,EACL,IAAO,EACP,MAAS,EACT,EAAK,EACL,IAAO,EACP,KAAQ,EACR,EAAK,EACL,KAAQ,EACR,QAAW,EACX,EAAK,EACL,IAAO,EACP,MAAS,EACT,MAAS,EACT,IAAO,IACP,IAAK,GACP,EAmGO,SAASC,GAAcC,EAAU,GAA4B,CAClE,IAAIC,EAA4B,CAACC,GAAqB,CAAC,EACnDC,EAAoBC,EAACC,GAAkB,GAAnB,qBACpBC,EAAU,GACVC,EAAaC,EACbC,EAAW,GAEf,SAASD,EACPE,EAAO,GACPC,EACiB,CACjB,IAAMC,EAAWC,GAAcF,GAAS,EAAY,EAEpD,SAASG,EAAkBC,EAAmBC,EAAS,CACrD,OAAIJ,GAAYG,EACPC,EACF,IAAM,CAAC,CAChB,CAJSZ,EAAAU,EAAA,qBAMT,IAAMG,EAAMH,EAAkB,EAAgB,IAAII,IAAoB,CAEpEC,EAAK,CACH,KAAAT,EACA,SAAAQ,EACA,MAAO,CACT,CAAC,CACH,CAAC,EAEDD,EAAI,MAAQP,EAGZO,EAAI,OAAS,SAAUG,EAAiC,CACtD,OAAOb,EAAWG,EAAO,GAAGA,KAAQU,IAAWA,CAAM,CACvD,EAEA,IAAMD,EAAOf,EAACiB,GAAoB,CAGhC,GAAIlB,EAAkBO,CAAI,EACxB,QAAWY,KAAWrB,EAChBqB,GACFA,EAAQD,CAAG,CAKnB,EAXa,QAab,OAAAJ,EAAI,MAAQH,EAAkB,EAAgB,IAAII,IAAoB,CACpEC,EAAK,CAAE,KAAAT,EAAM,SAAAQ,EAAU,MAAO,CAAe,CAAC,CAChD,CAAC,EAEDD,EAAI,KAAOH,EAAkB,EAAe,IAAII,IAAoB,CAClEC,EAAK,CAAE,KAAAT,EAAM,SAAAQ,EAAU,MAAO,CAAc,CAAC,CAC/C,CAAC,EAEDD,EAAI,KAAOH,EAAkB,EAAe,IAAII,IAAoB,CAClEC,EAAK,CAAE,KAAAT,EAAM,SAAAQ,EAAU,MAAO,CAAc,CAAC,CAC/C,CAAC,EAEDD,EAAI,MAAQH,EAAkB,EAAgB,IAAII,IAAoB,CACpEC,EAAK,CAAE,KAAAT,EAAM,SAAAQ,EAAU,MAAO,CAAe,CAAC,CAChD,CAAC,EAEDD,EAAI,MAAQH,EAAkB,EAAgB,IAAII,IAAoB,CACpE,MAAAC,EAAK,CAAE,KAAAT,EAAM,SAAAQ,EAAU,MAAO,CAAe,CAAC,EACxC,IAAI,MAAM,GAAGA,EAAS,IAAI,MAAM,EAAE,KAAK,GAAG,GAAG,CACrD,CAAC,EAEDD,EAAI,OAASH,EAAkB,EAAgB,CAACS,KAAkBC,IAAc,CACzED,GACHN,EAAI,MAAM,GAAGO,CAAI,CACrB,CAAC,EAEMP,CACT,CApESb,EAAAI,EAAA,qBAsET,SAASiB,EACPf,EAAO,GACPC,EACiB,CACjB,IAAMM,EAAMV,EAAWG,EAAMC,CAAK,EAClC,OAAIF,GACFQ,EAAI,MAAM,uBAAuBP,gBAAmBb,EAASoB,EAAI,KAAK,KAAK,EACtEA,CACT,CARS,OAAAb,EAAAqB,EAAA,UAUTA,EAAO,gBAAkB,SAAUH,EAAqB,CACtDrB,EAAY,KAAKqB,CAAO,CAC1B,EAGAG,EAAO,UAAY,SAAUC,EAAoB,CAC/CvB,EAAoBwB,EAAmBD,CAAU,CACnD,EAEAD,EAAO,QAAU,CAACG,EAAO,KAAUtB,EAAUsB,EAE7CH,EAAO,SAAW,CAACI,EAAQ,KAAUpB,EAAWoB,EAEhDJ,EAAO,YAAc,SAAUK,EAAyB,CAAC,EAAG,CACtDvB,IAAeC,IACjBD,EAAaC,GAEX,CAAAF,IAEJL,EAAc,CAAC,GAAG6B,CAAQ,EAAE,OAAOC,GAAK,OAAOA,GAAM,UAAU,EACjE,EAEAN,EAAO,MAAQ,GAGfA,EAAO,YAAc,SAAUd,EAAkB,GAAc,CACzDL,IAEJmB,EAAO,MAAQd,EACjB,EAEAc,EAAO,WAAa,SAClBO,EACM,CACF1B,IAEJC,EAAayB,EACf,EAEOP,CACT,CA/HgBrB,EAAAL,GAAA,iBC5HhB,IAAIkC,EAQJ,SAASC,IAAmB,CAC1B,IAAMC,EAASC,GAAc,EAC7B,OAAAD,EAAO,YAAY,CAACE,GAAqB,CAAC,CAAC,EACpCF,CACT,CAJSG,EAAAJ,GAAA,oBAMF,SAASK,IAA0C,CACxD,GAAIN,GAAgB,KAClB,GAAI,CACF,IAAMO,EAAWC,GAAiB,EAC9BD,GAAY,KACVA,GAAU,QAAU,MACtBP,EAAeC,GAAiB,EAChCM,EAAS,OAASP,GAGlBA,EAAeO,EAAS,OAI1BP,EAAeC,GAAiB,CAEpC,MACA,CACED,EAAeC,GAAiB,CAClC,CAEF,OAAOD,CACT,CAtBgBK,EAAAC,GAAA,mBAyBT,IAAMG,EAASH,GAAgB,EC9CtC,IAAMI,GAAkBC,EAAA,CAACC,EAAaC,IACnCA,aAAiB,QAAU,CAAE,MAAM,QAAQA,CAAK,EAC7C,OAAO,KAAKA,CAAK,EAChB,KAAK,EAEL,OAAO,CAACC,EAAaF,KAEpBE,EAAOF,CAAG,EAAIC,EAAMD,CAAG,EAChBE,GACN,CAAC,CAAC,EACLD,EAVkB,mBAajB,SAASE,GACdC,EACAC,EAA6B,OAC7B,CACA,OAAO,KAAK,UAAUD,EAAKN,GAAiBO,CAAM,CACpD,CALgBN,EAAAI,GAAA,uBAWhB,SAASG,GAAWC,EAA0BC,EAAgC,CAC5E,IAAMC,EAAe,CAAC,EAChBC,EAAiB,CAAC,EAExB,OAAIF,GAAiB,OACnBA,EAAgBT,EAAA,SAAUC,EAAKC,EAAO,CACpC,OAAIQ,EAAM,CAAC,IAAMR,EACR,eAEP,eAAeS,EAAK,MAAM,EAAGD,EAAM,QAAQR,CAAK,CAAC,EAAE,KAAK,GAAG,IAE/D,EANgB,kBASX,SAAgCD,EAAaC,EAAiB,CACnE,GAAIQ,EAAM,OAAS,EAAG,CACpB,IAAME,EAAUF,EAAM,QAAQ,IAAI,EAClC,CAACE,EAAUF,EAAM,OAAOE,EAAU,CAAC,EAAIF,EAAM,KAAK,IAAI,EACtD,CAACE,EAAUD,EAAK,OAAOC,EAAS,IAAUX,CAAG,EAAIU,EAAK,KAAKV,CAAG,EAC1D,CAACS,EAAM,QAAQR,CAAK,IACtBA,EAAQO,GAAe,KAAK,KAAMR,EAAKC,CAAK,QAG9CQ,EAAM,KAAKR,CAAK,EAGlBA,EAAQH,GAAgBE,EAAKC,CAAK,EAElC,GAAI,CACF,OAAOM,GAAY,KAAON,EAAQM,EAAS,KAAK,KAAMP,EAAKC,CAAK,CAClE,MACA,CAAc,CACd,OAAO,OAAOA,CAAK,CACrB,CACF,CAlCSF,EAAAO,GAAA,cAuCF,SAASM,EACdR,EACAG,EACAM,EACAL,EACQ,CAER,OAAO,KAAK,UAAUJ,EAAKE,GAAWC,EAAUC,CAAa,EAAGK,CAAM,CACxE,CARgBd,EAAAa,EAAA,qBAUT,IAAME,GAAgBF,ECrE7B,IAAMG,GAAMC,EAAO,WAAY,OAAO,EAM/B,SAASC,GAAoBC,EAAyB,CAC3D,IAAMC,EAAgB,SAAS,mBAAmBD,CAAG,CAAC,EAChDE,EAAMD,EAAc,OACpBE,EAAM,IAAI,WAAWD,CAAG,EAC9B,QAAS,EAAI,EAAG,EAAIA,EAAK,IACvBC,EAAI,CAAC,EAAIF,EAAc,YAAY,CAAC,GAAK,EAE3C,OAAOE,CACT,CARgBC,EAAAL,GAAA,uBAUT,SAASM,GAAoBF,EAAiB,CACnD,IAAIG,EAAeH,EAAI,OACnBF,EAAgB,GAChBM,EAAS,EACb,KAAOD,EAAe,GAAG,CACvB,IAAME,EAAUF,EAAe,IAAQA,EAAe,IAChDG,EAAQN,EAAI,SAASI,EAAQA,EAASC,CAAO,EACnDD,GAAUC,EAGVP,GAAiB,OAAO,cAAc,MAAM,KAAMQ,CAAK,EACvDH,GAAgBE,EAElB,OAAO,mBAAmB,OAAOP,CAAa,CAAC,CACjD,CAdgBG,EAAAC,GAAA,uBAgBhB,IAAIK,GAEG,SAASC,GAAmBC,EAA0B,CAC3D,GAAIF,IAAgB,OAClBA,GAAeX,GACX,OAAO,YAAgB,KAAa,CACtC,IAAMc,EAAU,IAAI,YACpBH,GAAeN,EAAAU,GAAQD,EAAQ,OAAOC,CAAI,EAA3B,gBAGnB,OAAOJ,GAAaE,EAAK,UAAU,KAAK,CAAC,CAC3C,CATgBR,EAAAO,GAAA,sBAWhB,IAAII,GAEG,SAASC,GAAmBC,EAAyB,CAC1D,GAAIF,IAAgB,OAClBA,GAAeV,GACX,OAAO,YAAgB,KAAa,CACtC,IAAMa,EAAU,IAAI,YAAY,QAAS,CAAE,UAAW,EAAK,CAAC,EAC5DH,GAAeX,EAAAU,GAAQI,EAAQ,OAAOJ,CAAI,EAA3B,gBAGnB,OAAOC,GAAaE,CAAG,EAAE,UAAU,KAAK,CAC1C,CATgBb,EAAAY,GAAA,sBAWT,SAASG,EAAaL,EAA4B,CACvD,OAAIA,aAAgB,YACX,IAAI,WAAWA,CAAI,EACxB,OAAOA,GAAS,SACXH,GAAmBG,CAAI,EAC5BA,EAAK,OACA,IAAI,WAAWA,CAAI,EACrBA,CACT,CARgBV,EAAAe,EAAA,gBAUT,SAASC,MAAoBC,EAAiC,CACnE,IAAIC,EAAS,EACPC,EAAOF,EAAK,KAAK,CAAC,EAAE,IAAKG,GAAM,CACnC,IAAMC,EAAIN,EAAaK,CAAa,EACpC,OAAAF,GAAUG,EAAE,OACLA,CACT,CAAC,EACKR,EAAM,IAAI,WAAWK,CAAM,EAC7BI,EAAS,EACb,QAAWD,KAAKF,EACdN,EAAI,IAAIQ,EAAGC,CAAM,EACjBA,GAAUD,EAAE,OAEd,OAAOR,CACT,CAdgBb,EAAAgB,GAAA,oBAgBT,SAASO,GAAMV,EAAuB,CAC3C,GAAI,OAAO,OAAW,IACpB,OAAO,OAAO,KAAKE,EAAaF,CAAG,CAAC,EAAE,SAAS,KAAK,EACtD,IAAMW,EAAI,mBACNC,EAAI,GACR,QAAWC,IAAK,CAAC,GAAGX,EAAaF,CAAG,CAAC,EACnCY,GAAKD,EAAEE,GAAK,CAAC,EAAIF,EAAEE,EAAI,EAAE,EAC3B,OAAOD,CACT,CARgBzB,EAAAuB,GAAA,SAUT,SAASI,GAAQC,EAA+B,CACrD,OAAO,WAAW,KAChBA,EAAU,MAAM,SAAS,EAAG,IAAIC,GAAQ,SAASA,EAAM,EAAE,CAAC,CAC5D,CACF,CAJgB7B,EAAA2B,GAAA,WAOT,SAASG,GAASjB,EAAekB,EAAe,GAAe,CACpE,IAAM1B,EAAQU,EAAaF,CAAG,EAC1BmB,EAAK,GACT,GAAI,OAAO,OAAW,IACpBA,EAAK,OAAO,KAAK3B,CAAK,EAAE,SAAS,QAAQ,MAEtC,CACH,IAAIoB,EAAI,GACR,QAASQ,EAAI,EAAGA,EAAI5B,EAAM,WAAY4B,IACpCR,GAAK,OAAO,aAAapB,EAAM4B,CAAC,CAAC,EACnCD,EAAK,KAAKP,CAAC,EAEb,OAAIM,EACKC,EAAG,WAAW,IAAK,EAAE,EACvBA,CACT,CAfgBhC,EAAA8B,GAAA,YAiBT,SAASI,GAAYrB,EAAuB,CACjD,IAAMR,EAAQU,EAAaF,CAAG,EAC9B,GAAI,OAAO,OAAW,IACpB,OAAO,OAAO,KAAKR,CAAK,EAAE,SAAS,WAAW,EAAE,WAAW,IAAK,EAAE,EACpE,IAAIoB,EAAI,GACR,QAASQ,EAAI,EAAGA,EAAI5B,EAAM,WAAY4B,IACpCR,GAAK,OAAO,aAAapB,EAAM4B,CAAC,CAAC,EACnC,OAAO,KAAKR,CAAC,EAAE,WAAW,IAAK,GAAG,EAAE,WAAW,IAAK,GAAG,EAAE,WAAW,IAAK,EAAE,CAC7E,CARgBzB,EAAAkC,GAAA,eAUT,SAASC,GAAWV,EAAuB,CAEhD,GADAA,EAAIA,EAAE,WAAW,IAAK,GAAG,EAAE,WAAW,IAAK,GAAG,EAC1C,OAAO,OAAW,IAAa,CACjC,IAAM1B,EAAM,OAAO,KAAK0B,EAAG,QAAQ,EACnC,OAAO,IAAI,WAAW1B,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAElE,IAAMqC,EAAI,KAAKX,CAAC,EACVpB,EAAQ,IAAI,WAAW+B,EAAE,MAAM,EACrC,QAASH,EAAI,EAAGA,EAAIG,EAAE,OAAQH,IAC5B5B,EAAM4B,CAAC,EAAIG,EAAE,WAAWH,CAAC,EAC3B,OAAO5B,CACT,CAXgBL,EAAAmC,GAAA,cAaT,SAASE,GAAiBZ,EAAmB,CAClD,OAAOb,GAAmBuB,GAAWV,CAAC,CAAC,CACzC,CAFgBzB,EAAAqC,GAAA,oBAKT,SAASC,GACdF,EACAf,EACS,CACT,GAAIe,EAAE,aAAef,EAAE,WACrB,MAAO,GACT,IAAMkB,EAAKxB,EAAaqB,CAAC,EACnBI,EAAKzB,EAAaM,CAAC,EACzB,QAAS,EAAI,EAAG,EAAIkB,EAAG,OAAQ,IAC7B,GAAIA,EAAG,CAAC,IAAMC,EAAG,CAAC,EAChB,MAAO,GAEX,MAAO,EACT,CAbgBxC,EAAAsC,GAAA,eAeT,SAASG,GAAiBC,EAA+B,CAC9D,GAAI,CACF,OAAOnC,GAAmBoC,EAAkBD,CAAI,CAAC,CACnD,OACOE,EAAP,CACE,MAAAnD,GAAI,KAAK,mBAAoBiD,CAAI,EAC3BE,CACR,CACF,CARgB5C,EAAAyC,GAAA,oBAUT,SAASI,GAA0BnC,EAA6B,CACrE,GAAI,CACF,OAAO,KAAK,MAAME,GAAmBF,CAAI,CAAC,CAC5C,OACOkC,EAAP,CACE,MAAAnD,GAAI,KAAK,mBAAoBiB,CAAI,EAC3BkC,CACR,CACF,CARgB5C,EAAA6C,GAAA,oBAWT,SAASC,GACdC,EACAC,EACA,CACA,GAAI,OAAOD,GAAW,SAIjB,GAAIA,aAAkB,aAAeA,EAAO,aAAe,OAE9DA,EAAS,OAAO,aAAa,MAC3B,OACA,CAAC,EAAE,MAAM,KAAK,IAAI,WAAWA,CAAM,CAAC,CACtC,UAEO,MAAM,QAAQA,CAAM,EAE3BA,EAAS,OAAO,aAAa,MAAM,OAAQA,CAAM,UAE1CA,EAAO,cAAgB,WAE9BA,EAAS,OAAO,aAAa,MAAM,OAAQ,CAAC,EAAE,MAAM,KAAKA,CAAM,CAAC,MAIhE,OAAO,GAGTC,EAAYA,GAAa,GACzB,IAAMC,EAAQ,CAAC,EACTC,EAAM,mBACZ,QAAS7B,EAAI,EAAGA,EAAI0B,EAAO,OAAQ1B,GAAK2B,EAAW,CACjD,IAAMG,EAAQJ,EAAO,MAAM1B,EAAG,KAAK,IAAIA,EAAI2B,EAAWD,EAAO,MAAM,CAAC,EAC9DK,EAAQ,OAAO/B,EAAE,SAAS,EAAE,IAAK,MAAM,EAAE,EAC3CgC,EAAQF,EACT,MAAM,EAAE,EACR,IAAKG,GAAY,CAChB,IAAMC,EAAOD,EAAG,WAAW,CAAC,EAC5B,MAAO,IAAIJ,GAAK,IAAOK,IAAS,CAAC,IAAIL,EAAI,GAAOK,CAAI,GACtD,CAAC,EACA,KAAK,EAAE,EACVF,GAAS,MAAM,OAAOL,EAAYG,EAAM,MAAM,EAC9C,IAAIK,EAAQL,EAAM,QAAQ,mBAAoB,GAAG,EACjDK,GAAS,IAAI,OAAOR,EAAYG,EAAM,MAAM,EAC5CF,EAAM,KAAK,GAAGG,KAAQC,MAAUG,GAAO,EAEzC,OAAOP,EAAM,KAAK;AAAA,CAAI,CACxB,CA/CgBjD,EAAA8C,GAAA,uBCxLT,SAASW,EAAiBC,EAAS,GAAgB,CACxD,IAAMC,EAAc,IAAI,WAAWD,CAAM,EACzC,GAAI,OAAO,OAAW,KAAe,OAAO,gBAC1C,OAAO,gBAAgBC,CAAW,MAKlC,SAASC,EAAI,EAAGA,EAAIF,EAAQE,IAG1BD,EAAYC,CAAC,EAAI,KAAK,MAAM,KAAK,OAAO,EAAI,GAAK,EAGrD,OAAOD,CACT,CAfgBE,EAAAJ,EAAA,oBAiBT,IAAMK,GAA0B,UAC1BC,GAAqB,UACrBC,GAA4B,SAC5BC,GAAmC,IAEhD,eAAsBC,GACpBC,EACAC,EAAiCN,GACZ,CACrB,OAAOO,EACL,MAAM,OAAO,OAAO,OAAOD,EAAWC,EAAaF,CAAO,CAAC,CAC7D,CACF,CAPsBN,EAAAK,GAAA,UAStB,eAAsBI,GACpBC,EACAC,EAGI,CAAC,EACe,CACpB,IAAMC,EAAeJ,EAAaE,CAAM,EAClCG,EAAc,MAAM,OAAO,OAAO,UACtC,MACAD,EACAT,GACA,GACA,CAAC,WAAW,CACd,EACA,OAAO,MAAM,OAAO,OAAO,UACzB,CACE,KAAMA,GACN,KAAMQ,EAAI,KAAOH,EAAaG,EAAI,IAAI,EAAI,IAAI,WAAW,CAAC,EAC1D,WAAYA,EAAI,YAAcP,GAC9B,KAAMH,EACR,EACAY,EACA,CACE,KAAMX,GACN,OAAQ,GACV,EACA,GACA,CAAC,UAAW,SAAS,CACvB,CACF,CA9BsBF,EAAAS,GAAA,mBAgCtB,IAAMK,GAAW,IAAI,WAAW,CAAC,EAAG,CAAC,CAAC,EAEtC,eAAsBC,GACpBC,EACAC,EACqB,CACrB,IAAMC,EAAKtB,EAAiB,EAAE,EACxBuB,EAAS,MAAM,OAAO,OAAO,QACjC,CAAE,KAAMjB,GAAoB,GAAAgB,CAAG,EAC/BD,EACAD,CACF,EACMI,EAAY,IAAI,WAAWD,CAAM,EACjCE,EAAeP,GAAS,OAASI,EAAG,OAASE,EAAU,OACvDE,EAAS,IAAI,WAAWD,CAAY,EACtCE,EAAM,EACV,OAAAD,EAAO,IAAIR,GAAUS,CAAG,EACxBA,GAAOT,GAAS,OAChBQ,EAAO,IAAIJ,EAAIK,CAAG,EAClBA,GAAOL,EAAG,OACVI,EAAO,IAAIF,EAAWG,CAAG,EAClBD,CACT,CApBsBtB,EAAAe,GAAA,WAsBtB,eAAsBS,GACpBR,EACAC,EACqB,CACrB,IAAMQ,EAAQT,EAAK,SAAS,EAAG,CAAC,EAChC,GAAI,CAACU,GAAYD,EAAOX,EAAQ,EAC9B,OAAO,QAAQ,OAAO,IAAI,MAAM,iBAAiBW,GAAO,CAAC,EAE3D,IAAMP,EAAKF,EAAK,SAAS,EAAG,EAAI,EAAE,EAC5BG,EAASH,EAAK,SAAS,EAAI,GAAIA,EAAK,MAAM,EAC1CW,EAAQ,MAAM,OAAO,OAAO,QAChC,CAAE,KAAMzB,GAAoB,GAAAgB,CAAG,EAC/BD,EACAE,CACF,EACA,OAAO,IAAI,WAAWQ,CAAK,CAC7B,CAhBsB3B,EAAAwB,GAAA,WC3Ff,SAASI,IAA0B,CACxC,OAAO,OAAO,gBAAgB,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,EAAI,UACzD,CAFgBC,EAAAD,GAAA,mBAIT,SAASE,GAAoC,CAClD,OAAO,OAAO,OAAW,IAAcF,GAAgB,EAAI,KAAK,OAAO,CACzE,CAFgBC,EAAAC,EAAA,6BAIT,SAASC,GAAcC,EAAO,IAAe,CAClD,OAAOF,EAA0B,EAAIE,CACvC,CAFgBH,EAAAE,GAAA,iBAKT,SAASE,GAAUC,EAAM,IAAKC,EAAM,EAAW,CACpD,OAAOA,EAAM,KAAK,MAAML,EAA0B,GAAKI,EAAMC,EAAI,CACnE,CAFgBN,EAAAI,GAAA,aAIT,SAASG,GAAYF,EAAM,IAAKC,EAAM,EAAW,CACtD,OAAOA,EAAML,EAA0B,GAAKI,EAAMC,EACpD,CAFgBN,EAAAO,GAAA,eAIT,SAASC,GAAQF,EAAaG,EAAeJ,EAAqB,CACvE,OAAO,KAAK,IAAIC,EAAK,KAAK,IAAID,EAAKI,CAAK,CAAC,CAC3C,CAFgBT,EAAAQ,GAAA,WAKT,SAASE,GAAIC,EAAyB,CAC3C,OAAOA,EAAM,OAAO,CAACC,EAAKH,IAAUG,EAAMH,EAAO,CAAC,CACpD,CAFgBT,EAAAU,GAAA,OAKT,SAASG,GAAIF,EAAyB,CAC3C,OAAOD,GAAIC,CAAK,EAAIA,EAAM,MAC5B,CAFgBX,EAAAa,GAAA,OAQT,SAASC,GAAUL,EAAwB,CAChD,MAAO,CAAC,mBAAmB,KAAK,IAAI,OAAOA,CAAK,CAAC,CACnD,CAFgBT,EAAAc,GAAA,aAIT,SAASC,GAAQN,EAAwB,CAC9C,QAASO,EAAI,EAAGA,EAAIP,EAAOO,IACzB,GAAIP,EAAQO,IAAM,EAChB,MAAO,GAEX,OAAOP,EAAQ,CACjB,CANgBT,EAAAe,GAAA,WAWhB,IAAIE,GAAQ,EAGL,SAASC,GAAab,EAAM,EAAGC,EAAM,EAAGa,EAAe,CAC5DF,KAAUE,GAAQF,IAAS,KAAO,OAAS,OAC3C,IAAMG,EAAMH,GAAQ,OACpB,OAAOX,EAAMc,GAAOf,EAAMC,EAC5B,CAJgBN,EAAAkB,GAAA,gBCvDT,SAASG,GAAaC,EAAQ,GAKnC,CACA,GAAI,CAACC,EAAQ,GAAIC,EAAU,KAAK,EAAIF,EAAM,MAAM,GAAG,EACnD,OAAAE,EAAUA,EAAQ,YAAY,EACvB,CACL,MAAAD,EACA,QAAAC,EACA,IAAKA,IAAY,OACjB,KAAMA,IAAY,MACpB,CACF,CAdgBC,EAAAJ,GAAA,gBAgBT,SAASK,GAAeH,EAAeI,EAAM,GAAc,CAChE,MAAO,GAAGJ,KAASI,EAAM,MAAQ,QACnC,CAFgBF,EAAAC,GAAA,kBAKT,SAASE,GAAIC,EAAQC,EAAQH,EAAM,GAAkB,CAC1D,IAAMI,EAAKF,GAAK,EACVG,EAAKF,GAAK,EAChB,OAAOC,EAAKC,EAAML,EAAM,EAAI,GAAMI,EAAKC,EAAML,EAAM,GAAK,EAAK,CAC/D,CAJgBF,EAAAG,GAAA,OAOT,SAASK,GAAiBC,KAAgBV,EAAwB,CACvE,GAAIA,EAAQ,OAAS,EAAG,CACtB,IAAMW,EAAcX,EAAQ,IAAIH,EAAY,EAKtCe,EAAa,MAAM,KAAKF,CAAM,EACpC,OAAAE,EAAW,KAAK,CAACP,EAAQC,IAAmB,CAC1C,OAAW,CAAE,MAAAP,EAAO,IAAAI,CAAI,IAAKQ,EAAa,CACxC,IAAME,EAAST,GAAIC,EAAEN,CAAK,EAAGO,EAAEP,CAAK,EAAGI,CAAG,EAC1C,GAAIU,IAAW,EACb,OAAOA,EAEX,MAAO,EAIT,CAAC,EACMD,EAET,OAAOF,CACT,CAtBgBT,EAAAQ,GAAA,iBCtBT,SAASK,GAAeC,EAAa,CAC1C,OAAOA,EAAE,OAAO,CAACC,EAAQC,IAAeF,EAAE,QAAQC,CAAC,IAAMC,CAAK,CAChE,CAFgBC,EAAAJ,GAAA,eAIT,SAASK,GAAcJ,EAAQK,EAAa,CACjD,OAAON,GAAYC,EAAE,OAAQ,GAAW,CAACK,EAAE,SAAS,CAAC,CAAC,CAAC,CACzD,CAFgBF,EAAAC,GAAA,cAIT,SAASE,MAAiBC,EAAe,CAC9C,OAAOR,GAAYQ,EAAE,OAAO,CAACC,EAAW,CAAC,EAAGC,IAAUD,EAAI,OAAOC,CAAK,EAAG,CAAC,CAAC,CAAC,CAC9E,CAFgBN,EAAAG,GAAA,cAKT,SAASI,KAAmBC,EAA6B,CAC9D,OAAQA,EAAa,KAAK,GAAQ,CACpC,CAFgBR,EAAAO,EAAA,gBAIT,SAASE,GAAqBZ,EAAQK,EAAa,CACxD,OAAON,GAAeC,CAAC,EAAE,OAAQ,GAAWK,EAAE,SAAS,CAAC,CAAC,CAC3D,CAFgBF,EAAAS,GAAA,qBAIT,SAASC,GAA4Bb,EAAQK,EAAa,CAC/D,OAAOD,GAAWE,GAAWN,EAAGK,CAAC,EAAGO,GAAkBZ,EAAGK,CAAC,CAAC,CAE7D,CAHgBF,EAAAU,GAAA,4BAST,SAASC,GAAsBC,EAAUC,EAAY,CAC1D,GAAID,GAAO,MAAM,QAAQA,CAAG,EAAG,CAC7B,IAAIb,EACJ,MAAQA,EAAQa,EAAI,QAAQC,CAAE,KAAO,IAEnCD,EAAI,OAAOb,EAAO,CAAC,EAGrB,OAAOa,EAGT,MAAO,CAAC,CACV,CAZgBZ,EAAAW,GAAA,sBAeT,SAASG,GAAmBF,EAAUC,EAAY,CACvD,OAAKD,EAAI,SAASC,CAAE,GAClBD,EAAI,KAAKC,CAAE,EACND,CACT,CAJgBZ,EAAAc,GAAA,mBAOT,SAASC,GAAsBC,EAAYC,EAA6B,CAC7E,OAAAD,EAAM,OAAO,EAAGA,EAAM,OAAQ,GAAGA,EAAM,OAAOC,CAAE,CAAC,EAC1CD,CACT,CAHgBhB,EAAAe,GAAA,sBAMT,SAASG,GAAsBF,EAAYH,EAAY,CAC5D,IAAMd,EAAQiB,EAAM,UAAUG,GAAKA,IAAMN,CAAE,EAC3C,OAAId,GAAS,EACXiB,EAAM,OAAOjB,EAAO,CAAC,EAClBiB,EAAM,KAAKH,CAAE,EACXG,CACT,CANgBhB,EAAAkB,GAAA,sBAQT,SAASE,GAAqBJ,EAAiB,CACpD,OAAAA,EAAM,OAAO,EAAGA,EAAM,MAAM,EACrBA,CACT,CAHgBhB,EAAAoB,GAAA,qBAKT,SAASC,GACdT,EACAU,EAA6CC,GACxC,CACL,OAAO,MAAM,KAAKX,CAAG,EAAE,KAAKU,CAAI,CAClC,CALgBtB,EAAAqB,GAAA,eAOT,SAASG,GAAmBZ,EAAyB,CAC1D,OAAOS,GAAYT,EAAK,CAACa,EAAWC,IAAcD,EAAIC,CAAC,CACzD,CAFgB1B,EAAAwB,GAAA,sBAIT,SAASG,GAAgBC,EAAaC,EAAsB,CACjE,OACED,EAAO,SAAWC,EAAO,QACtBD,EAAO,MAAM,CAACtB,EAAOP,IAAUO,IAAUuB,EAAO9B,CAAK,CAAC,CAE7D,CALgBC,EAAA2B,GAAA,gBAOT,SAASG,GAAuBd,EAAiB,CACtD,OAAAA,EAAM,KAAK,IAAOe,EAA0B,EAAI,GAAM,EAAI,EAAG,EAQtDf,CACT,CAVgBhB,EAAA8B,GAAA,uBAYT,SAASE,GAAgBhB,EAAiB,CAC/C,OAAOc,GAAoB,MAAM,KAAKd,CAAK,CAAC,CAC9C,CAFgBhB,EAAAgC,GAAA,gBAKT,SAASC,GAAqBjB,EAAiB,CACpD,KAAOA,EAAM,OAAS,GAAG,CACvB,IAAMkB,EAAO,MAAM,KAAKlB,CAAK,EAE7B,GADAc,GAAoBI,CAAI,EACpB,CAACP,GAAaX,EAAOkB,CAAI,EAC3B,OAAOA,EAEX,OAAOlB,CACT,CARgBhB,EAAAiC,GAAA,qBAUT,SAASE,GAAsBnB,EAAe,CACnD,OAAOA,EAAM,KAAK,MAAMe,EAA0B,EAAIf,EAAM,MAAM,CAAC,CACrE,CAFgBhB,EAAAmC,GAAA,sBAIT,SAASC,MAAepB,EAA4B,CAEzD,OAAOT,EAAaS,CAAK,EAAE,OACzB,CAACX,EAAKC,IAAWD,GAAO,KAAQC,EAAQD,EAAMC,EAAQD,EAAOC,EAC7D,MACF,CACF,CANgBN,EAAAoC,GAAA,YAQT,SAASC,MAAerB,EAA4B,CAEzD,OAAOT,EAAaS,CAAK,EAAE,OACzB,CAACX,EAAKC,IAAWD,GAAO,KAAQC,EAAQD,EAAMC,EAAQD,EAAOC,EAC7D,MACF,CACF,CANgBN,EAAAqC,GAAA,YAQT,SAASC,MAAYtB,EAAsC,CAChE,OAAOT,EAAaS,CAAK,EAAE,OAAO,CAACX,EAAKC,IAAUD,EAAMC,EAAO,CAAC,CAClE,CAFgBN,EAAAsC,GAAA,YAIT,SAASC,MAAYvB,EAAsC,CAChE,IAAMwB,EAAYjC,EAAaS,CAAK,EACpC,OAAOwB,EAAU,OAAO,CAACnC,EAAKC,IAAUD,EAAMC,EAAO,CAAC,EAAIkC,EAAU,MACtE,CAHgBxC,EAAAuC,GAAA,YAKT,SAASE,GAAgBzB,EAAY0B,EAA6B,CACvE,IAAMC,EAAS,CAAC,EACZC,EAAI,EACF9C,EAAIkB,EAAM,OAChB,KAAO4B,EAAI9C,GACT6C,EAAO,KAAK3B,EAAM,MAAM4B,EAAIA,GAAKF,CAAa,CAAC,EACjD,OAAOC,CACT,CAPgB3C,EAAAyC,GAAA,gBAST,SAASI,GACdC,EAAO,EACPC,EACK,CACL,GAAID,GAAQ,EACV,MAAO,CAAC,EACV,IAAMlC,EAAM,IAAI,MAAMkC,CAAI,EAC1B,QAASF,EAAI,EAAGA,EAAIE,EAAMF,IACxBhC,EAAIgC,CAAC,EAAIG,aAAgB,SAAWA,EAAKH,CAAC,EAAIG,EAEhD,OAAOnC,CACT,CAXgBZ,EAAA6C,GAAA,eCnJhB,IAAMG,GAAMC,EAAO,aAAc,OAAO,EAElCC,GAAY,CAChB,EAAK,KACL,EAAK,WACL,GAAM,cACN,GAAM,mBACN,GAAM,mCACN,eAAgB,mCAChB,aAAc,mCACd,cAAe,mCACf,SAAU,mCACV,SAAU,mCACV,WAAY,mCACZ,GAAM,uCACN,GAAM,6DACN,GAAM,iEACN,GAAM,mEACN,SAAU,mEACV,GAAM,sEACN,GAAM,uFACR,EAEO,SAASC,EAAQC,EAA8B,CACpD,IAAIC,EAAgCH,GAAkB,OAAOE,CAAW,CAAC,EAEzE,GAAI,CAACC,EACH,GAAI,OAAOD,GAAgB,SACzBC,EAAWD,MAEX,OAAM,IAAI,MAAM,gBAAgBA,GAAa,EAGjD,GAAIC,EAAS,QAAU,IACrB,MAAM,IAAI,UAAU,mBAAmB,EAEzC,IAAMC,EAAW,IAAI,WAAW,GAAG,EACnC,QAASC,EAAI,EAAGA,EAAID,EAAS,OAAQC,IACnCD,EAASC,CAAC,EAAI,IAEhB,QAASC,EAAI,EAAGA,EAAIH,EAAS,OAAQG,IAAK,CACxC,IAAMC,EAAIJ,EAAS,OAAOG,CAAC,EACrBE,EAAKD,EAAE,WAAW,CAAC,EAEzB,GAAIH,EAASI,CAAE,IAAM,IACnB,MAAM,IAAI,UAAU,GAAGD,gBAAgB,EACzCH,EAASI,CAAE,EAAIF,EAGjB,IAAMG,EAAON,EAAS,OAChBO,EAASP,EAAS,OAAO,CAAC,EAC1BQ,EAAS,KAAK,IAAIF,CAAI,EAAI,KAAK,IAAI,GAAG,EACtCG,EAAU,KAAK,IAAI,GAAG,EAAI,KAAK,IAAIH,CAAI,EAE7C,SAASI,EAAOC,EAAkBC,EAAc,GAAY,CAC1D,IAAMC,EAAOC,EAAaH,CAAM,EAChC,GAAIE,EAAK,aAAe,EACtB,MAAO,GAGT,IAAIE,EAAS,EACTC,EAAS,EACPC,EAAOJ,EAAK,WAElB,KAAOG,IAAWC,GAAQJ,EAAKG,CAAM,IAAM,GAAGA,IAG9C,IAAME,GAASD,EAAOD,GAAUP,EAAU,IAAO,EAC3CU,EAAc,IAAI,WAAWD,CAAI,EAGvC,KAAOF,IAAWC,GAAM,CACtB,IAAIG,EAAQP,EAAKG,CAAM,EAGnBb,EAAI,EACR,QACMkB,EAAMH,EAAO,GAChBE,IAAU,GAAKjB,EAAIY,IAAWM,IAAQ,GACvCA,IAAOlB,IAEPiB,GAAU,IAAMD,EAAYE,CAAG,IAAO,EACtCF,EAAYE,CAAG,EAAID,EAAQd,IAAS,EACpCc,EAASA,EAAQd,IAAU,EAG7B,GAAIc,IAAU,EACZ,MAAAzB,GAAI,KAAK,iBAAkBkB,EAAMD,EAAaT,EAAGe,CAAI,EAC/C,IAAI,MAAM,gBAAgB,EAGlCH,EAASZ,EACTa,IAGF,IAAIM,EAAMJ,EAAOH,EAGjB,KAAOO,IAAQJ,GAAQC,EAAYG,CAAG,IAAM,GAAGA,IAG/C,IAAIC,EAAM,GACV,KAAOD,EAAMJ,EAAM,EAAEI,EAAKC,GAAOvB,EAAU,OAAOmB,EAAYG,CAAG,CAAC,EAElE,OAAIV,EAAc,EAETW,EAAI,SAASX,EAAaL,CAAM,EAElCgB,CACT,CAvDSC,EAAAd,EAAA,UAyDT,SAASe,EAAOd,EAAgBC,EAAc,GAAgB,CAC5D,GAAI,OAAOD,GAAW,SACpB,MAAM,IAAI,UAAU,iBAAiB,EACvC,GAAIA,EAAO,SAAW,EACpB,OAAO,IAAI,WAGbA,EAASA,EAAO,QAAQ,QAAS,EAAE,EAEnC,IAAIe,EAAM,EACNX,EAAS,EAEb,KAAOJ,EAAOe,CAAG,IAAMnB,GAAQmB,IAG/B,IAAMR,GAASP,EAAO,OAASe,GAAOlB,EAAS,IAAO,EAChDmB,EAAc,IAAI,WAAWT,CAAI,EAGvC,KAAOP,EAAOe,CAAG,GAAG,CAClB,IAAIN,EAAQnB,EAASU,EAAO,WAAWe,CAAG,CAAC,EAG3C,GAAIN,IAAU,IACZ,MAAM,IAAI,MAAM,0BAA0BT,EAAOe,CAAG,IAAI,EAE1D,IAAIvB,EAAI,EACR,QACMyB,EAAMV,EAAO,GAChBE,IAAU,GAAKjB,EAAIY,IAAWa,IAAQ,GACvCA,IAAOzB,IAEPiB,GAAUd,EAAOqB,EAAYC,CAAG,IAAO,EACvCD,EAAYC,CAAG,EAAIR,EAAQ,MAAQ,EACnCA,EAASA,EAAQ,MAAS,EAG5B,GAAIA,IAAU,EACZ,MAAM,IAAI,MAAM,gBAAgB,EAClCL,EAASZ,EACTuB,IAIF,IAAIG,EAAMX,EAAOH,EACjB,KAAOc,IAAQX,GAAQS,EAAYE,CAAG,IAAM,GAAGA,IAE/C,OAAIjB,EAAc,EACT,IAAI,WAAW,CACpB,GAAG,IAAI,WAAWA,EAAce,EAAY,OAASE,CAAG,EACxD,GAAGF,EAAY,MAAME,CAAG,CAC1B,CAAC,EAGIF,EAAY,MAAME,CAAG,CAC9B,CAvDS,OAAAL,EAAAC,EAAA,UAyDF,CACL,OAAAf,EACA,OAAAe,CACF,CACF,CArJgBD,EAAA1B,EAAA,WAyJhB,GAAM,CAAE,OAAQgC,GAAc,OAAQC,EAAc,EAAIjC,EAAQ,EAAE,EAElE,SAASkC,GAAaC,EAAW,CAC/B,OAAOF,GAAcE,EAClB,kBAAkB,EAClB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,CAAC,CACzB,CAPST,EAAAQ,GAAA,gBAWF,GAAM,CAAE,OAAQE,GAAc,OAAQC,EAAa,EAAIC,EAAQ,EAAE,EAC3D,CAAE,OAAQC,GAAc,OAAQC,EAAa,EAAIF,EAAQ,EAAE,EAC3D,CAAE,OAAQG,GAAc,OAAQC,EAAa,EAAIJ,EAAQ,EAAE,EAKjE,SAASK,GAAoBC,EAAeC,EAAc,CAC/D,OAAO,KAAK,KAAKD,GAAS,KAAK,IAAI,GAAG,EAAI,KAAK,IAAIC,CAAI,EAAE,CAC3D,CAFgBC,EAAAH,GAAA,uBC1MT,IAAMI,GAAcC,EAACC,IAEtBA,EAAE,OAAS,IACT,oBAAoB,KAAKA,CAAC,IAC5BA,EAAIA,EAAE,YAAY,GAEpBA,EAAIA,EAED,QAAQ,aAAc,EAAE,EACxB,QAAQ,aAAc,EAAE,EAExB,QAAQ,sBAAuB,CAACC,EAAIC,IAAOA,EAAG,YAAY,CAAC,EAE9DF,EAAIA,EAAE,CAAC,EAAE,YAAY,EAAIA,EAAE,UAAU,CAAC,GAEjCA,GAfkB,eAkBpB,SAASG,GAAaH,EAAW,CACtC,OAAOA,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAE,YAAY,EAAE,MAAM,CAAC,CAC5D,CAFgBD,EAAAI,GAAA,gBAIT,SAASC,GAAkBJ,EAAW,CAC3C,OAAOA,EAAE,QAAQ,SAAUG,EAAY,CACzC,CAFgBJ,EAAAK,GAAA,qBAYT,SAASC,GAAcC,EAAaC,EAAY,IAAK,CAC1D,OAAAA,EAAY,OAAOA,EAAc,IAAc,IAAMA,EAC9CD,EACJ,QAAQ,oBAAqB,KAAKC,KAAa,EAC/C,QAAQ,2BAA4B,KAAKA,KAAa,EACtD,YAAY,CACjB,CANgBR,EAAAM,GAAA,iBCtChB,IAAMG,GAAmB,CAAC,IAAK,OAAQ,MAAO,IAAK,IAAI,EAEhD,SAASC,GAAgBC,EAAgBC,EAAe,GAAgB,CAC7E,OAAID,GAAS,MAAQ,OAAOA,GAAU,SAC7BC,EACFH,GAAiB,SAAS,OAAOE,CAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CACrE,CAJgBE,EAAAH,GAAA,mBAMT,SAASI,GAAgBH,EAAgBC,EAAe,EAAW,CACxE,OAAID,GAAS,MAAQ,OAAOA,GAAU,SAC7BC,EACF,SAASD,EAAM,KAAK,EAAG,EAAE,GAAKC,CACvC,CAJgBC,EAAAC,GAAA,mBAMT,SAASC,GAAcJ,EAAgBC,EAAe,EAAa,CACxE,OAAID,GAAS,MAAQ,OAAOA,GAAU,SAC7BC,EACF,WAAWD,EAAM,KAAK,CAAC,GAAKC,CACrC,CAJgBC,EAAAE,GAAA,iBAMT,SAASC,GAAeL,EAAaC,EAAe,GAAgB,CACzE,OAAID,GAAS,KACJC,EACL,OAAOD,GAAU,UACZA,EACL,OAAOA,GAAU,SACZA,IAAU,EACZF,GAAiB,SAAS,OAAOE,CAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CACrE,CARgBE,EAAAG,GAAA,kBAUT,SAASC,GAAeN,EAAaC,EAAe,EAAW,CACpE,OAAID,GAAS,KACJC,EACL,OAAOD,GAAU,UACZA,EAAQ,EAAI,EACjB,OAAOA,GAAU,SACZ,KAAK,MAAMA,CAAK,EAClB,SAAS,OAAOA,CAAK,EAAE,KAAK,EAAG,EAAE,GAAKC,CAC/C,CARgBC,EAAAI,GAAA,kBAUT,SAASC,GAAaP,EAAaC,EAAe,EAAa,CACpE,OAAID,GAAS,KACJC,EACL,OAAOD,GAAU,UACZA,EAAQ,EAAI,EACjB,OAAOA,GAAU,SACZ,KAAK,MAAMA,CAAK,EAClB,WAAW,OAAOA,CAAK,EAAE,KAAK,CAAC,GAAKC,CAC7C,CARgBC,EAAAK,GAAA,gBAUT,SAASC,GAAcR,EAAaC,EAAe,GAAY,CACpE,OAAID,GAAS,KACJC,EAEF,OAAOD,CAAK,GAAKC,CAC1B,CALgBC,EAAAM,GAAA,iBAmBT,IAAMC,GAAUF,GACVG,GAAQJ,GACRK,GAAWH,GACXI,GAASP,GASf,SAASQ,GACdC,EACAC,EAA6B,CAAC,EACvB,CACP,GAAM,CAAE,MAAAC,EAAQ,GAAM,OAAAC,EAAS,EAAK,EAAIF,EACxC,OAAOD,EAAS,IAAKI,GAAQ,CAC3B,GAAIA,GAAO,OAAOA,GAAQ,SAAU,CAClC,GAAID,IAAWC,aAAe,YAAcA,aAAe,aACzD,MAAO;AAAA,EAAKC,GAAoBD,CAAG;AAAA,EAErC,GAAIA,aAAe,MACjB,OAAKF,EAGE,GAAGE,EAAI,MAAQ,YAAYA,EAAI;AAAA,EAAYA,EAAI,QAF7C,GAAGA,EAAI,MAAQ,YAAYA,EAAI,UAK1C,GAAI,CACF,OAAOD,EAAS,KAAK,UAAUC,EAAK,KAAM,CAAC,EAAI,KAAK,UAAUA,CAAG,CACnE,MACA,CAAa,EAEf,OAAO,OAAOA,CAAG,CACnB,CAAC,CACH,CAxBgBhB,EAAAW,GAAA,kBA0BT,SAASO,GACdN,EACAC,EAA6B,CAAC,EACtB,CACR,OAAOF,GAAeC,EAAUC,CAAG,EAAE,KAAK,GAAG,CAC/C,CALgBb,EAAAkB,GAAA,kBAUT,SAASC,GAAoBC,EAA8B,CAChE,GAAI,CACF,OAAO,mBAAmB,OAAOA,CAAY,CAAC,CAChD,MACA,CAEA,CACA,OAAOA,CACT,CARgBpB,EAAAmB,GAAA,uBCxHT,IAAME,GAAS,MAWf,SAASC,GAAQC,EAAyB,CAC/C,OAAO,KAAK,MAAMA,EAAM,GAAK,CAC/B,CAFgBC,EAAAF,GAAA,WAIT,SAASG,GAASF,EAAyB,CAChD,OAAO,KAAK,MAAOA,EAAM,IAAO,GAAG,CACrC,CAFgBC,EAAAC,GAAA,YAIT,SAASC,GAAOH,EAAyB,CAC9C,OAAO,KAAK,MAAMA,EAAM,GAAG,CAC7B,CAFgBC,EAAAE,GAAA,UAIT,SAASC,GAAWJ,EAAyC,CAClE,MAAO,CAACD,GAAQC,CAAG,EAAGE,GAASF,CAAG,EAAGG,GAAOH,CAAG,CAAC,CAClD,CAFgBC,EAAAG,GAAA,cAIT,SAASC,GAAUL,EAAeM,EAAM,GAAa,CAC1D,OAAOA,EACH,IAAI,KAAK,GAAGC,GAAYP,CAAG,iBAAiB,EAC5C,IAAI,KACJA,EAAM,IACJA,EAAM,IAAO,IAAO,EACtBA,EAAM,GACR,CACJ,CARgBC,EAAAI,GAAA,aAUT,SAASG,IAAyB,CACvC,OAAOC,GAAY,IAAI,IAAM,CAC/B,CAFgBR,EAAAO,GAAA,gBAIT,SAASE,GACdC,EACAL,EAAM,GACgB,CACtB,GAAI,OAAOK,GAAU,SACnB,OAAIA,EAAQ,IACV,OACKA,EAEJ,GAAI,OAAOA,GAAU,SACxB,OAAOC,GAAcD,CAAK,EAEvB,GAAI,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,EAAG,CACnD,GAAM,CAACE,EAAMC,EAAOd,CAAG,EAAIW,EAC3B,OAAOI,GAAaF,EAAMC,EAAOd,CAAG,UAE7BW,aAAiB,KACxB,OAAOF,GAAYE,EAAOL,CAAG,CAIjC,CArBgBL,EAAAS,GAAA,cAuBT,SAASM,GAAahB,EAAqB,CAChD,OAAOK,GAAUL,EAAK,EAAI,CAC5B,CAFgBC,EAAAe,GAAA,gBAIT,SAASP,GAAYQ,EAAYX,EAAM,GAAiB,CAC7D,OACEA,EACIM,GAAcK,EAAK,YAAY,CAAC,EAChCA,EAAK,YAAY,EAAI,KAClBA,EAAK,SAAS,EAAI,GAAK,IACxBA,EAAK,QAAQ,CAEvB,CARgBhB,EAAAQ,GAAA,eAUT,SAASS,GAAeD,EAAsB,CACnD,OAAOR,GAAYQ,EAAM,EAAI,CAC/B,CAFgBhB,EAAAiB,GAAA,kBAIT,SAASC,GAAenB,EAAeM,EAAM,GAAc,CAChE,OAAOD,GAAUL,EAAKM,CAAG,EAAE,QAAQ,CACrC,CAFgBL,EAAAkB,GAAA,kBAIT,SAASC,GAAiBC,EAAYf,EAAM,GAAgB,CACjE,OAAOG,GAAY,IAAI,KAAKY,CAAE,EAAGf,CAAG,CACtC,CAFgBL,EAAAmB,GAAA,oBAIT,SAASb,GAAYP,EAAesB,EAAM,IAAK,CACpD,IAAMC,EAAa,OAAOvB,CAAG,EAC7B,OACEuB,EAAW,MAAM,EAAG,CAAC,EAAID,EACvBC,EAAW,MAAM,EAAG,CAAC,EAAID,EACzBC,EAAW,MAAM,EAAG,CAAC,CAE3B,CAPgBtB,EAAAM,GAAA,eAST,SAASQ,GACdF,EACAC,EAAQ,EACRd,EAAM,EACgB,CACtB,GAAI,EAAAc,EAAQ,GAAKA,EAAQ,IAAMd,EAAM,GAAKA,EAAM,IAEhD,OAAOa,EAAO,IAAQC,EAAQ,IAAMd,CACtC,CARgBC,EAAAc,GAAA,gBAUT,SAASH,GAAcD,EAAqC,CACjE,IAAMa,EAAS,OAAOb,CAAK,EACxB,QAAQ,UAAW,EAAE,EACrB,MAAM,EAAG,CAAC,EACb,GAAIa,EAAO,SAAW,EACpB,MAAO,CAACA,CACZ,CANgBvB,EAAAW,GAAA,iBAQT,SAASa,GAAczB,EAAe0B,EAAS,EAAa,CACjE,IAAIb,EAAOd,GAAQC,CAAG,EAClBc,EAAQZ,GAASF,CAAG,EACxB,OAAI0B,IAAW,IACbZ,GAASY,EACTb,GAAQ,KAAK,OAAOC,EAAQ,GAAK,EAAE,EACnCA,EAAQ,KAAK,OAAOA,EAAQ,GAAK,EAAE,EAAI,EACnCA,IAAU,IACZA,EAAQ,KAELC,GAAaF,EAAMC,EAAO,CAAC,CACpC,CAXgBb,EAAAwB,GAAA,iBAaT,SAASE,GAAa3B,EAAe0B,EAAS,EAAa,CAChE,IAAMb,EAAOd,GAAQC,CAAG,EACxB,OAAOe,GAAaF,EAAOa,EAAQ,EAAG,CAAC,CACzC,CAHgBzB,EAAA0B,GAAA,gBAKT,SAASC,GAAU5B,EAAe0B,EAA0B,CAGjE,OAAON,GAAiBD,GAAenB,CAAG,EAAI0B,EAAS,KAAM,CAC/D,CAJgBzB,EAAA2B,GAAA,aAMT,SAASC,GAAQC,EAAgBC,EAAyB,CAC/D,OAAO,KAAK,OAAOZ,GAAeY,CAAK,EAAIZ,GAAeW,CAAI,GAAK,KAAM,CAC3E,CAFgB7B,EAAA4B,GAAA,WAKT,SAASG,GAASF,EAAgBC,EAA4B,CACnE,IAAME,EAAiB,CAAC,EAQxB,IANIF,GAAS,OACXA,EAAQvB,GAAa,GAEnBsB,EAAO,IACTA,EAAOF,GAAUG,EAAOD,EAAO,CAAC,GAE3BA,GAAQC,GACbE,EAAK,KAAKH,CAAI,EACdA,EAAOF,GAAUE,EAAM,CAAE,EAE3B,OAAOG,CACT,CAdgBhC,EAAA+B,GAAA,YAiBT,SAAUE,GAAYJ,EAAgBC,EAAkB,CAC7D,IAAME,EAAiB,CAAC,EAQxB,IANIF,GAAS,OACXA,EAAQvB,GAAa,GAEnBsB,EAAO,IACTA,EAAOF,GAAUG,EAAOD,EAAO,CAAC,GAE3BA,GAAQC,GACb,MAAMD,EACNA,EAAOF,GAAUE,EAAM,CAAE,EAE3B,OAAOG,CACT,CAdiBhC,EAAAiC,GAAA,eC9JjB,IAAMC,GAAMC,EAAO,eAAgB,OAAO,EAanC,SAASC,IAA2C,CACzD,IAAIC,EAASC,EAKb,MAAO,CAJS,IAAI,QAAW,CAACC,EAAUC,IAAY,CACpDH,EAAUE,EACVD,EAASE,CACX,CAAC,EACgBH,EAASC,CAAM,CAClC,CAPgBG,EAAAL,GAAA,iBAUhB,eAAsBM,GAAMC,EAAqC,CAC/D,OAAO,IAAI,QAAQN,GAAW,WAAWA,EAASM,CAAY,CAAC,CACjE,CAFsBF,EAAAC,GAAA,SAKtB,eAAsBE,IAA2B,CAC/C,OAAO,IAAI,QAAQP,GAAW,WAAWA,EAAS,CAAC,CAAC,CACtD,CAFsBI,EAAAG,GAAA,aAIf,IAAMC,GAAiB,OAAO,SAAS,EAU9C,eAAsBC,GACpBC,EACAJ,EACAK,EAAeH,GACmB,CAClC,OAAO,IAAI,QAAQ,MAAOR,EAASC,IAAW,CAC5C,IAAIW,EAAO,GAELH,EAAU,WAAW,IAAM,CAC/BG,EAAO,GACPZ,EAAQW,CAAY,CACtB,EAAGL,CAAY,EAEf,GAAI,CACF,IAAMO,EAAS,MAAMH,EACrB,aAAaD,CAAO,EACfG,GACHZ,EAAQa,CAAM,CAClB,OACOC,EAAP,CACE,aAAaL,CAAO,EACfG,GACHX,EAAOa,CAAG,CACd,CACF,CAAC,CACH,CAzBsBV,EAAAK,GAAA,WA2Bf,IAAMM,GAAc,IAAI,MAAM,iBAAiB,EAE/C,SAASC,GAAUC,EAAqB,CAC7C,OAAOA,IAAUT,IAAkBS,IAAUF,EAC/C,CAFgBX,EAAAY,GAAA,aAIhB,eAAsBE,GACpBR,EACAJ,EACwB,CACxB,OAAIA,GAAgB,EACX,MAAMI,EAER,IAAI,QAAQ,MAAOV,EAASC,IAAW,CAC5C,IAAIW,EAAO,GAELH,EAAU,WAAW,IAAM,CAC/BG,EAAO,GACPX,EAAOc,EAAW,CACpB,EAAGT,CAAY,EAEf,GAAI,CACF,IAAMO,EAAS,MAAMH,EACrB,aAAaD,CAAO,EACfG,GACHZ,EAAQa,CAAM,CAClB,OACOC,EAAP,CACE,aAAaL,CAAO,EACfG,GACHX,EAAOa,CAAG,CACd,CACF,CAAC,CACH,CA3BsBV,EAAAc,GAAA,cA8Bf,SAASC,GACdC,EACAC,EACAC,EAAY,IACE,CACd,OAAO,IAAI,QAAQ,CAACtB,EAASC,IAAW,CACtC,IAAMsB,EAAKnB,EAACa,GAAe,CACrBO,IACF,aAAaA,CAAK,EAClBZ,EAAK,EACLZ,EAAQiB,CAAK,EAEjB,EANW,MAQPL,EAAOR,EAAA,IAAM,CACfoB,EAAQ,KACJJ,EAAI,IACNA,EAAI,IAAIC,EAAOE,CAAE,EACVH,EAAI,oBACXA,EAAI,oBAAoBC,EAAOE,CAAE,EAEjC1B,GAAI,KAAK,sCAAuCuB,EAAKC,CAAK,CAC9D,EARW,QAUPG,EAAa,WAAW,IAAM,CAChCZ,EAAK,EACLX,EAAO,IAAI,MAAM,0BAA0B,CAAC,CAC9C,EAAGqB,CAAS,EAERF,EAAI,GACNA,EAAI,GAAGC,EAAOE,CAAE,EACTH,EAAI,iBACXA,EAAI,iBAAiBC,EAAOE,CAAE,EAE9B1B,GAAI,KAAK,+BAAgCuB,CAAG,CAChD,CAAC,CACH,CApCgBhB,EAAAe,GAAA,UAsCT,SAASM,EAAaR,EAA4C,CACvE,OAAO,QACLA,IACMA,aAAiB,SAEhB,OAAOA,EAAM,MAAS,WAC/B,CACF,CAPgBb,EAAAqB,EAAA,aAUT,SAASC,EAAaT,EAAmC,CAC9D,OAAO,QAAQ,QAAQA,CAAK,CAC9B,CAFgBb,EAAAsB,EAAA,aCjJT,IAAMC,EAAN,KAAU,CAGf,IAAI,OAAQ,CACV,OAAO,KAAK,IACd,CAEA,YAAYC,EAAuB,CACjC,GAAI,OAAOA,GAAS,SAAU,CAC5B,KAAK,KAAOA,EACZ,OAMF,GAHIA,GAAQ,OACVA,EAAOD,EAAI,KAAKC,CAAI,GAAG,MAErBA,GAAQ,KAAM,CAChB,IAAMC,EAAO,IAAI,KACjB,KAAK,KACDA,EAAK,YAAY,EAAI,KACpBA,EAAK,SAAS,EAAI,GAAK,IACxBA,EAAK,QAAQ,OAGjB,KAAK,KAAOD,CAEhB,CAEA,OAAO,WAAWE,EAAgB,CAChC,OAAO,IAAIH,EAAIG,CAAC,CAClB,CAEA,OAAO,WAAWC,EAAqC,CACrD,OAAOJ,EAAI,KAAK,CAACI,EAAW,QAAQ,UAAW,EAAE,EAAE,MAAM,EAAG,CAAC,CAAC,CAChE,CAEA,OAAO,SAASF,EAAYG,EAAM,GAAY,CAC5C,OACEA,EACIL,EAAI,WAAWE,EAAK,YAAY,EAAE,OAAO,EAAG,EAAE,CAAC,EAC/CF,EAAI,KACJE,EAAK,YAAY,EAAI,KACdA,EAAK,SAAS,EAAI,GAAK,IACxBA,EAAK,QAAQ,CACrB,CAEN,CAEA,OAAO,YAAYA,EAAiB,CAClC,OAAOF,EAAI,SAASE,EAAM,EAAI,CAChC,CAEA,OAAO,KAAKI,EAAuBD,EAAM,GAAwB,CAC/D,GAAI,OAAOC,GAAU,SACnB,OAAIA,EAAQ,IACV,OACK,IAAIN,EAAIM,CAAK,EAEjB,GAAI,OAAOA,GAAU,SACxB,OAAON,EAAI,WAAWM,CAAK,EAExB,GAAI,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,EAAG,CACnD,GAAM,CAACC,EAAMC,EAAQ,EAAGC,EAAM,CAAC,EAAIH,EACnC,OAAIE,EAAQ,GAAKA,EAAQ,IAAMC,EAAM,GAAKA,EAAM,GAC9C,OACK,IAAIT,EAAIO,EAAO,IAAQC,EAAQ,IAAMC,CAAG,MAE5C,IAAIH,aAAiB,KACxB,OAAON,EAAI,SAASM,EAAOD,CAAG,EAE3B,GAAIC,aAAiBN,EACxB,OAAOM,EAEX,CAEA,UAAmB,CACjB,OAAO,KAAK,IACd,CAKA,QAAS,CACP,OAAO,KAAK,IACd,CAEA,SAASI,EAAM,IAAK,CAClB,IAAMC,EAAa,OAAO,KAAK,IAAI,EACnC,OACEA,EAAW,MAAM,EAAG,CAAC,EACnBD,EACAC,EAAW,MAAM,EAAG,CAAC,EACrBD,EACAC,EAAW,MAAM,EAAG,CAAC,CAE3B,CAEA,OAAON,EAAM,GAAa,CACxB,OAAOA,EACH,IAAI,KAAK,GAAG,KAAK,SAAS,iBAAiB,EAC3C,IAAI,KACJ,KAAK,KAAO,IACV,KAAK,KAAO,IAAO,IAAO,EAC5B,KAAK,KAAO,GACd,CACJ,CAEA,WAAY,CACV,OAAO,KAAK,OAAO,EAAI,CACzB,CAEA,IAAI,MAAO,CACT,OAAO,KAAK,MAAM,KAAK,KAAO,GAAK,CACrC,CAEA,IAAI,OAAQ,CACV,OAAO,KAAK,MAAO,KAAK,KAAO,IAAO,GAAG,CAC3C,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,MAAM,KAAK,KAAO,GAAG,CACnC,CAIA,UAAUO,EAAqB,CAG7B,OAAOZ,EAAI,YACT,IAAI,KAAK,KAAK,UAAU,EAAE,QAAQ,EAAIY,EAAS,KAAM,CACvD,CACF,CAEA,YAAkB,CAChB,OAAOZ,EAAI,KAAK,CAAC,KAAK,KAAM,KAAK,MAAO,CAAC,CAAC,CAC5C,CAEA,WAAiB,CACf,OAAOA,EAAI,KAAK,CAAC,KAAK,KAAM,EAAG,CAAC,CAAC,CACnC,CAGA,YAAYY,EAAqB,CAC/B,IAAMC,EAAI,KAAK,MAAQD,EACnBE,EAAK,KAAK,OAAOD,EAAI,GAAK,EAAE,EAAI,EAChCC,IAAO,IACTA,EAAK,IACP,IAAMC,EAAK,KAAK,OAAOF,EAAI,GAAK,EAAE,EAElC,OAAOb,EAAI,KAAK,CAAC,KAAK,KAAOe,EAAID,EAAI,KAAK,GAAG,CAAC,CAChD,CAEA,UAAUE,EAAkC,CAC1C,OAAO,KAAK,OACT,IAAIhB,EAAIgB,CAAQ,GAAG,UAAU,EAAE,QAAQ,EAAI,KAAK,UAAU,EAAE,QAAQ,GACjE,KACN,CACF,CAIA,WAAY,CACV,OAAO,KAAK,UAAU,EAAE,CAC1B,CAEA,UAAW,CACT,OAAO,KAAK,UAAU,CAAE,CAC1B,CACF,EAxKaC,EAAAjB,EAAA,OA0Kb,eAAsBkB,GACpBC,EACAC,EACAC,EACA,CACA,IAAIC,EAAQtB,EAAI,KAAKmB,CAAI,EACnBI,EAAMvB,EAAI,KAAKoB,CAAE,EAEvB,KAAOE,GAASC,GAAOD,GAAO,MAAQC,GAAK,MAAM,CAC/C,IAAMC,EAASH,EAAQC,CAAK,EACxBG,EAAUD,CAAM,GAClB,MAAMA,EAERF,EAAQA,EAAM,UAAU,CAAE,EAE9B,CAfsBL,EAAAC,GAAA,cAiBf,SAASQ,IAAa,CAC3B,OAAO,IAAI1B,CACb,CAFgBiB,EAAAS,GAAA,SAKT,SAASjB,GAAIR,EAA4B,CAC9C,OAAO,IAAID,EAAIC,CAAI,CACrB,CAFgBgB,EAAAR,GAAA,OAIT,SAASkB,GAAiBvB,EAA4B,CAC3D,OAAOJ,EAAI,SAAS,IAAI,KAAKI,CAAU,CAAC,EAAE,IAC5C,CAFgBa,EAAAU,GAAA,oBChNT,SAASC,GACdC,EACAC,EAAgB,EACF,CACd,MAAO,EAAE,CAACD,GAAO,QAAQC,CAAa,CACxC,CALgBC,EAAAH,GAAA,WAOT,SAASI,GACdH,EACAC,EAAgB,EACF,CACd,MAAO,EAAE,CAACD,EAAQ,IAAMC,GAAe,QAAQA,CAAa,CAC9D,CALgBC,EAAAC,GAAA,oBAOT,SAASC,GACdJ,EACAC,EAAgB,EACR,CACR,OAAO,KAAK,MAAM,CAACD,EAAQ,IAAMC,CAAa,CAChD,CALgBC,EAAAE,GAAA,kBAOT,SAASC,GACdL,EACAC,EAAgB,EACF,CACd,OAAOA,GAAiBF,GAAQC,EAAOC,CAAa,EAAI,EAC1D,CALgBC,EAAAG,GAAA,oBCVT,SAASC,EAASC,EAA6B,CACpD,OAAOA,GAAO,MAAQ,OAAOA,GAAQ,QACvC,CAFgBC,EAAAF,EAAA,YAKT,SAASG,GAAYF,EAAgC,CAC1D,OAAO,OAAOA,CAAG,IAAMA,CACzB,CAFgBC,EAAAC,GAAA,eAIT,SAASC,EAAQH,EAAiC,CACvD,OAAO,MAAM,QAAQA,CAAG,CAC1B,CAFgBC,EAAAE,EAAA,WAKT,SAASC,GAASJ,EAA0C,CACjE,OAAOD,EAASC,CAAG,GAAK,CAACG,EAAQH,CAAG,CACtC,CAFgBC,EAAAG,GAAA,YAKT,SAASC,GAAcL,EAA0C,CACtE,OAAOA,GAAK,cAAgB,MAC9B,CAFgBC,EAAAI,GAAA,iBAIT,SAASC,GAASN,EAA6B,CACpD,OAAO,OAAOA,GAAQ,QACxB,CAFgBC,EAAAK,GAAA,YAIT,SAASC,GAASP,EAA6B,CACpD,OAAO,OAAOA,GAAQ,UAAY,CAAC,MAAMA,CAAG,CAC9C,CAFgBC,EAAAM,GAAA,YAIT,SAASC,GAAUR,EAA6B,CACrD,OAAOO,GAASP,CAAG,GAAK,OAAO,UAAUA,CAAG,CAC9C,CAFgBC,EAAAO,GAAA,aAKT,SAASC,GAAcT,EAA6B,CACzD,OAAOO,GAASP,CAAG,GAAK,OAAO,cAAcA,CAAG,CAClD,CAFgBC,EAAAQ,GAAA,iBAIT,SAASC,GAAUV,EAA8B,CACtD,OAAO,OAAOA,GAAQ,SACxB,CAFgBC,EAAAS,GAAA,aAKT,SAASC,GAAkBX,EAAuC,CACvE,OAAOA,GAAO,IAChB,CAFgBC,EAAAU,GAAA,qBAIT,SAASC,GAAOZ,EAAuC,CAC5D,OAAOA,GAAO,IAChB,CAFgBC,EAAAW,GAAA,UAGT,SAASC,GAAab,EAAiC,CAC5D,OAAOD,EAASC,CAAG,GAAKA,EAAI,YAAY,OAAS,YACnD,CAFgBC,EAAAY,GAAA,gBAOT,SAASC,GAAaC,EAAyC,CACpE,OAAOA,GAAS,IAClB,CAFgBd,EAAAa,GAAA,aAMT,SAASE,GAAWD,EAAmD,CAC5E,OAAOA,GAAS,MAAQA,IAAU,IAASA,IAAU,EACvD,CAFgBd,EAAAe,GAAA,WCzET,SAASC,GAAUC,EAAQC,EAAQC,EAAO,IAAI,QAAW,CAE9D,GAAIF,IAAMC,EACR,MAAO,GAqBT,GAlBIC,EAAK,IAAID,CAAC,IAKTE,GAAYF,CAAC,GAChBC,EAAK,IAAID,CAAC,EAGR,EAAED,aAAa,SAAW,EAAEC,aAAa,UAKzCD,EAAE,cAAgBC,EAAE,aAIpBD,EAAE,SAAWC,EAAE,OACjB,MAAO,GAET,QAAWG,KAAKJ,EAAG,CAEjB,GAAI,CAACA,EAAE,eAAeI,CAAC,EACrB,SAGF,GAAI,CAACH,EAAE,eAAeG,CAAC,EACrB,MAAO,GAET,IAAMC,EAAKL,EAAEI,CAAC,EACRE,EAAKL,EAAEG,CAAC,EAed,GAAI,CAACL,GAAUM,EAAIC,EAAIJ,CAAI,EACzB,MAAO,GAIX,QAAWE,KAAKH,EACd,GAAIA,EAAE,eAAeG,CAAC,GAAK,CAACJ,EAAE,eAAeI,CAAC,EAC5C,MAAO,GAGX,MAAO,EACT,CA/DgBG,EAAAR,GAAA,aAkET,SAASS,GAA0BR,EAAQE,EAAO,IAAI,QAAW,CAEtE,GAAIA,EAAK,IAAIF,CAAC,EACZ,MAAO,eAIT,GAHKG,GAAYH,CAAC,GAChBE,EAAK,IAAIF,CAAC,EAERS,GAAST,CAAC,GACZ,QAAWI,KAAKJ,EACd,GAAKA,EAAE,eAAeI,CAAC,EAEvB,IAAIJ,EAAEI,CAAC,IAAM,OAAW,CACtB,OAAOJ,EAAEI,CAAC,EACV,SAEFI,GAA0BR,EAAEI,CAAC,EAAGF,CAAI,WAG/BQ,EAAQV,CAAC,EAChB,QAASW,EAAIX,EAAE,OAAS,EAAGW,GAAK,EAAGA,IAC7BX,EAAEW,CAAC,IAAM,QACXX,EAAE,OAAOW,EAAG,CAAC,EAKnB,OAAOX,CACT,CA3BgBO,EAAAC,GAAA,6BA6BT,SAASI,GAAUC,KAAgBC,EAAgB,CAExD,QAAWC,KAAUD,EACdE,EAASH,CAAM,IAClBA,EAAS,CAAC,GAER,EAAAE,GAAU,MAAQ,CAACC,EAASD,CAAM,IAGtC,OAAO,KAAKA,CAAM,EAAE,QAASE,GAAQ,CACnC,IAAMC,EAAcL,EAAOI,CAAG,EACxBE,EAAeJ,EAAeE,CAAG,EAEnC,MAAM,QAAQC,CAAW,GAAK,MAAM,QAAQC,CAAW,EACzDN,EAAOI,CAAG,EAAIC,EAAY,OAAOC,CAAW,EACrCH,EAASE,CAAW,GAAKF,EAASG,CAAW,EACpDN,EAAOI,CAAG,EAAIL,GAAU,OAAO,OAAO,CAAC,EAAGM,CAAW,EAAGC,CAAW,EAEnEN,EAAOI,CAAG,EAAIE,CAClB,CAAC,EAGH,OAAON,CACT,CAvBgBN,EAAAK,GAAA,aCrGT,IAAMQ,GAAaC,EAACC,GACzBA,EACG,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,EACtB,QAAQ,KAAM,QAAQ,EAND,cAQbC,GAAeF,EAACC,GAC3BA,EACG,QAAQ,SAAU,GAAG,EACrB,QAAQ,SAAU,GAAG,EACrB,QAAQ,WAAY,GAAG,EACvB,QAAQ,WAAY,GAAI,EACxB,QAAQ,UAAW,GAAG,EANC,gBCJrB,SAASE,GACdC,EACAC,EACAC,EAA+B,CAAC,EACrB,CACX,OAAOF,EACJ,OAAQ,GAAS,CAACC,EAAQ,KAAKE,GAAK,CAACA,EAAE,CAAC,CAAC,CAAC,EAC1C,IAAK,GAAM,CACV,QAAWC,KAAKF,EACd,EAAIE,EAAE,CAAC,EACT,OAAO,CACT,CAAC,EACA,OAAO,GAAK,GAAK,IAAI,CAC1B,CAbgBC,EAAAN,GAAA,aAgBT,SAASO,GACdN,EACAO,EACqB,CACrB,OAAOP,EAAK,OAAO,CAACQ,EAAaC,IAAoB,CACnD,IAAMC,EAAa,OAAOD,EAAaF,CAAG,CAAC,EAC1C,OAACC,EAAOE,CAAU,EAAIF,EAAOE,CAAU,GAAK,CAAC,GAAG,KAAKD,CAAY,EAC3DD,CACT,EAAG,CAAC,CAAC,CACP,CATgBH,EAAAC,GAAA,eAYT,SAASK,GACdX,EACAO,EACO,CACP,OAAO,MAAM,KACXP,EAAK,OACH,CAACQ,EAAkBC,IAAoBD,EAAO,IAAIC,EAAaF,CAAG,CAAC,EACnE,IAAI,GACN,CACF,CACF,CAVgBF,EAAAM,GAAA,qBAaT,SAASC,GACdZ,EACAO,EACO,CACP,OAAOP,EAAK,IAAIa,GAAQA,EAAKN,CAAG,CAAC,CACnC,CALgBF,EAAAO,GAAA,aC1CT,SAASE,GACdC,EACAC,EAImB,CACnB,OAAKC,EAASF,CAAG,EAEV,OAAO,YACZ,OAAO,QAAQA,CAAG,EACf,IAAI,CAAC,CAACG,EAAGC,CAAC,IAAM,CACf,IAAMC,EAAIJ,EAAGE,EAAGC,CAAC,EACjB,OAAIE,EAAQD,CAAC,GAAKA,EAAE,SAAW,EACtBA,EAEF,CAACF,EAAGE,CAAC,CACd,CAAC,EACA,OAAOD,GAAKA,GAAK,IAAI,CAC1B,EAXS,CAAC,CAYZ,CApBgBG,EAAAR,GAAA,aAuBT,SAASS,GACdC,EACAC,EACO,CAEP,OAAIA,EAAE,SAAWD,EAAE,SAEjBC,EAAE,QAAQ,IAAID,EAAE,OAAO,EAElB,OAAO,OAAOA,EAAGC,CAAC,CAC3B,CAVgBH,EAAAC,GAAA,yBAgBT,SAASG,GAAcX,EAAa,CACzC,OAAO,OAAO,KAAKA,CAAG,EAAE,QAAU,CACpC,CAFgBO,EAAAI,GAAA,iBCpChB,IAAMC,GAAiB,gCACjBC,GAAiB,OACjBC,GAAoB,OAE1B,SAASC,IAAwB,CAC/B,MAAO,4BACT,CAFSC,EAAAD,GAAA,yBAIT,SAASE,IAA2B,CAClC,MAAO,kCACT,CAFSD,EAAAC,GAAA,4BAKF,SAASC,GACdC,EACAC,EAAc,IACE,CAChB,GAAI,OAAOD,GAAW,SACpB,MAAM,IAAI,UAAU,mBAAmB,EAEzC,GACEJ,GAAsB,EAAE,KAAKK,CAAW,GACrCR,GAAe,KAAKQ,CAAW,EAElC,MAAM,IAAI,MACR,gEACF,EAGF,OAAAD,EAASA,EACN,QAAQJ,GAAsB,EAAGK,CAAW,EAC5C,QAAQR,GAAgBQ,CAAW,EACnC,QAAQP,GAAgBO,CAAW,EACnC,QAAQN,GAAmB,EAAE,EAEhCK,EAASF,GAAyB,EAAE,KAAKE,CAAM,EAC3CA,EAASC,EACTD,EAEGA,EAAO,MAAM,EAAG,GAAmB,CAC5C,CA3BgBH,EAAAE,GAAA,mBCnBhB,IAAMG,GAAW,2BAEV,SAASC,GAAaC,EAAgC,CAC3D,OAAKA,EAEDA,aAAiB,OACZA,EAAM,OAERA,EAAM,QAAQF,GAAU,MAAM,EAJ5B,EAKX,CAPgBG,EAAAF,GAAA,gBCET,IAAMG,GAASC,EAACC,GAAkB,KAAK,IAAIA,CAAK,EAAI,IAAM,GAA3C,UACTC,GAASF,EAACC,GAAkBA,EAAQ,IAAM,EAAjC,UAETE,GAAwBH,EAAAC,GAAS,KAAK,KAAKA,CAAK,EAAxB,WACxBG,GAA0BJ,EAAAC,GAAS,KAAK,MAAMA,CAAK,EAAzB,aAC1BI,GAA4BL,EAAAC,GAAS,KAAK,MAAMA,CAAK,EAAzB,eAK5BK,GAA6BN,EAACC,GAAU,CACnD,IAAMM,EAAU,KAAK,MAAMN,CAAK,EAChC,OAAKF,GAAOE,CAAK,GAGVC,GAAOK,CAAO,EAAIA,EAAU,EAF1BA,CAGX,EAN0C,gBAW7BC,GAAsCR,EAACC,GAC3CF,GAAOE,CAAK,EACf,KAAK,KAAKA,CAAK,EAAI,KAAK,KAAK,KAAK,IAAIA,CAAK,CAAC,EAC5C,KAAK,MAAMA,CAAK,EAH6B,yBAStCQ,GAA8BT,EAAAC,GACzCF,GAAOE,CAAK,EAAI,KAAK,MAAMA,CAAK,EAAI,KAAK,MAAMA,CAAK,EADX,iBAO9BS,GAA8BV,EAACC,GAAU,CACpD,IAAMM,EAAU,KAAK,MAAMN,CAAK,EAChC,OAAKF,GAAOE,CAAK,EAGVC,GAAOK,CAAO,EAAIA,EAAUA,EAAU,EAFpCA,CAGX,EAN2C,iBAW9BI,GAAqCX,EAAAC,GAChDF,GAAOE,CAAK,EACR,KAAK,KAAKA,CAAK,EAAI,KAAK,MAAM,KAAK,IAAIA,CAAK,CAAC,EAC7C,KAAK,MAAMA,CAAK,EAH4B,wBCzC3C,SAASW,GAAgBC,EAA+B,CAC7D,OACEA,EAAM,OAAO,CAACC,EAAKC,IAAS,KAAK,IAAID,EAAKC,EAAK,aAAe,CAAC,EAAG,CAAC,EACjE,EACAC,EAA0B,CAEhC,CANgBC,EAAAL,GAAA,mBAST,SAASM,GAAcL,EAA+B,CAC3D,OACEA,EAAM,OAAO,CAACC,EAAKC,IAAS,KAAK,IAAID,EAAKC,EAAK,aAAe,CAAC,EAAG,CAAC,EACjE,EACAC,EAA0B,CAEhC,CANgBC,EAAAC,GAAA,iBAST,SAASC,GACdC,EACAC,EACAR,EACQ,CACR,IAAMS,EAAQT,EAAM,OAEdU,EAAYH,EAAWC,EAC7B,GAAIC,GAAS,GAAKF,GAAYE,EAAQ,EACpC,OAAOJ,GAAcL,CAAK,EAE5B,GAAIO,GAAY,EACd,OAAOR,GAAgBC,CAAK,EAG9BA,EAAQW,GAAY,CAAC,GAAGX,CAAK,CAAC,EAE9B,IAAMY,EAAOF,EAAY,GAAK,EACxBG,EAAQb,EAAMO,EAAWK,CAAI,EAAE,aAAe,EAE9CE,GADQd,EAAMO,EAAWK,EAAO,CAAC,EAAE,aAAe,GAC/BC,EACzB,GAAIC,IAAa,EAEf,OAAIJ,EACKX,GAAgBC,CAAK,EAEvBK,GAAcL,CAAK,EAE5B,IAAMe,EAASF,EAAQC,EAAW,EAC5BE,EAAQF,EAAW,KAAQX,EAA0B,EAAI,IAC/D,OAAOY,EAASC,CAClB,CA/BgBZ,EAAAE,GAAA,kBAiCT,SAASK,GAAoCX,EAAiB,CACnE,OAAAA,EAAM,KAAK,CAACiB,EAAGC,KAAOD,EAAE,aAAe,IAAMC,EAAE,aAAe,EAAE,EACzDlB,CACT,CAHgBI,EAAAO,GAAA,eC3DT,SAASQ,GACdC,EAGI,CAAC,EACL,CACA,GAAM,CACJ,OAAAC,EAASC,EAACC,GAAsBA,EAAK,KAA5B,SAEX,EAAIH,EAGJ,SAASI,EAAmBA,EAAiB,CAC3C,OAAAA,EAAM,KAAK,CAACC,EAAGC,KAAOL,EAAOI,CAAC,GAAK,IAAMJ,EAAOK,CAAC,GAAK,EAAE,EACjDF,CACT,CAHSF,EAAAE,EAAA,SAMT,SAASG,EAAMH,EAAoB,CACjC,OACEA,EAAM,OAAO,CAACI,EAAKL,IAAS,KAAK,IAAIK,EAAKP,EAAOE,CAAI,GAAK,CAAC,EAAG,CAAC,EAAI,EAAIM,EAA0B,CAErG,CAJSP,EAAAK,EAAA,SAOT,SAASG,EAAIN,EAAoB,CAC/B,OACEA,EAAM,OAAO,CAACI,EAAKL,IAAS,KAAK,IAAIK,EAAKP,EAAOE,CAAI,GAAK,CAAC,EAAG,CAAC,EAAI,EAAIM,EAA0B,CAErG,CAJSP,EAAAQ,EAAA,OAOT,SAASC,EAAQC,EAAgBC,EAAwB,CACnDD,GAAS,OACXA,GAASC,GAAS,GAAK,GACrBA,GAAS,OACXA,GAASD,GAAS,GAAK,GAEzB,IAAME,EAAWD,EAAQD,EAGnBG,EAASH,EAAQE,EAAW,EAC5BE,EAAQF,EAAW,KAAQL,EAA0B,EAAI,IAC/D,OAAOM,EAASC,CAClB,CAZSd,EAAAS,EAAA,WAeT,SAASM,EACPC,EACAC,EACAC,EACQ,CACR,IAAMC,EAAQD,EAAc,OAEtBE,EAAYJ,EAAWC,EAC7B,GAAIE,GAAS,GAAKH,GAAYG,EAAQ,EACpC,OAAOX,EAAIU,CAAa,EAE1B,GAAIF,GAAY,EACd,OAAOX,EAAMa,CAAa,EAG5BA,EAAgBhB,EAAM,CAAC,GAAGgB,CAAa,CAAC,EAExC,IAAMG,EAAOD,EAAY,GAAK,EACxBV,EAAQX,EAAOmB,EAAcF,EAAWK,CAAI,CAAC,GAAK,EAElDT,GADQb,EAAOmB,EAAcF,EAAWK,EAAO,CAAC,CAAC,GAAK,GACnCX,EACzB,GAAIE,IAAa,EAEf,OAAIQ,EACKf,EAAMa,CAAa,EAErBV,EAAIU,CAAa,EAE1B,IAAML,EAASH,EAAQE,EAAW,EAC5BE,EAAQF,EAAW,KAAQL,EAA0B,EAAI,IAC/D,OAAOM,EAASC,CAClB,CA/BS,OAAAd,EAAAe,EAAA,QAiCF,CACL,MAAAV,EACA,IAAAG,EACA,QAAAC,EACA,KAAAM,EACA,MAAAb,CACF,CACF,CAvFgBF,EAAAH,GAAA,aCEhB,IAAMyB,GACF,4aAEG,SAASC,GAAiBC,EAAsB,CACrD,OAAOA,EACJ,MAAMF,EAAO,EACb,IAAI,CAACG,EAAMC,IAAM,CAChB,IAAMC,EAAcC,GAAWH,CAAI,EACnC,OAAOC,EAAI,EACP,4BAA4BC,MAAgBE,GAC1CF,CACF,QACAA,CACN,CAAC,EACA,KAAK,EAAE,CACZ,CAZgBG,EAAAP,GAAA,oBAcT,SAASM,GAAmBE,EAAqB,CACtD,OAAOA,EAAI,QAAQ,uBAAwB,EAAE,EAAE,QAAQ,MAAO,EAAE,CAClE,CAFgBD,EAAAD,GAAA,sBAMT,SAASG,GAAYC,EAA2B,CACrD,IAAMC,EAAQ,CAAC,EACf,OAAS,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQH,CAAI,EAC1C,GAAIG,GAAS,KAAM,CACZ,MAAM,QAAQA,CAAK,IACtBA,EAAQ,CAACA,CAAK,GAChB,QAAWC,KAAKD,EACVC,GAAK,MACPH,EAAM,KACJ,GAAG,mBAAmBC,CAAG,KAAK,mBAAmB,OAAOE,CAAC,CAAC,GAC5D,EAKR,OAAOH,EAAM,KAAK,GAAG,CACvB,CAhBgBJ,EAAAE,GAAA,eAkBT,SAASM,GAAWC,EAAqB,CAC9C,IAAMC,EAAa,CAAC,EACdN,GACJK,EAAY,CAAC,IAAM,IAAMA,EAAY,OAAO,CAAC,EAAIA,GACjD,MAAM,GAAG,EACX,QAASb,EAAI,EAAGA,EAAIQ,EAAM,OAAQR,IAAK,CACrC,IAAMe,EAAOP,EAAMR,CAAC,EAAE,MAAM,GAAG,EACzBS,EAAM,mBAAmBM,EAAK,CAAC,CAAC,EAChCL,EAAQ,mBAAmBK,EAAK,CAAC,GAAK,EAAE,EAC1CD,EAAML,CAAG,GAAK,MACX,MAAM,QAAQK,EAAML,CAAG,CAAC,IAC3BK,EAAML,CAAG,EAAI,CAACK,EAAML,CAAG,CAAC,GAE1BK,EAAML,CAAG,EAAE,KAAKC,CAAK,GAGrBI,EAAML,CAAG,EAAIC,EAGjB,OAAOI,CACT,CApBgBV,EAAAQ,GAAA,cCjCT,SAASI,GACdC,EACAC,EACAC,EACG,CACH,IAAIC,EAAQH,EAAIC,CAAG,EACnB,OAAIE,IAAU,SACZA,EAAQD,EAASD,EAAKD,CAAG,EACzBA,EAAIC,CAAG,EAAIE,GAENA,CACT,CAXgBC,EAAAL,GAAA,aAqBhB,eAAsBM,GACpBL,EACAC,EACAC,EACY,CACZ,IAAIC,EAAQH,EAAIC,CAAG,EACnB,OAAIE,IAAU,SACZA,EAAQ,MAAMD,EAASD,EAAKD,CAAG,EAC/BA,EAAIC,CAAG,EAAIE,GAENA,CACT,CAXsBC,EAAAC,GAAA,kBAaf,SAASC,GAAKN,EAAU,CAC7B,OAAIA,GAAO,KACLA,EAAI,MAAQ,KACPA,EAAI,KAETA,EAAI,QAAU,KACTA,EAAI,OAEN,OAAO,KAAKA,CAAG,EAAE,OAEnB,CACT,CAXgBI,EAAAE,GAAA,QAaT,SAASC,GAAQC,EAA4B,CAClD,OAAQA,GAAS,MAAQA,EAAM,OAAS,EAAKA,EAAMA,EAAM,OAAS,CAAC,EAAI,MACzE,CAFgBJ,EAAAG,GAAA,QAKT,SAASE,GAAMN,EAAqB,CACzC,GAAI,CACF,GAAIA,GAAS,KACX,OAAI,MAAM,QAAQA,CAAK,GAEd,OAAOA,GAAU,SADjBA,EAAM,QAAU,EAGhBA,GAAO,MAAQ,KACfA,EAAM,MAAQ,EAEd,OAAO,KAAKA,CAAK,EAAE,QAAU,CAE1C,OACOO,EAAP,CACE,QAAQ,KAAK,+BAAgCP,EAAOO,CAAG,CACzD,CACA,MAAO,EACT,CAjBgBN,EAAAK,GAAA,SAoBT,SAASE,GAAeX,EAAW,CAExC,OAAI,OAAOA,CAAG,IAAMA,EACXA,EAGF,KAAK,MAAMY,EAAkBZ,CAAG,CAAC,CAC1C,CAPgBI,EAAAO,GAAA,eAUT,SAASE,GAA0Bb,EAAW,CAEnD,OAAI,OAAOA,CAAG,IAAMA,EACXA,EAGF,KAAK,MAAMY,EAAkBZ,CAAG,CAAC,CAC1C,CAPgBI,EAAAS,GAAA,mBA8BT,SAASC,GACdC,EACkB,CAClB,IAAMC,EAAQ,IAAI,IAClB,OAAQ,GAAe,CACrB,GAAIA,EAAM,IAAI,CAAC,EACb,OAAOA,EAAM,IAAI,CAAC,EAEpB,IAAMC,EAASF,EAAG,CAAC,EACnB,OAAAC,EAAM,IAAI,EAAGC,CAAM,EACZA,CACT,CACF,CAZgBb,EAAAU,GAAA,WAcT,SAASI,GACdH,EAC8B,CAC9B,IAAMC,EAAQ,IAAI,IAClB,MAAO,UAAU,IAAwB,CACvC,IAAMf,EAAMW,EAAkB,CAAC,EAC/B,GAAII,EAAM,IAAIf,CAAG,EACf,OAAOe,EAAM,IAAIf,CAAG,EAEtB,IAAMgB,EAAS,MAAMF,EAAG,GAAG,CAAC,EAC5B,OAAAC,EAAM,IAAIf,EAAKgB,CAAM,EACdA,CACT,CACF,CAbgBb,EAAAc,GAAA,gBAgBT,SAASC,GACdC,EACAL,EACK,CACL,IAAME,EAAS,CAAC,EAChB,QAASI,EAAI,EAAGA,EAAID,EAAOC,IACzBJ,EAAO,KAAKF,EAAGM,EAAGD,CAAK,CAAC,EAE1B,OAAOH,CACT,CATgBb,EAAAe,GAAA,YCvJhB,IAAMG,GAAgB,wBAChBC,GAAiB,iDACjBC,GAAiB,gDAEjBC,GAAMC,EAAO,WAAY,OAAO,EAE/B,SAASC,GAAaC,EAA6B,CACxD,OAAO,OAAOA,GAAO,SAAWA,EAAMA,EAAG,QAAU,EACrD,CAFgBC,EAAAF,GAAA,gBAIT,SAASG,GAAaC,EAAqB,CAChD,OAAOA,EAAI,QAAQ,4BAA6B,MAAM,CACxD,CAFgBF,EAAAC,GAAA,gBAIT,IAAME,GAAN,KAAU,CAMf,YAAYC,EAA0BC,EAAgB,CAJtD,iBAAsC,CAAC,EACvC,WAAkB,CAAC,EAIjB,IAAIC,EAAiBD,GAAS,GAC1BE,EAuBJ,GArBIH,aAAmB,QACjBC,GAAS,OACXC,EAASF,EAAQ,OAEnBG,EAAMH,EAAQ,QAGdG,EAAMH,EAISE,GAAUA,EAAO,SAAS,GAAG,IAE5CA,EAASA,EAAO,QAAQ,IAAK,EAAE,EAC/BC,EAAMA,EAAI,QAAQd,GAAgBe,GAEzBA,EAAE,CAAC,IAAM,KAAOA,EAAI,EAC5B,GAIC,EAAEJ,aAAmB,QAAS,CAChC,IAAIK,EAAQ,EACZF,EAAMA,EAAI,QAAQb,GAAgB,CAACQ,EAAKQ,KAEtCD,GAAS,EACLC,GAEAA,IAAS,SACNA,IAAS,UACT,CAAC,KAAK,YAAYA,CAAI,EAEzB,KAAK,YAAYA,CAAI,EAAID,EAEzBb,GAAI,MAAM,sCAAsCc,GAAM,EAEjD,KAEFR,EACR,EACD,KAAK,MAAQ,OAAO,KAAK,KAAK,WAAW,EAK3CK,EAAMT,GAAaS,CAAG,EACtBZ,GAAe,UAAY,EAC3B,IAAMgB,EAAQhB,GAAe,KAAKY,CAAG,EACjCI,IACF,KAAK,WAAa,CAChB,GAAI,IAAI,OAAO,GAAGA,EAAM,CAAC,WAAW,EACpC,OAAQA,EAAQA,EAAM,CAAC,IAAM,IAAM,CAACA,CACtC,EACAJ,EAAMA,EAAI,OAAOI,EAAM,CAAC,EAAE,MAAM,GAGlC,KAAK,GAAK,IAAI,OAAOJ,EAAKD,CAAM,CAClC,CAqBA,IAAI,WAAoB,CACtB,OAAO,KAAK,GAAG,SACjB,CAEA,IAAI,UAAUG,EAAe,CAC3B,KAAK,GAAG,UAAYA,CACtB,CAEA,aAAaG,EAAQ,CACnB,GAAI,KAAK,WAAY,CACnB,IAAMC,EAAcD,EAAE,MAAM,MAAM,EAAGA,EAAE,KAAK,EAC5C,GAAI,KAAK,WAAW,SAAW,KAAK,WAAW,GAAG,KAAKC,CAAW,EAChE,OAAO,KAEX,QAAWH,KAAQ,KAAK,MACtBE,EAAEF,CAAI,EAAIE,EAAE,KAAK,YAAYF,CAAI,CAAC,EAEpC,OAAOE,CACT,CAEA,KAAKV,EAAa,CAChB,IAAIU,EACJ,KAAQA,EAAI,KAAK,GAAG,KAAKV,CAAG,GAI1B,GAHI,KAAK,GAAG,YAAcU,EAAE,OAC1B,KAAK,GAAG,YACVA,EAAI,KAAK,aAAaA,CAAC,EACnBA,GAAK,KACP,OAAOA,CAEb,CAEA,QAAQV,EAAa,CACnB,IAAMY,EAAU,CAAC,EACbF,EAEJ,IADA,KAAK,GAAG,UAAY,EACZA,EAAI,KAAK,KAAKV,CAAG,GACvBY,EAAQ,KAAKF,CAAC,EAEhB,YAAK,GAAG,UAAY,EAEbE,CACT,CAEA,QAAQZ,EAAaa,EAAgC,CACnD,IAAMC,EAAK,OAAOD,GAAgB,WAAaA,EAAc,IAAMA,EACnE,OAAOb,EAAI,QAAQ,KAAK,GAAKU,GAEpBI,EAAGJ,CAAC,CACZ,CACH,CACF,EA1IaZ,EAAAG,GAAA,OChBb,IAAMc,GAAmB,IAElB,SAASC,GAAaC,EAAaC,EAGtC,CAAC,EAAW,CACd,GAAM,CAAE,UAAAC,EAAYJ,EAAiB,EAAIG,EACrCE,EAAO,GAOX,QAAS,EAAI,EAAG,EAAIH,EAAK,OAAQ,IAC/BG,GAAQ,GAAGH,EAAK,CAAC,EAAE,IAAKI,GAAkB,CACxC,GAAIA,GAAS,MAAQA,IAAU,GAC7B,MAAO,GACT,GAAIC,GAAUD,CAAK,EACjB,OAAOA,EAAQ,EAAI,EACrB,IAAIE,EAAI,OAAOF,CAAK,EAGpB,OAFIG,GAASH,CAAK,GAAKI,EAAQJ,CAAK,KAClCE,EAAIG,EAAkBL,CAAK,GACzBE,EAAE,SAAS,GAAG,GAAKA,EAAE,SAAS;AAAA,CAAI,GAAKA,EAAE,SAASJ,CAAS,EACtD,IAAII,EAAE,QAAQ,KAAM,IAAI,KAC1BA,CACT,CAAC,EAAE,KAAKJ,CAAS;AAAA,EAGnB,OAAOC,CACT,CA5BgBO,EAAAX,GAAA,gBA8BT,SAASY,GAASC,EAAaX,EAElC,CAAC,EAAG,CAEN,IAAIY,EAA0B,6DAC1BZ,EAAI,YACNY,EAA0B,IAAI,OAAOA,EAAwB,OAAO,WAAW,QAASC,GAAab,EAAI,SAAS,CAAC,EAAGY,EAAwB,KAAK,GAErJ,IAAME,EAAiB,CAAC,EACpBC,EAAa,CAAC,EACdC,EACEC,EAAO,GAAGN,EAAI,WAAW;AAAA,EAAQ;AAAA,CAAI,EAAE,KAAK;AAAA,EAGlD,KAAOK,EAAIJ,EAAwB,KAAKK,CAAI,GAAG,CAC7C,IAAIC,EAAQF,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAK,GAC5BE,EAAQA,EAAM,WAAW,KAAM,GAAG,EAClCH,EAAI,KAAKG,CAAK,EACVF,EAAE,CAAC,IAAM;AAAA,IACXF,EAAM,KAAKC,CAAG,EACdA,EAAM,CAAC,GAGX,OAAOD,CACT,CAxBgBL,EAAAC,GAAA,YA0BT,SAASS,GAAkBR,EAAaX,EAE3C,CAAC,EAAG,CACN,IAAMc,EAAQJ,GAASC,EAAKX,CAAG,EACzBoB,EAASN,EAAM,CAAC,EACtB,OAAOA,EAAM,MAAM,CAAC,EAAE,IAAIO,GACxB,OAAO,YAAaA,EAAE,IAAI,CAACC,EAAGC,IAAM,CAACH,EAAOG,CAAC,EAAGD,CAAC,CAAC,CAAC,CACrD,CACF,CARgBb,EAAAU,GAAA,qBCtDhB,IAAMK,GAAaC,EAAO,cAAc,EAkBxC,eAAeC,GAAaC,EAAqC,CAC3D,OAAOA,GAAe,WACxB,MAAMC,EAAUD,EAAW,CAAC,EAErBE,EAAUF,CAAU,EAC3B,MAAMA,EAEC,OAAOA,EAAW,SAAY,WACrC,MAAMC,EAAUD,EAAW,QAAQ,CAAC,EAE7BE,EAAUF,EAAW,OAAO,EACnC,MAAMA,EAAW,QAEV,OAAOA,EAAW,SAAY,WACrC,MAAMC,EAAUD,EAAW,QAAQ,CAAC,EAE7BE,EAAUF,EAAW,OAAO,GACnC,MAAMA,EAAW,OACrB,CAlBeG,EAAAJ,GAAA,gBA2BR,SAASK,GAAWC,EAAsD,CAC/E,IAAIC,EAAMD,EACNC,GAAO,OACLC,GAASD,CAAG,EACdA,EAAM,CAAE,KAAMA,CAAI,EACX,UAAWA,GAAO,UAAWA,IACpCA,EAAM,CAAE,KAAMA,EAAI,MAAO,IAAKA,CAAI,IAGtC,IAAME,EAAOF,GAAK,KACZG,EAAMH,GAAK,KAAOT,GAClBa,EAAsB,CAAC,EAEvBC,EAAUR,EAAA,MAAOH,GAAwC,CACzDA,GAAc,MAAQU,EAAQ,SAASV,CAAU,IACnDY,GAAmBF,EAASG,GAAMA,IAAOb,CAAU,EACnD,MAAMD,GAAaC,CAAU,EAEjC,EALgB,WAQVc,EAAUX,EAAA,SAA2B,CAGzC,IAFIK,GACFC,EAAI,MAAM,YAAYD,OAAUE,EAAQ,gBAAgB,EACnDA,EAAQ,OAAS,GACtB,MAAMC,EAAQD,EAAQ,CAAC,CAAC,CAC5B,EALgB,WAOVK,EAAQZ,EAACa,GAAiD,CAC9D,GAAIA,GAAO,KAEX,OAAAN,EAAQ,QAAQM,CAAG,EACZ,IAAML,EAAQK,CAAG,CAC1B,EALc,SAOd,OAAO,OAAO,OAAOF,EAAS,CAC5B,MAAAC,EACA,IAAKA,EACL,QAAAJ,EACA,QAAAG,EACA,KAAMA,EACN,SAAU,CACR,OAAOJ,EAAQ,MACjB,EACA,YAAa,CACX,OAAOA,EAAQ,QAAU,CAC3B,CACF,CAAC,CACH,CAhDgBP,EAAAC,GAAA,cAqDT,IAAMa,GAAcb,GAEpB,SAASc,GACdb,EAEI,CAAC,EACL,CACA,GAAM,CAAE,KAAAc,EAAO,MAAO,EAAId,EACpBe,EAAoB,CAAC,EAMrBC,EAAOlB,EAAA,MAAOmB,EAAa,KAAU,CACzC,KAAOF,EAAM,OAAS,GAAG,CACvB,IAAMG,EAAOH,EAAM,CAAC,EAEpB,GADAR,GAAmBQ,EAAOP,GAAMA,IAAOU,CAAI,EACvC,OAAOA,GAAS,WAAY,CAC9B,IAAMC,EAASD,EAAK,EACpB,GAAIrB,EAAUsB,CAAM,EAAG,CACrB,GAAIF,EACF,MAAM,IAAI,MACR,iDAAiDC,GACnD,EAEF,MAAMC,WAGDtB,EAAUqB,CAAI,EAAG,CACxB,GAAID,EACF,MAAM,IAAI,MACR,iDAAiDC,GACnD,EAEF,MAAMA,MAGN,OAAM,IAAI,MAAM,yBAAyBA,GAAM,EAGrD,EA3Ba,QAqCb,OAAO,OAAO,OAAOF,EAAM,CACzB,IATUlB,EAACa,GAAkB,CACzBG,IAAS,OACXC,EAAM,QAAQJ,CAAG,EAGjBI,EAAM,KAAKJ,CAAG,CAClB,EANY,OAUV,KAAAK,EACA,SAAU,CACR,OAAOD,EAAM,MACf,CACF,CAAC,CACH,CAxDgBjB,EAAAe,GAAA,YA4DT,SAASO,GACdC,EACAC,EAAU,EACQ,CAClB,IAAIC,EAAqB,WAAWF,EAAIC,CAAO,EAC/C,MAAO,IAAM,CACPC,IACF,aAAaA,CAAa,EAC1BA,EAAgB,OAEpB,CACF,CAXgBzB,EAAAsB,GAAA,cAaT,SAASI,GAAYH,EAAcI,EAAoC,CAC5E,IAAIC,EAAsB,YAAYL,EAAII,CAAQ,EAClD,MAAO,IAAM,CACPC,IACF,cAAcA,CAAc,EAC5BA,EAAiB,OAErB,CACF,CARgB5B,EAAA0B,GAAA,eAUT,SAASG,GACdC,EACAC,EACAR,KACGS,EACe,CAClB,OAAIF,GAAW,KACN,IAAM,CAAC,GAEZA,EAAQ,GACVA,EAAQ,GAAGC,EAAWR,EAAI,GAAGS,CAAI,EAE1BF,EAAQ,kBACfA,EAAQ,iBAAiBC,EAAWR,EAAI,GAAGS,CAAI,EAE1C,IAAM,CACPF,EAAQ,IACVA,EAAQ,IAAIC,EAAWR,EAAI,GAAGS,CAAI,EAE3BF,EAAQ,qBACfA,EAAQ,oBAAoBC,EAAWR,EAAI,GAAGS,CAAI,CACtD,EACF,CAtBgBhC,EAAA6B,GAAA,oBCtLT,SAASI,IAAkB,CAChC,IAAIC,EAAQ,GACZ,MAAO,CAACC,EAAIC,IAAW,CACrB,IAAIC,EAAW,GACf,GAAIH,EAAO,CACTA,EAAQ,GACR,GAAI,CACFC,EAAG,EACHE,EAAW,EACb,QACA,CACEH,EAAQ,EACV,OAEOE,IAAW,QAClBA,EAAO,EAET,OAAOC,CACT,CACF,CAnBgBC,EAAAL,GAAA,YAqBT,SAASM,IAA4B,CAC1C,IAAIL,EAAQ,GACZ,MAAO,OAAOC,EAAIC,IAAW,CAC3B,IAAIC,EAAW,GACf,GAAIH,EAAO,CACTA,EAAQ,GACR,GAAI,CACF,IAAMM,EAASL,EAAG,EACdM,EAAUD,CAAM,GAClB,MAAMA,EACRH,EAAW,EACb,QACA,CACEH,EAAQ,EACV,UAEOE,IAAW,OAAW,CAC7B,IAAMI,EAASJ,EAAO,EAClBK,EAAUD,CAAM,GAClB,MAAMA,EAEV,OAAOH,CACT,CACF,CAvBgBC,EAAAC,GAAA,iBCnBhB,IAAMG,GAAMC,EAAO,eAAgB,OAAO,EAoB7BC,EAAN,KAGiB,CAHjB,cAIL,iBAAmB,CAAC,EACpB,sBAA0B,CAAC,EAG3B,aAAUC,GAAW,EAErB,UAAuB,IAAI,MAAsB,CAAC,EAAU,CAC1D,IACE,CAACC,EAAaC,IACZ,SAAUC,IACR,MAAM,KAAK,KAAKD,EAAM,GAAGC,CAAI,CACrC,CAAC,EAED,MAAa,KACXC,KACGD,EACe,CAClB,IAAIE,EAAK,GAET,GAAI,CACF,IAAMC,EAAe,KAAK,YAAYF,CAAK,GAAK,CAAC,EAKjD,GAFA,KAAK,iBAAiB,QAAQG,GAAMA,EAAGH,EAAO,GAAGD,CAAI,CAAC,EAElDG,EAAY,OAAS,EAAG,CAC1B,IAAME,EAAMF,EAAY,IAAKC,GAAO,CAClC,GAAI,CACF,OAAOE,EAAUF,EAAG,GAAGJ,CAAI,CAAC,CAC9B,OACOO,EAAP,CACEb,GAAI,KAAK,gBAAiBa,CAAG,CAC/B,CACA,OAAO,IACT,CAAC,EAAE,OAAOH,GAAMA,GAAM,IAAI,EAC1BF,EAAK,GACL,MAAM,QAAQ,IAAIG,CAAG,EAEzB,OACOE,EAAP,CACEb,GAAI,MAAM,iBAAkBa,CAAG,CACjC,CACA,OAAOL,CACT,CAEO,MAAME,EAAoB,CAC/B,KAAK,iBAAiB,KAAKA,CAAE,CAC/B,CAEO,GACLH,EACAO,EACkB,CAClB,IAAML,EAAe,KAAK,YAAYF,CAAK,GAAK,CAAC,EACjD,OAAAE,EAAY,KAAKK,CAAQ,EACzB,KAAK,YAAYP,CAAK,EAAIE,EACnB,IAAM,CACX,KAAK,IAAIF,EAAOO,CAAQ,CAC1B,CACF,CAEO,OAAOC,EAAkC,CAC9C,OAAW,CAACV,EAAMW,CAAO,IAAK,OAAO,QAAQD,CAAQ,EACnD,KAAK,GAAGV,EAAaW,CAAc,CACvC,CAEO,KACLT,EACAO,EACkB,CAClB,IAAMG,EAAeC,EAAA,SAAUZ,KAC7B,KAAK,IAAIC,EAAOU,CAAmB,EAC5B,MAAML,EAAUE,EAAS,GAAGR,CAAI,CAAC,GAFrB,gBAIrB,YAAK,GAAGC,EAAOU,CAAmB,EAC3B,IAAM,CACX,KAAK,IAAIV,EAAOO,CAAQ,CAC1B,CACF,CAEO,IACLP,EACAO,EACM,CAEN,YAAK,YAAYP,CAAK,GAAK,KAAK,YAAYA,CAAK,GAAK,CAAC,GAAG,OACvDY,GAAWL,GAAYK,IAAML,CAChC,EACO,IACT,CAEO,oBAA2B,CAChC,YAAK,YAAc,CAAC,EACb,IACT,CACF,EAnGaI,EAAAhB,EAAA,WA8GN,SAASkB,IAA+C,CAC7D,IAAIC,EAAUC,GAAiB,EAAE,QACjC,OAAKD,IACHA,EAAU,IAAInB,EACdoB,GAAiB,EAAE,QAAUD,GAExBA,CACT,CAPgBH,EAAAE,GAAA,oBAWT,IAAMG,GAAW,IAAIrB,EASrB,SAASsB,GACdH,EACAI,EACyD,CACzD,IAAMpB,EAAO,KAAK,MAAMqB,EAA0B,EAAI,GAAG,EAEnDC,EAAsB,CAAC,EACzBC,EAEEC,EAAWX,EAAA,CAACY,EAAaC,IAAa,CAC1C,IAAMC,EAAK,CAAE,IAAAF,EAAK,IAAAC,CAAI,EAEtBJ,EAAO,KAAKK,CAAE,EACdJ,GAAeA,EAAY,CAC7B,EALiB,YAOjB,OAAIH,EACEJ,EAAQ,GACVA,EAAQ,GAAGI,EAAcM,GAAa,CACpCF,EAASJ,EAAaM,CAAG,CAC3B,CAAC,EAEMV,EAAQ,iBACfA,EAAQ,iBAAiBI,EAAcM,GAAa,CAClDF,EAASJ,EAAaM,CAAG,CAC3B,CAAC,EAGD/B,GAAI,MAAMK,EAAM,sBAAsB,EAIpCgB,EAAQ,MACVA,EAAQ,MAAM,CAACS,EAAaC,IAAa,CACvCF,EAASC,EAAKC,CAAG,CACnB,CAAC,EAGD/B,GAAI,MAAMK,EAAM,2BAA4BgB,CAAO,EAI5CH,EAAA,CAACY,EAAcG,EAAgB,KACjC,IAAI,QAAQ,CAACC,EAASC,IAAW,CACjCL,IACHA,EAAML,EACDK,GACCH,EAAO,SAETG,EAAMH,EAAO,CAAC,EAAE,MAKtBC,EAAcV,EAAA,IAAM,CAElB,KAAOS,EAAO,OAAS,GAAG,CACxB,IAAMK,EAAgBL,EAAO,MAAM,EAEnC,GAAIK,EAAG,MAAQF,EACbF,EAAc,OACdM,EAAQF,EAAG,GAAG,MAEX,CACH,GAAIC,EAAe,CACjBjC,GAAI,KAAKK,EAAM,mBAAmByB,iBAAmBE,EAAG,KAAK,EAC7D,SAEFG,EAAO,IAAI,MAAM,YAAYL,gBAAkBE,EAAG,kBAAkBA,EAAG,KAAK,CAAC,EAC7EhC,GAAI,MAAMK,EAAM,mBAAmByB,iBAAmBE,EAAG,KAAK,EAEhE,MAEJ,EAnBc,eAoBdJ,EAAY,CACd,CAAC,EAjCQ,KAqCb,CA/EgBV,EAAAM,GAAA,gBC1JT,IAAMY,GAAeC,EAAA,IAAc,KAAK,IAAI,EAAvB,gBAGrB,SAASC,GAAmBC,EAAoB,CACrD,OAAOA,EAAK,IAAM,IAAIA,EAAK,KAAM,QAAQ,CAAC,KAAO,GAAGA,EAAG,QAAQ,CAAC,KAClE,CAFgBF,EAAAC,GAAA,sBAIT,SAASE,MACXC,EACe,CAClB,QAAWC,KAAiBD,EAAgB,CAC1C,GAAIC,aAAyB,KAC3B,OAAOA,EAET,GAAI,OAAOA,GAAkB,SAAU,CACrC,IAAIC,EAAO,KACX,GAAID,EAAc,SAAS,GAAG,EAC5B,GAAI,CACFC,EAAO,IAAI,KAAKD,CAAa,CAC/B,MACA,CAAa,CAEf,GAAI,EAAEC,aAAgB,MAAO,CAC3B,IAAMC,EAAI,2BAA2B,KAAKF,CAAa,EACnDE,IACFD,EAAO,IAAI,KAAK,CAACC,EAAE,CAAC,EAAG,CAACA,EAAE,CAAC,EAAI,EAAG,CAACA,EAAE,CAAC,EAAG,GAAI,CAAC,GAElD,GAAID,aAAgB,KAClB,OAAOA,GAGf,CAxBgBN,EAAAG,GAAA,aCLhB,GAAM,CAAE,OAAQK,GAAU,OAAQC,EAAS,EAAIC,EAAQ,EAAE,EACnD,CAAE,OAAQC,GAAU,OAAQC,EAAS,EAAIF,EAAQ,EAAE,EAInDG,GAAkB,GAEjB,SAASC,IAAwB,CACtC,OAAOC,EAAiBF,EAAe,CACzC,CAFgBG,EAAAF,GAAA,aAMT,SAASG,GAAQC,EAAQJ,GAAU,EAAW,CACnD,OAAON,GAASU,EAAO,EAAE,CAC3B,CAFgBF,EAAAC,GAAA,WAIT,SAASE,GAAcD,EAA2B,CACvD,OAAOV,GAASU,EAAO,EAAE,CAC3B,CAFgBF,EAAAG,GAAA,iBAIT,SAASC,GAAcC,EAA0B,CACtD,OAAOZ,GAASY,EAAMR,EAAe,CACvC,CAFgBG,EAAAI,GAAA,iBAMT,SAASE,GAAQJ,EAAQJ,GAAU,EAAW,CACnD,OAAOH,GAASO,EAAO,EAAE,CAC3B,CAFgBF,EAAAM,GAAA,WAIT,SAASC,GAAcL,EAA2B,CACvD,OAAOP,GAASO,EAAO,EAAE,CAC3B,CAFgBF,EAAAO,GAAA,iBAIT,SAASC,GAAcH,EAA0B,CACtD,OAAOT,GAASS,EAAMR,EAAe,CACvC,CAFgBG,EAAAQ,GAAA,iBAOhB,IAAMC,GAAU,uCAEHC,GAAU,OAAO,OAAW,KAAe,OAAO,YAAc,KACzE,OAAO,WAAW,KAAK,MAAM,EAC7B,IAAMD,GAAQ,QAAQ,SAAWE,IAAYA,EAAKZ,EAAiB,CAAC,EAAE,CAAC,EAAK,IAAOY,EAAI,GAAM,SAAS,EAAE,CAAC,EAEtG,SAASC,GAAaV,EAA2B,CACtD,IAAMW,EAAKC,GAAMZ,CAAK,EACtB,MAAO,GAAGW,EAAG,MAAM,EAAG,CAAC,KAAKA,EAAG,MAAM,EAAG,EAAE,KAAKA,EAAG,MAAM,GAAI,EAAE,KAAKA,EAAG,MAAM,EAAE,GAChF,CAHgBb,EAAAY,GAAA,gBAKT,SAASG,GAAaV,EAA0B,CACrD,OAAOW,GAAQX,EAAK,WAAW,IAAK,EAAE,CAAC,CACzC,CAFgBL,EAAAe,GAAA,gBAkBhB,IAAME,GAAoB,MAI1B,SAASC,GAAgBC,EAAc,CACrC,IAAMC,EAAY,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAAC,EAC7ClB,EAAQkB,EAAU,OAAS,EACjC,QAASC,EAAQ,EAAGA,EAAQD,EAAU,OAAQC,IAAS,CACrD,IAAMC,EAAOH,EAAO,IACpBC,EAAUlB,EAAQmB,CAAK,EAAIC,EAC3BH,GAAQA,EAAOG,GAAQ,IAEzB,OAAOF,CACT,CATSpB,EAAAkB,GAAA,mBAmBF,SAASK,IAAwB,CACtC,IAAMC,EAAKC,GAAa,EAAIR,GAC5B,OAAO,IAAI,WAAW,CAAC,GAAGC,GAAgBM,CAAE,EAAG,GAAGzB,EAAiB,EAAE,CAAC,CAAC,CACzE,CAHgBC,EAAAuB,GAAA,aAKT,SAASG,IAAe,CAC7B,OAAOC,GAAWJ,GAAU,CAAC,CAC/B,CAFgBvB,EAAA0B,GAAA,QAIT,SAASE,GAASf,EAAkB,CACzC,OAAOgB,GAAcC,GAAWjB,CAAE,CAAC,CACrC,CAFgBb,EAAA4B,GAAA,YAIT,SAASC,GAAchB,EAAsB,CAClD,OAAO,IAAI,KACTI,GAAoBJ,EAAG,MAAM,EAAG,CAAC,EAAE,OAAO,CAACkB,EAAKT,IAASS,EAAM,IAAMT,EAAM,CAAC,CAC9E,CACF,CAJgBtB,EAAA6B,GAAA,iBAQT,IAAMG,GAAYhC,EAAA,IAAM,IAAI,YAAYD,EAAiB,CAAC,CAAC,EAAE,CAAC,EAA5C,aAInBkC,GAAW,CACf,OAAQ,CACN,KAAMhC,GACN,WAAYG,GACZ,WAAYD,EACd,EACA,OAAQ,CACN,KAAMG,GACN,WAAYE,GACZ,WAAYD,EACd,EACA,OAAQ,CACN,KAAMG,GACN,WAAYK,GACZ,WAAYH,EACd,CACF,EAEIsB,GAA+B,SAC/BC,GAAU,GAEP,SAASC,GAAuBC,EAA6BC,EAAS,GAAO,CAClFJ,GAAQG,EACRF,GAAUG,CACZ,CAHgBtC,EAAAoC,GAAA,0BAKT,SAAS/B,GAAe,CAC7B,OAAO4B,GAASC,EAAK,EAAE,KAAKC,GAAUZ,GAAU,EAAIzB,GAAU,CAAC,CACjE,CAFgBE,EAAAK,EAAA,QAIT,SAASyB,GAAWzB,EAA0B,CACnD,OAAO4B,GAASC,EAAK,EAAE,WAAW7B,CAAI,CACxC,CAFgBL,EAAA8B,GAAA,cAIT,SAASH,GAAWzB,EAA2B,CACpD,OAAO+B,GAASC,EAAK,EAAE,WAAWhC,CAAK,CACzC,CAFgBF,EAAA2B,GAAA,cAIT,SAASY,GAAYlC,EAAuB,CACjD,GAAI,CAEF,OADYyB,GAAWzB,CAAI,EAChB,SAAWR,EACxB,MACA,CAEA,CACA,MAAO,EACT,CATgBG,EAAAuC,GAAA,eAahB,IAAMC,GAAyC,CAAC,EAEzC,SAASC,EAAMC,EAAO,KAAc,CACzC,OAAIF,GAAeE,CAAI,GAAK,OAC1BF,GAAeE,CAAI,EAAI,GAElB,GAAGA,KAAQF,GAAeE,CAAI,KACvC,CALgB1C,EAAAyC,EAAA,SAOhB,IAAIE,GAAO,EAEJ,SAASC,IAAc,CAC5B,MAAO,MAAMD,MACf,CAFgB3C,EAAA4C,GAAA,OCxKT,IAAeC,GAAf,cAA+BC,CAMnC,CANI,kCAOL,QAAaC,EAAK,EAGlB,OAAQ,CACD,KAAK,QAAQ,CACpB,CACF,EAbsBC,EAAAH,GAAA,WAgBf,IAAMI,GAAN,cAA2BJ,EAAQ,CAAnC,kCACL,iBAAc,GAId,YAAYK,EAAW,CAChB,KAAK,OAAO,KAAK,UAAW,CAC/B,KAAAA,EACA,OAAQ,QACR,YAAaH,EAAK,CACpB,CAAC,CACH,CACF,EAZaC,EAAAC,GAAA,gBAcN,SAASE,IAAuD,CACrE,IAAMC,EAAK,IAAIH,GACTI,EAAK,IAAIJ,GAEf,OAAAG,EAAG,MAAQC,EACXA,EAAG,MAAQD,EAEJ,CAACA,EAAIC,CAAE,CAChB,CARgBL,EAAAG,GAAA,0BC1CT,IAAMG,GAAN,KAAqC,CAC1C,MAAM,OAAOC,EAAgC,CAC3C,OAAOA,CACT,CAEA,MAAM,OAAOA,EAAgC,CAC3C,OAAOA,CACT,CACF,EARaC,EAAAF,GAAA,eAUN,IAAMG,EAAN,KAAqC,CAC1C,MAAM,OAAOF,EAAgC,CAC3C,OAAOG,GAAiBH,CAAI,CAC9B,CAEA,MAAM,OAAOA,EAAgC,CAC3C,OAAOI,GAAiBJ,CAAI,CAC9B,CACF,EARaC,EAAAC,EAAA,eAUN,IAAMG,GAAN,KAAuC,CAG5C,YAAYC,EAAgB,CAC1B,KAAK,IAAMA,CACb,CAEA,MAAM,OAAON,EAAgC,CAC3C,IAAMO,EAAQJ,GAAiBH,CAAI,EACnC,OAAO,MAAMQ,GAAQD,EAAO,KAAK,GAAG,CACtC,CAEA,MAAM,OAAOP,EAAgC,CAC3C,IAAMO,EAAQ,MAAME,GAAQT,EAAM,KAAK,GAAG,EAC1C,OAAOI,GAAiBG,CAAK,CAC/B,CACF,EAhBaN,EAAAI,GAAA,iBCsBN,IAAMK,GAAqBC,EAAA,CAChCC,EACAC,EACAC,EAAyB,CAAC,IAExB,IAAI,MAASA,EAAmB,CAC9B,IAAK,CAACC,EAAaC,IACbA,KAAQD,EACHA,EAAOC,CAAI,EACb,IAAIC,IAAmBL,EAAGI,EAAMC,EAAMJ,CAAG,CAEpD,CAAC,EAX6B,sBAqB3B,SAASK,GACdL,EAQI,CAAC,EACO,CACZ,GAAM,CACJ,KAAAG,EAAOG,EAAM,KAAK,EAClB,QAAAC,EAAU,IAAIC,EACd,WAAAC,EAAa,IACb,gBAAAC,EAAkB,GAClB,SAAAC,EAAW,EACb,EAAIX,EAEEY,EAAMC,EAAOV,EAAMQ,CAAQ,EAE3BG,EAAW,CAAC,EACdC,EACEC,EAAmB,CAAC,EACtBC,EACEC,EAA2D,CAAC,EAE5DC,EAAUrB,EAAA,IAAM,CACpB,aAAamB,CAAe,CAC9B,EAFgB,WAIVG,EAAWtB,EAAA,SAAY,CAE3B,GADA,aAAamB,CAAe,EACxBF,EAAS,CACX,GAAIA,EAAQ,YACV,KAAOC,EAAM,QAAQ,CACnB,IAAMK,EAAUL,EAAM,CAAC,EACvB,GAAI,CACFD,EAAQ,YAAY,MAAMR,EAAQ,OAAOc,CAAO,CAAC,EACjDL,EAAM,MAAM,CACd,OACOM,EAAP,CACEV,EAAI,KAAK,cAAeU,CAAG,EAC3B,KACF,EAGAN,EAAM,OAAS,GAAKP,EAAa,IACnCQ,EAAkB,WAAWG,EAAUX,CAAU,GAEvD,EAnBiB,YAqBXc,EAAczB,EAAA,MAAOuB,GAAqB,CAC9CT,EAAI,sBAAuBS,CAAO,EAClCL,EAAM,KAAKK,CAAO,EAClB,MAAMD,EAAS,CACjB,EAJoB,eAMdI,EAAU1B,EAAA,MAAO2B,GAAwB,CAC7CV,EAAUU,EACVV,EAAQ,GAAG,UAAWK,CAAQ,EAC9BL,EAAQ,GAAG,UAAW,MAAOW,GAAa,CACxCd,EAAI,YAAa,OAAOc,CAAG,EAC3B,GAAM,CAAE,KAAAvB,EAAM,KAAAC,EAAM,GAAAuB,EAAI,OAAAC,EAAQ,MAAAC,CAAM,EAAI,MAAMtB,EAAQ,OAAOmB,EAAI,IAAI,EAGvE,GAAIvB,EAAM,CACRS,EAAI,QAAQT,QAAWwB,GAAI,EAC3B,GAAI,CAEF,GAAIb,EAASX,CAAI,GAAK,KACpB,MAAM,IAAI,MAAM,eAAeA,iBAAoB,EAGrD,IAAIyB,EAASd,EAASX,CAAI,EAAE,GAAGC,CAAI,EAC/B0B,EAAUF,CAAM,IAClBA,EAAS,MAAMA,GACjBhB,EAAI,UAAUgB,GAAQ,EAClBD,GACF,MAAMJ,EAAY,CAAE,GAAAI,EAAI,OAAAC,CAAO,CAAC,CACpC,OACOC,EAAP,CACE,IAAMP,EACFO,aAAiB,MAAQA,EAAQ,IAAI,MAAME,GAAcF,CAAK,CAAC,EACnEjB,EAAI,KAAK,kBAAmBU,EAAI,IAAI,EACpC,MAAMC,EAAY,CAChB,GAAAI,EACA,MAAO,CACL,QAASL,EAAI,QACb,MAAOA,EAAI,MACX,KAAMA,EAAI,IACZ,CACF,CAAC,CACH,UAIOK,EAEP,GADAf,EAAI,mBAAmBe,aAAcC,YAAiBC,GAAO,EACzDX,EAAmBS,CAAE,GAAK,KACxBC,IAAW,OACbhB,EAAI,qBAAqBe,GAAI,EAE7Bf,EAAI,KAAK,wBAAwBe,GAAI,MAEpC,CACH,GAAM,CAACK,EAASC,CAAM,EAAIf,EAAmBS,CAAE,EAC/C,GAAIK,GAAWC,EAEb,GADA,OAAOf,EAAmBS,CAAE,EACxBE,EAAO,CACT,IAAMP,EAAM,IAAI,MAAMO,EAAM,OAAO,EACnCP,EAAI,MAAQO,EAAM,MAClBP,EAAI,KAAOO,EAAM,KACjBjB,EAAI,KAAK,SAAUU,EAAI,IAAI,EAC3BW,EAAOX,CAAG,OAGVV,EAAI,UAAWgB,CAAM,EACrBI,EAAQJ,CAAM,OAOZlB,GACRE,EAAI,KAAK,oBAAqBc,CAAG,CAErC,CAAC,EAED,MAAMN,EAAS,CACjB,EAzEgB,WA2EVc,EAAepC,EAAA,MACnBK,EACAC,EACAJ,EAAuB,CAAC,IACH,CACrB,GAAM,CAAE,QAAAmC,EAAU,GAAK,EAAInC,EACrB2B,EAAKS,EAAK,EAChB,aAAMb,EAAY,CAChB,KAAApB,EACA,KAAAC,EACA,GAAAuB,CACF,CAAC,EACMU,GACL,IAAI,QACF,CAACL,EAASC,IAAYf,EAAmBS,CAAE,EAAI,CAACK,EAASC,CAAM,CACjE,EACAE,CACF,CACF,EAlBqB,gBAoBrB,OAAInC,EAAI,SACDwB,EAAQxB,EAAI,OAAO,EAEnB,CACL,QAAAmB,EACA,QAAAK,EACA,OAAyBc,EAAgB,CACvC,OAAO,OAAOxB,EAAUwB,CAAW,CACrC,EACA,MAAyB,CAEvB,OAAOzC,GAAsBqC,EAAc,CAAC,EAAG,CAC7C,QAAQK,EAA6B,CACnC,OAAO1C,GAAsBqC,EAAc,CAAE,GAAGK,CAAW,CAAC,CAC9D,CACF,CAA8B,CAChC,CACF,CACF,CA3KgBzC,EAAAO,GAAA,iBCxDT,IAAMmC,GAAN,cAAwEC,CAAW,CAWxF,YAAYC,EAAmB,CAC7B,MAAM,EA6DR,aAAU,KAAK,KAAK,KAAK,IAAI,EAC7B,eAAY,KAAK,GAAG,KAAK,IAAI,EA5D3B,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAU,IAAIC,EAAe,QAAAC,EAAS,MAAAC,EAAQ,EAAM,EAAIL,EAEtE,KAAK,QAAUI,EACf,KAAK,QAAUF,EACf,KAAK,MAAQG,EAEb,KAAK,KAAOJ,GAAQ,KAAK,QAAQ,IAAMK,EAAM,QAAQ,EACrD,KAAK,IAAMC,EAAO,GAAG,KAAK,SAAS,EAE/B,KAAK,QACP,KAAK,QAAQ,GAAG,UAAW,IAAM,CAC/B,KAAK,IAAI,mBAAmB,CAC9B,CAAC,EACD,KAAK,QAAQ,GAAG,aAAc,IAAM,CAClC,KAAK,IAAI,sBAAsB,CACjC,CAAC,GAGH,KAAK,QAAQ,GAAG,UAAW,MAAO,CAAE,KAAAC,CAAK,IAAM,CAC7C,IAAMC,EAAO,MAAM,KAAK,QAAQ,OAAOD,CAAI,EAI3C,GAHI,KAAK,MACP,KAAK,IAAI,0BAA0BC,GAAM,eAAgBA,CAAI,EAC1D,KAAK,IAAI,0BAA0BA,GAAM,OAAO,EACjDA,EAAM,CACR,GAAM,CAAE,MAAAC,EAAO,KAAAC,CAAK,EAAIF,EACxB,MAAM,KAAK,UAAUC,EAAO,GAAGC,CAAI,EAEvC,CAAC,CACH,CAnCA,IAAI,SAAU,CACZ,OAAO,KAAK,KAAK,OAAO,EAAG,CAAC,CAC9B,CAmCA,MAAc,UACZD,KACGC,EACe,CAClB,OAAO,MAAM,MAAM,KAAKD,EAAO,GAAGC,CAAI,CACxC,CAEA,MAAM,KACJD,KACGC,EACe,CAClB,GAAI,CAIF,GAHI,KAAK,MACP,KAAK,IAAI,QAAQ,OAAOD,CAAK,KAAMA,CAAK,EACrC,KAAK,IAAI,QAAQ,OAAOA,CAAK,KAAMC,EAAK,MAAM,EAC/C,CAAC,KAAK,QAAQ,YAChB,YAAK,IAAI,KAAK,uBAAuB,EAC9B,GAET,IAAMH,EAAO,MAAM,KAAK,QAAQ,OAAO,CAAE,MAAAE,EAAO,KAAAC,CAAK,CAAC,EACtD,YAAK,QAAQ,YAAYH,CAAI,EACtB,EACT,OACOI,EAAP,CACE,KAAK,IAAI,KAAK,QAAQ,OAAOF,CAAK,KAAME,CAAG,CAC7C,CACA,MAAO,EACT,CAIF,EA3EaC,EAAAf,GAAA,UA6EN,SAASgB,GACdd,EACA,CACA,OAAO,IAAIF,GAAUE,CAAG,CAC1B,CAJgBa,EAAAC,GAAA,aC7DhB,IAAIC,GAAa,EAgBjB,IAAMC,GAAmBC,EAACC,GAAWA,EAAZ,oBACnBC,GAAqBH,GAEpB,SAASI,GACdC,EACAC,EAC4B,CAC5B,GAAM,CACJ,KAAAC,EACA,GAAAC,EACA,WAAAC,EAAa,CAAC,EACd,UAAAC,EAAYV,GACZ,YAAAW,EAAcR,EAChB,EAAIG,EAEEM,EAAgB,IAAI,IAK1B,OAAAJ,EAAG,MAAOK,GAAS,CACjB,IAAMC,EAAMH,EAAYE,CAAI,EACtB,CAACE,EAAMC,EAAMC,EAAIC,CAAM,EAAIJ,EACjC,GAAIC,IAAS,GAAmBA,IAAS,EAAe,CACtD,IAAII,EAAQC,EACZ,GAAIF,GAAU,KACZ,GAAI,CACF,IAAMG,EAAMhB,EAAkBa,CAAM,EACpCC,EAAS,MAAME,EAAG,GAAGL,CAAI,CAC3B,OACOM,EAAP,CACEF,EAAQ,OAAOE,CAAC,CAClB,MAGAF,EAAQ,gCAENL,IAAS,GAAmBE,GAE5BV,EAAKG,EADHU,EACa,CAAC,EAAgBA,EAAOH,CAAE,EAE1B,CAAC,EAAiBE,EAAQF,CAAE,CAFD,CAAC,UAKxCA,EAAI,CACX,IAAMM,EAAUX,EAAc,IAAIK,CAAE,EAChCM,GAAW,OACTR,IAAS,EACXQ,EAAQ,OAAOP,CAAI,EAChBO,EAAQ,QAAQP,CAAI,GAE3BJ,EAAc,OAAOK,CAAE,EAE3B,CAAC,EAEM,IAAI,MACT,CAAC,EACD,CACE,IAAIO,EAAGN,EAAQ,CACb,IAAMO,EAAYxB,EAAA,IAAIe,IAAgB,CACpCT,EAAKG,EAAU,CAAC,EAAeM,EAAM,KAAME,CAAM,CAAC,CAAC,CACrD,EAFkB,aAGlB,GAAIZ,EAAQ,YAAcG,EAAW,SAASS,CAAa,EACzD,OAAAO,EAAU,QAAUA,EACbA,EAET,IAAMC,EAAWzB,EAAA,IAAIe,IACZ,IAAI,QAAQ,CAACW,EAASC,IAAW,CACtC,IAAMX,EAAKY,KACXjB,EAAc,IAAIK,EAAI,CAAE,QAAAU,EAAS,OAAAC,CAAO,CAAC,EACzCrB,EAAKG,EAAU,CAAC,EAAiBM,EAAMC,EAAIC,CAAM,CAAC,CAAC,CACrD,CAAC,EALc,YAOjB,OAAAQ,EAAS,QAAUD,EACZC,CACT,CACF,CACF,CACF,CA3EgBzB,EAAAG,GAAA,UC3BT,IAAM0B,EAAN,cAAuBC,CAI3B,CASD,YAAYC,EAAuB,CAAC,EAAG,CACrC,MAAM,EAPR,KAAQ,aAAe,GACvB,KAAQ,mBAAqB,GAC7B,KAAQ,UAAwB,CAAC,EAO/B,KAAK,YAAcA,EAAI,YAAc,EACrC,KAAK,gBAAkBA,EAAI,eAAiB,EAC5C,KAAK,mBAAqBA,EAAI,mBAAqB,GACnD,KAAK,KAAOA,EAAI,MAAQC,EAAM,UAAU,EAGxC,KAAK,QAAQ,IAAI,SAAY,CAC3B,QAAWC,KAAS,KAAK,UACvB,MAAMA,EAAM,QAAQ,EACtB,MAAM,KAAK,KAAK,kBAAmB,IAAI,CACzC,CAAC,CACH,CAGQ,QAAS,CACV,KAAK,KAAK,kBAAmB,IAAI,EAElC,KAAK,cAAgB,KAAK,oBACxB,KAAK,cAAc,GAAK,KAAK,kBAAkB,GACjD,KAAK,MAAM,CAEjB,CAGA,OAAQ,CACN,GAAI,KAAK,aAAc,CACrB,KAAK,aAAe,GACpB,QAAWA,KAAS,KAAK,UACvBA,EAAM,MAAM,EACd,KAAK,OAAO,EAEhB,CAGA,MAAM,QAAS,CACb,GAAI,CAAC,KAAK,aAAc,CACtB,KAAK,aAAe,GACpB,MAAM,KAAK,KAAK,oBAAqB,IAAI,EACzC,QAAWA,KAAS,KAAK,UACvB,MAAMA,EAAM,OAAO,EACrB,KAAK,OAAO,EAEhB,CAGA,SAASA,EAAiB,CACxBA,EAAM,GAAG,kBAAmB,IAAM,KAAK,YAAYA,CAAK,CAAC,EACzDA,EAAM,GAAG,kBAAmB,IAAM,KAAK,OAAO,CAAC,EAC1C,KAAK,UAAU,SAASA,CAAK,GAChC,KAAK,UAAU,KAAKA,CAAK,EAC3B,KAAK,OAAO,CACd,CAGA,oBAAoBF,EAAuB,CACzC,IAAMG,EAAW,IAAIL,EAASE,CAAG,EACjC,YAAK,SAASG,CAAQ,EACfA,CACT,CAEA,YAAYD,EAAiB,CAC3BE,GAAmB,KAAK,UAAWF,CAAK,EACxC,KAAK,OAAO,CACd,CAGA,eAAwB,CACtB,GAAI,KAAK,gBAAgB,EACvB,MAAO,GACT,IAAIG,EAAQ,KAAK,YACjB,QAAWH,KAAS,KAAK,UACvBG,GAASH,EAAM,cAAc,EAC/B,OAAOG,CACT,CAGA,mBAA4B,CAC1B,GAAI,KAAK,gBAAgB,EACvB,MAAO,GACT,IAAIA,EAAQ,KAAK,gBACjB,QAAWH,KAAS,KAAK,UACvBG,GAASH,EAAM,kBAAkB,EACnC,OAAOG,CAET,CAGA,iBAA2B,CACzB,OAAO,KAAK,aAAe,GAAK,KAAK,UAAU,QAAU,CAC3D,CAEA,aAAc,CACZ,OAAO,KAAK,YACd,CAGA,YAAa,CACX,OAAO,KAAK,QAAQ,WAAW,GAAM,CAAC,KAAK,gBAAgB,GAAM,KAAK,cAAc,GAAK,KAAK,kBAAkB,CAClH,CAGA,aAAc,CACZ,GAAI,KAAK,gBAAgB,EACvB,MAAO,GACT,IAAIC,EAAQ,KAAK,kBAAkB,EAAI,KAAK,cAAc,EAC1D,OAAI,MAAMA,CAAK,IACbA,EAAQ,GACH,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGA,CAAK,CAAC,CACvC,CAEA,kBAAmB,CACjB,OAAO,KAAK,UAAU,MACxB,CAGA,cAAcD,EAAeE,EAAyB,CACpD,KAAK,YAAcF,EACfE,GAAkB,OACpB,KAAK,gBAAkBA,GACzB,KAAK,OAAO,CACd,CAGA,cAAcC,EAAO,EAAG,CACtB,KAAK,aAAeA,EACpB,KAAK,OAAO,CACd,CAGA,oBAAoBH,EAAe,CACjC,KAAK,gBAAkBA,EACvB,KAAK,OAAO,CACd,CAGA,cAAe,CACb,KAAK,gBAAkB,KAAK,YAC5B,KAAK,OAAO,CACd,CAGA,kBAAkBG,EAAO,EAAG,CAC1B,KAAK,iBAAmBA,EACxB,KAAK,OAAO,CACd,CAGA,SAASC,EAAS,EAAG,CACnB,IAAIC,EAAI,GAAG,KAAK,OAAOD,CAAM,IAAI,KAAK,SAAS,KAAK,sBAAsB,KAAK,sBAAsB,KAAK,MAAM,KAAK,YAAY,EAAI,GAAG,eAAe,KAAK;AAAA,EAC5J,QAAWP,KAAS,KAAK,UACvBQ,GAAKR,EAAM,SAASO,EAAS,CAAC,EAChC,OAAIA,IAAW,EACNC,EAAE,KAAK,EACTA,CACT,CACF,EA3KaC,EAAAb,EAAA,YCjBN,IAAKc,QAIVA,IAAA,qBAOAA,IAAA,qBAGAA,IAAA,2BAKAA,IAAA,iBAnBUA,QAAA,IA+BAC,QACVA,IAAA,qBACAA,IAAA,qBACAA,IAAA,uBAHUA,QAAA,IA4CL,SAASC,GAAiBC,EAAqB,CAAC,EAAG,CACxD,GAAM,CACJ,YAAAC,EAAc,EACd,KAAAC,EAAOC,EAAM,MAAM,EACnB,qBAAAC,EAAuB,CACzB,EAAIJ,EAEEK,EAAS,IAAIC,EAEbC,EAAUC,GAAW,EAC3BD,EAAQ,IAAIE,CAAS,EAErB,IAAMC,EAAW,IAAIC,EAAS,CAAE,KAAAT,CAAK,CAAC,EAEtCQ,EAAS,GAAG,oBAAqBD,CAAS,EAE1C,IAAIG,EAAW,EACXC,EAAgB,EAChBC,EAAkB,EAClBC,EAAW,EACTC,EAAqC,CAAC,EAI5C,eAAeC,GAAgB,CAC7B,GAAIL,EAAW,EAAG,CAChB,GAAM,CAACM,EAASC,CAAO,EAAIC,GAAc,EACzC,OAAAf,EAAO,KAAK,YAAac,CAAO,EACzBD,EAEX,CANeG,EAAAJ,EAAA,iBAQf,eAAeK,GAAkB,CAC/B,QAAWC,KAAM,OAAO,KAAKP,CAAK,EACnBA,EAAMO,CAAE,EACZ,QAAU,IACjB,MAAMP,EAAMO,CAAE,EAAE,SAAS,QAAQ,EACjC,OAAOP,EAAMO,CAAE,EAGrB,CAReF,EAAAC,EAAA,mBAUf,SAASE,GAAY,CACdnB,EAAO,KAAK,WAAW,EAE5BO,EAAW,EACXC,EAAgB,EACXS,EAAgB,EACrBZ,EAAS,MAAM,CACjB,CAPSW,EAAAG,EAAA,aAST,SAASC,GAAY,CACnB,IAAIC,EAAa,EACbC,EAAkB,EACtB,OAAW,CAAE,IAAAC,EAAK,SAAAC,EAAU,MAAAC,CAAM,IAAK,OAAO,OAAOd,CAAK,EACxDU,GAAcE,EACdD,GAAmBG,IAAU,EAAyBF,EAAM,KAAK,IAAIA,EAAKC,CAAQ,EAE/ExB,EAAO,KACV,YACAO,EACAC,EACAa,EACAC,CACF,CACF,CAdSN,EAAAI,EAAA,aAgBT,SAASM,GAAc,CAIrB,GAHAN,EAAU,EACNb,EAAW,GAAKA,IAAaC,GAC/BW,EAAU,EACRV,GAAmBb,EACrB,OACF,IAAM+B,EAAe,OAAO,OAAOhB,CAAK,EAAE,OACxCiB,GAAKA,EAAE,QAAU,CACnB,EACA,GAAID,EAAa,OAAS,EAAG,CAC3B,IAAIE,EACJ,QAAWD,KAAKD,EAIZC,EAAE,OAAS,MACR,OAAO,OAAOjB,CAAK,EAAE,KACtBmB,GACEA,EAAG,QAAU,GACVA,EAAG,KAAOF,EAAE,IACZE,EAAG,QAAUF,EAAE,KACtB,IAKEC,GAAY,MAAQD,EAAE,SAAWC,EAAS,YAC5CA,EAAWD,GAEf,GAAIC,GAAY,KAAM,CACpB,IAAMX,EAAKW,EAAS,GACdE,EAAOF,EAAS,KACtBA,EAAS,MAAQ,EACjB,EAAEpB,EACGT,EAAO,KAAK,WAAYkB,CAAE,EAE/B,IAAMc,EAAehB,EAACiB,GAAe,CAC/BJ,IACFA,EAAS,OAASI,EAClBJ,EAAS,MAAQ,EACjBA,EAAS,SAAWA,EAAS,IAC7BA,EAAS,UAAU,aAAa,GAGlC,EAAEpB,EACF,EAAED,EACFkB,EAAY,CACd,EAXqB,gBAarBG,EACG,KAAKA,CAAQ,EACb,KAAMK,GAAM,CACXH,EAAKG,CAAC,EACDlC,EAAO,KAAK,aAAckB,EAAIgB,CAAC,EACpCF,EAAaE,CAAC,CAChB,CAAC,EACA,MAAOC,GAAQ,CACdJ,EAAK,EACA/B,EAAO,KAAK,YAAakB,EAAIiB,CAAG,EACrCH,EAAa,CACf,CAAC,GAGT,CA/DShB,EAAAU,EAAA,eAiET,SAASU,EAAOlB,EAAY,CAC1B,IAAMW,EAAWlB,EAAMO,CAAE,EACrBW,GAAYA,EAAS,QAAU,IACjClB,EAAMO,CAAE,EAAE,MAAQ,EAClB,EAAEV,EACGR,EAAO,KAAK,YAAakB,CAAE,EAC3BP,EAAMO,CAAE,EAAE,SAAS,QAAQ,EAChCE,EAAU,EAEd,CATSJ,EAAAoB,EAAA,UAWT,SAAShC,GAAY,CACnB,OAAO,KAAKO,CAAK,EAAE,QAAQyB,CAAM,CAEnC,CAHSpB,EAAAZ,EAAA,aAKT,SAASiC,EAAQnB,EAAY,CAC3B,OAAOP,EAAMO,CAAE,GAAK,IACtB,CAFSF,EAAAqB,EAAA,WAIT,SAASC,EACPC,EACA5C,EAOI,CAAC,EACL,CACA,IAAIoC,EACElB,EAAwB,IAAI,QAAQC,GAAYiB,EAAOjB,CAAQ,EAC/DI,EAAKvB,EAAO,IAAM6C,EAAK,EAE7B,GAAI7B,EAAMO,CAAE,GAAK,KAAM,CACrB,IAAMuB,EAAa9C,EAAO,sBAAwBI,EAElD,GAAI0C,IAAe,EACjBL,EAAOlB,CAAE,UAEFuB,IAAe,GAAwCA,IAAe,EAAyC,CACtH,IAAMC,GAAc/B,EAAMO,CAAE,EAE5B,OAAIuB,IAAe,IACjBC,GAAY,SAAW,EAAEhC,GAEpB,CACL,GAAAQ,EACA,SAAU,SAAY,CACpB,GAAIwB,GAAY,QAAU,EACxB,OAAO/B,EAAMO,CAAE,EAAE,MAGrB,GAAG,EACH,QAAS,IAAMkB,EAAOlB,CAAE,EACxB,OAAQ,IAAMkB,EAAOlB,CAAE,CACzB,MAGA,OAAM,IAAI,MAAM,qBAAqBA,mBAAoB,EAI7D,IAAMyB,EAAe,IAAIrC,EAAS,CAChC,KAAMY,EACN,WAAYvB,EAAO,KAAO,EAC1B,cAAeA,EAAO,UAAY,CACpC,CAAC,EAED,OAAAU,EAAS,SAASsC,CAAY,EAE9BhC,EAAMO,CAAE,EAAI,CACV,GAAAA,EACA,KAAAqB,EACA,SAAU,EAAE7B,EACZ,MAAOf,EAAO,MACd,MAAO,EACP,IAAKA,EAAO,KAAO,EACnB,SAAUA,EAAO,UAAY,EAC7B,KAAAoC,EACA,QAASpC,EAAO,QAChB,SAAUgD,EAGV,OAAOC,EAAO,CACZD,EAAa,cAAcC,CAAK,EAChCjC,EAAMO,CAAE,EAAE,IAAM0B,EAChBxB,EAAU,CACZ,EAGA,YAAYwB,EAAO,CACjBD,EAAa,oBAAoBC,CAAK,EACtCjC,EAAMO,CAAE,EAAE,SAAW0B,EACrBxB,EAAU,CACZ,EAGA,YAAYyB,EAAM,EAAG,CACnBF,EAAa,kBAAkBE,CAAG,EAClClC,EAAMO,CAAE,EAAE,UAAY2B,EACtBzB,EAAU,CACZ,CACF,EACA,EAAEb,EACFmB,EAAY,EAEL,CACL,GAAAR,EACA,QAAAL,EACA,QAAS,IAAMuB,EAAOlB,CAAE,EACxB,OAAQ,IAAMkB,EAAOlB,CAAE,CACzB,CACF,CA9FS,OAAAF,EAAAsB,EAAA,WAgGF,CACL,OAAAtC,EACA,OAAAoC,EACA,UAAAhC,EACA,QAAAiC,EACA,SAAAhC,EACA,QAAAiC,EACA,QAAApC,EACA,cAAAU,CACF,CACF,CAlQgBI,EAAAtB,GAAA,WClDT,IAAMoD,GAAN,cAA0BC,CAAoB,CAYnD,YAAYC,EAA8C,CAAC,EAAG,CAC5D,MAAM,EAZR,KAAQ,MAAoB,CAAC,EAC7B,KAAQ,aAA+B,CAAC,EAGxC,KAAQ,SAAW,EACnB,KAAQ,cAAgB,EAExB,KAAQ,OAAS,GAMf,GAAM,CAAE,KAAAC,EAAOC,EAAM,OAAO,EAAG,SAAAC,CAAS,EAAIH,EAC5C,KAAK,KAAOC,EACZ,KAAK,IAAMG,EAAO,cAAcH,IAAQE,GAAY,GAAY,CAClE,CAEA,MAAc,aAAc,CAG1B,GAFA,KAAK,IAAI,8BAA+B,KAAK,MAAM,MAAM,EAErD,KAAK,aAAe,KAAM,CAC5B,KAAK,IAAI,mDAAmD,EAC5D,OAGF,GAAI,KAAK,OAAQ,CACf,KAAK,IAAI,qCAAqC,EAC9C,OAGF,KAAO,KAAK,aAAe,MAAQ,CAAC,KAAK,QAAQ,CAC/C,IAAME,EAAO,KAAK,MAAM,MAAM,EAG9B,GAFA,KAAK,IAAI,kBAAkBA,GAAM,MAAM,EAEnCA,GAAQ,KACV,MAEE,KAAK,gBAAkB,GACpB,KAAK,KAAK,WAAY,KAAK,QAAQ,EAE1C,GAAM,CAAE,KAAAJ,EAAM,KAAAK,EAAM,QAAAC,CAAQ,EAAIF,EAChC,KAAK,YAAcC,EAAK,EACxB,IAAIE,EACJ,GAAI,CACF,KAAK,IAAI,KAAK,cAAcP,GAAM,EAClCO,EAAS,MAAM,KAAK,YACpB,KAAK,IAAI,iBAAiBP,kBAAsBO,CAAM,CACxD,OACOC,EAAP,CACE,KAAK,IAAI,KAAK,wBAAyBA,CAAG,CAC5C,CAEAF,EAAQC,CAAM,EACd,KAAK,YAAc,OAEnB,KAAK,eAAiB,EACjB,KAAK,KAAK,YAAa,KAAK,SAAU,KAAK,aAAa,EAS/D,IANI,KAAK,MAAM,SAAW,IACnB,KAAK,KAAK,WAAW,EAC1B,KAAK,SAAW,EAChB,KAAK,cAAgB,GAGhB,KAAK,aAAa,OAAS,GAChC,KAAK,aAAa,MAAM,EAAE,CAC9B,CAGA,MAAM,QACJF,EACAN,EAA8C,CAAC,EACnC,CACZ,GAAM,CAAE,UAAAU,EAAY,GAAO,KAAAT,EAAOC,EAAM,KAAK,IAAI,CAAE,EAAIF,EACvD,OAAIU,GACF,KAAK,IAAI,KAAK,uBAAuBT,GAAM,EACpC,MAAMK,EAAK,IAGpB,KAAK,IAAI,WAAWL,GAAM,EACnB,IAAI,QAASM,GAAY,CAC9B,KAAK,MAAM,KAAK,CACd,KAAAN,EACA,KAAAK,EACA,QAAAC,CACF,CAAC,EAED,KAAK,UAAY,EACZ,KAAK,KAAK,YAAa,KAAK,SAAU,KAAK,aAAa,EAExD,KAAK,YAAY,CACxB,CAAC,EACH,CAGA,MAAM,iBACJD,EACAN,EAAyB,CAAC,EACd,CACZ,OAAO,KAAK,QAAQM,EAAM,CACxB,UAAW,KAAK,aAAe,KAC/B,KAAMN,EAAI,IACZ,CAAC,CACH,CAGA,MAAM,UAAUW,EAAW,GAAM,CAC/B,KAAK,IAAI,WAAW,EACf,KAAK,KAAK,WAAW,EAC1B,IAAMC,EAAW,KAAK,MAAM,IAAIN,GAAQA,EAAK,OAAO,EACpD,KAAK,MAAQ,CAAC,EACdM,EAAS,QAAQC,GAAKA,EAAE,MAAS,CAAC,EAClC,MAAM,KAAK,KAAK,CAClB,CAGA,MAAM,OAAQ,CACZ,KAAK,IAAI,OAAO,EAChB,KAAK,OAAS,GACd,MAAM,KAAK,KAAK,CAClB,CAGA,QAAS,CACP,KAAK,IAAI,QAAQ,EACjB,KAAK,OAAS,GACT,KAAK,YAAY,CACxB,CAGA,MAAM,MAAO,CAEX,GADA,KAAK,IAAI,MAAM,EACX,OAAK,aAAe,OAAS,KAAK,MAAM,SAAW,GAAK,KAAK,SAGjE,OAAO,IAAI,QAASN,GAAY,CAC9B,KAAK,aAAa,KAAKA,CAAO,CAChC,CAAC,CACH,CAEA,IAAW,UAAoB,CAC7B,OAAO,KAAK,MACd,CAEA,IAAW,UAAoB,CAC7B,OAAO,KAAK,MAAM,SAAW,CAC/B,CACF,EAtJaO,EAAAhB,GAAA,eCxBb,IAAMiB,GAAQ,GACRC,EAAMD,GAAQE,EAAO,gBAAiB,OAAO,EAAI,IAAM,CAAC,EAavD,SAASC,GACdC,EACAC,EAII,CAAC,EAYH,CACF,GAAM,CAAE,MAAAC,EAAQ,IAAK,SAAAC,EAAW,GAAM,QAAAC,EAAU,EAAK,EAAIH,EAErDI,EAAiB,EACjBC,EAAa,EACbC,EAAU,EACVC,EAEEC,EAAkB,KAAK,IAAI,EAEjC,SAASC,GAAuB,CAC9B,OAAIL,GACF,aAAaA,CAAS,EACtBA,EAAY,OACL,IAEF,EACT,CAPSM,EAAAD,EAAA,wBAST,SAASE,KAAsBC,EAAa,CAC1C,IAAMC,EAAM,KAAK,IAAI,EACfC,EAAUD,EAAMR,EAEtB,SAASU,GAAe,CACtB,IAAMC,EAAO,KAAK,IAAI,EACtB,MAAO,UAAUA,EAAOR,GAAiB,QAAQ,CAAC,kBAChDQ,EAAOX,GACP,QAAQ,CAAC,iBAAiBC,IAC9B,CALSI,EAAAK,EAAA,gBAOT,IAAME,EAAOP,EAAA,IAAM,CACjBJ,EAAU,EACVD,EAAa,KAAK,IAAI,EACtBN,EAAS,MAAM,KAAMa,CAAI,CAC3B,EAJa,QASb,GAHAL,EAAeU,EAGXH,EAAUb,GAAS,CAACG,EAAW,CACjCT,IAASC,EAAI,UAAWmB,EAAa,CAAC,EAGlCZ,IACEW,EAAUb,GACZN,IAASC,EAAI,oBAAcmB,EAAa,CAAC,EACzCE,EAAK,GAGL,EAAEX,GAIN,IAAMY,EAAUJ,EAAUb,EAAQA,EAAQA,EAAQa,EAClDlB,EAAI,6BAAwBsB,EAAQ,QAAQ,CAAC,MAAOH,EAAa,CAAC,EAGlEN,EAAqB,EACrBJ,EAAaQ,EAGbT,EAAY,WAAW,IAAM,CAC3BT,IAASC,EAAI,yBAAqBmB,EAAa,CAAC,EAChDX,EAAY,EAERF,IAAa,CAACC,GAAWG,EAAU,KACrCX,IAASC,EAAI,qBAAemB,EAAa,CAAC,EAC1CR,IAAe,EAEnB,EAAGW,CAAO,MAIV,EAAEZ,EACFX,IAASC,EAAI,UAAWmB,EAAa,CAAC,CAE1C,CAzDS,OAAAL,EAAAC,EAAA,WA2DTA,EAAQ,OAASF,EAEjBE,EAAQ,KAAO,IAAM,CACfF,EAAqB,GAAKF,GAC5BA,EAAa,CACjB,EAEAI,EAAQ,UAAYD,EAAA,kBAAuCE,EAAuB,CAChFH,EAAqB,EACrBJ,EAAa,KAAK,IAAI,EACtBN,EAAS,MAAM,KAAMa,CAAI,CAC3B,EAJoB,aAMpBD,EAAQ,QAAU,IAAMA,EAAQ,KAAK,EAE9BA,CACT,CAhHgBD,EAAAZ,GAAA,YAwHT,SAASqB,GACdpB,EACAC,EAEI,CAAC,EAKH,CACF,GAAM,CAAE,MAAAC,EAAQ,GAAI,EAAID,EACpBI,EAAiB,EAEjBgB,EAAU,GACVC,EAEJ,SAASZ,GAAuB,CAC1BL,IACFR,EAAI,OAAO,EACX,aAAaQ,CAAS,EACtBA,EAAY,EAEhB,CANSM,EAAAD,EAAA,wBAQT,eAAeQ,GAAO,CACpB,GAAI,CAEF,GADAR,EAAqB,EACjBY,GAAiB,KAAM,CACzBzB,EAAI,MAAM,EACV,IAAMgB,EAAO,CAAC,GAAGS,CAAa,EAC9BA,EAAgB,OAChBD,EAAU,GACV,MAAME,EAAUvB,EAAS,GAAGa,CAAI,CAAC,EACjCQ,EAAU,GACVxB,EAAI,WAAW,EACXyB,GAAiB,OACnBZ,EAAqB,EACrBb,EAAI,mBAAmB,EACvBQ,EAAY,WAAWa,EAAMhB,CAAK,GAGxC,MACA,CAAc,CAChB,CAnBeS,EAAAO,EAAA,QAqBf,SAASN,KAAsBC,EAAa,CAC1CS,EAAgB,CAAC,GAAGT,CAAI,EACxBH,EAAqB,EACrBb,EAAI,SAAS,EACTwB,IAAY,KACdhB,EAAY,WAAWa,EAAMhB,CAAK,EACtC,CANSS,EAAAC,EAAA,WAQT,eAAeY,KAAwBX,EAAa,CAClDH,EAAqB,EACrBY,EAAgB,CAAC,GAAGT,CAAI,EACxB,MAAMK,EAAK,CACb,CAJe,OAAAP,EAAAa,EAAA,aAKfZ,EAAQ,OAASF,EACjBE,EAAQ,QAAUF,EAClBE,EAAQ,UAAYY,EAEbZ,CACT,CA/DgBD,EAAAS,GAAA,YC3IT,SAASK,GACdC,EAAmB,YAAY,UAAU,UAAY,GAC5C,CACT,MACE,CAAC,mBAAoB,YAAa,YAAa,GAAI,MAAO,IAAI,EAAE,SAC9DA,CACF,GACGA,EAAS,WAAW,UAAU,GAC9BA,EAAS,WAAW,OAAO,GAC3BA,EAAS,SAAS,QAAQ,CAEjC,CAXgBC,EAAAF,GAAA,eCST,SAASG,GACdC,EAGY,CACZ,GAAM,CAAE,MAAAC,EAAQ,OAAW,OAAAC,EAAS,OAAW,SAAAC,EAAW,CAAC,CAAE,EAAIH,EAC3DI,EAAmBC,EAAmBH,CAAM,EAC5CI,EAAeC,EAAeN,CAAK,EACzC,OAAQO,GAAoB,CACrBF,EAAaE,EAAI,KAAK,GAEtBJ,EAAiBI,EAAI,IAAI,GAE9BL,EAAS,KAAKK,CAAG,CACnB,CACF,CAfgBC,EAAAV,GAAA,uBCAhB,IAAMW,GAAMC,EAAO,eAAgB,OAAO,EAkCpCC,GAAkC,CACtC,MAAO,WACP,SAAU,SACV,QAAS,CAAC,CACZ,EAcO,SAASC,GAAeC,EAAa,CAC1C,IAAMC,EAAI,kBAAkB,KAAKD,CAAG,EACpC,GAAIC,GAAKA,EAAE,CAAC,EAAG,CACb,GAAM,CAACC,EAAUC,CAAQ,EAAIF,EAAE,CAAC,EAAE,MAAM,IAAK,CAAC,EAC9C,MAAO,CACL,IAAKD,EAAI,QAAQ,GAAGC,EAAE,CAAC,KAAM,EAAE,EAC/B,SAAAC,EACA,SAAAC,CACF,EAEJ,CAVgBC,EAAAL,GAAA,kBAahB,eAAsBM,GACpBL,EACAM,EAAiC,CAAC,EAClCC,EAAyE,MAC1C,CAC/B,GAAI,CACEC,EAAQF,CAAY,IACtBA,EAAeG,GAAU,CAAC,EAAG,GAAGC,EAAaJ,CAAY,CAAC,GAE5D,IAAMK,EAAOZ,GAAe,OAAOC,CAAG,CAAC,EACnCW,IACFX,EAAMW,EAAK,IACXL,EAAeG,GACb,CAAC,EACDH,EACAM,GAAsBD,EAAK,SAAUA,EAAK,QAAQ,CACpD,GAKAL,EAAa,SAAW,MAErB,EAAEA,EAAa,mBAAmB,WAGrCA,EAAa,QAAU,IAAI,QAAQA,EAAa,OAAO,GAIzD,IAAMO,EAAW,MAAMN,EAAQ,OAAOP,CAAG,EAAGM,CAA2B,EAGvE,GAAIO,EAAS,OAAS,IACpB,OAAOA,EAET,GAAI,CACFjB,GAAI,KAAK,YAAY,OAAOI,CAAG,qBAAqBa,EAAS,mBAAoBP,CAAY,EAC7FV,GAAI,KAAK,aAAa,MAAMiB,EAAS,KAAK,GAAG,CAC/C,OACOC,EAAP,CACElB,GAAI,MAAM,aAAckB,CAAG,CAC7B,CACF,OACOA,EAAP,CACElB,GAAI,MAAM,aAAckB,CAAG,CAC7B,CACF,CA/CsBV,EAAAC,GAAA,cAkDtB,eAAsBU,GACpBf,EACAM,EAAiC,CAAC,EAClCC,EAAyE,MACjD,CACxB,GAAI,CACF,IAAMS,EAAM,MAAMX,GAChBL,EACA,CACE,CACE,OAAQ,MACR,QAAS,CACP,OAAQ,kBACV,CACF,EACAM,CACF,EACAC,CACF,EACA,GAAIS,EACF,OAAO,MAAMA,EAAI,KAAK,CAC1B,OACOF,EAAP,CACElB,GAAI,MAAM,mBAAoBkB,CAAG,CACnC,CACF,CAzBsBV,EAAAW,GAAA,aA4BtB,eAAsBE,GACpBjB,EACAM,EAAiC,CAAC,EAClCC,EAAyE,MAC5C,CAC7B,GAAI,CACF,IAAMS,EAAM,MAAMX,GAChBL,EACA,CAACF,GAAgB,CAAE,OAAQ,KAAM,EAAGQ,CAAY,EAChDC,CACF,EACA,GAAIS,EACF,OAAO,MAAMA,EAAI,KAAK,CAC1B,OACOF,EAAP,CACElB,GAAI,MAAM,mBAAoBkB,CAAG,CACnC,CACF,CAjBsBV,EAAAa,GAAA,aAsBf,SAASC,GACdC,EACAC,EAAqB,OACJ,CACjB,MAAO,CACL,OAAAA,EACA,GAAGtB,GACH,QAAS,CACP,eAAgB,kDAClB,EACA,KAAMuB,GAAYF,CAAI,CACxB,CACF,CAZgBf,EAAAc,GAAA,8BAeT,SAASI,GACdH,EACAC,EAAqB,OACJ,CACjB,MAAO,CACL,OAAAA,EACA,GAAGtB,GACH,QAAS,CACP,eAAgB,iCAElB,EACA,KAAMyB,EAAkBJ,CAAI,CAC9B,CACF,CAbgBf,EAAAkB,GAAA,oBAgBT,SAASV,GACdV,EACAC,EACiB,CACjB,MAAO,CACL,QAAS,CACP,cAAe,SAASqB,GAAS,GAAGtB,KAAYC,GAAU,GAC5D,CACF,CACF,CATgBC,EAAAQ,GAAA,yBC7MT,SAASa,IAA6B,CAC3C,GAAI,OAAO,OAAW,IACpB,OAAO,MACX,CAHgBC,EAAAD,GAAA,aAKT,SAASE,IAAgC,CAC9C,GAAI,OAAO,UAAc,IACvB,OAAO,SACX,CAHgBD,EAAAC,GAAA,gBAKT,SAASC,IAAiB,CAC/B,OAAOH,GAAU,GAEZ,OAAO,kBAAsB,IAC9B,KACA,OAAO,OAAW,IAChB,OAEA,SAAS,cAAc,EAAE,CACjC,CATgBC,EAAAE,GAAA,aAYhB,IAAMC,EAAaF,GAAa,EAC1BG,GAAUL,GAAU,EAEnB,SAASM,GACdC,EAAO,CACL,IAAK,GACL,MAAO,GACP,QAAS,GACT,OAAQ,GACR,SAAU,GACV,UAAW,GACX,IAAK,GACL,aAAc,GACd,QAAS,GACT,KAAM,GACN,OAAQ,GACR,KAAM,GACN,KAAM,GACN,YAAa,GACb,UAAW,GACX,YAAa,GACb,MAAO,EACT,EACA,CACA,OAAAA,EAAK,IAAMH,GAAY,UAAU,MAAM,qBAAqB,GAAK,KACjEG,EAAK,MAAQ,CAAC,CAACH,GAAY,UAAU,WAAW,KAAK,EACrDG,EAAK,QAAU,CAAC,CAACH,GAAY,UAAU,WAAW,KAAK,EAEvDG,EAAK,OAASF,IAAS,QAAU,KACjCE,EAAK,UACAH,GAAY,WAAW,YAAY,GAAG,QAAQ,YAAY,GAAK,IAAM,IACrE,CAACG,EAAK,OACXA,EAAK,UAAYF,IAAS,QAAQ,iBAAmB,KAErDE,EAAK,IAAMH,GAAY,eAAiB,KAExCG,EAAK,aAAeH,GAAY,YAC3BC,IAAS,aAAa,4BAA4B,GAAG,QAE1DE,EAAK,KACD,OAAO,QAAY,KAAe,SAAS,SAAS,OAAS,OACjEA,EAAK,QAAU,CAACA,EAAK,UAAY,CAACA,EAAK,WAAa,CAACA,EAAK,KAG1DA,EAAK,OAED,OAAO,kBAAsB,KAE5B,gBAAgB,kBAErBA,EAAK,KAAO,OAAO,KAAS,KAAe,OAAO,OAAW,IAC7DA,EAAK,KAAOA,EAAK,KAEjBA,EAAK,YAAcA,EAAK,WAAaA,EAAK,MAC1CA,EAAK,UAAYA,EAAK,WAAaA,EAAK,IACxCA,EAAK,YAAcA,EAAK,UAGxBA,EAAK,MACAF,IAAW,iBAAkBA,KAC5BD,GAAY,gBAAkB,GAAK,GACnCA,GAAY,kBAAoBC,IAAS,WAEzCA,IAAS,eAAiB,oBAAoB,cAE7CE,CACT,CA/DgBN,EAAAK,GAAA,UA0ET,IAAME,GAAYP,EAAA,IACvB,OAAO,OAAW,KAAe,aAAe,OADzB,aAGZQ,GAAWH,GAAO,EAMxB,SAASI,GAAeC,EAAqB,CAC9CH,GAAU,EACZ,OAAO,iBAAiB,eAAgBG,CAAO,EACxC,OAAO,QAAY,KAC1B,QAAQ,GAAG,OAAQ,IAAMA,CAAO,CACpC,CALgBV,EAAAS,GAAA,kBClGT,IAAME,GAAN,KAAuD,CAM5D,YAAYC,EAA0B,CAAC,EAAG,CAL1C,KAAQ,MAA2B,CAAC,CAsBpC,CAEA,QAAQC,EAAaC,EAAgB,CAEnC,KAAK,MAAMD,CAAG,EAAIE,GAAYD,CAAK,CACrC,CAEA,QAAQD,EAA4B,CAClC,OAAOE,GAAY,KAAK,MAAMF,CAAG,CAAC,CACpC,CAEA,WAAWA,EAAmB,CAC5B,OAAO,KAAK,MAAMA,CAAG,CACvB,CAEA,OAAc,CACZ,KAAK,MAAQ,CAAC,CAChB,CAEA,SAAoB,CAClB,OAAO,OAAO,KAAK,KAAK,KAAK,CAC/B,CACF,EA7CaG,EAAAL,GAAA,cCZN,IAAMM,GAAOC,EAAA,IAAM,CAAC,EAAP,QCab,SAASC,GAAUC,EAAsB,CAAC,EAAG,CAClD,GAAM,CACJ,KAAAC,EAAO,QAAQ,KAAK,MAAM,CAAC,EAC3B,MAAAC,EAAQ,CAAC,EACT,UAAAC,EAAYC,GACZ,YAAAC,EAAc,CAAC,EACf,SAAAC,EAAW,CAAC,EACZ,WAAAC,EAAa,CAAC,CAChB,EAAIP,EAEEQ,EAAc,OAAO,QAAQN,CAAK,EAAE,OAAO,CAACO,EAAKC,IAAS,CAC9D,GAAI,CAACC,EAAMC,CAAM,EAAIF,EACjB,OAAOE,GAAW,WACpBA,EAAS,CAACA,CAAM,GAClB,QAAWC,KAASD,EAClBH,EAAIN,EAAUU,CAAK,CAAC,EAAIV,EAAUQ,CAAI,EAExC,OAAOF,CACT,EAAG,CAAC,CAAQ,EAENK,EAA4B,CAChC,EAAG,CAAC,CACN,EAEA,SAASC,EAAOJ,EAAcE,EAAY,CACpCC,EAAKH,CAAI,GAAK,MAGT,OAAOG,EAAKH,CAAI,GAAM,UAF7BG,EAAKH,CAAI,EAAIE,EAKN,MAAM,QAAQC,EAAKH,CAAI,CAAC,EAC/BG,EAAKH,CAAI,EAAE,KAAKE,CAAK,EAGrBC,EAAKH,CAAI,EAAI,CAACG,EAAKH,CAAI,EAAGE,CAAK,CACnC,CAZSG,EAAAD,EAAA,UAcT,IAAME,EAAU,CAAC,GAAGhB,CAAI,EACpBiB,EAGJ,KAAQA,EAAMD,EAAQ,MAAM,GAAI,CAC9B,IAAIJ,EACJ,GAAI,OAAO,KAAKK,CAAG,EAAG,CACpB,IAAIC,EAAMD,EAAI,QAAQ,OAAQ,EAAE,EAChC,GAAIA,EAAI,SAAS,GAAG,EAAG,CACrB,GAAM,CAACP,EAAMS,CAAS,EAAID,EAAI,MAAM,IAAK,CAAC,EAC1CA,EAAMR,EAAK,KAAK,EAChBE,EAAQO,EAAU,KAAK,EAEzBD,EAAMhB,EAAUgB,CAAG,EACnBA,EAAMX,EAAYW,CAAG,GAAKA,EACtBd,EAAY,SAASc,CAAG,EAC1BJ,EAAOI,EAAK,EAAI,GAGhBN,EAAQA,GAASI,EAAQ,MAAM,GAAK,GAChCV,EAAW,SAASY,CAAG,IACzBN,EAAQ,OAAOA,GAAS,CAAC,GAEvBP,EAAS,SAASa,CAAG,EACnB,MAAM,QAAQL,EAAKK,CAAG,CAAC,EACzBL,EAAKK,CAAG,EAAE,KAAKN,CAAK,EAGpBC,EAAKK,CAAG,EAAI,CAACN,CAAK,EAGpBE,EAAOI,EAAKN,CAAK,QAKrBC,EAAK,EAAE,KAAKI,CAAG,EAInB,OAAOJ,CACT,CA/EgBE,EAAAjB,GAAA,aCZT,SAASsB,GAAOC,EAAc,CACnC,OAAO,IAAI,QACT,CAACC,EAASC,IAAW,CACnB,OAAO,eAAe,EAAE,KAAK,CAAC,CAAE,MAAAC,CAAM,IAAM,CAC1C,IAAMC,EAAOD,EAAM,QAAQ,EAC3BC,EAAK,GAAG,QAAUC,GAAaH,EAAOG,CAAG,CAAC,EAC1CD,EAAK,GAAG,QAAS,IAAMH,EAAQD,CAAI,CAAC,EACpCI,EAAK,MAAM,MAAMJ,CAAI,EACrBI,EAAK,MAAM,IAAI,CACjB,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACnB,CAAC,CACL,CAXgBE,EAAAP,GAAA,UCAhB,IAAAQ,GAAuB,wBAWvB,GAAI,CAEA,OAAO,WAAe,KACnB,OAAO,WAAW,OAAW,KAC7B,GAAAC,SACA,GAAAA,QAAW,YAGd,WAAW,OAAS,GAAAA,QAAW,UAEnC,OACOC,EAAP,CACE,QAAQ,KAAK,+BAAgCA,CAAG,CAClD,CCrBA,IAAAC,GAAe,oBACfC,GAAwB,gBAIxB,IAAMC,GAAMC,EAAO,WAAY,OAAO,EAEhCC,GAAU;AAAA,EACVC,GAAiB,iCACjBC,GAAc,OACdC,GAAiB,aAavB,SAASC,GAAMC,EAAaC,EAAuB,CAAC,EAAG,CACrD,IAAMC,EAA8B,CAAC,EAGrC,cAAOF,CAAG,EACP,MAAMF,EAAc,EACpB,QAAQ,CAACK,EAAMC,IAAQ,CAEtB,IAAMC,EAAcF,EAAK,MAAMP,EAAc,EAK7C,GAAIS,GAAe,KAAM,CACvB,IAAMC,EAAMD,EAAY,CAAC,EAErBE,EAAMF,EAAY,CAAC,GAAK,GACtBG,EAAMD,EAAI,OAAS,EACnBE,EAAiBF,EAAI,CAAC,IAAM,KAAOA,EAAIC,CAAG,IAAM,IAC/BD,EAAI,CAAC,IAAM,KAAQA,EAAIC,CAAG,IAAM,KAGjCC,GACpBF,EAAMA,EAAI,UAAU,EAAGC,CAAG,EAGtBC,IACFF,EAAMA,EAAI,QAAQV,GAAaF,EAAO,IAIxCY,EAAMA,EAAI,KAAK,EAEjBL,EAAII,CAAG,EAAIC,OAGXd,GAAI,MACF,iDAAiDW,EAAM,MAAMD,GAC/D,CAEJ,CAAC,EAGID,CACT,CA5CSQ,EAAAX,GAAA,SAiDF,SAASY,GACdC,EACAC,EAAe,IACP,CACR,SAAO,YAAQ,QAAQ,IAAI,EAAGD,GAASC,CAAY,CACrD,CALgBH,EAAAC,GAAA,gBAOT,SAASG,GAAYF,EAAaC,EAAe,GAAY,CAClE,OAAID,GAAS,OACXA,EAAQC,GACHF,GAAa,OAAOC,CAAK,EAAE,KAAK,EAAGC,CAAY,CACxD,CAJgBH,EAAAI,GAAA,eAMT,IAAMC,GAASD,GAEf,SAASE,GACdC,EACAC,EAAM,QAAQ,IACM,CACpB,GAAIA,EAAID,CAAI,GAAK,KACf,OAAOC,EAAID,CAAI,EACjBA,EAAOA,EAAK,YAAY,EACxB,OAAW,CAACE,EAAGC,CAAC,IAAK,OAAO,QAAQF,CAAG,EACrC,GAAIC,EAAE,YAAY,IAAMF,EACtB,OAAOG,CAEb,CAXgBV,EAAAM,GAAA,yBAcT,SAASK,GAASC,EAAsB,CAAC,EAAG,CACjD,IAAMC,EACFD,GAAS,MAAQP,GAAOO,GAAS,UAAY,MAAM,EACjDE,EAA2BF,GAAS,UAAY,OAChDG,EAAQH,GAAS,OAAS,GAE5BG,IAAU,KACZhC,GAAI,MAAQ,KAEd,GAAI,CAEF,IAAMiC,EAAY,GAAAC,QAAG,WAAWJ,CAAU,EACtCxB,GAAM,GAAA4B,QAAG,aAAaJ,EAAY,CAAE,SAAAC,CAAS,CAAC,EAAG,CAAE,MAAAC,CAAM,CAAC,EAC1D,CAAC,EACCG,EAAiB,GAAAD,QAAG,WAAW,GAAGJ,SAAkB,EACtDxB,GAAM,GAAA4B,QAAG,aAAa,GAAGJ,UAAoB,CAAE,SAAAC,CAAS,CAAC,EAAG,CAAE,MAAAC,CAAM,CAAC,EACrE,CAAC,EAECI,EAAiC,OAAO,OAC5C,CAAC,EACDH,EACAE,CACF,EACMV,EAAMI,GAAS,KAAO,QAAQ,IAEpC,cAAO,QAAQO,CAAM,EAAE,QAAQ,CAAC,CAACvB,EAAKM,CAAK,IAAM,CAC3C,OAAOU,GAAS,QAAW,WAC7BhB,EAAMgB,GAAS,OAAShB,GAErB,OAAO,UAAU,eAAe,KAAKY,EAAKZ,CAAG,EAOhDb,GAAI,MAAM,IAAIa,mDAAqD,EAN/DM,GAAS,OACXnB,GAAI,KAAK,WAAWa,OAASM,GAAO,EACpCM,EAAIZ,CAAG,EAAIM,EAMjB,CAAC,EACM,CAAE,OAAAiB,CAAO,CAClB,OACOC,EAAP,CACE,OAAArC,GAAI,MAAMqC,CAAC,EACJ,CAAE,MAAOA,CAAE,CACpB,CACF,CA7CgBpB,EAAAW,GAAA,YCvGhB,IAAAU,EAOO,cACPC,GAAiC,gBAOjC,IAAMC,GAAMC,EAAO,mBAAoB,OAAO,EAWjCC,GAAN,KAAwD,CAW7D,YAAYC,EAA0B,CAAC,EAAG,CAV1C,KAAQ,MAAkC,CAAC,EAE3C,KAAQ,SAAsB,OAC9B,KAAQ,OAAS,GAQf,KAAK,WAAU,YAAQ,QAAQ,IAAI,EAAGA,EAAI,MAAQ,cAAc,EAChE,KAAK,OAAS,CAAC,CAACA,EAAI,OACpB,KAAK,UAAYA,EAAI,WAAa,QAE9BA,EAAI,WAAa,CAAC,KAAK,UAAU,WAAW,GAAG,IACjD,KAAK,UAAY,IAAI,KAAK,aAE5B,KAAK,gBAAkB,KAAK,UAAU,OAEtC,KAAK,eACDA,EAAI,iBACDC,GACI,KAAK,OACRC,EAAkBD,EAAM,KAAM,CAAC,EAC/BC,EAAkBD,CAAI,GAG9B,KAAK,iBACDD,EAAI,mBACDC,GAAiB,CACpB,GAAI,CACF,OAAO,KAAK,MAAMA,CAAI,CACxB,OACOE,EAAP,CACEN,GAAI,KAAK,4BAA4BM,QAAWF,CAAI,CACtD,CACF,GAEF,KAAK,cAAgBD,EAAI,eAAiBI,EAC5C,CAEA,QAAQC,EAAaC,EAAgB,CACnC,KAAK,MAAMD,CAAG,EAAIE,GAAYD,CAAK,EACnC,GAAI,CACF,IAAML,EAAO,KAAK,eAAeK,CAAK,EAChCE,EAAO,KAAK,QAAQH,CAAG,KAC7B,gBAAU,YAAQG,CAAI,EAAG,CAAE,UAAW,EAAK,CAAC,KAC5C,iBAAcA,EAAMP,EAAM,MAAM,CAClC,OACOE,EAAP,CACEN,GAAI,MAAM,gBAAiBM,CAAG,CAChC,CACF,CAEA,QAAQE,EAAqB,CAC3B,SAAO,YAAQ,KAAK,QAAS,KAAK,cAAcA,CAAG,EAAI,KAAK,SAAS,CACvE,CAEA,UAAUA,EAAqB,CAC7B,IAAMG,EAAO,KAAK,QAAQH,CAAG,EAC7B,OAAO,OAAO,QAAK,gBAAaG,CAAI,CAAC,CACvC,CAEA,QAAQH,EAA4B,CAClC,IAAMC,EAAQ,KAAK,MAAMD,CAAG,EAG5B,GAAIC,IAAU,KAGd,IAAIA,GAAS,KACX,OAAOC,GAAYD,CAAK,EAE1B,GAAI,CACF,IAAME,EAAO,KAAK,QAAQH,CAAG,EACvBJ,KAAO,gBAAaO,EAAM,MAAM,EACtC,GAAIP,GAAQ,KAAM,CAChB,IAAMK,EAAQ,KAAK,iBAAiBL,CAAI,EACxC,YAAK,MAAMI,CAAG,EAAIC,EACXA,EAEX,MACA,CAEE,KAAK,MAAMD,CAAG,EAAI,IACpB,EACF,CAEA,WAAWA,EAAmB,CAE5B,GADA,OAAO,KAAK,MAAMA,CAAG,EACjB,KAAK,UAAY,KAAM,CACzB,IAAMI,EAAgB,KAAK,SAAS,QAAQJ,CAAG,EAC3CI,IAAU,IACZ,KAAK,SAAS,OAAOA,EAAO,CAAC,EAEjC,GAAI,CACF,IAAMD,EAAO,KAAK,QAAQH,CAAG,KAC7B,cAAWG,CAAI,CACjB,MACA,CAAa,CACf,CAEA,OAAc,CACZ,KAAK,SAAW,CAAC,EACjB,KAAK,MAAQ,CAAC,KACd,UAAO,KAAK,QAAS,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,CACvD,CAEA,SAAoB,CAClB,GAAI,KAAK,UAAY,KACnB,GAAI,CACF,KAAK,YACD,eAAY,KAAK,QAAS,CAAE,cAAe,EAAK,CAAC,EAChD,OACCE,GACE,CAACA,EAAK,YAAY,GAAKA,EAAK,KAAK,SAAS,KAAK,SAAS,CAC5D,EACC,IAAIA,GAAQA,EAAK,KAAK,MAAM,EAAG,CAAC,KAAK,eAAe,CAAC,GAAK,CAAC,CAClE,MACA,CAAa,CAEf,IAAMC,EAAO,CAAC,GAAI,KAAK,UAAY,CAAC,CAAE,EACtC,QAAWN,KAAO,OAAO,KAAK,KAAK,KAAK,EACjCM,EAAK,SAASN,CAAG,GACpBM,EAAK,KAAKN,CAAG,EAEjB,OAAAM,EAAK,KAAK,EACHA,CACT,CACF,EAnIaC,EAAAb,GAAA,eC5Bb,IAAAc,EAAqD,uBACrDC,GAA4C,gBAErC,SAASC,GAAwBC,EAAc,CACpD,IAAMC,KAAI,cAAUD,CAAI,EAClBE,EAAI,QAAQ,IAAI,KACtB,OAAIA,GAAKD,EAAE,WAAWC,CAAC,EACd,IAAID,EAAE,MAAMC,EAAE,MAAM,IAEtBD,CACT,CAPgBE,EAAAJ,GAAA,2BAShB,eAAsBK,GAAOJ,EAAgC,CAC3D,GAAI,CACF,QAAM,QAAKA,CAAI,CACjB,MACA,CACE,MAAO,EACT,CACA,MAAO,EACT,CARsBG,EAAAC,GAAA,UAUtB,eAAsBC,MAAgBC,EAAkC,CACtE,IAAMN,KAAO,GAAAO,MAAS,GAAGD,CAAK,EAC9B,OAAM,MAAMF,GAAOJ,CAAI,GACrB,QAAM,SAAMA,EAAM,CAAE,UAAW,EAAK,CAAC,EAEhCA,CACT,CANsBG,EAAAE,GAAA,gBAQtB,eAAsBG,MAAgBF,EAAkC,CACtE,IAAMN,KAAO,GAAAO,MAAS,GAAGD,CAAK,EAC9B,OAAI,MAAMF,GAAOJ,CAAI,GACnB,QAAM,MAAGA,EAAM,CAAE,UAAW,EAAK,CAAC,EAE7BA,CACT,CANsBG,EAAAK,GAAA,gBAQtB,eAAsBC,MACjBH,EAC0B,CAC7B,IAAMN,KAAO,GAAAO,MAAS,GAAGD,CAAK,EAC9B,GAAI,MAAMF,GAAOJ,CAAI,EACnB,OAAO,QAAM,YAASA,EAAM,OAAO,CACvC,CANsBG,EAAAM,GAAA,YAQtB,eAAsBC,GAAUV,EAAcW,EAAgC,CAC5E,QAAM,aAAUX,EAAMW,EAAS,OAAO,CACxC,CAFsBR,EAAAO,GAAA,aC5CtB,IAAAE,GAA6C,cAC7CC,GAAiC,gBAMjC,IAAMC,GAAkC,CAAC,EAElC,SAASC,GAAkBC,EAAcC,EAAyB,CAAC,EAAG,CAC3E,GAAM,CACJ,MAAAC,EAAQ,OACR,OAAAC,EAAS,OACT,KAAAC,EAAO,GACP,OAAAC,EAAS,EACX,EAAIJ,EACJD,KAAO,YAAQ,QAAQ,IAAI,EAAGA,CAAI,KAClC,iBAAU,YAAQA,CAAI,EAAG,CAAE,UAAW,EAAK,CAAC,EAC5C,IAAMM,KAAS,sBAAkBN,EAAM,CAAE,MAAO,GAAI,CAAC,EAC/CO,EAAmBC,EAAmBL,CAAM,EAC5CM,EAAeC,EAAeR,CAAK,EACzC,OAAQS,GAAoB,CAG1B,GAFI,CAACF,EAAaE,EAAI,KAAK,GAEvB,CAACJ,EAAiBI,EAAI,IAAI,EAC5B,OAEF,IAAMC,EAAUR,EAAO,GAAG,IAAI,KAAK,EAAE,YAAY,KAAO,GAClDS,EAAOF,EAAI,MAAQ,GACnBG,EAAQhB,GAAWe,GAAQ,EAAE,EAC/BC,GAAS,OACXhB,GAAWe,CAAI,EAAIC,GAErB,IAAMC,EAAiB,CACrB,IAAIF,GAAQ,OACZG,GAAeL,EAAI,SAAU,CAAE,OAAAN,CAAO,CAAC,CACzC,EAEA,SAASY,KAASF,EAAsB,CACtCT,EAAO,MAAM,GAAGS,EAAK,KAAK,GAAI;AAAA,CAAK,CACrC,CAEA,OAJSG,EAAAD,EAAA,SAIDN,EAAI,MAAO,CACjB,OACEM,EAAM,GAAGL,SAAgB,GAAGG,CAAI,EAChC,MACF,OACEE,EAAM,GAAGL,SAAgB,GAAGG,CAAI,EAChC,MACF,OACEE,EAAM,GAAGL,SAAgB,GAAGG,CAAI,EAChC,MACF,QACEE,EAAM,GAAGL,SAAgB,GAAGG,CAAI,EAChC,KACJ,CACF,CACF,CAhDgBG,EAAAnB,GAAA,qBCThB,IAAAoB,GAAgB,qBCAhB,IAAAC,GAAwB,gBAGjB,SAASC,GAAsBC,EAAyB,CAC7D,OAAI,OAAOA,GAAU,SACZ,CAAC,EAGRA,GAAO,MAAM;AAAA,CAAI,EAAE,IAAKC,GAAY,CAClC,IAAMC,EAAID,EAAQ,MAChB,kDACF,EACA,GAAIC,EAAG,CACL,IAAIC,EAAOD,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,CAAC,EAC9B,OAAIC,EAAK,SAAS,GAAG,IACnBA,EAAOA,EAAK,MAAM,EAAG,EAAE,GAClBA,EAGX,CAAC,GAAG,OAAOC,EAAS,GAAK,CAAC,CAE9B,CAlBgBC,EAAAN,GAAA,yBAoBhB,IAAMO,MAAM,YAAQ,QAAQ,IAAI,CAAC,EAC3BC,GAAO,QAAQ,KAAK,QAAO,YAAQ,QAAQ,KAAK,IAAI,EAAI,GAG9D,SAASC,GAAaC,EAAc,CAGlC,GAAIA,EAAK,SAAS,gBAAgB,EAChC,MAAO,GAET,IAAMC,EAAU,UAChB,OAAID,EAAK,WAAWC,CAAO,EAClBD,EAAK,OAAOC,EAAQ,MAAM,EAE/BJ,IAAOG,EAAK,WAAWH,EAAG,EACrBG,EAAK,OAAOH,GAAI,OAAS,CAAC,GAE/BC,IAAQE,EAAK,WAAWF,EAAI,IAC9BE,EAAO,KAAKA,EAAK,OAAOF,GAAK,OAAS,CAAC,KAElCE,EACT,CAjBSJ,EAAAG,GAAA,gBAmBT,SAASG,GAAgBC,EAA2B,CAClD,IAAMV,EAAIU,EAAU,MAAM,kDAAkD,EAC5E,GAAIV,EAAG,CACL,IAAIC,EAAOD,EAAE,CAAC,GAAKA,EAAE,CAAC,GAAKA,EAAE,CAAC,EAC9B,OAAIC,EAAK,SAAS,GAAG,IACnBA,EAAOA,EAAK,MAAM,EAAG,EAAE,GAClBA,EAET,MAAO,EACT,CATSE,EAAAM,GAAA,mBAmBF,SAASE,GAAkBC,EAAQ,EAAGC,EAAW,GAAc,CACpE,IAAMf,EAAQ,IAAI,MAAM,OAAO,EAAE,OAAS,GACtCG,EAA2BJ,GAAsBC,CAAK,IAAIc,CAAK,EACnE,OAAIX,GAAQY,IACVZ,EAAOK,GAAaL,CAAI,GAEnBA,GAAQ,EACjB,CAPgBE,EAAAQ,GAAA,qBAST,SAASG,IAAmB,CACjC,OAAO,IAAI,MAAM,OAAO,EAAE,OAAS,EACrC,CAFgBX,EAAAW,GAAA,YAIT,SAASC,GACdC,EACAH,EAAW,GACX,CACA,IAAIZ,EAAO,GACLH,EAAQ,IAAI,MAAM,OAAO,EAAE,OAAS,GAC1C,GAAI,OAAOA,GAAU,SAAU,CAC7B,IAAMmB,EAAQnB,EAAM,MAAM;AAAA,CAAI,EAAE,IAAIoB,GAAKA,EAAE,KAAK,CAAC,EAE3CC,EAAQF,EAAM,UAAUC,GAAKF,EAAS,KAAKI,GAAKF,EAAE,WAAWE,CAAC,CAAC,CAAC,EACtEnB,EAAOgB,EAAME,EAAQ,CAAC,EAClBlB,IACFA,EAAOQ,GAAgBR,CAAI,GAEzBA,GAAQY,IACVZ,EAAOK,GAAaL,CAAI,GAE5B,OAAOA,CACT,CAlBgBE,EAAAY,GAAA,uCDtEhB,SAASM,IAA0B,CACjC,GAAI,CACF,OAAOC,GAAe,QAAQ,IAAI,WAAY,GAAAC,QAAI,OAAO,QAAQ,OAAO,EAAE,CAAC,CAC7E,MACA,CAAa,CACb,MAAO,EACT,CANSC,EAAAH,GAAA,kBAQT,IAAII,GAEEC,GAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAEhC,SAASC,GAAYC,EAAmB,CACtC,IAAIC,EAAO,EACX,QAASC,EAAI,EAAGA,EAAIF,EAAU,OAAQE,IACpCD,GAAQA,GAAQ,GAAKA,EAAOD,EAAU,WAAWE,CAAC,EAClDD,GAAQ,EAEV,OAAOH,GAAO,KAAK,IAAIG,CAAI,EAAIH,GAAO,MAAM,CAC9C,CAPSF,EAAAG,GAAA,eAST,IAAMI,GAAkC,CAAC,EAErCC,GAEJ,SAASC,MAAOC,EAAa,CAC3B,QAAQ,OAAO,MAAM,GAAGC,GAAeD,CAAI;AAAA,CAAK,CAClD,CAFSV,EAAAS,GAAA,OAgBT,IAAMG,GAAY,CAChB,KAAM,UACN,OAAQ,UACR,IAAK,WACL,MAAO,WACP,KAAM,WACN,OAAQ,WACR,KAAM,WACN,OAAQ,iBACR,QAAS,SACX,EAWA,IAAMC,GAAW,UAEV,SAASC,GAAYC,EAAcC,EAAmB,CAI3D,MAAO,GAHYA,IAAc,EAC7BC,GAAU,OACV,SAAWD,EAAY,EAAIA,EAAY,OAAOA,SAC3BD,IAAOF,IAChC,CALgBK,EAAAJ,GAAA,eAOT,SAASK,GACdC,EACAC,EACAC,EAAO,GACP,CACA,OAAOF,EAAK,IAAKG,GAAU,CACzB,GAAI,OAAOA,GAAU,SACnB,OAAOA,EACT,IAAIC,EAAQH,EACRI,EAAMZ,GACV,OAAIS,IACFE,EAAQ,GAAGP,GAAU,OAAOO,IAC5BC,EAAM,GAAGA,IAAMR,GAAU,QAEpB,GAAGO,IAAQD,IAAQE,GAC5B,CAAC,CACH,CAhBgBP,EAAAC,GAAA,mBAkBT,IAAMO,GAAwB,iEAE9B,SAASC,GAAkBC,EAAyB,CAAC,EAAe,CACrEC,IAAmB,OACrBA,GAAkBC,GAAe,GAE/BC,IAAa,OACfA,GAAYC,GAAa,GAE3B,GAAM,CACJ,MAAAC,EAAQ,OACR,OAAAC,EAAS,OACT,OAAAC,EAASN,GACT,YAAAO,EAAc,GACd,aAAAC,EAAe,GACf,QAAAC,EAAU,EACV,KAAAC,EAAO,EACP,MAAAC,EAAQ,GACR,KAAAC,EAAO,EACT,EAAIb,EACEc,EAAmBC,EAAmBT,CAAM,EAC5CU,EAAeC,EAAeZ,CAAK,EACzC,OAAQa,GAAoB,CAG1B,GAFI,CAACF,EAAaE,EAAI,KAAK,GAEvB,CAACJ,EAAiBI,EAAI,IAAI,EAC5B,OACF,IAAMC,EAAUf,GAAa,EACvBgB,EAAOF,EAAI,MAAQ,GACrBG,EAAQC,GAAWF,GAAQ,EAAE,EAC7BC,GAAS,OACXA,EAAQ,CACN,MAAOE,GAAYH,CAAI,CAEzB,EACAE,GAAWF,CAAI,EAAIC,GAErB,IAAMG,EAAiBC,GAAmBN,EAAUhB,EAAU,EAE1DuB,EAEAC,EAAclB,EAAe,IAAIW,KAAUA,EAQ/C,GANIV,EAAU,IACZiB,EAAcA,EAAY,SAASjB,EAAS,GAAG,GAE7CC,EAAO,IACTgB,EAAcA,EAAY,OAAOhB,EAAM,GAAG,GAExCJ,EAAQ,CACV,IAAMqB,EAAIP,EAAM,MAChBK,EAAO,CAAC,GAAGxC,GAAYyC,EAAaC,CAAC,MAAM,EACvCV,EAAI,QAAU,EAChBQ,EAAK,KAAK,GAAGnC,GAAgB2B,EAAI,SAAU7B,GAAU,MAAM,CAAC,EACrD6B,EAAI,QAAU,EACrBQ,EAAK,KAAK,GAAGnC,GAAgB2B,EAAI,SAAU7B,GAAU,GAAG,CAAC,EAEzDqC,EAAK,KAAK,GAAGR,EAAI,QAAQ,EACvBL,GACFa,EAAK,KAAKxC,GAAY,IAAIsC,IAAkBI,CAAC,CAAC,OAGhDF,EAAO,CAACC,EAAa,GAAGT,EAAI,QAAQ,EAChCL,GACFa,EAAK,KAAK,IAAIF,GAAgB,EAQlC,GALIN,EAAI,WAAW,CAAC,IAAMpB,IAExB,QAAQ,IAAI+B,GAAS,CAAC,EAGpBjB,EAAO,CACT,IAAIkB,EAAO,GACP,OAAOlB,GAAU,WACnBkB,EAAOC,GACL,CAAC,eAAgB,gBAAiB,UAAU,EAC5C,EACF,EACKD,IACHA,EAAOE,GAAkB,EAAG,EAAI,IAIlCF,EAAOE,GADO,OAAOpB,GAAU,SAAWA,EAAQ,EAClB,EAAI,EAElCkB,GACFJ,EAAK,KAAKxC,GAAY,IAAI4C,KAAS,CAAU,CAAC,EAElD,IAAMG,EAAM,IACNC,EAAY,IAElB,OAAQhB,EAAI,MAAO,CACjB,OACMV,IACFkB,EAAK,CAAC,EAAI,IAAIO,IAAMC,OAAeR,EAAK,CAAC,KAC3CS,GAAI,GAAGT,CAAI,EACX,MACF,OACMlB,IACFkB,EAAK,CAAC,GAAKnB,EACPrB,GAAY,IAAI+C,IAAMC,IAAYA,MAAe,CAAY,EAC7D,IAAID,IAAMC,IAAYA,OAAiBR,EAAK,CAAC,GAEnDS,GAAI,GAAGT,CAAI,EACX,MACF,OACMlB,IACFkB,EAAK,CAAC,GAAKnB,EACPrB,GAAY,IAAI+C,IAAMC,IAAYA,IAAYA,KAAc,CAAS,EACrE,IAAID,IAAMC,IAAYA,IAAYA,MAAgBR,EAAK,CAAC,GAE9DS,GAAI,GAAGT,CAAI,EACX,MACF,QACMlB,IACFkB,EAAK,CAAC,EAAI,IAAIO,QAAUP,EAAK,CAAC,KAChCS,GAAI,GAAGT,CAAI,EACX,KACJ,CACF,CACF,CAvHgBpC,EAAAS,GAAA,qBE/FhB,SAASqC,IAAsB,CAC7B,IAAMC,EAAW,CACfC,GAAkB,CAChB,QAAS,GACT,aAAc,EAEhB,CAAC,CACH,EAEMC,EAAc,QAAQ,IAAI,UAAY,QAAQ,IAAI,IAClDC,EAAOC,GAAe,QAAQ,IAAI,UAAW,EAAI,EACjDC,EAASD,GAAe,QAAQ,IAAI,YAAa,EAAK,EACxDF,GACFF,EAAS,QAAQM,GAAkBC,GAAOL,CAAW,EAAG,CAAE,KAAAC,EAAM,OAAAE,CAAO,CAAC,CAAC,EAE3EG,EAAO,YAAYR,CAAQ,CAC7B,CAhBSS,EAAAV,GAAA,uBAmBTA,GAAoB","names":["index_node_exports","__export","CRYPTO_DEFAULT_ALG","CRYPTO_DEFAULT_DERIVE_ALG","CRYPTO_DEFAULT_DERIVE_ITERATIONS","CRYPTO_DEFAULT_HASH_ALG","Channel","CryptoEncoder","DAY_MS","Day","Emitter","FileStorage","JsonEncoder","LocalChannel","LogLevel","LogLevelAlias","Logger","LoggerConsoleHandler","LoggerContext","LoggerFileHandler","LoggerMemoryHandler","LoggerNodeHandler","MemStorage","NoopEncoder","PoolTaskIdConflictResolution","PoolTaskState","Progress","PubSub","SerialQueue","Uint8ArrayToHexDump","Uint8ArrayToJson","Uint8ArrayToString","XRX","_decodeUtf8Polyfill","_encodeUtf8Polyfill","arrayAvg","arrayBatches","arrayEmptyInPlace","arrayFilterInPlace","arrayFlatten","arrayIntersection","arrayIsEqual","arrayMax","arrayMin","arrayMinus","arrayRandomElement","arrayRemoveElement","arraySetElement","arrayShuffle","arrayShuffleForce","arrayShuffleInPlace","arraySorted","arraySortedNumbers","arraySum","arraySymmetricDifference","arrayToggleInPlace","arrayUnion","arrayUnique","avg","between","cloneJsonObject","cloneObject","cmp","colorString","colorStringList","composeOrderby","createArray","createLocalChannelPair","createPromise","createPromiseProxy","csvParse","csvParseToObjects","csvStringify","dateStringToDays","day","dayDay","dayDiff","dayFromAny","dayFromDate","dayFromDateGMT","dayFromParts","dayFromString","dayFromTimestamp","dayFromToday","dayIterator","dayMonth","dayMonthStart","dayOffset","dayRange","dayToDate","dayToDateGMT","dayToParts","dayToString","dayToTimestamp","dayYear","dayYearStart","debounce","decimal","decimalCentsPart","decimalFromCents","decimalToCents","decodeBase16","decodeBase32","decodeBase58","decodeBase62","decrypt","deepEqual","deepMerge","deepStripUndefinedInPlace","deriveKeyPbkdf2","detect","digest","empty","encodeBase16","encodeBase32","encodeBase58","encodeBase62","encodeQuery","encrypt","endSortWeight","ensureFolder","ensureKey","ensureKeyAsync","equalBinary","escapeHTML","escapeRegExp","estimateSizeForBase","exists","fetchBasic","fetchJson","fetchOptionsBasicAuth","fetchOptionsFormURLEncoded","fetchOptionsJson","fetchText","fixBrokenUth8String","forEachDay","forTimes","formatMessages","formatMilliseconds","fromBase64","fromBase64String","fromCamelCase","fromHex","getEnvVariableRelaxed","getGlobal","getGlobalContext","getGlobalEmitter","getGlobalLogger","getNamespaceFilterString","getNavigator","getSecureRandom","getSecureRandomIfPossible","getSourceLocation","getSourceLocationByPrecedingPattern","getStack","getStackLlocationList","getTimestamp","getWindow","immediate","isArray","isBoolean","isBrowser","isEven","isHalf","isInteger","isLocalHost","isNotNull","isNull","isNullOrUndefined","isNumber","isObject","isPrime","isPrimeRX","isPrimitive","isPromise","isRecord","isRecordPlain","isSafeInteger","isString","isTimeout","isUint8Array","isValue","joinToUint8Array","jsonStringify","jsonStringifySafe","jsonStringifySorted","jsonToUint8Array","last","lazyListener","linkifyPlainText","listDistinctUnion","listGroupBy","listOfKey","listQuery","loggerStackTraceDebug","memoize","memoizeAsync","messages","moveSortWeight","noop","objectIsEmpty","objectMap","objectMergeDisposable","parseArgs","parseBasicAuth","parseDate","parseLogLevel","parseOrderby","parseQuery","pbcopy","platform","promisify","qid","randomBoolean","randomFloat","randomInt","randomUint8Array","readText","regExpEscape","regExpString","removeFolder","renderMessages","roundDown","roundHalfAwayFromZero","roundHalfDown","roundHalfEven","roundHalfOdd","roundHalfTowardsZero","roundHalfUp","roundUp","seededRandom","setUuidDefaultEncoding","setupEnv","size","sleep","sortedItems","sortedOrderby","startSortWeight","stringToBoolean","stringToFloat","stringToInteger","stringToPath","stringToUInt8Array","suid","suidBytes","suidBytesDate","suidDate","sum","throttle","timeout","timeoutReached","timoutError","toBase64","toBase64Url","toBool","toCamelCase","toCapitalize","toCapitalizeWords","toFloat","toHex","toHumanReadableFilePath","toHumanReadableUrl","toInt","toPath","toString","toUint8Array","toValidFilename","today","tryTimeout","uname","unescapeHTML","useAsyncMutex","useBase","useDefer","useDispose","useDisposer","useEventListener","useExitHandler","useInterval","useLevelFilter","useMessageHub","useMutex","useNamespaceFilter","usePool","usePubSub","useRPC","useSorted","useTimeout","uuid","uuid32bit","uuidB32","uuidB62","uuidBytes","uuidDecode","uuidDecodeB32","uuidDecodeB62","uuidDecodeV4","uuidEncode","uuidEncodeB32","uuidEncodeB62","uuidEncodeV4","uuidIsValid","uuidv4","valueToBoolean","valueToFloat","valueToInteger","valueToPath","valueToString","waitOn","writeText","__toCommonJS","_global","__name","getGlobalContext","gcontext","getNamespaceFilterString","defaultNamespaceFilter","__name","useNamespaceFilter","filter","fn","reject","accept","_name","split","len","template","name","i","defaultLevelFilter","parseLogLevel","l","LogLevelAlias","useLevelFilter","filterLevel","level","LoggerConsoleHandler","opt","level","filter","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","name","__name","LogLevel","LogLevelAlias","LoggerContext","_prefix","logHandlers","LoggerConsoleHandler","logCheckNamespace","__name","_name","logLock","logFactory","LoggerBaseFactory","logDebug","name","level","logLevel","parseLogLevel","defineForLogLevel","fnLevel","fn","log","messages","emit","prefix","msg","handler","cond","args","Logger","namespaces","useNamespaceFilter","lock","debug","handlers","h","factory","globalLogger","getLoggerContext","logger","LoggerContext","LoggerConsoleHandler","__name","getGlobalLogger","gcontext","getGlobalContext","Logger","_sortedReplacer","__name","key","value","sorted","jsonStringifySorted","obj","indent","serializer","replacer","cycleReplacer","stack","keys","thisPos","jsonStringifySafe","spaces","jsonStringify","log","Logger","_encodeUtf8Polyfill","str","encodedString","len","buf","__name","_decodeUtf8Polyfill","remainingLen","bufPos","nextLen","bytes","_textEncoder","stringToUInt8Array","text","encoder","data","_textDecoder","Uint8ArrayToString","bin","decoder","toUint8Array","joinToUint8Array","args","length","bins","d","b","cursor","toHex","h","s","v","fromHex","hexString","byte","toBase64","stripPadding","sb","i","toBase64Url","fromBase64","a","fromBase64String","equalBinary","aa","bb","jsonToUint8Array","json","jsonStringifySafe","err","Uint8ArrayToJson","Uint8ArrayToHexDump","buffer","blockSize","lines","hex","block","addr","codes","ch","code","chars","randomUint8Array","length","randomBytes","i","__name","CRYPTO_DEFAULT_HASH_ALG","CRYPTO_DEFAULT_ALG","CRYPTO_DEFAULT_DERIVE_ALG","CRYPTO_DEFAULT_DERIVE_ITERATIONS","digest","message","algorithm","toUint8Array","deriveKeyPbkdf2","secret","opt","secretBuffer","keyMaterial","MAGIC_ID","encrypt","data","key","iv","cipher","binCypher","bufferLength","buffer","pos","decrypt","magic","equalBinary","plain","getSecureRandom","__name","getSecureRandomIfPossible","randomBoolean","bias","randomInt","max","min","randomFloat","between","value","sum","array","acc","avg","isPrimeRX","isPrime","i","_seed","seededRandom","seed","rnd","parseOrderby","value","field","orderby","__name","composeOrderby","asc","cmp","a","b","aa","bb","sortedOrderby","values","orderByList","sortValues","result","arrayUnique","x","n","index","__name","arrayMinus","y","arrayUnion","a","acc","value","arrayFlatten","list","arrayIntersection","arraySymmetricDifference","arrayRemoveElement","arr","el","arraySetElement","arrayFilterInPlace","array","fn","arrayToggleInPlace","e","arrayEmptyInPlace","arraySorted","cond","cmp","arraySortedNumbers","l","r","arrayIsEqual","array1","array2","arrayShuffleInPlace","getSecureRandomIfPossible","arrayShuffle","arrayShuffleForce","copy","arrayRandomElement","arrayMax","arrayMin","arraySum","arrayAvg","flatArray","arrayBatches","chunckLength","chunks","i","createArray","size","item","log","Logger","alphabets","useBase","alphaOrBase","ALPHABET","BASE_MAP","j","i","x","xc","BASE","LEADER","FACTOR","iFACTOR","encode","source","padToLength","data","toUint8Array","length","pbegin","pend","size","dataEncoded","carry","it1","it2","str","__name","decode","psz","dataDecoded","it3","it4","encodeBase32","_decodeBase32","decodeBase32","s","encodeBase16","decodeBase16","useBase","encodeBase58","decodeBase58","encodeBase62","decodeBase62","estimateSizeForBase","bytes","base","__name","toCamelCase","__name","s","$0","$1","toCapitalize","toCapitalizeWords","fromCamelCase","str","separator","TRUE_VALUES_LIST","stringToBoolean","value","defaultValue","__name","stringToInteger","stringToFloat","valueToBoolean","valueToInteger","valueToFloat","valueToString","toFloat","toInt","toString","toBool","formatMessages","messages","opt","trace","pretty","obj","Uint8ArrayToHexDump","renderMessages","fixBrokenUth8String","brokenString","DAY_MS","dayYear","day","__name","dayMonth","dayDay","dayToParts","dayToDate","gmt","dayToString","dayFromToday","dayFromDate","dayFromAny","value","dayFromString","year","month","dayFromParts","dayToDateGMT","date","dayFromDateGMT","dayToTimestamp","dayFromTimestamp","ms","sep","baseString","string","dayMonthStart","offset","dayYearStart","dayOffset","dayDiff","left","right","dayRange","list","dayIterator","log","Logger","createPromise","resolve","reject","_resolve","_reject","__name","sleep","milliSeconds","immediate","timeoutReached","timeout","promise","timeoutValue","done","result","err","timoutError","isTimeout","value","tryTimeout","waitOn","obj","event","timeoutMS","fn","timer","isPromise","promisify","Day","days","date","n","dateString","gmt","value","year","month","day","sep","baseString","offset","m","mm","yy","otherDay","__name","forEachDay","from","to","handler","start","end","result","isPromise","today","dateStringToDays","decimal","value","decimalPlaces","__name","decimalFromCents","decimalToCents","decimalCentsPart","isObject","obj","__name","isPrimitive","isArray","isRecord","isRecordPlain","isString","isNumber","isInteger","isSafeInteger","isBoolean","isNullOrUndefined","isNull","isUint8Array","isNotNull","value","isValue","deepEqual","a","b","hash","isPrimitive","p","aa","bb","__name","deepStripUndefinedInPlace","isRecord","isArray","i","deepMerge","target","sources","source","isObject","key","targetValue","sourceValue","escapeHTML","__name","s","unescapeHTML","listQuery","list","filters","mappers","a","m","__name","listGroupBy","key","result","currentValue","groupValue","listDistinctUnion","listOfKey","item","objectMap","obj","fn","isObject","k","v","r","isArray","__name","objectMergeDisposable","a","b","objectIsEmpty","reControlChars","reRelativePath","reTrailingPeriods","filenameReservedRegex","__name","windowsReservedNameRegex","toValidFilename","string","replacement","rxEscape","escapeRegExp","value","__name","isHalf","__name","value","isEven","roundUp","roundDown","roundHalfUp","roundHalfOdd","rounded","roundHalfAwayFromZero","roundHalfDown","roundHalfEven","roundHalfTowardsZero","startSortWeight","items","acc","item","getSecureRandomIfPossible","__name","endSortWeight","moveSortWeight","newIndex","oldIndex","count","moveLower","sortedItems","step","lower","distance","middle","fuzzy","a","b","useSorted","config","getter","__name","item","items","a","b","start","acc","getSecureRandomIfPossible","end","between","lower","upper","distance","middle","fuzzy","move","newIndex","oldIndex","sortableItems","count","moveLower","step","findURL","linkifyPlainText","text","part","i","escapedPart","escapeHTML","toHumanReadableUrl","__name","url","encodeQuery","data","pairs","key","value","v","parseQuery","queryString","query","pair","ensureKey","obj","key","createFn","value","__name","ensureKeyAsync","size","last","array","empty","err","cloneObject","jsonStringifySafe","cloneJsonObject","memoize","fn","cache","result","memoizeAsync","forTimes","count","i","RX_WHITESPACE","RX_REAL_GROUPS","RX_LOOK_BEHIND","log","Logger","regExpString","rx","__name","regExpEscape","str","XRX","pattern","flags","_flags","_rx","r","index","name","parts","m","leftContext","matches","replacement","fn","defaultSeparator","csvStringify","data","opt","separator","body","field","isBoolean","s","isRecord","isArray","jsonStringifySafe","__name","csvParse","raw","rxOneValueWithSeparator","escapeRegExp","lines","row","m","text","value","csvParseToObjects","header","l","v","i","logDispose","Logger","callDisposer","disposable","promisify","isPromise","__name","useDispose","config","opt","isString","name","log","tracked","untrack","arrayFilterInPlace","el","dispose","track","obj","useDisposer","useDefer","mode","steps","exec","expectSync","step","result","useTimeout","fn","timeout","timeoutHandle","useInterval","interval","intervalHandle","useEventListener","emitter","eventName","args","useMutex","token","fn","elseFn","executed","__name","useAsyncMutex","result","isPromise","log","Logger","Emitter","useDispose","target","name","args","event","ok","subscribers","fn","all","promisify","err","listener","handlers","handler","onceListener","__name","f","getGlobalEmitter","emitter","getGlobalContext","messages","lazyListener","listenerKey","getSecureRandomIfPossible","events","lazyResolve","incoming","key","obj","ev","skipUnmatched","resolve","reject","getTimestamp","__name","formatMilliseconds","ms","parseDate","dateCandidates","dateCandidate","date","m","encode62","decode62","useBase","encode32","decode32","uuidBytesLength","uuidBytes","randomUint8Array","__name","uuidB62","bytes","uuidEncodeB62","uuidDecodeB62","uuid","uuidB32","uuidEncodeB32","uuidDecodeB32","pattern","uuidv4","c","uuidEncodeV4","id","toHex","uuidDecodeV4","fromHex","ReferenceDateInMS","longToByteArray","long","byteArray","index","byte","suidBytes","ms","getTimestamp","suid","uuidEncode","suidDate","suidBytesDate","uuidDecode","acc","uuid32bit","mapModes","_mode","_sorted","setUuidDefaultEncoding","mode","sorted","uuidIsValid","_unameCounters","uname","name","_qid","qid","Channel","Emitter","uuid","__name","LocalChannel","data","createLocalChannelPair","w1","w2","NoopEncoder","data","__name","JsonEncoder","jsonToUint8Array","Uint8ArrayToJson","CryptoEncoder","key","plain","encrypt","decrypt","createPromiseProxy","__name","fn","opt","predefinedMethods","target","name","args","useMessageHub","uname","encoder","JsonEncoder","retryAfter","ignoreUnhandled","logLevel","log","Logger","handlers","channel","queue","queueRetryTimer","waitingForResponse","dispose","postNext","message","err","postMessage","connect","newChannel","msg","id","result","error","isPromise","valueToString","resolve","reject","fetchMessage","timeout","uuid","tryTimeout","newHandlers","perCallopt","PubSub","Emitter","opt","name","encoder","JsonEncoder","channel","debug","uname","Logger","data","info","event","args","err","__name","usePubSub","rpcCounter","defaultSerialize","__name","i","defaultDeserialize","useRPC","functions","options","post","on","eventNames","serialize","deserialize","rpcPromiseMap","data","msg","mode","args","id","method","result","error","fn","e","promise","_","sendEvent","sendCall","resolve","reject","rpcCounter","Progress","Emitter","opt","uname","child","progress","arrayRemoveElement","units","value","completedUnits","step","indent","s","__name","PoolTaskIdConflictResolution","PoolTaskState","usePool","config","maxParallel","name","uname","idConflictResolution","events","Emitter","dispose","useDispose","cancelAll","progress","Progress","countMax","countResolved","currentParallel","priority","tasks","waitFinishAll","promise","resolve","createPromise","__name","cleanupFinished","id","didFinish","didUpdate","presentMax","presentResolved","max","resolved","state","performNext","waitingTasks","t","taskInfo","tt","done","taskFinished","result","r","err","cancel","hasById","enqueue","task","uuid","resolution","runningTask","taskProgress","units","inc","SerialQueue","Emitter","opt","name","uname","logLevel","Logger","info","task","resolve","result","err","immediate","_unblock","resolver","r","__name","DEBUG","log","Logger","throttle","callback","opt","delay","trailing","leading","timeoutID","checkpoint","visited","trailingExec","debugCheckpoint","clearExistingTimeout","__name","wrapper","args","now","elapsed","debugElapsed","dnow","exec","timeout","debounce","running","lastArguments","promisify","immediate","isLocalHost","hostname","__name","LoggerMemoryHandler","opt","level","filter","messages","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","__name","log","Logger","defaultOptions","parseBasicAuth","url","m","username","password","__name","fetchBasic","fetchOptions","fetchFn","isArray","deepMerge","arrayFlatten","auth","fetchOptionsBasicAuth","response","err","fetchJson","res","fetchText","fetchOptionsFormURLEncoded","data","method","encodeQuery","fetchOptionsJson","jsonStringifySafe","toBase64","getWindow","__name","getNavigator","getGlobal","_navigator","_window","detect","info","isBrowser","platform","useExitHandler","handler","MemStorage","_opt","key","value","cloneObject","__name","noop","__name","parseArgs","config","args","alias","normalize","toCamelCase","booleanArgs","listArgs","numberArgs","nameToAlias","map","curr","name","values","value","opts","setOpt","__name","argList","arg","key","valuePart","pbcopy","data","resolve","reject","spawn","proc","err","__name","import_crypto","nodeCrypto","err","import_fs","import_path","log","Logger","NEWLINE","RE_INI_KEY_VAL","RE_NEWLINES","NEWLINES_MATCH","parse","src","_options","obj","line","idx","keyValueArr","key","val","end","isDoubleQuoted","__name","stringToPath","value","defaultValue","valueToPath","toPath","getEnvVariableRelaxed","name","env","k","v","setupEnv","options","dotenvPath","encoding","debug","parsedEnv","fs","parsedEnvLocal","parsed","e","import_fs","import_path","log","Logger","FileStorage","opt","data","jsonStringifySafe","err","toValidFilename","key","value","cloneObject","path","index","item","keys","__name","import_promises","import_node_path","toHumanReadableFilePath","path","p","h","__name","exists","ensureFolder","parts","joinPath","removeFolder","readText","writeText","content","import_fs","import_path","namespaces","LoggerFileHandler","path","opt","level","filter","time","pretty","stream","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","timeNow","name","ninfo","args","renderMessages","write","__name","import_tty","import_path","getStackLlocationList","stack","rawLine","m","line","isNotNull","__name","cwd","home","pathStripCwd","path","fileURL","extractFileInfo","stackLine","getSourceLocation","level","stripCwd","getStack","getSourceLocationByPrecedingPattern","patterns","lines","l","index","p","shouldUseColor","valueToBoolean","tty","__name","defaultUseColor","colors","selectColor","namespace","hash","i","namespaces","startTime","log","args","renderMessages","TTY_STYLE","colorEnd","colorString","text","colorCode","TTY_STYLE","__name","colorStringList","list","style","bold","value","start","end","loggerStackTraceDebug","LoggerNodeHandler","opt","defaultUseColor","shouldUseColor","startTime","getTimestamp","level","filter","colors","levelHelper","nameBrackets","padding","fill","stack","time","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","timeNow","name","ninfo","namespaces","selectColor","timeDiffString","formatMilliseconds","args","displayName","c","getStack","line","getSourceLocationByPrecedingPattern","getSourceLocation","sep","charLevel","log","setupLogContextNode","handlers","LoggerNodeHandler","logFilePath","time","valueToBoolean","pretty","LoggerFileHandler","toPath","Logger","__name"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.node.ts","../src/common/global.ts","../src/common/log-filter.ts","../src/common/log-console.ts","../src/common/log-base.ts","../src/common/log.ts","../src/common/data/json.ts","../src/common/data/bin.ts","../src/common/crypto.ts","../src/common/data/math.ts","../src/common/data/orderby.ts","../src/common/data/array.ts","../src/common/data/basex.ts","../src/common/data/camelcase.ts","../src/common/data/convert.ts","../src/common/data/day.ts","../src/common/exec/promise.ts","../src/common/data/day-legacy.ts","../src/common/data/decimal.ts","../src/common/data/is.ts","../src/common/data/deep.ts","../src/common/data/html.ts","../src/common/data/list.ts","../src/common/data/object.ts","../src/common/data/path.ts","../src/common/data/regexp.ts","../src/common/data/rounding.ts","../src/common/data/sortable.ts","../src/common/data/sorted.ts","../src/common/data/url.ts","../src/common/data/utils.ts","../src/common/data/xrx.ts","../src/common/csv.ts","../src/common/dispose-defer.ts","../src/common/exec/mutex.ts","../src/common/msg/emitter.ts","../src/common/time.ts","../src/common/uuid.ts","../src/common/msg/channel.ts","../src/common/msg/encoder.ts","../src/common/msg/messages.ts","../src/common/msg/pubsub.ts","../src/common/msg/rpc.ts","../src/common/exec/progress.ts","../src/common/exec/pool.ts","../src/common/exec/queue.ts","../src/common/exec/throttle-debounce.ts","../src/common/localhost.ts","../src/common/log-memory.ts","../src/common/network.ts","../src/common/platform.ts","../src/common/storage/memstorage.ts","../src/common/utils.ts","../src/node/args.ts","../src/node/clipboard.ts","../src/node/crypto.ts","../src/node/env.ts","../src/node/filestorage.ts","../src/node/fs.ts","../src/node/log-file.ts","../src/node/log-node.ts","../src/node/log-util.ts","../src/node/log-context-node.ts"],"sourcesContent":["// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport * from './common/index'\nexport * from './node/index'\n","// Global context across build systems etc.\n\ndeclare global {\n interface ZeedGlobalContext {}\n}\n\ninterface ZeedGlobalIntegration {\n _zeedGlobal?: ZeedGlobalContext\n}\n\nfunction _global(): ZeedGlobalIntegration {\n if (typeof self !== 'undefined')\n return self as ZeedGlobalIntegration\n if (typeof window !== 'undefined')\n return window as ZeedGlobalIntegration\n if (typeof global !== 'undefined')\n return global as ZeedGlobalIntegration\n if (typeof globalThis !== 'undefined')\n return globalThis as ZeedGlobalIntegration\n throw new Error('unable to locate global object')\n}\n\nexport function getGlobalContext(): ZeedGlobalContext {\n const gcontext = _global()\n if (gcontext._zeedGlobal == null)\n gcontext._zeedGlobal = {}\n\n return gcontext._zeedGlobal\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { LogLevelAliasType } from './log-base'\nimport { LogLevel, LogLevelAlias } from './log-base'\n\ninterface NamespaceFilter {\n (name: string): boolean\n accept: RegExp[]\n reject: RegExp[]\n filter: string\n}\n\nexport function getNamespaceFilterString(defaultNamespaceFilter: any): string {\n if (\n defaultNamespaceFilter === true\n || defaultNamespaceFilter === 'true'\n || defaultNamespaceFilter === '1'\n || (typeof defaultNamespaceFilter === 'number' && defaultNamespaceFilter !== 0)\n )\n defaultNamespaceFilter = '*'\n else if (\n defaultNamespaceFilter === false\n || defaultNamespaceFilter === 'false'\n || defaultNamespaceFilter === 0\n || defaultNamespaceFilter === '0'\n || defaultNamespaceFilter == null\n || defaultNamespaceFilter === 'null'\n || defaultNamespaceFilter === 'undefined'\n )\n defaultNamespaceFilter = ''\n else\n defaultNamespaceFilter = String(defaultNamespaceFilter)\n\n return defaultNamespaceFilter\n}\n\n// todo sideffects\nconst defaultNamespaceFilter: string = getNamespaceFilterString(\n typeof process !== 'undefined'\n ? process.env.ZEED ?? process.env.DEBUG\n : typeof localStorage !== 'undefined'\n ? localStorage.zeed ?? localStorage.debug\n : '*',\n)\n\n/**\n * Filter as described here https://github.com/visionmedia/debug#wildcards\n *\n * @param filter Namespace filter\n * @returns Function to check if filter applies\n */\nexport function useNamespaceFilter(\n filter: string = defaultNamespaceFilter,\n): NamespaceFilter {\n let fn: any // (name: string) => boolean\n const reject = [] as RegExp[]\n const accept = [] as RegExp[]\n\n if (!filter) {\n fn = function (_name: string) {\n return false\n }\n }\n else if (filter === '*') {\n fn = function (_name: string) {\n return true\n }\n }\n else {\n let i\n const split = filter.split(/[\\s,]+/)\n const len = split.length\n for (i = 0; i < len; i++) {\n if (!split[i]) {\n // ignore empty strings\n continue\n }\n const template = split[i].replace(/\\*/g, '.*?')\n if (template[0] === '-')\n reject.push(new RegExp(`^${template.substr(1)}$`))\n else\n accept.push(new RegExp(`^${template}$`))\n }\n\n fn = function (name: string) {\n if (reject.length === 0 && accept.length === 0)\n return true\n\n let i, len\n for (i = 0, len = reject.length; i < len; i++) {\n if (reject[i].test(name))\n return false\n }\n for (i = 0, len = accept.length; i < len; i++) {\n if (accept[i].test(name))\n return true\n }\n return false\n }\n }\n fn.accept = accept\n fn.reject = reject\n fn.filter = filter\n return fn as NamespaceFilter\n}\n\n// todo sideffects\nconst defaultLevelFilter: any\n = typeof process !== 'undefined'\n ? process.env.ZEED_LEVEL ?? process.env.LEVEL ?? process.env.DEBUG_LEVEL\n : typeof localStorage !== 'undefined'\n ? localStorage.zeed_level ?? localStorage.level ?? localStorage.debug_level\n : undefined\n\nexport function parseLogLevel(filter: LogLevelAliasType): LogLevel {\n if (filter === false)\n return LogLevel.off\n if (typeof filter === 'number')\n return filter as number\n if (typeof filter === 'string') {\n const l = LogLevelAlias[filter.toLocaleLowerCase().trim()]\n if (l != null)\n return l\n }\n return LogLevel.all\n}\n\nexport function useLevelFilter(\n filter: string | number | boolean | LogLevelAliasType = defaultLevelFilter,\n): (level: LogLevel) => boolean {\n const filterLevel = parseLogLevel(filter)\n return level => level >= filterLevel\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-console */\n\nimport type { LogHandler, LogHandlerOptions, LogMessage } from './log-base'\nimport { LogLevel } from './log-base'\nimport { useLevelFilter, useNamespaceFilter } from './log-filter'\n\n/**\n * Very basic logger. Please take a look at the browser and node\n * optimized loggers. This one is just the absolute fallback option.\n *\n * @param level Log level\n * @returns Logger\n */\nexport function LoggerConsoleHandler(opt: LogHandlerOptions = {}): LogHandler {\n const {\n level = undefined,\n filter = undefined,\n // colors = true,\n // levelHelper = false,\n // nameBrackets = true,\n // padding = 16,\n } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n const name = msg.name ? `[${msg.name}]` : ''\n switch (msg.level) {\n case LogLevel.info:\n console.info(`I|* ${name}`, ...msg.messages)\n break\n case LogLevel.warn:\n console.warn(`W|** ${name}`, ...msg.messages)\n break\n case LogLevel.error:\n console.error(`E|*** ${name}`, ...msg.messages)\n break\n default:\n console.debug(`D| ${name}`, ...msg.messages)\n break\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { LoggerConsoleHandler } from './log-console'\nimport { parseLogLevel, useNamespaceFilter } from './log-filter'\n\nexport enum LogLevel {\n all = -1,\n debug = 0,\n info,\n warn,\n error,\n fatal,\n off = Infinity,\n}\n\nexport const LogLevelAlias: Record<string, LogLevel> = {\n '*': LogLevel.all,\n 'a': LogLevel.all,\n 'all': LogLevel.all,\n 'd': LogLevel.debug,\n 'dbg': LogLevel.debug,\n 'debug': LogLevel.debug,\n 'i': LogLevel.info,\n 'inf': LogLevel.info,\n 'info': LogLevel.info,\n 'w': LogLevel.warn,\n 'warn': LogLevel.warn,\n 'warning': LogLevel.warn,\n 'e': LogLevel.error,\n 'err': LogLevel.error,\n 'error': LogLevel.error,\n 'fatal': LogLevel.fatal,\n 'off': LogLevel.off,\n '-': LogLevel.off,\n}\n\nexport type LogLevelAliasKey = keyof typeof LogLevelAlias\nexport type LogLevelAliasType = LogLevel | boolean | LogLevelAliasKey\n\nexport interface LogMessage {\n level: LogLevel\n name: string\n messages: any[]\n line?: number\n file?: string\n timestamp?: number\n}\n\nexport type LogHandler = (msg: LogMessage) => void\n\nexport interface LoggerInterface {\n (...messages: any[]): void\n\n /** @deprecated use .level = LogLevel.off or LogLevel.all */\n active: boolean\n\n level: LogLevel\n\n debug(...messages: any[]): void\n\n info(...messages: any[]): void\n\n warn(...messages: any[]): void\n\n error(...messages: any[]): void\n\n /**\n * Throws if condition is not truthy.\n *\n * **Attention!** Due to a bug in typescript you will need to explicitly set the `LoggerInterface` type in\n * order to have the assertions having an effect on unreachable code. Example:\n *\n * ```ts\n * const log: LoggerInterface = Logger('xxx')\n * ```\n *\n * Bug https://github.com/microsoft/TypeScript/issues/50363#issuecomment-1219811447\n */\n assert(condition: unknown, ...messages: any[]): asserts condition\n\n /**\n * Always throws.\n *\n * **Attention!** Due to a bug in typescript you will need to explicitly set the `LoggerInterface` type in\n * order to have the assertions having an effect on unreachable code. Example:\n *\n * ```ts\n * const log: LoggerInterface = Logger('xxx')\n * ```\n *\n * Bug https://github.com/microsoft/TypeScript/issues/50363#issuecomment-1219811447\n */\n fatal(...messages: any[]): never\n\n extend(prefix: string): LoggerInterface\n\n factory?: LoggerContextInterface\n\n label: string\n}\n\nexport interface LoggerContextInterface {\n (name?: string, level?: LogLevelAliasType): LoggerInterface\n\n registerHandler(handler: LogHandler): void\n\n setFilter(namespaces: string): void\n\n setHandlers(handlers?: (LogHandler | undefined | null)[]): void\n\n setLock(lock: boolean): void\n\n /** When true emits a short log message for each Logger when being set up first time. */\n setDebug(debug: boolean): void\n\n setLogLevel(level?: LogLevel): void\n\n setFactory(factory: (name?: string) => LoggerInterface): void\n}\n\nexport interface LogHandlerOptions {\n level?: LogLevel\n filter?: string\n colors?: boolean\n levelHelper?: boolean\n nameBrackets?: boolean\n padding?: number\n fill?: number\n stack?: boolean | number\n time?: boolean\n pretty?: boolean\n}\n\nexport function LoggerContext(_prefix = ''): LoggerContextInterface {\n let logHandlers: LogHandler[] = [LoggerConsoleHandler()]\n let logCheckNamespace = (_name: string) => true\n let logLock = false\n let logFactory = LoggerBaseFactory\n let logDebug = false\n\n function LoggerBaseFactory(\n name = '',\n level?: LogLevelAliasType,\n ): LoggerInterface {\n const logLevel = parseLogLevel(level ?? LogLevel.all)\n\n function defineForLogLevel(fnLevel: LogLevel, fn: any) {\n if (logLevel <= fnLevel)\n return fn\n return () => {}\n }\n\n const log = defineForLogLevel(LogLevel.debug, (...messages: any[]) => {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n emit({\n name,\n messages,\n level: LogLevel.debug,\n })\n })\n\n log.label = name\n // log.active = true\n\n log.extend = function (prefix: string): LoggerInterface {\n return logFactory(name ? `${name}:${prefix}` : prefix)\n }\n\n const emit = (msg: LogMessage) => {\n // if (log.active === true) {\n // if (msg.level >= Logger.level && msg.level >= log.level) {\n if (logCheckNamespace(name)) {\n for (const handler of logHandlers) {\n if (handler)\n handler(msg)\n }\n }\n // }\n // }\n }\n\n log.debug = defineForLogLevel(LogLevel.debug, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.debug })\n })\n\n log.info = defineForLogLevel(LogLevel.info, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.info })\n })\n\n log.warn = defineForLogLevel(LogLevel.warn, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.warn })\n })\n\n log.error = defineForLogLevel(LogLevel.error, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.error })\n })\n\n log.fatal = defineForLogLevel(LogLevel.fatal, (...messages: any[]) => {\n emit({ name, messages, level: LogLevel.fatal })\n throw new Error(`${messages.map(String).join(' ')}`)\n })\n\n log.assert = defineForLogLevel(LogLevel.fatal, (cond: unknown, ...args: any) => {\n if (!cond)\n log.fatal(...args)\n })\n\n return log\n }\n\n function Logger(\n name = '',\n level?: LogLevelAliasType,\n ): LoggerInterface {\n const log = logFactory(name, level)\n if (logDebug)\n log.debug(`+++ init of logger \"${name}\" on level \"${LogLevel[log.level]}\".`)\n return log\n }\n\n Logger.registerHandler = function (handler: LogHandler) {\n logHandlers.push(handler)\n }\n\n /** @deprecated */\n Logger.setFilter = function (namespaces: string) {\n logCheckNamespace = useNamespaceFilter(namespaces)\n }\n\n Logger.setLock = (lock = true) => (logLock = lock)\n\n Logger.setDebug = (debug = true) => (logDebug = debug)\n\n Logger.setHandlers = function (handlers: LogHandler[] = []) {\n if (logFactory !== LoggerBaseFactory)\n logFactory = LoggerBaseFactory\n\n if (logLock)\n return\n logHandlers = [...handlers].filter(h => typeof h === 'function')\n }\n\n Logger.level = LogLevel.all\n\n /** @deprecated */\n Logger.setLogLevel = function (level: LogLevel = LogLevel.all) {\n if (logLock)\n return\n Logger.level = level\n }\n\n Logger.setFactory = function (\n factory: (name?: string) => LoggerInterface,\n ): void {\n if (logLock)\n return\n logFactory = factory\n }\n\n return Logger\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getGlobalContext } from './global'\nimport type { LoggerContextInterface } from './log-base'\nimport { LoggerContext } from './log-base'\nimport { LoggerConsoleHandler } from './log-console'\n\n// Global logger to guarantee all submodules use the same logger instance\n\nlet globalLogger: LoggerContextInterface\n\ndeclare global {\n interface ZeedGlobalContext {\n logger?: any // Should be LoggerContextInterface, but avoid compiler issues this way\n }\n}\n\nfunction getLoggerContext() {\n const logger = LoggerContext()\n logger.setHandlers([LoggerConsoleHandler()])\n return logger\n}\n\nexport function getGlobalLogger(): LoggerContextInterface {\n if (globalLogger == null) {\n try {\n const gcontext = getGlobalContext()\n if (gcontext != null) {\n if (gcontext?.logger == null) {\n globalLogger = getLoggerContext()\n gcontext.logger = globalLogger\n }\n else {\n globalLogger = gcontext.logger\n }\n }\n else {\n globalLogger = getLoggerContext()\n }\n }\n catch (e) {\n globalLogger = getLoggerContext()\n }\n }\n return globalLogger\n}\n\n// todo sideffects\nexport const Logger = getGlobalLogger()\n","// From https://github.com/moll/json-stringify-safe License ISC\n\nconst _sortedReplacer = (key: string, value: any) =>\n (value instanceof Object && !(Array.isArray(value)))\n ? Object.keys(value)\n .sort()\n // .filter((key) => value[key] != null) // Remove null and undefined\n .reduce((sorted: any, key: string) => {\n // Sorted copy\n sorted[key] = value[key]\n return sorted\n }, {})\n : value\n\n// https://gist.github.com/davidfurlong/463a83a33b70a3b6618e97ec9679e490\nexport function jsonStringifySorted(\n obj: any,\n indent: number | undefined = undefined,\n) {\n return JSON.stringify(obj, _sortedReplacer, indent)\n}\n\n//\n\ntype EntryProcessor = (key: string, value: any) => any\n\nfunction serializer(replacer: EntryProcessor, cycleReplacer?: EntryProcessor) {\n const stack: any[] = []\n const keys: string[] = []\n\n if (cycleReplacer == null) {\n cycleReplacer = function (key, value) {\n if (stack[0] === value)\n return '[Circular ~]'\n return (\n `[Circular ~.${keys.slice(0, stack.indexOf(value)).join('.')}]`\n )\n }\n }\n\n return function (this: EntryProcessor, key: string, value: any): any {\n if (stack.length > 0) {\n const thisPos = stack.indexOf(this)\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\n if (~stack.indexOf(value))\n value = cycleReplacer?.call(this, key, value)\n }\n else {\n stack.push(value)\n }\n\n value = _sortedReplacer(key, value)\n\n try {\n return replacer == null ? value : replacer.call(this, key, value)\n }\n catch (err) { }\n return String(value)\n }\n}\n\n/**\n * Similar to JSON.stringify but can handle circular references\n */\nexport function jsonStringifySafe(\n obj: any,\n replacer?: EntryProcessor | null,\n spaces?: string | number | null,\n cycleReplacer?: EntryProcessor,\n): string {\n // @ts-expect-error xxx\n return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)\n}\n\nexport const jsonStringify = jsonStringifySafe\n\n//\n\n// From https://github.com/unjs/destr MIT\n// https://github.com/fastify/secure-json-parse\n// https://github.com/hapijs/bourne\nconst suspectProtoRx\n = /\"(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])(?:p|\\\\u0070)(?:r|\\\\u0072)(?:o|\\\\u006[Ff])(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:_|\\\\u005[Ff])(?:_|\\\\u005[Ff])\"\\s*:/\nconst suspectConstructorRx\n = /\"(?:c|\\\\u0063)(?:o|\\\\u006[Ff])(?:n|\\\\u006[Ee])(?:s|\\\\u0073)(?:t|\\\\u0074)(?:r|\\\\u0072)(?:u|\\\\u0075)(?:c|\\\\u0063)(?:t|\\\\u0074)(?:o|\\\\u006[Ff])(?:r|\\\\u0072)\"\\s*:/\n\nconst JsonSigRx = /^[\"{[]|^-?[0-9][0-9.]{0,14}$/\n\nfunction jsonParseTransform(key: string, value: any): any {\n if (key === '__proto__' || key === 'constructor')\n return\n\n return value\n}\n\nexport default function jsonParse(val: string): any {\n if (typeof val !== 'string')\n return val\n\n const _lval = val.toLowerCase()\n if (_lval === 'true')\n return true\n\n if (_lval === 'false')\n return false\n\n if (_lval === 'null')\n return null\n\n if (_lval === 'nan')\n return NaN\n\n if (_lval === 'infinity')\n return Infinity\n\n if (_lval === 'undefined')\n return undefined\n\n if (!JsonSigRx.test(val))\n return val\n\n try {\n if (suspectProtoRx.test(val) || suspectConstructorRx.test(val))\n return JSON.parse(val, jsonParseTransform)\n\n return JSON.parse(val)\n }\n catch (_e) {\n return val\n }\n}\n","/* eslint-disable no-control-regex */\n/* eslint-disable prefer-spread */\n\nimport { Logger } from '../log'\nimport { jsonStringifySafe } from './json'\n\nconst log = Logger('zeed:bin', 'error')\n\nexport type BinInput = Uint8Array | ArrayBuffer | string | number[]\n\n// From https://github.com/dmonad/lib0/blob/main/string.js#L44\n\nexport function _encodeUtf8Polyfill(str: string): Uint8Array {\n const encodedString = unescape(encodeURIComponent(str))\n const len = encodedString.length\n const buf = new Uint8Array(len)\n for (let i = 0; i < len; i++)\n buf[i] = encodedString.codePointAt(i) || 0\n\n return buf\n}\n\nexport function _decodeUtf8Polyfill(buf: Uint8Array) {\n let remainingLen = buf.length\n let encodedString = ''\n let bufPos = 0\n while (remainingLen > 0) {\n const nextLen = remainingLen < 10000 ? remainingLen : 10000\n const bytes = buf.subarray(bufPos, bufPos + nextLen)\n bufPos += nextLen\n // Starting with ES5.1 we can supply a generic array-like object as arguments\n // @ts-expect-error xxx\n encodedString += String.fromCodePoint.apply(null, bytes)\n remainingLen -= nextLen\n }\n return decodeURIComponent(escape(encodedString))\n}\n\nlet _textEncoder: (data: string) => Uint8Array\n\nexport function stringToUInt8Array(text: string): Uint8Array {\n if (_textEncoder == null) {\n _textEncoder = _encodeUtf8Polyfill\n if (typeof TextEncoder !== 'undefined') {\n const encoder = new TextEncoder()\n _textEncoder = data => encoder.encode(data)\n }\n }\n return _textEncoder(text.normalize('NFC'))\n}\n\nlet _textDecoder: (data: Uint8Array) => string\n\nexport function Uint8ArrayToString(bin: Uint8Array): string {\n if (_textDecoder == null) {\n _textDecoder = _decodeUtf8Polyfill\n if (typeof TextDecoder !== 'undefined') {\n const decoder = new TextDecoder('utf-8', { ignoreBOM: true })\n _textDecoder = data => decoder.decode(data)\n }\n }\n return _textDecoder(bin).normalize('NFC')\n}\n\nexport function toUint8Array(data: BinInput): Uint8Array {\n if (data instanceof ArrayBuffer)\n return new Uint8Array(data)\n if (typeof data === 'string')\n return stringToUInt8Array(data)\n if (data.length)\n return new Uint8Array(data)\n return data as Uint8Array\n}\n\nexport function joinToUint8Array(...args: BinInput[] | BinInput[][]) {\n let length = 0\n const bins = args.flat(1).map((d) => {\n const b = toUint8Array(d as BinInput)\n length += b.length\n return b\n })\n const bin = new Uint8Array(length)\n let cursor = 0\n for (const b of bins) {\n bin.set(b, cursor)\n cursor += b.length\n }\n return bin\n}\n\nexport function toHex(bin: BinInput): string {\n if (typeof Buffer !== 'undefined')\n return Buffer.from(toUint8Array(bin)).toString('hex')\n const h = '0123456789abcdef'\n let s = ''\n for (const v of [...toUint8Array(bin)])\n s += h[v >> 4] + h[v & 15]\n return s\n}\n\nexport function fromHex(hexString: string): Uint8Array {\n return Uint8Array.from(\n hexString.match(/.{1,2}/g)!.map(byte => parseInt(byte, 16)),\n )\n}\n\n/** Regular base64 */\nexport function toBase64(bin: BinInput, stripPadding = false): string {\n const bytes = toUint8Array(bin)\n let sb = ''\n if (typeof Buffer !== 'undefined') {\n sb = Buffer.from(bytes).toString('base64')\n }\n else {\n let s = ''\n for (let i = 0; i < bytes.byteLength; i++)\n s += String.fromCharCode(bytes[i])\n sb = btoa(s)\n }\n if (stripPadding)\n return sb.replaceAll('=', '')\n return sb\n}\n\nexport function toBase64Url(bin: BinInput): string {\n const bytes = toUint8Array(bin)\n if (typeof Buffer !== 'undefined')\n return Buffer.from(bytes).toString('base64url').replaceAll('=', '')\n let s = ''\n for (let i = 0; i < bytes.byteLength; i++)\n s += String.fromCharCode(bytes[i])\n return btoa(s).replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '')\n}\n\nexport function fromBase64(s: string): Uint8Array {\n s = s.replaceAll('-', '+').replaceAll('_', '/')\n if (typeof Buffer !== 'undefined') {\n const buf = Buffer.from(s, 'base64')\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength)\n }\n const a = atob(s)\n const bytes = new Uint8Array(a.length)\n for (let i = 0; i < a.length; i++)\n bytes[i] = a.charCodeAt(i)\n return bytes\n}\n\nexport function fromBase64String(s: string): string {\n return Uint8ArrayToString(fromBase64(s))\n}\n\n/** Compare contents of binary arrays */\nexport function equalBinary(\n a: ArrayBuffer | Uint8Array,\n b: ArrayBuffer | Uint8Array,\n): boolean {\n if (a.byteLength !== b.byteLength)\n return false\n const aa = toUint8Array(a)\n const bb = toUint8Array(b)\n for (let i = 0; i < aa.length; i++) {\n if (aa[i] !== bb[i])\n return false\n }\n return true\n}\n\nexport function jsonToUint8Array(json: any): Uint8Array | never {\n try {\n return stringToUInt8Array(jsonStringifySafe(json))\n }\n catch (err) {\n log.warn('jsonToUint8Array', json)\n throw err\n }\n}\n\nexport function Uint8ArrayToJson<T = any>(data: Uint8Array): T | never {\n try {\n return JSON.parse(Uint8ArrayToString(data))\n }\n catch (err) {\n log.warn('Uint8ArrayToJson', data)\n throw err\n }\n}\n\n// https://gist.github.com/igorgatis/d294fe714a4f523ac3a3\nexport function Uint8ArrayToHexDump(\n buffer: Uint8Array | ArrayBuffer | String | Array<number>,\n blockSize?: number,\n) {\n if (typeof buffer === 'string') {\n // log(\"buffer is string\")\n // do nothing\n }\n else if (buffer instanceof ArrayBuffer && buffer.byteLength !== undefined) {\n // log(\"buffer is ArrayBuffer\")\n buffer = String.fromCharCode.apply(\n String,\n [].slice.call(new Uint8Array(buffer)),\n )\n }\n else if (Array.isArray(buffer)) {\n // log(\"buffer is Array\")\n buffer = String.fromCharCode.apply(String, buffer)\n }\n else if (buffer.constructor === Uint8Array) {\n // log(\"buffer is Uint8Array\")\n buffer = String.fromCharCode.apply(String, [].slice.call(buffer))\n }\n else {\n // log(\"Error: buffer is unknown...\")\n return false\n }\n\n blockSize = blockSize || 16\n const lines = []\n const hex = '0123456789ABCDEF'\n for (let b = 0; b < buffer.length; b += blockSize) {\n const block = buffer.slice(b, Math.min(b + blockSize, buffer.length))\n const addr = (`0000${b.toString(16)}`).slice(-4)\n let codes = block\n .split('')\n .map((ch: any) => {\n const code = ch.charCodeAt(0)\n return ` ${hex[(0xF0 & code) >> 4]}${hex[0x0F & code]}`\n })\n .join('')\n codes += ' '.repeat(blockSize - block.length)\n let chars = block.replace(/[\\x00-\\x1F\\x20]/g, '.')\n chars += ' '.repeat(blockSize - block.length)\n lines.push(`${addr} ${codes} ${chars}`)\n }\n return lines.join('\\n')\n}\n","import type { BinInput } from './data/bin'\nimport { equalBinary, toUint8Array } from './data/bin'\n\n/** Get random bytes using window.crypto if available. Else use a poor fallback solution. */\nexport function randomUint8Array(length = 16): Uint8Array {\n const randomBytes = new Uint8Array(length)\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(randomBytes)\n }\n else {\n // hack: not state of the art secure\n // throw \"crypto.getRandomValues is required\"\n for (let i = 0; i < length; i++) {\n // Math.random: \"...range 0 to less than 1 (inclusive of 0, but not 1)\"\n // 0.9... * 0xff < 255 therefore * 0x100\n randomBytes[i] = Math.floor(Math.random() * 0x100) // 0...255\n }\n }\n return randomBytes\n}\n\nexport const CRYPTO_DEFAULT_HASH_ALG = 'SHA-256'\nexport const CRYPTO_DEFAULT_ALG = 'AES-GCM'\nexport const CRYPTO_DEFAULT_DERIVE_ALG = 'PBKDF2'\nexport const CRYPTO_DEFAULT_DERIVE_ITERATIONS = 100000\n\nexport async function digest(\n message: BinInput,\n algorithm: AlgorithmIdentifier = CRYPTO_DEFAULT_HASH_ALG,\n): Promise<Uint8Array> {\n return toUint8Array(\n await crypto.subtle.digest(algorithm, toUint8Array(message)),\n )\n}\n\nexport async function deriveKeyPbkdf2(\n secret: BinInput,\n opt: {\n iterations?: number\n salt?: BinInput\n } = {},\n): Promise<CryptoKey> {\n const secretBuffer = toUint8Array(secret)\n const keyMaterial = await crypto.subtle.importKey(\n 'raw',\n secretBuffer,\n CRYPTO_DEFAULT_DERIVE_ALG,\n false,\n ['deriveKey'],\n )\n return await crypto.subtle.deriveKey(\n {\n name: CRYPTO_DEFAULT_DERIVE_ALG,\n salt: opt.salt ? toUint8Array(opt.salt) : new Uint8Array(0),\n iterations: opt.iterations ?? CRYPTO_DEFAULT_DERIVE_ITERATIONS,\n hash: CRYPTO_DEFAULT_HASH_ALG,\n },\n keyMaterial,\n {\n name: CRYPTO_DEFAULT_ALG,\n length: 256,\n },\n true,\n ['encrypt', 'decrypt'],\n )\n}\n\nconst MAGIC_ID = new Uint8Array([1, 1])\n\nexport async function encrypt(\n data: Uint8Array,\n key: CryptoKey,\n): Promise<Uint8Array> {\n const iv = randomUint8Array(12)\n const cipher = await crypto.subtle.encrypt(\n { name: CRYPTO_DEFAULT_ALG, iv },\n key,\n data,\n )\n const binCypher = new Uint8Array(cipher)\n const bufferLength = MAGIC_ID.length + iv.length + binCypher.length\n const buffer = new Uint8Array(bufferLength)\n let pos = 0\n buffer.set(MAGIC_ID, pos)\n pos += MAGIC_ID.length\n buffer.set(iv, pos)\n pos += iv.length\n buffer.set(binCypher, pos)\n return buffer\n}\n\nexport async function decrypt(\n data: Uint8Array,\n key: CryptoKey,\n): Promise<Uint8Array> {\n const magic = data.subarray(0, 2)\n if (!equalBinary(magic, MAGIC_ID))\n return Promise.reject(new Error(`Unknown magic ${magic}`))\n\n const iv = data.subarray(2, 2 + 12)\n const cipher = data.subarray(2 + 12, data.length)\n const plain = await crypto.subtle.decrypt(\n { name: CRYPTO_DEFAULT_ALG, iv },\n key,\n cipher,\n )\n return new Uint8Array(plain)\n}\n","export function getSecureRandom(): number {\n return crypto.getRandomValues(new Uint32Array(1))[0] / 0xFFFFFFFF\n}\n\nexport function getSecureRandomIfPossible(): number {\n return typeof crypto !== 'undefined' ? getSecureRandom() : Math.random()\n}\n\nexport function randomBoolean(bias = 0.25): boolean {\n return getSecureRandomIfPossible() < bias\n}\n\n/** max is not included, min is included */\nexport function randomInt(max = 100, min = 0): number {\n return min + Math.floor(getSecureRandomIfPossible() * (max - min))\n}\n\nexport function randomFloat(max = 100, min = 0): number {\n return min + getSecureRandomIfPossible() * (max - min)\n}\n\nexport function between(min: number, value: number, max: number): number {\n return Math.max(min, Math.min(max, value))\n}\n\n/** See also arraySum */\nexport function sum(array: number[]): number {\n return array.reduce((acc, value) => acc + value, 0)\n}\n\n/** See also arrayAvg */\nexport function avg(array: number[]): number {\n return sum(array) / array.length\n}\n\n// export const clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\n\n// https://www.noulakaz.net/2007/03/18/a-regular-expression-to-check-for-prime-numbers/\n/** Fancy prime number check ;) */\nexport function isPrimeRX(value: number): boolean {\n return !/^1?$|^(11+?)\\1+$/.test('1'.repeat(value))\n}\n\nexport function isPrime(value: number): boolean {\n for (let i = 2; i < value; i++) {\n if (value % i === 0)\n return false\n }\n return value > 1\n}\n\n// http://indiegamr.com/generate-repeatable-random-numbers-in-js/\n// https://softwareengineering.stackexchange.com/questions/260969/original-source-of-seed-9301-49297-233280-random-algorithm\n\nlet _seed = 6\n\n/** Deterministic random */\nexport function seededRandom(max = 0, min = 1, seed?: number) {\n _seed = ((seed ?? _seed) * 9301 + 49297) % 233280\n const rnd = _seed / 233280\n return min + rnd * (max - min)\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function parseOrderby(value = ''): {\n field: string\n orderby: string\n asc: boolean\n desc: boolean\n} {\n let [field = '', orderby = 'asc'] = value.split(' ')\n orderby = orderby.toLowerCase()\n return {\n field,\n orderby,\n asc: orderby !== 'desc',\n desc: orderby === 'desc',\n }\n}\n\nexport function composeOrderby(field: string, asc = true): string {\n return `${field} ${asc ? 'asc' : 'desc'}`\n}\n\n// Classic compare function with direction flag\nexport function cmp(a: any, b: any, asc = true): -1 | 0 | 1 {\n const aa = a || 0\n const bb = b || 0\n return aa > bb ? (asc ? 1 : -1) : aa < bb ? (asc ? -1 : 1) : 0\n}\n\n// todo: support localeCompare()\nexport function sortedOrderby<T>(values: T[], ...orderby: string[]): T[] {\n if (orderby.length > 0) {\n const orderByList = orderby.map(parseOrderby)\n // let { field, asc } = parseOrderby(orderby)\n // if (field != null && typeof field === \"string\") {\n // let bigger = asc ? 1 : -1\n // let smaller = asc ? -1 : 1\n const sortValues = Array.from(values)\n sortValues.sort((a: any, b: any): number => {\n for (const { field, asc } of orderByList) {\n const result = cmp(a[field], b[field], asc)\n if (result !== 0)\n return result\n }\n return 0\n // const aa = a[field] || 0\n // const bb = b[field] || 0\n // return aa > bb ? bigger : aa < bb ? smaller : 0\n })\n return sortValues\n }\n return values\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-cond-assign */\n\nimport type { NestedArray } from '../types'\nimport { getSecureRandomIfPossible } from './math'\nimport { cmp } from './orderby'\n\nexport function arrayUnique<T>(x: T[]): T[] {\n return x.filter((n: any, index: any) => x.indexOf(n) === index)\n}\n\nexport function arrayMinus<T>(x: T[], y: T[]): T[] {\n return arrayUnique(x.filter((n: any) => !y.includes(n)))\n}\n\nexport function arrayUnion<T>(...a: T[][]): T[] {\n return arrayUnique(a.reduce((acc: T[] = [], value) => acc.concat(value), []))\n}\n\n/** `[1,[2,3]]` becomes `[1,2,3]` */\nexport function arrayFlatten<T>(...list: NestedArray<T>[]): T[] {\n return (list as any).flat(Infinity)\n}\n\nexport function arrayIntersection<T>(x: T[], y: T[]): T[] {\n return arrayUnique<T>(x).filter((n: any) => y.includes(n))\n}\n\nexport function arraySymmetricDifference<T>(x: T[], y: T[]): T[] {\n return arrayMinus(arrayUnion(x, y), arrayIntersection(x, y))\n // return arrayUnique(x.filter(n => !y.includes(n)).concat(y.filter(n => !x.includes(n))))\n}\n\n// export function arrayApply<T>(fn: any, a: T[]): T[] {\n// return a.reduce(fn, [])\n// }\n\nexport function arrayRemoveElement<T>(arr: T[], el: T): T[] {\n if (arr && Array.isArray(arr)) {\n let index\n while ((index = arr.indexOf(el)) !== -1) {\n // log(\"arrayRemoveElement remove\", index, el)\n arr.splice(index, 1)\n }\n // log(\"arrayRemoveElement result\", arr)\n return arr\n }\n // log(\"arrayRemoveElement no array\", arr, el)\n return []\n}\n\n/** Only have it once in the set */\nexport function arraySetElement<T>(arr: T[], el: T): T[] {\n if (!arr.includes(el))\n arr.push(el)\n return arr\n}\n\n// via https://stackoverflow.com/a/49587869 and Erwin\nexport function arrayFilterInPlace<T>(array: T[], fn: (el: T) => boolean): T[] {\n array.splice(0, array.length, ...array.filter(fn))\n return array\n}\n\n// via https://stackoverflow.com/a/49587869 and Erwin\nexport function arrayToggleInPlace<T>(array: T[], el: T): T[] {\n const index = array.findIndex(e => e === el)\n if (index >= 0)\n array.splice(index, 1)\n else array.push(el)\n return array\n}\n\nexport function arrayEmptyInPlace<T>(array: T[]): T[] {\n array.splice(0, array.length)\n return array\n}\n\nexport function arraySorted<T>(\n arr: Iterable<T> | ArrayLike<T>,\n cond: ((a: T, b: T) => number) | undefined = cmp,\n): T[] {\n return Array.from(arr).sort(cond)\n}\n\nexport function arraySortedNumbers(arr: number[]): number[] {\n return arraySorted(arr, (l: number, r: number) => l - r)\n}\n\nexport function arrayIsEqual<T>(array1: T[], array2: T[]): boolean {\n return (\n array1.length === array2.length\n && array1.every((value, index) => value === array2[index])\n )\n}\n\nexport function arrayShuffleInPlace<T>(array: T[]): T[] {\n array.sort(() => (getSecureRandomIfPossible() > 0.5 ? 1 : -1))\n\n // Alternative https://github.com/sindresorhus/array-shuffle/blob/main/index.js#L8\n // for (let index = array.length - 1; index > 0; index--) {\n // const newIndex = Math.floor(Math.random() * (index + 1));\n // [array[index], array[newIndex]] = [array[newIndex], array[index]];\n // }\n\n return array\n}\n\nexport function arrayShuffle<T>(array: T[]): T[] {\n return arrayShuffleInPlace(Array.from(array))\n}\n\n/** Randomly shuffle the order of the array's elements. Force to have a different order if array has more than one element. */\nexport function arrayShuffleForce<T>(array: T[]): T[] {\n while (array.length > 1) {\n const copy = Array.from(array)\n arrayShuffleInPlace(copy)\n if (!arrayIsEqual(array, copy))\n return copy\n }\n return array\n}\n\nexport function arrayRandomElement<T>(array: T[]): T {\n return array[Math.floor(getSecureRandomIfPossible() * array.length)]\n}\n\nexport function arrayMax<T>(...array: NestedArray<T>[]): T {\n // @ts-expect-error xxx\n return arrayFlatten(array).reduce(\n (acc, value) => (acc != null ? (value > acc ? value : acc) : value),\n undefined,\n )\n}\n\nexport function arrayMin<T>(...array: NestedArray<T>[]): T {\n // @ts-expect-error xxx\n return arrayFlatten(array).reduce(\n (acc, value) => (acc != null ? (value < acc ? value : acc) : value),\n undefined,\n )\n}\n\nexport function arraySum(...array: NestedArray<number>[]): number {\n return arrayFlatten(array).reduce((acc, value) => acc + value, 0)\n}\n\nexport function arrayAvg(...array: NestedArray<number>[]): number {\n const flatArray = arrayFlatten(array)\n return flatArray.reduce((acc, value) => acc + value, 0) / flatArray.length\n}\n\nexport function arrayBatches<T>(array: T[], chunckLength: number): T[][] {\n const chunks = []\n let i = 0\n const n = array.length\n while (i < n)\n chunks.push(array.slice(i, (i += chunckLength)))\n return chunks\n}\n\nexport function createArray<T>(\n size = 0,\n item?: T | ((index: number) => T),\n): T[] {\n if (size <= 0)\n return []\n const arr = new Array(size)\n for (let i = 0; i < size; i++)\n arr[i] = item instanceof Function ? item(i) : item\n\n return arr\n}\n","// Originial code at https://github.com/cryptocoinjs/base-x/blob/master/ts_src/index.ts\n//\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n\n// \"Fast base encoding / decoding of any given alphabet using bitcoin style leading zero compression.\"\n// \"WARNING: This module is NOT RFC3548 compliant, it cannot be used for base16 (hex), base32, or base64 encoding in a standards compliant manner.\"\n\nimport { Logger } from '../log'\nimport type { BinInput } from './bin'\nimport { toUint8Array } from './bin'\n\nconst log = Logger('zeed:basex', 'error')\n\nconst alphabets = {\n '2': '01',\n '8': '01234567',\n '11': '0123456789a',\n '16': '0123456789abcdef',\n '32': '0123456789abcdefghjkmnpqrtuvwxyz', // Agnoster, because least mix up and good sorting\n '32-crockford': '0123456789ABCDEFGHJKMNPQRSTVWXYZ', // Crockford\n '32-geohash': '0123456789bcdefghjkmnpqrstuvwxyz', // https://en.wikipedia.org/wiki/Base32#Geohash\n '32-agnoster': '0123456789abcdefghjkmnpqrtuvwxyz', // https://github.com/agnoster/base32-js/blob/master/lib/base32.js#L6 without i(1), l(1), o(0), s(5); keeps sort order\n '32-rfc': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', // https://datatracker.ietf.org/doc/html/rfc4648#section-6\n '32-hex': '0123456789ABCDEFGHIJKLMNOPQRSTUV', // https://datatracker.ietf.org/doc/html/rfc4648#section-7\n '32-zbase': 'ybndrfg8ejkmcpqxot1uwisza345h769', // https://en.wikipedia.org/wiki/Base32#z-base-32\n '36': '0123456789abcdefghijklmnopqrstuvwxyz',\n '58': '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz',\n '62': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', // Correct sort order\n '64': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',\n '64-url': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', // https://datatracker.ietf.org/doc/html/rfc4648#section-5\n '66': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~',\n '85': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~', // https://datatracker.ietf.org/doc/html/rfc1924#section-4.2\n}\n\nexport function useBase(alphaOrBase: string | number) {\n let ALPHABET: string | undefined = (alphabets as any)[String(alphaOrBase)]\n\n if (!ALPHABET) {\n if (typeof alphaOrBase === 'string')\n ALPHABET = alphaOrBase\n else\n throw new Error(`Unknown base ${alphaOrBase}`)\n }\n\n if (ALPHABET.length >= 255)\n throw new TypeError('Alphabet too long')\n\n const BASE_MAP = new Uint8Array(256)\n for (let j = 0; j < BASE_MAP.length; j++)\n BASE_MAP[j] = 255\n\n for (let i = 0; i < ALPHABET.length; i++) {\n const x = ALPHABET.charAt(i)\n const xc = x.charCodeAt(0)\n\n if (BASE_MAP[xc] !== 255)\n throw new TypeError(`${x} is ambiguous`)\n BASE_MAP[xc] = i\n }\n\n const BASE = ALPHABET.length\n const LEADER = ALPHABET.charAt(0)\n const FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\n const iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\n\n function encode(source: BinInput, padToLength = -1): string {\n const data = toUint8Array(source)\n if (data.byteLength === 0)\n return ''\n\n // Skip & count leading zeroes.\n let length = 0\n let pbegin = 0\n const pend = data.byteLength\n\n while (pbegin !== pend && data[pbegin] === 0) pbegin++\n\n // Allocate enough space in big-endian base58 representation.\n const size = ((pend - pbegin) * iFACTOR + 1) >>> 0\n const dataEncoded = new Uint8Array(size)\n\n // Process the bytes.\n while (pbegin !== pend) {\n let carry = data[pbegin]\n\n // Apply \"dataEncoded = dataEncoded * 256 + ch\".\n let i = 0\n for (\n let it1 = size - 1;\n (carry !== 0 || i < length) && it1 !== -1;\n it1--, i++\n ) {\n carry += (256 * dataEncoded[it1]) >>> 0\n dataEncoded[it1] = carry % BASE >>> 0\n carry = (carry / BASE) >>> 0\n }\n\n if (carry !== 0) {\n log.warn('Non-zero carry', data, padToLength, i, size)\n throw new Error('Non-zero carry')\n }\n\n length = i\n pbegin++\n }\n\n let it2 = size - length\n\n // Skip leading zeroes\n while (it2 !== size && dataEncoded[it2] === 0) it2++\n\n // Translate the result into a string.\n let str = ''\n for (; it2 < size; ++it2) str += ALPHABET!.charAt(dataEncoded[it2])\n\n if (padToLength > 0) {\n // const pad = Math.ceil(source.length * iFACTOR)\n return str.padStart(padToLength, LEADER)\n }\n return str\n }\n\n function decode(source: string, padToLength = -1): Uint8Array {\n if (typeof source !== 'string')\n throw new TypeError('Expected String')\n if (source.length === 0)\n return new Uint8Array()\n\n // Normalize\n source = source.replace(/\\s+/gi, '')\n\n let psz = 0\n let length = 0\n\n while (source[psz] === LEADER) psz++\n\n // Allocate enough space in big-endian base256 representation.\n const size = ((source.length - psz) * FACTOR + 1) >>> 0 // log(58) / log(256), rounded up.\n const dataDecoded = new Uint8Array(size)\n\n // Process the characters.\n while (source[psz]) {\n let carry = BASE_MAP[source.charCodeAt(psz)]\n\n // Invalid character\n if (carry === 255)\n throw new Error(`Unsupported character \"${source[psz]}\"`)\n\n let i = 0\n for (\n let it3 = size - 1;\n (carry !== 0 || i < length) && it3 !== -1;\n it3--, i++\n ) {\n carry += (BASE * dataDecoded[it3]) >>> 0\n dataDecoded[it3] = carry % 256 >>> 0\n carry = (carry / 256) >>> 0\n }\n\n if (carry !== 0)\n throw new Error('Non-zero carry')\n length = i\n psz++\n }\n\n // Skip leading zeroes\n let it4 = size - length\n while (it4 !== size && dataDecoded[it4] === 0) it4++\n\n if (padToLength > 0) {\n return new Uint8Array([\n ...new Uint8Array(padToLength - dataDecoded.length + it4),\n ...dataDecoded.slice(it4),\n ])\n }\n\n return dataDecoded.slice(it4)\n }\n\n return {\n encode,\n decode,\n }\n}\n\n// Shortcuts\n\nconst { encode: encodeBase32, decode: _decodeBase32 } = useBase(32)\n\nfunction decodeBase32(s: string) {\n return _decodeBase32(s\n .toLocaleLowerCase()\n .replaceAll('l', '1')\n .replaceAll('s', '5')\n .replaceAll('o', '0')\n .replaceAll('i', '1'))\n}\n\nexport { encodeBase32, decodeBase32 }\n\nexport const { encode: encodeBase16, decode: decodeBase16 } = useBase(16)\nexport const { encode: encodeBase58, decode: decodeBase58 } = useBase(58)\nexport const { encode: encodeBase62, decode: decodeBase62 } = useBase(62)\n\n// export const { encode: encodeBase32, decode: decodeBase32 } = useBase(32)\n// export const { encode: encodeBase64, decode: decodeBase64 } = useBase(64)\n\nexport function estimateSizeForBase(bytes: number, base: number) {\n return Math.ceil(bytes * (Math.log(256) / Math.log(base)))\n}\n","/*\nhttps://matthiashager.com/converting-snake-case-to-camel-case-object-keys-with-javascript\n\ncamelCase\nsnake_case\nkebab-case\nPascalCase // I won't be using this here, but it's only one small step further if you want to use it\n*/\n\nexport const toCamelCase = (s: string) => {\n // if only capital letters, convert to lower case\n if (s.length > 0) {\n if (/^[A-Z0-9_\\-\\ ]*$/g.test(s))\n s = s.toLowerCase()\n\n s = s\n // strip trailing non chars\n .replace(/^[-_\\ ]+/gi, '')\n .replace(/[-_\\ ]+$/gi, '')\n // strip separators and upper case first char\n .replace(/[-_\\ ]+([a-z0-9])/gi, ($0, $1) => $1.toUpperCase())\n // lower case first char\n s = s[0].toLowerCase() + s.substring(1)\n }\n return s\n}\n\nexport function toCapitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.toLowerCase().slice(1)\n}\n\nexport function toCapitalizeWords(s: string) {\n return s.replace(/\\w\\S*/g, toCapitalize)\n}\n\n// export function camelize(str: string) {\n// return str\n// .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word: string, index: number) =>\n// index === 0 ? word.toLowerCase() : word.toUpperCase()\n// )\n// .replace(/\\s+/g, \"\")\n// }\n\nexport function fromCamelCase(str: string, separator = '-') {\n separator = typeof separator === 'undefined' ? '_' : separator\n return str\n .replace(/([a-z\\d])([A-Z])/g, `$1${separator}$2`)\n .replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, `$1${separator}$2`)\n .toLowerCase()\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { Uint8ArrayToHexDump } from './bin'\n// import { jsonStringify } from './json'\n\nconst TRUE_VALUES_LIST = ['1', 'true', 'yes', 'y', 'on']\n\nexport function stringToBoolean(value?: string, defaultValue = false): boolean {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\nexport function stringToInteger(value?: string, defaultValue = 0): number {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return parseInt(value.trim(), 10) ?? defaultValue\n}\n\nexport function stringToFloat(value?: string, defaultValue = 0.0): number {\n if (value == null || typeof value !== 'string')\n return defaultValue\n return parseFloat(value.trim()) ?? defaultValue\n}\n\nexport function valueToBoolean(value?: any, defaultValue = false): boolean {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value\n if (typeof value === 'number')\n return value !== 0\n return TRUE_VALUES_LIST.includes(String(value).trim().toLowerCase())\n}\n\nexport function valueToInteger(value?: any, defaultValue = 0): number {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value ? 1 : 0\n if (typeof value === 'number')\n return Math.floor(value)\n return parseInt(String(value).trim(), 10) ?? defaultValue\n}\n\nexport function valueToFloat(value?: any, defaultValue = 0.0): number {\n if (value == null)\n return defaultValue\n if (typeof value === 'boolean')\n return value ? 1 : 0\n if (typeof value === 'number')\n return Math.floor(value)\n return parseFloat(String(value).trim()) ?? defaultValue\n}\n\nexport function valueToString(value?: any, defaultValue = ''): string {\n if (value == null)\n return defaultValue\n // if (value == \"\") return defaultValue // ???\n return String(value) ?? defaultValue\n}\n\n// todo: toDate, toTimestamp, toData(value, base=64)\n\n// export function mapToObject<T>(map: Map<string, T>): { [key: string]: T } {\n// return Object.fromEntries(map)\n// }\n\n// export function objectToMap<T>(obj: { [key: string]: T }): Map<string, T> {\n// return new Map(Object.entries(obj))\n// }\n\n// Shortcuts\n\nexport const toFloat = valueToFloat\nexport const toInt = valueToInteger\nexport const toString = valueToString\nexport const toBool = valueToBoolean\n\n// Strings\n\nexport interface RenderMessagesOptions {\n trace?: boolean // = true\n pretty?: boolean // = true\n}\n\nexport function formatMessages(\n messages: any[],\n opt: RenderMessagesOptions = {},\n): any[] {\n const { trace = true, pretty = true } = opt\n return messages.map((obj) => {\n if (obj && typeof obj === 'object') {\n if (pretty && (obj instanceof Uint8Array || obj instanceof ArrayBuffer))\n return `\\n${Uint8ArrayToHexDump(obj)}\\n`\n\n if (obj instanceof Error) {\n if (!trace)\n return `${obj.name || 'Error'}: ${obj.message}`\n\n return `${obj.name || 'Error'}: ${obj.message}\\n${obj.stack}`\n }\n\n try {\n return pretty ? JSON.stringify(obj, null, 2) : JSON.stringify(obj)\n }\n catch (err) {}\n }\n return String(obj)\n })\n}\n\nexport function renderMessages(\n messages: any[],\n opt: RenderMessagesOptions = {},\n): string {\n return formatMessages(messages, opt).join(' ')\n}\n\n//\n\n// Awesome trick from https://stackoverflow.com/a/5396742/140927\nexport function fixBrokenUth8String(brokenString: string): string {\n try {\n return decodeURIComponent(escape(brokenString))\n }\n catch (e) {\n // log.debug(\"fixString failed for\", s)\n }\n return brokenString\n}\n","// Functional Variant\n\nexport const DAY_MS = 86400000 // 1000 * 60 * 60 * 24\n\nexport type DayValue = number\n\nexport type DayInput =\n | DayValue\n | number\n | string\n | Date\n | [number, number?, number?]\n\nexport function dayYear(day: DayValue): DayValue {\n return Math.floor(day / 10000)\n}\n\nexport function dayMonth(day: DayValue): DayValue {\n return Math.floor((day / 100) % 100)\n}\n\nexport function dayDay(day: DayValue): DayValue {\n return Math.floor(day % 100)\n}\n\nexport function dayToParts(day: DayValue): [number, number, number] {\n return [dayYear(day), dayMonth(day), dayDay(day)]\n}\n\nexport function dayToDate(day: DayValue, gmt = false): Date {\n return gmt\n ? new Date(`${dayToString(day)}T00:00:00.000Z`)\n : new Date(\n day / 10000, // year\n ((day / 100) % 100) - 1, // month\n day % 100, // day\n )\n}\n\nexport function dayFromToday(): DayValue {\n return dayFromDate(new Date())\n}\n\nexport function dayFromAny(\n value: DayInput,\n gmt = false,\n): DayValue | undefined {\n if (typeof value === 'number') {\n if (value < 100)\n return\n return value\n }\n else if (typeof value === 'string') {\n return dayFromString(value)\n }\n else if (Array.isArray(value) && value.length === 3) {\n const [year, month, day] = value\n return dayFromParts(year, month, day)\n }\n else if (value instanceof Date) {\n return dayFromDate(value, gmt)\n // } else if (value instanceof Day) {\n // return value.days\n }\n}\n\nexport function dayToDateGMT(day: DayValue): Date {\n return dayToDate(day, true)\n}\n\nexport function dayFromDate(date: Date, gmt = false): DayValue {\n return (\n gmt\n ? dayFromString(date.toISOString())\n : date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate()\n )!\n}\n\nexport function dayFromDateGMT(date: Date): DayValue {\n return dayFromDate(date, true)\n}\n\nexport function dayToTimestamp(day: DayValue, gmt = true): number {\n return dayToDate(day, gmt).getTime()\n}\n\nexport function dayFromTimestamp(ms: number, gmt = true): DayValue {\n return dayFromDate(new Date(ms), gmt)\n}\n\nexport function dayToString(day: DayValue, sep = '-') {\n const baseString = String(day)\n return (\n baseString.slice(0, 4) + sep\n + baseString.slice(4, 6) + sep\n + baseString.slice(6, 8)\n )\n}\n\nexport function dayFromParts(\n year: number,\n month = 1,\n day = 1,\n): DayValue | undefined {\n if (month < 1 || month > 12 || day < 1 || day > 31)\n return\n return year * 10000 + month * 100 + day\n}\n\nexport function dayFromString(value: string): DayValue | undefined {\n const string = String(value)\n .replace(/[^0-9]/g, '')\n .slice(0, 8)\n if (string.length === 8)\n return +string\n}\n\nexport function dayMonthStart(day: DayValue, offset = 0): DayValue {\n let year = dayYear(day)\n let month = dayMonth(day)\n if (offset !== 0) {\n month += offset\n year += Math.floor((month - 1) / 12)\n month = Math.floor((month - 1) % 12) + 1\n if (month === 0)\n month = 12\n }\n return dayFromParts(year, month, 1)!\n}\n\nexport function dayYearStart(day: DayValue, offset = 0): DayValue {\n const year = dayYear(day)\n return dayFromParts(year + offset, 1, 1)!\n}\n\nexport function dayOffset(day: DayValue, offset: number): DayValue {\n // Important! Don't use local time here due to summer/winter time days can\n // be longer or shorter!\n return dayFromTimestamp(dayToTimestamp(day) + offset * DAY_MS)\n}\n\nexport function dayDiff(left: DayValue, right: DayValue): number {\n return Math.round((dayToTimestamp(right) - dayToTimestamp(left)) / DAY_MS)\n}\n\n/** List of dates for loops */\nexport function dayRange(left: DayValue, right?: DayValue): number[] {\n const list: number[] = []\n\n if (right == null)\n right = dayFromToday()\n\n if (left < 0)\n left = dayOffset(right, left + 1)\n\n while (left <= right) {\n list.push(left)\n left = dayOffset(left, +1)\n }\n return list\n}\n\n/** Iterator, see dayRange */\nexport function* dayIterator(left: DayValue, right?: DayValue) {\n const list: number[] = []\n\n if (right == null)\n right = dayFromToday()\n\n if (left < 0)\n left = dayOffset(right, left + 1)\n\n while (left <= right) {\n yield left\n left = dayOffset(left, +1)\n }\n return list\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable @typescript-eslint/no-use-before-define */\n/* eslint-disable no-async-promise-executor */\n\nimport { Logger } from '../log'\n\nconst log = Logger('zeed:promise', 'error')\n\n/**\n * Promise to be used with `await`. Example:\n *\n * ```\n * const [promise, resolve, reject] = createPromise()\n * setTimeout(() => {\n * resolve(5)\n * }, 50)\n * const result = await promise\n * ```\n */\nexport function createPromise<T>(): [Promise<T>, any, any] {\n let resolve, reject\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve\n reject = _reject\n })\n return [promise, resolve, reject]\n}\n\n/** Sleep for `milliSeconds`. Example 1s: `await sleep(1000)` */\nexport async function sleep(milliSeconds: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, milliSeconds))\n}\n\n/** Same as `await sleep(0)`, just let the event loop execute. */\nexport async function immediate(): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, 0))\n}\n\nexport const timeoutReached = Symbol('timeout')\n\n// type Unwrap<T> = T extends Promise<infer U>\n// ? U\n// : T extends (...args: any) => Promise<infer U>\n// ? U\n// : T extends (...args: any) => infer U\n// ? U\n// : T\n\nexport async function timeout<T>(\n promise: Promise<T>,\n milliSeconds: number,\n timeoutValue = timeoutReached,\n): Promise<T | typeof timeoutValue> {\n return new Promise(async (resolve, reject) => {\n let done = false\n\n const timeout = setTimeout(() => {\n done = true\n resolve(timeoutValue)\n }, milliSeconds)\n\n try {\n const result = await promise\n clearTimeout(timeout)\n if (!done)\n resolve(result)\n }\n catch (err) {\n clearTimeout(timeout)\n if (!done)\n reject(err)\n }\n })\n}\n\nexport const timoutError = new Error('Timeout reached')\n\nexport function isTimeout(value: any): boolean {\n return value === timeoutReached || value === timoutError\n}\n\nexport async function tryTimeout<T>(\n promise: Promise<T>,\n milliSeconds: number,\n): Promise<T | undefined> {\n if (milliSeconds <= 0)\n return await promise\n\n return new Promise(async (resolve, reject) => {\n let done = false\n\n const timeout = setTimeout(() => {\n done = true\n reject(timoutError)\n }, milliSeconds)\n\n try {\n const result = await promise\n clearTimeout(timeout)\n if (!done)\n resolve(result)\n }\n catch (err) {\n clearTimeout(timeout)\n if (!done)\n reject(err)\n }\n })\n}\n\n/** Wait for `event` on `obj` to emit. Resolve with result or reject on `timeout` */\nexport function waitOn(\n obj: any,\n event: string,\n timeoutMS = 1000,\n): Promise<any> {\n return new Promise((resolve, reject) => {\n const fn = (value: any) => {\n if (timer) {\n clearTimeout(timer)\n done()\n resolve(value)\n }\n }\n\n let done = () => {\n timer = null\n if (obj.off)\n obj.off(event, fn)\n else if (obj.removeEventListener)\n obj.removeEventListener(event, fn)\n else\n log.warn('No remove listener method found for', obj, event)\n }\n\n let timer: any = setTimeout(() => {\n done()\n reject(new Error('Did not response in time'))\n }, timeoutMS)\n\n if (obj.on)\n obj.on(event, fn)\n else if (obj.addEventListener)\n obj.addEventListener(event, fn)\n else\n log.warn('No listener method found for', obj)\n })\n}\n\nexport function isPromise<T>(value: Promise<T> | T): value is Promise<T> {\n return Boolean(\n value\n && (value instanceof Promise\n // @ts-expect-error xxx\n || typeof value.then === 'function'),\n )\n}\n\n/** This is exactly what Prose.resolve(x) is supposed to be: return a Promise no matter what type x is */\nexport function promisify<T>(value: Promise<T> | T): Promise<T> {\n return Promise.resolve(value)\n}\n\n// // https://github.com/unjs/items-promise\n\n// /**\n// * Run tasks one by one by calling fn(task, previous) in a promise chain.\n// * Return value is of type Promise<*> which resolves to the last fn result.\n// */\n// export async function serial(tasks: any, fn: any) {\n// return tasks.reduce(\n// (promise: Promise<any>, task: any) =>\n// promise.then((previous) => fn(task, previous)),\n// Promise.resolve(null)\n// )\n// }\n\n// /**\n// * Run all tasks in parallel by calling fn(tasks) and await using Promise.all.\n// * Return value is of type Promise<*[]> which resolves to results of all fns in an array.\n// */\n// export async function parallel(tasks: any[], fn: any): Promise<any[]> {\n// return Promise.all(tasks.map((task) => fn(task)))\n// }\n\n//\n\n/**\n * Like ReturnType but for async functions.\n * From https://www.jpwilliams.dev/how-to-unpack-the-return-type-of-a-promise-in-typescript\n */\nexport type AsyncReturnType<T extends (...args: any) => any> = T extends (\n ...args: any\n) => Promise<infer U>\n ? U\n : T extends (...args: any) => infer U\n ? U\n : any\n","import { isPromise } from '../exec/promise'\nimport type { DayInput, DayValue } from './day'\nimport { DAY_MS } from './day'\n\n// See also and alternatives:\n// https://blog.openreplay.com/is-it-time-for-the-javascript-temporal-api\n// https://github.com/iamkun/dayjs\n// https://github.com/date-fns/date-fns\n\nexport type DayInputLegacy = DayInput | Day\n\n/**\n * Date represented as positive integer value. Years smaller 0 are not supported.\n * @deprecated\n */\nexport class Day {\n days: DayValue\n\n get value() {\n return this.days\n }\n\n constructor(days?: DayInputLegacy) {\n if (typeof days === 'number') {\n this.days = days\n return\n }\n\n if (days != null)\n days = Day.from(days)?.days\n\n if (days == null) {\n const date = new Date()\n this.days\n = date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate()\n }\n else {\n this.days = days\n }\n }\n\n static fromNumber(n: number): Day {\n return new Day(n)\n }\n\n static fromString(dateString: string): Day | undefined {\n return Day.from(+dateString.replace(/[^0-9]/g, '').slice(0, 8))\n }\n\n static fromDate(date: Date, gmt = false): Day {\n return (\n gmt\n ? Day.fromString(date.toISOString().substr(0, 10))\n : Day.from(\n date.getFullYear() * 10000\n + (date.getMonth() + 1) * 100\n + date.getDate(),\n )\n ) as Day\n }\n\n static fromDateGMT(date: Date): Day {\n return Day.fromDate(date, true)\n }\n\n static from(value: DayInputLegacy, gmt = false): Day | undefined {\n if (typeof value === 'number') {\n if (value < 100)\n return\n return new Day(value)\n }\n else if (typeof value === 'string') {\n return Day.fromString(value)\n }\n else if (Array.isArray(value) && value.length === 3) {\n const [year, month = 1, day = 1] = value\n if (month < 1 || month > 12 || day < 1 || day > 31)\n return\n return new Day(year * 10000 + month * 100 + day)\n }\n else if (value instanceof Date) {\n return Day.fromDate(value, gmt)\n }\n else if (value instanceof Day) {\n return value\n }\n }\n\n toNumber(): number {\n return this.days\n }\n\n // Transformer\n\n /** Just for future extensions */\n toJson() {\n return this.days\n }\n\n toString(sep = '-') {\n const baseString = String(this.days)\n return (\n baseString.slice(0, 4)\n + sep\n + baseString.slice(4, 6)\n + sep\n + baseString.slice(6, 8)\n )\n }\n\n toDate(gmt = false): Date {\n return gmt\n ? new Date(`${this.toString()}T00:00:00.000Z`)\n : new Date(\n this.days / 10000, // year\n ((this.days / 100) % 100) - 1, // month\n this.days % 100, // day\n )\n }\n\n toDateGMT() {\n return this.toDate(true)\n }\n\n get year() {\n return Math.floor(this.days / 10000)\n }\n\n get month() {\n return Math.floor((this.days / 100) % 100)\n }\n\n get day() {\n return Math.floor(this.days % 100)\n }\n\n // Calculations\n\n dayOffset(offset: number): Day {\n // Important! Don't use local time here due to summer/winter time days can\n // be longer or shorter!\n return Day.fromDateGMT(\n new Date(this.toDateGMT().getTime() + offset * DAY_MS),\n )\n }\n\n monthStart(): Day {\n return Day.from([this.year, this.month, 1])!\n }\n\n yearStart(): Day {\n return Day.from([this.year, 1, 1])!\n }\n\n /** Very stupid approach, only works for days <= 28 */\n monthOffset(offset: number): Day {\n const m = this.month + offset\n let mm = Math.floor((m - 1) % 12) + 1\n if (mm === 0)\n mm = 12\n const yy = Math.floor((m - 1) / 12)\n // log(\"calc\", m, mm, yy, [this.year + yy, mm, this.day])\n return Day.from([this.year + yy, mm, this.day])!\n }\n\n daysUntil(otherDay: DayInputLegacy): number {\n return Math.round(\n (new Day(otherDay)?.toDateGMT().getTime() - this.toDateGMT().getTime())\n / DAY_MS,\n )\n }\n\n // Shortcuts\n\n yesterday() {\n return this.dayOffset(-1)\n }\n\n tomorrow() {\n return this.dayOffset(+1)\n }\n}\n\nexport async function forEachDay(\n from: DayInputLegacy,\n to: DayInputLegacy,\n handler: (date: Day) => Promise<void> | void,\n) {\n let start = Day.from(from)\n const end = Day.from(to)\n // eslint-disable-next-line no-unmodified-loop-condition\n while (start && end && start?.days <= end?.days) {\n const result = handler(start)\n if (isPromise(result))\n await result\n\n start = start.dayOffset(+1)\n }\n}\n\nexport function today(): Day {\n return new Day()\n}\n\n/** @deprecated */\nexport function day(days?: DayInputLegacy): Day {\n return new Day(days)\n}\n\nexport function dateStringToDays(dateString: string): number {\n return Day.fromDate(new Date(dateString)).days\n}\n","export type DecimalValue = number\nexport type DecimalInput = number | string | DecimalValue\n\nexport function decimal(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return +(+value).toFixed(decimalPlaces)\n}\n\nexport function decimalFromCents(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return +(+value / 10 ** decimalPlaces).toFixed(decimalPlaces)\n}\n\nexport function decimalToCents(\n value: DecimalInput,\n decimalPlaces = 2,\n): number {\n return Math.round(+value * 10 ** decimalPlaces)\n}\n\nexport function decimalCentsPart(\n value: DecimalInput,\n decimalPlaces = 2,\n): DecimalValue {\n return decimalPlaces * (decimal(value, decimalPlaces) % 1)\n}\n","// https://github.com/sindresorhus/is/ MIT\n// https://github.com/sindresorhus/ts-extras\n// https://github.com/sindresorhus/type-fest\n// https://github.com/antfu/utils\n\nexport type Primitive =\n | null\n | undefined\n | string\n | number\n | boolean\n | symbol\n | bigint\n\nexport function isObject(obj: unknown): obj is object {\n return obj != null && typeof obj === 'object'\n}\n\n/** Something like number, string, boolean */\nexport function isPrimitive(obj: unknown): obj is Primitive {\n return Object(obj) !== obj\n}\n\nexport function isArray(obj: unknown): obj is Array<any> {\n return Array.isArray(obj)\n}\n\n/** Object that is not an array. But could also be an object defined by a class. */\nexport function isRecord(obj: unknown): obj is Record<string, any> {\n return isObject(obj) && !isArray(obj)\n}\n\n/** Just data, like constructed via `{...}`. */\nexport function isRecordPlain(obj: unknown): obj is Record<string, any> {\n return obj?.constructor === Object\n}\n\nexport function isString(obj: unknown): obj is string {\n return typeof obj === 'string'\n}\n\nexport function isNumber(obj: unknown): obj is number {\n return typeof obj === 'number' && !isNaN(obj) // wtf! Nan === type number\n}\n\nexport function isInteger(obj: unknown): obj is number {\n return isNumber(obj) && Number.isInteger(obj)\n}\n\n/** Integer with full precision i.e. its value is in the signed 53 bit range. */\nexport function isSafeInteger(obj: unknown): obj is number {\n return isNumber(obj) && Number.isSafeInteger(obj)\n}\n\nexport function isBoolean(obj: unknown): obj is boolean {\n return typeof obj === 'boolean'\n}\n\n/** @deprecated use `isNull` */\nexport function isNullOrUndefined(obj: unknown): obj is null | undefined {\n return obj == null\n}\n\nexport function isNull(obj: unknown): obj is null | undefined {\n return obj == null\n}\nexport function isUint8Array(obj: unknown): obj is Uint8Array {\n return isObject(obj) && obj.constructor.name === 'Uint8Array'\n}\n\n// https://stackoverflow.com/a/46700791/140927\n\n/// Not `null` or `undefined`, use like `.filter(isNotEmpty)`\nexport function isNotNull<T>(value: T | null | undefined): value is T {\n return value != null\n}\n\n/// Not `null` or `undefined` or `boolean`, use like `.filter(isValue)`.\n// Usefull e.g. on conditional list: `[x && 'value', ...]`\nexport function isValue<T>(value: T | null | undefined | boolean): value is T {\n return value != null && value !== false && value !== true\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/* eslint-disable no-prototype-builtins */\n\nimport { isArray, isObject, isPrimitive, isRecord } from './is'\n\nexport function deepEqual(a: any, b: any, hash = new WeakSet()) {\n // if both x and y are null or undefined and exactly the same\n if (a === b)\n return true\n\n // Cyclic\n if (hash.has(b)) {\n // console.log('cyclic')\n return false\n }\n\n if (!isPrimitive(b))\n hash.add(b)\n\n // if they are not strictly equal, they both need to be Objects\n if (!(a instanceof Object) || !(b instanceof Object))\n return false\n\n // they must have the exact same prototype chain, the closest we can do is\n // test there constructor.\n if (a.constructor !== b.constructor)\n return false\n\n // Shortcut to avoid to many loops\n if (a.length !== b.length)\n return false\n\n for (const p in a) {\n // other properties were tested using x.constructor === y.constructor\n if (!a.hasOwnProperty(p))\n continue\n\n // allows to compare x[ p ] and y[ p ] when set to undefined\n if (!b.hasOwnProperty(p))\n return false\n\n const aa = a[p]\n const bb = b[p]\n\n // if they have the same strict value or identity then they are equal\n // if (aa === bb) {\n // console.log('eq', typeof bb)\n // if (bb != null) hash.set(bb, true)\n // continue\n // }\n //\n // // Numbers, Strings, Functions, Booleans must be strictly equal\n // if (typeof (aa) !== 'object') {\n // return false\n // }\n\n // Objects and Arrays must be tested recursively\n if (!deepEqual(aa, bb, hash))\n return false\n }\n\n // allows x[ p ] to be set to undefined\n for (const p in b) {\n if (b.hasOwnProperty(p) && !a.hasOwnProperty(p))\n return false\n }\n\n return true\n}\n\n/** Strip properties with value `undefined` in place */\nexport function deepStripUndefinedInPlace(a: any, hash = new WeakSet()) {\n // Cyclic\n if (hash.has(a))\n return '[Circular ~]'\n if (!isPrimitive(a))\n hash.add(a)\n\n if (isRecord(a)) {\n for (const p in a) {\n if (!a.hasOwnProperty(p))\n continue\n if (a[p] === undefined) {\n delete a[p]\n continue\n }\n deepStripUndefinedInPlace(a[p], hash)\n }\n }\n else if (isArray(a)) {\n for (let i = a.length - 1; i >= 0; i--) {\n if (a[i] === undefined)\n a.splice(i, 1)\n }\n }\n // else ignore\n\n return a\n}\n\nexport function deepMerge(target: any, ...sources: any[]) {\n // todo cyclic protection\n for (const source of sources) {\n if (!isObject(target))\n target = {}\n\n if (source == null || !isObject(source))\n continue\n\n Object.keys(source).forEach((key) => {\n const targetValue = target[key]\n const sourceValue = (source as any)[key]\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue))\n target[key] = targetValue.concat(sourceValue)\n else if (isObject(targetValue) && isObject(sourceValue))\n target[key] = deepMerge(Object.assign({}, targetValue), sourceValue)\n else\n target[key] = sourceValue\n })\n }\n\n return target\n}\n\n// // https://stackoverflow.com/a/40294058/140927\n// // Handles cyclic references\n// export function deepClonePrimitives(obj, hash = new WeakMap()) {\n//\n// // primitives\n// if (Object(obj) !== obj) {\n// // log('Primitive', obj)\n// return obj\n// }\n//\n// // cyclic reference\n// if (hash.has(obj)) {\n// return hash.get(obj)\n// }\n//\n// let result\n//\n// // primitives as objects like new String(), new Number()\n// if (\n// obj instanceof String ||\n// obj instanceof Number ||\n// obj instanceof BigInt ||\n// obj instanceof Boolean ||\n// obj instanceof Symbol\n// ) {\n// result = new obj.constructor(obj.valueOf())\n// // hash.set(obj, result)\n// return result\n// }\n//\n// // log('Obj', obj)\n//\n// if (obj instanceof Set) {\n// result = new Set(obj)\n// } else if (obj instanceof Map) {\n// result = new Map(Array.from(obj, ([key, val]) => [key, deepClonePrimitives(val, hash)]))\n// } else if (obj instanceof Date) {\n// result = new Date(obj)\n// } else if (obj instanceof RegExp) {\n// result = new RegExp(obj.source, obj.flags)\n// } else if (Array.isArray(obj)) {\n// result = Array.from(obj, val => deepClonePrimitives(val, hash))\n// } else if (obj.constructor) {\n// result = new obj.constructor()\n// log('bj object', result)\n// } else if (obj instanceof Function || typeof obj === 'function') {\n// log('Keep object', obj, Object.getPrototypeOf(obj))\n// result = obj\n// } else {\n// result = Object.create(null)\n// }\n//\n// hash.set(obj, result)\n//\n// return Object.assign(result, ...Object.keys(obj).map(key => ({\n// [key]: deepClonePrimitives(obj[key], hash),\n// })))\n// }\n","export const escapeHTML = (s: string): string =>\n s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n\nexport const unescapeHTML = (s: string): string =>\n s\n .replace(/</gi, '<')\n .replace(/>/gi, '>')\n .replace(/"/gi, '\"')\n .replace(/'/gi, '\\'')\n .replace(/&/gi, '&')\n","export type FilterFunction<T> = (o: T) => boolean\nexport type MapperFunction<T> = (o: T) => any\n\n/** Apply multiple filters, optionally transform through mappers, filter null/undefined items. */\nexport function listQuery<T>(\n list: T[],\n filters: FilterFunction<T>[],\n mappers: MapperFunction<T>[] = [],\n): T | any[] {\n return list\n .filter((o: T) => !filters.some(a => !a(o)))\n .map((o) => {\n for (const m of mappers)\n o = m(o)\n return o\n })\n .filter(o => o != null)\n}\n\n/** Split up a list by `key` resulting in a Record of `key` and sub-list. */\nexport function listGroupBy<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): Record<string, T[]> {\n return list.reduce((result: any, currentValue: T) => {\n const groupValue = String(currentValue[key])\n ;(result[groupValue] = result[groupValue] || []).push(currentValue)\n return result\n }, {})\n}\n\n/** Returns a list of values of a certain `key`. No duplicates. */\nexport function listDistinctUnion<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): any[] {\n return Array.from(\n list.reduce(\n (result: Set<any>, currentValue: T) => result.add(currentValue[key]),\n new Set(),\n ),\n )\n}\n\n/** Returns a list of values of a certain `key`. */\nexport function listOfKey<T extends Record<string, any>>(\n list: T[],\n key: keyof T,\n): any[] {\n return list.map(item => item[key])\n}\n","import { isArray, isObject } from './is'\n\n/** Like `.map()` for object. Return new key and value or `undefined` to delete. */\nexport function objectMap<T = any>(\n obj: any,\n fn: (\n key: string,\n value: any\n ) => [key: string, value: T] | T | undefined | null,\n): Record<string, T> {\n if (!isObject(obj))\n return {}\n return Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => {\n const r = fn(k, v)\n if (isArray(r) && r.length === 2)\n return r\n\n return [k, r]\n })\n .filter(v => v != null),\n )\n}\n\n/** Merge right into left object. If dispose is defined, it will be combined. Left can be a complex object i.e. a insantiated class. */\nexport function objectMergeDisposable<A extends object, B extends object>(\n a: A,\n b: B,\n): A & B {\n // @ts-expect-error xxx\n if (b.dispose && a.dispose) {\n // @ts-expect-error xxx\n b.dispose.add(a.dispose)\n }\n return Object.assign(a, b)\n}\n\n// export function objectMerge<A, B>(a: A, b: B): A & B {\n// return Object.assign({}, a, b)\n// }\n\nexport function objectIsEmpty(obj: object) {\n return Object.keys(obj).length <= 0\n}\n","// https://github.com/sindresorhus/filenamify/blob/main/filenamify.js\n\n/* eslint-disable no-control-regex */\n\nconst MAX_FILENAME_LENGTH = 100\n\nconst reControlChars = /[\\u0000-\\u001F\\u0080-\\u009F]/g\nconst reRelativePath = /^\\.+/\nconst reTrailingPeriods = /\\.+$/\n\nfunction filenameReservedRegex() {\n return /[<>:\"/\\\\|?*\\u0000-\\u001F]/g\n}\n\nfunction windowsReservedNameRegex() {\n return /^(con|prn|aux|nul|com\\d|lpt\\d)$/i\n}\n\n/** Ensure a valid file name. Unsupported characters get a `replacement`, default: `_` */\nexport function toValidFilename(\n string: string,\n replacement = '_',\n): string | never {\n if (typeof string !== 'string')\n throw new TypeError('Expected a string')\n\n if (\n filenameReservedRegex().test(replacement)\n && reControlChars.test(replacement)\n ) {\n throw new Error(\n 'Replacement string cannot contain reserved filename characters',\n )\n }\n\n string = string\n .replace(filenameReservedRegex(), replacement)\n .replace(reControlChars, replacement)\n .replace(reRelativePath, replacement)\n .replace(reTrailingPeriods, '')\n\n string = windowsReservedNameRegex().test(string)\n ? string + replacement\n : string\n\n return string.slice(0, MAX_FILENAME_LENGTH)\n}\n","const rxEscape = /[\\\\\\-\\[\\]\\/{}()*+?.^$|]/g // Finds: \\ - [ ] / { } ( ) * + ? . ^ $ |\n\nexport function escapeRegExp(value: RegExp | string): string {\n if (!value)\n return ''\n if (value instanceof RegExp)\n return value.source\n\n return value.replace(rxEscape, '\\\\$&')\n}\n","// From https://v2.dinerojs.com/docs/api/formatting/to-unit MIT\n\nexport type RoundingMode = (value: number) => number\n\nexport const isHalf = (value: number) => Math.abs(value) % 1 === 0.5\nexport const isEven = (value: number) => value % 2 === 0\n\nexport const roundUp: RoundingMode = value => Math.ceil(value)\nexport const roundDown: RoundingMode = value => Math.floor(value)\nexport const roundHalfUp: RoundingMode = value => Math.round(value)\n\n/**\n * Round a number with half values to nearest odd integer.\n */\nexport const roundHalfOdd: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded - 1 : rounded\n}\n\n/**\n * Round a number with half values to nearest integer farthest from zero.\n */\nexport const roundHalfAwayFromZero: RoundingMode = (value) => {\n return isHalf(value)\n ? Math.sign(value) * Math.ceil(Math.abs(value))\n : Math.round(value)\n}\n\n/**\n * Round a number with half values down.\n */\nexport const roundHalfDown: RoundingMode = value =>\n isHalf(value) ? Math.floor(value) : Math.round(value)\n\n/**\n * Round a number with half values to nearest even integer.\n * https://wiki.c2.com/?BankersRounding\n */\nexport const roundHalfEven: RoundingMode = (value) => {\n const rounded = Math.round(value)\n if (!isHalf(value))\n return rounded\n\n return isEven(rounded) ? rounded : rounded - 1\n}\n\n/**\n * Round a number with half values to nearest integer closest to zero.\n */\nexport const roundHalfTowardsZero: RoundingMode = value =>\n isHalf(value)\n ? Math.sign(value) * Math.floor(Math.abs(value))\n : Math.round(value)\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getSecureRandomIfPossible } from './math'\n\n// Get a sort_weight suitable for adding to top of list\n// Original idea https://holtwick.de/en/blog/smart-table-reordering\n\nexport interface SortableItem {\n sort_weight: number\n}\n\nexport function startSortWeight(items: SortableItem[]): number {\n return (\n items.reduce((acc, item) => Math.min(acc, item.sort_weight || 0), 0)\n - 1\n - getSecureRandomIfPossible()\n )\n}\n\n// Get a sort_weight suitable for adding to end of list\nexport function endSortWeight(items: SortableItem[]): number {\n return (\n items.reduce((acc, item) => Math.max(acc, item.sort_weight || 0), 0)\n + 1\n + getSecureRandomIfPossible()\n )\n}\n\n// The real magic\nexport function moveSortWeight(\n newIndex: number,\n oldIndex: number,\n items: SortableItem[],\n): number {\n const count = items.length\n\n const moveLower = newIndex < oldIndex\n if (count <= 0 || newIndex >= count - 1)\n return endSortWeight(items)\n\n if (newIndex <= 0)\n return startSortWeight(items)\n\n // Make sure they are sorted\n items = sortedItems([...items])\n\n const step = moveLower ? -1 : 0\n const lower = items[newIndex + step].sort_weight || 0\n const upper = items[newIndex + step + 1].sort_weight || 0\n const distance = upper - lower\n if (distance === 0) {\n // Ugly list with no presets, make the best guess\n if (moveLower)\n return startSortWeight(items)\n\n return endSortWeight(items)\n }\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n}\n\nexport function sortedItems<T extends SortableItem>(items: T[]): T[] {\n items.sort((a, b) => (a.sort_weight || 0) - (b.sort_weight || 0))\n return items\n}\n","import { getSecureRandomIfPossible } from './math'\n\n/** CRDT compatible sorting with a single operation. Default name is `sort` */\nexport function useSorted<S extends Record<string, any>>(\n config: {\n getter?: (item: S) => number\n // setter?: (item: S, value: number) => void\n } = {},\n) {\n const {\n getter = (item: any): number => item.sort,\n // setter = (item: any, value) => (item.sort = value),\n } = config\n\n /** Return sorted list from low to high. */\n function items<T extends S>(items: T[]): T[] {\n items.sort((a, b) => (getter(a) || 0) - (getter(b) || 0))\n return items\n }\n\n /** Get a sort suitable for adding to start of list. */\n function start(items: S[]): number {\n return (\n items.reduce((acc, item) => Math.min(acc, getter(item) || 0), 0) - 1 - getSecureRandomIfPossible()\n )\n }\n\n /** Get a sort suitable for adding to end of list. */\n function end(items: S[]): number {\n return (\n items.reduce((acc, item) => Math.max(acc, getter(item) || 0), 0) + 1 + getSecureRandomIfPossible()\n )\n }\n\n /** Find a suitable value inbetween a lower and upper bound. */\n function between(lower?: number, upper?: number): number {\n if (lower == null)\n lower = (upper ?? 0) - 1\n if (upper == null)\n upper = (lower ?? 0) + 1\n\n const distance = upper - lower\n // if (distance === 0)\n\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n }\n\n /** Mainly for drag and drop movements, where an item has to be moved to another index. Respects its own move as well. */\n function move(\n newIndex: number,\n oldIndex: number,\n sortableItems: S[],\n ): number {\n const count = sortableItems.length\n\n const moveLower = newIndex < oldIndex\n if (count <= 0 || newIndex >= count - 1)\n return end(sortableItems)\n\n if (newIndex <= 0)\n return start(sortableItems)\n\n // Make sure they are sorted\n sortableItems = items([...sortableItems])\n\n const step = moveLower ? -1 : 0\n const lower = getter(sortableItems[newIndex + step]) || 0\n const upper = getter(sortableItems[newIndex + step + 1]) || 0\n const distance = upper - lower\n if (distance === 0) {\n // Ugly list with no presets, make the best guess\n if (moveLower)\n return start(sortableItems)\n\n return end(sortableItems)\n }\n const middle = lower + distance / 2\n const fuzzy = distance * 0.01 * (getSecureRandomIfPossible() - 0.5) // 1% fuzziness to avoid conflicts\n return middle + fuzzy\n }\n\n return {\n start,\n end,\n between,\n move,\n items,\n }\n}\n","// https://mathiasbynens.be/demo/url-regex\n// https://gist.github.com/dperini/729294\n\nimport { escapeHTML } from './html'\n\nconst findURL\n = /((?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u00A1-\\uFFFF][a-z0-9\\u00A1-\\uFFFF_-]{0,62})?[a-z0-9\\u00A1-\\uFFFF]\\.)+(?:[a-z\\u00A1-\\uFFFF]{2,}\\.?))(?::\\d{2,5})?(?:[/?#]\\S*)?)/gim\n\nexport function linkifyPlainText(text: string): string {\n return text\n .split(findURL)\n .map((part, i) => {\n const escapedPart = escapeHTML(part)\n return i % 2\n ? `<a target=\"_blank\" href=\"${escapedPart}\">${toHumanReadableUrl(\n escapedPart,\n )}</a>`\n : escapedPart\n })\n .join('')\n}\n\nexport function toHumanReadableUrl(url: string): string {\n return url.replace(/^https?:\\/\\/(www\\.)?/, '').replace(/\\/$/, '')\n}\n\n//\n\nexport function encodeQuery(data: Record<string, any>) {\n const pairs = []\n for (let [key, value] of Object.entries(data)) {\n if (value != null) {\n if (!Array.isArray(value))\n value = [value]\n for (const v of value) {\n if (v != null) {\n pairs.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`,\n )\n }\n }\n }\n }\n return pairs.join('&')\n}\n\nexport function parseQuery(queryString: string) {\n const query: any = {}\n const pairs = (\n queryString[0] === '?' ? queryString.substr(1) : queryString\n ).split('&')\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i].split('=')\n const key = decodeURIComponent(pair[0])\n const value = decodeURIComponent(pair[1] || '')\n if (query[key] != null) {\n if (!Array.isArray(query[key]))\n query[key] = [query[key]]\n\n query[key].push(value)\n }\n else {\n query[key] = value\n }\n }\n return query\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { Json } from '../types'\nimport { jsonStringifySafe } from './json'\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * function createRoom(room, rooms) { return new Room() }\n * ensureKey(rooms, room, createRoom).enter()\n * ```\n */\nexport function ensureKey<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => T,\n): T {\n let value = obj[key]\n if (value === undefined) {\n value = createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\n/**\n * Call a create function if key does not yet exist on an object. Returns the found or created object. Example:\n *\n * ```js\n * async function fetchItem(id, cache) { ... }\n * let data = await ensureKey(cache, id, fetchItem)\n * ```\n */\nexport async function ensureKeyAsync<T>(\n obj: Record<string, T>,\n key: string,\n createFn: (key?: string, obj?: Record<string, T>) => Promise<T>,\n): Promise<T> {\n let value = obj[key]\n if (value === undefined) {\n value = await createFn(key, obj)\n obj[key] = value\n }\n return value\n}\n\nexport function size(obj: any) {\n if (obj != null) {\n if (obj.size != null)\n return obj.size\n\n if (obj.length != null)\n return obj.length\n\n return Object.keys(obj).length\n }\n return 0\n}\n\nexport function last<T>(array?: T[]): T | undefined {\n return (array != null && array.length > 0) ? array[array.length - 1] : undefined\n}\n\n// True for [], {}, \"\", Map(), Set() and all primitives\nexport function empty(value: any): boolean {\n try {\n if (value != null) {\n if (Array.isArray(value))\n return value.length <= 0\n else if (typeof value === 'string')\n return value.length <= 0\n else if (value?.size != null)\n return value.size <= 0\n else\n return Object.keys(value).length <= 0\n }\n }\n catch (err) {\n console.warn('Failed to check if empty for', value, err)\n }\n return true\n}\n\n// Also see common/data/deep.ts\nexport function cloneObject<T>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// Also see common/data/deep.ts\nexport function cloneJsonObject<T = Json>(obj: T): T {\n // Primitives are immutable anyway\n if (Object(obj) !== obj)\n return obj\n\n // Rude but very efficient way to clone\n return JSON.parse(jsonStringifySafe(obj))\n}\n\n// export function cloneStructuredObject<T>(obj: T): T {\n// // Primitives are immutable anyway\n// if (Object(obj) !== obj) return obj\n\n// // https://developer.mozilla.org/en-US/docs/Web/API/structuredClone\n// // @ts-ignore\n// return typeof structuredClone !== \"undefined\"\n// ? // @ts-ignore\n// structuredClone(obj)\n// : // Rude but very efficient way to clone\n// JSON.parse(JSON.stringify(obj))\n// }\n\n/**\n * Cache result of a function. Same arguments have to always return the same result in order to get expected optimization!\n *\n * ```\n * const square = memoize((value) => value * value)`\n * square(2) // == 2\n * ```\n */\nexport function memoize<In, Out>(\n fn: (arg: In) => Out,\n): (arg: In) => Out {\n const cache = new Map<In, Out>()\n return (n: In): Out => {\n if (cache.has(n))\n return cache.get(n)!\n\n const result = fn(n)\n cache.set(n, result)\n return result\n }\n}\n\nexport function memoizeAsync<In extends any[], Out extends Promise<any>>(\n fn: (...arg: In) => Out,\n): (...arg: In) => Promise<Out> {\n const cache = new Map<string, Out>()\n return async (...n: In): Promise<Out> => {\n const key = jsonStringifySafe(n)\n if (cache.has(key))\n return cache.get(key)!\n\n const result = await fn(...n)\n cache.set(key, result)\n return result\n }\n}\n\n/** Repeat `count` times. Starts with `0` */\nexport function forTimes<T = undefined>(\n count: number,\n fn: (i: number, count: number) => T,\n): T[] {\n const result = []\n for (let i = 0; i < count; i++)\n result.push(fn(i, count))\n\n return result\n}\n","/* eslint-disable no-cond-assign */\n\nimport { Logger } from '../log'\n\nconst RX_WHITESPACE = /\\\\\\s|\\s+|#[^\\n]*\\n?/gm\nconst RX_REAL_GROUPS = /\\(\\?P?<(\\w[\\w\\d_]+)>|\\((?!\\?(:|\\!|=|<=|<\\!))/gm\nconst RX_LOOK_BEHIND = /^((?:\\(\\?[\\w$]+\\))?)\\(\\?<([=!])([\\s\\S]*?)\\)/gm\n\nconst log = Logger('zeed:xrx', 'error')\n\nexport function regExpString(rx: string | RegExp): string {\n return typeof rx === 'string' ? rx : (rx.source || '')\n}\n\nexport function regExpEscape(str: string): string {\n return str.replace(/[-\\[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\nexport class XRX {\n lookBehind\n namedGroups: Record<string, number> = {}\n names: string[] = []\n rx: RegExp\n\n constructor(pattern: string | RegExp, flags?: string) {\n let _flags: string = flags ?? ''\n let _rx: string\n\n if (pattern instanceof RegExp) {\n if (flags == null)\n _flags = pattern.flags\n\n _rx = pattern.source\n }\n else {\n _rx = pattern\n }\n\n // eXtended / Ignore Whitespace\n const extended = _flags && _flags.includes('x')\n if (extended) {\n _flags = _flags.replace('x', '')\n _rx = _rx.replace(RX_WHITESPACE, (r) => {\n // log('rp', r)\n return r[0] === '\\\\' ? r : ''\n })\n }\n\n // Named Groups\n if (!(pattern instanceof RegExp)) {\n let index = 0\n _rx = _rx.replace(RX_REAL_GROUPS, (str, name) => {\n // log('>>>', name)\n index += 1\n if (name) {\n if (\n name !== 'index'\n && name !== 'length'\n && !this.namedGroups[name]\n )\n this.namedGroups[name] = index\n else\n log.error(`Unallowed or duplicate group name: ${name}`)\n\n return '('\n }\n return str\n })\n this.names = Object.keys(this.namedGroups)\n }\n\n // http://www.rexegg.com/regex-best-trick.html\n\n _rx = regExpString(_rx)\n RX_LOOK_BEHIND.lastIndex = 0\n const parts = RX_LOOK_BEHIND.exec(_rx)\n if (parts) {\n this.lookBehind = {\n rx: new RegExp(`${parts[3]}$(?!\\\\s)`),\n expect: parts ? parts[2] === '=' : !parts,\n }\n _rx = _rx.substr(parts[0].length)\n }\n\n this.rx = new RegExp(_rx, _flags)\n }\n\n // flagsString() {\n // let hash = this.rx.toString() + '/'\n // if (this.rx.global) {\n // hash += 'g'\n // }\n // if (this.rx.multiline) {\n // hash += 'm'\n // }\n // if (this.rx.ignoreCase) {\n // hash += 'i'\n // }\n // if (this.rx.unicode) {\n // hash += 'u'\n // }\n // if (this.rx.sticky) {\n // hash += 'y'\n // }\n // }\n\n get lastIndex(): number {\n return this.rx.lastIndex\n }\n\n set lastIndex(index: number) {\n this.rx.lastIndex = index\n }\n\n _handleMatch(m: any) {\n if (this.lookBehind) {\n const leftContext = m.input.slice(0, m.index)\n if (this.lookBehind.expect !== this.lookBehind.rx.test(leftContext))\n return null\n }\n for (const name of this.names)\n m[name] = m[this.namedGroups[name]]\n\n return m\n }\n\n exec(str: string) {\n let m\n while ((m = this.rx.exec(str))) {\n if (this.rx.lastIndex === m.index)\n this.rx.lastIndex++\n m = this._handleMatch(m)\n if (m != null)\n return m\n }\n }\n\n execAll(str: string) {\n const matches = []\n let m\n this.rx.lastIndex = 0\n while ((m = this.exec(str)))\n matches.push(m)\n\n this.rx.lastIndex = 0\n // log('execAll:', matches)\n return matches\n }\n\n replace(str: string, replacement: string | Function) {\n const fn = typeof replacement === 'function' ? replacement : () => replacement\n return str.replace(this.rx, (m) => {\n // m = this._handleMatch(m)\n return fn(m)\n })\n }\n}\n","import { escapeRegExp, isArray, isBoolean, isRecord, jsonStringifySafe } from './data'\n\nconst defaultSeparator = ','\n\nexport function csvStringify(data: any[], opt: {\n // header?: string[]\n separator?: string\n} = {}): string {\n const { separator = defaultSeparator } = opt\n let body = ''\n\n // Append the header row to the response if requested\n // if (header)\n // body = `${header.join(separator)}\\n`\n\n // Convert the data to a CSV-like structure\n for (let i = 0; i < data.length; i++) {\n body += `${data[i].map((field: string) => {\n if (field == null || field === '')\n return ''\n if (isBoolean(field))\n return field ? 1 : 0\n let s = String(field)\n if (isRecord(field) || isArray(field))\n s = jsonStringifySafe(field)\n if (s.includes('\"') || s.includes('\\n') || s.includes(separator))\n return `\"${s.replace(/\"/g, '\"\"')}\"`\n return s\n }).join(separator)}\\n`\n }\n\n return body\n}\n\nexport function csvParse(raw: string, opt: {\n separator?: string\n} = {}) {\n // https://regex101.com/r/BCpKyV/1\n let rxOneValueWithSeparator = /(\"((?:(?:[^\"]*?)(?:\"\")?)*)\"|([^,;\\t\\n]*))([,;\\t]|\\n|\\r\\n)/g\n if (opt.separator)\n rxOneValueWithSeparator = new RegExp(rxOneValueWithSeparator.source.replaceAll(',;\\\\t', escapeRegExp(opt.separator)), rxOneValueWithSeparator.flags)\n\n const lines: any[][] = []\n let row: any[] = []\n let m: any\n const text = `${raw.replaceAll('\\r\\n', '\\n').trim()}\\n`\n\n // eslint-disable-next-line no-cond-assign\n while (m = rxOneValueWithSeparator.exec(text)) {\n let value = m[2] ?? m[3] ?? ''\n value = value.replaceAll('\"\"', '\"')\n row.push(value)\n if (m[4] === '\\n') {\n lines.push(row)\n row = []\n }\n }\n return lines\n}\n\nexport function csvParseToObjects(raw: string, opt: {\n separator?: string\n} = {}) {\n const lines = csvParse(raw, opt)\n const header = lines[0]\n return lines.slice(1).map(l =>\n Object.fromEntries (l.map((v, i) => [header[i], v])),\n )\n}\n","import { isString } from './data'\nimport { arrayFilterInPlace } from './data/array'\nimport { isPromise, promisify } from './exec/promise'\nimport { Logger } from './log'\nimport type { LoggerInterface } from './log-base'\n\nconst logDispose = Logger('zeed:dispose')\n\n// https://blog.hediet.de/post/the_disposable_pattern_in_typescript\n\nexport type DisposerFunction = () => any | Promise<any>\n\nexport type Disposer =\n | DisposerFunction\n | {\n dispose?: Function | Promise<unknown>\n cleanup?: Function | Promise<unknown> // deprecated, but used often in my old code\n }\n\nexport interface Disposable {\n dispose: UseDispose\n}\n\n/** Different kinds of implementations have grown, this should unify them */\nasync function callDisposer(disposable: Disposer): Promise<void> {\n if (typeof disposable === 'function')\n await promisify(disposable())\n\n else if (isPromise(disposable))\n await disposable\n\n else if (typeof disposable.dispose === 'function')\n await promisify(disposable.dispose())\n\n else if (isPromise(disposable.dispose))\n await disposable.dispose\n\n else if (typeof disposable.cleanup === 'function')\n await promisify(disposable.cleanup())\n\n else if (isPromise(disposable.cleanup))\n await disposable.cleanup\n}\n\n// export function disposeFn()\n\ninterface UseDisposeConfig {\n name?: string\n log?: LoggerInterface\n}\n\nexport function useDispose(config?: string | UseDisposeConfig | LoggerInterface) {\n let opt = config as any\n if (opt != null) {\n if (isString(opt))\n opt = { name: opt }\n else if ('debug' in opt && 'label' in opt)\n opt = { name: opt.label, log: opt }\n }\n\n const name = opt?.name\n const log = opt?.log ?? logDispose\n const tracked: Disposer[] = []\n\n const untrack = async (disposable: Disposer): Promise<void> => {\n if (disposable != null && tracked.includes(disposable)) {\n arrayFilterInPlace(tracked, el => el !== disposable)\n await callDisposer(disposable)\n }\n }\n\n /** Dispose all tracked entries */\n const dispose = async (): Promise<void> => {\n if (name)\n log.debug(`dispose \"${name}\": ${tracked.length} entries`)\n while (tracked.length > 0)\n await untrack(tracked[0]) // LIFO\n }\n\n const track = (obj?: Disposer): DisposerFunction | undefined => {\n if (obj == null)\n return\n tracked.unshift(obj) // LIFO\n return () => untrack(obj)\n }\n\n return Object.assign(dispose, {\n track,\n add: track, // ?\n untrack, // ?\n dispose,\n exec: dispose, // ?\n getSize() {\n return tracked.length\n },\n isDisposed() {\n return tracked.length <= 0\n },\n })\n}\n\nexport type UseDispose = ReturnType<typeof useDispose>\n\n/** @deprecated use `useDispose` instead */\nexport const useDisposer = useDispose\n\nexport function useDefer(\n config: {\n mode?: 'lifo' | 'fifo'\n } = {},\n) {\n const { mode = 'fifo' } = config\n const steps: Disposer[] = []\n\n /**\n * Excutes all steps. If all steps are not Promises, they are executed immediately,\n * otherwise a Promise is returned\n */\n const exec = async (expectSync = false) => {\n while (steps.length > 0) {\n const step = steps[0]\n arrayFilterInPlace(steps, el => el !== step)\n if (typeof step === 'function') {\n const result = step()\n if (isPromise(result)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await result\n }\n }\n else if (isPromise(step)) {\n if (expectSync) {\n throw new Error(\n `Expected sync only function, but found async: ${step}`,\n )\n }\n await step\n }\n else {\n throw new Error(`Unhandled disposable: ${step}`)\n }\n }\n }\n\n const add = (obj: Disposer) => {\n if (mode === 'lifo')\n steps.unshift(obj)\n\n else\n steps.push(obj)\n }\n\n return Object.assign(exec, {\n add,\n exec,\n getSize() {\n return steps.length\n },\n })\n}\n\nexport type UseDefer = ReturnType<typeof useDefer>\n\nexport function useTimeout(\n fn: Function,\n timeout = 0,\n): DisposerFunction {\n let timeoutHandle: any = setTimeout(fn, timeout)\n return () => {\n if (timeoutHandle) {\n clearTimeout(timeoutHandle)\n timeoutHandle = undefined\n }\n }\n}\n\nexport function useInterval(fn: Function, interval: number): DisposerFunction {\n let intervalHandle: any = setInterval(fn, interval)\n return () => {\n if (intervalHandle) {\n clearInterval(intervalHandle)\n intervalHandle = undefined\n }\n }\n}\n\nexport function useEventListener(\n emitter: any,\n eventName: string,\n fn: (ev?: any) => void,\n ...args: any[]\n): DisposerFunction {\n if (emitter == null)\n return () => {}\n\n if (emitter.on)\n emitter.on(eventName, fn, ...args)\n\n else if (emitter.addEventListener)\n emitter.addEventListener(eventName, fn, ...args)\n\n return () => {\n if (emitter.off)\n emitter.off(eventName, fn, ...args)\n\n else if (emitter.removeEventListener)\n emitter.removeEventListener(eventName, fn, ...args)\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { isPromise } from './promise'\n\nexport type Mutex = (fn: Function, elseFn?: Function) => boolean\nexport type AsyncMutex = (fn: Function, elseFn?: Function) => Promise<boolean>\n\nexport function useMutex(): Mutex {\n let token = true\n return (fn, elseFn) => {\n let executed = false\n if (token) {\n token = false\n try {\n fn()\n executed = true\n }\n finally {\n token = true\n }\n }\n else if (elseFn !== undefined) {\n elseFn()\n }\n return executed\n }\n}\n\nexport function useAsyncMutex(): AsyncMutex {\n let token = true\n return async (fn, elseFn) => {\n let executed = false\n if (token) {\n token = false\n try {\n const result = fn()\n if (isPromise(result))\n await result\n executed = true\n }\n finally {\n token = true\n }\n }\n else if (elseFn !== undefined) {\n const result = elseFn()\n if (isPromise(result))\n await result\n }\n return executed\n }\n}\n\n// export type Lock = ({lock: () => Promise<void>, unlock: () => void})\n\n// export function createLock() {\n// let lockCtr = []\n// return {\n// lock() {\n\n// },\n// unlock() {\n\n// }\n// }\n// }\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { getSecureRandomIfPossible } from '../data/math'\nimport type { Disposable, DisposerFunction } from '../dispose-defer'\nimport { useDispose } from '../dispose-defer'\nimport { getGlobalContext } from '../global'\nimport { Logger } from '../log'\nimport { promisify } from '../exec/promise'\n\nconst log = Logger('zeed:emitter', 'error')\n\nexport type EmitterHandler = (...objs: any[]) => void\nexport type EmitterAllHandler<T = string> = (key: T, ...objs: any[]) => void\n\n// For magic see https://www.npmjs.com/package/tiny-typed-emitter / License MIT\n// https://stackoverflow.com/a/61609010/140927\n// https://basarat.gitbook.io/typescript/main-1/typed-event\n// https://github.com/andywer/typed-emitter#extending-an-emitter\n\n// TODO: Allow symbols? https://github.com/sindresorhus/emittery\n\nexport declare type ListenerSignature<L> = {\n [E in keyof L]: (...args: any[]) => any\n}\n\nexport declare interface DefaultListener {\n [k: string]: (...args: any[]) => any\n}\n\nexport class Emitter<\n RemoteListener extends ListenerSignature<RemoteListener> = DefaultListener,\n LocalListener extends ListenerSignature<LocalListener> = RemoteListener,\n> implements Disposable {\n subscribers: any = {}\n subscribersOnAny: any[] = []\n\n /** Unused, but here for historical reasons */\n dispose = useDispose()\n\n call: RemoteListener = new Proxy<RemoteListener>({} as any, {\n get:\n (target: any, name: any) =>\n async (...args: any): Promise<boolean> =>\n await this.emit(name, ...args),\n })\n\n public async emit<U extends keyof RemoteListener>(\n event: U,\n ...args: Parameters<RemoteListener[U]>\n ): Promise<boolean> {\n let ok = false\n\n try {\n const subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n // log.debug(\"emit\", this?.constructor?.name, event, ...args, subscribers)\n\n this.subscribersOnAny.forEach(fn => fn(event, ...args))\n\n if (subscribers.length > 0) {\n const all = subscribers.map((fn) => {\n try {\n return promisify(fn(...args))\n }\n catch (err) {\n log.warn('emit warning:', err)\n }\n return null\n }).filter(fn => fn != null)\n ok = true\n await Promise.all(all)\n }\n }\n catch (err) {\n log.error('emit exception', err)\n }\n return ok\n }\n\n public onAny(fn: EmitterHandler) {\n this.subscribersOnAny.push(fn)\n }\n\n public on<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): DisposerFunction {\n const subscribers = (this.subscribers[event] || []) as EmitterHandler[]\n subscribers.push(listener)\n this.subscribers[event] = subscribers\n return () => {\n this.off(event, listener)\n }\n }\n\n public onCall(handlers: Partial<LocalListener>) {\n for (const [name, handler] of Object.entries(handlers))\n this.on(name as any, handler as any)\n }\n\n public once<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): DisposerFunction {\n const onceListener = async (...args: any[]) => {\n this.off(event, onceListener as any)\n return await promisify(listener(...args))\n }\n this.on(event, onceListener as any)\n return () => {\n this.off(event, listener)\n }\n }\n\n public off<U extends keyof LocalListener>(\n event: U,\n listener: LocalListener[U],\n ): this {\n // log(\"off\", key)\n this.subscribers[event] = (this.subscribers[event] || []).filter(\n (f: any) => listener && f !== listener,\n )\n return this\n }\n\n public removeAllListeners(): this {\n this.subscribers = {}\n return this\n }\n}\n\ndeclare global {\n interface ZeedGlobalContext {\n emitter?: Emitter\n }\n\n interface ZeedGlobalEmitter {}\n}\n\n/** Global emitter that will listen even across modules */\nexport function getGlobalEmitter(): Emitter<ZeedGlobalEmitter> {\n let emitter = getGlobalContext().emitter\n if (!emitter) {\n emitter = new Emitter()\n getGlobalContext().emitter = emitter\n }\n return emitter as any\n}\n\n// This can be used as a global messaging port to connect loose\n// parts of your app\nexport const messages = new Emitter()\n\n// For debugging\n\ninterface LazyEvent {\n key: string\n obj: any\n}\n\nexport function lazyListener(\n emitter: any,\n listenerKey?: string,\n): (key?: string, skipUnmatched?: boolean) => Promise<any> {\n const name = Math.round(getSecureRandomIfPossible() * 100)\n\n const events: LazyEvent[] = []\n let lazyResolve: (() => void) | undefined\n\n const incoming = (key: string, obj: any) => {\n const ev = { key, obj }\n // debug(name, \" lazy push\", ev)\n events.push(ev)\n lazyResolve && lazyResolve()\n }\n\n if (listenerKey) {\n if (emitter.on) {\n emitter.on(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n }\n else if (emitter.addEventListener) {\n emitter.addEventListener(listenerKey, (obj: any) => {\n incoming(listenerKey, obj)\n })\n }\n else {\n log.error(name, 'Cannot listen to key')\n }\n }\n else {\n if (emitter.onAny) {\n emitter.onAny((key: string, obj: any) => {\n incoming(key, obj)\n })\n }\n else {\n log.error(name, 'cannot listen to all for', emitter)\n }\n }\n\n const on = (key?: string, skipUnmatched = true): Promise<any> => {\n return new Promise((resolve, reject) => {\n if (!key) {\n key = listenerKey\n if (!key) {\n if (events.length) {\n // no key specified? just take the first one!\n key = events[0].key\n }\n }\n }\n // debug(name, \"lazy resolve on2\", key, skipUnmatched, events)\n lazyResolve = () => {\n // debug(name, \"lazy resolve\", key, listenerKey, events)\n while (events.length > 0) {\n const ev = <LazyEvent>events.shift()\n // debug(name, \" lazy analyze\", ev)\n if (ev.key === key) {\n lazyResolve = undefined\n resolve(ev.obj)\n }\n else {\n if (skipUnmatched) {\n log.warn(name, `Unhandled event ${key} with value: ${ev.obj}`)\n continue\n }\n reject(new Error(`Expected ${key}, but found ${ev.key} with value=${ev.obj}`))\n log.error(name, `Unhandled event ${key} with value: ${ev.obj}`)\n }\n break\n }\n }\n lazyResolve()\n })\n }\n\n return on\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n/**\n * @returns Timestamp in miliseconds\n */\nexport const getTimestamp = (): number => Date.now()\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)}s` : `${ms.toFixed(2)}ms`\n}\n\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { randomUint8Array } from './crypto'\nimport { fromHex, toHex } from './data'\nimport { useBase } from './data/basex'\nimport { getTimestamp } from './time'\n\nconst { encode: encode62, decode: decode62 } = useBase(62)\nconst { encode: encode32, decode: decode32 } = useBase(32)\n\n// 128 bit UUID\n\nconst uuidBytesLength = 16\n\nexport function uuidBytes(): Uint8Array {\n return randomUint8Array(uuidBytesLength)\n}\n\n// Base62\n\nexport function uuidB62(bytes = uuidBytes()): string {\n return encode62(bytes, 22)\n}\n\nexport function uuidEncodeB62(bytes: Uint8Array): string {\n return encode62(bytes, 22)\n}\n\nexport function uuidDecodeB62(uuid: string): Uint8Array {\n return decode62(uuid, uuidBytesLength)\n}\n\n// Base32\n\nexport function uuidB32(bytes = uuidBytes()): string {\n return encode32(bytes, 26)\n}\n\nexport function uuidEncodeB32(bytes: Uint8Array): string {\n return encode32(bytes, 26)\n}\n\nexport function uuidDecodeB32(uuid: string): Uint8Array {\n return decode32(uuid, uuidBytesLength)\n}\n\n// UUIDv4\n\n// https://stackoverflow.com/a/2117523/140927\nconst pattern = '10000000-1000-4000-8000-100000000000' // String([1e7] + -1e3 + -4e3 + -8e3 + -1e11)\n\nexport const uuidv4 = (typeof crypto !== 'undefined' && crypto.randomUUID != null)\n ? crypto.randomUUID.bind(crypto) // native!\n : () => pattern.replace(/[018]/g, (c: any) => (c ^ (randomUint8Array(1)[0] & (15 >> (c / 4)))).toString(16))\n\nexport function uuidEncodeV4(bytes: Uint8Array): string {\n const id = toHex(bytes)\n return `${id.slice(0, 8)}-${id.slice(8, 12)}-${id.slice(12, 16)}-${id.slice(16)}` // 10000000 - 1000 - 4000 - 8000 - 100000000000\n}\n\nexport function uuidDecodeV4(uuid: string): Uint8Array {\n return fromHex(uuid.replaceAll('-', ''))\n}\n\n// Sortable UID\n\n// https://github.com/segmentio/ksuid\n// https://pkg.go.dev/github.com/rsms/go-uuid\n\n/**\n * Sortable unique ID\n * Inspired by https://github.com/rsms/go-uuid\n *\n * Bytes 0-5: Current time in miliseconds from 2021-06-01T00:00:00Z\n * Bytes 6-15: Random\n */\n\n// 1622505600000 // new Date('2021-06-01T00:00:00Z').getTime()\nconst ReferenceDateInMS = 1600000000000\n\n// 6 bytes will stay valid until end of time: new Date(1622505600000 + 0xffffffffffff) === Date Sun Jan 01 10941 06:31:50 GMT+0100 (Central European Standard Time)\n\nfunction longToByteArray(long: number) {\n const byteArray = new Uint8Array([0, 0, 0, 0, 0, 0])\n const bytes = byteArray.length - 1\n for (let index = 0; index < byteArray.length; index++) {\n const byte = long & 0xFF\n byteArray[bytes - index] = byte\n long = (long - byte) / 256\n }\n return byteArray\n}\n\n// function byteArrayToLong(byteArray: number[]): number {\n// var value = 0\n// for (var i = byteArray.length - 1; i >= 0; i--) {\n// value = value * 256 + byteArray[i]\n// }\n// return value\n// }\n\nexport function suidBytes(): Uint8Array {\n const ms = getTimestamp() - ReferenceDateInMS\n return new Uint8Array([...longToByteArray(ms), ...randomUint8Array(10)])\n}\n\nexport function suid(): string {\n return uuidEncode(suidBytes())\n}\n\nexport function suidDate(id: string): Date {\n return suidBytesDate(uuidDecode(id))\n}\n\nexport function suidBytesDate(id: Uint8Array): Date {\n return new Date(\n ReferenceDateInMS + id.slice(0, 6).reduce((acc, byte) => acc * 256 + byte, 0),\n )\n}\n\n// 32 bit UUID\n\nexport const uuid32bit = () => new Uint32Array(randomUint8Array(4))[0]\n\n// Global Settings\n\nconst mapModes = {\n base62: {\n uuid: uuidB62,\n uuidDecode: uuidDecodeB62,\n uuidEncode: uuidEncodeB62,\n },\n base32: {\n uuid: uuidB32,\n uuidDecode: uuidDecodeB32,\n uuidEncode: uuidEncodeB32,\n },\n uuidv4: {\n uuid: uuidv4,\n uuidDecode: uuidDecodeV4,\n uuidEncode: uuidEncodeV4,\n },\n}\n\nlet _mode: keyof typeof mapModes = 'base62'\nlet _sorted = false\n\nexport function setUuidDefaultEncoding(mode: keyof typeof mapModes, sorted = false) {\n _mode = mode\n _sorted = sorted\n}\n\nexport function uuid(): string {\n return mapModes[_mode].uuid(_sorted ? suidBytes() : uuidBytes())\n}\n\nexport function uuidDecode(uuid: string): Uint8Array {\n return mapModes[_mode].uuidDecode(uuid)\n}\n\nexport function uuidEncode(bytes: Uint8Array): string {\n return mapModes[_mode].uuidEncode(bytes)\n}\n\nexport function uuidIsValid(uuid: string): boolean {\n try {\n const bin = uuidDecode(uuid)\n return bin.length === uuidBytesLength\n }\n catch (err) {\n // log.warn('Invalid ID:', uuid)\n }\n return false\n}\n\n// Simple Counters\n\nconst _unameCounters: Record<string, number> = {}\n\nexport function uname(name = 'id'): string {\n if (_unameCounters[name] == null)\n _unameCounters[name] = 0\n\n return `${name}-${_unameCounters[name]++}`\n}\n\nlet _qid = 0\n\nexport function qid(): string {\n return `id-${_qid++}`\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n// import { Logger } from \"../log\"\nimport { uuid } from '../uuid'\nimport { Emitter } from './emitter'\n\n// const log = Logger(\"zeed:channel\")\n\n/** See http://developer.mozilla.org/en-US/docs/Web/API/MessageEvent */\nexport interface ChannelMessageEvent {\n data: any\n origin?: string\n lastEventId?: string\n}\n\n/**\n * Inspired by\n * http://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel\n * https://deno.com/deploy/docs/runtime-broadcast-channel\n * */\nexport abstract class Channel extends Emitter<{\n message(event: ChannelMessageEvent): void\n messageerror(event: ChannelMessageEvent): void // optional\n connect(): void // optional\n disconnect(): void // optional\n close(): void\n}> {\n id: string = uuid()\n abstract isConnected?: boolean\n abstract postMessage(data: any): void\n close() {\n void this.dispose()\n }\n}\n\n/** Very basic channel demonstrating local communication */\nexport class LocalChannel extends Channel {\n isConnected = true\n\n other?: LocalChannel\n\n postMessage(data: any) {\n void this.other?.emit('message', {\n data, // : cloneObject(data),\n origin: 'local',\n lastEventId: uuid(),\n })\n }\n}\n\nexport function createLocalChannelPair(): [LocalChannel, LocalChannel] {\n const w1 = new LocalChannel()\n const w2 = new LocalChannel()\n\n w1.other = w2\n w2.other = w1\n\n return [w1, w2]\n}\n","import { decrypt, encrypt } from '../crypto'\nimport { Uint8ArrayToJson, jsonToUint8Array } from '../data/bin'\n\nexport interface Encoder {\n encode(data: any): Promise<Uint8Array>\n decode(data: Uint8Array): Promise<any>\n}\n\nexport class NoopEncoder implements Encoder {\n async encode(data: any): Promise<Uint8Array> {\n return data\n }\n\n async decode(data: Uint8Array): Promise<any> {\n return data\n }\n}\n\nexport class JsonEncoder implements Encoder {\n async encode(data: any): Promise<Uint8Array> {\n return jsonToUint8Array(data)\n }\n\n async decode(data: Uint8Array): Promise<any> {\n return Uint8ArrayToJson(data)\n }\n}\n\nexport class CryptoEncoder implements Encoder {\n key: CryptoKey\n\n constructor(key: CryptoKey) {\n this.key = key\n }\n\n async encode(data: any): Promise<Uint8Array> {\n const plain = jsonToUint8Array(data)\n return await encrypt(plain, this.key)\n }\n\n async decode(data: Uint8Array): Promise<any> {\n const plain = await decrypt(data, this.key)\n return Uint8ArrayToJson(plain)\n }\n}\n","import { valueToString } from '../data/convert'\nimport { isPromise, tryTimeout } from '../exec/promise'\nimport { Logger } from '../log'\nimport type { LogLevelAliasType } from '../log-base'\nimport type { Json } from '../types'\nimport { uname, uuid } from '../uuid'\nimport type { Channel } from './channel'\nimport type { Encoder } from './encoder'\nimport { JsonEncoder } from './encoder'\n\nexport interface MessageAction {\n name: string\n id: string\n args?: Json[]\n}\n\nexport interface MessageResult {\n id: string\n result?: Json\n error?: { stack?: string; name: string; message: string }\n}\n\nexport type Message = MessageAction | MessageResult\n\nexport interface MessagesOptions {\n timeout?: number\n}\n\nexport interface MessagesDefaultMethods<L> {\n dispose(): void\n connect?(channel: Channel): void\n options(opt: MessagesOptions): L\n}\n\nexport type MessagesMethods<L> = L & MessagesDefaultMethods<L>\n\n// export type MessageDefinitions = {\n// [key: string]: (...args: any) => Promise<any>\n// }\n\nexport type MessageDefinitions = Record<any, (...args: any) => Promise<any>>\n\nexport interface MessageHub {\n dispose(): void\n connect: (newChannel: Channel) => void\n listen<L extends MessageDefinitions>(newHandlers: L): void\n send<L extends MessageDefinitions>(): MessagesMethods<L>\n}\n\n// The async proxy, waiting for a response\nexport const createPromiseProxy = <P extends object>(\n fn: (name: string, args: any[], opt: any) => Promise<unknown>,\n opt: MessagesOptions,\n predefinedMethods: any = {},\n): P =>\n new Proxy<P>(predefinedMethods, {\n get: (target: any, name: any) => {\n if (name in target)\n return target[name]\n return (...args: any): any => fn(name, args, opt)\n },\n })\n\n/**\n * RPC\n *\n * Features:\n * - Waits for connection\n * - Retries after fail\n * - Timeouts\n */\nexport function useMessageHub(\n opt: {\n name?: string\n channel?: Channel\n encoder?: Encoder\n retryAfter?: number\n ignoreUnhandled?: boolean\n debug?: boolean\n logLevel?: LogLevelAliasType\n } = {},\n): MessageHub {\n const {\n name = uname('hub'),\n encoder = new JsonEncoder(),\n retryAfter = 1000,\n ignoreUnhandled = true,\n logLevel = false,\n } = opt\n\n const log = Logger(name, logLevel)\n\n const handlers = {}\n let channel: Channel | undefined\n const queue: Message[] = []\n let queueRetryTimer: any\n const waitingForResponse: Record<string, [Function, Function]> = {}\n\n const dispose = () => {\n clearTimeout(queueRetryTimer)\n }\n\n const postNext = async () => {\n clearTimeout(queueRetryTimer)\n if (channel) {\n if (channel.isConnected) {\n while (queue.length) {\n const message = queue[0]\n try {\n channel.postMessage(await encoder.encode(message))\n queue.shift() // remove from queue when done\n }\n catch (err) {\n log.warn('postMessage', err)\n break\n }\n }\n }\n if (queue.length > 0 && retryAfter > 0)\n queueRetryTimer = setTimeout(postNext, retryAfter)\n }\n }\n\n const postMessage = async (message: Message) => {\n log('enqueue postMessage', message)\n queue.push(message)\n await postNext()\n }\n\n const connect = async (newChannel: Channel) => {\n channel = newChannel\n channel.on('connect', postNext)\n channel.on('message', async (msg: any) => {\n log('onmessage', typeof msg)\n const { name, args, id, result, error } = await encoder.decode(msg.data)\n\n // Incoming new message\n if (name) {\n log(`name ${name} id ${id}`)\n try {\n // @ts-expect-error xxx\n if (handlers[name] == null)\n throw new Error(`handler for ${name} was not found`)\n\n // @ts-expect-error xxx\n let result = handlers[name](...args)\n if (isPromise(result))\n result = await result\n log(`result ${result}`)\n if (id)\n await postMessage({ id, result })\n }\n catch (error) {\n const err\n = error instanceof Error ? error : new Error(valueToString(error))\n log.warn('execution error', err.name)\n await postMessage({\n id,\n error: {\n message: err.message,\n stack: err.stack,\n name: err.name,\n },\n })\n }\n }\n\n // Incoming new response\n else if (id) {\n log(`response for id=${id}: result=${result}, error=${error}`)\n if (waitingForResponse[id] == null) {\n if (result === undefined)\n log(`skip response for ${id}`)\n else\n log.warn(`no response hook for ${id}`)\n }\n else {\n const [resolve, reject] = waitingForResponse[id]\n if (resolve && reject) {\n delete waitingForResponse[id]\n if (error) {\n const err = new Error(error.message)\n err.stack = error.stack\n err.name = error.name\n log.warn('reject', err.name)\n reject(err)\n }\n else {\n log('resolve', result)\n resolve(result)\n }\n }\n }\n }\n\n // Don't know what to do with it\n else if (!ignoreUnhandled) {\n log.warn('Unhandled message', msg)\n }\n })\n\n await postNext()\n }\n\n const fetchMessage = async (\n name: string,\n args: any[],\n opt: MessagesOptions = {},\n ): Promise<unknown> => {\n const { timeout = 5000 } = opt\n const id = uuid()\n await postMessage({\n name,\n args,\n id,\n })\n return tryTimeout(\n new Promise(\n (resolve, reject) => (waitingForResponse[id] = [resolve, reject]),\n ),\n timeout,\n )\n }\n\n if (opt.channel)\n void connect(opt.channel) // todo async\n\n return {\n dispose,\n connect,\n listen<L extends object>(newHandlers: L) {\n Object.assign(handlers, newHandlers)\n },\n send<L extends object>() {\n // The regular proxy without responding, just send\n return createPromiseProxy<L>(fetchMessage, {}, {\n options(perCallopt: MessagesOptions) {\n return createPromiseProxy<L>(fetchMessage, { ...perCallopt })\n },\n } as MessagesDefaultMethods<L>) as MessagesMethods<L>\n },\n }\n}\n","import { Logger } from '../log'\nimport { uname } from '../uuid'\nimport type { Channel } from './channel'\nimport type { DefaultListener, ListenerSignature } from './emitter'\nimport { Emitter } from './emitter'\nimport type { Encoder } from './encoder'\nimport { JsonEncoder } from './encoder'\n\ninterface PubSubConfig {\n channel: Channel\n encoder?: Encoder\n name?: string\n debug?: boolean\n}\n\nexport class PubSub< L extends ListenerSignature<L> = DefaultListener> extends Emitter<L> {\n name: string\n channel: Channel\n encoder: Encoder\n log: any\n debug: boolean\n\n get shortId() {\n return this.name.substr(0, 6)\n }\n\n constructor(opt: PubSubConfig) {\n super()\n\n const { name, encoder = new JsonEncoder(), channel, debug = false } = opt\n\n this.channel = channel\n this.encoder = encoder\n this.debug = debug\n\n this.name = name ?? this.channel.id ?? uname('pubsub')\n this.log = Logger(`${this.shortId}`)\n\n if (this.debug) {\n this.channel.on('connect', () => {\n this.log('channel connected')\n })\n this.channel.on('disconnect', () => {\n this.log('channel disconnected')\n })\n }\n\n this.channel.on('message', async ({ data }) => {\n const info = await this.encoder.decode(data)\n if (this.debug)\n this.log(`channel message, event=${info?.event}, info=`, info)\n else this.log(`channel message, event=${info?.event}`)\n if (info) {\n const { event, args } = info\n await this.emitSuper(event, ...args)\n }\n })\n }\n\n private async emitSuper<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n return await super.emit(event, ...args)\n }\n\n async emit<U extends keyof L>(\n event: U,\n ...args: Parameters<L[U]>\n ): Promise<boolean> {\n try {\n if (this.debug)\n this.log(`emit(${String(event)})`, event)\n else this.log(`emit(${String(event)})`, args.length)\n if (!this.channel.isConnected) {\n this.log.warn('channel not connected')\n return false\n }\n const data = await this.encoder.encode({ event, args })\n this.channel.postMessage(data)\n return true\n }\n catch (err) {\n this.log.warn(`emit(${String(event)})`, err)\n }\n return false\n }\n\n publish = this.emit.bind(this)\n subscribe = this.on.bind(this)\n}\n\nexport function usePubSub<L extends ListenerSignature<L> = DefaultListener>(\n opt: PubSubConfig,\n) {\n return new PubSub<L>(opt)\n}\n","// From https://github.com/antfu/birpc/blob/main/src/index.ts MIT\n\nexport type ArgumentsType<T> = T extends (...args: infer A) => any ? A : never\nexport type ReturnType<T> = T extends (...args: any) => infer R ? R : never\n\nexport interface RPCOptions<Remote> {\n /** No return values expected */\n onlyEvents?: boolean\n /** Names of remote functions that do not need response. */\n eventNames?: (keyof Remote)[]\n /** Function to post raw message */\n post: (data: any) => void\n /** Listener to receive raw message */\n on: (fn: (data: any) => void) => void\n /** Custom function to serialize data */\n serialize?: (data: any) => any\n /** Custom function to deserialize data */\n deserialize?: (data: any) => any\n}\n\nexport interface RPCFn<T> {\n /** Call the remote function and wait for the result. */\n (...args: ArgumentsType<T>): Promise<Awaited<ReturnType<T>>>\n /** Send event without asking for response */\n asEvent(...args: ArgumentsType<T>): void\n}\n\nexport type RPCReturn<RemoteFunctions> = {\n [K in keyof RemoteFunctions]: RPCFn<RemoteFunctions[K]>\n}\n\nlet rpcCounter = 1\n\nenum RPCMode {\n request = 1,\n event = 2,\n resolve = 3,\n reject = 4,\n}\n\ntype RPCMessage = [\n RPCMode,\n any, // args\n number | undefined | null, // id\n string | undefined | null, // method\n]\n\nconst defaultSerialize = (i: any) => i\nconst defaultDeserialize = defaultSerialize\n\nexport function useRPC<RemoteFunctions = {}, LocalFunctions = {}>(\n functions: LocalFunctions,\n options: RPCOptions<RemoteFunctions>,\n): RPCReturn<RemoteFunctions> {\n const {\n post,\n on,\n eventNames = [],\n serialize = defaultSerialize,\n deserialize = defaultDeserialize,\n } = options\n\n const rpcPromiseMap = new Map<\n number,\n { resolve: (...args: any) => any; reject: (...args: any) => any }\n >()\n\n on(async (data) => {\n const msg = deserialize(data) as RPCMessage\n const [mode, args, id, method] = msg\n if (mode === RPCMode.request || mode === RPCMode.event) {\n let result, error: any\n if (method != null) {\n try {\n const fn = (functions as any)[method] // todo\n result = await fn(...args)\n }\n catch (e) {\n error = String(e)\n }\n }\n else {\n error = 'Method implementation missing'\n }\n if (mode === RPCMode.request && id) {\n if (error)\n post(serialize([RPCMode.reject, error, id]))\n else\n post(serialize([RPCMode.resolve, result, id]))\n }\n }\n else if (id) {\n const promise = rpcPromiseMap.get(id)\n if (promise != null) {\n if (mode === RPCMode.reject)\n promise.reject(args)\n else promise.resolve(args)\n }\n rpcPromiseMap.delete(id)\n }\n })\n\n return new Proxy(\n {},\n {\n get(_, method) {\n const sendEvent = (...args: any[]) => {\n post(serialize([RPCMode.event, args, null, method]))\n }\n if (options.onlyEvents || eventNames.includes(method as any)) {\n sendEvent.asEvent = sendEvent\n return sendEvent\n }\n const sendCall = (...args: any[]) => {\n return new Promise((resolve, reject) => {\n const id = rpcCounter++\n rpcPromiseMap.set(id, { resolve, reject })\n post(serialize([RPCMode.request, args, id, method]))\n })\n }\n sendCall.asEvent = sendEvent\n return sendCall\n },\n },\n ) as any\n}\n","// Inspired by https://developer.apple.com/documentation/foundation/progress\n\nimport { arrayRemoveElement } from '../data'\nimport { Emitter } from '../msg'\nimport { uname } from '../uuid'\n\ninterface ProgressOptions {\n totalUnits?: number\n completeUnits?: number\n resetWhenFinished?: boolean\n name?: string\n}\n\n/**\n * Progress helper with these properties:\n *\n * - `totalUnits` and `completedUnits` for progress\n * - Can be cancelled\n * - Sends events on cancel, changed and dispose\n * - Supports children and propagates values.\n * Total progress is sum of all units in the tree.\n * - On `dispose` child removes itself from parent.\n */\nexport class Progress extends Emitter<{\n progressCancelled(progress: Progress): void\n progressChanged(progress: Progress): void\n progressDispose(progress: Progress): void\n}> {\n private _totalUnits: number\n private _completedUnits: number\n private _isCancelled = false\n private _resetWhenFinished = true\n private _children: Progress[] = []\n\n name: string\n\n constructor(opt: ProgressOptions = {}) {\n super()\n\n this._totalUnits = opt.totalUnits ?? 0\n this._completedUnits = opt.completeUnits ?? 0\n this._resetWhenFinished = opt.resetWhenFinished ?? true\n this.name = opt.name ?? uname('progress')\n\n // Make sure to cleanup also children\n this.dispose.add(async () => {\n for (const child of this._children)\n await child.dispose()\n await this.emit('progressDispose', this)\n })\n }\n\n /** Notify others about changes and reset on completion, if flag is set. */\n private update() {\n void this.emit('progressChanged', this)\n\n if (this._isCancelled && this._resetWhenFinished) {\n if (this.getTotalUnits() <= this.getCompletedUnits())\n this.reset()\n }\n }\n\n /** Fresh start */\n reset() {\n if (this._isCancelled) {\n this._isCancelled = false\n for (const child of this._children)\n child.reset()\n this.update()\n }\n }\n\n /** Notify and mark as cancelled. May take some time before having an effect. */\n async cancel() {\n if (!this._isCancelled) {\n this._isCancelled = true\n await this.emit('progressCancelled', this)\n for (const child of this._children)\n await child.cancel()\n this.update()\n }\n }\n\n /** Add child progress, which count into its parents units. On `dispose` it will auto remove itself from parent. */\n addChild(child: Progress) {\n child.on('progressDispose', () => this.removeChild(child))\n child.on('progressChanged', () => this.update())\n if (!this._children.includes(child))\n this._children.push(child)\n this.update()\n }\n\n /** Create child progress. */\n createChildProgress(opt?: ProgressOptions) {\n const progress = new Progress(opt)\n this.addChild(progress)\n return progress\n }\n\n removeChild(child: Progress) {\n arrayRemoveElement(this._children, child)\n this.update()\n }\n\n /** Total units including children */\n getTotalUnits(): number {\n if (this.isIndeterminate())\n return 0\n let units = this._totalUnits\n for (const child of this._children)\n units += child.getTotalUnits()\n return units\n }\n\n /** Completed units including children */\n getCompletedUnits(): number {\n if (this.isIndeterminate())\n return 0\n let units = this._completedUnits\n for (const child of this._children)\n units += child.getCompletedUnits()\n return units\n // return Math.min(this.getTotalUnits(), units)\n }\n\n /** Cannot calculate progress, because totalUnits are missing. Special representation in UI. */\n isIndeterminate(): boolean {\n return this._totalUnits <= 0 && this._children.length <= 0\n }\n\n isCancelled() {\n return this._isCancelled\n }\n\n /** Either disposed or all units completed. */\n isFinished() {\n return this.dispose.isDisposed() || (!this.isIndeterminate() && (this.getTotalUnits() <= this.getCompletedUnits()))\n }\n\n /** Value from 0 to 1, where 1 is 100% completeness. */\n getFraction() {\n if (this.isIndeterminate())\n return 0\n let value = this.getCompletedUnits() / this.getTotalUnits()\n if (isNaN(value))\n value = 0\n return Math.min(1, Math.max(0, value))\n }\n\n getChildrenCount() {\n return this._children.length\n }\n\n /** Change total units. */\n setTotalUnits(units: number, completedUnits?: number) {\n this._totalUnits = units\n if (completedUnits != null)\n this._completedUnits = completedUnits\n this.update()\n }\n\n /** Relatively change total units. */\n incTotalUnits(step = 1) {\n this._totalUnits += step\n this.update()\n }\n\n /** Set fixed number of completed units. */\n setCompletetedUnits(units: number) {\n this._completedUnits = units\n this.update()\n }\n\n /** Set to 100% without disposing. */\n setCompleted() {\n this._completedUnits = this._totalUnits\n this.update()\n }\n\n /** Dynamically change completed units. */\n incCompletedUnits(step = 1) {\n this._completedUnits += step\n this.update()\n }\n\n /** Progress tree to string for debuggin purposes. Consider using `name` attribute of Progress. */\n toString(indent = 0) {\n let s = `${' '.repeat(indent)}${this.name}: ${this._completedUnits} of ${this._totalUnits} units, ${Math.floor(this.getFraction() * 100)} %, cancel=${this._isCancelled}\\n`\n for (const child of this._children)\n s += child.toString(indent + 1)\n if (indent === 0)\n return s.trim()\n return s\n }\n}\n","import { useDispose } from '../dispose-defer'\nimport { Emitter } from '../msg/emitter'\nimport { uname, uuid } from '../uuid'\nimport { Progress } from './progress'\nimport { createPromise } from './promise'\n\nexport enum PoolTaskIdConflictResolution {\n /**\n * Tasks with same `id` are replaced. Newest wins.\n */\n replace,\n\n /**\n * Task with same `id` will continue to run. Reference is returned with option to cancel.\n * Named \"memoize\" because the result of the task should always be the same for the same `id`,\n * like e.g. a download.\n */\n memoize,\n\n /** Like memoize, but try to put on top of the list */\n prioritize,\n\n /**\n * Tasks with same `id` throw error\n */\n error,\n\n}\n\nexport interface PoolConfig {\n name?: string\n maxParallel?: number\n idConflictResolution?: PoolTaskIdConflictResolution\n}\n\nexport type PoolTaskFn<T = any> = (taskInfo: PoolTask<T>) => Promise<T>\n\nexport enum PoolTaskState {\n waiting,\n running,\n finished,\n}\n\n/** Task */\nexport interface PoolTask<T> {\n readonly id: string\n readonly task: PoolTaskFn<T>\n readonly done: Function\n readonly setMax: (max: number) => void\n readonly setResolved: (resolved: number) => void\n readonly incResolved: (inc?: number) => void\n state: PoolTaskState\n priority: number\n /** Same groups are executed only one at a time */\n group?: string\n\n progress: Progress\n max: number\n resolved: number\n\n result?: T\n payload?: unknown\n}\n\nexport interface PoolTaskEvents {\n didUpdate(\n max: number,\n resolved: number,\n presentMax: number,\n presentResolved: number\n ): void\n didStart(id: string): void\n didCancel(id: string): void\n didFinish(): void\n didResolve(id: string, value: any): void\n didReject(id: string, error: any): void\n}\n\n// todo: barrier\n// todo: dependents\n\nexport function usePool<T = any>(config: PoolConfig = {}) {\n const {\n maxParallel = 3,\n name = uname('pool'),\n idConflictResolution = PoolTaskIdConflictResolution.memoize,\n } = config\n\n const events = new Emitter<PoolTaskEvents>()\n\n const dispose = useDispose()\n dispose.add(cancelAll)\n\n const progress = new Progress({ name })\n\n progress.on('progressCancelled', cancelAll)\n\n let countMax = 0\n let countResolved = 0\n let currentParallel = 0\n let priority = 0\n const tasks: Record<string, PoolTask<T>> = {}\n\n // const [allFinishedPromise, allFinishedResolve] = createPromise()\n\n async function waitFinishAll() {\n if (countMax > 0) {\n const [promise, resolve] = createPromise()\n events.once('didFinish', resolve)\n return promise\n }\n }\n\n async function cleanupFinished() {\n for (const id of Object.keys(tasks)) {\n const task = tasks[id]\n if (task.state === PoolTaskState.finished) {\n await tasks[id].progress.dispose()\n delete tasks[id]\n }\n }\n }\n\n function didFinish() {\n void events.emit('didFinish')\n // allFinishedResolve(countMax)\n countMax = 0\n countResolved = 0\n void cleanupFinished()\n progress.reset()\n }\n\n function didUpdate() {\n let presentMax = 0\n let presentResolved = 0\n for (const { max, resolved, state } of Object.values(tasks)) {\n presentMax += max\n presentResolved += state === PoolTaskState.finished ? max : Math.min(max, resolved)\n }\n void events.emit(\n 'didUpdate',\n countMax,\n countResolved,\n presentMax,\n presentResolved,\n )\n }\n\n function performNext() {\n didUpdate()\n if (countMax > 0 && countMax === countResolved)\n didFinish()\n if (currentParallel >= maxParallel)\n return\n const waitingTasks = Object.values(tasks).filter(\n t => t.state === PoolTaskState.waiting,\n )\n if (waitingTasks.length > 0) {\n let taskInfo: PoolTask<T> | undefined\n for (const t of waitingTasks) {\n // Skip task if one of same group is running.\n // Forces serialized execution for subgroup of tasks.\n if (\n t.group != null\n && Object.values(tasks).some(\n tt =>\n tt.state === PoolTaskState.running\n && tt.id !== t.id\n && tt.group === t.group,\n )\n )\n continue\n\n // fifo\n if (taskInfo == null || t.priority < taskInfo.priority)\n taskInfo = t\n }\n if (taskInfo != null) {\n const id = taskInfo.id\n const done = taskInfo.done\n taskInfo.state = PoolTaskState.running\n ++currentParallel\n void events.emit('didStart', id)\n\n const taskFinished = (result?: T) => {\n if (taskInfo) {\n taskInfo.result = result\n taskInfo.state = PoolTaskState.finished\n taskInfo.resolved = taskInfo.max\n taskInfo.progress?.setCompleted()\n // void taskInfo.progress.dispose()\n }\n --currentParallel\n ++countResolved\n performNext()\n }\n\n taskInfo\n .task(taskInfo)\n .then((r) => {\n done(r)\n void events.emit('didResolve', id, r)\n taskFinished(r)\n })\n .catch((err) => {\n done()\n void events.emit('didReject', id, err)\n taskFinished()\n })\n }\n }\n }\n\n function cancel(id: string) {\n const taskInfo = tasks[id]\n if (taskInfo && taskInfo.state === PoolTaskState.waiting) {\n tasks[id].state = PoolTaskState.finished\n ++countResolved\n void events.emit('didCancel', id)\n void tasks[id].progress.dispose()\n didUpdate()\n }\n }\n\n function cancelAll() {\n Object.keys(tasks).forEach(cancel)\n // progress.dispose()\n }\n\n function hasById(id: string) {\n return tasks[id] != null\n }\n\n function enqueue<P>(\n task: PoolTaskFn<T>,\n config: {\n id?: string\n max?: number\n resolved?: number\n group?: string\n idConflictResolution?: PoolTaskIdConflictResolution\n payload?: P\n } = {},\n ) {\n let done: any\n const promise: Promise<any> = new Promise(resolve => (done = resolve))\n const id = config.id ?? uuid()\n\n if (tasks[id] != null) {\n const resolution = config.idConflictResolution ?? idConflictResolution\n\n if (resolution === PoolTaskIdConflictResolution.replace) {\n cancel(id)\n }\n else if (resolution === PoolTaskIdConflictResolution.memoize || resolution === PoolTaskIdConflictResolution.prioritize) {\n const runningTask = tasks[id]\n\n if (resolution === PoolTaskIdConflictResolution.prioritize)\n runningTask.priority = ++priority\n\n return {\n id,\n promise: (async () => {\n if (runningTask.state === PoolTaskState.finished)\n return tasks[id].result\n\n // todo: wait for task to finish\n })(),\n dispose: () => cancel(id),\n cancel: () => cancel(id),\n }\n }\n else {\n throw new Error(`Pool task with id=${id} already exists!`)\n }\n }\n\n const taskProgress = new Progress({\n name: id,\n totalUnits: config.max ?? 1,\n completeUnits: config.resolved ?? 0,\n })\n\n progress.addChild(taskProgress)\n\n tasks[id] = {\n id,\n task,\n priority: ++priority,\n group: config.group,\n state: PoolTaskState.waiting,\n max: config.max ?? 1,\n resolved: config.resolved ?? 0,\n done,\n payload: config.payload,\n progress: taskProgress,\n\n /** @deprecated should use `.progress` */\n setMax(units) {\n taskProgress.setTotalUnits(units)\n tasks[id].max = units\n didUpdate()\n },\n\n /** @deprecated should use `.progress` */\n setResolved(units) {\n taskProgress.setCompletetedUnits(units)\n tasks[id].resolved = units\n didUpdate()\n },\n\n /** @deprecated should use `.progress` */\n incResolved(inc = 1) {\n taskProgress.incCompletedUnits(inc)\n tasks[id].resolved += inc\n didUpdate()\n },\n }\n ++countMax\n performNext()\n\n return {\n id,\n promise,\n dispose: () => cancel(id),\n cancel: () => cancel(id),\n }\n }\n\n return {\n events,\n cancel,\n cancelAll,\n hasById,\n progress,\n enqueue,\n dispose,\n waitFinishAll,\n }\n}\n\nexport type Pool = ReturnType<typeof usePool>\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n// Can learn from here https://github.com/sindresorhus/p-queue\n\nimport type { LoggerInterface } from '../log-base'\nimport { LogLevel } from '../log-base'\nimport { Logger } from '../log'\nimport { uname } from '../uuid'\nimport { Emitter } from '../msg/emitter'\n\ntype TaskResolver = any\n\nexport type TaskFn<T = any> = () => Promise<T>\n\ninterface TaskInfo {\n name: string\n task: TaskFn\n resolve: TaskResolver\n}\n\nexport interface TaskEvents {\n didUpdate(max: number, resolved: number): void\n didStart(max: number): void\n didCancel(): void\n didFinish(): void\n // didResolve(value: any): void\n // didReject(error: any): void\n // didPause(max: number): void\n}\n\n/** Guarentee serial execution of tasks. Able to wait, pause, resume and cancel all. */\nexport class SerialQueue extends Emitter<TaskEvents> {\n private queue: TaskInfo[] = []\n private waitToFinish: TaskResolver[] = []\n private currentTask?: Promise<any>\n private log: LoggerInterface\n private countMax = 0\n private countResolved = 0\n\n private paused = false\n\n name: string\n\n constructor(opt: { name?: string; logLevel?: LogLevel } = {}) {\n super()\n const { name = uname('queue'), logLevel } = opt\n this.name = name\n this.log = Logger(`zeed:queue:${name}`, logLevel ?? LogLevel.off)\n }\n\n private async performNext() {\n this.log('performNext, queue.length =', this.queue.length)\n\n if (this.currentTask != null) {\n this.log('performNext => skip while another task is running')\n return\n }\n\n if (this.paused) {\n this.log('performNext => skip while is paused')\n return\n }\n\n while (this.currentTask == null && !this.paused) {\n const info = this.queue.shift()\n this.log(`performNext => ${info?.name}`)\n\n if (info == null)\n break\n\n if (this.countResolved === 0)\n void this.emit('didStart', this.countMax)\n\n const { name, task, resolve } = info\n this.currentTask = task()\n let result\n try {\n this.log.info(`start task ${name}`)\n result = await this.currentTask\n this.log(`finished task ${name} with result =`, result)\n }\n catch (err) {\n this.log.warn('Error performing task', err)\n }\n\n resolve(result)\n this.currentTask = undefined\n\n this.countResolved += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n }\n\n if (this.queue.length === 0) {\n void this.emit('didFinish')\n this.countMax = 0\n this.countResolved = 0\n }\n\n while (this.waitToFinish.length > 0)\n this.waitToFinish.shift()()\n }\n\n /** Enqueue task to be executed when all other tasks are done. Except `immediate = true`. */\n async enqueue<T>(\n task: TaskFn<T>,\n opt: { immediate?: boolean; name?: string } = {},\n ): Promise<T> {\n const { immediate = false, name = uname(this.name) } = opt\n if (immediate) {\n this.log.info(`immediate execution ${name}`)\n return await task()\n }\n\n this.log(`enqueue ${name}`)\n return new Promise((resolve) => {\n this.queue.push({\n name,\n task,\n resolve,\n })\n\n this.countMax += 1\n void this.emit('didUpdate', this.countMax, this.countResolved)\n\n void this.performNext()\n })\n }\n\n /** If a task is already performing, execute immediately. Otherwise enqueue as usual. */\n async enqueueReentrant<T>(\n task: TaskFn<T>,\n opt: { name?: string } = {},\n ): Promise<T> {\n return this.enqueue(task, {\n immediate: this.currentTask != null,\n name: opt.name,\n })\n }\n\n /** Remove all tasks from queue that are not yet executing. */\n async cancelAll(_unblock = true) {\n this.log('cancelAll')\n void this.emit('didCancel')\n const resolver = this.queue.map(task => task.resolve)\n this.queue = []\n resolver.forEach(r => r(undefined))\n await this.wait()\n }\n\n /** Pause execution after current task is finished. */\n async pause() {\n this.log('pause')\n this.paused = true\n await this.wait()\n }\n\n /** Resume paused queue. */\n resume() {\n this.log('resume')\n this.paused = false\n void this.performNext()\n }\n\n /** Wait for all tasks to finish */\n async wait() {\n this.log('wait')\n if (this.currentTask == null && (this.queue.length === 0 || this.paused))\n return\n\n return new Promise((resolve) => {\n this.waitToFinish.push(resolve)\n })\n }\n\n public get isPaused(): boolean {\n return this.paused\n }\n\n public get hasTasks(): boolean {\n return this.queue.length !== 0\n }\n}\n","// General explaination https://css-tricks.com/debouncing-throttling-explained-examples/\n// From https://github.com/cowboy/jquery-throttle-debounce\n// And https://github.com/wuct/raf-throttle/blob/master/rafThrottle.js\n\nimport { Logger } from '../log'\nimport { promisify } from './promise'\n\nconst DEBUG = false\nconst log = DEBUG ? Logger('zeed:throttle', 'error') : () => {}\n\n/**\n * A special throttle implementation that tries to distribute execution\n * in an optimal way.\n *\n * **Functionality:** For UI usage the function is executed on first occasion (`leading`).\n * If more calls follow it will again be executed at end (`trailing`).\n * If the next call is inside the timeframe, it is delayed until `trailing`.\n * This avoids timewise too close calls.\n * It is possible to `cancel` the timeout and to `flush` a call, e.g. if\n * leaving UI situation where a final call is required to write data or similar.\n */\nexport function throttle<F extends (...args: any[]) => any>(\n callback: F,\n opt: {\n delay?: number\n trailing?: boolean\n leading?: boolean\n } = {},\n): F & {\n /** Stop all timers, do not exec nothing */\n cancel: () => void\n\n /** Stop all timers and execute right now. */\n immediate: (...args: Parameters<F>) => Promise<void>\n\n /** Stop all timers and execute trailing call, if exists. */\n stop: () => void\n\n dispose: () => void\n } {\n const { delay = 100, trailing = true, leading = true } = opt\n\n let timeoutID: any = 0\n let checkpoint = 0\n let visited = 0\n let trailingExec: Function | undefined\n\n const debugCheckpoint = Date.now()\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID)\n timeoutID = undefined\n return true\n }\n return false\n }\n\n function wrapper(this: any, ...args: any[]) {\n const now = Date.now()\n const elapsed = now - checkpoint\n\n function debugElapsed() {\n const dnow = Date.now()\n return `total ${(dnow - debugCheckpoint).toFixed(1)}ms - elapsed ${(\n dnow - checkpoint\n ).toFixed(1)}ms - visited ${visited}x`\n }\n\n const exec = () => {\n visited = 0\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n trailingExec = exec\n\n // Make sure enough time has passed since last call\n if (elapsed > delay || !timeoutID) {\n DEBUG && log('elapsed', debugElapsed())\n\n // Leading execute once immediately\n if (leading) {\n if (elapsed > delay) {\n DEBUG && log('🚀 leading', debugElapsed())\n exec()\n }\n else {\n ++visited // at least trigger trailing this way\n }\n }\n\n const timeout = elapsed > delay ? delay : delay - elapsed\n log(`⏱ start timeout with ${timeout.toFixed(1)}ms`, debugElapsed())\n\n // Prepare for next round\n clearExistingTimeout()\n checkpoint = now\n\n // Delay. We should not get here if timeout has not been reached before\n timeoutID = setTimeout(() => {\n DEBUG && log('⏱ reached timeout', debugElapsed())\n timeoutID = 0\n // Only execute on trailing or when visited again, but do not twice if leading\n if (trailing && (!leading || visited > 0)) {\n DEBUG && log('🚀 trailing', debugElapsed())\n trailingExec?.()\n }\n }, timeout)\n }\n else {\n // Count visits\n ++visited\n DEBUG && log('visited', debugElapsed())\n }\n }\n\n wrapper.cancel = clearExistingTimeout\n\n wrapper.stop = () => {\n if (clearExistingTimeout() && trailingExec)\n trailingExec()\n }\n\n wrapper.immediate = async function immediate(this: any, ...args: Parameters<F>[]) {\n clearExistingTimeout()\n checkpoint = Date.now()\n callback.apply(this, args)\n }\n\n wrapper.dispose = () => wrapper.stop()\n\n return wrapper as any\n}\n\n/**\n * Debounce fits best for filtering a large peak of events.\n * For UI event filtering throttle is probably a better choice.\n *\n * **Functionality:** It only fires after triggers pause for `delay` ms.\n */\nexport function debounce<F extends (...args: any[]) => any | Promise<any>>(\n callback: F,\n opt: {\n delay?: number\n } = {},\n): F & {\n cancel: () => void\n immediate: (...args: Parameters<F>) => Promise<void>\n dispose: () => void\n } {\n const { delay = 100 } = opt\n let timeoutID: any = 0\n\n let running = false\n let lastArguments: any[] | undefined\n\n function clearExistingTimeout() {\n if (timeoutID) {\n log('clear')\n clearTimeout(timeoutID)\n timeoutID = 0\n }\n }\n\n async function exec() {\n try {\n clearExistingTimeout()\n if (lastArguments != null) {\n log('exec')\n const args = [...lastArguments]\n lastArguments = undefined\n running = true\n await promisify(callback(...args))\n running = false\n log('exec done')\n if (lastArguments != null) {\n clearExistingTimeout()\n log('exec trigger next')\n timeoutID = setTimeout(exec, delay)\n }\n }\n }\n catch (err) { }\n }\n\n function wrapper(this: any, ...args: any[]) {\n lastArguments = [...args]\n clearExistingTimeout()\n log('trigger')\n if (running === false)\n timeoutID = setTimeout(exec, delay)\n }\n\n async function immediate(this: any, ...args: any[]) {\n clearExistingTimeout()\n lastArguments = [...args]\n await exec()\n }\n wrapper.cancel = clearExistingTimeout\n wrapper.dispose = clearExistingTimeout\n wrapper.immediate = immediate\n\n return wrapper as any\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function isLocalHost(\n hostname: string = globalThis?.location?.hostname ?? '',\n): boolean {\n return (\n ['::ffff:127.0.0.1', 'localhost', '127.0.0.1', '', '::1', '::'].includes(\n hostname,\n )\n || hostname.startsWith('192.168.')\n || hostname.startsWith('10.0.')\n || hostname.endsWith('.local')\n )\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport type { LogHandler, LogHandlerOptions, LogMessage } from './log-base'\nimport { useLevelFilter, useNamespaceFilter } from './log-filter'\n\n/**\n * Collect messages in a list.\n *\n * @param level Log level\n * @returns Logger\n */\nexport function LoggerMemoryHandler(\n opt: LogHandlerOptions & {\n messages: LogMessage[]\n },\n): LogHandler {\n const { level = undefined, filter = undefined, messages = [] } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n messages.push(msg)\n }\n}\n","import {\n arrayFlatten,\n deepMerge,\n isArray,\n jsonStringifySafe,\n toBase64,\n} from './data'\nimport { encodeQuery } from './data/url'\nimport { Logger } from './log'\nimport type { Json } from './types'\n\nconst log = Logger('zeed:network', 'error')\n\ninterface fetchOptionType {\n /** Returns the cache mode associated with request, which is a string indicating how the request will interact with the browser's cache when fetching. */\n cache?: RequestCache\n /** Returns the credentials mode associated with request, which is a string indicating whether credentials will be sent with the request always, never, or only when sent to a same-origin URL. */\n credentials?: RequestCredentials\n /** Returns the kind of resource requested by request, e.g., \"document\" or \"script\". */\n destination?: RequestDestination\n /** Returns a Headers object consisting of the headers associated with request. Note that headers added in the network layer by the user agent will not be accounted for in this object, e.g., the \"Host\" header. */\n headers?: Record<string, string>\n /** Returns request's subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of multiple hashes separated by whitespace. [SRI] */\n integrity?: string\n /** Returns a boolean indicating whether or not request can outlive the global in which it was created. */\n keepalive?: boolean\n /** Returns request's HTTP method, which is \"GET\" by default. */\n method?: string\n /** Returns the mode associated with request, which is a string indicating whether the request will use CORS, or will be restricted to same-origin URLs. */\n mode?: RequestMode\n /** Returns the redirect mode associated with request, which is a string indicating how redirects for the request will be handled during fetching. A request will follow redirects by default. */\n redirect?: RequestRedirect\n /** Returns the referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to indicate no referrer, and \"about:client\" when defaulting to the global's default. This is used during fetching to determine the value of the `Referer` header of the request being made. */\n referrer?: string\n /** Returns the referrer policy associated with request. This is used during fetching to compute the value of the request's referrer. */\n referrerPolicy?: ReferrerPolicy\n /** Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has been aborted, and its abort event handler. */\n signal?: AbortSignal\n /** Returns the URL of request as a string. */\n url?: string\n body?: any\n}\n\ntype fetchOptionsType = fetchOptionType | fetchOptionsType[]\n\nconst defaultOptions: fetchOptionType = {\n cache: 'no-cache',\n redirect: 'follow',\n headers: {},\n}\n\n// Source https://developer.mozilla.org/de/docs/Web/HTTP/Methods\nexport type httpMethod =\n | 'GET'\n | 'POST'\n | 'PUT'\n | 'DELETE'\n | 'HEAD'\n | 'CONNECT'\n | 'OPTIONS'\n | 'TRACE'\n | 'PATCH'\n\nexport function parseBasicAuth(url: string) {\n const m = /:\\/\\/([^@]*)@/gi.exec(url)\n if (m && m[1]) {\n const [username, password] = m[1].split(':', 2)\n return {\n url: url.replace(`${m[1]}@`, ''),\n username,\n password,\n }\n }\n}\n\n/** Simplified `fetch` that returns `undefined` on non 200 status */\nexport async function fetchBasic(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<Response | undefined> {\n try {\n if (isArray(fetchOptions))\n fetchOptions = deepMerge({}, ...arrayFlatten(fetchOptions))\n\n const auth = parseBasicAuth(String(url))\n if (auth) {\n url = auth.url\n fetchOptions = deepMerge(\n {},\n fetchOptions,\n fetchOptionsBasicAuth(auth.username, auth.password),\n )\n }\n\n if (\n // @ts-expect-error headers\n fetchOptions.headers != null\n // @ts-expect-error headers\n && !(fetchOptions.headers instanceof Headers)\n ) {\n // @ts-expect-error headers\n fetchOptions.headers = new Headers(fetchOptions.headers)\n }\n\n // log(\"fetch\", url, fetchOptions)\n const response = await fetchFn(String(url), fetchOptions as RequestInit)\n\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n if (response.status < 400)\n return response\n\n try {\n log.warn(`Fetch of ${String(url)} returned status=${response.status}. Options:`, fetchOptions)\n log.warn(`Response: ${await response.text()}`)\n }\n catch (err) {\n log.error('Exception:', err)\n }\n }\n catch (err) {\n log.error('fetchBasic', err)\n }\n}\n\n/** Fetch for JSON */\nexport async function fetchJson<T = Json>(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<T | undefined> {\n try {\n const res = await fetchBasic(\n url,\n [\n {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n },\n fetchOptions,\n ],\n fetchFn,\n )\n if (res)\n return await res.json()\n }\n catch (err) {\n log.error('fetchJSON error:', err)\n }\n}\n\n/** Fetch for text */\nexport async function fetchText(\n url: string | URL,\n fetchOptions: fetchOptionsType = {},\n fetchFn: (input: RequestInfo, init?: RequestInit) => Promise<Response> = fetch,\n): Promise<string | undefined> {\n try {\n const res = await fetchBasic(\n url,\n [defaultOptions, { method: 'GET' }, fetchOptions],\n fetchFn,\n )\n if (res)\n return await res.text()\n }\n catch (err) {\n log.error('fetchHTML error:', err)\n }\n}\n\n///\n\n/** Options for fetchBasic to send data as application/x-www-form-urlencoded */\nexport function fetchOptionsFormURLEncoded(\n data: object,\n method: httpMethod = 'POST',\n): fetchOptionType {\n return {\n method,\n ...defaultOptions,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',\n },\n body: encodeQuery(data),\n }\n}\n\n/** Options to send data as JSON */\nexport function fetchOptionsJson(\n data: object,\n method: httpMethod = 'POST',\n): fetchOptionType {\n return {\n method,\n ...defaultOptions,\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n // Accept: \"application/json\",\n },\n body: jsonStringifySafe(data),\n }\n}\n\n/** Options to pass basic auth */\nexport function fetchOptionsBasicAuth(\n username: string,\n password: string,\n): fetchOptionType {\n return {\n headers: {\n Authorization: `Basic ${toBase64(`${username}:${password}`)}`,\n },\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nexport function getWindow(): any | undefined {\n if (typeof window !== 'undefined')\n return window\n}\n\nexport function getNavigator(): any | undefined {\n if (typeof navigator !== 'undefined')\n return navigator\n}\n\nexport function getGlobal(): any {\n return getWindow()\n // @ts-expect-error xxx\n ?? typeof WorkerGlobalScope !== 'undefined'\n ? self\n : typeof global !== 'undefined'\n ? global\n // eslint-disable-next-line no-new-func, @typescript-eslint/no-implied-eval\n : Function('return this;')()\n}\n\n// todo sideffects\nconst _navigator = getNavigator()\nconst _window = getWindow()\n\nexport function detect(\n info = {\n ios: false,\n macos: false,\n windows: false,\n beaker: false,\n electron: false,\n wkwebview: false,\n pwa: false,\n pwaInstalled: false,\n browser: false,\n node: false,\n worker: false,\n test: false,\n jest: false,\n macosNative: false,\n iosNative: false,\n appleNative: false,\n touch: false,\n },\n) {\n info.ios = _navigator?.platform?.match(/(iPhone|iPod|iPad)/i) != null\n info.macos = !!_navigator?.platform?.startsWith('Mac')\n info.windows = !!_navigator?.platform?.startsWith('Win')\n\n info.beaker = _window?.beaker != null // https://github.com/beakerbrowser/beaker\n info.electron\n = (_navigator?.userAgent?.toLowerCase()?.indexOf(' electron/') || -1) > -1\n && !info.beaker\n info.wkwebview = _window?.webkit?.messageHandlers != null // Apple embedded\n\n info.pwa = _navigator?.serviceWorker != null\n\n info.pwaInstalled = _navigator?.standalone\n || _window?.matchMedia?.('(display-mode: standalone)')?.matches\n\n info.node\n = typeof process !== 'undefined' && process?.release?.name === 'node'\n info.browser = !info.electron && !info.wkwebview && !info.node\n\n // info.worker = typeof importScripts === 'function'\n info.worker\n // @ts-expect-error xxx\n = typeof WorkerGlobalScope !== 'undefined'\n // @ts-expect-error xxx\n && self instanceof WorkerGlobalScope\n // @ts-expect-error xxx\n info.jest = typeof jest !== 'undefined' || typeof vitest !== 'undefined'\n info.test = info.jest\n\n info.macosNative = info.wkwebview && info.macos\n info.iosNative = info.wkwebview && info.ios\n info.appleNative = info.wkwebview\n\n // https://github.com/viljamis/feature.js/blob/master/feature.js#L203\n info.touch\n = (_window && 'ontouchstart' in _window)\n || (_navigator?.maxTouchPoints || 0) > 1\n || (_navigator?.msPointerEnabled && _window?.MSGesture)\n // @ts-expect-error xxx\n || (_window?.DocumentTouch && document instanceof DocumentTouch)\n\n return info\n}\n\n// https://stackoverflow.com/a/31090240/140927\n// export const isBrowser = new Function(\n// \"try {return this===window;}catch(e){ return false;}\"\n// )\n\n// export const isNode = new Function(\n// \"try {return this===global;}catch(e){return false;}\"\n// )\n\nexport const isBrowser = () =>\n typeof window !== 'undefined' && globalThis === window\n\nexport const platform = detect()\n\n/**\n * Before closing the tab/window or quitting the node process\n * allow to do something important first\n */\nexport function useExitHandler(handler: () => void) {\n if (isBrowser())\n window.addEventListener('beforeunload', handler)\n else if (typeof process !== 'undefined')\n process.on('exit', () => handler)\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { cloneObject } from '../data/utils'\nimport type { Json, ObjectStorage } from '../types'\n\n// const log = Logger('zeed:memstorage', 'error')\n\nexport interface MemStorageOptions {\n objectFromString?: (data: string) => any\n objectToString?: (data: any) => string\n}\n\nexport class MemStorage<T = Json> implements ObjectStorage<T> {\n private store: Record<string, T> = {}\n // private pretty: boolean = false\n // private objectFromString: (data: string) => any\n // private objectToString: (data: any) => string\n\n constructor(_opt: MemStorageOptions = {}) {\n // this.objectToString =\n // opt.objectToString ??\n // ((data: any): string => {\n // return this.pretty\n // ? JSON.stringify(data, null, 2)\n // : JSON.stringify(data)\n // })\n // this.objectFromString =\n // opt.objectFromString ??\n // ((data: string) => {\n // try {\n // return JSON.parse(data)\n // } catch (err) {\n // log.warn(`MemStorage parse error '${err}' in`, data)\n // }\n // })\n }\n\n setItem(key: string, value: T): void {\n // const data = this.objectToString(value)\n this.store[key] = cloneObject(value)\n }\n\n getItem(key: string): T | undefined {\n return cloneObject(this.store[key])\n }\n\n removeItem(key: string): void {\n delete this.store[key]\n }\n\n clear(): void {\n this.store = {}\n }\n\n allKeys(): string[] {\n return Object.keys(this.store)\n }\n}\n","export const noop = () => {}\n","// Inspired by https://github.com/kof/node-argsparser/blob/master/lib/argsparser.js\n\nimport { toCamelCase } from '../common/data/camelcase'\n\ninterface ParseConfig {\n args?: string[]\n alias?: Record<string, string[]>\n normalize?: (value: string) => string\n booleanArgs?: string | string[]\n listArgs?: string | string[]\n numberArgs?: string | string[]\n}\n\nexport function parseArgs(config: ParseConfig = {}) {\n const {\n args = process.argv.slice(1),\n alias = {},\n normalize = toCamelCase,\n booleanArgs = [],\n listArgs = [],\n numberArgs = [],\n } = config\n\n const nameToAlias = Object.entries(alias).reduce((map, curr) => {\n let [name, values] = curr\n if (typeof values === 'string')\n values = [values]\n for (const value of values)\n map[normalize(value)] = normalize(name)\n\n return map\n }, {} as any)\n\n const opts: Record<string, any> = {\n _: [],\n }\n\n function setOpt(name: string, value: any) {\n if (opts[name] == null)\n opts[name] = value\n\n else if (typeof opts[name] === 'boolean')\n opts[name] = value\n\n else if (Array.isArray(opts[name]))\n opts[name].push(value)\n\n else\n opts[name] = [opts[name], value]\n }\n\n const argList = [...args]\n let arg: string | undefined\n\n // eslint-disable-next-line no-cond-assign\n while ((arg = argList.shift())) {\n let value: any\n if (/^--?/.test(arg)) {\n let key = arg.replace(/^--?/, '')\n if (arg.includes('=')) {\n const [name, valuePart] = key.split('=', 2)\n key = name.trim()\n value = valuePart.trim()\n }\n key = normalize(key)\n key = nameToAlias[key] ?? key\n if (booleanArgs.includes(key)) {\n setOpt(key, true)\n }\n else {\n value = value ?? argList.shift() ?? ''\n if (numberArgs.includes(key))\n value = Number(value ?? 0)\n\n if (listArgs.includes(key)) {\n if (Array.isArray(opts[key]))\n opts[key].push(value)\n\n else\n opts[key] = [value]\n }\n else {\n setOpt(key, value)\n }\n }\n }\n else {\n opts._.push(arg)\n }\n }\n\n return opts\n}\n","/** Copy string to clipboard */\nexport function pbcopy(data: string) {\n return new Promise(\n (resolve, reject) => {\n import('child_process').then(({ spawn }) => {\n const proc = spawn('pbcopy')\n proc.on('error', (err: any) => reject(err))\n proc.on('close', () => resolve(data))\n proc.stdin.write(data)\n proc.stdin.end()\n }).catch(() => {})\n })\n}\n","// https://nodejs.org/api/webcrypto.html\nimport nodeCrypto from 'node:crypto'\n\nexport {}\n\n// declare namespace NodeJS {\n// interface Global {\n// crypto: Crypto\n// }\n// }\n\n// todo sideffects\ntry {\n if (\n typeof globalThis !== 'undefined'\n && typeof globalThis.crypto === 'undefined'\n && nodeCrypto\n && nodeCrypto.webcrypto\n ) {\n // @ts-expect-error this is a workaround for node environment\n globalThis.crypto = nodeCrypto.webcrypto\n }\n}\ncatch (err) {\n console.warn('Failed to polyfill webcrypto', err)\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-unused-vars\n// declare namespace NodeJS {\n// interface Global {\n// crypto: Crypto\n// }\n// }\n\n// export async function getCrypto() {\n// if (!globalThis.crypto) {\n// try {\n// if (typeof globalThis !== 'undefined' && typeof globalThis.crypto === 'undefined') {\n// // https://nodejs.org/api/webcrypto.html\n// // @ts-expect-error this is a workaround for node environment\n// globalThis.crypto = await import('crypto')\n// }\n// }\n// catch (err) {\n// console.warn('Failed to polyfill webcrypto', err)\n// }\n// }\n// return globalThis.crypto\n// }\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\n// Adopted from https://github.com/motdotla/dotenv BSD-2\n\nimport fs from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Logger } from '../common/log'\nimport { LogLevel } from '../common/log-base'\n\nconst log = Logger('zeed:env', 'error')\n\nconst NEWLINE = '\\n'\nconst RE_INI_KEY_VAL = /^\\s*([\\w_.-]+)\\s*=\\s*(.*)?\\s*$/\nconst RE_NEWLINES = /\\\\n/g\nconst NEWLINES_MATCH = /\\n|\\r|\\r\\n/\n\ninterface csvOptions {\n /** @deprecated will probably be replaced by logLevel */\n debug?: boolean\n path?: string\n filename?: string\n encoding?: BufferEncoding\n prefix?: string\n env?: Record<string, string>\n}\n\n// Parses src into an Object\nfunction parse(src: string, _options: csvOptions = {}) {\n const obj: Record<string, string> = {}\n\n // convert Buffers before splitting into lines and processing\n String(src)\n .split(NEWLINES_MATCH)\n .forEach((line, idx) => {\n // matching \"KEY' and 'VAL' in 'KEY=VAL'\n const keyValueArr = line.match(RE_INI_KEY_VAL)\n // matched?\n\n // log.debug(\"keyValueArr\", keyValueArr)\n\n if (keyValueArr != null) {\n const key = keyValueArr[1]\n // default undefined or missing values to empty string\n let val = keyValueArr[2] || ''\n const end = val.length - 1\n const isDoubleQuoted = val[0] === '\"' && val[end] === '\"'\n const isSingleQuoted = val[0] === '\\'' && val[end] === '\\''\n\n // if single or double quoted, remove quotes\n if (isSingleQuoted || isDoubleQuoted) {\n val = val.substring(1, end)\n\n // if double quoted, expand newlines\n if (isDoubleQuoted)\n val = val.replace(RE_NEWLINES, NEWLINE)\n }\n else {\n // remove surrounding whitespace\n val = val.trim()\n }\n obj[key] = val\n }\n else {\n log.debug(\n `did not match key and value when parsing line ${idx + 1}: ${line}`,\n )\n }\n })\n\n // log.debug(\"obj\", obj)\n return obj\n}\n\n/**\n * Return a path relative to the current working directory\n */\nexport function stringToPath(\n value?: string,\n defaultValue = '.',\n): string {\n return resolve(process.cwd(), value ?? defaultValue)\n}\n\nexport function valueToPath(value?: any, defaultValue = ''): string {\n if (value == null)\n value = defaultValue\n return stringToPath(String(value).trim(), defaultValue)\n}\n\nexport const toPath = valueToPath\n\nexport function getEnvVariableRelaxed(\n name: string,\n env = process.env,\n): string | undefined {\n if (env[name] != null)\n return env[name]\n name = name.toLowerCase()\n for (const [k, v] of Object.entries(env)) {\n if (k.toLowerCase() === name)\n return v\n }\n}\n\n/** Populates process.env from .env file. */\nexport function setupEnv(options: csvOptions = {}) {\n const dotenvPath: string\n = options?.path ?? toPath(options?.filename ?? '.env')\n const encoding: BufferEncoding = options?.encoding ?? 'utf8'\n const debug = options?.debug || false\n\n if (debug !== true)\n log.level = LogLevel.off\n\n try {\n // specifying an encoding returns a string instead of a buffer\n const parsedEnv = fs.existsSync(dotenvPath)\n ? parse(fs.readFileSync(dotenvPath, { encoding }), { debug })\n : {}\n const parsedEnvLocal = fs.existsSync(`${dotenvPath}.local`)\n ? parse(fs.readFileSync(`${dotenvPath}.local`, { encoding }), { debug })\n : {}\n\n const parsed: Record<string, string> = Object.assign(\n {},\n parsedEnv,\n parsedEnvLocal,\n )\n const env = options?.env ?? process.env\n\n Object.entries(parsed).forEach(([key, value]) => {\n if (typeof options?.prefix === 'string')\n key = options?.prefix + key\n\n if (!Object.prototype.hasOwnProperty.call(env, key)) {\n if (value != null) {\n log.info(`set env.${key} = ${value}`)\n env[key] = value\n }\n }\n else {\n log.debug(`\"${key}\" is already defined and will not be overwritten`)\n }\n })\n return { parsed }\n }\n catch (e) {\n log.error(e)\n return { error: e }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport {\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n unlinkSync,\n writeFileSync,\n} from 'fs'\nimport { dirname, resolve } from 'node:path'\nimport { jsonStringifySafe } from '../common/data/json'\nimport { toValidFilename } from '../common/data/path'\nimport { cloneObject } from '../common/data/utils'\nimport { Logger } from '../common/log'\nimport type { Json, ObjectStorage } from '../common/types'\n\nconst log = Logger('zeed:filestorage', 'error')\n\nexport interface FileStorageOptions {\n pretty?: boolean\n path?: string\n extension?: string\n objectFromString?: (data: string) => any\n objectToString?: (data: any) => string\n keyToFilename?: (key: string) => string\n}\n\nexport class FileStorage<T = Json> implements ObjectStorage<T> {\n private store: Record<string, T | null> = {}\n private dirname: string\n private fileKeys?: string[] = undefined\n private pretty = false\n private extension: string\n private extensionLength: number\n private objectFromString: (data: string) => any\n private objectToString: (data: any) => string\n private keyToFilename: (key: string) => string\n\n constructor(opt: FileStorageOptions = {}) {\n this.dirname = resolve(process.cwd(), opt.path ?? '.fileStorage')\n this.pretty = !!opt.pretty\n this.extension = opt.extension ?? '.json'\n\n if (opt.extension && !this.extension.startsWith('.'))\n this.extension = `.${this.extension}`\n\n this.extensionLength = this.extension.length\n\n this.objectToString\n = opt.objectToString\n ?? ((data: any): string => {\n return this.pretty\n ? jsonStringifySafe(data, null, 2)\n : jsonStringifySafe(data)\n })\n\n this.objectFromString\n = opt.objectFromString\n ?? ((data: string) => {\n try {\n return JSON.parse(data)\n }\n catch (err) {\n log.warn(`fileStorage parse error '${err}' in`, data)\n }\n })\n\n this.keyToFilename = opt.keyToFilename ?? toValidFilename\n }\n\n setItem(key: string, value: T): void {\n this.store[key] = cloneObject(value)\n try {\n const data = this.objectToString(value)\n const path = this.getPath(key)\n mkdirSync(dirname(path), { recursive: true })\n writeFileSync(path, data, 'utf8')\n }\n catch (err) {\n log.error('setItem error', err)\n }\n }\n\n getPath(key: string): string {\n return resolve(this.dirname, this.keyToFilename(key) + this.extension)\n }\n\n getBuffer(key: string): Buffer {\n const path = this.getPath(key)\n return Buffer.from(readFileSync(path))\n }\n\n getItem(key: string): T | undefined {\n const value = this.store[key]\n\n // null is an indicator for not existing!\n if (value === null)\n return\n\n if (value != null)\n return cloneObject(value) // this.objectFromString(value)\n\n try {\n const path = this.getPath(key)\n const data = readFileSync(path, 'utf8')\n if (data != null) {\n const value = this.objectFromString(data)\n this.store[key] = value\n return value\n }\n }\n catch (err) {\n // log.warn(\"getItem error\", err)\n this.store[key] = null // do not retry next time\n }\n }\n\n removeItem(key: string): void {\n delete this.store[key]\n if (this.fileKeys != null) {\n const index: number = this.fileKeys.indexOf(key)\n if (index !== -1)\n this.fileKeys.splice(index, 1)\n }\n try {\n const path = this.getPath(key)\n unlinkSync(path)\n }\n catch (err) {}\n }\n\n clear(): void {\n this.fileKeys = []\n this.store = {}\n rmSync(this.dirname, { recursive: true, force: true })\n }\n\n allKeys(): string[] {\n if (this.fileKeys == null) {\n try {\n this.fileKeys\n = readdirSync(this.dirname, { withFileTypes: true })\n .filter(\n item =>\n !item.isDirectory() && item.name.endsWith(this.extension),\n )\n .map(item => item.name.slice(0, -this.extensionLength)) || []\n }\n catch (err) {}\n }\n const keys = [...(this.fileKeys || [])]\n for (const key of Object.keys(this.store)) {\n if (!keys.includes(key))\n keys.push(key)\n }\n keys.sort()\n return keys\n }\n}\n","import { mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises'\nimport { join as joinPath, normalize } from 'node:path'\n\nexport function toHumanReadableFilePath(path: string) {\n const p = normalize(path)\n const h = process.env.HOME\n if (h && p.startsWith(h))\n return `~${p.slice(h.length)}`\n\n return p\n}\n\nexport async function exists(path: string): Promise<boolean> {\n try {\n await stat(path)\n }\n catch (err) {\n return false\n }\n return true\n}\n\nexport async function ensureFolder(...parts: string[]): Promise<string> {\n const path = joinPath(...parts)\n if (!(await exists(path)))\n await mkdir(path, { recursive: true })\n\n return path\n}\n\nexport async function removeFolder(...parts: string[]): Promise<string> {\n const path = joinPath(...parts)\n if (await exists(path))\n await rm(path, { recursive: true })\n\n return path\n}\n\nexport async function readText(\n ...parts: string[]\n): Promise<string | undefined> {\n const path = joinPath(...parts)\n if (await exists(path))\n return await readFile(path, 'utf-8')\n}\n\nexport async function writeText(path: string, content: string): Promise<void> {\n await writeFile(path, content, 'utf-8')\n}\n\n// todo: writeBinary, readBinary\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { createWriteStream, mkdirSync } from 'fs'\nimport { dirname, resolve } from 'path'\nimport { renderMessages } from '../common/data/convert'\nimport type { LogHandlerOptions, LogMessage } from '../common/log-base'\nimport { LogLevel } from '../common/log-base'\nimport { useLevelFilter, useNamespaceFilter } from '../common/log-filter'\n\nconst namespaces: Record<string, any> = {}\n\nexport function LoggerFileHandler(path: string, opt: LogHandlerOptions = {}) {\n const {\n level = undefined,\n filter = undefined,\n time = true,\n pretty = false,\n } = opt\n path = resolve(process.cwd(), path)\n mkdirSync(dirname(path), { recursive: true })\n const stream = createWriteStream(path, { flags: 'a' })\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n\n const timeNow = time ? `${new Date().toISOString()} ` : ''\n const name = msg.name || ''\n const ninfo = namespaces[name || '']\n if (ninfo == null)\n namespaces[name] = ninfo\n\n const args: string[] = [\n `[${name || '*'}]`,\n renderMessages(msg.messages, { pretty }),\n ]\n\n function write(...args: string[]): void {\n stream.write(`${args.join('\\t')}\\n`)\n }\n\n switch (msg.level) {\n case LogLevel.info:\n write(`${timeNow}I|* `, ...args)\n break\n case LogLevel.warn:\n write(`${timeNow}W|** `, ...args)\n break\n case LogLevel.error:\n write(`${timeNow}E|***`, ...args)\n break\n default:\n write(`${timeNow}D| `, ...args)\n break\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport tty from 'node:tty'\nimport { renderMessages, valueToBoolean } from '../common/data/convert'\nimport type { LogHandler, LogHandlerOptions, LogMessage } from '../common/log-base'\nimport { LogLevel } from '../common/log-base'\nimport { useLevelFilter, useNamespaceFilter } from '../common/log-filter'\nimport { formatMilliseconds, getTimestamp } from '../common/time'\nimport { getSourceLocation, getSourceLocationByPrecedingPattern, getStack } from './log-util'\n\nfunction shouldUseColor(): boolean {\n try {\n return valueToBoolean(process.env.ZEED_COLOR, tty.isatty(process.stdout.fd))\n }\n catch (err) {}\n return false\n}\n\nlet defaultUseColor: boolean | undefined\n\nconst colors = [6, 2, 3, 4, 5, 1]\n\nfunction selectColor(namespace: string) {\n let hash = 0\n for (let i = 0; i < namespace.length; i++) {\n hash = (hash << 5) - hash + namespace.charCodeAt(i)\n hash |= 0 // Convert to 32bit integer\n }\n return colors[Math.abs(hash) % colors.length]\n}\n\nconst namespaces: Record<string, any> = {}\n\nlet startTime: number | undefined\n\nfunction log(...args: any[]) {\n process.stdout.write(`${renderMessages(args)}\\n`)\n}\n\n// const _browserStyleMap = {\n// [BOLD]: { \"font-weight\": \"bold\" },\n// [UNBOLD]: { \"font-weight\": \"normal\" },\n// [BLUE]: { color: \"blue\" },\n// [GREEN]: { color: \"green\" },\n// [GREY]: { color: \"grey\" },\n// [RED]: { color: \"red\" },\n// [PURPLE]: { color: \"purple\" },\n// [ORANGE]: { color: \"orange\" },\n// [UNCOLOR]: { color: \"black\" },\n// }\n\nconst TTY_STYLE = {\n BOLD: '\\u001B[1m',\n UNBOLD: '\\u001B[2m',\n RED: '\\u001B[31m',\n GREEN: '\\u001B[32m',\n BLUE: '\\u001B[34m',\n PURPLE: '\\u001B[35m',\n GRAY: '\\u001B[37m',\n ORANGE: '\\u001B[38;5;208m',\n UNCOLOR: '\\u001B[0m',\n}\n\nenum COLOR {\n RED = 1,\n GREEN = 2,\n BLUE = 4,\n PURPLE = 5,\n GRAY = 7,\n ORANGE = 8,\n}\n\nconst colorEnd = '\\u001B[0m'\n\nexport function colorString(text: string, colorCode: number) {\n const colorStart = colorCode === COLOR.ORANGE\n ? TTY_STYLE.ORANGE\n : `\\u001B[3${colorCode < 8 ? colorCode : `8;5;${colorCode}`}m`\n return `${colorStart}${text}${colorEnd}`\n}\n\nexport function colorStringList(\n list: Array<any>,\n style: string,\n bold = true,\n) {\n return list.map((value) => {\n if (typeof value !== 'string')\n return value\n let start = style\n let end = colorEnd\n if (bold) {\n start = `${TTY_STYLE.BOLD}${start}`\n end = `${end}${TTY_STYLE.BOLD}`\n }\n return `${start}${value}${end}`\n })\n}\n\nexport const loggerStackTraceDebug = 'loggerStackTraceDebug-7d38e5a9214b58d29734374cdb9521fd964d7485'\n\nexport function LoggerNodeHandler(opt: LogHandlerOptions = {}): LogHandler {\n if (defaultUseColor == null)\n defaultUseColor = shouldUseColor()\n\n if (startTime == null)\n startTime = getTimestamp()\n\n const {\n level = undefined,\n filter = undefined,\n colors = defaultUseColor,\n levelHelper = true,\n nameBrackets = true,\n padding = 0,\n fill = 0,\n stack = true,\n time = true,\n } = opt\n const matchesNamespace = useNamespaceFilter(filter)\n const matchesLevel = useLevelFilter(level)\n return (msg: LogMessage) => {\n if (!matchesLevel(msg.level))\n return\n if (!matchesNamespace(msg.name))\n return\n const timeNow = getTimestamp()\n const name = msg.name || ''\n let ninfo = namespaces[name || '']\n if (ninfo == null) {\n ninfo = {\n color: selectColor(name),\n // time: timeNow\n }\n namespaces[name] = ninfo\n }\n const timeDiffString = formatMilliseconds(timeNow - startTime!)\n\n let args: string[]\n\n let displayName = nameBrackets ? `[${name}]` : name\n\n if (padding > 0)\n displayName = displayName.padStart(padding, ' ')\n\n if (fill > 0)\n displayName = displayName.padEnd(fill, ' ')\n\n if (colors) {\n const c = ninfo.color\n args = [`${colorString(displayName, c)} | `] // nameBrackets ? [`%c[${name}]`] : [`%c${name}`]\n if (msg.level === LogLevel.warn)\n args.push(...colorStringList(msg.messages, TTY_STYLE.ORANGE))\n else if (msg.level === LogLevel.error)\n args.push(...colorStringList(msg.messages, TTY_STYLE.RED))\n else\n args.push(...msg.messages)\n if (time)\n args.push(colorString(`+${timeDiffString}`, c))\n }\n else {\n args = [displayName, ...msg.messages]\n if (time)\n args.push(`+${timeDiffString}`)\n }\n\n if (msg.messages?.[0] === loggerStackTraceDebug) {\n // eslint-disable-next-line no-console\n console.log(getStack())\n }\n\n if (stack) {\n let line = ''\n if (typeof stack === 'boolean') {\n line = getSourceLocationByPrecedingPattern(\n ['at Function.', 'at null.log (', 'at log ('],\n true,\n )\n if (!line)\n line = getSourceLocation(0, true)\n }\n else {\n const depth = typeof stack === 'number' ? stack : 3\n line = getSourceLocation(depth, true)\n }\n if (line)\n args.push(colorString(`(${line})`, COLOR.GRAY))\n }\n const sep = '|'\n const charLevel = '.'\n\n switch (msg.level) {\n case LogLevel.info:\n if (levelHelper)\n args[0] = `I${sep}${charLevel} ${args[0]}`\n log(...args)\n break\n case LogLevel.warn:\n if (levelHelper) {\n args[0] = (colors\n ? colorString(`W${sep}${charLevel}${charLevel} `, COLOR.ORANGE)\n : `W${sep}${charLevel}${charLevel} `) + args[0]\n }\n log(...args)\n break\n case LogLevel.error:\n if (levelHelper) {\n args[0] = (colors\n ? colorString(`E${sep}${charLevel}${charLevel}${charLevel} `, COLOR.RED)\n : `E${sep}${charLevel}${charLevel}${charLevel} `) + args[0]\n }\n log(...args)\n break\n default:\n if (levelHelper)\n args[0] = `D${sep} ${args[0]}`\n log(...args)\n break\n }\n }\n}\n","// (C)opyright 2021-07-15 Dirk Holtwick, holtwick.it. All rights reserved.\n\nimport { resolve } from 'node:path'\nimport { isNotNull } from '../common'\n\nexport function getStackLlocationList(stack: string): string[] {\n if (typeof stack !== 'string')\n return []\n // console.log(\"stack\", stack)\n return (\n stack?.split('\\n').map((rawLine) => {\n const m = rawLine.match(\n /^\\s+at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/,\n )\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return undefined\n })?.filter(isNotNull) ?? []\n )\n}\n\nconst cwd = resolve(process.cwd())\nconst home = process.env?.HOME ? resolve(process.env?.HOME) : ''\n// console.log(`cwd = ${cwd}, home = ${home}}`)\n\nfunction pathStripCwd(path: string) {\n // console.log(\">\", path)\n\n if (path.includes('/node_modules/'))\n return ''\n\n const fileURL = 'file://'\n if (path.startsWith(fileURL))\n return path.substr(fileURL.length)\n\n if (cwd && path.startsWith(cwd))\n return path.substr(cwd.length + 1)\n\n if (home && path.startsWith(home))\n path = `~/${path.substr(home.length + 1)}`\n\n return path\n}\n\nfunction extractFileInfo(stackLine: string): string {\n const m = stackLine.match(/^\\s*at.*(\\((.*)\\)|file:\\/\\/(.*)$)|\\s*at\\s(\\/.*)$/)\n if (m) {\n let line = m[3] || m[2] || m[4]\n if (line.endsWith(')'))\n line = line.slice(0, -1)\n return line\n }\n return ''\n}\n\n/**\n * Get the source code location of the caller\n * https://stackoverflow.com/a/47296370/140927\n *\n * @param level Number of levels to go down the stack trace\n * @param stripCwd Strip the current working directory, only reasonable for Node.js environment\n * @returns\n */\nexport function getSourceLocation(level = 2, stripCwd = true): string {\n const stack = new Error('stack').stack || ''\n let line: string | undefined = getStackLlocationList(stack)?.[level]\n if (line && stripCwd)\n line = pathStripCwd(line)\n\n return line || ''\n}\n\nexport function getStack(): string {\n return new Error('stack').stack || ''\n}\n\nexport function getSourceLocationByPrecedingPattern(\n patterns: string[],\n stripCwd = true,\n) {\n let line = ''\n const stack = new Error('stack').stack || ''\n if (typeof stack === 'string') {\n const lines = stack.split('\\n').map(l => l.trim())\n // console.log(lines)\n const index = lines.findIndex(l => patterns.some(p => l.startsWith(p)))\n line = lines[index + 1]\n if (line)\n line = extractFileInfo(line)\n\n if (line && stripCwd)\n line = pathStripCwd(line)\n }\n return line\n}\n","import { valueToBoolean } from '../common'\nimport { Logger } from '../common/log'\nimport { toPath } from './env'\nimport { LoggerFileHandler } from './log-file'\nimport { LoggerNodeHandler } from './log-node'\n\nfunction setupLogContextNode() {\n const handlers = [\n LoggerNodeHandler({\n padding: 32,\n nameBrackets: false,\n // levelHelper: false,\n }),\n ]\n\n const logFilePath = process.env.ZEED_LOG ?? process.env.LOG\n const time = valueToBoolean(process.env.ZEED_TIME, true)\n const pretty = valueToBoolean(process.env.ZEED_PRETTY, false)\n if (logFilePath)\n handlers.unshift(LoggerFileHandler(toPath(logFilePath), { time, pretty }))\n\n Logger.setHandlers(handlers)\n}\n\n// todo sideffects\nsetupLogContextNode()\n"],"mappings":"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","names":["index_node_exports","__export","CRYPTO_DEFAULT_ALG","CRYPTO_DEFAULT_DERIVE_ALG","CRYPTO_DEFAULT_DERIVE_ITERATIONS","CRYPTO_DEFAULT_HASH_ALG","Channel","CryptoEncoder","DAY_MS","Day","Emitter","FileStorage","JsonEncoder","LocalChannel","LogLevel","LogLevelAlias","Logger","LoggerConsoleHandler","LoggerContext","LoggerFileHandler","LoggerMemoryHandler","LoggerNodeHandler","MemStorage","NoopEncoder","PoolTaskIdConflictResolution","PoolTaskState","Progress","PubSub","SerialQueue","Uint8ArrayToHexDump","Uint8ArrayToJson","Uint8ArrayToString","XRX","_decodeUtf8Polyfill","_encodeUtf8Polyfill","arrayAvg","arrayBatches","arrayEmptyInPlace","arrayFilterInPlace","arrayFlatten","arrayIntersection","arrayIsEqual","arrayMax","arrayMin","arrayMinus","arrayRandomElement","arrayRemoveElement","arraySetElement","arrayShuffle","arrayShuffleForce","arrayShuffleInPlace","arraySorted","arraySortedNumbers","arraySum","arraySymmetricDifference","arrayToggleInPlace","arrayUnion","arrayUnique","avg","between","cloneJsonObject","cloneObject","cmp","colorString","colorStringList","composeOrderby","createArray","createLocalChannelPair","createPromise","createPromiseProxy","csvParse","csvParseToObjects","csvStringify","dateStringToDays","day","dayDay","dayDiff","dayFromAny","dayFromDate","dayFromDateGMT","dayFromParts","dayFromString","dayFromTimestamp","dayFromToday","dayIterator","dayMonth","dayMonthStart","dayOffset","dayRange","dayToDate","dayToDateGMT","dayToParts","dayToString","dayToTimestamp","dayYear","dayYearStart","debounce","decimal","decimalCentsPart","decimalFromCents","decimalToCents","decodeBase16","decodeBase32","decodeBase58","decodeBase62","decrypt","deepEqual","deepMerge","deepStripUndefinedInPlace","deriveKeyPbkdf2","detect","digest","empty","encodeBase16","encodeBase32","encodeBase58","encodeBase62","encodeQuery","encrypt","endSortWeight","ensureFolder","ensureKey","ensureKeyAsync","equalBinary","escapeHTML","escapeRegExp","estimateSizeForBase","exists","fetchBasic","fetchJson","fetchOptionsBasicAuth","fetchOptionsFormURLEncoded","fetchOptionsJson","fetchText","fixBrokenUth8String","forEachDay","forTimes","formatMessages","formatMilliseconds","fromBase64","fromBase64String","fromCamelCase","fromHex","getEnvVariableRelaxed","getGlobal","getGlobalContext","getGlobalEmitter","getGlobalLogger","getNamespaceFilterString","getNavigator","getSecureRandom","getSecureRandomIfPossible","getSourceLocation","getSourceLocationByPrecedingPattern","getStack","getStackLlocationList","getTimestamp","getWindow","immediate","isArray","isBoolean","isBrowser","isEven","isHalf","isInteger","isLocalHost","isNotNull","isNull","isNullOrUndefined","isNumber","isObject","isPrime","isPrimeRX","isPrimitive","isPromise","isRecord","isRecordPlain","isSafeInteger","isString","isTimeout","isUint8Array","isValue","joinToUint8Array","jsonStringify","jsonStringifySafe","jsonStringifySorted","jsonToUint8Array","last","lazyListener","linkifyPlainText","listDistinctUnion","listGroupBy","listOfKey","listQuery","loggerStackTraceDebug","memoize","memoizeAsync","messages","moveSortWeight","noop","objectIsEmpty","objectMap","objectMergeDisposable","parseArgs","parseBasicAuth","parseDate","parseLogLevel","parseOrderby","parseQuery","pbcopy","platform","promisify","qid","randomBoolean","randomFloat","randomInt","randomUint8Array","readText","regExpEscape","regExpString","removeFolder","renderMessages","roundDown","roundHalfAwayFromZero","roundHalfDown","roundHalfEven","roundHalfOdd","roundHalfTowardsZero","roundHalfUp","roundUp","seededRandom","setUuidDefaultEncoding","setupEnv","size","sleep","sortedItems","sortedOrderby","startSortWeight","stringToBoolean","stringToFloat","stringToInteger","stringToPath","stringToUInt8Array","suid","suidBytes","suidBytesDate","suidDate","sum","throttle","timeout","timeoutReached","timoutError","toBase64","toBase64Url","toBool","toCamelCase","toCapitalize","toCapitalizeWords","toFloat","toHex","toHumanReadableFilePath","toHumanReadableUrl","toInt","toPath","toString","toUint8Array","toValidFilename","today","tryTimeout","uname","unescapeHTML","useAsyncMutex","useBase","useDefer","useDispose","useDisposer","useEventListener","useExitHandler","useInterval","useLevelFilter","useMessageHub","useMutex","useNamespaceFilter","usePool","usePubSub","useRPC","useSorted","useTimeout","uuid","uuid32bit","uuidB32","uuidB62","uuidBytes","uuidDecode","uuidDecodeB32","uuidDecodeB62","uuidDecodeV4","uuidEncode","uuidEncodeB32","uuidEncodeB62","uuidEncodeV4","uuidIsValid","uuidv4","valueToBoolean","valueToFloat","valueToInteger","valueToPath","valueToString","waitOn","writeText","__toCommonJS","_global","__name","getGlobalContext","gcontext","getNamespaceFilterString","defaultNamespaceFilter","__name","useNamespaceFilter","filter","fn","reject","accept","_name","split","len","template","name","i","defaultLevelFilter","parseLogLevel","l","LogLevelAlias","useLevelFilter","filterLevel","level","LoggerConsoleHandler","opt","level","filter","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","name","__name","LogLevel","LogLevelAlias","LoggerContext","_prefix","logHandlers","LoggerConsoleHandler","logCheckNamespace","__name","_name","logLock","logFactory","LoggerBaseFactory","logDebug","name","level","logLevel","parseLogLevel","defineForLogLevel","fnLevel","fn","log","messages","emit","prefix","msg","handler","cond","args","Logger","namespaces","useNamespaceFilter","lock","debug","handlers","h","factory","globalLogger","getLoggerContext","logger","LoggerContext","LoggerConsoleHandler","__name","getGlobalLogger","gcontext","getGlobalContext","Logger","_sortedReplacer","__name","key","value","sorted","jsonStringifySorted","obj","indent","serializer","replacer","cycleReplacer","stack","keys","thisPos","jsonStringifySafe","spaces","jsonStringify","log","Logger","_encodeUtf8Polyfill","str","encodedString","len","buf","__name","_decodeUtf8Polyfill","remainingLen","bufPos","nextLen","bytes","_textEncoder","stringToUInt8Array","text","encoder","data","_textDecoder","Uint8ArrayToString","bin","decoder","toUint8Array","joinToUint8Array","args","length","bins","d","b","cursor","toHex","h","s","v","fromHex","hexString","byte","toBase64","stripPadding","sb","i","toBase64Url","fromBase64","a","fromBase64String","equalBinary","aa","bb","jsonToUint8Array","json","jsonStringifySafe","err","Uint8ArrayToJson","Uint8ArrayToHexDump","buffer","blockSize","lines","hex","block","addr","codes","ch","code","chars","randomUint8Array","length","randomBytes","i","__name","CRYPTO_DEFAULT_HASH_ALG","CRYPTO_DEFAULT_ALG","CRYPTO_DEFAULT_DERIVE_ALG","CRYPTO_DEFAULT_DERIVE_ITERATIONS","digest","message","algorithm","toUint8Array","deriveKeyPbkdf2","secret","opt","secretBuffer","keyMaterial","MAGIC_ID","encrypt","data","key","iv","cipher","binCypher","bufferLength","buffer","pos","decrypt","magic","equalBinary","plain","getSecureRandom","__name","getSecureRandomIfPossible","randomBoolean","bias","randomInt","max","min","randomFloat","between","value","sum","array","acc","avg","isPrimeRX","isPrime","i","_seed","seededRandom","seed","rnd","parseOrderby","value","field","orderby","__name","composeOrderby","asc","cmp","a","b","aa","bb","sortedOrderby","values","orderByList","sortValues","result","arrayUnique","x","n","index","__name","arrayMinus","y","arrayUnion","a","acc","value","arrayFlatten","list","arrayIntersection","arraySymmetricDifference","arrayRemoveElement","arr","el","arraySetElement","arrayFilterInPlace","array","fn","arrayToggleInPlace","e","arrayEmptyInPlace","arraySorted","cond","cmp","arraySortedNumbers","l","r","arrayIsEqual","array1","array2","arrayShuffleInPlace","getSecureRandomIfPossible","arrayShuffle","arrayShuffleForce","copy","arrayRandomElement","arrayMax","arrayMin","arraySum","arrayAvg","flatArray","arrayBatches","chunckLength","chunks","i","createArray","size","item","log","Logger","alphabets","useBase","alphaOrBase","ALPHABET","BASE_MAP","j","i","x","xc","BASE","LEADER","FACTOR","iFACTOR","encode","source","padToLength","data","toUint8Array","length","pbegin","pend","size","dataEncoded","carry","it1","it2","str","__name","decode","psz","dataDecoded","it3","it4","encodeBase32","_decodeBase32","decodeBase32","s","encodeBase16","decodeBase16","useBase","encodeBase58","decodeBase58","encodeBase62","decodeBase62","estimateSizeForBase","bytes","base","__name","toCamelCase","__name","s","$0","$1","toCapitalize","toCapitalizeWords","fromCamelCase","str","separator","TRUE_VALUES_LIST","stringToBoolean","value","defaultValue","__name","stringToInteger","stringToFloat","valueToBoolean","valueToInteger","valueToFloat","valueToString","toFloat","toInt","toString","toBool","formatMessages","messages","opt","trace","pretty","obj","Uint8ArrayToHexDump","renderMessages","fixBrokenUth8String","brokenString","DAY_MS","dayYear","day","__name","dayMonth","dayDay","dayToParts","dayToDate","gmt","dayToString","dayFromToday","dayFromDate","dayFromAny","value","dayFromString","year","month","dayFromParts","dayToDateGMT","date","dayFromDateGMT","dayToTimestamp","dayFromTimestamp","ms","sep","baseString","string","dayMonthStart","offset","dayYearStart","dayOffset","dayDiff","left","right","dayRange","list","dayIterator","log","Logger","createPromise","resolve","reject","_resolve","_reject","__name","sleep","milliSeconds","immediate","timeoutReached","timeout","promise","timeoutValue","done","result","err","timoutError","isTimeout","value","tryTimeout","waitOn","obj","event","timeoutMS","fn","timer","isPromise","promisify","Day","days","date","n","dateString","gmt","value","year","month","day","sep","baseString","offset","m","mm","yy","otherDay","__name","forEachDay","from","to","handler","start","end","result","isPromise","today","dateStringToDays","decimal","value","decimalPlaces","__name","decimalFromCents","decimalToCents","decimalCentsPart","isObject","obj","__name","isPrimitive","isArray","isRecord","isRecordPlain","isString","isNumber","isInteger","isSafeInteger","isBoolean","isNullOrUndefined","isNull","isUint8Array","isNotNull","value","isValue","deepEqual","a","b","hash","isPrimitive","p","aa","bb","__name","deepStripUndefinedInPlace","isRecord","isArray","i","deepMerge","target","sources","source","isObject","key","targetValue","sourceValue","escapeHTML","__name","s","unescapeHTML","listQuery","list","filters","mappers","a","m","__name","listGroupBy","key","result","currentValue","groupValue","listDistinctUnion","listOfKey","item","objectMap","obj","fn","isObject","k","v","r","isArray","__name","objectMergeDisposable","a","b","objectIsEmpty","reControlChars","reRelativePath","reTrailingPeriods","filenameReservedRegex","__name","windowsReservedNameRegex","toValidFilename","string","replacement","rxEscape","escapeRegExp","value","__name","isHalf","__name","value","isEven","roundUp","roundDown","roundHalfUp","roundHalfOdd","rounded","roundHalfAwayFromZero","roundHalfDown","roundHalfEven","roundHalfTowardsZero","startSortWeight","items","acc","item","getSecureRandomIfPossible","__name","endSortWeight","moveSortWeight","newIndex","oldIndex","count","moveLower","sortedItems","step","lower","distance","middle","fuzzy","a","b","useSorted","config","getter","__name","item","items","a","b","start","acc","getSecureRandomIfPossible","end","between","lower","upper","distance","middle","fuzzy","move","newIndex","oldIndex","sortableItems","count","moveLower","step","findURL","linkifyPlainText","text","part","i","escapedPart","escapeHTML","toHumanReadableUrl","__name","url","encodeQuery","data","pairs","key","value","v","parseQuery","queryString","query","pair","ensureKey","obj","key","createFn","value","__name","ensureKeyAsync","size","last","array","empty","err","cloneObject","jsonStringifySafe","cloneJsonObject","memoize","fn","cache","result","memoizeAsync","forTimes","count","i","RX_WHITESPACE","RX_REAL_GROUPS","RX_LOOK_BEHIND","log","Logger","regExpString","rx","__name","regExpEscape","str","XRX","pattern","flags","_flags","_rx","r","index","name","parts","m","leftContext","matches","replacement","fn","defaultSeparator","csvStringify","data","opt","separator","body","field","isBoolean","s","isRecord","isArray","jsonStringifySafe","__name","csvParse","raw","rxOneValueWithSeparator","escapeRegExp","lines","row","m","text","value","csvParseToObjects","header","l","v","i","logDispose","Logger","callDisposer","disposable","promisify","isPromise","__name","useDispose","config","opt","isString","name","log","tracked","untrack","arrayFilterInPlace","el","dispose","track","obj","useDisposer","useDefer","mode","steps","exec","expectSync","step","result","useTimeout","fn","timeout","timeoutHandle","useInterval","interval","intervalHandle","useEventListener","emitter","eventName","args","useMutex","token","fn","elseFn","executed","__name","useAsyncMutex","result","isPromise","log","Logger","Emitter","useDispose","target","name","args","event","ok","subscribers","fn","all","promisify","err","listener","handlers","handler","onceListener","__name","f","getGlobalEmitter","emitter","getGlobalContext","messages","lazyListener","listenerKey","getSecureRandomIfPossible","events","lazyResolve","incoming","key","obj","ev","skipUnmatched","resolve","reject","getTimestamp","__name","formatMilliseconds","ms","parseDate","dateCandidates","dateCandidate","date","m","encode62","decode62","useBase","encode32","decode32","uuidBytesLength","uuidBytes","randomUint8Array","__name","uuidB62","bytes","uuidEncodeB62","uuidDecodeB62","uuid","uuidB32","uuidEncodeB32","uuidDecodeB32","pattern","uuidv4","c","uuidEncodeV4","id","toHex","uuidDecodeV4","fromHex","ReferenceDateInMS","longToByteArray","long","byteArray","index","byte","suidBytes","ms","getTimestamp","suid","uuidEncode","suidDate","suidBytesDate","uuidDecode","acc","uuid32bit","mapModes","_mode","_sorted","setUuidDefaultEncoding","mode","sorted","uuidIsValid","_unameCounters","uname","name","_qid","qid","Channel","Emitter","uuid","__name","LocalChannel","data","createLocalChannelPair","w1","w2","NoopEncoder","data","__name","JsonEncoder","jsonToUint8Array","Uint8ArrayToJson","CryptoEncoder","key","plain","encrypt","decrypt","createPromiseProxy","__name","fn","opt","predefinedMethods","target","name","args","useMessageHub","uname","encoder","JsonEncoder","retryAfter","ignoreUnhandled","logLevel","log","Logger","handlers","channel","queue","queueRetryTimer","waitingForResponse","dispose","postNext","message","err","postMessage","connect","newChannel","msg","id","result","error","isPromise","valueToString","resolve","reject","fetchMessage","timeout","uuid","tryTimeout","newHandlers","perCallopt","PubSub","Emitter","opt","name","encoder","JsonEncoder","channel","debug","uname","Logger","data","info","event","args","err","__name","usePubSub","rpcCounter","defaultSerialize","__name","i","defaultDeserialize","useRPC","functions","options","post","on","eventNames","serialize","deserialize","rpcPromiseMap","data","msg","mode","args","id","method","result","error","fn","e","promise","_","sendEvent","sendCall","resolve","reject","rpcCounter","Progress","Emitter","opt","uname","child","progress","arrayRemoveElement","units","value","completedUnits","step","indent","s","__name","PoolTaskIdConflictResolution","PoolTaskState","usePool","config","maxParallel","name","uname","idConflictResolution","events","Emitter","dispose","useDispose","cancelAll","progress","Progress","countMax","countResolved","currentParallel","priority","tasks","waitFinishAll","promise","resolve","createPromise","__name","cleanupFinished","id","didFinish","didUpdate","presentMax","presentResolved","max","resolved","state","performNext","waitingTasks","t","taskInfo","tt","done","taskFinished","result","r","err","cancel","hasById","enqueue","task","uuid","resolution","runningTask","taskProgress","units","inc","SerialQueue","Emitter","opt","name","uname","logLevel","Logger","info","task","resolve","result","err","immediate","_unblock","resolver","r","__name","DEBUG","log","Logger","throttle","callback","opt","delay","trailing","leading","timeoutID","checkpoint","visited","trailingExec","debugCheckpoint","clearExistingTimeout","__name","wrapper","args","now","elapsed","debugElapsed","dnow","exec","timeout","debounce","running","lastArguments","promisify","immediate","isLocalHost","hostname","__name","LoggerMemoryHandler","opt","level","filter","messages","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","__name","log","Logger","defaultOptions","parseBasicAuth","url","m","username","password","__name","fetchBasic","fetchOptions","fetchFn","isArray","deepMerge","arrayFlatten","auth","fetchOptionsBasicAuth","response","err","fetchJson","res","fetchText","fetchOptionsFormURLEncoded","data","method","encodeQuery","fetchOptionsJson","jsonStringifySafe","toBase64","getWindow","__name","getNavigator","getGlobal","_navigator","_window","detect","info","isBrowser","platform","useExitHandler","handler","MemStorage","_opt","key","value","cloneObject","__name","noop","__name","parseArgs","config","args","alias","normalize","toCamelCase","booleanArgs","listArgs","numberArgs","nameToAlias","map","curr","name","values","value","opts","setOpt","__name","argList","arg","key","valuePart","pbcopy","data","resolve","reject","spawn","proc","err","__name","import_node_crypto","nodeCrypto","err","import_node_fs","import_node_path","log","Logger","NEWLINE","RE_INI_KEY_VAL","RE_NEWLINES","NEWLINES_MATCH","parse","src","_options","obj","line","idx","keyValueArr","key","val","end","isDoubleQuoted","__name","stringToPath","value","defaultValue","valueToPath","toPath","getEnvVariableRelaxed","name","env","k","v","setupEnv","options","dotenvPath","encoding","debug","parsedEnv","fs","parsedEnvLocal","parsed","e","import_fs","import_node_path","log","Logger","FileStorage","opt","data","jsonStringifySafe","err","toValidFilename","key","value","cloneObject","path","index","item","keys","__name","import_promises","import_node_path","toHumanReadableFilePath","path","p","h","__name","exists","ensureFolder","parts","joinPath","removeFolder","readText","writeText","content","import_fs","import_path","namespaces","LoggerFileHandler","path","opt","level","filter","time","pretty","stream","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","timeNow","name","ninfo","args","renderMessages","write","__name","import_node_tty","import_node_path","getStackLlocationList","stack","rawLine","m","line","isNotNull","__name","cwd","home","pathStripCwd","path","fileURL","extractFileInfo","stackLine","getSourceLocation","level","stripCwd","getStack","getSourceLocationByPrecedingPattern","patterns","lines","l","index","p","shouldUseColor","valueToBoolean","tty","__name","defaultUseColor","colors","selectColor","namespace","hash","i","namespaces","startTime","log","args","renderMessages","TTY_STYLE","colorEnd","colorString","text","colorCode","TTY_STYLE","__name","colorStringList","list","style","bold","value","start","end","loggerStackTraceDebug","LoggerNodeHandler","opt","defaultUseColor","shouldUseColor","startTime","getTimestamp","level","filter","colors","levelHelper","nameBrackets","padding","fill","stack","time","matchesNamespace","useNamespaceFilter","matchesLevel","useLevelFilter","msg","timeNow","name","ninfo","namespaces","selectColor","timeDiffString","formatMilliseconds","args","displayName","c","getStack","line","getSourceLocationByPrecedingPattern","getSourceLocation","sep","charLevel","log","setupLogContextNode","handlers","LoggerNodeHandler","logFilePath","time","valueToBoolean","pretty","LoggerFileHandler","toPath","Logger","__name"]}
|