aronrepo 3.0.0 → 3.0.2
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/LICENSE +21 -0
- package/README.md +3 -1
- package/dist/cli.js +145 -47
- package/dist/cli.js.map +1 -1
- package/dist/commands-ClWK0lQ9.js +1688 -0
- package/dist/commands-ClWK0lQ9.js.map +1 -0
- package/dist/{index-Co5yiJXA.d.ts → index-DLkjddC1.d.ts} +29 -10
- package/dist/index.d.ts +2 -2
- package/dist/index.js +248 -88
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +68 -11
- package/dist/node.js +1 -1
- package/package.json +8 -5
- package/dist/commands-CO26JPbK.js +0 -1170
- package/dist/commands-CO26JPbK.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commands-CO26JPbK.js","names":["readJson","loadYaml","git"],"sources":["../src/project.ts","../src/release.ts","../src/commands.ts"],"sourcesContent":["import { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { globSync } from 'tinyglobby'\nimport { load as loadYaml } from 'js-yaml'\nimport {\n createReleasePathMatcher,\n defaultReleasePathExcludes,\n getReleasePolicy,\n resolveRelease,\n type AronrepoConfig,\n type CommitInput,\n type ReleasePathsConfig,\n type ReleasePolicy\n} from './policy'\n\nexport interface PackageJson {\n name?: string\n version?: string\n private?: boolean\n workspaces?: string[] | { packages?: string[] }\n publishConfig?: {\n access?: string\n provenance?: boolean\n [key: string]: unknown\n }\n [key: string]: unknown\n}\n\nexport const configFileNames = ['aronrepo.config.js', 'aronrepo.config.mjs']\n\nfunction toPosixPath(value: string) {\n return value.split(path.sep).join('/')\n}\n\nfunction readJson<T>(file: string) {\n return JSON.parse(fs.readFileSync(file, 'utf8')) as T\n}\n\nexport function findConfigFile(cwd = process.cwd()) {\n return configFileNames\n .map((name) => path.join(cwd, name))\n .find((file) => fs.existsSync(file))\n}\n\n/** Loads `aronrepo.config.js` from the repository root; returns `{}` when it is missing. */\nexport async function loadConfig(cwd = process.cwd()): Promise<AronrepoConfig> {\n const file = findConfigFile(cwd)\n if (!file) return {}\n // The query keeps long-lived processes from reusing a cached module after the file changes.\n const stat = fs.statSync(file)\n const url = `${pathToFileURL(file).href}?mtime=${stat.mtimeMs}&size=${stat.size}`\n const module = await import(url) as { default?: AronrepoConfig }\n return module.default ?? {}\n}\n\nfunction readPNPMWorkspaces(cwd: string) {\n const workspacePath = path.join(cwd, 'pnpm-workspace.yaml')\n if (!fs.existsSync(workspacePath)) return undefined\n\n const workspace = loadYaml(fs.readFileSync(workspacePath, 'utf8')) as { packages?: string[] } | undefined\n return workspace?.packages\n}\n\nfunction readNPMWorkspaces(cwd: string) {\n const packagePath = path.join(cwd, 'package.json')\n if (!fs.existsSync(packagePath)) return undefined\n\n const pkg = readJson<PackageJson>(packagePath)\n return Array.isArray(pkg.workspaces)\n ? pkg.workspaces\n : pkg.workspaces?.packages\n}\n\nexport function readWorkspacePatterns(cwd = process.cwd()) {\n return readPNPMWorkspaces(cwd) ?? readNPMWorkspaces(cwd) ?? []\n}\n\nexport function queryWorkspaceDirs(patterns: string[], cwd = process.cwd()) {\n if (!patterns.length) return []\n\n return globSync(\n patterns.map((workspace) => `${workspace}/package.json`),\n {\n cwd,\n onlyFiles: true,\n expandDirectories: false,\n ignore: [\n '**/node_modules/**'\n ]\n }\n )\n .map((workspacePackage) => toPosixPath(workspacePackage).replace(/\\/?package\\.json$/, '') || '.')\n .sort()\n}\n\nexport function readWorkspacePackage(cwd: string, workspace: string) {\n return readJson<PackageJson>(path.join(cwd, workspace, 'package.json'))\n}\n\n/** Workspace directories whose package is published to npm. */\nexport function queryPublicWorkspaceDirs(cwd = process.cwd()) {\n return queryWorkspaceDirs(readWorkspacePatterns(cwd), cwd)\n .filter((workspace) => readWorkspacePackage(cwd, workspace).publishConfig?.access === 'public')\n}\n\n/**\n * Resolves the files whose changes can release a version.\n *\n * Configured paths win. Otherwise public workspace packages define them; a\n * single-package repository with a non-private root package uses every path.\n * Returns `undefined` when no published package is found, which turns the check off.\n */\nexport function resolveReleasePaths(cwd = process.cwd(), policy?: Pick<ReleasePolicy, 'paths'>): ReleasePathsConfig | undefined {\n if (policy?.paths === false) return undefined\n if (policy?.paths?.include) {\n return { include: policy.paths.include, exclude: policy.paths.exclude ?? defaultReleasePathExcludes }\n }\n const exclude = policy?.paths?.exclude ?? defaultReleasePathExcludes\n const publicWorkspaces = queryPublicWorkspaceDirs(cwd)\n if (publicWorkspaces.length) {\n return { include: publicWorkspaces.map((dir) => dir === '.' ? '**' : `${dir}/**`), exclude }\n }\n const rootPackage = path.join(cwd, 'package.json')\n if (!readWorkspacePatterns(cwd).length && fs.existsSync(rootPackage) && !readJson<PackageJson>(rootPackage).private) {\n return { include: ['**'], exclude }\n }\n return undefined\n}\n\nexport type PackageManager = 'bun' | 'pnpm' | 'yarn' | 'npm'\n\nconst lockfiles: Array<[string, PackageManager]> = [\n ['bun.lock', 'bun'],\n ['bun.lockb', 'bun'],\n ['pnpm-lock.yaml', 'pnpm'],\n ['pnpm-workspace.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['package-lock.json', 'npm']\n]\n\n/** The package manager from `packageManager` in package.json, then from the lockfile; `npm` by default. */\nexport function detectPackageManager(cwd = process.cwd()): PackageManager {\n const rootPackage = path.join(cwd, 'package.json')\n const declared = fs.existsSync(rootPackage) ? String(readJson<PackageJson>(rootPackage).packageManager ?? '').split('@')[0] : ''\n if (declared === 'bun' || declared === 'pnpm' || declared === 'yarn' || declared === 'npm') return declared\n return lockfiles.find(([file]) => fs.existsSync(path.join(cwd, file)))?.[1] ?? 'npm'\n}\n\n/** How to run the aronrepo CLI with a package manager. */\nexport function getCliCommand(packageManager: PackageManager) {\n return {\n bun: 'bun x aronrepo',\n pnpm: 'pnpm exec aronrepo',\n yarn: 'yarn aronrepo',\n npm: 'npx aronrepo'\n }[packageManager]\n}\n\n/**\n * How to run the aronrepo CLI in a repository: its `aronrepo` script when it has\n * one, for example a workspace that builds aronrepo itself, or the installed binary.\n */\nexport function getProjectCliCommand(cwd: string, packageManager = detectPackageManager(cwd)) {\n const rootPackage = path.join(cwd, 'package.json')\n const scripts = fs.existsSync(rootPackage) ? readJson<PackageJson>(rootPackage).scripts as Record<string, string> | undefined : undefined\n if (scripts?.aronrepo) return packageManager === 'npm' ? 'npm run aronrepo --' : `${packageManager} run aronrepo`\n return getCliCommand(packageManager)\n}\n\nexport interface ProjectPolicy {\n cwd: string\n packageManager: PackageManager\n /** How to run the aronrepo CLI in this repository. */\n cli: string\n config: AronrepoConfig\n configFile?: string\n policy: ReleasePolicy\n releasePaths?: ReleasePathsConfig\n isReleasePath?: (file: string) => boolean\n}\n\n/** Loads the config, release policy, and release paths of a repository. */\nexport async function loadProjectPolicy(cwd = process.cwd(), overrides: Partial<ReleasePolicy> = {}): Promise<ProjectPolicy> {\n const config = await loadConfig(cwd)\n const policy = { ...getReleasePolicy(config), ...overrides }\n const releasePaths = resolveReleasePaths(cwd, policy)\n const configFile = findConfigFile(cwd)\n const packageManager = detectPackageManager(cwd)\n return {\n cwd,\n packageManager,\n cli: getProjectCliCommand(cwd, packageManager),\n config,\n ...(configFile ? { configFile } : {}),\n policy,\n ...(releasePaths ? { releasePaths } : {}),\n ...(releasePaths ? { isReleasePath: createReleasePathMatcher(releasePaths) } : {})\n }\n}\n\nfunction git(cwd: string, args: string[]) {\n return execFileSync('git', args, { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 })\n}\n\nfunction splitLines(output: string) {\n return output.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\n/** Files changed by one commit. Merge commits report no files. */\nexport function getCommitFiles(cwd: string, hash: string) {\n return splitLines(git(cwd, ['diff-tree', '--no-commit-id', '--name-only', '-r', '--root', hash]))\n}\n\nexport function getStagedFiles(cwd = process.cwd()) {\n return splitLines(git(cwd, ['diff', '--cached', '--name-only']))\n}\n\n/** Files changed between the merge base of `base` and `head`, like a pull request diff. */\nexport function getDiffFiles(cwd: string, base: string, head: string) {\n return splitLines(git(cwd, ['diff', '--name-only', `${base}...${head}`]))\n}\n\n/** Commits in `from..to`, oldest first, with their changed files. */\nexport function getRangeCommits(cwd: string, from: string | undefined, to = 'HEAD'): Required<CommitInput>[] {\n const range = from ? `${from}..${to}` : to\n const output = git(cwd, ['log', '--reverse', '--format=%H%x1f%B%x1e', range])\n return output.split('\\x1e')\n .map((entry) => entry.replace(/^\\n/, ''))\n .filter((entry) => entry.includes('\\x1f'))\n .map((entry) => {\n const [hash, message] = entry.split('\\x1f')\n return { hash, message: message.trim(), files: getCommitFiles(cwd, hash) }\n })\n}\n\n/** Latest tag reachable from `ref`, or `undefined` when there is none. */\nexport function getLatestTag(cwd: string, ref = 'HEAD') {\n try {\n return git(cwd, ['describe', '--tags', '--abbrev=0', ref]).trim() || undefined\n } catch {\n return undefined\n }\n}\n\n/** Resolves the release of a commit range with the repository's policy and release paths. */\nexport async function explainRange(cwd: string, from: string | undefined, to = 'HEAD', overrides: Partial<ReleasePolicy> = {}) {\n const project = await loadProjectPolicy(cwd, overrides)\n const commits = getRangeCommits(cwd, from, to)\n return {\n ...project,\n from,\n to,\n ...resolveRelease(commits, project.policy, project.isReleasePath ? { isReleasePath: project.isReleasePath } : {})\n }\n}\n","import { spawn } from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { gunzipSync } from 'node:zlib'\nimport type { ReleaseType } from './commits'\nimport { renderReleaseNotes } from './notes'\nimport { resolveRelease, type CommitDecision, type ReleasePolicy } from './policy'\nimport {\n detectPackageManager,\n getRangeCommits,\n loadProjectPolicy,\n queryPublicWorkspaceDirs,\n readWorkspacePatterns,\n type PackageJson,\n type PackageManager\n} from './project'\nimport {\n getBaseTag,\n getNextVersion,\n getReleaseChannel,\n toVersionTag,\n type ReleaseChannel\n} from './version'\n\nexport const officialRegistry = 'https://registry.npmjs.org/'\n\n/** npm dist-tag that holds a release until every package of it is published. */\nexport const stagingDistTag = 'aronrepo-staging'\n\n/** GitHub rejects release bodies over 125,000 characters. */\nexport const releaseBodyLimit = 120_000\n\nexport interface RunResult {\n stdout: string\n stderr: string\n}\n\nexport type Runner = (command: string, args: string[], options: { cwd: string, env: NodeJS.ProcessEnv }) => Promise<RunResult>\n\nexport type Fetch = (input: string, init?: RequestInit) => Promise<Response>\n\nexport interface ReleaseEnvironment {\n cwd: string\n env: NodeJS.ProcessEnv\n run: Runner\n fetch: Fetch\n log: (message: string) => void\n /** Waits between registry checks. */\n wait: (ms: number) => Promise<void>\n}\n\nexport const runCommand: Runner = (command, args, { cwd, env }) => new Promise((resolve, reject) => {\n const child = spawn(command, args, { cwd, env, stdio: ['ignore', 'pipe', 'pipe'], shell: process.platform === 'win32' })\n let stdout = ''\n let stderr = ''\n child.stdout.on('data', (chunk) => { stdout += chunk })\n child.stderr.on('data', (chunk) => { stderr += chunk })\n child.on('error', reject)\n child.on('close', (code) => {\n if (code === 0) resolve({ stdout, stderr })\n else reject(new Error(`\\`${command} ${args.join(' ')}\\` exited with ${code}.\\n${stderr.trim() || stdout.trim()}`))\n })\n})\n\nfunction createEnvironment(options: Partial<ReleaseEnvironment> = {}): ReleaseEnvironment {\n return {\n cwd: options.cwd ?? process.cwd(),\n env: options.env ?? process.env,\n run: options.run ?? runCommand,\n fetch: options.fetch ?? ((input, init) => fetch(input, init)),\n log: options.log ?? ((message) => console.log(message)),\n wait: options.wait ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)))\n }\n}\n\nasync function git(environment: ReleaseEnvironment, args: string[]) {\n return (await environment.run('git', args, { cwd: environment.cwd, env: environment.env })).stdout.trim()\n}\n\nfunction lines(output: string) {\n return output.split('\\n').map((line) => line.trim()).filter(Boolean)\n}\n\nexport interface ReleasePackage {\n /** Directory relative to the repository root, `.` for a single-package repository. */\n dir: string\n name: string\n manifest: PackageJson\n}\n\nfunction readJson<T>(file: string) {\n return JSON.parse(fs.readFileSync(file, 'utf8')) as T\n}\n\nconst dependencyFields = ['dependencies', 'optionalDependencies', 'peerDependencies'] as const\n\n/** Published packages of the repository in dependency order. */\nexport function getReleasePackages(cwd: string): ReleasePackage[] {\n let dirs = queryPublicWorkspaceDirs(cwd)\n if (!dirs.length && !readWorkspacePatterns(cwd).length) {\n const root = path.join(cwd, 'package.json')\n if (fs.existsSync(root) && !readJson<PackageJson>(root).private) dirs = ['.']\n }\n const packages = dirs.map((dir) => {\n const manifest = readJson<PackageJson>(path.join(cwd, dir, 'package.json'))\n if (!manifest.name) throw new Error(`${dir}/package.json has no name.`)\n return { dir, name: manifest.name, manifest }\n })\n const names = new Set(packages.map(({ name }) => name))\n const dependenciesOf = (pkg: ReleasePackage) => dependencyFields\n .flatMap((field) => Object.keys((pkg.manifest[field] ?? {}) as Record<string, string>))\n .filter((name) => names.has(name) && name !== pkg.name)\n\n const ordered: ReleasePackage[] = []\n const visiting = new Set<string>()\n const visit = (pkg: ReleasePackage) => {\n if (ordered.includes(pkg)) return\n if (visiting.has(pkg.name)) throw new Error(`Published packages depend on each other in a cycle through ${pkg.name}.`)\n visiting.add(pkg.name)\n for (const name of dependenciesOf(pkg)) visit(packages.find((candidate) => candidate.name === name)!)\n visiting.delete(pkg.name)\n ordered.push(pkg)\n }\n for (const pkg of [...packages].sort((a, b) => a.dir.localeCompare(b.dir))) visit(pkg)\n return ordered\n}\n\nexport interface ReleasePlan {\n branch: string\n channel?: ReleaseChannel\n /** Full hash of the commit that releases. */\n head: string\n mode: ReleasePolicy['mode']\n /** The tag the range starts from; `undefined` for the first release. */\n from?: string\n release: ReleaseType\n version?: string\n tag?: string\n commits: CommitDecision[]\n notes?: string\n packages: ReleasePackage[]\n}\n\nexport interface PlanReleaseOptions {\n /** Defaults to `GITHUB_REF_NAME`, then the checked-out branch. */\n branch?: string\n mode?: ReleasePolicy['mode']\n /** Plan as if the branch were `main` when it does not release, for `aronrepo explain` on feature branches. */\n fallbackToMain?: boolean\n /** Tags to ignore, to rebuild the plan of a release that is already tagged. */\n ignoreTags?: string[]\n date?: string\n}\n\n/** The repository URL on GitHub, from `GITHUB_REPOSITORY` or the root package.json. */\nexport function getRepositoryUrl(cwd: string, env: NodeJS.ProcessEnv = process.env) {\n if (env.GITHUB_REPOSITORY) return `${env.GITHUB_SERVER_URL ?? 'https://github.com'}/${env.GITHUB_REPOSITORY}`\n const root = path.join(cwd, 'package.json')\n if (!fs.existsSync(root)) return undefined\n const repository = readJson<PackageJson>(root).repository as string | { url?: string } | undefined\n const url = typeof repository === 'string' ? repository : repository?.url\n const match = url && /github\\.com[/:]([^/]+\\/[^/.]+?)(?:\\.git)?\\/?$/.exec(url)\n return match ? `https://github.com/${match[1]}` : undefined\n}\n\nasync function getBranch(environment: ReleaseEnvironment, branch?: string) {\n return branch ?? environment.env.GITHUB_REF_NAME ?? await git(environment, ['rev-parse', '--abbrev-ref', 'HEAD'])\n}\n\n/** Plans the next release of the checked-out commit without changing anything. */\nexport async function planRelease(options: PlanReleaseOptions = {}, environmentOptions: Partial<ReleaseEnvironment> = {}): Promise<ReleasePlan> {\n const environment = createEnvironment(environmentOptions)\n const { cwd } = environment\n const project = await loadProjectPolicy(cwd, options.mode ? { mode: options.mode } : {})\n const branch = await getBranch(environment, options.branch)\n const channel = getReleaseChannel(branch) ?? (options.fallbackToMain ? getReleaseChannel('main') : undefined)\n const head = await git(environment, ['rev-parse', 'HEAD'])\n const ignored = new Set(options.ignoreTags ?? [])\n const reachable = lines(await git(environment, ['tag', '--list', 'v*', '--merged', 'HEAD'])).filter((tag) => !ignored.has(tag))\n const all = lines(await git(environment, ['tag', '--list', 'v*'])).filter((tag) => !ignored.has(tag))\n const packages = getReleasePackages(cwd)\n const base: ReleasePlan = { branch, head, mode: project.policy.mode, release: false, commits: [], packages }\n if (!channel) return base\n\n const from = getBaseTag(channel, reachable)\n const decision = resolveRelease(\n getRangeCommits(cwd, from, 'HEAD'),\n project.policy,\n project.isReleasePath ? { isReleasePath: project.isReleasePath } : {}\n )\n const plan: ReleasePlan = { ...base, channel, ...(from ? { from } : {}), release: decision.release, commits: decision.commits }\n if (!decision.release) return plan\n\n const version = getNextVersion(channel, decision.release, { reachable, all })\n const repositoryUrl = getRepositoryUrl(cwd, environment.env)\n return {\n ...plan,\n version,\n tag: toVersionTag(version),\n notes: renderReleaseNotes({\n version,\n ...(from ? { previousTag: from } : {}),\n date: options.date ?? new Date().toISOString().slice(0, 10),\n ...(repositoryUrl ? { repositoryUrl } : {}),\n commits: decision.commits\n })\n }\n}\n\n/** Registry of a package: its scoped registry, `publishConfig.registry`, `NPM_CONFIG_REGISTRY`, then npm. */\nexport function getRegistry(manifest: PackageJson, env: NodeJS.ProcessEnv = process.env) {\n const scope = manifest.name?.startsWith('@') ? manifest.name.split('/')[0] : undefined\n const configured = (scope ? manifest.publishConfig?.[`${scope}:registry`] : undefined)\n ?? manifest.publishConfig?.registry\n ?? env.NPM_CONFIG_REGISTRY\n const registry = typeof configured === 'string' && configured ? configured : officialRegistry\n return registry.endsWith('/') ? registry : `${registry}/`\n}\n\nfunction nerfDart(registry: string) {\n const url = new URL(registry)\n return `//${url.host}${url.pathname.endsWith('/') ? url.pathname : `${url.pathname}/`}`\n}\n\ninterface PublishedVersion {\n gitHead?: string\n dist?: { attestations?: unknown }\n}\n\ninterface Packument {\n 'dist-tags'?: Record<string, string>\n versions?: Record<string, PublishedVersion>\n}\n\nasync function readPackument(environment: ReleaseEnvironment, registry: string, name: string): Promise<Packument | undefined> {\n const response = await environment.fetch(`${registry}${name.replace('/', '%2f')}`, {\n headers: { accept: 'application/json', 'cache-control': 'no-cache' }\n })\n if (response.status === 404) return undefined\n if (!response.ok) throw new Error(`Could not read ${name} from ${registry}: ${response.status} ${response.statusText}`)\n return await response.json() as Packument\n}\n\nasync function getGitHubIdToken(environment: ReleaseEnvironment, audience: string) {\n const { ACTIONS_ID_TOKEN_REQUEST_URL: url, ACTIONS_ID_TOKEN_REQUEST_TOKEN: token } = environment.env\n if (!url || !token) return undefined\n const response = await environment.fetch(`${url}${url.includes('?') ? '&' : '?'}audience=${encodeURIComponent(audience)}`, {\n headers: { authorization: `Bearer ${token}`, accept: 'application/json' }\n })\n if (!response.ok) {\n environment.log(`! Could not get a GitHub Actions OIDC token: ${response.status} ${response.statusText}`)\n return undefined\n }\n return (await response.json() as { value?: string }).value\n}\n\n/** Exchanges a GitHub Actions OIDC token for a short-lived npm publish token (npm trusted publishing). */\nexport async function exchangeOidcToken(environment: ReleaseEnvironment, name: string, registry: string) {\n if (registry !== officialRegistry) return undefined\n const identity = environment.env.NPM_ID_TOKEN ?? await getGitHubIdToken(environment, 'npm:registry.npmjs.org')\n if (!identity) return undefined\n const response = await environment.fetch(`${officialRegistry}-/npm/v1/oidc/token/exchange/package/${encodeURIComponent(name)}`, {\n method: 'POST',\n headers: { authorization: `Bearer ${identity}` }\n })\n if (!response.ok) {\n environment.log(`! Could not exchange the OIDC token for ${name}: ${response.status} ${response.statusText}`)\n return undefined\n }\n return (await response.json() as { token?: string }).token\n}\n\nfunction readNpmrc(file: string) {\n return fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : ''\n}\n\nfunction hasRegistryAuth(content: string, registry: string) {\n const nerfed = nerfDart(registry)\n return content.split(/\\r?\\n/).some((line) => {\n const key = line.split('=')[0].trim()\n return key === '_authToken' || key === '_auth' || key.startsWith(`${nerfed}:_auth`)\n })\n}\n\n/**\n * npm environment for one package: existing `.npmrc` auth, then npm trusted\n * publishing through GitHub Actions OIDC, then `NPM_TOKEN`.\n */\nasync function createNpmEnv(environment: ReleaseEnvironment, name: string, registry: string, directory: string) {\n const userconfig = environment.env.NPM_CONFIG_USERCONFIG ?? path.join(os.homedir(), '.npmrc')\n const existing = [readNpmrc(path.join(environment.cwd, '.npmrc')), readNpmrc(userconfig)].join('\\n')\n if (hasRegistryAuth(existing, registry)) return environment.env\n\n const token = await exchangeOidcToken(environment, name, registry) ?? environment.env.NPM_TOKEN\n if (!token) {\n throw new Error(`No npm auth for ${name}. Configure npm trusted publishing with \\`id-token: write\\`, set NPM_TOKEN, or add auth to .npmrc for ${registry}.`)\n }\n const file = path.join(directory, `${name.replace(/[@/]/g, '_')}.npmrc`)\n fs.writeFileSync(file, `${readNpmrc(userconfig).trim()}\\n${nerfDart(registry)}:_authToken=${token}\\n`, { mode: 0o600 })\n return { ...environment.env, NPM_CONFIG_USERCONFIG: file }\n}\n\nfunction detectIndent(content: string) {\n return /^(\\s+)\"/m.exec(content)?.[1] ?? ' '\n}\n\n/** Writes the release version and git head into a package manifest. */\nexport function writeReleaseManifest(cwd: string, dir: string, version: string, gitHead: string) {\n const file = path.join(cwd, dir, 'package.json')\n const content = fs.readFileSync(file, 'utf8')\n const manifest = JSON.parse(content) as PackageJson\n manifest.version = version\n manifest.gitHead = gitHead\n fs.writeFileSync(file, `${JSON.stringify(manifest, null, detectIndent(content))}\\n`)\n return manifest\n}\n\nfunction packCommand(packageManager: PackageManager, destination: string): [string, string[]] {\n switch (packageManager) {\n case 'bun':\n return ['bun', ['pm', 'pack', '--destination', destination, '--quiet']]\n case 'pnpm':\n return ['pnpm', ['pack', '--pack-destination', destination]]\n case 'yarn':\n return ['yarn', ['pack', '--out', path.join(destination, 'package.tgz')]]\n default:\n return ['npm', ['pack', '--pack-destination', destination]]\n }\n}\n\n/** Reads `package/package.json` from a packed tarball. */\nexport function readPackedManifest(tarball: string): PackageJson {\n const archive = gunzipSync(fs.readFileSync(tarball))\n let offset = 0\n let longName: string | undefined\n while (offset + 512 <= archive.length) {\n const header = archive.subarray(offset, offset + 512)\n if (header.every((byte) => byte === 0)) break\n const field = (start: number, length: number) => header.subarray(start, start + length).toString('utf8').replace(/\\0.*$/s, '')\n const size = parseInt(field(124, 12).trim() || '0', 8)\n const type = field(156, 1)\n const prefix = field(345, 155)\n const name = longName ?? (prefix ? `${prefix}/${field(0, 100)}` : field(0, 100))\n const body = archive.subarray(offset + 512, offset + 512 + size)\n longName = undefined\n if (type === 'L') {\n longName = body.toString('utf8').replace(/\\0.*$/s, '')\n } else if (type === 'x') {\n const pathRecord = /\\d+ path=([^\\n]+)\\n/.exec(body.toString('utf8'))\n if (pathRecord) longName = pathRecord[1]\n } else if (name.replace(/^\\.\\//, '').split('/').slice(1).join('/') === 'package.json') {\n return JSON.parse(body.toString('utf8')) as PackageJson\n }\n offset += 512 + Math.ceil(size / 512) * 512\n }\n throw new Error(`${tarball} has no package.json.`)\n}\n\nfunction validatePackedManifest(manifest: PackageJson, pkg: ReleasePackage, version: string, gitHead: string) {\n if (manifest.name !== pkg.name) throw new Error(`The tarball of ${pkg.dir} is ${manifest.name}, not ${pkg.name}.`)\n if (manifest.version !== version) throw new Error(`The tarball of ${pkg.name} has version ${manifest.version}, not ${version}.`)\n if (manifest.gitHead !== gitHead) throw new Error(`The tarball of ${pkg.name} has gitHead ${String(manifest.gitHead)}, not ${gitHead}.`)\n for (const field of dependencyFields) {\n for (const [name, range] of Object.entries((manifest[field] ?? {}) as Record<string, string>)) {\n if (range.startsWith('workspace:')) throw new Error(`The tarball of ${pkg.name} keeps \\`${name}: ${range}\\` in ${field}.`)\n }\n }\n}\n\nasync function waitForVersion(environment: ReleaseEnvironment, registry: string, name: string, version: string) {\n for (let attempt = 1; attempt <= 30; attempt++) {\n const published = (await readPackument(environment, registry, name))?.versions?.[version]\n if (published) return published\n await environment.wait(10_000)\n }\n throw new Error(`${name}@${version} did not appear on ${registry}.`)\n}\n\nexport interface GitHubRelease {\n tag: string\n notes: string\n prerelease: boolean\n}\n\nfunction truncateNotes(notes: string, url: string | undefined) {\n if (notes.length <= releaseBodyLimit) return notes\n const cut = notes.slice(0, releaseBodyLimit)\n return `${cut.slice(0, cut.lastIndexOf('\\n'))}\\n\\n…the notes are too long for a GitHub release${url ? `; see ${url}` : ''}.\\n`\n}\n\n/** Creates the GitHub release of a tag unless it exists. Needs `GITHUB_TOKEN` and the repository. */\nexport async function publishGitHubRelease(environment: ReleaseEnvironment, release: GitHubRelease) {\n const token = environment.env.GITHUB_TOKEN ?? environment.env.GH_TOKEN\n const repositoryUrl = getRepositoryUrl(environment.cwd, environment.env)\n const repository = repositoryUrl?.replace(/^https:\\/\\/[^/]+\\//, '')\n if (!token || !repository) {\n environment.log('! Skip the GitHub release: set GITHUB_TOKEN and a GitHub repository URL.')\n return undefined\n }\n const api = `${environment.env.GITHUB_API_URL ?? 'https://api.github.com'}/repos/${repository}/releases`\n const headers = {\n authorization: `Bearer ${token}`,\n accept: 'application/vnd.github+json',\n 'content-type': 'application/json',\n 'x-github-api-version': '2022-11-28'\n }\n const existing = await environment.fetch(`${api}/tags/${encodeURIComponent(release.tag)}`, { headers })\n if (existing.ok) {\n environment.log(`✓ GitHub release ${release.tag} exists.`)\n return (await existing.json() as { html_url?: string }).html_url\n }\n const response = await environment.fetch(api, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n tag_name: release.tag,\n name: release.tag,\n body: truncateNotes(release.notes, repositoryUrl ? `${repositoryUrl}/compare` : undefined),\n prerelease: release.prerelease,\n make_latest: release.prerelease ? 'false' : 'true'\n })\n })\n if (!response.ok) throw new Error(`Could not create the GitHub release ${release.tag}: ${response.status} ${await response.text()}`)\n const url = (await response.json() as { html_url?: string }).html_url\n environment.log(`✓ Created the GitHub release ${url ?? release.tag}.`)\n return url\n}\n\nexport interface ReleaseOptions extends PlanReleaseOptions {\n /** Plans and prints the release without changing anything. */\n dryRun?: boolean\n}\n\nexport interface ReleaseResult {\n status: 'skipped' | 'none' | 'dry-run' | 'released' | 'resumed'\n plan: ReleasePlan\n}\n\nfunction describePlan(plan: ReleasePlan) {\n const range = plan.from ? `${plan.from}..${plan.head.slice(0, 9)}` : `all commits up to ${plan.head.slice(0, 9)}`\n return [\n `Branch: ${plan.branch}${plan.channel ? ` (npm dist-tag ${plan.channel.distTag})` : ''}`,\n `Mode: ${plan.mode}`,\n `Range: ${range}`,\n ...plan.commits.map((decision) => ` ${(decision.release || 'none').padEnd(5)} ${decision.hash?.slice(0, 9) ?? ''} ${decision.header}`),\n `Release: ${plan.release || 'none'}${plan.version ? ` → ${plan.version}` : ''}`,\n `Packages: ${plan.packages.map(({ name }) => name).join(', ') || 'none'}`\n ].join('\\n')\n}\n\n/** Creates a missing GitHub release when HEAD carries a version tag from an earlier, interrupted run. */\nasync function resumeTaggedRelease(environment: ReleaseEnvironment, options: ReleaseOptions, plan: ReleasePlan) {\n const tags = lines(await git(environment, ['tag', '--list', 'v*', '--points-at', 'HEAD']))\n const tag = plan.channel && tags.find((candidate) => {\n const prerelease = candidate.includes('-')\n return plan.channel!.prerelease ? candidate.includes(`-${plan.channel!.prerelease}.`) : !prerelease\n })\n if (!tag || options.dryRun) return false\n const previous = await planRelease({ ...options, ignoreTags: [tag] }, environment)\n if (!previous.notes || previous.tag !== tag) return false\n environment.log(`${tag} points at HEAD; make sure its GitHub release exists.`)\n await publishGitHubRelease(environment, { tag, notes: previous.notes, prerelease: Boolean(plan.channel!.prerelease) })\n return true\n}\n\n/**\n * Releases the checked-out commit:\n *\n * 1. plan the version from the commits since the channel's last tag;\n * 2. write the version and git head into every published package and pack it;\n * 3. publish each package, in dependency order, on the `aronrepo-staging`\n * dist-tag, skipping versions already published from the same commit;\n * 4. wait until the registry serves every package, then move the channel's\n * dist-tag to the new version;\n * 5. push the version tag and create the GitHub release.\n *\n * Every step checks what an interrupted run already did, so rerunning the job\n * finishes a release instead of skipping or duplicating it.\n */\nexport async function runRelease(options: ReleaseOptions = {}, environmentOptions: Partial<ReleaseEnvironment> = {}): Promise<ReleaseResult> {\n const environment = createEnvironment(environmentOptions)\n const { cwd, log } = environment\n const plan = await planRelease(options, environment)\n log(describePlan(plan))\n\n if (!plan.channel) {\n log(`Branch ${plan.branch} does not release. Release branches: main, alpha, beta, rc, canary.`)\n return { status: 'skipped', plan }\n }\n if (!plan.version || !plan.tag || !plan.notes) {\n if (await resumeTaggedRelease(environment, options, plan)) return { status: 'resumed', plan }\n log('No release.')\n return { status: 'none', plan }\n }\n if (!plan.packages.length) throw new Error('No published package found. Add `\"publishConfig\": { \"access\": \"public\" }` to the packages that ship.')\n if (options.dryRun) {\n log(`\\nDry run: would publish ${plan.tag} on ${plan.channel.distTag}.\\n\\n${plan.notes}`)\n return { status: 'dry-run', plan }\n }\n\n if (await git(environment, ['status', '--porcelain'])) throw new Error('The working tree has changes. Release from a clean checkout.')\n const existingTag = await git(environment, ['tag', '--list', plan.tag])\n if (existingTag) throw new Error(`${plan.tag} exists but is not reachable from ${plan.branch}.`)\n\n const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'aronrepo-release-'))\n const manifests = new Map(plan.packages.map(({ dir }) => {\n const file = path.join(cwd, dir, 'package.json')\n return [file, fs.readFileSync(file, 'utf8')]\n }))\n try {\n const packageManager = detectPackageManager(cwd)\n // Every version must be written before packing, so workspace ranges resolve to it.\n for (const pkg of plan.packages) pkg.manifest = writeReleaseManifest(cwd, pkg.dir, plan.version, plan.head)\n\n const tarballs = new Map<string, string>()\n for (const [index, pkg] of plan.packages.entries()) {\n const destination = path.join(directory, String(index))\n fs.mkdirSync(destination)\n const [command, args] = packCommand(packageManager, destination)\n await environment.run(command, args, { cwd: path.join(cwd, pkg.dir), env: environment.env })\n const tarball = fs.readdirSync(destination).find((file) => file.endsWith('.tgz'))\n if (!tarball) throw new Error(`Packing ${pkg.name} produced no tarball.`)\n const file = path.join(destination, tarball)\n validatePackedManifest(readPackedManifest(file), pkg, plan.version, plan.head)\n tarballs.set(pkg.name, file)\n log(`✓ Packed ${pkg.name}@${plan.version}`)\n }\n\n const npmEnvs = new Map<string, NodeJS.ProcessEnv>()\n const npmEnv = async (pkg: ReleasePackage) => {\n if (!npmEnvs.has(pkg.name)) npmEnvs.set(pkg.name, await createNpmEnv(environment, pkg.name, getRegistry(pkg.manifest, environment.env), directory))\n return npmEnvs.get(pkg.name)!\n }\n\n for (const pkg of plan.packages) {\n const registry = getRegistry(pkg.manifest, environment.env)\n const published = (await readPackument(environment, registry, pkg.name))?.versions?.[plan.version]\n if (published) {\n if (published.gitHead !== plan.head) {\n throw new Error(`${pkg.name}@${plan.version} is already published from ${published.gitHead ?? 'another commit'}, not ${plan.head}.`)\n }\n log(`✓ ${pkg.name}@${plan.version} is already published from this commit.`)\n continue\n }\n const args = ['publish', tarballs.get(pkg.name)!, '--tag', stagingDistTag, '--registry', registry]\n if (pkg.manifest.publishConfig?.access) args.push('--access', String(pkg.manifest.publishConfig.access))\n if (pkg.manifest.publishConfig?.provenance) args.push('--provenance')\n await environment.run('npm', args, { cwd, env: await npmEnv(pkg) })\n log(`✓ Published ${pkg.name}@${plan.version} on ${stagingDistTag}`)\n }\n\n for (const pkg of plan.packages) {\n const registry = getRegistry(pkg.manifest, environment.env)\n const published = await waitForVersion(environment, registry, pkg.name, plan.version)\n if (pkg.manifest.publishConfig?.provenance && !published.dist?.attestations) {\n log(`! ${pkg.name}@${plan.version} has no provenance attestation on ${registry}.`)\n }\n }\n\n for (const pkg of plan.packages) {\n const registry = getRegistry(pkg.manifest, environment.env)\n const tags = (await readPackument(environment, registry, pkg.name))?.['dist-tags'] ?? {}\n const env = await npmEnv(pkg)\n if (tags[plan.channel.distTag] !== plan.version) {\n await environment.run('npm', ['dist-tag', 'add', `${pkg.name}@${plan.version}`, plan.channel.distTag, '--registry', registry], { cwd, env })\n }\n if (tags[stagingDistTag]) {\n await environment.run('npm', ['dist-tag', 'rm', pkg.name, stagingDistTag, '--registry', registry], { cwd, env })\n .catch((error: Error) => log(`! Could not remove the ${stagingDistTag} dist-tag of ${pkg.name}: ${error.message}`))\n }\n log(`✓ ${pkg.name}@${plan.version} is on ${plan.channel.distTag}`)\n }\n } finally {\n fs.rmSync(directory, { recursive: true, force: true })\n // Versions live in tags and on the registry, not in the repository.\n for (const [file, content] of manifests) fs.writeFileSync(file, content)\n }\n\n await git(environment, ['tag', plan.tag, plan.head])\n await git(environment, ['push', 'origin', `refs/tags/${plan.tag}`])\n log(`✓ Pushed ${plan.tag}`)\n\n await publishGitHubRelease(environment, { tag: plan.tag, notes: plan.notes, prerelease: Boolean(plan.channel.prerelease) })\n return { status: 'released', plan }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {\n agentsBlockEnd,\n agentsBlockStart,\n commits,\n getReleaseType,\n legacyCommits,\n defaultReleasePathExcludes,\n getAgentCommitPolicy,\n getReleaseTable,\n parseCommit,\n renderAgentsBlock,\n resolveCommitRelease,\n resolveRelease,\n type CommitDecision,\n type CommitViolation,\n type ReleaseMode\n} from './index'\nimport {\n getDiffFiles,\n getLatestTag,\n getRangeCommits,\n getStagedFiles,\n loadProjectPolicy,\n type ProjectPolicy\n} from './project'\nimport { getReleasePackages, planRelease, runRelease, type ReleasePlan } from './release'\n\nexport interface CommandResult {\n code: number\n output: string\n}\n\nexport interface CommonOptions {\n cwd?: string\n mode?: ReleaseMode\n json?: boolean\n}\n\n// Messages that git or GitHub write for you; commitlint ignores the same ones by default.\nconst ignoredMessagePatterns = [\n /^Merge pull request /,\n /^Merge (?:branch|remote-tracking branch|tag) /,\n /^Merge .+ into .+/,\n /^Merged .+ (?:in|into) .+/,\n /^Automatic merge/,\n /^Auto-merged .+ into .+/,\n /^(?:fixup|squash|amend)! /,\n /^Initial commit$/\n]\n\nexport function isIgnoredMessage(message: string) {\n const header = message.trim().split('\\n')[0] ?? ''\n return ignoredMessagePatterns.some((pattern) => pattern.test(header))\n}\n\nfunction readEditMessage(file: string) {\n return fs.readFileSync(file, 'utf8')\n .split('\\n')\n .filter((line) => !line.startsWith('#'))\n .join('\\n')\n .split(/^-+ >8 -+$/m)[0]\n .trim()\n}\n\nasync function project(options: CommonOptions): Promise<ProjectPolicy> {\n return loadProjectPolicy(options.cwd ?? process.cwd(), options.mode ? { mode: options.mode } : {})\n}\n\nfunction isError(violation: CommitViolation) {\n return (violation.severity ?? 'error') === 'error'\n}\n\nfunction formatViolation(violation: CommitViolation) {\n return ` ${isError(violation) ? '✗' : '!'} ${violation.message}${violation.suggestion ? `\\n Suggested header: ${violation.suggestion}` : ''}`\n}\n\nfunction formatDecision(decision: CommitDecision) {\n const hash = decision.hash ? `${decision.hash.slice(0, 9)} ` : ''\n return `${hash}${(decision.release || 'none').padEnd(5)} ${decision.header}\\n${decision.reasons.map((reason) => ` ${reason}`).join('\\n')}`\n}\n\nexport interface CheckOptions extends CommonOptions {\n /** Commit message file, as passed to a commit-msg hook. Uses staged files. */\n edit?: string\n /** Commit message text. Uses staged files unless `files` is set. */\n message?: string\n /** PR title, checked against the `base...head` diff. */\n title?: string\n base?: string\n head?: string\n /** Commit range, checked commit by commit with each commit's own files. */\n from?: string\n to?: string\n files?: string[]\n}\n\nexport async function check(options: CheckOptions): Promise<CommandResult> {\n const cwd = options.cwd ?? process.cwd()\n const { policy, isReleasePath } = await project(options)\n const pathOptions = isReleasePath ? { isReleasePath } : {}\n let entries: Array<{ message: string, hash?: string, files?: string[], label: string }>\n\n if (options.title !== undefined) {\n const files = options.files ?? (options.base && options.head ? getDiffFiles(cwd, options.base, options.head) : undefined)\n entries = [{ message: options.title, ...(files ? { files } : {}), label: 'PR title' }]\n } else if (options.edit || options.message !== undefined) {\n const message = options.edit ? readEditMessage(path.resolve(cwd, options.edit)) : options.message!\n entries = [{ message, files: options.files ?? getStagedFiles(cwd), label: 'Commit message' }]\n } else if (options.from) {\n entries = getRangeCommits(cwd, options.from, options.to ?? 'HEAD')\n .map((commit) => ({ ...commit, label: commit.hash.slice(0, 9) }))\n } else {\n return { code: 2, output: 'Pass --edit <file>, --message <text>, --title <text>, or --from <ref>.' }\n }\n\n const results = entries\n .filter(({ message }) => !isIgnoredMessage(message))\n .map((entry) => ({\n entry,\n decision: resolveCommitRelease(parseCommit(entry.message, entry.hash), policy, {\n ...pathOptions,\n ...(entry.files ? { files: entry.files } : {})\n })\n }))\n const failures = results.filter(({ decision }) => decision.violations.some(isError))\n\n if (options.json) {\n return {\n code: failures.length ? 1 : 0,\n output: JSON.stringify({ mode: policy.mode, results: results.map(({ entry, decision }) => ({ label: entry.label, ...decision })) }, null, 2)\n }\n }\n if (!failures.length) {\n return {\n code: 0,\n output: [\n ...results.map(({ entry, decision }) => [\n `✓ ${entry.label}: ${decision.release || 'none'} ← ${decision.header}`,\n ...decision.violations.map(formatViolation)\n ].join('\\n')),\n `${results.length} ${results.length === 1 ? 'header follows' : 'headers follow'} the Aronrepo ${policy.mode} release policy.`\n ].join('\\n')\n }\n }\n return {\n code: 1,\n output: [\n ...failures.map(({ entry, decision }) => `${entry.label}: ${decision.header}\\n${decision.violations.map(formatViolation).join('\\n')}`),\n '',\n 'Run `aronrepo policy` to see which types release and which paths ship.'\n ].join('\\n')\n }\n}\n\nexport interface ExplainOptions extends CommonOptions {\n from?: string\n to?: string\n}\n\nexport async function explain(options: ExplainOptions): Promise<CommandResult> {\n const cwd = options.cwd ?? process.cwd()\n const { policy, isReleasePath, releasePaths } = await project(options)\n let plan: Pick<ReleasePlan, 'release' | 'commits'> & Partial<ReleasePlan>\n let from: string | undefined\n let to = options.to ?? 'HEAD'\n\n if (options.from === undefined && options.to === undefined) {\n // The release range of the branch, or of main when the branch does not release.\n plan = await planRelease({ fallbackToMain: true, ...(options.mode ? { mode: options.mode } : {}) }, { cwd })\n from = plan.from\n to = 'HEAD'\n } else {\n from = options.from ?? getLatestTag(cwd, to)\n plan = resolveRelease(getRangeCommits(cwd, from, to), policy, isReleasePath ? { isReleasePath } : {})\n }\n\n if (options.json) {\n return {\n code: 0,\n output: JSON.stringify({\n mode: policy.mode,\n ...(plan.branch ? { branch: plan.branch } : {}),\n ...(plan.channel ? { channel: plan.channel } : {}),\n from: from ?? null,\n to,\n releasePaths: releasePaths ?? null,\n release: plan.release,\n version: plan.version ?? null,\n tag: plan.tag ?? null,\n commits: plan.commits\n }, null, 2)\n }\n }\n return {\n code: 0,\n output: [\n `Range: ${from ? `${from}..${to}` : `all commits up to ${to}`}`,\n `Mode: ${policy.mode}`,\n ...(plan.channel ? [`Channel: ${plan.channel.branch} (npm dist-tag ${plan.channel.distTag})`] : []),\n `Release paths: ${releasePaths?.include ? releasePaths.include.join(', ') : 'every path'}`,\n '',\n ...(plan.commits.length ? plan.commits.map(formatDecision) : ['No commits.']),\n '',\n `Next release: ${plan.release || 'none'}${plan.version ? ` (${plan.version})` : ''}`\n ].join('\\n')\n }\n}\n\nexport interface ReleaseCommandOptions extends CommonOptions {\n dryRun?: boolean\n branch?: string\n /** Receives progress lines; defaults to stdout. JSON output stays quiet. */\n log?: (message: string) => void\n}\n\nexport async function release(options: ReleaseCommandOptions): Promise<CommandResult> {\n const cwd = options.cwd ?? process.cwd()\n const result = await runRelease({\n ...(options.mode ? { mode: options.mode } : {}),\n ...(options.branch ? { branch: options.branch } : {}),\n ...(options.dryRun ? { dryRun: true } : {})\n }, { cwd, log: options.json ? () => {} : options.log ?? ((message) => console.log(message)) })\n if (!options.json) return { code: 0, output: '' }\n const { packages, ...plan } = result.plan\n return {\n code: 0,\n output: JSON.stringify({ status: result.status, ...plan, packages: packages.map(({ dir, name }) => ({ dir, name })) }, null, 2)\n }\n}\n\nexport async function policy(options: CommonOptions & { markdown?: boolean }): Promise<CommandResult> {\n const resolved = await project(options)\n if (options.markdown) {\n return { code: 0, output: renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) }) }\n }\n const data = {\n mode: resolved.policy.mode,\n configFile: resolved.configFile ? path.relative(resolved.cwd, resolved.configFile) : null,\n releasePaths: resolved.releasePaths ?? null,\n releaseTable: getReleaseTable(resolved.policy),\n types: commits.map(({ type, scope, description, group }) => ({\n type,\n ...(scope ? { scope } : {}),\n release: getReleaseType(type, scope, resolved.policy) ?? false,\n description,\n ...(group ? { group } : {})\n })),\n legacyTypes: legacyCommits,\n agent: getAgentCommitPolicy(resolved.policy, { cli: resolved.cli })\n }\n if (options.json) return { code: 0, output: JSON.stringify(data, null, 2) }\n return {\n code: 0,\n output: [\n `Mode: ${data.mode}${data.configFile ? ` (${data.configFile})` : ' (default; no aronrepo.config.js)'}`,\n `Release paths: ${data.releasePaths?.include ? data.releasePaths.include.join(', ') : 'every path'}`,\n ...(data.releasePaths?.include ? [`Excluded: ${(data.releasePaths.exclude ?? defaultReleasePathExcludes).join(', ')}`] : []),\n '',\n `Major: ${data.releaseTable.major.join(', ') || '-'}`,\n `Minor: ${data.releaseTable.minor.join(', ') || '-'}`,\n `Patch: ${data.releaseTable.patch.join(', ') || '-'}`,\n `None: ${data.releaseTable.none.join(', ') || '-'}`,\n '',\n ...data.agent.ownerDecisions.map((rule) => `- ${rule}`)\n ].join('\\n')\n }\n}\n\nexport function replaceAgentsBlock(content: string, block: string) {\n const start = content.indexOf(agentsBlockStart)\n const end = content.indexOf(agentsBlockEnd)\n if (start !== -1 && end > start) {\n return content.slice(0, start) + block + content.slice(end + agentsBlockEnd.length)\n }\n return `${content.trimEnd()}${content.trim() ? '\\n\\n' : ''}${block}\\n`\n}\n\nexport function readAgentsBlock(content: string) {\n const start = content.indexOf(agentsBlockStart)\n const end = content.indexOf(agentsBlockEnd)\n return start !== -1 && end > start ? content.slice(start, end + agentsBlockEnd.length) : undefined\n}\n\nexport async function agents(options: CommonOptions & { file?: string, write?: boolean }): Promise<CommandResult> {\n const resolved = await project(options)\n const file = path.resolve(resolved.cwd, options.file ?? 'AGENTS.md')\n const relative = path.relative(resolved.cwd, file)\n const block = renderAgentsBlock(resolved.policy, { cli: resolved.cli, ...(resolved.releasePaths ? { releasePaths: resolved.releasePaths } : {}) })\n const content = fs.existsSync(file) ? fs.readFileSync(file, 'utf8') : ''\n\n if (options.write) {\n const next = replaceAgentsBlock(content || '# Agent Guide\\n', block)\n if (next === content) return { code: 0, output: `✓ ${relative} is up to date.` }\n fs.writeFileSync(file, next)\n return { code: 0, output: `✓ Wrote the Aronrepo commit policy block to ${relative}.` }\n }\n const current = readAgentsBlock(content)\n if (current === block) return { code: 0, output: `✓ ${relative} has the current Aronrepo commit policy block.` }\n return {\n code: 1,\n output: `✗ ${relative} ${current ? 'has an outdated' : 'is missing the'} Aronrepo commit policy block. Run \\`aronrepo agents --write\\`.`\n }\n}\n\ninterface DoctorCheck {\n status: 'pass' | 'warn' | 'fail'\n message: string\n fix?: string\n}\n\nfunction findFile(cwd: string, names: string[]) {\n return names.map((name) => path.join(cwd, name)).find((file) => fs.existsSync(file))\n}\n\nfunction readText(file: string | undefined) {\n return file ? fs.readFileSync(file, 'utf8') : ''\n}\n\nconst legacyDependencies = [\n 'semantic-release',\n '@commitlint/cli',\n '@aronrepo/commitlint-config',\n '@aronrepo/conventional-changelog-config',\n '.',\n '@aronrepo/semantic-release-config',\n '@aronrepo/semantic-release-pnpm'\n]\n\nconst legacyConfigFiles = [\n 'release.config.js', 'release.config.mjs', 'release.config.cjs', '.releaserc', '.releaserc.js', '.releaserc.mjs', '.releaserc.json',\n 'commitlint.config.js', 'commitlint.config.mjs', 'commitlint.config.ts', '.commitlintrc', '.commitlintrc.js', '.commitlintrc.mjs', '.commitlintrc.json'\n]\n\nexport async function doctor(options: CommonOptions): Promise<CommandResult> {\n const cwd = options.cwd ?? process.cwd()\n const checks: DoctorCheck[] = []\n let resolved: ProjectPolicy | undefined\n\n try {\n resolved = await project(options)\n checks.push(resolved.configFile\n ? { status: 'pass', message: `Release mode ${resolved.policy.mode} from ${path.relative(cwd, resolved.configFile)}.` }\n : {\n status: 'warn',\n message: `No aronrepo.config.js; using the default ${resolved.policy.mode} mode.`,\n fix: 'Ask the repository owner whether releases are explicit (owner-controlled) or auto, then create aronrepo.config.js with `release.mode`.'\n })\n } catch (error) {\n checks.push({ status: 'fail', message: `aronrepo.config.js failed to load: ${(error as Error).message}` })\n }\n\n if (resolved) {\n checks.push(resolved.releasePaths?.include\n ? { status: 'pass', message: `Release paths: ${resolved.releasePaths.include.join(', ')}.` }\n : {\n status: 'warn',\n message: 'No published package found; every path can release a version.',\n fix: 'Set `release.paths.include` in aronrepo.config.js, or add `publishConfig.access: \"public\"` to published packages.'\n })\n }\n\n const pkg = JSON.parse(readText(findFile(cwd, ['package.json'])) || '{}') as Record<string, Record<string, string> | undefined>\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies }\n checks.push(dependencies.aronrepo\n ? { status: 'pass', message: 'aronrepo is installed.' }\n : { status: 'fail', message: 'aronrepo is not a dependency.', fix: 'Install it as a dev dependency, for example `bun add -d aronrepo`.' })\n\n const leftovers = [\n ...legacyDependencies.filter((name) => dependencies[name]),\n ...legacyConfigFiles.filter((name) => fs.existsSync(path.join(cwd, name)))\n ]\n checks.push(leftovers.length\n ? {\n status: 'warn',\n message: `Leftovers from semantic-release or commitlint: ${leftovers.join(', ')}.`,\n fix: 'Remove them; `aronrepo check` lints commits and `aronrepo release` publishes releases.'\n }\n : { status: 'pass', message: 'No semantic-release or commitlint leftovers.' })\n\n try {\n const releasePackages = getReleasePackages(cwd)\n const rootRepository = (pkg as Record<string, unknown>).repository\n const withoutRepository = releasePackages.filter(({ manifest }) => manifest.publishConfig?.provenance && !manifest.repository && !rootRepository)\n checks.push(!releasePackages.length\n ? { status: 'warn', message: '`aronrepo release` finds no published package.', fix: 'Add `\"publishConfig\": { \"access\": \"public\" }` to each package that ships.' }\n : withoutRepository.length\n ? { status: 'warn', message: `npm provenance needs a \\`repository\\` field: ${withoutRepository.map(({ name }) => name).join(', ')}.`, fix: 'Add `repository` to those package.json files.' }\n : { status: 'pass', message: `\\`aronrepo release\\` publishes ${releasePackages.map(({ name }) => name).join(', ')}.` })\n } catch (error) {\n checks.push({ status: 'fail', message: (error as Error).message })\n }\n\n const hook = readText(findFile(cwd, ['.husky/commit-msg']))\n checks.push(hook.includes('aronrepo check')\n ? { status: 'pass', message: '.husky/commit-msg runs aronrepo check.' }\n : {\n status: 'warn',\n message: 'No commit-msg hook runs `aronrepo check`.',\n fix: 'Add .husky/commit-msg with `aronrepo check --edit \"$1\"`.'\n })\n\n const agentsResult = await agents({ ...options, cwd })\n checks.push(agentsResult.code === 0\n ? { status: 'pass', message: 'AGENTS.md has the current commit policy block.' }\n : { status: 'fail', message: agentsResult.output.replace(/^✗ /, ''), fix: 'aronrepo agents --write' })\n\n const failed = checks.some(({ status }) => status === 'fail')\n if (options.json) return { code: failed ? 1 : 0, output: JSON.stringify({ ok: !failed, checks }, null, 2) }\n const icon = { pass: '✓', warn: '!', fail: '✗' }\n return {\n code: failed ? 1 : 0,\n output: [\n ...checks.map(({ status, message, fix }) => `${icon[status]} ${message}${fix ? `\\n Fix: ${fix}` : ''}`),\n '',\n failed ? 'Aronrepo setup is incomplete.' : 'Aronrepo setup is complete.'\n ].join('\\n')\n }\n}\n"],"mappings":";;;;;;;;;;AA8BA,MAAa,kBAAkB,CAAC,sBAAsB,qBAAqB;AAE3E,SAAS,YAAY,OAAe;CAChC,OAAO,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG;AACzC;AAEA,SAASA,WAAY,MAAc;CAC/B,OAAO,KAAK,MAAM,GAAG,aAAa,MAAM,MAAM,CAAC;AACnD;AAEA,SAAgB,eAAe,MAAM,QAAQ,IAAI,GAAG;CAChD,OAAO,gBACF,KAAK,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CACnC,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC;AAC3C;;AAGA,eAAsB,WAAW,MAAM,QAAQ,IAAI,GAA4B;CAC3E,MAAM,OAAO,eAAe,GAAG;CAC/B,IAAI,CAAC,MAAM,OAAO,CAAC;CAEnB,MAAM,OAAO,GAAG,SAAS,IAAI;CAG7B,QAAO,MADc,OAAO,GADb,cAAc,IAAI,CAAC,CAAC,KAAK,SAAS,KAAK,QAAQ,QAAQ,KAAK,QAAA,CAE7D,WAAW,CAAC;AAC9B;AAEA,SAAS,mBAAmB,KAAa;CACrC,MAAM,gBAAgB,KAAK,KAAK,KAAK,qBAAqB;CAC1D,IAAI,CAAC,GAAG,WAAW,aAAa,GAAG,OAAO,KAAA;CAG1C,OADkBC,KAAS,GAAG,aAAa,eAAe,MAAM,CACjD,CAAC,EAAE;AACtB;AAEA,SAAS,kBAAkB,KAAa;CACpC,MAAM,cAAc,KAAK,KAAK,KAAK,cAAc;CACjD,IAAI,CAAC,GAAG,WAAW,WAAW,GAAG,OAAO,KAAA;CAExC,MAAM,MAAMD,WAAsB,WAAW;CAC7C,OAAO,MAAM,QAAQ,IAAI,UAAU,IAC7B,IAAI,aACJ,IAAI,YAAY;AAC1B;AAEA,SAAgB,sBAAsB,MAAM,QAAQ,IAAI,GAAG;CACvD,OAAO,mBAAmB,GAAG,KAAK,kBAAkB,GAAG,KAAK,CAAC;AACjE;AAEA,SAAgB,mBAAmB,UAAoB,MAAM,QAAQ,IAAI,GAAG;CACxE,IAAI,CAAC,SAAS,QAAQ,OAAO,CAAC;CAE9B,OAAO,SACH,SAAS,KAAK,cAAc,GAAG,UAAU,cAAc,GACvD;EACI;EACA,WAAW;EACX,mBAAmB;EACnB,QAAQ,CACJ,oBACJ;CACJ,CACJ,CAAC,CACI,KAAK,qBAAqB,YAAY,gBAAgB,CAAC,CAAC,QAAQ,qBAAqB,EAAE,KAAK,GAAG,CAAC,CAChG,KAAK;AACd;AAEA,SAAgB,qBAAqB,KAAa,WAAmB;CACjE,OAAOA,WAAsB,KAAK,KAAK,KAAK,WAAW,cAAc,CAAC;AAC1E;;AAGA,SAAgB,yBAAyB,MAAM,QAAQ,IAAI,GAAG;CAC1D,OAAO,mBAAmB,sBAAsB,GAAG,GAAG,GAAG,CAAC,CACrD,QAAQ,cAAc,qBAAqB,KAAK,SAAS,CAAC,CAAC,eAAe,WAAW,QAAQ;AACtG;;;;;;;;AASA,SAAgB,oBAAoB,MAAM,QAAQ,IAAI,GAAG,QAAuE;CAC5H,IAAI,QAAQ,UAAU,OAAO,OAAO,KAAA;CACpC,IAAI,QAAQ,OAAO,SACf,OAAO;EAAE,SAAS,OAAO,MAAM;EAAS,SAAS,OAAO,MAAM,WAAW;CAA2B;CAExG,MAAM,UAAU,QAAQ,OAAO,WAAW;CAC1C,MAAM,mBAAmB,yBAAyB,GAAG;CACrD,IAAI,iBAAiB,QACjB,OAAO;EAAE,SAAS,iBAAiB,KAAK,QAAQ,QAAQ,MAAM,OAAO,GAAG,IAAI,IAAI;EAAG;CAAQ;CAE/F,MAAM,cAAc,KAAK,KAAK,KAAK,cAAc;CACjD,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC,UAAU,GAAG,WAAW,WAAW,KAAK,CAACA,WAAsB,WAAW,CAAC,CAAC,SACxG,OAAO;EAAE,SAAS,CAAC,IAAI;EAAG;CAAQ;AAG1C;AAIA,MAAM,YAA6C;CAC/C,CAAC,YAAY,KAAK;CAClB,CAAC,aAAa,KAAK;CACnB,CAAC,kBAAkB,MAAM;CACzB,CAAC,uBAAuB,MAAM;CAC9B,CAAC,aAAa,MAAM;CACpB,CAAC,qBAAqB,KAAK;AAC/B;;AAGA,SAAgB,qBAAqB,MAAM,QAAQ,IAAI,GAAmB;CACtE,MAAM,cAAc,KAAK,KAAK,KAAK,cAAc;CACjD,MAAM,WAAW,GAAG,WAAW,WAAW,IAAI,OAAOA,WAAsB,WAAW,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK;CAC9H,IAAI,aAAa,SAAS,aAAa,UAAU,aAAa,UAAU,aAAa,OAAO,OAAO;CACnG,OAAO,UAAU,MAAM,CAAC,UAAU,GAAG,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM;AACnF;;AAGA,SAAgB,cAAc,gBAAgC;CAC1D,OAAO;EACH,KAAK;EACL,MAAM;EACN,MAAM;EACN,KAAK;CACT,EAAE;AACN;;;;;AAMA,SAAgB,qBAAqB,KAAa,iBAAiB,qBAAqB,GAAG,GAAG;CAC1F,MAAM,cAAc,KAAK,KAAK,KAAK,cAAc;CAEjD,KADgB,GAAG,WAAW,WAAW,IAAIA,WAAsB,WAAW,CAAC,CAAC,UAAgD,KAAA,EAAA,EACnH,UAAU,OAAO,mBAAmB,QAAQ,wBAAwB,GAAG,eAAe;CACnG,OAAO,cAAc,cAAc;AACvC;;AAeA,eAAsB,kBAAkB,MAAM,QAAQ,IAAI,GAAG,YAAoC,CAAC,GAA2B;CACzH,MAAM,SAAS,MAAM,WAAW,GAAG;CACnC,MAAM,SAAS;EAAE,GAAG,iBAAiB,MAAM;EAAG,GAAG;CAAU;CAC3D,MAAM,eAAe,oBAAoB,KAAK,MAAM;CACpD,MAAM,aAAa,eAAe,GAAG;CACrC,MAAM,iBAAiB,qBAAqB,GAAG;CAC/C,OAAO;EACH;EACA;EACA,KAAK,qBAAqB,KAAK,cAAc;EAC7C;EACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC;EACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;EACvC,GAAI,eAAe,EAAE,eAAe,yBAAyB,YAAY,EAAE,IAAI,CAAC;CACpF;AACJ;AAEA,SAASE,MAAI,KAAa,MAAgB;CACtC,OAAO,aAAa,OAAO,MAAM;EAAE;EAAK,UAAU;EAAQ,WAAW;CAAiB,CAAC;AAC3F;AAEA,SAAS,WAAW,QAAgB;CAChC,OAAO,OAAO,MAAM,IAAI,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO;AACvE;;AAGA,SAAgB,eAAe,KAAa,MAAc;CACtD,OAAO,WAAWA,MAAI,KAAK;EAAC;EAAa;EAAkB;EAAe;EAAM;EAAU;CAAI,CAAC,CAAC;AACpG;AAEA,SAAgB,eAAe,MAAM,QAAQ,IAAI,GAAG;CAChD,OAAO,WAAWA,MAAI,KAAK;EAAC;EAAQ;EAAY;CAAa,CAAC,CAAC;AACnE;;AAGA,SAAgB,aAAa,KAAa,MAAc,MAAc;CAClE,OAAO,WAAWA,MAAI,KAAK;EAAC;EAAQ;EAAe,GAAG,KAAK,KAAK;CAAM,CAAC,CAAC;AAC5E;;AAGA,SAAgB,gBAAgB,KAAa,MAA0B,KAAK,QAAiC;CAGzG,OADeA,MAAI,KAAK;EAAC;EAAO;EAAa;EAD/B,OAAO,GAAG,KAAK,IAAI,OAAO;CACmC,CAC/D,CAAC,CAAC,MAAM,GAAM,CAAC,CACtB,KAAK,UAAU,MAAM,QAAQ,OAAO,EAAE,CAAC,CAAC,CACxC,QAAQ,UAAU,MAAM,SAAS,GAAM,CAAC,CAAC,CACzC,KAAK,UAAU;EACZ,MAAM,CAAC,MAAM,WAAW,MAAM,MAAM,GAAM;EAC1C,OAAO;GAAE;GAAM,SAAS,QAAQ,KAAK;GAAG,OAAO,eAAe,KAAK,IAAI;EAAE;CAC7E,CAAC;AACT;;AAGA,SAAgB,aAAa,KAAa,MAAM,QAAQ;CACpD,IAAI;EACA,OAAOA,MAAI,KAAK;GAAC;GAAY;GAAU;GAAc;EAAG,CAAC,CAAC,CAAC,KAAK,KAAK,KAAA;CACzE,QAAQ;EACJ;CACJ;AACJ;;AAGA,eAAsB,aAAa,KAAa,MAA0B,KAAK,QAAQ,YAAoC,CAAC,GAAG;CAC3H,MAAM,UAAU,MAAM,kBAAkB,KAAK,SAAS;CACtD,MAAM,UAAU,gBAAgB,KAAK,MAAM,EAAE;CAC7C,OAAO;EACH,GAAG;EACH;EACA;EACA,GAAG,eAAe,SAAS,QAAQ,QAAQ,QAAQ,gBAAgB,EAAE,eAAe,QAAQ,cAAc,IAAI,CAAC,CAAC;CACpH;AACJ;;ACvOA,MAAa,mBAAmB;;AAGhC,MAAa,iBAAiB;;AAG9B,MAAa,mBAAmB;AAqBhC,MAAa,cAAsB,SAAS,MAAM,EAAE,KAAK,UAAU,IAAI,SAAS,SAAS,WAAW;CAChG,MAAM,QAAQ,MAAM,SAAS,MAAM;EAAE;EAAK;EAAK,OAAO;GAAC;GAAU;GAAQ;EAAM;EAAG,OAAO,QAAQ,aAAa;CAAQ,CAAC;CACvH,IAAI,SAAS;CACb,IAAI,SAAS;CACb,MAAM,OAAO,GAAG,SAAS,UAAU;EAAE,UAAU;CAAM,CAAC;CACtD,MAAM,OAAO,GAAG,SAAS,UAAU;EAAE,UAAU;CAAM,CAAC;CACtD,MAAM,GAAG,SAAS,MAAM;CACxB,MAAM,GAAG,UAAU,SAAS;EACxB,IAAI,SAAS,GAAG,QAAQ;GAAE;GAAQ;EAAO,CAAC;OACrC,uBAAO,IAAI,MAAM,KAAK,QAAQ,GAAG,KAAK,KAAK,GAAG,EAAE,iBAAiB,KAAK,KAAK,OAAO,KAAK,KAAK,OAAO,KAAK,GAAG,CAAC;CACrH,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,UAAuC,CAAC,GAAuB;CACtF,OAAO;EACH,KAAK,QAAQ,OAAO,QAAQ,IAAI;EAChC,KAAK,QAAQ,OAAO,QAAQ;EAC5B,KAAK,QAAQ,OAAO;EACpB,OAAO,QAAQ,WAAW,OAAO,SAAS,MAAM,OAAO,IAAI;EAC3D,KAAK,QAAQ,SAAS,YAAY,QAAQ,IAAI,OAAO;EACrD,MAAM,QAAQ,UAAU,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,EAAE,CAAC;CACnF;AACJ;AAEA,eAAe,IAAI,aAAiC,MAAgB;CAChE,QAAQ,MAAM,YAAY,IAAI,OAAO,MAAM;EAAE,KAAK,YAAY;EAAK,KAAK,YAAY;CAAI,CAAC,EAAA,CAAG,OAAO,KAAK;AAC5G;AAEA,SAAS,MAAM,QAAgB;CAC3B,OAAO,OAAO,MAAM,IAAI,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO;AACvE;AASA,SAAS,SAAY,MAAc;CAC/B,OAAO,KAAK,MAAM,GAAG,aAAa,MAAM,MAAM,CAAC;AACnD;AAEA,MAAM,mBAAmB;CAAC;CAAgB;CAAwB;AAAkB;;AAGpF,SAAgB,mBAAmB,KAA+B;CAC9D,IAAI,OAAO,yBAAyB,GAAG;CACvC,IAAI,CAAC,KAAK,UAAU,CAAC,sBAAsB,GAAG,CAAC,CAAC,QAAQ;EACpD,MAAM,OAAO,KAAK,KAAK,KAAK,cAAc;EAC1C,IAAI,GAAG,WAAW,IAAI,KAAK,CAAC,SAAsB,IAAI,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG;CAChF;CACA,MAAM,WAAW,KAAK,KAAK,QAAQ;EAC/B,MAAM,WAAW,SAAsB,KAAK,KAAK,KAAK,KAAK,cAAc,CAAC;EAC1E,IAAI,CAAC,SAAS,MAAM,MAAM,IAAI,MAAM,GAAG,IAAI,2BAA2B;EACtE,OAAO;GAAE;GAAK,MAAM,SAAS;GAAM;EAAS;CAChD,CAAC;CACD,MAAM,QAAQ,IAAI,IAAI,SAAS,KAAK,EAAE,WAAW,IAAI,CAAC;CACtD,MAAM,kBAAkB,QAAwB,iBAC3C,SAAS,UAAU,OAAO,KAAM,IAAI,SAAS,UAAU,CAAC,CAA4B,CAAC,CAAC,CACtF,QAAQ,SAAS,MAAM,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI;CAE1D,MAAM,UAA4B,CAAC;CACnC,MAAM,2BAAW,IAAI,IAAY;CACjC,MAAM,SAAS,QAAwB;EACnC,IAAI,QAAQ,SAAS,GAAG,GAAG;EAC3B,IAAI,SAAS,IAAI,IAAI,IAAI,GAAG,MAAM,IAAI,MAAM,8DAA8D,IAAI,KAAK,EAAE;EACrH,SAAS,IAAI,IAAI,IAAI;EACrB,KAAK,MAAM,QAAQ,eAAe,GAAG,GAAG,MAAM,SAAS,MAAM,cAAc,UAAU,SAAS,IAAI,CAAE;EACpG,SAAS,OAAO,IAAI,IAAI;EACxB,QAAQ,KAAK,GAAG;CACpB;CACA,KAAK,MAAM,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG;CACrF,OAAO;AACX;;AA8BA,SAAgB,iBAAiB,KAAa,MAAyB,QAAQ,KAAK;CAChF,IAAI,IAAI,mBAAmB,OAAO,GAAG,IAAI,qBAAqB,qBAAqB,GAAG,IAAI;CAC1F,MAAM,OAAO,KAAK,KAAK,KAAK,cAAc;CAC1C,IAAI,CAAC,GAAG,WAAW,IAAI,GAAG,OAAO,KAAA;CACjC,MAAM,aAAa,SAAsB,IAAI,CAAC,CAAC;CAC/C,MAAM,MAAM,OAAO,eAAe,WAAW,aAAa,YAAY;CACtE,MAAM,QAAQ,OAAO,gDAAgD,KAAK,GAAG;CAC7E,OAAO,QAAQ,sBAAsB,MAAM,OAAO,KAAA;AACtD;AAEA,eAAe,UAAU,aAAiC,QAAiB;CACvE,OAAO,UAAU,YAAY,IAAI,mBAAmB,MAAM,IAAI,aAAa;EAAC;EAAa;EAAgB;CAAM,CAAC;AACpH;;AAGA,eAAsB,YAAY,UAA8B,CAAC,GAAG,qBAAkD,CAAC,GAAyB;CAC5I,MAAM,cAAc,kBAAkB,kBAAkB;CACxD,MAAM,EAAE,QAAQ;CAChB,MAAM,UAAU,MAAM,kBAAkB,KAAK,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC,CAAC;CACvF,MAAM,SAAS,MAAM,UAAU,aAAa,QAAQ,MAAM;CAC1D,MAAM,UAAU,kBAAkB,MAAM,MAAM,QAAQ,iBAAiB,kBAAkB,MAAM,IAAI,KAAA;CACnG,MAAM,OAAO,MAAM,IAAI,aAAa,CAAC,aAAa,MAAM,CAAC;CACzD,MAAM,UAAU,IAAI,IAAI,QAAQ,cAAc,CAAC,CAAC;CAChD,MAAM,YAAY,MAAM,MAAM,IAAI,aAAa;EAAC;EAAO;EAAU;EAAM;EAAY;CAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;CAC9H,MAAM,MAAM,MAAM,MAAM,IAAI,aAAa;EAAC;EAAO;EAAU;CAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;CACpG,MAAM,WAAW,mBAAmB,GAAG;CACvC,MAAM,OAAoB;EAAE;EAAQ;EAAM,MAAM,QAAQ,OAAO;EAAM,SAAS;EAAO,SAAS,CAAC;EAAG;CAAS;CAC3G,IAAI,CAAC,SAAS,OAAO;CAErB,MAAM,OAAO,WAAW,SAAS,SAAS;CAC1C,MAAM,WAAW,eACb,gBAAgB,KAAK,MAAM,MAAM,GACjC,QAAQ,QACR,QAAQ,gBAAgB,EAAE,eAAe,QAAQ,cAAc,IAAI,CAAC,CACxE;CACA,MAAM,OAAoB;EAAE,GAAG;EAAM;EAAS,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;EAAI,SAAS,SAAS;EAAS,SAAS,SAAS;CAAQ;CAC9H,IAAI,CAAC,SAAS,SAAS,OAAO;CAE9B,MAAM,UAAU,eAAe,SAAS,SAAS,SAAS;EAAE;EAAW;CAAI,CAAC;CAC5E,MAAM,gBAAgB,iBAAiB,KAAK,YAAY,GAAG;CAC3D,OAAO;EACH,GAAG;EACH;EACA,KAAK,aAAa,OAAO;EACzB,OAAO,mBAAmB;GACtB;GACA,GAAI,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;GACpC,MAAM,QAAQ,yBAAQ,IAAI,KAAK,EAAA,CAAE,YAAY,CAAC,CAAC,MAAM,GAAG,EAAE;GAC1D,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;GACzC,SAAS,SAAS;EACtB,CAAC;CACL;AACJ;;AAGA,SAAgB,YAAY,UAAuB,MAAyB,QAAQ,KAAK;CACrF,MAAM,QAAQ,SAAS,MAAM,WAAW,GAAG,IAAI,SAAS,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,KAAA;CAC7E,MAAM,cAAc,QAAQ,SAAS,gBAAgB,GAAG,MAAM,cAAc,KAAA,MACrE,SAAS,eAAe,YACxB,IAAI;CACX,MAAM,WAAW,OAAO,eAAe,YAAY,aAAa,aAAa;CAC7E,OAAO,SAAS,SAAS,GAAG,IAAI,WAAW,GAAG,SAAS;AAC3D;AAEA,SAAS,SAAS,UAAkB;CAChC,MAAM,MAAM,IAAI,IAAI,QAAQ;CAC5B,OAAO,KAAK,IAAI,OAAO,IAAI,SAAS,SAAS,GAAG,IAAI,IAAI,WAAW,GAAG,IAAI,SAAS;AACvF;AAYA,eAAe,cAAc,aAAiC,UAAkB,MAA8C;CAC1H,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,EAC/E,SAAS;EAAE,QAAQ;EAAoB,iBAAiB;CAAW,EACvE,CAAC;CACD,IAAI,SAAS,WAAW,KAAK,OAAO,KAAA;CACpC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,kBAAkB,KAAK,QAAQ,SAAS,IAAI,SAAS,OAAO,GAAG,SAAS,YAAY;CACtH,OAAO,MAAM,SAAS,KAAK;AAC/B;AAEA,eAAe,iBAAiB,aAAiC,UAAkB;CAC/E,MAAM,EAAE,8BAA8B,KAAK,gCAAgC,UAAU,YAAY;CACjG,IAAI,CAAC,OAAO,CAAC,OAAO,OAAO,KAAA;CAC3B,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,MAAM,IAAI,SAAS,GAAG,IAAI,MAAM,IAAI,WAAW,mBAAmB,QAAQ,KAAK,EACvH,SAAS;EAAE,eAAe,UAAU;EAAS,QAAQ;CAAmB,EAC5E,CAAC;CACD,IAAI,CAAC,SAAS,IAAI;EACd,YAAY,IAAI,gDAAgD,SAAS,OAAO,GAAG,SAAS,YAAY;EACxG;CACJ;CACA,QAAQ,MAAM,SAAS,KAAK,EAAA,CAAyB;AACzD;;AAGA,eAAsB,kBAAkB,aAAiC,MAAc,UAAkB;CACrG,IAAI,aAAA,+BAA+B,OAAO,KAAA;CAC1C,MAAM,WAAW,YAAY,IAAI,gBAAgB,MAAM,iBAAiB,aAAa,wBAAwB;CAC7G,IAAI,CAAC,UAAU,OAAO,KAAA;CACtB,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,iBAAiB,uCAAuC,mBAAmB,IAAI,KAAK;EAC5H,QAAQ;EACR,SAAS,EAAE,eAAe,UAAU,WAAW;CACnD,CAAC;CACD,IAAI,CAAC,SAAS,IAAI;EACd,YAAY,IAAI,2CAA2C,KAAK,IAAI,SAAS,OAAO,GAAG,SAAS,YAAY;EAC5G;CACJ;CACA,QAAQ,MAAM,SAAS,KAAK,EAAA,CAAyB;AACzD;AAEA,SAAS,UAAU,MAAc;CAC7B,OAAO,GAAG,WAAW,IAAI,IAAI,GAAG,aAAa,MAAM,MAAM,IAAI;AACjE;AAEA,SAAS,gBAAgB,SAAiB,UAAkB;CACxD,MAAM,SAAS,SAAS,QAAQ;CAChC,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,MAAM,SAAS;EACzC,MAAM,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK;EACpC,OAAO,QAAQ,gBAAgB,QAAQ,WAAW,IAAI,WAAW,GAAG,OAAO,OAAO;CACtF,CAAC;AACL;;;;;AAMA,eAAe,aAAa,aAAiC,MAAc,UAAkB,WAAmB;CAC5G,MAAM,aAAa,YAAY,IAAI,yBAAyB,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ;CAE5F,IAAI,gBADa,CAAC,UAAU,KAAK,KAAK,YAAY,KAAK,QAAQ,CAAC,GAAG,UAAU,UAAU,CAAC,CAAC,CAAC,KAAK,IACpE,GAAG,QAAQ,GAAG,OAAO,YAAY;CAE5D,MAAM,QAAQ,MAAM,kBAAkB,aAAa,MAAM,QAAQ,KAAK,YAAY,IAAI;CACtF,IAAI,CAAC,OACD,MAAM,IAAI,MAAM,mBAAmB,KAAK,wGAAwG,SAAS,EAAE;CAE/J,MAAM,OAAO,KAAK,KAAK,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,EAAE,OAAO;CACvE,GAAG,cAAc,MAAM,GAAG,UAAU,UAAU,CAAC,CAAC,KAAK,EAAE,IAAI,SAAS,QAAQ,EAAE,cAAc,MAAM,KAAK,EAAE,MAAM,IAAM,CAAC;CACtH,OAAO;EAAE,GAAG,YAAY;EAAK,uBAAuB;CAAK;AAC7D;AAEA,SAAS,aAAa,SAAiB;CACnC,OAAO,WAAW,KAAK,OAAO,CAAC,GAAG,MAAM;AAC5C;;AAGA,SAAgB,qBAAqB,KAAa,KAAa,SAAiB,SAAiB;CAC7F,MAAM,OAAO,KAAK,KAAK,KAAK,KAAK,cAAc;CAC/C,MAAM,UAAU,GAAG,aAAa,MAAM,MAAM;CAC5C,MAAM,WAAW,KAAK,MAAM,OAAO;CACnC,SAAS,UAAU;CACnB,SAAS,UAAU;CACnB,GAAG,cAAc,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,aAAa,OAAO,CAAC,EAAE,GAAG;CACnF,OAAO;AACX;AAEA,SAAS,YAAY,gBAAgC,aAAyC;CAC1F,QAAQ,gBAAR;EACI,KAAK,OACD,OAAO,CAAC,OAAO;GAAC;GAAM;GAAQ;GAAiB;GAAa;EAAS,CAAC;EAC1E,KAAK,QACD,OAAO,CAAC,QAAQ;GAAC;GAAQ;GAAsB;EAAW,CAAC;EAC/D,KAAK,QACD,OAAO,CAAC,QAAQ;GAAC;GAAQ;GAAS,KAAK,KAAK,aAAa,aAAa;EAAC,CAAC;EAC5E,SACI,OAAO,CAAC,OAAO;GAAC;GAAQ;GAAsB;EAAW,CAAC;CAClE;AACJ;;AAGA,SAAgB,mBAAmB,SAA8B;CAC7D,MAAM,UAAU,WAAW,GAAG,aAAa,OAAO,CAAC;CACnD,IAAI,SAAS;CACb,IAAI;CACJ,OAAO,SAAS,OAAO,QAAQ,QAAQ;EACnC,MAAM,SAAS,QAAQ,SAAS,QAAQ,SAAS,GAAG;EACpD,IAAI,OAAO,OAAO,SAAS,SAAS,CAAC,GAAG;EACxC,MAAM,SAAS,OAAe,WAAmB,OAAO,SAAS,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,QAAQ,UAAU,EAAE;EAC7H,MAAM,OAAO,SAAS,MAAM,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;EACrD,MAAM,OAAO,MAAM,KAAK,CAAC;EACzB,MAAM,SAAS,MAAM,KAAK,GAAG;EAC7B,MAAM,OAAO,aAAa,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,GAAG,MAAM,MAAM,GAAG,GAAG;EAC9E,MAAM,OAAO,QAAQ,SAAS,SAAS,KAAK,SAAS,MAAM,IAAI;EAC/D,WAAW,KAAA;EACX,IAAI,SAAS,KACT,WAAW,KAAK,SAAS,MAAM,CAAC,CAAC,QAAQ,UAAU,EAAE;OAClD,IAAI,SAAS,KAAK;GACrB,MAAM,aAAa,sBAAsB,KAAK,KAAK,SAAS,MAAM,CAAC;GACnE,IAAI,YAAY,WAAW,WAAW;EAC1C,OAAO,IAAI,KAAK,QAAQ,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,gBACnE,OAAO,KAAK,MAAM,KAAK,SAAS,MAAM,CAAC;EAE3C,UAAU,MAAM,KAAK,KAAK,OAAO,GAAG,IAAI;CAC5C;CACA,MAAM,IAAI,MAAM,GAAG,QAAQ,sBAAsB;AACrD;AAEA,SAAS,uBAAuB,UAAuB,KAAqB,SAAiB,SAAiB;CAC1G,IAAI,SAAS,SAAS,IAAI,MAAM,MAAM,IAAI,MAAM,kBAAkB,IAAI,IAAI,MAAM,SAAS,KAAK,QAAQ,IAAI,KAAK,EAAE;CACjH,IAAI,SAAS,YAAY,SAAS,MAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,eAAe,SAAS,QAAQ,QAAQ,QAAQ,EAAE;CAC/H,IAAI,SAAS,YAAY,SAAS,MAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,eAAe,OAAO,SAAS,OAAO,EAAE,QAAQ,QAAQ,EAAE;CACvI,KAAK,MAAM,SAAS,kBAChB,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAS,SAAS,UAAU,CAAC,CAA4B,GACxF,IAAI,MAAM,WAAW,YAAY,GAAG,MAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,WAAW,KAAK,IAAI,MAAM,QAAQ,MAAM,EAAE;AAGrI;AAEA,eAAe,eAAe,aAAiC,UAAkB,MAAc,SAAiB;CAC5G,KAAK,IAAI,UAAU,GAAG,WAAW,IAAI,WAAW;EAC5C,MAAM,aAAa,MAAM,cAAc,aAAa,UAAU,IAAI,EAAA,EAAI,WAAW;EACjF,IAAI,WAAW,OAAO;EACtB,MAAM,YAAY,KAAK,GAAM;CACjC;CACA,MAAM,IAAI,MAAM,GAAG,KAAK,GAAG,QAAQ,qBAAqB,SAAS,EAAE;AACvE;AAQA,SAAS,cAAc,OAAe,KAAyB;CAC3D,IAAI,MAAM,UAAA,MAA4B,OAAO;CAC7C,MAAM,MAAM,MAAM,MAAM,GAAG,gBAAgB;CAC3C,OAAO,GAAG,IAAI,MAAM,GAAG,IAAI,YAAY,IAAI,CAAC,EAAE,kDAAkD,MAAM,SAAS,QAAQ,GAAG;AAC9H;;AAGA,eAAsB,qBAAqB,aAAiC,SAAwB;CAChG,MAAM,QAAQ,YAAY,IAAI,gBAAgB,YAAY,IAAI;CAC9D,MAAM,gBAAgB,iBAAiB,YAAY,KAAK,YAAY,GAAG;CACvE,MAAM,aAAa,eAAe,QAAQ,sBAAsB,EAAE;CAClE,IAAI,CAAC,SAAS,CAAC,YAAY;EACvB,YAAY,IAAI,0EAA0E;EAC1F;CACJ;CACA,MAAM,MAAM,GAAG,YAAY,IAAI,kBAAkB,yBAAyB,SAAS,WAAW;CAC9F,MAAM,UAAU;EACZ,eAAe,UAAU;EACzB,QAAQ;EACR,gBAAgB;EAChB,wBAAwB;CAC5B;CACA,MAAM,WAAW,MAAM,YAAY,MAAM,GAAG,IAAI,QAAQ,mBAAmB,QAAQ,GAAG,KAAK,EAAE,QAAQ,CAAC;CACtG,IAAI,SAAS,IAAI;EACb,YAAY,IAAI,oBAAoB,QAAQ,IAAI,SAAS;EACzD,QAAQ,MAAM,SAAS,KAAK,EAAA,CAA4B;CAC5D;CACA,MAAM,WAAW,MAAM,YAAY,MAAM,KAAK;EAC1C,QAAQ;EACR;EACA,MAAM,KAAK,UAAU;GACjB,UAAU,QAAQ;GAClB,MAAM,QAAQ;GACd,MAAM,cAAc,QAAQ,OAAO,gBAAgB,GAAG,cAAc,YAAY,KAAA,CAAS;GACzF,YAAY,QAAQ;GACpB,aAAa,QAAQ,aAAa,UAAU;EAChD,CAAC;CACL,CAAC;CACD,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,uCAAuC,QAAQ,IAAI,IAAI,SAAS,OAAO,GAAG,MAAM,SAAS,KAAK,GAAG;CACnI,MAAM,OAAO,MAAM,SAAS,KAAK,EAAA,CAA4B;CAC7D,YAAY,IAAI,gCAAgC,OAAO,QAAQ,IAAI,EAAE;CACrE,OAAO;AACX;AAYA,SAAS,aAAa,MAAmB;CACrC,MAAM,QAAQ,KAAK,OAAO,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,GAAG,CAAC,MAAM,qBAAqB,KAAK,KAAK,MAAM,GAAG,CAAC;CAC9G,OAAO;EACH,WAAW,KAAK,SAAS,KAAK,UAAU,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;EACpF,SAAS,KAAK;EACd,UAAU;EACV,GAAG,KAAK,QAAQ,KAAK,aAAa,MAAM,SAAS,WAAW,OAAA,CAAQ,OAAO,CAAC,EAAE,GAAG,SAAS,MAAM,MAAM,GAAG,CAAC,KAAK,GAAG,GAAG,SAAS,QAAQ;EACtI,YAAY,KAAK,WAAW,SAAS,KAAK,UAAU,MAAM,KAAK,YAAY;EAC3E,aAAa,KAAK,SAAS,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK;CACrE,CAAC,CAAC,KAAK,IAAI;AACf;;AAGA,eAAe,oBAAoB,aAAiC,SAAyB,MAAmB;CAC5G,MAAM,OAAO,MAAM,MAAM,IAAI,aAAa;EAAC;EAAO;EAAU;EAAM;EAAe;CAAM,CAAC,CAAC;CACzF,MAAM,MAAM,KAAK,WAAW,KAAK,MAAM,cAAc;EACjD,MAAM,aAAa,UAAU,SAAS,GAAG;EACzC,OAAO,KAAK,QAAS,aAAa,UAAU,SAAS,IAAI,KAAK,QAAS,WAAW,EAAE,IAAI,CAAC;CAC7F,CAAC;CACD,IAAI,CAAC,OAAO,QAAQ,QAAQ,OAAO;CACnC,MAAM,WAAW,MAAM,YAAY;EAAE,GAAG;EAAS,YAAY,CAAC,GAAG;CAAE,GAAG,WAAW;CACjF,IAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,KAAK,OAAO;CACpD,YAAY,IAAI,GAAG,IAAI,sDAAsD;CAC7E,MAAM,qBAAqB,aAAa;EAAE;EAAK,OAAO,SAAS;EAAO,YAAY,QAAQ,KAAK,QAAS,UAAU;CAAE,CAAC;CACrH,OAAO;AACX;;;;;;;;;;;;;;;AAgBA,eAAsB,WAAW,UAA0B,CAAC,GAAG,qBAAkD,CAAC,GAA2B;CACzI,MAAM,cAAc,kBAAkB,kBAAkB;CACxD,MAAM,EAAE,KAAK,QAAQ;CACrB,MAAM,OAAO,MAAM,YAAY,SAAS,WAAW;CACnD,IAAI,aAAa,IAAI,CAAC;CAEtB,IAAI,CAAC,KAAK,SAAS;EACf,IAAI,UAAU,KAAK,OAAO,oEAAoE;EAC9F,OAAO;GAAE,QAAQ;GAAW;EAAK;CACrC;CACA,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,OAAO,CAAC,KAAK,OAAO;EAC3C,IAAI,MAAM,oBAAoB,aAAa,SAAS,IAAI,GAAG,OAAO;GAAE,QAAQ;GAAW;EAAK;EAC5F,IAAI,aAAa;EACjB,OAAO;GAAE,QAAQ;GAAQ;EAAK;CAClC;CACA,IAAI,CAAC,KAAK,SAAS,QAAQ,MAAM,IAAI,MAAM,4GAAsG;CACjJ,IAAI,QAAQ,QAAQ;EAChB,IAAI,4BAA4B,KAAK,IAAI,MAAM,KAAK,QAAQ,QAAQ,OAAO,KAAK,OAAO;EACvF,OAAO;GAAE,QAAQ;GAAW;EAAK;CACrC;CAEA,IAAI,MAAM,IAAI,aAAa,CAAC,UAAU,aAAa,CAAC,GAAG,MAAM,IAAI,MAAM,8DAA8D;CAErI,IAAI,MADsB,IAAI,aAAa;EAAC;EAAO;EAAU,KAAK;CAAG,CAAC,GACrD,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,oCAAoC,KAAK,OAAO,EAAE;CAE/F,MAAM,YAAY,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,mBAAmB,CAAC;CAC5E,MAAM,YAAY,IAAI,IAAI,KAAK,SAAS,KAAK,EAAE,UAAU;EACrD,MAAM,OAAO,KAAK,KAAK,KAAK,KAAK,cAAc;EAC/C,OAAO,CAAC,MAAM,GAAG,aAAa,MAAM,MAAM,CAAC;CAC/C,CAAC,CAAC;CACF,IAAI;EACA,MAAM,iBAAiB,qBAAqB,GAAG;EAE/C,KAAK,MAAM,OAAO,KAAK,UAAU,IAAI,WAAW,qBAAqB,KAAK,IAAI,KAAK,KAAK,SAAS,KAAK,IAAI;EAE1G,MAAM,2BAAW,IAAI,IAAoB;EACzC,KAAK,MAAM,CAAC,OAAO,QAAQ,KAAK,SAAS,QAAQ,GAAG;GAChD,MAAM,cAAc,KAAK,KAAK,WAAW,OAAO,KAAK,CAAC;GACtD,GAAG,UAAU,WAAW;GACxB,MAAM,CAAC,SAAS,QAAQ,YAAY,gBAAgB,WAAW;GAC/D,MAAM,YAAY,IAAI,SAAS,MAAM;IAAE,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG;IAAG,KAAK,YAAY;GAAI,CAAC;GAC3F,MAAM,UAAU,GAAG,YAAY,WAAW,CAAC,CAAC,MAAM,SAAS,KAAK,SAAS,MAAM,CAAC;GAChF,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,WAAW,IAAI,KAAK,sBAAsB;GACxE,MAAM,OAAO,KAAK,KAAK,aAAa,OAAO;GAC3C,uBAAuB,mBAAmB,IAAI,GAAG,KAAK,KAAK,SAAS,KAAK,IAAI;GAC7E,SAAS,IAAI,IAAI,MAAM,IAAI;GAC3B,IAAI,YAAY,IAAI,KAAK,GAAG,KAAK,SAAS;EAC9C;EAEA,MAAM,0BAAU,IAAI,IAA+B;EACnD,MAAM,SAAS,OAAO,QAAwB;GAC1C,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG,QAAQ,IAAI,IAAI,MAAM,MAAM,aAAa,aAAa,IAAI,MAAM,YAAY,IAAI,UAAU,YAAY,GAAG,GAAG,SAAS,CAAC;GAClJ,OAAO,QAAQ,IAAI,IAAI,IAAI;EAC/B;EAEA,KAAK,MAAM,OAAO,KAAK,UAAU;GAC7B,MAAM,WAAW,YAAY,IAAI,UAAU,YAAY,GAAG;GAC1D,MAAM,aAAa,MAAM,cAAc,aAAa,UAAU,IAAI,IAAI,EAAA,EAAI,WAAW,KAAK;GAC1F,IAAI,WAAW;IACX,IAAI,UAAU,YAAY,KAAK,MAC3B,MAAM,IAAI,MAAM,GAAG,IAAI,KAAK,GAAG,KAAK,QAAQ,6BAA6B,UAAU,WAAW,iBAAiB,QAAQ,KAAK,KAAK,EAAE;IAEvI,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,QAAQ,wCAAwC;IAC1E;GACJ;GACA,MAAM,OAAO;IAAC;IAAW,SAAS,IAAI,IAAI,IAAI;IAAI;IAAS;IAAgB;IAAc;GAAQ;GACjG,IAAI,IAAI,SAAS,eAAe,QAAQ,KAAK,KAAK,YAAY,OAAO,IAAI,SAAS,cAAc,MAAM,CAAC;GACvG,IAAI,IAAI,SAAS,eAAe,YAAY,KAAK,KAAK,cAAc;GACpE,MAAM,YAAY,IAAI,OAAO,MAAM;IAAE;IAAK,KAAK,MAAM,OAAO,GAAG;GAAE,CAAC;GAClE,IAAI,eAAe,IAAI,KAAK,GAAG,KAAK,QAAQ,MAAM,gBAAgB;EACtE;EAEA,KAAK,MAAM,OAAO,KAAK,UAAU;GAC7B,MAAM,WAAW,YAAY,IAAI,UAAU,YAAY,GAAG;GAC1D,MAAM,YAAY,MAAM,eAAe,aAAa,UAAU,IAAI,MAAM,KAAK,OAAO;GACpF,IAAI,IAAI,SAAS,eAAe,cAAc,CAAC,UAAU,MAAM,cAC3D,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,QAAQ,oCAAoC,SAAS,EAAE;EAEzF;EAEA,KAAK,MAAM,OAAO,KAAK,UAAU;GAC7B,MAAM,WAAW,YAAY,IAAI,UAAU,YAAY,GAAG;GAC1D,MAAM,QAAQ,MAAM,cAAc,aAAa,UAAU,IAAI,IAAI,EAAA,GAAK,gBAAgB,CAAC;GACvF,MAAM,MAAM,MAAM,OAAO,GAAG;GAC5B,IAAI,KAAK,KAAK,QAAQ,aAAa,KAAK,SACpC,MAAM,YAAY,IAAI,OAAO;IAAC;IAAY;IAAO,GAAG,IAAI,KAAK,GAAG,KAAK;IAAW,KAAK,QAAQ;IAAS;IAAc;GAAQ,GAAG;IAAE;IAAK;GAAI,CAAC;GAE/I,IAAI,KAAA,qBACA,MAAM,YAAY,IAAI,OAAO;IAAC;IAAY;IAAM,IAAI;IAAM;IAAgB;IAAc;GAAQ,GAAG;IAAE;IAAK;GAAI,CAAC,CAAC,CAC3G,OAAO,UAAiB,IAAI,0BAA0B,eAAe,eAAe,IAAI,KAAK,IAAI,MAAM,SAAS,CAAC;GAE1H,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,QAAQ,SAAS,KAAK,QAAQ,SAAS;EACrE;CACJ,UAAU;EACN,GAAG,OAAO,WAAW;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;EAErD,KAAK,MAAM,CAAC,MAAM,YAAY,WAAW,GAAG,cAAc,MAAM,OAAO;CAC3E;CAEA,MAAM,IAAI,aAAa;EAAC;EAAO,KAAK;EAAK,KAAK;CAAI,CAAC;CACnD,MAAM,IAAI,aAAa;EAAC;EAAQ;EAAU,aAAa,KAAK;CAAK,CAAC;CAClE,IAAI,YAAY,KAAK,KAAK;CAE1B,MAAM,qBAAqB,aAAa;EAAE,KAAK,KAAK;EAAK,OAAO,KAAK;EAAO,YAAY,QAAQ,KAAK,QAAQ,UAAU;CAAE,CAAC;CAC1H,OAAO;EAAE,QAAQ;EAAY;CAAK;AACtC;;AChiBA,MAAM,yBAAyB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACJ;AAEA,SAAgB,iBAAiB,SAAiB;CAC9C,MAAM,SAAS,QAAQ,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM;CAChD,OAAO,uBAAuB,MAAM,YAAY,QAAQ,KAAK,MAAM,CAAC;AACxE;AAEA,SAAS,gBAAgB,MAAc;CACnC,OAAO,GAAG,aAAa,MAAM,MAAM,CAAC,CAC/B,MAAM,IAAI,CAAC,CACX,QAAQ,SAAS,CAAC,KAAK,WAAW,GAAG,CAAC,CAAC,CACvC,KAAK,IAAI,CAAC,CACV,MAAM,aAAa,CAAC,CAAC,EAAE,CACvB,KAAK;AACd;AAEA,eAAe,QAAQ,SAAgD;CACnE,OAAO,kBAAkB,QAAQ,OAAO,QAAQ,IAAI,GAAG,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC,CAAC;AACrG;AAEA,SAAS,QAAQ,WAA4B;CACzC,QAAQ,UAAU,YAAY,aAAa;AAC/C;AAEA,SAAS,gBAAgB,WAA4B;CACjD,OAAO,KAAK,QAAQ,SAAS,IAAI,MAAM,IAAI,GAAG,UAAU,UAAU,UAAU,aAAa,2BAA2B,UAAU,eAAe;AACjJ;AAEA,SAAS,eAAe,UAA0B;CAE9C,OAAO,GADM,SAAS,OAAO,GAAG,SAAS,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,MAC7C,SAAS,WAAW,OAAA,CAAQ,OAAO,CAAC,EAAE,IAAI,SAAS,OAAO,IAAI,SAAS,QAAQ,KAAK,WAAW,UAAU,QAAQ,CAAC,CAAC,KAAK,IAAI;AAClJ;AAiBA,eAAsB,MAAM,SAA+C;CACvE,MAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;CACvC,MAAM,EAAE,QAAQ,kBAAkB,MAAM,QAAQ,OAAO;CACvD,MAAM,cAAc,gBAAgB,EAAE,cAAc,IAAI,CAAC;CACzD,IAAI;CAEJ,IAAI,QAAQ,UAAU,KAAA,GAAW;EAC7B,MAAM,QAAQ,QAAQ,UAAU,QAAQ,QAAQ,QAAQ,OAAO,aAAa,KAAK,QAAQ,MAAM,QAAQ,IAAI,IAAI,KAAA;EAC/G,UAAU,CAAC;GAAE,SAAS,QAAQ;GAAO,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;GAAI,OAAO;EAAW,CAAC;CACzF,OAAO,IAAI,QAAQ,QAAQ,QAAQ,YAAY,KAAA,GAE3C,UAAU,CAAC;EAAE,SADG,QAAQ,OAAO,gBAAgB,KAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,QAAQ;EACpE,OAAO,QAAQ,SAAS,eAAe,GAAG;EAAG,OAAO;CAAiB,CAAC;MACzF,IAAI,QAAQ,MACf,UAAU,gBAAgB,KAAK,QAAQ,MAAM,QAAQ,MAAM,MAAM,CAAC,CAC7D,KAAK,YAAY;EAAE,GAAG;EAAQ,OAAO,OAAO,KAAK,MAAM,GAAG,CAAC;CAAE,EAAE;MAEpE,OAAO;EAAE,MAAM;EAAG,QAAQ;CAAyE;CAGvG,MAAM,UAAU,QACX,QAAQ,EAAE,cAAc,CAAC,iBAAiB,OAAO,CAAC,CAAC,CACnD,KAAK,WAAW;EACb;EACA,UAAU,qBAAqB,YAAY,MAAM,SAAS,MAAM,IAAI,GAAG,QAAQ;GAC3E,GAAG;GACH,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;EAChD,CAAC;CACL,EAAE;CACN,MAAM,WAAW,QAAQ,QAAQ,EAAE,eAAe,SAAS,WAAW,KAAK,OAAO,CAAC;CAEnF,IAAI,QAAQ,MACR,OAAO;EACH,MAAM,SAAS,SAAS,IAAI;EAC5B,QAAQ,KAAK,UAAU;GAAE,MAAM,OAAO;GAAM,SAAS,QAAQ,KAAK,EAAE,OAAO,gBAAgB;IAAE,OAAO,MAAM;IAAO,GAAG;GAAS,EAAE;EAAE,GAAG,MAAM,CAAC;CAC/I;CAEJ,IAAI,CAAC,SAAS,QACV,OAAO;EACH,MAAM;EACN,QAAQ,CACJ,GAAG,QAAQ,KAAK,EAAE,OAAO,eAAe,CACpC,KAAK,MAAM,MAAM,IAAI,SAAS,WAAW,OAAO,KAAK,SAAS,UAC9D,GAAG,SAAS,WAAW,IAAI,eAAe,CAC9C,CAAC,CAAC,KAAK,IAAI,CAAC,GACZ,GAAG,QAAQ,OAAO,GAAG,QAAQ,WAAW,IAAI,mBAAmB,iBAAiB,gBAAgB,OAAO,KAAK,iBAChH,CAAC,CAAC,KAAK,IAAI;CACf;CAEJ,OAAO;EACH,MAAM;EACN,QAAQ;GACJ,GAAG,SAAS,KAAK,EAAE,OAAO,eAAe,GAAG,MAAM,MAAM,IAAI,SAAS,OAAO,IAAI,SAAS,WAAW,IAAI,eAAe,CAAC,CAAC,KAAK,IAAI,GAAG;GACrI;GACA;EACJ,CAAC,CAAC,KAAK,IAAI;CACf;AACJ;AAOA,eAAsB,QAAQ,SAAiD;CAC3E,MAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;CACvC,MAAM,EAAE,QAAQ,eAAe,iBAAiB,MAAM,QAAQ,OAAO;CACrE,IAAI;CACJ,IAAI;CACJ,IAAI,KAAK,QAAQ,MAAM;CAEvB,IAAI,QAAQ,SAAS,KAAA,KAAa,QAAQ,OAAO,KAAA,GAAW;EAExD,OAAO,MAAM,YAAY;GAAE,gBAAgB;GAAM,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;EAAG,GAAG,EAAE,IAAI,CAAC;EAC3G,OAAO,KAAK;EACZ,KAAK;CACT,OAAO;EACH,OAAO,QAAQ,QAAQ,aAAa,KAAK,EAAE;EAC3C,OAAO,eAAe,gBAAgB,KAAK,MAAM,EAAE,GAAG,QAAQ,gBAAgB,EAAE,cAAc,IAAI,CAAC,CAAC;CACxG;CAEA,IAAI,QAAQ,MACR,OAAO;EACH,MAAM;EACN,QAAQ,KAAK,UAAU;GACnB,MAAM,OAAO;GACb,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;GAC7C,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;GAChD,MAAM,QAAQ;GACd;GACA,cAAc,gBAAgB;GAC9B,SAAS,KAAK;GACd,SAAS,KAAK,WAAW;GACzB,KAAK,KAAK,OAAO;GACjB,SAAS,KAAK;EAClB,GAAG,MAAM,CAAC;CACd;CAEJ,OAAO;EACH,MAAM;EACN,QAAQ;GACJ,UAAU,OAAO,GAAG,KAAK,IAAI,OAAO,qBAAqB;GACzD,SAAS,OAAO;GAChB,GAAI,KAAK,UAAU,CAAC,YAAY,KAAK,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,QAAQ,EAAE,IAAI,CAAC;GACjG,kBAAkB,cAAc,UAAU,aAAa,QAAQ,KAAK,IAAI,IAAI;GAC5E;GACA,GAAI,KAAK,QAAQ,SAAS,KAAK,QAAQ,IAAI,cAAc,IAAI,CAAC,aAAa;GAC3E;GACA,iBAAiB,KAAK,WAAW,SAAS,KAAK,UAAU,KAAK,KAAK,QAAQ,KAAK;EACpF,CAAC,CAAC,KAAK,IAAI;CACf;AACJ;AASA,eAAsB,QAAQ,SAAwD;CAClF,MAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;CACvC,MAAM,SAAS,MAAM,WAAW;EAC5B,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;EAC7C,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACnD,GAAI,QAAQ,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC7C,GAAG;EAAE;EAAK,KAAK,QAAQ,aAAa,CAAC,IAAI,QAAQ,SAAS,YAAY,QAAQ,IAAI,OAAO;CAAG,CAAC;CAC7F,IAAI,CAAC,QAAQ,MAAM,OAAO;EAAE,MAAM;EAAG,QAAQ;CAAG;CAChD,MAAM,EAAE,UAAU,GAAG,SAAS,OAAO;CACrC,OAAO;EACH,MAAM;EACN,QAAQ,KAAK,UAAU;GAAE,QAAQ,OAAO;GAAQ,GAAG;GAAM,UAAU,SAAS,KAAK,EAAE,KAAK,YAAY;IAAE;IAAK;GAAK,EAAE;EAAE,GAAG,MAAM,CAAC;CAClI;AACJ;AAEA,eAAsB,OAAO,SAAyE;CAClG,MAAM,WAAW,MAAM,QAAQ,OAAO;CACtC,IAAI,QAAQ,UACR,OAAO;EAAE,MAAM;EAAG,QAAQ,kBAAkB,SAAS,QAAQ;GAAE,KAAK,SAAS;GAAK,GAAI,SAAS,eAAe,EAAE,cAAc,SAAS,aAAa,IAAI,CAAC;EAAG,CAAC;CAAE;CAEnK,MAAM,OAAO;EACT,MAAM,SAAS,OAAO;EACtB,YAAY,SAAS,aAAa,KAAK,SAAS,SAAS,KAAK,SAAS,UAAU,IAAI;EACrF,cAAc,SAAS,gBAAgB;EACvC,cAAc,gBAAgB,SAAS,MAAM;EAC7C,OAAO,QAAQ,KAAK,EAAE,MAAM,OAAO,aAAa,aAAa;GACzD;GACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;GACzB,SAAS,eAAe,MAAM,OAAO,SAAS,MAAM,KAAK;GACzD;GACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;EAC7B,EAAE;EACF,aAAa;EACb,OAAO,qBAAqB,SAAS,QAAQ,EAAE,KAAK,SAAS,IAAI,CAAC;CACtE;CACA,IAAI,QAAQ,MAAM,OAAO;EAAE,MAAM;EAAG,QAAQ,KAAK,UAAU,MAAM,MAAM,CAAC;CAAE;CAC1E,OAAO;EACH,MAAM;EACN,QAAQ;GACJ,SAAS,KAAK,OAAO,KAAK,aAAa,KAAK,KAAK,WAAW,KAAK;GACjE,kBAAkB,KAAK,cAAc,UAAU,KAAK,aAAa,QAAQ,KAAK,IAAI,IAAI;GACtF,GAAI,KAAK,cAAc,UAAU,CAAC,cAAc,KAAK,aAAa,WAAW,2BAAA,CAA4B,KAAK,IAAI,GAAG,IAAI,CAAC;GAC1H;GACA,UAAU,KAAK,aAAa,MAAM,KAAK,IAAI,KAAK;GAChD,UAAU,KAAK,aAAa,MAAM,KAAK,IAAI,KAAK;GAChD,UAAU,KAAK,aAAa,MAAM,KAAK,IAAI,KAAK;GAChD,UAAU,KAAK,aAAa,KAAK,KAAK,IAAI,KAAK;GAC/C;GACA,GAAG,KAAK,MAAM,eAAe,KAAK,SAAS,KAAK,MAAM;EAC1D,CAAC,CAAC,KAAK,IAAI;CACf;AACJ;AAEA,SAAgB,mBAAmB,SAAiB,OAAe;CAC/D,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB;CAC9C,MAAM,MAAM,QAAQ,QAAQ,cAAc;CAC1C,IAAI,UAAU,MAAM,MAAM,OACtB,OAAO,QAAQ,MAAM,GAAG,KAAK,IAAI,QAAQ,QAAQ,MAAM,MAAM,eAAe,MAAM;CAEtF,OAAO,GAAG,QAAQ,QAAQ,IAAI,QAAQ,KAAK,IAAI,SAAS,KAAK,MAAM;AACvE;AAEA,SAAgB,gBAAgB,SAAiB;CAC7C,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB;CAC9C,MAAM,MAAM,QAAQ,QAAQ,cAAc;CAC1C,OAAO,UAAU,MAAM,MAAM,QAAQ,QAAQ,MAAM,OAAO,MAAM,eAAe,MAAM,IAAI,KAAA;AAC7F;AAEA,eAAsB,OAAO,SAAqF;CAC9G,MAAM,WAAW,MAAM,QAAQ,OAAO;CACtC,MAAM,OAAO,KAAK,QAAQ,SAAS,KAAK,QAAQ,QAAQ,WAAW;CACnE,MAAM,WAAW,KAAK,SAAS,SAAS,KAAK,IAAI;CACjD,MAAM,QAAQ,kBAAkB,SAAS,QAAQ;EAAE,KAAK,SAAS;EAAK,GAAI,SAAS,eAAe,EAAE,cAAc,SAAS,aAAa,IAAI,CAAC;CAAG,CAAC;CACjJ,MAAM,UAAU,GAAG,WAAW,IAAI,IAAI,GAAG,aAAa,MAAM,MAAM,IAAI;CAEtE,IAAI,QAAQ,OAAO;EACf,MAAM,OAAO,mBAAmB,WAAW,mBAAmB,KAAK;EACnE,IAAI,SAAS,SAAS,OAAO;GAAE,MAAM;GAAG,QAAQ,KAAK,SAAS;EAAiB;EAC/E,GAAG,cAAc,MAAM,IAAI;EAC3B,OAAO;GAAE,MAAM;GAAG,QAAQ,+CAA+C,SAAS;EAAG;CACzF;CACA,MAAM,UAAU,gBAAgB,OAAO;CACvC,IAAI,YAAY,OAAO,OAAO;EAAE,MAAM;EAAG,QAAQ,KAAK,SAAS;CAAgD;CAC/G,OAAO;EACH,MAAM;EACN,QAAQ,KAAK,SAAS,GAAG,UAAU,oBAAoB,iBAAiB;CAC5E;AACJ;AAQA,SAAS,SAAS,KAAa,OAAiB;CAC5C,OAAO,MAAM,KAAK,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC;AACvF;AAEA,SAAS,SAAS,MAA0B;CACxC,OAAO,OAAO,GAAG,aAAa,MAAM,MAAM,IAAI;AAClD;AAEA,MAAM,qBAAqB;CACvB;CACA;CACA;CACA;CACA;CACA;CACA;AACJ;AAEA,MAAM,oBAAoB;CACtB;CAAqB;CAAsB;CAAsB;CAAc;CAAiB;CAAkB;CAClH;CAAwB;CAAyB;CAAwB;CAAiB;CAAoB;CAAqB;AACvI;AAEA,eAAsB,OAAO,SAAgD;CACzE,MAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;CACvC,MAAM,SAAwB,CAAC;CAC/B,IAAI;CAEJ,IAAI;EACA,WAAW,MAAM,QAAQ,OAAO;EAChC,OAAO,KAAK,SAAS,aACf;GAAE,QAAQ;GAAQ,SAAS,gBAAgB,SAAS,OAAO,KAAK,QAAQ,KAAK,SAAS,KAAK,SAAS,UAAU,EAAE;EAAG,IACnH;GACE,QAAQ;GACR,SAAS,4CAA4C,SAAS,OAAO,KAAK;GAC1E,KAAK;EACT,CAAC;CACT,SAAS,OAAO;EACZ,OAAO,KAAK;GAAE,QAAQ;GAAQ,SAAS,sCAAuC,MAAgB;EAAU,CAAC;CAC7G;CAEA,IAAI,UACA,OAAO,KAAK,SAAS,cAAc,UAC7B;EAAE,QAAQ;EAAQ,SAAS,kBAAkB,SAAS,aAAa,QAAQ,KAAK,IAAI,EAAE;CAAG,IACzF;EACE,QAAQ;EACR,SAAS;EACT,KAAK;CACT,CAAC;CAGT,MAAM,MAAM,KAAK,MAAM,SAAS,SAAS,KAAK,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI;CACxE,MAAM,eAAe;EAAE,GAAG,IAAI;EAAc,GAAG,IAAI;CAAgB;CACnE,OAAO,KAAK,aAAa,WACnB;EAAE,QAAQ;EAAQ,SAAS;CAAyB,IACpD;EAAE,QAAQ;EAAQ,SAAS;EAAiC,KAAK;CAAqE,CAAC;CAE7I,MAAM,YAAY,CACd,GAAG,mBAAmB,QAAQ,SAAS,aAAa,KAAK,GACzD,GAAG,kBAAkB,QAAQ,SAAS,GAAG,WAAW,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CAC7E;CACA,OAAO,KAAK,UAAU,SAChB;EACE,QAAQ;EACR,SAAS,kDAAkD,UAAU,KAAK,IAAI,EAAE;EAChF,KAAK;CACT,IACE;EAAE,QAAQ;EAAQ,SAAS;CAA+C,CAAC;CAEjF,IAAI;EACA,MAAM,kBAAkB,mBAAmB,GAAG;EAC9C,MAAM,iBAAkB,IAAgC;EACxD,MAAM,oBAAoB,gBAAgB,QAAQ,EAAE,eAAe,SAAS,eAAe,cAAc,CAAC,SAAS,cAAc,CAAC,cAAc;EAChJ,OAAO,KAAK,CAAC,gBAAgB,SACvB;GAAE,QAAQ;GAAQ,SAAS;GAAkD,KAAK;EAA4E,IAC9J,kBAAkB,SACd;GAAE,QAAQ;GAAQ,SAAS,gDAAgD,kBAAkB,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;GAAI,KAAK;EAAgD,IACzL;GAAE,QAAQ;GAAQ,SAAS,kCAAkC,gBAAgB,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;EAAG,CAAC;CAClI,SAAS,OAAO;EACZ,OAAO,KAAK;GAAE,QAAQ;GAAQ,SAAU,MAAgB;EAAQ,CAAC;CACrE;CAEA,MAAM,OAAO,SAAS,SAAS,KAAK,CAAC,mBAAmB,CAAC,CAAC;CAC1D,OAAO,KAAK,KAAK,SAAS,gBAAgB,IACpC;EAAE,QAAQ;EAAQ,SAAS;CAAyC,IACpE;EACE,QAAQ;EACR,SAAS;EACT,KAAK;CACT,CAAC;CAEL,MAAM,eAAe,MAAM,OAAO;EAAE,GAAG;EAAS;CAAI,CAAC;CACrD,OAAO,KAAK,aAAa,SAAS,IAC5B;EAAE,QAAQ;EAAQ,SAAS;CAAiD,IAC5E;EAAE,QAAQ;EAAQ,SAAS,aAAa,OAAO,QAAQ,OAAO,EAAE;EAAG,KAAK;CAA0B,CAAC;CAEzG,MAAM,SAAS,OAAO,MAAM,EAAE,aAAa,WAAW,MAAM;CAC5D,IAAI,QAAQ,MAAM,OAAO;EAAE,MAAM,SAAS,IAAI;EAAG,QAAQ,KAAK,UAAU;GAAE,IAAI,CAAC;GAAQ;EAAO,GAAG,MAAM,CAAC;CAAE;CAC1G,MAAM,OAAO;EAAE,MAAM;EAAK,MAAM;EAAK,MAAM;CAAI;CAC/C,OAAO;EACH,MAAM,SAAS,IAAI;EACnB,QAAQ;GACJ,GAAG,OAAO,KAAK,EAAE,QAAQ,SAAS,UAAU,GAAG,KAAK,QAAQ,GAAG,UAAU,MAAM,cAAc,QAAQ,IAAI;GACzG;GACA,SAAS,kCAAkC;EAC/C,CAAC,CAAC,KAAK,IAAI;CACf;AACJ"}
|