@webx-ui/module-audit 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/api.ts","../src/messages.ts","../src/i18n.ts","../src/AuditHostPlaces.vue","../src/AuditLayout.vue","../src/AuditHostsPage.vue","../src/AuditDetails.vue","../src/AuditFixDialog.vue","../src/AuditHideDialog.vue","../src/AuditIssueList.vue","../src/AuditIssuesPage.vue","../src/AuditOverviewPage.vue","../src/AuditPageCard.vue","../src/fields.ts","../src/AuditPagesPage.vue","../src/AuditCompareIssues.vue","../src/AuditRunsPage.vue","../src/AuditSettingsPage.vue","../src/module.ts"],"sourcesContent":["import type { AdminContext } from '@webx-ui/module-admin'\nimport type {\n AuditCheckRow,\n AuditComparison,\n AuditComparisonKind,\n AuditFixOffer,\n AuditFixResult,\n AuditHosts,\n AuditHostClass,\n AuditIgnoreRule,\n AuditIssue,\n AuditIssueQuery,\n AuditLatest,\n AuditLinkRow,\n AuditPage,\n AuditPageCard,\n AuditPageQuery,\n AuditPageRow,\n AuditResourceRow,\n AuditResourceTab,\n AuditRun,\n AuditScope,\n} from './types'\n\nexport interface AuditApi {\n /** The run that is going, the last one that finished, and whether the queue can take one. */\n latest(): Promise<AuditLatest>\n run(id: number): Promise<AuditRun>\n /** Every run, newest first — the history. */\n runs(query?: { page?: number; per_page?: number }): Promise<AuditPage<AuditRun>>\n /**\n * Queues a run; refused with 409 on a `sync` queue or while another one is going. A `urls` run\n * is a recheck of the addresses given.\n */\n start(scope: AuditScope, urls?: string[]): Promise<AuditRun>\n cancel(id: number): Promise<AuditRun>\n /** The checks of a run that found something, worst first. */\n checks(run: number, query?: AuditIssueQuery): Promise<AuditCheckRow[]>\n /** The findings of a run — of one check when `check` is given. */\n issues(run: number, query?: AuditIssueQuery): Promise<AuditPage<AuditIssue>>\n /** The crawled pages of a run under the screen's filters. */\n pages(run: number, query?: AuditPageQuery): Promise<AuditPage<AuditPageRow>>\n /** Where the browser downloads the same list as CSV, under the panel's session. */\n pagesFile(run: number, query: AuditPageQuery, columns: string[]): string\n page(run: number, id: number): Promise<AuditPageCard>\n /** The links of a page: `out` — what it points at, `in` — what points at it. */\n links(\n run: number,\n id: number,\n query?: { direction?: 'in' | 'out'; kind?: string; page?: number; per_page?: number },\n ): Promise<AuditPage<AuditLinkRow>>\n /** What a page loads, a tab of the card at a time. */\n resources(\n run: number,\n id: number,\n query: { tab: AuditResourceTab; page?: number; per_page?: number },\n ): Promise<AuditPage<AuditResourceRow>>\n /** The fixes that can close a finding now, each with what it would change. */\n fixes(run: number, issue: number): Promise<AuditFixOffer[]>\n /** Presses a fix — or, with `dryRun`, only asks again what it would change. */\n fix(run: number, issue: number, fix: string, dryRun?: boolean): Promise<AuditFixResult>\n /** Where the browser downloads one page of a run — its snapshot, findings and links. */\n pageFile(run: number, id: number): string\n /** Two runs by fingerprint; without `from`, `to` against the run it was analysed against. */\n compare(to: number, from?: number | null): Promise<AuditComparison>\n /** The findings of one kind of a comparison, of one check when given. */\n compareIssues(query: {\n to: number\n from?: number | null\n kind: AuditComparisonKind\n check?: string\n page?: number\n per_page?: number\n }): Promise<AuditPage<AuditIssue>>\n /** Every host the site points at, by class — stands first; with `host`, where it stands. */\n hosts(query?: {\n class?: AuditHostClass | null\n search?: string\n host?: string\n }): Promise<AuditHosts>\n /** The hiding rules. */\n ignores(): Promise<AuditIgnoreRule[]>\n /** Hides what a rule matches, with the reason. */\n hide(rule: { check: string; pattern: string; reason: string }): Promise<AuditIgnoreRule>\n /** How many findings of the last run a rule would hide — nothing is hidden. */\n hidePreview(rule: { check: string; pattern: string }): Promise<number>\n /** Removes a rule: its findings count again. */\n unhide(id: number): Promise<void>\n /** The section's settings, keyed as the screen names them. */\n settings(): Promise<Record<string, unknown>>\n saveSettings(values: Record<string, unknown>): Promise<Record<string, unknown>>\n}\n\n/** The query of the pages screen as the API reads it: `f[field]=op:value` for each filter. */\nexport function pageParams(query: AuditPageQuery): Record<string, string | number | undefined> {\n const params: Record<string, string | number | undefined> = {\n search: query.search || undefined,\n status: query.status || undefined,\n indexable:\n query.indexable === null || query.indexable === undefined\n ? undefined\n : query.indexable\n ? 1\n : 0,\n check: query.check || undefined,\n sort: query.sort || undefined,\n page: query.page,\n per_page: query.per_page,\n }\n\n for (const filter of query.filters ?? []) {\n params[`f[${filter.field}]`] =\n filter.value === undefined || filter.value === '' ? filter.op : `${filter.op}:${filter.value}`\n }\n\n return params\n}\n\n/** Everything under `/audit`, below the panel's API path. */\nexport function createAuditApi(admin: AdminContext): AuditApi {\n const base = `${admin.apiPath}/audit`\n const data = <T>(body: { data: T }): T => body.data\n\n /* `undefined` drops a parameter; `null` and `''` would be sent as words. */\n const filters = (query: AuditIssueQuery) => ({\n check: query.check || undefined,\n severity: query.severity || undefined,\n group: query.group || undefined,\n state: query.state || undefined,\n page: query.page,\n per_page: query.per_page,\n })\n\n return {\n latest: () => admin.http.get<{ data: AuditLatest }>(`${base}/runs/latest`).then(data),\n\n run: (id) => admin.http.get<{ data: AuditRun }>(`${base}/runs/${id}`).then(data),\n\n runs: (query = {}) =>\n admin.http\n .get<{\n data: AuditRun[]\n meta: Omit<AuditPage<AuditRun>, 'data'>\n }>(`${base}/runs`, { query })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n start: (scope, urls) =>\n admin.http\n .post<{ data: AuditRun }>(`${base}/runs`, scope === 'urls' ? { scope, urls } : { scope })\n .then(data),\n\n cancel: (id) => admin.http.post<{ data: AuditRun }>(`${base}/runs/${id}/cancel`, {}).then(data),\n\n checks: (run, query = {}) =>\n admin.http\n .get<{ data: AuditCheckRow[] }>(`${base}/runs/${run}/checks`, { query: filters(query) })\n .then(data),\n\n issues: (run, query = {}) =>\n admin.http\n .get<{\n data: AuditIssue[]\n meta: Omit<AuditPage<AuditIssue>, 'data'>\n }>(`${base}/runs/${run}/issues`, { query: filters(query) })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n pages: (run, query = {}) =>\n admin.http\n .get<{\n data: AuditPageRow[]\n meta: Omit<AuditPage<AuditPageRow>, 'data'>\n }>(`${base}/runs/${run}/pages`, { query: pageParams(query) })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n pagesFile: (run, query, columns) => {\n const params = new URLSearchParams()\n\n for (const [key, value] of Object.entries({\n ...pageParams(query),\n page: undefined,\n per_page: undefined,\n })) {\n if (value !== undefined) params.set(key, String(value))\n }\n\n params.set('columns', columns.join(','))\n\n return `${base}/runs/${run}/pages/export?${params.toString()}`\n },\n\n page: (run, id) =>\n admin.http.get<{ data: AuditPageCard }>(`${base}/runs/${run}/pages/${id}`).then(data),\n\n links: (run, id, query = {}) =>\n admin.http\n .get<{\n data: AuditLinkRow[]\n meta: Omit<AuditPage<AuditLinkRow>, 'data'>\n }>(`${base}/runs/${run}/pages/${id}/links`, { query })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n resources: (run, id, query) =>\n admin.http\n .get<{\n data: AuditResourceRow[]\n meta: Omit<AuditPage<AuditResourceRow>, 'data'>\n }>(`${base}/runs/${run}/pages/${id}/resources`, { query })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n fixes: (run, issue) =>\n admin.http\n .get<{ data: AuditFixOffer[] }>(`${base}/runs/${run}/issues/${issue}/fixes`)\n .then(data),\n\n fix: (run, issue, fix, dryRun = false) =>\n admin.http\n .post<{\n data: AuditFixResult\n }>(`${base}/runs/${run}/issues/${issue}/fixes/${encodeURIComponent(fix)}`, {\n dry_run: dryRun,\n })\n .then(data),\n\n pageFile: (run, id) => `${base}/runs/${run}/pages/${id}/export`,\n\n compare: (to, from) =>\n admin.http\n .get<{\n data: AuditComparison\n }>(`${base}/runs/compare`, { query: { to, from: from ?? undefined } })\n .then(data),\n\n compareIssues: (query) =>\n admin.http\n .get<{\n data: AuditIssue[]\n meta: Omit<AuditPage<AuditIssue>, 'data'>\n }>(`${base}/runs/compare/issues`, {\n query: { ...query, from: query.from ?? undefined, check: query.check || undefined },\n })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n hosts: (query = {}) =>\n admin.http\n .get<{ data: AuditHosts }>(`${base}/hosts`, {\n query: {\n class: query.class || undefined,\n search: query.search || undefined,\n host: query.host || undefined,\n },\n })\n .then(data),\n\n ignores: () => admin.http.get<{ data: AuditIgnoreRule[] }>(`${base}/ignores`).then(data),\n\n hide: (rule) => admin.http.post<{ data: AuditIgnoreRule }>(`${base}/ignores`, rule).then(data),\n\n hidePreview: (rule) =>\n admin.http\n .post<{ data: { hidden: number } }>(`${base}/ignores`, { ...rule, dry_run: true })\n .then((body) => body.data.hidden),\n\n unhide: (id) => admin.http.delete(`${base}/ignores/${id}`).then(() => undefined),\n\n settings: () =>\n admin.http\n .get<{ data: { values: Record<string, unknown> } }>(`${base}/settings`)\n .then((body) => body.data.values),\n\n saveSettings: (values) =>\n admin.http\n .put<{ data: { values: Record<string, unknown> } }>(`${base}/settings`, { values })\n .then((body) => body.data.values),\n }\n}\n","import type { Messages } from '@webx-ui/module-admin'\n\n/**\n * What this package says, in English — the same keys `webx-ui/module-audit` ships as\n * `lang/en/*.php`, so a key never reaches the screen while the dictionary is on its way. The\n * server's dictionary wins; the check texts and the details arrive translated from the server and\n * are not repeated here.\n */\nexport const auditMessages: Record<string, Messages> = {\n module: {\n title: 'Audit',\n },\n\n page: {\n overview: 'Overview',\n issues: 'Findings',\n settings: 'Settings',\n run: 'Run the audit',\n scope: 'Scope',\n 'scope-full': 'Full',\n 'scope-full-help': 'Everything the audit can check.',\n 'scope-quick': 'Quick',\n 'scope-quick-help': 'The config, the host and the database — takes seconds.',\n start: 'Start',\n started: 'The audit has started.',\n cancel: 'Cancel the run',\n never: 'No audit has been run yet.',\n 'never-help':\n 'Run the first one to see how the site looks to a visitor and to a search engine.',\n health: 'Health',\n errors: 'Errors',\n warnings: 'Warnings',\n notices: 'Notices',\n new: 'New',\n fixed: 'Fixed',\n 'last-run': 'Last run',\n 'base-url': 'Address',\n 'status-queued': 'Waiting in the queue',\n 'status-running': 'Running',\n 'status-done': 'Done',\n 'status-failed': 'Failed',\n 'status-cancelled': 'Cancelled',\n 'stage-probes': 'Config and host',\n 'stage-database': 'Database',\n 'stage-crawl': 'Pages',\n 'stage-analyse': 'Analysis',\n 'last-failed': 'The last run did not finish: :error',\n 'by-group': 'By group',\n 'group-config': 'Configuration',\n 'group-host': 'Host and addresses',\n 'group-hosts': 'Outgoing addresses',\n 'group-other': 'Other',\n sources: 'Content searched',\n 'sources-missing': 'Installed, but not searched:',\n 'sync-queue':\n 'The queue runs jobs inside the request (sync), so the panel cannot start a run. Run php artisan webx:audit:run from the terminal or cron.',\n 'already-running': 'An audit is already running.',\n check: 'Check',\n count: 'Found',\n severity: 'Severity',\n 'severity-error': 'Error',\n 'severity-warning': 'Warning',\n 'severity-notice': 'Notice',\n 'any-severity': 'Any severity',\n 'any-group': 'Any group',\n 'any-state': 'New and persisting',\n 'state-new': 'New',\n 'state-persisting': 'Persisting',\n address: 'Address',\n empty: 'Nothing found.',\n clean: 'The last run found nothing.',\n found: 'What was found',\n why: 'Why it matters',\n fix: 'How to fix it',\n explain: 'What this check means',\n 'open-editor': 'Open in the editor',\n 'fix-button': 'Fix',\n 'fix-apply': 'Apply',\n 'fix-applied': 'Done. Run the audit again to see the finding go.',\n 'fix-none': 'Nothing left to change: no fix can close this finding now.',\n 'fix-pressed': 'Fixed — waiting for the next run',\n 'fix-changes': 'Changes',\n 'fix-before': 'Now',\n 'fix-after': 'After',\n yes: 'Yes',\n no: 'No',\n missing: 'Missing',\n pages: 'Pages',\n 'pages-progress': 'Pages crawled: :crawled of at most :limit',\n 'resources-progress':\n 'Pictures, styles, scripts and external links checked: :checked of :total',\n 'pages-none': 'No full run has crawled the site yet. Start a full audit to see every page.',\n 'pages-run': 'Full run of :date',\n 'group-indexing': 'Indexing',\n 'group-redirects': 'Redirects',\n 'group-page': 'Page',\n 'group-content': 'Content and speed',\n 'group-links': 'Links',\n 'group-images': 'Pictures',\n 'group-a11y': 'Accessibility',\n 'group-structure': 'Structure',\n columns: 'Columns',\n export: 'Export CSV',\n 'search-url': 'Search by address',\n 'any-status': 'Any answer',\n 'status-none': 'No answer',\n 'any-indexable': 'Indexable or not',\n 'indexable-yes': 'Indexable',\n 'indexable-no': 'Not indexable',\n 'any-check': 'With any findings or none',\n 'add-filter': 'Add a filter',\n 'remove-filter': 'Remove the filter',\n 'op-contains': 'contains',\n 'op-eq': 'is',\n 'op-empty': 'is empty',\n 'op-filled': 'is not empty',\n 'op-gt': 'more than',\n 'op-lt': 'less than',\n 'op-yes': 'yes',\n 'op-no': 'no',\n value: 'Value',\n 'field-url': 'Address',\n 'field-status': 'Code',\n 'field-final_status': 'Final code',\n 'field-redirect_to': 'Redirects to',\n 'field-source': 'Found through',\n 'field-depth': 'Depth',\n 'field-indexable': 'Indexable',\n 'field-issues': 'Findings',\n 'field-title': 'Title',\n 'field-description': 'Description',\n 'field-h1': 'H1',\n 'field-canonical': 'Canonical',\n 'field-robots_meta': 'Meta robots',\n 'field-x_robots_tag': 'X-Robots-Tag',\n 'field-lang': 'Language',\n 'field-content_type': 'Content type',\n 'field-bytes': 'Size, bytes',\n 'field-ttfb_ms': 'First byte, ms',\n 'field-total_ms': 'Answer, ms',\n 'field-compression': 'Compression',\n 'field-word_count': 'Words',\n 'field-links_in': 'Links in',\n 'field-links_out_internal': 'Internal links out',\n 'field-links_out_external': 'External links out',\n 'field-images': 'Pictures',\n 'field-images_without_alt': 'Pictures without alt',\n 'field-in_sitemap': 'In the sitemap',\n 'field-in_registry': 'In the registry',\n 'field-blocked_by_robots': 'Closed in robots.txt',\n 'source-home': 'Home page',\n 'source-sitemap': 'Sitemap',\n 'source-registry': 'Address registry',\n 'source-link': 'Link',\n 'card-overview': 'Overview',\n 'card-issues': 'Problems',\n 'card-incoming': 'Incoming',\n 'card-outgoing': 'Outgoing',\n 'card-images': 'Pictures',\n 'card-css': 'CSS',\n 'card-js': 'JS',\n 'card-microdata': 'Structured data',\n response: 'Response',\n headers: 'Headers',\n markup: 'Markup',\n 'open-page': 'Open the page',\n 'no-issues': 'No problems on this page.',\n 'no-links': 'No links.',\n kind: 'Kind',\n anchor: 'Anchor',\n host: 'Host',\n size: 'Size',\n cache: 'Cache',\n alt: 'Alt',\n 'not-checked': 'Not checked',\n 'no-resources': 'Nothing of this kind on the page.',\n 'no-json-ld': 'The page has no structured data.',\n 'jsonld-block': 'Block :number',\n 'jsonld-error': 'Does not parse:',\n 'jsonld-required': 'Required fields missing:',\n 'jsonld-recommended': 'Recommended fields missing:',\n 'jsonld-complete': 'Every field search engines ask for is there.',\n 'host-own': 'Own',\n 'host-own_mirror': 'Other mirror',\n 'host-dev': 'Stand',\n 'host-external': 'External',\n error: 'Error',\n 'source-list': 'Recheck list',\n hosts: 'Outgoing',\n runs: 'Runs',\n 'scope-urls': 'Recheck',\n 'urls-foreign': 'None of these addresses is on the audited site.',\n 'state-hidden': 'Hidden',\n hide: 'Hide',\n 'hide-title': 'Hide this finding',\n 'hide-help':\n 'Hidden findings stop counting, in this run and in every later one. Nothing is deleted: the hidden list shows them again.',\n 'hide-pattern': 'Addresses',\n 'hide-pattern-help':\n 'This address, or a mask of them: * is a stretch without a slash, ** one with slashes (/search/**). Empty hides every finding of the check.',\n 'hide-reason': 'Why it is all right',\n 'hide-count': 'Findings of the last run it would hide: :count',\n 'hidden-done': 'Hidden.',\n 'hidden-reason': 'Hidden: :reason',\n 'hidden-by': 'Hidden by :who: :reason',\n unhide: 'Show again',\n unhidden: 'Shown again.',\n recheck: 'Recheck',\n 'recheck-running': 'Rechecking the page…',\n 'recheck-fixed': 'Fixed since the last full run: :count',\n 'recheck-new': 'New since the last full run: :count',\n 'recheck-compare': 'Compare the runs',\n 'export-page': 'Export',\n 'runs-empty': 'No runs yet.',\n 'run-id': 'Run',\n status: 'Status',\n 'started-at': 'Started',\n 'started-by': 'Started by',\n 'by-schedule': 'Schedule',\n 'by-mcp': 'Agent',\n 'by-console': 'Console',\n 'by-person': 'Administrator',\n compare: 'Compare',\n 'compare-help':\n 'Pick two runs: what the later one found that the earlier did not, what both found, and what is gone.',\n 'compare-from': 'Earlier run',\n 'compare-to': 'Later run',\n 'compare-none': 'Both runs found the same.',\n 'compare-scopes':\n 'The runs differ in scope: only the checks the later run ran can count as fixed.',\n 'kind-new': 'New',\n 'kind-persisting': 'Persisting',\n 'kind-fixed': 'Fixed',\n 'hosts-empty': 'No run has seen a link or an address in the database yet.',\n 'search-host': 'Search by host',\n 'any-class': 'Any class',\n links: 'Links',\n fields: 'Fields in the database',\n broken: 'Broken',\n 'first-seen': 'First seen',\n 'host-pages': 'On pages',\n 'host-fields': 'In the database',\n record: 'Record',\n field: 'Field',\n unpublished: 'Not published',\n save: 'Save',\n saved: 'Saved.',\n dismiss: 'Cancel',\n 'view-full': 'View full size',\n },\n}\n","import { useAdmin } from '@webx-ui/module-admin'\nimport { auditMessages } from './messages'\n\nconst seeded = new WeakSet<object>()\n\n/** Puts this package's English under the panel's dictionary, once per panel. */\nexport function useAuditMessages(): void {\n try {\n const { i18n } = useAdmin()\n\n if (!seeded.has(i18n)) {\n i18n.defaults('webx-audit', auditMessages)\n seeded.add(i18n)\n }\n } catch {\n // Outside a panel there is no dictionary to seed, and `useTranslate` falls back on its own.\n }\n}\n","<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxBadge, WxButton, WxLink, WxSkeleton, WxText } from '@webx-ui/core'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHosts } from './types'\n\n/**\n * Where one host stands, under its row on «Outgoing»: the pages that link to it with the anchor\n * and what it answered, and the fields of the database that hold it, with «Open in the editor».\n * Fifty of each — enough to see the pattern, and the findings list the rest.\n */\nconst props = defineProps<{ host: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\nconst router = useRouter()\n\nconst places = ref<AuditHosts | null>(null)\nconst failure = ref<string | null>(null)\n\nonMounted(async () => {\n try {\n places.value = await api.hosts({ host: props.host })\n } catch (error) {\n failure.value = message(error)\n }\n})\n</script>\n\n<template>\n <div class=\"wx-audit-places\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!places\" :rows=\"2\" />\n\n <template v-else>\n <section v-if=\"places.pages?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-pages') }}</wx-text>\n <div v-for=\"(place, index) in places.pages\" :key=\"index\" class=\"wx-audit-places__row\">\n <wx-link :href=\"place.page\" target=\"_blank\" class=\"wx-audit-places__url\">{{\n place.page\n }}</wx-link>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-places__url\"\n >{{ place.kind }} → {{ place.url }}</wx-text\n >\n <wx-text v-if=\"place.anchor\" size=\"sm\">«{{ place.anchor }}»</wx-text>\n <wx-badge v-if=\"place.status && place.status >= 400\" type=\"danger\" size=\"sm\">{{\n place.status\n }}</wx-badge>\n </div>\n </section>\n\n <section v-if=\"places.fields?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-fields') }}</wx-text>\n <div v-for=\"(field, index) in places.fields\" :key=\"index\" class=\"wx-audit-places__row\">\n <wx-text size=\"sm\">{{ field.record_label }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\"\n >{{ field.source }} · {{ field.field\n }}{{ field.locale ? ` · ${field.locale}` : '' }}</wx-text\n >\n <wx-badge v-if=\"!field.published\" size=\"sm\">{{ t('page.unpublished') }}</wx-badge>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-places__url\">{{ field.url }}</wx-text>\n <wx-button\n v-if=\"field.edit_url\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n @click=\"router.push(field.edit_url)\"\n >{{ t('page.open-editor') }}</wx-button\n >\n </div>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-places {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-places__group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useAdmin, useTranslate, WxListScreen, type ScreenAction } from '@webx-ui/module-admin'\nimport type { TabItem, TabValue } from '@webx-ui/core'\nimport { useAuditMessages } from './i18n'\n\n/**\n * The head of the section: its name, its views — the overview, the findings, the pages, the\n * hosts the site points at and the runs — and the way to the section's own settings.\n */\n/*\n * `card` has its default here and not as `?? true` below: Vue turns a Boolean prop nobody passed\n * into `false`, so the coalescing never fired and every table stood without its card.\n */\nconst props = withDefaults(\n defineProps<{\n base: string\n current: 'overview' | 'issues' | 'pages' | 'hosts' | 'runs' | 'settings'\n /** A card around the slot — the tables want one, the overview draws its own. */\n card?: boolean\n }>(),\n { card: true },\n)\n\ndefineSlots<{ default?: () => unknown }>()\n\nconst context = useAdmin()\nconst router = useRouter()\nconst route = useRoute()\n\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'audit')?.title ??\n t('module.title'),\n)\n\nconst views = computed<TabItem[]>(() => [\n { value: 'overview', label: t('page.overview') },\n { value: 'issues', label: t('page.issues') },\n { value: 'pages', label: t('page.pages') },\n { value: 'hosts', label: t('page.hosts') },\n { value: 'runs', label: t('page.runs') },\n])\n\n/* The settings are a view of their own, out of the tabs: opened now and then, not every day. */\nconst actions = computed<ScreenAction[]>(() =>\n props.current === 'settings'\n ? []\n : [\n {\n key: 'settings',\n label: t('page.settings'),\n icon: 'settings',\n run: () => void router.push(`${props.base}/settings`),\n },\n ],\n)\n\nconst where = computed<TabValue>({\n /* The settings belong to no tab; the overview's stays lit as the way back. */\n get: () => (props.current === 'settings' ? 'overview' : props.current),\n set: (next) => {\n const path = next === 'overview' ? props.base : `${props.base}/${String(next)}`\n\n if (path !== route.path) void router.push(path)\n },\n})\n</script>\n\n<template>\n <wx-list-screen\n v-model:view=\"where\"\n :title=\"title\"\n :views=\"views\"\n :actions=\"actions\"\n :card=\"props.card\"\n >\n <slot />\n </wx-list-screen>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type RowKey,\n type SelectValue,\n type TableColumn,\n} from '@webx-ui/core'\nimport AuditHostPlaces from './AuditHostPlaces.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHostClass, AuditHostRow, AuditHosts } from './types'\n\n/**\n * «Outgoing» (§8): every host the site points at — in the pages of the last full run and in the\n * fields of the database — by class, development stands on top and in red. A row opens into\n * where the host stands: the pages with their anchors, the records with the field and the way to\n * the editor.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst answer = ref<AuditHosts | null>(null)\nconst loading = ref(false)\nconst search = ref('')\nconst hostClass = ref<AuditHostClass | null>(null)\nconst expanded = ref<RowKey[]>([])\n\nconst classes: Record<AuditHostClass, BadgeType> = {\n dev: 'danger',\n own_mirror: 'warning',\n external: 'info',\n own: 'success',\n}\n\nconst columns = computed<TableColumn<AuditHostRow>[]>(() => [\n { key: 'host', label: t('page.host'), minWidth: 220 },\n { key: 'links', label: t('page.links'), width: 90, align: 'right' },\n { key: 'pages', label: t('page.pages'), width: 90, align: 'right', hideBelow: 560 },\n { key: 'broken', label: t('page.broken'), width: 100, align: 'right', hideBelow: 640 },\n { key: 'fields', label: t('page.fields'), width: 120, align: 'right' },\n { key: 'first_seen', label: t('page.first-seen'), minWidth: 140, hideBelow: 760 },\n])\n\nconst classOptions = computed(() =>\n (Object.keys(classes) as AuditHostClass[]).map((value) => ({\n value,\n label: `${t(`page.host-${value}`)}${answer.value?.classes[value] ? ` · ${answer.value.classes[value]}` : ''}`,\n })),\n)\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): AuditHostClass | null {\n return typeof value === 'string' && value in classes ? (value as AuditHostClass) : null\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n answer.value = await api.hosts({ class: hostClass.value, search: search.value })\n expanded.value = []\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([hostClass, search], () => void load())\n\nonMounted(load)\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"hosts\">\n <wx-table\n v-model:expanded=\"expanded\"\n v-model:search=\"search\"\n :data=\"answer?.hosts ?? []\"\n :columns=\"columns\"\n row-key=\"host\"\n expandable\n flush\n searchable\n :search-placeholder=\"t('page.search-host')\"\n :loading=\"loading\"\n :filters-count=\"hostClass ? 1 : 0\"\n :filters-label=\"panel('filters.title')\"\n :row-class=\"(row: AuditHostRow) => (row.class === 'dev' ? 'is-stand' : undefined)\"\n :empty-text=\"t('page.hosts-empty')\"\n >\n <template #filters>\n <wx-select\n :model-value=\"hostClass\"\n :options=\"classOptions\"\n :placeholder=\"t('page.any-class')\"\n clearable\n @update:model-value=\"hostClass = pick($event)\"\n />\n </template>\n\n <template #cell-host=\"{ row }\">\n <span class=\"wx-audit-hosts__host\">\n <wx-badge :type=\"classes[row.class]\" size=\"sm\">{{\n t(`page.host-${row.class}`)\n }}</wx-badge>\n <wx-text size=\"sm\" :tone=\"row.class === 'dev' ? 'danger' : undefined\" weight=\"medium\">{{\n row.host\n }}</wx-text>\n </span>\n </template>\n <template #cell-broken=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.broken ? 'danger' : 'muted'\">{{ row.broken }}</wx-text>\n </template>\n <template #cell-fields=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.fields && row.class === 'dev' ? 'danger' : undefined\">{{\n row.fields\n }}</wx-text>\n </template>\n <template #cell-first_seen=\"{ row }\">\n <wx-date v-if=\"row.first_seen\" :value=\"row.first_seen\" />\n </template>\n\n <template #expanded=\"{ row }\">\n <audit-host-places :host=\"row.host\" />\n </template>\n </wx-table>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-hosts__host {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* A stand is the one class that is always a mistake: a red edge, like an error in a list. */\n:deep(.is-stand > td:first-child) {\n box-shadow: inset 3px 0 0 var(--wx-color-danger);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router'\nimport { useTranslate } from '@webx-ui/module-admin'\nimport { WxBadge, WxButton, WxLink, WxText, type BadgeType } from '@webx-ui/core'\nimport { useAuditMessages } from './i18n'\nimport type { AuditDetails, AuditDetailsColumn } from './types'\n\n/**\n * The expansion of a finding, for every check alike (§4 of the spec): a summary line and, when\n * the check gave one, a table whose cells are drawn by their type — an address opens, a code is\n * coloured, a missing value is said in red, an editor link goes to the record in the panel.\n */\nconst props = defineProps<{ details: AuditDetails }>()\n\nconst router = useRouter()\n\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\n\nfunction statusType(value: unknown): BadgeType {\n const code = Number(value)\n\n if (code >= 500 || code === 0) return 'danger'\n if (code >= 400) return 'warning'\n if (code >= 300) return 'info'\n\n return 'success'\n}\n\nfunction cell(row: Record<string, unknown>, column: AuditDetailsColumn): unknown {\n return row[column.key]\n}\n\n/** Yes, no — or nothing, when the check could not tell (the other page was not crawled). */\nfunction yesNo(value: unknown): string {\n if (value === null || value === undefined) return ''\n\n return value ? t('page.yes') : t('page.no')\n}\n\nfunction text(value: unknown): string {\n return value === null || value === undefined ? '' : String(value)\n}\n</script>\n\n<template>\n <div class=\"wx-audit-details\">\n <wx-text v-if=\"props.details.summary\" size=\"sm\">{{ props.details.summary }}</wx-text>\n\n <div\n v-if=\"props.details.table && props.details.table.rows.length\"\n class=\"wx-audit-details__scroll\"\n >\n <table class=\"wx-audit-details__table\">\n <thead>\n <tr>\n <th v-for=\"column in props.details.table.columns\" :key=\"column.key\">\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, index) in props.details.table.rows\" :key=\"index\">\n <td v-for=\"column in props.details.table.columns\" :key=\"column.key\">\n <template v-if=\"column.type === 'url' && text(cell(row, column))\">\n <wx-link\n :href=\"text(cell(row, column))\"\n target=\"_blank\"\n class=\"wx-audit-details__url\"\n >{{ text(cell(row, column)) }}</wx-link\n >\n </template>\n <wx-badge\n v-else-if=\"column.type === 'status' && cell(row, column) !== null\"\n :type=\"statusType(cell(row, column))\"\n size=\"sm\"\n >{{ text(cell(row, column)) }}</wx-badge\n >\n <template v-else-if=\"column.type === 'bool'\">\n {{ yesNo(cell(row, column)) }}\n </template>\n <wx-text\n v-else-if=\"column.type === 'missing' && !text(cell(row, column))\"\n size=\"sm\"\n tone=\"danger\"\n >{{ t('page.missing') }}</wx-text\n >\n <wx-button\n v-else-if=\"column.type === 'edit' && text(cell(row, column))\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n @click=\"router.push(text(cell(row, column)))\"\n >{{ t('page.open-editor') }}</wx-button\n >\n <template v-else>{{ text(cell(row, column)) }}</template>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-details {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n/* A wide table scrolls inside itself rather than pushing the panel sideways on a phone. */\n.wx-audit-details__scroll {\n overflow-x: auto;\n}\n\n.wx-audit-details__table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-details__table th {\n color: var(--wx-text-muted);\n font-weight: normal;\n text-align: left;\n white-space: nowrap;\n}\n\n.wx-audit-details__table th,\n.wx-audit-details__table td {\n padding: var(--wx-space-4) var(--wx-space-8);\n border-bottom: 1px solid var(--wx-border-muted);\n vertical-align: top;\n}\n\n.wx-audit-details__url {\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxButton, WxDialog, WxSkeleton, WxText, toast } from '@webx-ui/core'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditFixOffer, AuditIssue } from './types'\n\n/**\n * The fix button's dialog (§8, decision 4): the fixes that can close one finding, each with what\n * it would change — the records and fields with their counts, or a setting before and after —\n * and \"Apply\" under each. Nothing changes until it is pressed; the finding then waits for the\n * next run, which is the only thing that says it is gone.\n */\nconst props = defineProps<{ run: number; issue: AuditIssue }>()\nconst emit = defineEmits<{ fixed: [fix: string] }>()\nconst open = defineModel<boolean>('open', { default: false })\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\nconst router = useRouter()\n\nconst offers = ref<AuditFixOffer[] | null>(null)\nconst failure = ref<string | null>(null)\nconst applying = ref<string | null>(null)\n\nasync function load(): Promise<void> {\n offers.value = null\n failure.value = null\n\n try {\n offers.value = await api.fixes(props.run, props.issue.id)\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nasync function apply(offer: AuditFixOffer): Promise<void> {\n applying.value = offer.id\n\n try {\n await api.fix(props.run, props.issue.id, offer.id)\n toast.success(t('page.fix-applied'))\n emit('fixed', offer.id)\n open.value = false\n } catch (error) {\n toast.danger(message(error))\n } finally {\n applying.value = null\n }\n}\n\nfunction edit(url: string): void {\n open.value = false\n void router.push(url)\n}\n\n// Immediate: the list mounts the dialog already open, the first time a button is pressed.\nwatch(\n [open, () => props.issue.id],\n ([now]) => {\n if (now) void load()\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('page.fix-button')\" :width=\"640\">\n <div class=\"wx-audit-fix\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!offers\" :rows=\"3\" />\n <wx-text v-else-if=\"offers.length === 0\" size=\"sm\" tone=\"muted\">{{\n t('page.fix-none')\n }}</wx-text>\n\n <section v-for=\"offer in offers ?? []\" :key=\"offer.id\" class=\"wx-audit-fix__offer\">\n <wx-text weight=\"semibold\">{{ offer.title }}</wx-text>\n <wx-text v-if=\"offer.description\" size=\"sm\" tone=\"muted\">{{ offer.description }}</wx-text>\n\n <table class=\"wx-audit-fix__changes\">\n <thead>\n <tr>\n <th>{{ t('page.fix-changes') }}</th>\n <th>{{ t('page.fix-before') }}</th>\n <th>{{ t('page.fix-after') }}</th>\n <th />\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(change, index) in offer.changes\" :key=\"index\">\n <td>\n <div>{{ change.label }}</div>\n <div v-if=\"change.field\" class=\"wx-audit-fix__field\">{{ change.field }}</div>\n </td>\n <td class=\"wx-audit-fix__value\">\n {{ change.before ?? '' }}\n <span v-if=\"change.count\" class=\"wx-audit-fix__count\">× {{ change.count }}</span>\n </td>\n <td class=\"wx-audit-fix__value\">{{ change.after ?? '' }}</td>\n <td>\n <wx-button\n v-if=\"change.edit_url\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n :aria-label=\"t('page.open-editor')\"\n @click=\"edit(change.edit_url)\"\n />\n </td>\n </tr>\n </tbody>\n </table>\n\n <wx-text v-if=\"offer.note\" size=\"sm\" tone=\"muted\">{{ offer.note }}</wx-text>\n\n <div class=\"wx-audit-fix__actions\">\n <wx-button\n type=\"primary\"\n size=\"sm\"\n :loading=\"applying === offer.id\"\n :disabled=\"applying !== null\"\n @click=\"apply(offer)\"\n >{{ t('page.fix-apply') }}</wx-button\n >\n </div>\n </section>\n </div>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-audit-fix {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-fix__offer {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-fix__changes {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-fix__changes th {\n padding: var(--wx-space-4) var(--wx-space-8);\n color: var(--wx-text-muted);\n font-weight: var(--wx-font-weight-medium);\n text-align: start;\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-audit-fix__changes td {\n padding: var(--wx-space-6) var(--wx-space-8);\n vertical-align: top;\n border-bottom: 1px solid var(--wx-border-default);\n overflow-wrap: anywhere;\n}\n\n.wx-audit-fix__field,\n.wx-audit-fix__count {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-fix__value {\n white-space: pre-line;\n}\n\n.wx-audit-fix__actions {\n display: flex;\n justify-content: flex-end;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxButton, WxDialog, WxFormItem, WxInput, WxText, WxTextarea, toast } from '@webx-ui/core'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditIgnoreRule, AuditIssue } from './types'\n\n/**\n * «Hide» on a finding (decision 9): which addresses — this one, a mask of them, or the whole\n * check — and why. While the mask is typed the dialog says how many findings of the last run it\n * would hide; nothing is hidden until the button is pressed, and nothing is ever deleted.\n */\nconst props = defineProps<{ issue: AuditIssue; title: string }>()\nconst emit = defineEmits<{ hidden: [rule: AuditIgnoreRule] }>()\nconst open = defineModel<boolean>('open', { default: false })\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst pattern = ref('')\nconst reason = ref('')\nconst count = ref<number | null>(null)\nconst saving = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\n/* The path, not the whole address: a mask of the path hides it on every mirror a run opened. */\nfunction pathOf(url: string | null): string {\n if (!url) return ''\n\n try {\n const parsed = new URL(url)\n\n return parsed.pathname + parsed.search\n } catch {\n return url\n }\n}\n\nconst ready = computed(() => reason.value.trim() !== '')\n\nfunction preview(): void {\n clearTimeout(timer)\n timer = setTimeout(async () => {\n try {\n count.value = await api.hidePreview({ check: props.issue.check, pattern: pattern.value })\n } catch {\n count.value = null\n }\n }, 300)\n}\n\nasync function hide(): Promise<void> {\n saving.value = true\n\n try {\n const rule = await api.hide({\n check: props.issue.check,\n pattern: pattern.value,\n reason: reason.value,\n })\n\n toast.success(t('page.hidden-done'))\n emit('hidden', rule)\n open.value = false\n } catch (error) {\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n\nwatch(\n [open, () => props.issue.id],\n ([now]) => {\n if (!now) return\n\n pattern.value = pathOf(props.issue.url)\n reason.value = ''\n count.value = null\n preview()\n },\n { immediate: true },\n)\n\nwatch(pattern, () => {\n if (open.value) preview()\n})\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('page.hide-title')\" :width=\"560\">\n <div class=\"wx-audit-hide\">\n <wx-text weight=\"semibold\">{{ props.title }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\">{{ t('page.hide-help') }}</wx-text>\n\n <wx-form-item :label=\"t('page.hide-pattern')\" :help=\"t('page.hide-pattern-help')\">\n <wx-input v-model=\"pattern\" placeholder=\"/search/**\" />\n </wx-form-item>\n\n <wx-form-item :label=\"t('page.hide-reason')\" required>\n <wx-textarea v-model=\"reason\" :rows=\"3\" />\n </wx-form-item>\n\n <wx-text v-if=\"count !== null\" size=\"sm\" tone=\"muted\">{{\n t('page.hide-count', { count })\n }}</wx-text>\n </div>\n\n <template #footer>\n <wx-button @click=\"open = false\">{{ t('page.dismiss') }}</wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" :disabled=\"!ready\" @click=\"hide\">{{\n t('page.hide')\n }}</wx-button>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-audit-hide {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { toast, WxBadge, WxButton, WxLink, WxSkeleton, WxText } from '@webx-ui/core'\nimport AuditDetails from './AuditDetails.vue'\nimport AuditFixDialog from './AuditFixDialog.vue'\nimport AuditHideDialog from './AuditHideDialog.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditIgnoreRule, AuditIssue, AuditIssueQuery } from './types'\n\n/**\n * The addresses of one check, under its row in the findings table: loaded when the row opens,\n * fifty at a time. A check that has fixes gets a button on each address; the dialog shows what\n * it would change before anything does. «Hide» asks for the reason; on the list of hidden ones\n * each says why, and «Show again» removes the rule.\n */\nconst props = defineProps<{\n run: number\n query: AuditIssueQuery\n fixable?: boolean\n /** The check's title, for the hiding dialog. */\n title?: string\n}>()\n\nconst emit = defineEmits<{ changed: [] }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\n// A boolean, not a computed: the permissions do not change while the screen is open.\nconst can = context.can('audit.manage')\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst issues = ref<AuditIssue[] | null>(null)\nconst more = ref(false)\nconst page = ref(1)\nconst failure = ref<string | null>(null)\nconst fixing = ref<AuditIssue | null>(null)\nconst dialog = ref(false)\nconst hiding = ref<AuditIssue | null>(null)\nconst hideDialog = ref(false)\n\nfunction hide(issue: AuditIssue): void {\n hiding.value = issue\n hideDialog.value = true\n}\n\n/* What the rule hid leaves this list at once; the table above counts again. */\nfunction hidden(rule: AuditIgnoreRule): void {\n if (issues.value && !rule.pattern) issues.value = []\n else if (issues.value && hiding.value)\n issues.value = issues.value.filter((one) => one.id !== hiding.value?.id)\n\n emit('changed')\n}\n\nasync function unhide(issue: AuditIssue): Promise<void> {\n if (!issue.ignore) return\n\n try {\n await api.unhide(issue.ignore.id)\n toast.success(t('page.unhidden'))\n emit('changed')\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction why(issue: AuditIssue): string {\n const rule = issue.ignore\n\n if (!rule) return ''\n\n return rule.created_by\n ? t('page.hidden-by', { who: rule.created_by, reason: rule.reason })\n : t('page.hidden-reason', { reason: rule.reason })\n}\n\nfunction fix(issue: AuditIssue): void {\n fixing.value = issue\n dialog.value = true\n}\n\nfunction fixed(id: string): void {\n if (fixing.value) fixing.value.fixed_with = id\n}\n\nasync function load(next = 1): Promise<void> {\n try {\n const answer = await api.issues(props.run, { ...props.query, page: next, per_page: 50 })\n\n issues.value = next === 1 ? answer.data : [...(issues.value ?? []), ...answer.data]\n page.value = answer.current_page\n more.value = answer.current_page < answer.last_page\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nonMounted(() => load())\n</script>\n\n<template>\n <div class=\"wx-audit-issues\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!issues\" :rows=\"2\" />\n\n <template v-else>\n <div v-for=\"issue in issues\" :key=\"issue.id\" class=\"wx-audit-issues__item\">\n <div class=\"wx-audit-issues__head\">\n <wx-link\n v-if=\"issue.url\"\n :href=\"issue.url\"\n target=\"_blank\"\n class=\"wx-audit-issues__url\"\n >{{ issue.url }}</wx-link\n >\n <wx-badge v-if=\"issue.state === 'new'\" type=\"primary\" size=\"sm\">{{\n t('page.state-new')\n }}</wx-badge>\n <wx-badge v-if=\"issue.fixed_with\" type=\"success\" size=\"sm\">{{\n t('page.fix-pressed')\n }}</wx-badge>\n <wx-button\n v-else-if=\"fixable && can && !issue.ignored\"\n size=\"sm\"\n variant=\"outline\"\n icon=\"check\"\n class=\"wx-audit-issues__fix\"\n @click=\"fix(issue)\"\n >{{ t('page.fix-button') }}</wx-button\n >\n <wx-button\n v-if=\"can && issue.ignored && issue.ignore\"\n size=\"sm\"\n variant=\"text\"\n icon=\"eye\"\n class=\"wx-audit-issues__end\"\n @click=\"unhide(issue)\"\n >{{ t('page.unhide') }}</wx-button\n >\n <wx-button\n v-else-if=\"can && !issue.ignored\"\n size=\"sm\"\n variant=\"text\"\n icon=\"eye-off\"\n :class=\"{ 'wx-audit-issues__end': !fixable || issue.fixed_with }\"\n @click=\"hide(issue)\"\n >{{ t('page.hide') }}</wx-button\n >\n </div>\n <wx-text v-if=\"issue.ignore\" size=\"sm\" tone=\"muted\">{{ why(issue) }}</wx-text>\n <audit-details :details=\"issue.details\" />\n </div>\n\n <wx-button v-if=\"more\" size=\"sm\" variant=\"text\" @click=\"load(page + 1)\">…</wx-button>\n </template>\n\n <audit-fix-dialog\n v-if=\"fixing\"\n v-model:open=\"dialog\"\n :run=\"run\"\n :issue=\"fixing\"\n @fixed=\"fixed\"\n />\n\n <audit-hide-dialog\n v-if=\"hiding\"\n v-model:open=\"hideDialog\"\n :issue=\"hiding\"\n :title=\"props.title ?? hiding.check\"\n @hidden=\"hidden\"\n />\n </div>\n</template>\n\n<style scoped>\n.wx-audit-issues {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-issues__item {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-audit-issues__head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-issues__fix,\n.wx-audit-issues__end {\n margin-inline-start: auto;\n}\n\n.wx-audit-issues__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxPopover,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type SelectValue,\n type TableColumn,\n} from '@webx-ui/core'\nimport AuditIssueList from './AuditIssueList.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditCheckRow, AuditSeverity } from './types'\n\n/**\n * The findings of the last finished run (§8): one row per check, worst first; a row opens into\n * its addresses. «Hidden» in the state filter lists what the rules hide, each with its reason. The «?» beside a check says what was found, why it matters and how to fix it —\n * the three texts every check carries.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst run = ref<number | null>(null)\nconst checks = ref<AuditCheckRow[] | null>(null)\nconst loading = ref(false)\nconst expanded = ref<(string | number)[]>([])\n\nconst severity = ref<AuditSeverity | null>(null)\nconst group = ref<string | null>(null)\ntype State = 'new' | 'persisting' | 'hidden'\n\nconst state = ref<State | null>(null)\n\nconst query = computed(() => ({ severity: severity.value, group: group.value, state: state.value }))\nconst filtersCount = computed(\n () => [severity.value, group.value, state.value].filter(Boolean).length,\n)\n\nconst types: Record<AuditSeverity, BadgeType> = {\n error: 'danger',\n warning: 'warning',\n notice: 'info',\n}\n\nconst columns = computed<TableColumn<AuditCheckRow>[]>(() => [\n { key: 'severity', label: t('page.severity'), width: 130 },\n { key: 'title', label: t('page.check') },\n { key: 'count', label: t('page.count'), width: 110, align: 'right' },\n])\n\nconst severityOptions = computed(() =>\n (['error', 'warning', 'notice'] as const).map((value) => ({\n value,\n label: t(`page.severity-${value}`),\n })),\n)\n\nconst groupOptions = computed(() =>\n [\n 'config',\n 'host',\n 'hosts',\n 'indexing',\n 'page',\n 'content',\n 'links',\n 'images',\n 'a11y',\n 'structure',\n ].map((value) => ({ value, label: t(`page.group-${value}`) })),\n)\n\nconst stateOptions = computed(() =>\n (['new', 'persisting', 'hidden'] as const).map((value) => ({\n value,\n label: t(`page.state-${value}`),\n })),\n)\n\n/* The selects hand back `string | number`; the filters only ever hold the values offered. */\nfunction pick<T extends string>(value: SelectValue | SelectValue[] | null | undefined): T | null {\n return typeof value === 'string' && value !== '' ? (value as T) : null\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n if (run.value === null) {\n run.value = (await api.latest()).done?.id ?? null\n }\n\n checks.value = run.value === null ? [] : await api.checks(run.value, query.value)\n expanded.value = []\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch(query, () => void load())\n\nonMounted(load)\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"issues\">\n <wx-table\n v-model:expanded=\"expanded\"\n :data=\"checks ?? []\"\n :columns=\"columns\"\n row-key=\"id\"\n expandable\n flush\n :loading=\"loading\"\n :filters-count=\"filtersCount\"\n :filters-label=\"panel('filters.title')\"\n :empty-text=\"run === null ? t('page.never') : t('page.empty')\"\n >\n <template #filters>\n <div class=\"wx-audit-findings__filters\">\n <wx-select\n :model-value=\"severity\"\n :options=\"severityOptions\"\n :placeholder=\"t('page.any-severity')\"\n clearable\n @update:model-value=\"severity = pick<AuditSeverity>($event)\"\n />\n <wx-select\n :model-value=\"group\"\n :options=\"groupOptions\"\n :placeholder=\"t('page.any-group')\"\n clearable\n @update:model-value=\"group = pick($event)\"\n />\n <wx-select\n :model-value=\"state\"\n :options=\"stateOptions\"\n :placeholder=\"t('page.any-state')\"\n clearable\n @update:model-value=\"state = pick<State>($event)\"\n />\n </div>\n </template>\n\n <template #cell-severity=\"{ row }\">\n <wx-badge :type=\"types[row.severity]\" dot>{{\n t(`page.severity-${row.severity}`)\n }}</wx-badge>\n </template>\n\n <template #cell-title=\"{ row }\">\n <span class=\"wx-audit-findings__title\">\n <wx-text size=\"sm\">{{ row.title }}</wx-text>\n <wx-badge v-if=\"row.new > 0\" type=\"primary\" size=\"sm\">{{ t('page.state-new') }}</wx-badge>\n <wx-popover :title=\"row.title\" width=\"360\">\n <template #trigger>\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"question\"\n :aria-label=\"t('page.explain')\"\n @click.stop\n />\n </template>\n <dl class=\"wx-audit-findings__texts\">\n <dt>{{ t('page.found') }}</dt>\n <dd>{{ row.found }}</dd>\n <dt>{{ t('page.why') }}</dt>\n <dd>{{ row.why }}</dd>\n <dt>{{ t('page.fix') }}</dt>\n <dd>{{ row.fix }}</dd>\n </dl>\n </wx-popover>\n </span>\n </template>\n\n <template #expanded=\"{ row }\">\n <audit-issue-list\n v-if=\"run !== null\"\n :run=\"run\"\n :query=\"{ ...query, check: row.id }\"\n :fixable=\"(row.fixes ?? []).length > 0\"\n :title=\"row.title\"\n @changed=\"load\"\n />\n </template>\n </wx-table>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-findings__filters {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-findings__title {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-findings__texts {\n display: grid;\n gap: var(--wx-space-4);\n margin: 0;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-findings__texts dt {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-findings__texts dd {\n margin: 0 0 var(--wx-space-8);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxEmpty,\n WxProgress,\n WxSegmented,\n WxSkeleton,\n WxStatistic,\n WxText,\n type ProgressStatus,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditLatest, AuditRun, AuditScope, AuditSeverity } from './types'\n\n/**\n * The last run at a glance (§8): health, the counts by severity and by group, what is new and\n * what got fixed since the run before, and the button that starts the next one. While a run is\n * going the page asks for it every couple of seconds and shows the stage it is in.\n */\nconst props = defineProps<{ base: string }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst POLL_MS = 2000\n\nconst latest = ref<AuditLatest | null>(null)\nconst scope = ref<AuditScope>('quick')\nconst starting = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nconst canRun = context.can('audit.run') || context.can('audit.manage')\n\nconst active = computed(() => latest.value?.active ?? null)\nconst done = computed(() => latest.value?.done ?? null)\nconst counts = computed(() => done.value?.counts ?? null)\n\nconst scopes = computed(() => [\n { value: 'quick', label: t('page.scope-quick') },\n { value: 'full', label: t('page.scope-full') },\n])\n\nconst severities: { key: AuditSeverity; label: string; tone: 'danger' | 'warning' | 'info' }[] = [\n { key: 'error', label: 'page.errors', tone: 'danger' },\n { key: 'warning', label: 'page.warnings', tone: 'warning' },\n { key: 'notice', label: 'page.notices', tone: 'info' },\n]\n\nconst healthStatus = computed<ProgressStatus>(() => {\n const health = counts.value?.health ?? 0\n\n if (health >= 90) return 'success'\n if (health >= 60) return 'warning'\n\n return 'danger'\n})\n\n/* The groups this package has words for; a module's own group reads as «Other». */\nconst GROUPS = [\n 'config',\n 'host',\n 'hosts',\n 'indexing',\n 'page',\n 'content',\n 'links',\n 'images',\n 'a11y',\n 'structure',\n]\n\nconst groups = computed(() =>\n Object.entries(counts.value?.groups ?? {}).map(([id, bySeverity]) => ({\n id,\n label: t(`page.group-${GROUPS.includes(id) ? id : 'other'}`),\n bySeverity,\n })),\n)\n\nfunction stageLabel(run: AuditRun): string {\n if (run.status === 'queued') return t('page.status-queued')\n\n return run.progress.stage ? t(`page.stage-${run.progress.stage}`) : t('page.status-running')\n}\n\nasync function load(): Promise<void> {\n try {\n latest.value = await api.latest()\n } catch (error) {\n toast.danger(message(error))\n }\n\n clearTimeout(timer)\n\n if (latest.value?.active) {\n timer = setTimeout(() => void load(), POLL_MS)\n }\n}\n\nasync function start(): Promise<void> {\n starting.value = true\n\n try {\n await api.start(scope.value)\n toast.success(t('page.started'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n starting.value = false\n }\n}\n\nasync function cancel(run: AuditRun): Promise<void> {\n try {\n await api.cancel(run.id)\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nonMounted(load)\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"overview\" :card=\"false\">\n <div class=\"wx-audit-overview\">\n <wx-card v-if=\"!latest\"><wx-skeleton :rows=\"4\" /></wx-card>\n\n <template v-else>\n <wx-alert v-if=\"latest.queue.sync\" type=\"warning\" :description=\"t('page.sync-queue')\" />\n\n <wx-alert\n v-if=\"latest.last && latest.last.status === 'failed'\"\n type=\"danger\"\n :description=\"t('page.last-failed', { error: latest.last.error ?? '' })\"\n />\n\n <wx-card v-if=\"active\" class=\"wx-audit-overview__active\">\n <div class=\"wx-audit-overview__row\">\n <wx-text weight=\"semibold\">{{ stageLabel(active) }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n active.base_url\n }}</wx-text>\n <wx-button\n v-if=\"canRun\"\n size=\"sm\"\n class=\"wx-audit-overview__end\"\n @click=\"cancel(active)\"\n >{{ t('page.cancel') }}</wx-button\n >\n </div>\n <wx-progress indeterminate :aria-label=\"stageLabel(active)\" />\n <wx-text v-if=\"active.progress.resources\" size=\"sm\" tone=\"muted\">{{\n t('page.resources-progress', {\n checked: active.progress.resources.checked,\n total: active.progress.resources.total,\n })\n }}</wx-text>\n <wx-text v-else-if=\"active.progress.stage === 'crawl'\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-progress', {\n crawled: active.progress.pages.crawled,\n limit: active.progress.pages.limit,\n })\n }}</wx-text>\n </wx-card>\n\n <wx-card v-else-if=\"canRun && !latest.queue.sync\">\n <div class=\"wx-audit-overview__row\">\n <wx-segmented v-model=\"scope\" :options=\"scopes\" :aria-label=\"t('page.scope')\" />\n <wx-text size=\"sm\" tone=\"muted\">{{\n scope === 'full' ? t('page.scope-full-help') : t('page.scope-quick-help')\n }}</wx-text>\n <wx-button\n type=\"primary\"\n icon=\"refresh\"\n :loading=\"starting\"\n class=\"wx-audit-overview__end\"\n @click=\"start\"\n >{{ t('page.run') }}</wx-button\n >\n </div>\n </wx-card>\n\n <wx-card v-if=\"!done && !active\">\n <wx-empty\n icon=\"check-circle\"\n :title=\"t('page.never')\"\n :description=\"t('page.never-help')\"\n />\n </wx-card>\n\n <template v-if=\"done && counts\">\n <wx-card>\n <div class=\"wx-audit-overview__summary\">\n <wx-progress\n type=\"circle\"\n :value=\"counts.health\"\n :status=\"healthStatus\"\n show-value\n :formatter=\"(value: number) => `${value}%`\"\n :aria-label=\"t('page.health')\"\n />\n <div class=\"wx-audit-overview__stats\">\n <wx-statistic\n v-for=\"severity in severities\"\n :key=\"severity.key\"\n :title=\"t(severity.label)\"\n :value=\"counts.severity[severity.key] ?? 0\"\n :tone=\"(counts.severity[severity.key] ?? 0) > 0 ? severity.tone : 'muted'\"\n />\n <wx-statistic :title=\"t('page.new')\" :value=\"counts.new\" />\n <wx-statistic :title=\"t('page.fixed')\" :value=\"counts.fixed\" tone=\"success\" />\n </div>\n </div>\n <div class=\"wx-audit-overview__meta\">\n <wx-text size=\"sm\" tone=\"muted\">\n {{ t('page.last-run') }} <wx-date :value=\"done.finished_at\" /> ·\n {{ t(`page.scope-${done.scope}`) }} ·\n </wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n done.base_url\n }}</wx-text>\n </div>\n </wx-card>\n\n <wx-card v-if=\"groups.length\" :title=\"t('page.by-group')\">\n <ul class=\"wx-audit-overview__groups\">\n <li v-for=\"group in groups\" :key=\"group.id\">\n <wx-text size=\"sm\">{{ group.label }}</wx-text>\n <span class=\"wx-audit-overview__badges\">\n <template v-for=\"severity in severities\" :key=\"severity.key\">\n <wx-badge\n v-if=\"(group.bySeverity[severity.key] ?? 0) > 0\"\n :type=\"severity.tone\"\n size=\"sm\"\n >{{ t(severity.label) }} · {{ group.bySeverity[severity.key] }}</wx-badge\n >\n </template>\n </span>\n </li>\n </ul>\n </wx-card>\n\n <wx-card v-else>\n <wx-empty icon=\"check-circle\" :title=\"t('page.clean')\" size=\"sm\" />\n </wx-card>\n\n <wx-card :title=\"t('page.sources')\">\n <div class=\"wx-audit-overview__badges\">\n <wx-badge v-for=\"source in counts.sources.searched\" :key=\"source\" type=\"success\">{{\n source\n }}</wx-badge>\n </div>\n <div v-if=\"counts.sources.missing.length\" class=\"wx-audit-overview__missing\">\n <wx-text size=\"sm\" tone=\"warning\">{{ t('page.sources-missing') }}</wx-text>\n <wx-badge v-for=\"source in counts.sources.missing\" :key=\"source\" type=\"warning\">{{\n source\n }}</wx-badge>\n </div>\n </wx-card>\n </template>\n </template>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-overview {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n container-type: inline-size;\n}\n\n.wx-audit-overview__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-12);\n margin-bottom: var(--wx-space-8);\n}\n\n.wx-audit-overview__end {\n margin-left: auto;\n}\n\n.wx-audit-overview__summary {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-24);\n}\n\n.wx-audit-overview__stats {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n gap: var(--wx-space-16) var(--wx-space-32);\n}\n\n.wx-audit-overview__meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n margin-top: var(--wx-space-16);\n}\n\n/* A long domain breaks rather than pushing the card sideways on a phone. */\n.wx-audit-overview__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-overview__groups {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-audit-overview__groups li {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-overview__badges,\n.wx-audit-overview__missing {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-overview__missing {\n margin-top: var(--wx-space-12);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxDrawer,\n WxImage,\n WxLink,\n WxSkeleton,\n WxTable,\n WxTabs,\n WxText,\n type BadgeType,\n type TabItem,\n type TabValue,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditDetails from './AuditDetails.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditLinkRow,\n AuditPage,\n AuditPageCard,\n AuditResourceRow,\n AuditResourceTab,\n AuditRun,\n AuditSeverity,\n} from './types'\n\n/**\n * One page of the snapshot, sliding in from the right (§8): what it answered and what its head\n * says, its findings, the links that lead in and out of it — with the answer of each own page\n * and the class of each host — what it loads (pictures, CSS, JS) with what each answered, and\n * its structured data with what the types lack.\n *\n * «Recheck» asks this one address again (a run of the `urls` scope) and says what of its findings\n * in the last full run are fixed; «Export» downloads the page — snapshot, findings and links.\n */\nconst props = defineProps<{\n run: number\n /** Where the section lives — the recheck's comparison opens on its runs. */\n base?: string\n /** The page to show; null keeps the card closed. */\n pageId: number | null\n /** Check ids and their titles in the reader's language, for the findings tab. */\n titles: Record<string, string>\n}>()\n\nconst emit = defineEmits<{ close: [] }>()\n\n/*\n * The card is wide: a page has long addresses, headers and hreflang lists. Its width is kept under\n * a key of its own, so one remembered from the narrow card of before does not keep it narrow.\n */\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nconst router = useRouter()\nuseAuditMessages()\n\nconst canRun = context.can('audit.run') || context.can('audit.manage')\nconst recheck = ref<AuditRun | null>(null)\nconst rechecking = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nconst POLL_MS = 2000\n\n/* The page in its own words: the run it was crawled in, then one more, of just this address. */\nasync function startRecheck(): Promise<void> {\n if (!card.value) return\n\n rechecking.value = true\n recheck.value = null\n\n try {\n follow(await api.start('urls', [card.value.page.url]))\n } catch (error) {\n rechecking.value = false\n toast.danger(message(error))\n }\n}\n\nfunction follow(run: AuditRun): void {\n clearTimeout(timer)\n\n if (run.status === 'queued' || run.status === 'running') {\n timer = setTimeout(async () => {\n try {\n follow(await api.run(run.id))\n } catch (error) {\n rechecking.value = false\n toast.danger(message(error))\n }\n }, POLL_MS)\n\n return\n }\n\n rechecking.value = false\n recheck.value = run\n}\n\nfunction compareRecheck(): void {\n if (recheck.value && props.base) {\n void router.push({ path: `${props.base}/runs`, query: { to: String(recheck.value.id) } })\n }\n}\n\nonBeforeUnmount(() => clearTimeout(timer))\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst card = ref<AuditPageCard | null>(null)\nconst failure = ref<string | null>(null)\nconst tab = ref<TabValue>('overview')\nconst links = ref<AuditPage<AuditLinkRow> | null>(null)\nconst linksLoading = ref(false)\nconst resources = ref<AuditPage<AuditResourceRow> | null>(null)\nconst resourcesLoading = ref(false)\n\nconst resourceTabs: AuditResourceTab[] = ['images', 'css', 'js']\n\nconst open = computed({\n get: () => props.pageId !== null,\n set: (value) => {\n if (!value) emit('close')\n },\n})\n\nconst tabs = computed<TabItem[]>(() => [\n { value: 'overview', label: t('page.card-overview') },\n { value: 'issues', label: t('page.card-issues'), badge: card.value?.counts.issues || undefined },\n { value: 'in', label: t('page.card-incoming'), badge: card.value?.counts.incoming || undefined },\n { value: 'out', label: t('page.card-outgoing'), badge: card.value?.counts.outgoing || undefined },\n { value: 'images', label: t('page.card-images'), badge: card.value?.counts.images || undefined },\n { value: 'css', label: t('page.card-css'), badge: card.value?.counts.css || undefined },\n { value: 'js', label: t('page.card-js'), badge: card.value?.counts.js || undefined },\n {\n value: 'microdata',\n label: t('page.card-microdata'),\n badge: card.value?.counts.microdata || undefined,\n },\n])\n\nconst resourceTab = computed<AuditResourceTab | null>(() =>\n resourceTabs.includes(tab.value as AuditResourceTab) ? (tab.value as AuditResourceTab) : null,\n)\n\nconst severities: Record<AuditSeverity, BadgeType> = {\n error: 'danger',\n warning: 'warning',\n notice: 'info',\n}\n\nconst hostTypes: Record<string, BadgeType> = {\n own: 'success',\n own_mirror: 'warning',\n dev: 'danger',\n external: 'info',\n}\n\nconst linkColumns = computed<TableColumn<AuditLinkRow>[]>(() => [\n { key: 'url', label: t('page.address'), minWidth: 220 },\n { key: 'status', label: t('page.field-status'), width: 80 },\n { key: 'kind', label: t('page.kind'), width: 90 },\n { key: 'anchor', label: t('page.anchor'), minWidth: 140 },\n { key: 'host_class', label: t('page.host'), width: 120 },\n])\n\n/** Pictures show their alt; stylesheets and scripts how they are cached and compressed. */\nconst resourceColumns = computed<TableColumn<AuditResourceRow>[]>(() => [\n { key: 'url', label: t('page.address'), minWidth: 220 },\n { key: 'status', label: t('page.field-status'), width: 80 },\n { key: 'bytes', label: t('page.size'), width: 110 },\n ...(resourceTab.value === 'images'\n ? [{ key: 'alt', label: t('page.alt'), minWidth: 120 }]\n : [\n { key: 'cache_control', label: t('page.cache'), minWidth: 120 },\n { key: 'compression', label: t('page.field-compression'), width: 100 },\n ]),\n])\n\n/*\n * The block indented, the way a person reads JSON. One the server cut at its length limit does not\n * parse, and is shown as the page printed it rather than not at all.\n */\nfunction pretty(source: string): string {\n try {\n return JSON.stringify(JSON.parse(source), null, 2)\n } catch {\n return source\n }\n}\n\nfunction size(row: AuditResourceRow): string {\n if (row.bytes === null) return ''\n\n const kb = row.bytes / 1024\n const text = kb >= 1024 ? `${(kb / 1024).toFixed(1)} MB` : `${Math.round(kb)} KB`\n\n return row.width && row.height ? `${text} · ${row.width}×${row.height}` : text\n}\n\n/** The answer, the markup and where the page came from — label and value, in reading order. */\n/*\n * A fact is a line, or a list: hreflang and Open Graph are key and value per row, the key set apart\n * as a tag so the eye does not run it into the address after it; JSON-LD is the types as tags.\n */\ntype Fact = string | { pairs: [string, string][] } | { tags: string[]; error?: string | null }\n\nconst facts = computed<[string, Fact][]>(() => {\n const page = card.value?.page\n\n if (!page) return []\n\n const rows: [string, unknown][] = [\n [t('page.field-status'), page.status ?? t('page.status-none')],\n [t('page.field-final_status'), page.redirect_to ? page.final_status : null],\n [t('page.field-redirect_to'), page.redirect_to],\n [t('page.error'), page.error],\n [t('page.field-content_type'), page.content_type],\n [t('page.field-bytes'), page.bytes],\n [t('page.field-ttfb_ms'), page.ttfb_ms],\n [t('page.field-total_ms'), page.total_ms],\n [t('page.field-compression'), page.compression],\n [t('page.field-source'), t(`page.source-${page.source}`)],\n [t('page.field-depth'), page.depth],\n [t('page.field-indexable'), page.indexable ? t('page.yes') : t('page.no')],\n [t('page.field-blocked_by_robots'), page.blocked_by_robots ? t('page.yes') : null],\n [t('page.field-title'), page.title],\n [t('page.field-description'), page.description],\n [t('page.field-h1'), page.h1.join(' · ') || null],\n [t('page.field-canonical'), page.canonical],\n [t('page.field-robots_meta'), page.robots_meta],\n [t('page.field-x_robots_tag'), page.x_robots_tag],\n [t('page.field-lang'), page.lang],\n [\n 'hreflang',\n page.hreflang.length\n ? { pairs: page.hreflang.map((alternate) => [alternate.lang, alternate.url]) }\n : null,\n ],\n [\n 'Open Graph',\n Object.keys(page.og).length\n ? { pairs: Object.entries(page.og).map(([key, value]) => [`og:${key}`, String(value)]) }\n : null,\n ],\n [\n 'Twitter',\n Object.keys(page.twitter).length\n ? {\n pairs: Object.entries(page.twitter).map(([key, value]) => [\n `twitter:${key}`,\n String(value),\n ]),\n }\n : null,\n ],\n [\n 'JSON-LD',\n page.json_ld.length\n ? {\n tags: page.json_ld.flatMap((block) => block.types),\n error: page.json_ld.find((block) => block.error)?.error ?? null,\n }\n : null,\n ],\n [t('page.field-word_count'), page.word_count],\n [t('page.field-links_in'), page.links_in],\n [t('page.field-links_out_internal'), page.links_out_internal],\n [t('page.field-links_out_external'), page.links_out_external],\n [t('page.field-images'), page.images],\n [t('page.field-images_without_alt'), page.images_without_alt || null],\n ]\n\n return rows\n .filter(([, value]) => value !== null && value !== undefined && value !== '')\n .map(([label, value]) => [label, typeof value === 'object' ? (value as Fact) : String(value)])\n})\n\nfunction statusType(value: number | null): BadgeType {\n if (value === null) return 'danger'\n if (value >= 500) return 'danger'\n if (value >= 400) return 'warning'\n if (value >= 300) return 'info'\n\n return 'success'\n}\n\nasync function load(id: number): Promise<void> {\n clearTimeout(timer)\n rechecking.value = false\n recheck.value = null\n card.value = null\n failure.value = null\n links.value = null\n resources.value = null\n tab.value = 'overview'\n\n try {\n card.value = await api.page(props.run, id)\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nasync function loadLinks(state: TableState): Promise<void> {\n if (props.pageId === null || (tab.value !== 'in' && tab.value !== 'out')) return\n\n linksLoading.value = true\n\n try {\n links.value = await api.links(props.run, props.pageId, {\n direction: tab.value,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n failure.value = message(error)\n } finally {\n linksLoading.value = false\n }\n}\n\nasync function loadResources(state: TableState): Promise<void> {\n const current = resourceTab.value\n\n if (props.pageId === null || current === null) return\n\n resourcesLoading.value = true\n\n try {\n resources.value = await api.resources(props.run, props.pageId, {\n tab: current,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n failure.value = message(error)\n } finally {\n resourcesLoading.value = false\n }\n}\n\nwatch(\n () => props.pageId,\n (id) => {\n if (id !== null) void load(id)\n },\n { immediate: true },\n)\n\nwatch(tab, () => {\n links.value = null\n resources.value = null\n})\n</script>\n\n<template>\n <wx-drawer\n v-model:open=\"open\"\n size=\"min(1100px, 75vw)\"\n :min-size=\"480\"\n resizable\n persist=\"webx-audit.page-card-wide\"\n >\n <template #title>\n <span class=\"wx-audit-card__title\">\n <wx-badge v-if=\"card\" :type=\"statusType(card.page.status)\" size=\"sm\">{{\n card.page.status ?? '—'\n }}</wx-badge>\n <span class=\"wx-audit-card__url\">{{ card?.page.url ?? '' }}</span>\n </span>\n </template>\n\n <template #extra>\n <span v-if=\"card\" class=\"wx-audit-card__extra\">\n <wx-button\n v-if=\"canRun\"\n size=\"sm\"\n icon=\"refresh\"\n :loading=\"rechecking\"\n @click=\"startRecheck\"\n >{{ t('page.recheck') }}</wx-button\n >\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"download\"\n :href=\"api.pageFile(props.run, card.page.id)\"\n >{{ t('page.export-page') }}</wx-button\n >\n <wx-link :href=\"card.page.url\" target=\"_blank\">{{ t('page.open-page') }}</wx-link>\n </span>\n </template>\n\n <wx-text v-if=\"failure\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!card\" :rows=\"6\" />\n\n <div v-else class=\"wx-audit-card\">\n <wx-alert v-if=\"rechecking\" type=\"info\" :description=\"t('page.recheck-running')\" />\n <wx-alert\n v-else-if=\"recheck && recheck.status === 'done' && recheck.counts\"\n :type=\"recheck.counts.new > 0 ? 'warning' : 'success'\"\n >\n <div class=\"wx-audit-card__recheck\">\n <span>{{ t('page.recheck-fixed', { count: recheck.counts.fixed }) }}</span>\n <span>{{ t('page.recheck-new', { count: recheck.counts.new }) }}</span>\n <wx-button v-if=\"props.base\" size=\"sm\" variant=\"text\" @click=\"compareRecheck\">{{\n t('page.recheck-compare')\n }}</wx-button>\n </div>\n </wx-alert>\n <wx-alert\n v-else-if=\"recheck\"\n type=\"danger\"\n :description=\"recheck.error ?? t(`page.status-${recheck.status}`)\"\n />\n <wx-text v-if=\"card.page.title\" weight=\"semibold\">{{ card.page.title }}</wx-text>\n\n <wx-tabs v-model=\"tab\" :items=\"tabs\">\n <dl v-if=\"tab === 'overview'\" class=\"wx-audit-card__facts\">\n <template v-for=\"[label, value] in facts\" :key=\"label\">\n <dt>{{ label }}</dt>\n <dd v-if=\"typeof value === 'string'\">{{ value }}</dd>\n <dd v-else-if=\"'pairs' in value\" class=\"wx-audit-card__pairs\">\n <template v-for=\"([key, text], index) in value.pairs\" :key=\"index\">\n <wx-badge size=\"sm\" class=\"wx-audit-card__key\">{{ key }}</wx-badge>\n <span>{{ text }}</span>\n </template>\n </dd>\n <dd v-else class=\"wx-audit-card__tags\">\n <wx-badge v-for=\"(tag, index) in value.tags\" :key=\"index\" type=\"info\" size=\"sm\">{{\n tag\n }}</wx-badge>\n <wx-text v-if=\"value.error\" size=\"sm\" tone=\"danger\">{{ value.error }}</wx-text>\n </dd>\n </template>\n <template v-if=\"Object.keys(card.page.headers).length\">\n <dt class=\"wx-audit-card__section\">{{ t('page.headers') }}</dt>\n <dd />\n <template v-for=\"(value, name) in card.page.headers\" :key=\"name\">\n <dt class=\"wx-audit-card__code\">{{ name }}</dt>\n <dd class=\"wx-audit-card__code\">{{ value }}</dd>\n </template>\n </template>\n </dl>\n\n <div v-else-if=\"tab === 'issues'\" class=\"wx-audit-card__issues\">\n <wx-text v-if=\"!card.issues.length\" tone=\"muted\">{{ t('page.no-issues') }}</wx-text>\n <div v-for=\"issue in card.issues\" :key=\"issue.id\" class=\"wx-audit-card__issue\">\n <div class=\"wx-audit-card__issue-head\">\n <wx-badge :type=\"severities[issue.severity]\" dot>{{\n t(`page.severity-${issue.severity}`)\n }}</wx-badge>\n <wx-text size=\"sm\" weight=\"semibold\">{{\n props.titles[issue.check] ?? issue.check\n }}</wx-text>\n <wx-badge v-if=\"issue.state === 'new'\" type=\"primary\" size=\"sm\">{{\n t('page.state-new')\n }}</wx-badge>\n </div>\n <audit-details :details=\"issue.details\" />\n </div>\n </div>\n\n <wx-table\n v-else-if=\"resourceTab\"\n :key=\"`resources-${String(tab)}`\"\n :data=\"resources\"\n :columns=\"resourceColumns\"\n row-key=\"id\"\n flush\n :loading=\"resourcesLoading\"\n :per-page-options=\"[]\"\n :empty-text=\"t('page.no-resources')\"\n @state-change=\"loadResources\"\n >\n <template #cell-url=\"{ row }\">\n <span v-if=\"resourceTab === 'images'\" class=\"wx-audit-card__picture\">\n <wx-image\n :src=\"row.url\"\n :alt=\"row.alt ?? ''\"\n :width=\"48\"\n :height=\"48\"\n fit=\"cover\"\n radius=\"var(--wx-radius-sm)\"\n preview\n :preview-label=\"t('page.view-full')\"\n class=\"wx-audit-card__thumb\"\n />\n <span class=\"wx-audit-card__url\">{{ row.url }}</span>\n </span>\n <span v-else class=\"wx-audit-card__url\">{{ row.url }}</span>\n <wx-text v-if=\"row.location\" size=\"sm\" tone=\"muted\" class=\"wx-audit-card__url\">\n → {{ row.location }}</wx-text\n >\n <wx-text v-if=\"row.error\" size=\"sm\" tone=\"danger\">{{ row.error }}</wx-text>\n </template>\n <template #cell-status=\"{ row }\">\n <wx-badge v-if=\"row.status !== null\" :type=\"statusType(row.status)\" size=\"sm\">{{\n row.status\n }}</wx-badge>\n <wx-badge v-else-if=\"row.checked\" type=\"danger\" size=\"sm\">—</wx-badge>\n <wx-text v-else size=\"sm\" tone=\"muted\">{{ t('page.not-checked') }}</wx-text>\n </template>\n <template #cell-bytes=\"{ row }\">{{ size(row) }}</template>\n <template #cell-alt=\"{ row }\">\n <wx-text v-if=\"row.alt === null && row.kind === 'img'\" size=\"sm\" tone=\"danger\">{{\n t('page.missing')\n }}</wx-text>\n <template v-else>{{ row.alt ?? '' }}</template>\n </template>\n </wx-table>\n\n <div v-else-if=\"tab === 'microdata'\" class=\"wx-audit-card__issues\">\n <wx-text v-if=\"!card.page.json_ld.length\" tone=\"muted\">{{\n t('page.no-json-ld')\n }}</wx-text>\n <div\n v-for=\"(block, index) in card.page.json_ld\"\n :key=\"index\"\n class=\"wx-audit-card__issue\"\n >\n <div class=\"wx-audit-card__issue-head\">\n <wx-text size=\"sm\" weight=\"semibold\">{{\n t('page.jsonld-block', { number: index + 1 })\n }}</wx-text>\n <wx-badge v-for=\"type in block.types\" :key=\"type\" size=\"sm\">{{ type }}</wx-badge>\n </div>\n <wx-text v-if=\"block.error\" size=\"sm\" tone=\"danger\"\n >{{ t('page.jsonld-error') }} {{ block.error }}</wx-text\n >\n <template v-for=\"(item, position) in block.items ?? []\" :key=\"position\">\n <wx-text v-if=\"item.missing.length\" size=\"sm\" tone=\"danger\"\n >{{ item.type }} — {{ t('page.jsonld-required') }}\n {{ item.missing.join(', ') }}</wx-text\n >\n <wx-text v-if=\"item.recommended.length\" size=\"sm\" tone=\"muted\"\n >{{ item.type }} — {{ t('page.jsonld-recommended') }}\n {{ item.recommended.join(', ') }}</wx-text\n >\n <wx-text\n v-if=\"!item.missing.length && !item.recommended.length\"\n size=\"sm\"\n tone=\"success\"\n >{{ item.type }} — {{ t('page.jsonld-complete') }}</wx-text\n >\n </template>\n <pre v-if=\"block.source\" class=\"wx-audit-card__source\">{{ pretty(block.source) }}</pre>\n </div>\n </div>\n\n <wx-table\n v-else\n :key=\"String(tab)\"\n :data=\"links\"\n :columns=\"linkColumns\"\n row-key=\"id\"\n flush\n :loading=\"linksLoading\"\n :per-page-options=\"[]\"\n :empty-text=\"t('page.no-links')\"\n @state-change=\"loadLinks\"\n >\n <template #cell-url=\"{ row }\">\n <span class=\"wx-audit-card__url\">{{ row.url ?? '—' }}</span>\n </template>\n <template #cell-status=\"{ row }\">\n <wx-badge v-if=\"row.status !== null\" :type=\"statusType(row.status)\" size=\"sm\">{{\n row.status\n }}</wx-badge>\n </template>\n <template #cell-host_class=\"{ row }\">\n <wx-badge v-if=\"row.host_class\" :type=\"hostTypes[row.host_class] ?? 'info'\" size=\"sm\">{{\n t(`page.host-${row.host_class}`)\n }}</wx-badge>\n </template>\n </wx-table>\n </wx-tabs>\n </div>\n </wx-drawer>\n</template>\n\n<style scoped>\n.wx-audit-card {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-card__title {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-card__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-card__facts {\n display: grid;\n grid-template-columns: minmax(120px, max-content) minmax(0, 1fr);\n gap: var(--wx-space-6) var(--wx-space-16);\n margin: var(--wx-space-12) 0 0;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-card__facts dt {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-card__facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n white-space: pre-line;\n}\n\n/* Key and value in two columns of their own, the key against its value, a row apart from the next pair. */\n.wx-audit-card__pairs {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n gap: var(--wx-space-6) var(--wx-space-8);\n align-items: baseline;\n}\n\n.wx-audit-card__key {\n justify-self: end;\n font-family: var(--wx-font-family-mono);\n}\n\n.wx-audit-card__tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-card__section {\n margin-top: var(--wx-space-12);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-audit-card__code {\n font-family: var(--wx-font-family-mono);\n}\n\n.wx-audit-card__issues {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n margin-top: var(--wx-space-12);\n}\n\n.wx-audit-card__issue {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n/* A picture is recognised by sight faster than by its hashed file name. */\n.wx-audit-card__picture {\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-card__thumb {\n flex: none;\n}\n\n.wx-audit-card__source {\n max-height: 480px;\n margin: 0;\n padding: var(--wx-space-8);\n overflow: auto;\n border-radius: var(--wx-radius-sm);\n background: var(--wx-bg-muted);\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-xs);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-card__issue-head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-card__extra {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-card__recheck {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-12);\n}\n</style>\n","import type { AuditFieldType, AuditFilterOp, AuditPageField } from './types'\n\n/**\n * The fields of the snapshot, as `PageColumns` lists them on the server: what the pages screen\n * can show, filter on, sort by and export. Kept in the same order, so the column picker reads\n * like the page's card — address and answer first, markup, then speed and links.\n */\nexport const PAGE_FIELDS: Record<AuditPageField, AuditFieldType> = {\n url: 'url',\n status: 'status',\n final_status: 'status',\n redirect_to: 'url',\n source: 'source',\n depth: 'number',\n indexable: 'bool',\n issues: 'number',\n title: 'text',\n description: 'text',\n h1: 'text',\n canonical: 'url',\n robots_meta: 'text',\n x_robots_tag: 'text',\n lang: 'text',\n content_type: 'text',\n bytes: 'number',\n ttfb_ms: 'number',\n total_ms: 'number',\n compression: 'text',\n word_count: 'number',\n links_in: 'number',\n links_out_internal: 'number',\n links_out_external: 'number',\n images: 'number',\n images_without_alt: 'number',\n in_sitemap: 'bool',\n in_registry: 'bool',\n blocked_by_robots: 'bool',\n}\n\nexport const DEFAULT_COLUMNS: AuditPageField[] = [\n 'url',\n 'status',\n 'indexable',\n 'title',\n 'word_count',\n 'links_in',\n 'issues',\n]\n\n/** `h1` is read out of a JSON list: shown and exported, not filtered or sorted on. */\nexport const COMPUTED_FIELDS: AuditPageField[] = ['h1']\n\n/** What can be asked of a field of each type. */\nexport const OPERATIONS: Record<AuditFieldType, AuditFilterOp[]> = {\n url: ['contains', 'eq', 'empty', 'filled'],\n text: ['contains', 'eq', 'empty', 'filled'],\n number: ['gt', 'lt', 'eq', 'empty'],\n status: ['eq', 'gt', 'lt', 'empty'],\n bool: ['yes', 'no'],\n source: ['eq'],\n}\n\n/** The operations that need a value typed beside them. */\nexport const WITH_VALUE: AuditFilterOp[] = ['contains', 'eq', 'gt', 'lt']\n\nexport const SOURCES = ['home', 'sitemap', 'registry', 'link'] as const\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useDates, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxCheckboxGroup,\n WxInput,\n WxPopover,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type SelectValue,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport AuditPageCard from './AuditPageCard.vue'\nimport { createAuditApi } from './api'\nimport {\n COMPUTED_FIELDS,\n DEFAULT_COLUMNS,\n OPERATIONS,\n PAGE_FIELDS,\n SOURCES,\n WITH_VALUE,\n} from './fields'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditFieldFilter,\n AuditFilterOp,\n AuditPage,\n AuditPageField,\n AuditPageQuery,\n AuditPageRow,\n AuditRun,\n} from './types'\n\n/**\n * Every address the last full run crawled (§8, «Pages»): any field of the snapshot as a column,\n * a filter on any of them, the list as CSV, and a row that opens the page's card.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\nconst dates = useDates()\n\nconst STORAGE = 'webx-audit.pages.columns'\n\nconst run = ref<AuditRun | null>(null)\nconst ready = ref(false)\nconst page = ref<AuditPage<AuditPageRow> | null>(null)\nconst loading = ref(false)\nconst opened = ref<number | null>(null)\nconst titles = ref<Record<string, string>>({})\n\nconst status = ref<string | null>(null)\nconst indexable = ref<string | null>(null)\nconst check = ref<string | null>(null)\nconst filters = ref<AuditFieldFilter[]>([])\nlet last: TableState = { page: 1, perPage: 50, sort: null, search: '' }\n\nconst visible = ref<AuditPageField[]>(restore())\n\nfunction restore(): AuditPageField[] {\n try {\n const saved: unknown = JSON.parse(window.localStorage.getItem(STORAGE) ?? 'null')\n\n if (Array.isArray(saved)) {\n const known = saved.filter((key): key is AuditPageField => key in PAGE_FIELDS)\n\n if (known.length) return known\n }\n } catch {\n // A private window or a broken value: the default columns, as for anyone else.\n }\n\n return [...DEFAULT_COLUMNS]\n}\n\nwatch(visible, (keys) => {\n try {\n window.localStorage.setItem(STORAGE, JSON.stringify(keys))\n } catch {\n // Not remembered — still shown.\n }\n})\n\nconst fields = Object.keys(PAGE_FIELDS) as AuditPageField[]\n\nconst columnOptions = computed(() =>\n fields.map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst filterFields = computed(() =>\n fields\n .filter((key) => !COMPUTED_FIELDS.includes(key))\n .map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst columns = computed<TableColumn<AuditPageRow>[]>(() =>\n /* The picker keeps the order things were ticked in; the table keeps the card's order. */\n fields\n .filter((key) => visible.value.includes(key))\n .map((key) => ({\n key,\n label: t(`page.field-${key}`),\n sortable: !COMPUTED_FIELDS.includes(key),\n minWidth: PAGE_FIELDS[key] === 'url' || PAGE_FIELDS[key] === 'text' ? 220 : undefined,\n align: PAGE_FIELDS[key] === 'number' ? 'right' : undefined,\n })),\n)\n\nconst statusOptions = computed(() => [\n ...['2xx', '3xx', '4xx', '5xx'].map((value) => ({ value, label: value })),\n { value: 'none', label: t('page.status-none') },\n])\n\nconst indexableOptions = computed(() => [\n { value: '1', label: t('page.indexable-yes') },\n { value: '0', label: t('page.indexable-no') },\n])\n\nconst checkOptions = computed(() =>\n Object.entries(titles.value).map(([value, label]) => ({ value, label })),\n)\n\nconst filtersCount = computed(\n () =>\n [status.value, indexable.value, check.value].filter(Boolean).length +\n filters.value.filter(complete).length,\n)\n\nconst query = computed<AuditPageQuery>(() => ({\n status: status.value,\n indexable: indexable.value === null ? null : indexable.value === '1',\n check: check.value,\n filters: filters.value.filter(complete),\n}))\n\nfunction complete(filter: AuditFieldFilter): boolean {\n return !WITH_VALUE.includes(filter.op) || (filter.value ?? '').trim() !== ''\n}\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\nfunction operations(field: AuditPageField) {\n return OPERATIONS[PAGE_FIELDS[field]].map((op) => ({ value: op, label: t(`page.op-${op}`) }))\n}\n\nfunction addFilter(): void {\n filters.value = [...filters.value, { field: 'title', op: 'empty' }]\n}\n\nfunction setField(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const field = pick(value) as AuditPageField | null\n\n if (!field) return\n\n filters.value = filters.value.map((filter, at) =>\n at === index ? { field, op: OPERATIONS[PAGE_FIELDS[field]][0]!, value: '' } : filter,\n )\n}\n\nfunction setOp(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const op = pick(value) as AuditFilterOp | null\n\n if (op)\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, op } : filter))\n}\n\nfunction setValue(index: number, value: string): void {\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, value } : filter))\n}\n\nfunction removeFilter(index: number): void {\n filters.value = filters.value.filter((_, at) => at !== index)\n}\n\nfunction setColumns(keys: unknown[]): void {\n const next = keys.filter((key): key is AuditPageField => String(key) in PAGE_FIELDS)\n\n /* A table without columns is a blank card; the address stays at least. */\n visible.value = next.length ? next : ['url']\n}\n\nconst types: Record<string, BadgeType> = {\n '2': 'success',\n '3': 'info',\n '4': 'warning',\n '5': 'danger',\n}\n\nfunction statusType(value: unknown): BadgeType {\n return types[String(value ?? '').charAt(0)] ?? 'danger'\n}\n\nfunction text(value: unknown): string {\n return value === null || value === undefined || value === '' ? '—' : String(value)\n}\n\nasync function load(state: TableState = last): Promise<void> {\n last = state\n\n if (run.value === null) return\n\n loading.value = true\n\n try {\n page.value = await api.pages(run.value.id, {\n ...query.value,\n search: state.search,\n sort: state.sort ? `${state.sort.order === 'desc' ? '-' : ''}${state.sort.key}` : null,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nfunction download(): void {\n if (run.value === null) return\n\n window.location.assign(\n api.pagesFile(\n run.value.id,\n { ...query.value, search: last.search },\n columns.value.map((column) => column.key),\n ),\n )\n}\n\nwatch(query, () => void load({ ...last, page: 1 }), { deep: true })\n\nonMounted(async () => {\n try {\n run.value = (await api.latest()).crawled\n\n if (run.value !== null) {\n const checks = await api.checks(run.value.id)\n titles.value = Object.fromEntries(checks.map((row) => [row.id, row.title]))\n }\n } catch (error) {\n toast.danger(message(error))\n } finally {\n ready.value = true\n }\n\n void load()\n})\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"pages\">\n <wx-text v-if=\"ready && run === null\" tone=\"muted\" class=\"wx-audit-pages__none\">{{\n t('page.pages-none')\n }}</wx-text>\n\n <wx-table\n v-else\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loading || !ready\"\n :per-page-options=\"[50, 100, 200]\"\n :search-placeholder=\"t('page.search-url')\"\n :filters-count=\"filtersCount\"\n :filters-label=\"panel('filters.title')\"\n :filters-width=\"420\"\n :empty-text=\"t('page.empty')\"\n @state-change=\"load\"\n @row-click=\"(row) => (opened = row.id)\"\n >\n <template #title>\n <wx-text v-if=\"run\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-run', { date: dates.short(run.finished_at) })\n }}</wx-text>\n </template>\n\n <template #actions>\n <wx-popover :title=\"t('page.columns')\" width=\"300\">\n <template #trigger>\n <wx-button size=\"sm\" variant=\"text\" icon=\"sliders\">{{ t('page.columns') }}</wx-button>\n </template>\n <wx-checkbox-group\n :model-value=\"visible\"\n :options=\"columnOptions\"\n size=\"sm\"\n class=\"wx-audit-pages__picker\"\n @update:model-value=\"setColumns\"\n />\n </wx-popover>\n <wx-button size=\"sm\" variant=\"text\" icon=\"download\" :disabled=\"!run\" @click=\"download\">{{\n t('page.export')\n }}</wx-button>\n </template>\n\n <template #filters>\n <div class=\"wx-audit-pages__filters\">\n <wx-select\n :model-value=\"status\"\n :options=\"statusOptions\"\n :placeholder=\"t('page.any-status')\"\n clearable\n @update:model-value=\"status = pick($event)\"\n />\n <wx-select\n :model-value=\"indexable\"\n :options=\"indexableOptions\"\n :placeholder=\"t('page.any-indexable')\"\n clearable\n @update:model-value=\"indexable = pick($event)\"\n />\n <wx-select\n :model-value=\"check\"\n :options=\"checkOptions\"\n :placeholder=\"t('page.any-check')\"\n clearable\n filterable\n @update:model-value=\"check = pick($event)\"\n />\n\n <div v-for=\"(filter, index) in filters\" :key=\"index\" class=\"wx-audit-pages__filter\">\n <wx-select\n :model-value=\"filter.field\"\n :options=\"filterFields\"\n filterable\n size=\"sm\"\n @update:model-value=\"setField(index, $event)\"\n />\n <wx-select\n :model-value=\"filter.op\"\n :options=\"operations(filter.field)\"\n size=\"sm\"\n @update:model-value=\"setOp(index, $event)\"\n />\n <wx-select\n v-if=\"WITH_VALUE.includes(filter.op) && PAGE_FIELDS[filter.field] === 'source'\"\n :model-value=\"filter.value ?? null\"\n :options=\"SOURCES.map((value) => ({ value, label: t(`page.source-${value}`) }))\"\n size=\"sm\"\n @update:model-value=\"setValue(index, pick($event) ?? '')\"\n />\n <wx-input\n v-else-if=\"WITH_VALUE.includes(filter.op)\"\n :model-value=\"filter.value ?? ''\"\n :placeholder=\"t('page.value')\"\n size=\"sm\"\n @update:model-value=\"setValue(index, String($event ?? ''))\"\n />\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"close\"\n :aria-label=\"t('page.remove-filter')\"\n @click=\"removeFilter(index)\"\n />\n </div>\n\n <wx-button size=\"sm\" variant=\"text\" icon=\"plus\" @click=\"addFilter\">{{\n t('page.add-filter')\n }}</wx-button>\n </div>\n </template>\n\n <template v-for=\"key in visible\" :key=\"key\" #[`cell-${key}`]=\"{ row }\">\n <wx-badge\n v-if=\"PAGE_FIELDS[key] === 'status' && row[key] !== null\"\n :type=\"statusType(row[key])\"\n size=\"sm\"\n >{{ row[key] }}</wx-badge\n >\n <wx-text v-else-if=\"PAGE_FIELDS[key] === 'status'\" size=\"sm\" tone=\"danger\">{{\n t('page.status-none')\n }}</wx-text>\n <template v-else-if=\"PAGE_FIELDS[key] === 'bool'\">{{\n row[key] ? t('page.yes') : t('page.no')\n }}</template>\n <template v-else-if=\"PAGE_FIELDS[key] === 'source'\">{{\n t(`page.source-${row[key]}`)\n }}</template>\n <wx-badge v-else-if=\"key === 'issues' && row.issues > 0\" type=\"warning\" size=\"sm\">{{\n row.issues\n }}</wx-badge>\n <span v-else :class=\"{ 'wx-audit-pages__long': PAGE_FIELDS[key] === 'url' }\">{{\n text(row[key])\n }}</span>\n </template>\n </wx-table>\n\n <audit-page-card\n v-if=\"run\"\n :run=\"run.id\"\n :base=\"props.base\"\n :page-id=\"opened\"\n :titles=\"titles\"\n @close=\"opened = null\"\n />\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-pages__none {\n display: block;\n padding: var(--wx-space-24);\n}\n\n.wx-audit-pages__filters {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-pages__filter {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr) auto;\n gap: var(--wx-space-4);\n align-items: center;\n}\n\n.wx-audit-pages__picker {\n max-height: 360px;\n overflow-y: auto;\n}\n\n.wx-audit-pages__long {\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxButton, WxLink, WxSegmented, WxSkeleton, WxText } from '@webx-ui/core'\nimport AuditDetails from './AuditDetails.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditComparisonKind, AuditComparisonRow, AuditIssue } from './types'\n\n/**\n * One check of a comparison opened: its new, fixed or persisting findings, fifty at a time —\n * fixed ones as the earlier run stored them, the others from the later run.\n */\nconst props = defineProps<{ from: number; to: number; row: AuditComparisonRow }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst KINDS: AuditComparisonKind[] = ['new', 'fixed', 'persisting']\n\n/* Open on what changed: new first, then fixed — persisting only when nothing else is there. */\nconst kind = ref<AuditComparisonKind>(KINDS.find((one) => props.row[one] > 0) ?? 'new')\nconst issues = ref<AuditIssue[] | null>(null)\nconst page = ref(1)\nconst more = ref(false)\nconst failure = ref<string | null>(null)\n\nconst options = computed(() =>\n KINDS.map((value) => ({\n value,\n label: `${t(`page.kind-${value}`)} · ${props.row[value]}`,\n disabled: props.row[value] === 0,\n })),\n)\n\nasync function load(next = 1): Promise<void> {\n failure.value = null\n\n try {\n const answer = await api.compareIssues({\n from: props.from,\n to: props.to,\n kind: kind.value,\n check: props.row.check,\n page: next,\n per_page: 50,\n })\n\n issues.value = next === 1 ? answer.data : [...(issues.value ?? []), ...answer.data]\n page.value = answer.current_page\n more.value = answer.current_page < answer.last_page\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nwatch(\n kind,\n () => {\n issues.value = null\n void load()\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <div class=\"wx-audit-compare\">\n <wx-segmented v-model=\"kind\" :options=\"options\" size=\"sm\" :aria-label=\"t('page.compare')\" />\n\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!issues\" :rows=\"2\" />\n\n <template v-else>\n <div v-for=\"issue in issues\" :key=\"issue.id\" class=\"wx-audit-compare__item\">\n <wx-link v-if=\"issue.url\" :href=\"issue.url\" target=\"_blank\" class=\"wx-audit-compare__url\">{{\n issue.url\n }}</wx-link>\n <audit-details :details=\"issue.details\" />\n </div>\n\n <wx-button v-if=\"more\" size=\"sm\" variant=\"text\" @click=\"load(page + 1)\">…</wx-button>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-compare {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-compare__item {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-audit-compare__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxCard,\n WxTable,\n WxText,\n type BadgeType,\n type RowKey,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditCompareIssues from './AuditCompareIssues.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditComparison,\n AuditComparisonRow,\n AuditPage,\n AuditRun,\n AuditRunStatus,\n AuditSeverity,\n} from './types'\n\n/**\n * The history (§8 «Runs»): every run kept, newest first, with its health and counts. Ticking a\n * run compares it with the one it was analysed against; ticking two compares those two — by\n * fingerprint (decision 8): what is new in the later one, what both have, what is gone. `?to=`\n * opens on one run already ticked — the way the page card's recheck leads here.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nconst route = useRoute()\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst runs = ref<AuditPage<AuditRun> | null>(null)\nconst loading = ref(false)\nconst selected = ref<RowKey[]>([])\nconst comparison = ref<AuditComparison | null>(null)\nconst comparing = ref(false)\nconst expanded = ref<RowKey[]>([])\n\nconst statuses: Record<AuditRunStatus, BadgeType> = {\n queued: 'info',\n running: 'primary',\n done: 'success',\n failed: 'danger',\n cancelled: 'warning',\n}\n\nconst severities: Record<AuditSeverity, BadgeType> = {\n error: 'danger',\n warning: 'warning',\n notice: 'info',\n}\n\nconst columns = computed<TableColumn<AuditRun>[]>(() => [\n { key: 'id', label: t('page.run-id'), width: 90 },\n { key: 'created_at', label: t('page.started-at'), minWidth: 160 },\n { key: 'scope', label: t('page.scope'), width: 120 },\n { key: 'status', label: t('page.status'), width: 130 },\n { key: 'health', label: t('page.health'), width: 100, align: 'right' },\n { key: 'severity', label: t('page.severity'), minWidth: 170, hideBelow: 640 },\n { key: 'started_by', label: t('page.started-by'), minWidth: 130, hideBelow: 760 },\n])\n\nconst compareColumns = computed<TableColumn<AuditComparisonRow>[]>(() => [\n { key: 'severity', label: t('page.severity'), width: 130 },\n { key: 'title', label: t('page.check') },\n { key: 'new', label: t('page.kind-new'), width: 90, align: 'right' },\n { key: 'fixed', label: t('page.kind-fixed'), width: 100, align: 'right' },\n { key: 'persisting', label: t('page.kind-persisting'), width: 120, align: 'right' },\n])\n\n/* What the selection means: one run against its own previous, or two against each other. */\nconst pair = computed<{ to: number; from: number | null } | null>(() => {\n const ids = selected.value.map(Number).sort((a, b) => a - b)\n\n if (ids.length === 0) return null\n\n return ids.length === 1\n ? { to: ids[0]!, from: null }\n : { to: ids[ids.length - 1]!, from: ids[0]! }\n})\n\nconst scopesDiffer = computed(\n () => comparison.value !== null && comparison.value.from.scope !== comparison.value.to.scope,\n)\n\nfunction who(run: AuditRun): string {\n if (run.started_by === 'schedule') return t('page.by-schedule')\n if (run.started_by === 'mcp') return t('page.by-mcp')\n if (run.started_by === 'console') return t('page.by-console')\n\n return run.started_by ? t('page.by-person') : ''\n}\n\nasync function load(state?: TableState): Promise<void> {\n loading.value = true\n\n try {\n runs.value = await api.runs({ page: state?.page ?? 1, per_page: state?.perPage ?? 20 })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nasync function compare(): Promise<void> {\n const current = pair.value\n\n comparison.value = null\n expanded.value = []\n\n if (!current) return\n\n comparing.value = true\n\n try {\n comparison.value = await api.compare(current.to, current.from)\n } catch (error) {\n toast.danger(message(error))\n } finally {\n comparing.value = false\n }\n}\n\nonMounted(() => {\n const to = Number(route.query.to)\n\n if (Number.isInteger(to) && to > 0) selected.value = [to]\n})\n\nwatch(selected, (keys) => {\n /* Two at most: a third tick replaces the oldest one. */\n if (keys.length > 2) selected.value = keys.slice(-2)\n else void compare()\n})\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"runs\" :card=\"false\">\n <div class=\"wx-audit-runs\">\n <wx-card>\n <wx-table\n v-model:selected=\"selected\"\n :data=\"runs\"\n :columns=\"columns\"\n row-key=\"id\"\n selectable\n :selectable-if=\"(row: AuditRun) => row.status === 'done'\"\n flush\n :loading=\"loading\"\n :empty-text=\"t('page.runs-empty')\"\n @state-change=\"load\"\n >\n <template #cell-created_at=\"{ row }\"><wx-date :value=\"row.created_at\" /></template>\n <template #cell-scope=\"{ row }\">{{ t(`page.scope-${row.scope}`) }}</template>\n <template #cell-status=\"{ row }\">\n <wx-badge :type=\"statuses[row.status]\" dot>{{\n t(`page.status-${row.status}`)\n }}</wx-badge>\n </template>\n <template #cell-health=\"{ row }\">{{\n row.counts ? `${row.counts.health}%` : ''\n }}</template>\n <template #cell-severity=\"{ row }\">\n <span v-if=\"row.counts\" class=\"wx-audit-runs__counts\">\n <template v-for=\"(type, key) in severities\" :key=\"key\">\n <wx-badge v-if=\"row.counts.severity[key]\" :type=\"type\" size=\"sm\">{{\n row.counts.severity[key]\n }}</wx-badge>\n </template>\n </span>\n </template>\n <template #cell-started_by=\"{ row }\">{{ who(row) }}</template>\n </wx-table>\n </wx-card>\n\n <wx-text v-if=\"!pair\" size=\"sm\" tone=\"muted\">{{ t('page.compare-help') }}</wx-text>\n\n <wx-card v-else :title=\"t('page.compare')\">\n <wx-text v-if=\"comparison\" size=\"sm\" tone=\"muted\" class=\"wx-audit-runs__pair\">\n {{ t('page.compare-from') }} #{{ comparison.from.id }} ·\n <wx-date :value=\"comparison.from.created_at\" /> → {{ t('page.compare-to') }} #{{\n comparison.to.id\n }}\n · <wx-date :value=\"comparison.to.created_at\" />\n </wx-text>\n\n <wx-alert\n v-if=\"scopesDiffer\"\n type=\"info\"\n :description=\"t('page.compare-scopes')\"\n class=\"wx-audit-runs__note\"\n />\n\n <wx-table\n v-model:expanded=\"expanded\"\n :data=\"comparison?.checks ?? []\"\n :columns=\"compareColumns\"\n row-key=\"check\"\n expandable\n flush\n :pagination=\"false\"\n :loading=\"comparing\"\n :empty-text=\"t('page.compare-none')\"\n >\n <template #cell-severity=\"{ row }\">\n <wx-badge :type=\"severities[row.severity]\" dot>{{\n t(`page.severity-${row.severity}`)\n }}</wx-badge>\n </template>\n <template #cell-new=\"{ row }\">\n <wx-text :tone=\"row.new ? 'danger' : 'muted'\" size=\"sm\">{{ row.new }}</wx-text>\n </template>\n <template #cell-fixed=\"{ row }\">\n <wx-text :tone=\"row.fixed ? 'success' : 'muted'\" size=\"sm\">{{ row.fixed }}</wx-text>\n </template>\n <template #expanded=\"{ row }\">\n <audit-compare-issues\n v-if=\"comparison\"\n :from=\"comparison.from.id\"\n :to=\"comparison.to.id\"\n :row=\"row\"\n />\n </template>\n </wx-table>\n </wx-card>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-runs {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-runs__counts {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n}\n\n.wx-audit-runs__pair {\n display: block;\n margin-bottom: var(--wx-space-12);\n}\n\n.wx-audit-runs__note {\n margin-bottom: var(--wx-space-12);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxScreen } from '@webx-ui/module-admin'\nimport { toast, WxActionBar, WxButton, WxSkeleton } from '@webx-ui/core'\nimport type { ScreenModel } from '@webx-ui/schema'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\n\n/**\n * The section's settings (§8): where the site is and which hosts are its stands, the limits of\n * the crawl and the paths it leaves out, the thresholds, the nightly run and how much history\n * to keep. The form is the screen the server describes (`audit.settings`), so a project patches\n * a field in the way it does everywhere else; saving is this page's own.\n */\nconst props = defineProps<{ base: string }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst values = ref<ScreenModel>({})\nconst errors = ref<Record<string, string[]>>({})\nconst loading = ref(true)\nconst saving = ref(false)\n\n// A boolean, not a computed: the permissions do not change while the screen is open.\nconst canManage = context.can('audit.manage')\n\nonMounted(async () => {\n try {\n values.value = (await api.settings()) as ScreenModel\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n})\n\nasync function save(): Promise<void> {\n saving.value = true\n errors.value = {}\n\n try {\n values.value = (await api.saveSettings(values.value)) as ScreenModel\n toast.success(t('page.saved'))\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) errors.value = body.errors\n\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"settings\" :card=\"false\">\n <div class=\"wx-audit-settings\">\n <wx-skeleton v-if=\"loading\" :rows=\"6\" />\n <wx-screen\n v-else\n v-model=\"values\"\n name=\"audit.settings\"\n :errors=\"errors\"\n :disabled=\"!canManage\"\n />\n\n <wx-action-bar v-if=\"canManage && !loading\">\n <wx-button type=\"primary\" :loading=\"saving\" @click=\"save\">{{ t('page.save') }}</wx-button>\n </wx-action-bar>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wx-gap, var(--wx-space-16));\n}\n</style>\n","import type { AdminModule } from '@webx-ui/module-admin'\nimport AuditHostsPage from './AuditHostsPage.vue'\nimport AuditIssuesPage from './AuditIssuesPage.vue'\nimport AuditOverviewPage from './AuditOverviewPage.vue'\nimport AuditPagesPage from './AuditPagesPage.vue'\nimport AuditRunsPage from './AuditRunsPage.vue'\nimport AuditSettingsPage from './AuditSettingsPage.vue'\n\nexport interface AuditOptions {\n /** Where the section lives inside the panel. */\n path?: string\n /**\n * @deprecated The audit's settings are a view of the section itself (`<path>/settings`); the\n * option is read by nothing and stays only so that a panel which passed it still compiles.\n */\n settingsPath?: string\n}\n\n/**\n * «System → Audit» as a section of the panel: the overview of the last run, its findings, the\n * pages the last full run crawled, the hosts the site points at, the history of runs with two of\n * them compared, and the section's settings.\n *\n * The id matches the module the server reports, which is what makes the entry appear in the\n * navigation: the section shows up when both halves are installed.\n */\nexport function audit(options: AuditOptions = {}): AdminModule {\n const path = options.path ?? '/audit'\n const props = { base: path }\n\n return {\n id: 'audit',\n path,\n routes: [\n { path, name: 'webx.audit', component: AuditOverviewPage, props },\n { path: `${path}/issues`, name: 'webx.audit.issues', component: AuditIssuesPage, props },\n { path: `${path}/pages`, name: 'webx.audit.pages', component: AuditPagesPage, props },\n { path: `${path}/hosts`, name: 'webx.audit.hosts', component: AuditHostsPage, props },\n { path: `${path}/runs`, name: 'webx.audit.runs', component: AuditRunsPage, props },\n {\n path: `${path}/settings`,\n name: 'webx.audit.settings',\n component: AuditSettingsPage,\n props,\n },\n ],\n }\n}\n"],"names":["pageParams","query","params","filter","createAuditApi","admin","base","data","body","filters","id","scope","urls","run","columns","key","value","issue","fix","dryRun","to","from","rule","values","auditMessages","seeded","useAuditMessages","i18n","useAdmin","props","__props","api","t","useTranslate","message","useErrorText","router","useRouter","places","ref","failure","onMounted","error","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_unref","WxText","_Fragment","_hoisted_2","_createVNode","place","index","WxLink","_createTextVNode","_toDisplayString","WxBadge","_hoisted_3","field","WxButton","WxSkeleton","context","route","useRoute","title","computed","module","views","actions","where","next","path","WxListScreen","$event","_renderSlot","_ctx","panel","answer","loading","search","hostClass","expanded","classes","classOptions","pick","load","toast","watch","AuditLayout","WxTable","row","WxSelect","_cache","_withCtx","_createElementVNode","WxDate","AuditHostPlaces","statusType","code","cell","column","yesNo","text","_renderList","emit","__emit","open","_useModel","offers","applying","apply","offer","edit","url","now","WxDialog","change","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","pattern","reason","count","saving","timer","pathOf","parsed","ready","preview","hide","WxFormItem","WxInput","WxTextarea","can","issues","more","page","fixing","dialog","hiding","hideDialog","hidden","one","unhide","why","fixed","_normalizeClass","AuditDetails","AuditFixDialog","AuditHideDialog","checks","severity","group","state","filtersCount","types","severityOptions","groupOptions","stateOptions","WxPopover","AuditIssueList","POLL_MS","latest","starting","canRun","active","done","counts","scopes","severities","healthStatus","health","GROUPS","groups","bySeverity","stageLabel","start","cancel","onBeforeUnmount","WxAlert","WxCard","WxProgress","WxSegmented","WxEmpty","WxStatistic","_hoisted_8","_hoisted_9","source","_hoisted_10","recheck","rechecking","startRecheck","card","follow","compareRecheck","tab","links","linksLoading","resources","resourcesLoading","resourceTabs","tabs","resourceTab","hostTypes","linkColumns","resourceColumns","pretty","size","kb","facts","alternate","block","label","loadLinks","loadResources","current","WxDrawer","WxTabs","tag","name","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","WxImage","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","type","item","position","_hoisted_20","_hoisted_21","PAGE_FIELDS","DEFAULT_COLUMNS","COMPUTED_FIELDS","OPERATIONS","WITH_VALUE","SOURCES","STORAGE","dates","useDates","opened","titles","status","indexable","check","last","visible","restore","saved","known","keys","fields","columnOptions","filterFields","statusOptions","indexableOptions","checkOptions","complete","operations","op","addFilter","setField","at","setOp","setValue","removeFilter","_","setColumns","download","WxCheckboxGroup","AuditPageCard","KINDS","kind","options","runs","selected","comparison","comparing","statuses","compareColumns","pair","ids","a","b","scopesDiffer","who","compare","AuditCompareIssues","errors","canManage","save","WxScreen","WxActionBar","audit","AuditOverviewPage","AuditIssuesPage","AuditPagesPage","AuditHostsPage","AuditRunsPage","AuditSettingsPage"],"mappings":";;;;AA8FO,SAASA,GAAWC,GAAoE;AAC7F,QAAMC,IAAsD;AAAA,IAC1D,QAAQD,EAAM,UAAU;AAAA,IACxB,QAAQA,EAAM,UAAU;AAAA,IACxB,WACEA,EAAM,cAAc,QAAQA,EAAM,cAAc,SAC5C,SACAA,EAAM,YACJ,IACA;AAAA,IACR,OAAOA,EAAM,SAAS;AAAA,IACtB,MAAMA,EAAM,QAAQ;AAAA,IACpB,MAAMA,EAAM;AAAA,IACZ,UAAUA,EAAM;AAAA,EAAA;AAGlB,aAAWE,KAAUF,EAAM,WAAW,CAAA;AACpC,IAAAC,EAAO,KAAKC,EAAO,KAAK,GAAG,IACzBA,EAAO,UAAU,UAAaA,EAAO,UAAU,KAAKA,EAAO,KAAK,GAAGA,EAAO,EAAE,IAAIA,EAAO,KAAK;AAGhG,SAAOD;AACT;AAGO,SAASE,GAAeC,GAA+B;AAC5D,QAAMC,IAAO,GAAGD,EAAM,OAAO,UACvBE,IAAO,CAAIC,MAAyBA,EAAK,MAGzCC,IAAU,CAACR,OAA4B;AAAA,IAC3C,OAAOA,EAAM,SAAS;AAAA,IACtB,UAAUA,EAAM,YAAY;AAAA,IAC5B,OAAOA,EAAM,SAAS;AAAA,IACtB,OAAOA,EAAM,SAAS;AAAA,IACtB,MAAMA,EAAM;AAAA,IACZ,UAAUA,EAAM;AAAA,EAAA;AAGlB,SAAO;AAAA,IACL,QAAQ,MAAMI,EAAM,KAAK,IAA2B,GAAGC,CAAI,cAAc,EAAE,KAAKC,CAAI;AAAA,IAEpF,KAAK,CAACG,MAAOL,EAAM,KAAK,IAAwB,GAAGC,CAAI,SAASI,CAAE,EAAE,EAAE,KAAKH,CAAI;AAAA,IAE/E,MAAM,CAACN,IAAQ,CAAA,MACbI,EAAM,KACH,IAGE,GAAGC,CAAI,SAAS,EAAE,OAAAL,GAAO,EAC3B,KAAK,CAACO,OAAU,EAAE,GAAGA,EAAK,MAAM,MAAMA,EAAK,KAAA,EAAO;AAAA,IAEvD,OAAO,CAACG,GAAOC,MACbP,EAAM,KACH,KAAyB,GAAGC,CAAI,SAASK,MAAU,SAAS,EAAE,OAAAA,GAAO,MAAAC,EAAA,IAAS,EAAE,OAAAD,EAAA,CAAO,EACvF,KAAKJ,CAAI;AAAA,IAEd,QAAQ,CAACG,MAAOL,EAAM,KAAK,KAAyB,GAAGC,CAAI,SAASI,CAAE,WAAW,CAAA,CAAE,EAAE,KAAKH,CAAI;AAAA,IAE9F,QAAQ,CAACM,GAAKZ,IAAQ,CAAA,MACpBI,EAAM,KACH,IAA+B,GAAGC,CAAI,SAASO,CAAG,WAAW,EAAE,OAAOJ,EAAQR,CAAK,EAAA,CAAG,EACtF,KAAKM,CAAI;AAAA,IAEd,QAAQ,CAACM,GAAKZ,IAAQ,CAAA,MACpBI,EAAM,KACH,IAGE,GAAGC,CAAI,SAASO,CAAG,WAAW,EAAE,OAAOJ,EAAQR,CAAK,EAAA,CAAG,EACzD,KAAK,CAACO,OAAU,EAAE,GAAGA,EAAK,MAAM,MAAMA,EAAK,OAAO;AAAA,IAEvD,OAAO,CAACK,GAAKZ,IAAQ,CAAA,MACnBI,EAAM,KACH,IAGE,GAAGC,CAAI,SAASO,CAAG,UAAU,EAAE,OAAOb,GAAWC,CAAK,EAAA,CAAG,EAC3D,KAAK,CAACO,OAAU,EAAE,GAAGA,EAAK,MAAM,MAAMA,EAAK,OAAO;AAAA,IAEvD,WAAW,CAACK,GAAKZ,GAAOa,MAAY;AAClC,YAAMZ,IAAS,IAAI,gBAAA;AAEnB,iBAAW,CAACa,GAAKC,CAAK,KAAK,OAAO,QAAQ;AAAA,QACxC,GAAGhB,GAAWC,CAAK;AAAA,QACnB,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AACC,QAAIe,MAAU,UAAWd,EAAO,IAAIa,GAAK,OAAOC,CAAK,CAAC;AAGxD,aAAAd,EAAO,IAAI,WAAWY,EAAQ,KAAK,GAAG,CAAC,GAEhC,GAAGR,CAAI,SAASO,CAAG,iBAAiBX,EAAO,UAAU;AAAA,IAC9D;AAAA,IAEA,MAAM,CAACW,GAAKH,MACVL,EAAM,KAAK,IAA6B,GAAGC,CAAI,SAASO,CAAG,UAAUH,CAAE,EAAE,EAAE,KAAKH,CAAI;AAAA,IAEtF,OAAO,CAACM,GAAKH,GAAIT,IAAQ,CAAA,MACvBI,EAAM,KACH,IAGE,GAAGC,CAAI,SAASO,CAAG,UAAUH,CAAE,UAAU,EAAE,OAAAT,EAAA,CAAO,EACpD,KAAK,CAACO,OAAU,EAAE,GAAGA,EAAK,MAAM,MAAMA,EAAK,OAAO;AAAA,IAEvD,WAAW,CAACK,GAAKH,GAAIT,MACnBI,EAAM,KACH,IAGE,GAAGC,CAAI,SAASO,CAAG,UAAUH,CAAE,cAAc,EAAE,OAAAT,EAAA,CAAO,EACxD,KAAK,CAACO,OAAU,EAAE,GAAGA,EAAK,MAAM,MAAMA,EAAK,OAAO;AAAA,IAEvD,OAAO,CAACK,GAAKI,MACXZ,EAAM,KACH,IAA+B,GAAGC,CAAI,SAASO,CAAG,WAAWI,CAAK,QAAQ,EAC1E,KAAKV,CAAI;AAAA,IAEd,KAAK,CAACM,GAAKI,GAAOC,GAAKC,IAAS,OAC9Bd,EAAM,KACH,KAEE,GAAGC,CAAI,SAASO,CAAG,WAAWI,CAAK,UAAU,mBAAmBC,CAAG,CAAC,IAAI;AAAA,MACzE,SAASC;AAAA,IAAA,CACV,EACA,KAAKZ,CAAI;AAAA,IAEd,UAAU,CAACM,GAAKH,MAAO,GAAGJ,CAAI,SAASO,CAAG,UAAUH,CAAE;AAAA,IAEtD,SAAS,CAACU,GAAIC,MACZhB,EAAM,KACH,IAEE,GAAGC,CAAI,iBAAiB,EAAE,OAAO,EAAE,IAAAc,GAAI,MAAMC,KAAQ,SAAU,CAAG,EACpE,KAAKd,CAAI;AAAA,IAEd,eAAe,CAACN,MACdI,EAAM,KACH,IAGE,GAAGC,CAAI,wBAAwB;AAAA,MAChC,OAAO,EAAE,GAAGL,GAAO,MAAMA,EAAM,QAAQ,QAAW,OAAOA,EAAM,SAAS,OAAA;AAAA,IAAU,CACnF,EACA,KAAK,CAACO,OAAU,EAAE,GAAGA,EAAK,MAAM,MAAMA,EAAK,KAAA,EAAO;AAAA,IAEvD,OAAO,CAACP,IAAQ,CAAA,MACdI,EAAM,KACH,IAA0B,GAAGC,CAAI,UAAU;AAAA,MAC1C,OAAO;AAAA,QACL,OAAOL,EAAM,SAAS;AAAA,QACtB,QAAQA,EAAM,UAAU;AAAA,QACxB,MAAMA,EAAM,QAAQ;AAAA,MAAA;AAAA,IACtB,CACD,EACA,KAAKM,CAAI;AAAA,IAEd,SAAS,MAAMF,EAAM,KAAK,IAAiC,GAAGC,CAAI,UAAU,EAAE,KAAKC,CAAI;AAAA,IAEvF,MAAM,CAACe,MAASjB,EAAM,KAAK,KAAgC,GAAGC,CAAI,YAAYgB,CAAI,EAAE,KAAKf,CAAI;AAAA,IAE7F,aAAa,CAACe,MACZjB,EAAM,KACH,KAAmC,GAAGC,CAAI,YAAY,EAAE,GAAGgB,GAAM,SAAS,IAAM,EAChF,KAAK,CAACd,MAASA,EAAK,KAAK,MAAM;AAAA,IAEpC,QAAQ,CAACE,MAAOL,EAAM,KAAK,OAAO,GAAGC,CAAI,YAAYI,CAAE,EAAE,EAAE,KAAK,MAAA;AAAA,KAAe;AAAA,IAE/E,UAAU,MACRL,EAAM,KACH,IAAmD,GAAGC,CAAI,WAAW,EACrE,KAAK,CAACE,MAASA,EAAK,KAAK,MAAM;AAAA,IAEpC,cAAc,CAACe,MACblB,EAAM,KACH,IAAmD,GAAGC,CAAI,aAAa,EAAE,QAAAiB,EAAA,CAAQ,EACjF,KAAK,CAACf,MAASA,EAAK,KAAK,MAAM;AAAA,EAAA;AAExC;AC1QO,MAAMgB,KAA0C;AAAA,EACrD,QAAQ;AAAA,IACN,OAAO;AAAA,EAAA;AAAA,EAGT,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,cACE;AAAA,IACF,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,KAAK;AAAA,IACL,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,IACf,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,cACE;AAAA,IACF,mBAAmB;AAAA,IACnB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,KAAK;AAAA,IACL,KAAK;AAAA,IACL,SAAS;AAAA,IACT,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,aAAa;AAAA,IACb,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,kBAAkB;AAAA,IAClB,sBACE;AAAA,IACF,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,sBAAsB;AAAA,IACtB,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,4BAA4B;AAAA,IAC5B,4BAA4B;AAAA,IAC5B,gBAAgB;AAAA,IAChB,4BAA4B;AAAA,IAC5B,oBAAoB;AAAA,IACpB,qBAAqB;AAAA,IACrB,2BAA2B;AAAA,IAC3B,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,eAAe;AAAA,IACf,OAAO;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,cAAc;AAAA,IACd,aACE;AAAA,IACF,gBAAgB;AAAA,IAChB,qBACE;AAAA,IACF,eAAe;AAAA,IACf,cAAc;AAAA,IACd,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,IACf,UAAU;AAAA,IACV,cAAc;AAAA,IACd,aAAa;AAAA,IACb,SAAS;AAAA,IACT,gBACE;AAAA,IACF,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,kBACE;AAAA,IACF,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,eAAe;AAAA,IACf,aAAa;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAEjB,GCvPMC,yBAAa,QAAA;AAGZ,SAASC,KAAyB;AACvC,MAAI;AACF,UAAM,EAAE,MAAAC,EAAA,IAASC,GAAA;AAEjB,IAAKH,GAAO,IAAIE,CAAI,MAClBA,EAAK,SAAS,cAAcH,EAAa,GACzCC,GAAO,IAAIE,CAAI;AAAA,EAEnB,QAAQ;AAAA,EAER;AACF;;;;;;;;;;;;;ACHA,UAAME,IAAQC,GAERC,IAAM3B,GAAewB,IAAU;AACrC,IAAAF,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GACVC,IAASC,GAAA,GAETC,IAASC,EAAuB,IAAI,GACpCC,IAAUD,EAAmB,IAAI;AAEvC,WAAAE,GAAU,YAAY;AACpB,UAAI;AACF,QAAAH,EAAO,QAAQ,MAAMP,EAAI,MAAM,EAAE,MAAMF,EAAM,MAAM;AAAA,MACrD,SAASa,GAAO;AACd,QAAAF,EAAQ,QAAQN,EAAQQ,CAAK;AAAA,MAC/B;AAAA,IACF,CAAC,cAICC,EAAA,GAAAC,EA0CM,OA1CNC,IA0CM;AAAA,MAzCWL,EAAA,cAAfM,EAAuEC,EAAAC,CAAA,GAAA;AAAA;QAA/C,MAAK;AAAA,QAAK,MAAK;AAAA,MAAA;mBAAS,MAAa;AAAA,cAAVR,EAAA,KAAO,GAAA,CAAA;AAAA,QAAA;;YACjCF,EAAA,cAEzBM,EAqCWK,GAAA,EAAA,KAAA,KAAA;AAAA,QApCMX,EAAA,MAAO,OAAO,UAA7BK,KAAAC,EAcU,WAdVM,IAcU;AAAA,UAbRC,EAAyEJ,EAAAC,CAAA,GAAA;AAAA,YAAhE,MAAK;AAAA,YAAK,QAAO;AAAA,UAAA;uBAAW,MAA0B;AAAA,kBAAvBD,EAAAf,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;WACzCW,EAAA,EAAA,GAAAC,EAWMK,WAXwBX,EAAA,MAAO,OAAK,CAA7Bc,GAAOC,YAApBT,EAWM,OAAA;AAAA,YAXuC,KAAKS;AAAA,YAAO,OAAM;AAAA,UAAA;YAC7DF,EAEYJ,EAAAO,EAAA,GAAA;AAAA,cAFF,MAAMF,EAAM;AAAA,cAAM,QAAO;AAAA,cAAS,OAAM;AAAA,YAAA;yBAAuB,MAEvE;AAAA,gBADAG,EAAAC,EAAAJ,EAAM,IAAI,GAAA,CAAA;AAAA,cAAA;;;YAEZD,EAECJ,EAAAC,CAAA,GAAA;AAAA,cAFQ,MAAK;AAAA,cAAK,MAAK;AAAA,cAAQ,OAAM;AAAA,YAAA;yBACnC,MAAgB;AAAA,gBAAbO,EAAAC,EAAAJ,EAAM,IAAI,IAAG,QAAGI,EAAGJ,EAAM,GAAG,GAAA,CAAA;AAAA,cAAA;;;YAEnBA,EAAM,eAArBN,EAAqEC,EAAAC,CAAA,GAAA;AAAA;cAAxC,MAAK;AAAA,YAAA;yBAAK,MAAC;AAAA,gBAADO,EAAA,MAACC,EAAGJ,EAAM,MAAM,IAAG,KAAC,CAAA;AAAA,cAAA;;;YAC3CA,EAAM,UAAUA,EAAM,UAAM,YAA5CN,EAEaC,EAAAU,CAAA,GAAA;AAAA;cAFwC,MAAK;AAAA,cAAS,MAAK;AAAA,YAAA;yBAAK,MAE3E;AAAA,gBADAF,EAAAC,EAAAJ,EAAM,MAAM,GAAA,CAAA;AAAA,cAAA;;;;;QAKHd,EAAA,MAAO,QAAQ,UAA9BK,KAAAC,EAmBU,WAnBVc,IAmBU;AAAA,UAlBRP,EAA0EJ,EAAAC,CAAA,GAAA;AAAA,YAAjE,MAAK;AAAA,YAAK,QAAO;AAAA,UAAA;uBAAW,MAA2B;AAAA,kBAAxBD,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;WACzCW,EAAA,EAAA,GAAAC,EAgBMK,WAhBwBX,EAAA,MAAO,QAAM,CAA9BqB,GAAON,YAApBT,EAgBM,OAAA;AAAA,YAhBwC,KAAKS;AAAA,YAAO,OAAM;AAAA,UAAA;YAC9DF,EAAqDJ,EAAAC,CAAA,GAAA,EAA5C,MAAK,QAAI;AAAA,yBAAC,MAAwB;AAAA,gBAArBO,EAAAC,EAAAG,EAAM,YAAY,GAAA,CAAA;AAAA,cAAA;;;YACxCR,EAGCJ,EAAAC,CAAA,GAAA;AAAA,cAHQ,MAAK;AAAA,cAAK,MAAK;AAAA,YAAA;yBACrB,MAAkB;AAAA,gBAAfO,EAAAC,EAAAG,EAAM,MAAM,IAAG,UAAMA,EAAM,KAAK,IAAAH,EAC/BG,EAAM,SAAM,MAASA,EAAM,MAAM,KAAA,EAAA,GAAA,CAAA;AAAA,cAAA;;;YAEvBA,EAAM,8BAAvBb,EAAkFC,EAAAU,CAAA,GAAA;AAAA;cAAhD,MAAK;AAAA,YAAA;yBAAK,MAA2B;AAAA,oBAAxBV,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAChDmB,EAAsFJ,EAAAC,CAAA,GAAA;AAAA,cAA7E,MAAK;AAAA,cAAK,MAAK;AAAA,cAAQ,OAAM;AAAA,YAAA;yBAAuB,MAAe;AAAA,gBAAZO,EAAAC,EAAAG,EAAM,GAAG,GAAA,CAAA;AAAA,cAAA;;;YAEjEA,EAAM,iBADdb,EAOCC,EAAAa,CAAA,GAAA;AAAA;cALC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACJ,gBAAOb,EAAAX,CAAA,EAAO,KAAKuB,EAAM,QAAQ;AAAA,YAAA;yBACjC,MAA2B;AAAA,oBAAxBZ,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;;sBAnCbc,EAA6CC,EAAAc,EAAA,GAAA;AAAA;QAAX,MAAM;AAAA,MAAA;;;;;;;;;;;;;;;;ACvB5C,UAAMhC,IAAQC,GAYRgC,IAAUlC,GAAA,GACVQ,IAASC,GAAA,GACT0B,IAAQC,GAAA;AAEd,IAAAtC,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAE7BgC,IAAQC;AAAA,MACZ,MACEJ,EAAQ,MAAM,UAAU,QAAQ,KAAK,CAACK,MAAWA,EAAO,OAAO,OAAO,GAAG,SACzEnC,EAAE,cAAc;AAAA,IAAA,GAGdoC,IAAQF,EAAoB,MAAM;AAAA,MACtC,EAAE,OAAO,YAAY,OAAOlC,EAAE,eAAe,EAAA;AAAA,MAC7C,EAAE,OAAO,UAAU,OAAOA,EAAE,aAAa,EAAA;AAAA,MACzC,EAAE,OAAO,SAAS,OAAOA,EAAE,YAAY,EAAA;AAAA,MACvC,EAAE,OAAO,SAAS,OAAOA,EAAE,YAAY,EAAA;AAAA,MACvC,EAAE,OAAO,QAAQ,OAAOA,EAAE,WAAW,EAAA;AAAA,IAAE,CACxC,GAGKqC,IAAUH;AAAA,MAAyB,MACvCrC,EAAM,YAAY,aACd,KACA;AAAA,QACE;AAAA,UACE,KAAK;AAAA,UACL,OAAOG,EAAE,eAAe;AAAA,UACxB,MAAM;AAAA,UACN,KAAK,MAAA;AAAM,YAAKI,EAAO,KAAK,GAAGP,EAAM,IAAI,WAAW;AAAA;AAAA,QAAA;AAAA,MACtD;AAAA,IACF,GAGAyC,IAAQJ,EAAmB;AAAA;AAAA,MAE/B,KAAK,MAAOrC,EAAM,YAAY,aAAa,aAAaA,EAAM;AAAA,MAC9D,KAAK,CAAC0C,MAAS;AACb,cAAMC,IAAOD,MAAS,aAAa1C,EAAM,OAAO,GAAGA,EAAM,IAAI,IAAI,OAAO0C,CAAI,CAAC;AAE7E,QAAIC,MAAST,EAAM,QAAW3B,EAAO,KAAKoC,CAAI;AAAA,MAChD;AAAA,IAAA,CACD;2BAIC1B,EAQiBC,EAAA0B,EAAA,GAAA;AAAA,MAPP,MAAMH,EAAA;AAAA,8CAAAA,EAAK,QAAAI;AAAA,MAClB,OAAOT,EAAA;AAAA,MACP,OAAOG,EAAA;AAAA,MACP,SAASC,EAAA;AAAA,MACT,MAAMxC,EAAM;AAAA,IAAA;iBAEb,MAAQ;AAAA,QAAR8C,GAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;;;;;;;;;;ACxDZ,UAAM/C,IAAQC,GAERC,IAAM3B,GAAewB,IAAU;AACrC,IAAAF,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7B4C,IAAQ5C,GAAa,YAAY,GACjCC,IAAUC,GAAA,GAEV2C,IAASvC,EAAuB,IAAI,GACpCwC,IAAUxC,EAAI,EAAK,GACnByC,IAASzC,EAAI,EAAE,GACf0C,IAAY1C,EAA2B,IAAI,GAC3C2C,IAAW3C,EAAc,EAAE,GAE3B4C,IAA6C;AAAA,MACjD,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,KAAK;AAAA,IAAA,GAGDrE,IAAUoD,EAAsC,MAAM;AAAA,MAC1D,EAAE,KAAK,QAAQ,OAAOlC,EAAE,WAAW,GAAG,UAAU,IAAA;AAAA,MAChD,EAAE,KAAK,SAAS,OAAOA,EAAE,YAAY,GAAG,OAAO,IAAI,OAAO,QAAA;AAAA,MAC1D,EAAE,KAAK,SAAS,OAAOA,EAAE,YAAY,GAAG,OAAO,IAAI,OAAO,SAAS,WAAW,IAAA;AAAA,MAC9E,EAAE,KAAK,UAAU,OAAOA,EAAE,aAAa,GAAG,OAAO,KAAK,OAAO,SAAS,WAAW,IAAA;AAAA,MACjF,EAAE,KAAK,UAAU,OAAOA,EAAE,aAAa,GAAG,OAAO,KAAK,OAAO,QAAA;AAAA,MAC7D,EAAE,KAAK,cAAc,OAAOA,EAAE,iBAAiB,GAAG,UAAU,KAAK,WAAW,IAAA;AAAA,IAAI,CACjF,GAEKoD,IAAelB;AAAA,MAAS,MAC3B,OAAO,KAAKiB,CAAO,EAAuB,IAAI,CAACnE,OAAW;AAAA,QACzD,OAAAA;AAAA,QACA,OAAO,GAAGgB,EAAE,aAAahB,CAAK,EAAE,CAAC,GAAG8D,EAAO,OAAO,QAAQ9D,CAAK,IAAI,MAAM8D,EAAO,MAAM,QAAQ9D,CAAK,CAAC,KAAK,EAAE;AAAA,MAAA,EAC3G;AAAA,IAAA;AAGJ,aAASqE,EAAKrE,GAA8E;AAC1F,aAAO,OAAOA,KAAU,YAAYA,KAASmE,IAAWnE,IAA2B;AAAA,IACrF;AAEA,mBAAesE,IAAsB;AACnC,MAAAP,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAD,EAAO,QAAQ,MAAM/C,EAAI,MAAM,EAAE,OAAOkD,EAAU,OAAO,QAAQD,EAAO,MAAA,CAAO,GAC/EE,EAAS,QAAQ,CAAA;AAAA,MACnB,SAASxC,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAqC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,WAAAS,GAAM,CAACP,GAAWD,CAAM,GAAG,MAAA;AAAM,MAAKM;KAAM,GAE5C7C,GAAU6C,CAAI,mBAIZxC,EAqDe2C,IAAA;AAAA,MArDA,MAAM5D,EAAM;AAAA,MAAM,SAAQ;AAAA,IAAA;iBACvC,MAmDW;AAAA,QAnDXsB,EAmDWJ,EAAA2C,EAAA,GAAA;AAAA,UAlDD,UAAUR,EAAA;AAAA,sDAAAA,EAAQ,QAAAR;AAAA,UAClB,QAAQM,EAAA;AAAA,oDAAAA,EAAM,QAAAN;AAAA,UACrB,MAAMI,EAAA,OAAQ,SAAK,CAAA;AAAA,UACnB,SAAShE,EAAA;AAAA,UACV,WAAQ;AAAA,UACR,YAAA;AAAA,UACA,OAAA;AAAA,UACA,YAAA;AAAA,UACC,sBAAoBiC,EAAAf,CAAA,EAAC,kBAAA;AAAA,UACrB,SAAS+C,EAAA;AAAA,UACT,iBAAeE,EAAA,QAAS,IAAA;AAAA,UACxB,iBAAelC,EAAA8B,CAAA,EAAK,eAAA;AAAA,UACpB,cAAYc,MAAuBA,EAAI,+BAA+B;AAAA,UACtE,cAAY5C,EAAAf,CAAA,EAAC,kBAAA;AAAA,QAAA;UAEH,WACT,MAME;AAAA,YANFmB,EAMEJ,EAAA6C,EAAA,GAAA;AAAA,cALC,eAAaX,EAAA;AAAA,cACb,SAASG,EAAA;AAAA,cACT,aAAarC,EAAAf,CAAA,EAAC,gBAAA;AAAA,cACf,WAAA;AAAA,cACC,uBAAkB6D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAEO,EAAA,QAAYI,EAAKX,CAAM;AAAA,YAAA;;UAIrC,aAASoB,EAClB,CAOO,EARe,KAAAH,QAAG;AAAA,YACzBI,EAOO,QAPPlD,IAOO;AAAA,cANLM,EAEaJ,EAAAU,CAAA,GAAA;AAAA,gBAFF,MAAM0B,EAAQQ,EAAI,KAAK;AAAA,gBAAG,MAAK;AAAA,cAAA;2BAAK,MAE7C;AAAA,sBADA5C,EAAAf,CAAA,EAAC,aAAc2D,EAAI,KAAK,EAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;cAE1BxC,EAEYJ,EAAAC,CAAA,GAAA;AAAA,gBAFH,MAAK;AAAA,gBAAM,MAAM2C,EAAI,6BAA6B;AAAA,gBAAW,QAAO;AAAA,cAAA;2BAAS,MAEpF;AAAA,kBADApC,EAAAC,EAAAmC,EAAI,IAAI,GAAA,CAAA;AAAA,gBAAA;;;;;UAIH,eAAWG,EACpB,CAAqF,EAD7D,KAAAH,QAAG;AAAA,YAC3BxC,EAAqFJ,EAAAC,CAAA,GAAA;AAAA,cAA5E,MAAK;AAAA,cAAM,MAAM2C,EAAI,SAAM,WAAA;AAAA,YAAA;yBAAuB,MAAgB;AAAA,gBAAbpC,EAAAC,EAAAmC,EAAI,MAAM,GAAA,CAAA;AAAA,cAAA;;;;UAE/D,eAAWG,EACpB,CAEY,EAHY,KAAAH,QAAG;AAAA,YAC3BxC,EAEYJ,EAAAC,CAAA,GAAA;AAAA,cAFH,MAAK;AAAA,cAAM,MAAM2C,EAAI,UAAUA,EAAI,UAAK,QAAA,WAAwB;AAAA,YAAA;yBAAW,MAElF;AAAA,gBADApC,EAAAC,EAAAmC,EAAI,MAAM,GAAA,CAAA;AAAA,cAAA;;;;UAGH,mBAAeG,EACxB,CAAyD,EAD7B,KAAAH,QAAG;AAAA,YAChBA,EAAI,mBAAnB7C,EAAyDC,EAAAiD,EAAA,GAAA;AAAA;cAAzB,OAAOL,EAAI;AAAA,YAAA;;UAGlC,UAAQG,EACjB,CAAsC,EADjB,KAAAH,QAAG;AAAA,YACxBxC,EAAsC8C,IAAA;AAAA,cAAlB,MAAMN,EAAI;AAAA,YAAA;;;;;;;;;;;;;;;;;AC7HtC,UAAM9D,IAAQC,GAERM,IAASC,GAAA;AAEf,IAAAX,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY;AAEnC,aAASiE,EAAWlF,GAA2B;AAC7C,YAAMmF,IAAO,OAAOnF,CAAK;AAEzB,aAAImF,KAAQ,OAAOA,MAAS,IAAU,WAClCA,KAAQ,MAAY,YACpBA,KAAQ,MAAY,SAEjB;AAAA,IACT;AAEA,aAASC,EAAKT,GAA8BU,GAAqC;AAC/E,aAAOV,EAAIU,EAAO,GAAG;AAAA,IACvB;AAGA,aAASC,EAAMtF,GAAwB;AACrC,aAAIA,KAAU,OAAoC,KAEnCgB,EAARhB,IAAU,aAAgB,SAAN;AAAA,IAC7B;AAEA,aAASuF,EAAKvF,GAAwB;AACpC,aAAOA,KAAU,OAA8B,KAAK,OAAOA,CAAK;AAAA,IAClE;sBAIE2B,EAAA,GAAAC,EAuDM,OAvDNC,IAuDM;AAAA,MAtDWhB,EAAM,QAAQ,gBAA7BiB,EAAqFC,EAAAC,CAAA,GAAA;AAAA;QAA/C,MAAK;AAAA,MAAA;mBAAK,MAA2B;AAAA,cAAxBnB,EAAM,QAAQ,OAAO,GAAA,CAAA;AAAA,QAAA;;;MAGhEA,EAAM,QAAQ,SAASA,EAAM,QAAQ,MAAM,KAAK,UADxDc,EAAA,GAAAC,EAmDM,OAnDNM,IAmDM;AAAA,QA/CJ6C,EA8CQ,SA9CRrC,IA8CQ;AAAA,UA7CNqC,EAMQ,SAAA,MAAA;AAAA,YALNA,EAIK,MAAA,MAAA;AAAA,sBAHHnD,EAEKK,GAAA,MAAAuD,EAFgB3E,EAAM,QAAQ,MAAM,SAAO,CAArCwE,YAAXzD,EAEK,MAAA;AAAA,gBAF8C,KAAKyD,EAAO;AAAA,cAAA,GAC1D7C,EAAA6C,EAAO,KAAK,GAAA,CAAA;;;UAIrBN,EAqCQ,SAAA,MAAA;AAAA,oBApCNnD,EAmCKK,GAAA,MAAAuD,EAnCsB3E,EAAM,QAAQ,MAAM,MAAI,CAAvC8D,GAAKtC,YAAjBT,EAmCK,MAAA,EAnCiD,KAAKS,KAAK;AAAA,sBAC9DT,EAiCKK,GAAA,MAAAuD,EAjCgB3E,EAAM,QAAQ,MAAM,SAAO,CAArCwE,YAAXzD,EAiCK,MAAA;AAAA,gBAjC8C,KAAKyD,EAAO;AAAA,cAAA;gBAC7CA,EAAO,SAAI,SAAcE,EAAKH,EAAKT,GAAKU,CAAM,CAAA,UAC5DvD,EAKCC,EAAAO,EAAA,GAAA;AAAA;kBAJE,MAAMiD,EAAKH,EAAKT,GAAKU,CAAM,CAAA;AAAA,kBAC5B,QAAO;AAAA,kBACP,OAAM;AAAA,gBAAA;6BACL,MAA6B;AAAA,oBAA1B9C,EAAAC,EAAA+C,EAAKH,EAAKT,GAAKU,CAAM,CAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;sCAIhBA,EAAO,SAAI,YAAiBD,EAAKT,GAAKU,CAAM,MAAA,aADzDvD,EAKCC,EAAAU,CAAA,GAAA;AAAA;kBAHE,MAAMyC,EAAWE,EAAKT,GAAKU,CAAM,CAAA;AAAA,kBAClC,MAAK;AAAA,gBAAA;6BACJ,MAA6B;AAAA,oBAA1B9C,EAAAC,EAAA+C,EAAKH,EAAKT,GAAKU,CAAM,CAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;sCAENA,EAAO,SAAI,eAAhCzD,EAEWK,GAAA,EAAA,KAAA,KAAA;AAAA,kBADNM,EAAAC,EAAA8C,EAAMF,EAAKT,GAAKU,CAAM,CAAA,CAAA,GAAA,CAAA;AAAA,gBAAA,UAGdA,EAAO,SAAI,aAAA,CAAmBE,EAAKH,EAAKT,GAAKU,CAAM,CAAA,UADhEvD,EAKCC,EAAAC,CAAA,GAAA;AAAA;kBAHC,MAAK;AAAA,kBACL,MAAK;AAAA,gBAAA;6BACJ,MAAuB;AAAA,wBAApBD,EAAAf,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;sBAGMqE,EAAO,SAAI,UAAeE,EAAKH,EAAKT,GAAKU,CAAM,CAAA,UAD5DvD,EAOCC,EAAAa,CAAA,GAAA;AAAA;kBALC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACJ,SAAK,CAAAc,MAAE3B,EAAAX,CAAA,EAAO,KAAKmE,EAAKH,EAAKT,GAAKU,CAAM,CAAA,CAAA;AAAA,gBAAA;6BACxC,MAA2B;AAAA,wBAAxBtD,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;4CAEPY,EAAyDK,GAAA,EAAA,KAAA,KAAA;AAAA,kBAArCM,EAAAC,EAAA+C,EAAKH,EAAKT,GAAKU,CAAM,CAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;ACjFvD,UAAMxE,IAAQC,GACR2E,IAAOC,GACPC,IAAOC,GAAoB9E,GAAC,MAA0B,GAEtDC,IAAM3B,GAAewB,IAAU;AACrC,IAAAF,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GACVC,IAASC,GAAA,GAETwE,IAAStE,EAA4B,IAAI,GACzCC,IAAUD,EAAmB,IAAI,GACjCuE,IAAWvE,EAAmB,IAAI;AAExC,mBAAe+C,IAAsB;AACnC,MAAAuB,EAAO,QAAQ,MACfrE,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAqE,EAAO,QAAQ,MAAM9E,EAAI,MAAMF,EAAM,KAAKA,EAAM,MAAM,EAAE;AAAA,MAC1D,SAASa,GAAO;AACd,QAAAF,EAAQ,QAAQN,EAAQQ,CAAK;AAAA,MAC/B;AAAA,IACF;AAEA,mBAAeqE,EAAMC,GAAqC;AACxD,MAAAF,EAAS,QAAQE,EAAM;AAEvB,UAAI;AACF,cAAMjF,EAAI,IAAIF,EAAM,KAAKA,EAAM,MAAM,IAAImF,EAAM,EAAE,GACjDzB,EAAM,QAAQvD,EAAE,kBAAkB,CAAC,GACnCyE,EAAK,SAASO,EAAM,EAAE,GACtBL,EAAK,QAAQ;AAAA,MACf,SAASjE,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAoE,EAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,aAASG,EAAKC,GAAmB;AAC/B,MAAAP,EAAK,QAAQ,IACRvE,EAAO,KAAK8E,CAAG;AAAA,IACtB;AAGA,WAAA1B;AAAA,MACE,CAACmB,GAAM,MAAM9E,EAAM,MAAM,EAAE;AAAA,MAC3B,CAAC,CAACsF,CAAG,MAAM;AACT,QAAIA,KAAU7B,EAAA;AAAA,MAChB;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,mBAKlBxC,EA4DYC,EAAAqE,EAAA,GAAA;AAAA,MA5DO,MAAMT,EAAA;AAAA,8CAAAA,EAAI,QAAAjC;AAAA,MAAG,OAAO3B,EAAAf,CAAA,EAAC,iBAAA;AAAA,MAAsB,OAAO;AAAA,IAAA;iBACnE,MA0DM;AAAA,QA1DN+D,EA0DM,OA1DNlD,IA0DM;AAAA,UAzDWL,EAAA,cAAfM,EAAuEC,EAAAC,CAAA,GAAA;AAAA;YAA/C,MAAK;AAAA,YAAK,MAAK;AAAA,UAAA;uBAAS,MAAa;AAAA,kBAAVR,EAAA,KAAO,GAAA,CAAA;AAAA,YAAA;;gBACjCqE,EAAA,QACLA,EAAA,MAAO,WAAM,UAAjC/D,EAEYC,EAAAC,CAAA,GAAA;AAAA;YAF6B,MAAK;AAAA,YAAK,MAAK;AAAA,UAAA;uBAAQ,MAE9D;AAAA,kBADAD,EAAAf,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;kCAFHc,EAA6CC,EAAAc,EAAA,GAAA;AAAA;YAAX,MAAM;AAAA,UAAA;kBAKxCjB,EAkDUK,GAAA,MAAAuD,EAlDeK,EAAA,SAAM,CAAA,GAAA,CAAfG,YAAhBpE,EAkDU,WAAA;AAAA,YAlD8B,KAAKoE,EAAM;AAAA,YAAI,OAAM;AAAA,UAAA;YAC3D7D,EAAsDJ,EAAAC,CAAA,GAAA,EAA7C,QAAO,cAAU;AAAA,yBAAC,MAAiB;AAAA,gBAAdO,EAAAC,EAAAwD,EAAM,KAAK,GAAA,CAAA;AAAA,cAAA;;;YAC1BA,EAAM,oBAArBlE,EAA0FC,EAAAC,CAAA,GAAA;AAAA;cAAxD,MAAK;AAAA,cAAK,MAAK;AAAA,YAAA;yBAAQ,MAAuB;AAAA,gBAApBO,EAAAC,EAAAwD,EAAM,WAAW,GAAA,CAAA;AAAA,cAAA;;;YAE7EjB,EAgCQ,SAhCR7C,IAgCQ;AAAA,cA/BN6C,EAOQ,SAAA,MAAA;AAAA,gBANNA,EAKK,MAAA,MAAA;AAAA,kBAJHA,EAAoC,cAA7BhD,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,kBACR+D,EAAmC,cAA5BhD,EAAAf,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,kBACR+D,EAAkC,cAA3BhD,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,kCACR+D,EAAM,MAAA,MAAA,MAAA,EAAA;AAAA,gBAAA;;cAGVA,EAsBQ,SAAA,MAAA;AAAA,iBArBNpD,EAAA,EAAA,GAAAC,EAoBKK,WApByB+D,EAAM,SAAO,CAA/BK,GAAQhE,YAApBT,EAoBK,MAAA,EApByC,KAAKS,KAAK;AAAA,kBACtD0C,EAGK,MAAA,MAAA;AAAA,oBAFHA,EAA6B,OAAA,MAAAvC,EAArB6D,EAAO,KAAK,GAAA,CAAA;AAAA,oBACTA,EAAO,SAAlB1E,EAAA,GAAAC,EAA6E,OAA7Ec,IAA6EF,EAArB6D,EAAO,KAAK,GAAA,CAAA;;kBAEtEtB,EAGK,MAHLuB,IAGK;AAAA,wBAFAD,EAAO,UAAM,EAAA,IAAS,KACzB,CAAA;AAAA,oBAAYA,EAAO,SAAnB1E,EAAA,GAAAC,EAAiF,QAAjF2E,IAAsD,OAAE/D,EAAG6D,EAAO,KAAK,GAAA,CAAA;;kBAEzEtB,EAA6D,MAA7DyB,IAA6DhE,EAA1B6D,EAAO,SAAK,EAAA,GAAA,CAAA;AAAA,kBAC/CtB,EASK,MAAA,MAAA;AAAA,oBAPKsB,EAAO,iBADfvE,EAOEC,EAAAa,CAAA,GAAA;AAAA;sBALA,MAAK;AAAA,sBACL,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACJ,cAAYb,EAAAf,CAAA,EAAC,kBAAA;AAAA,sBACb,SAAK,CAAA0C,MAAEuC,EAAKI,EAAO,QAAQ;AAAA,oBAAA;;;;;YAOvBL,EAAM,aAArBlE,EAA4EC,EAAAC,CAAA,GAAA;AAAA;cAAjD,MAAK;AAAA,cAAK,MAAK;AAAA,YAAA;yBAAQ,MAAgB;AAAA,gBAAbO,EAAAC,EAAAwD,EAAM,IAAI,GAAA,CAAA;AAAA,cAAA;;;YAE/DjB,EASM,OATN0B,IASM;AAAA,cARJtE,EAOCJ,EAAAa,CAAA,GAAA;AAAA,gBANC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACJ,SAASkD,EAAA,UAAaE,EAAM;AAAA,gBAC5B,UAAUF,EAAA,UAAQ;AAAA,gBAClB,SAAK,CAAApC,MAAEqC,EAAMC,CAAK;AAAA,cAAA;2BAClB,MAAyB;AAAA,sBAAtBjE,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;;;;;;;;;;AClHjB,UAAMH,IAAQC,GACR2E,IAAOC,GACPC,IAAOC,GAAoB9E,GAAC,MAA0B,GAEtDC,IAAM3B,GAAewB,IAAU;AACrC,IAAAF,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEVuF,IAAUnF,EAAI,EAAE,GAChBoF,IAASpF,EAAI,EAAE,GACfqF,IAAQrF,EAAmB,IAAI,GAC/BsF,IAAStF,EAAI,EAAK;AACxB,QAAIuF;AAGJ,aAASC,EAAOb,GAA4B;AAC1C,UAAI,CAACA,EAAK,QAAO;AAEjB,UAAI;AACF,cAAMc,IAAS,IAAI,IAAId,CAAG;AAE1B,eAAOc,EAAO,WAAWA,EAAO;AAAA,MAClC,QAAQ;AACN,eAAOd;AAAA,MACT;AAAA,IACF;AAEA,UAAMe,IAAQ/D,EAAS,MAAMyD,EAAO,MAAM,KAAA,MAAW,EAAE;AAEvD,aAASO,IAAgB;AACvB,mBAAaJ,CAAK,GAClBA,IAAQ,WAAW,YAAY;AAC7B,YAAI;AACF,UAAAF,EAAM,QAAQ,MAAM7F,EAAI,YAAY,EAAE,OAAOF,EAAM,MAAM,OAAO,SAAS6F,EAAQ,MAAA,CAAO;AAAA,QAC1F,QAAQ;AACN,UAAAE,EAAM,QAAQ;AAAA,QAChB;AAAA,MACF,GAAG,GAAG;AAAA,IACR;AAEA,mBAAeO,IAAsB;AACnC,MAAAN,EAAO,QAAQ;AAEf,UAAI;AACF,cAAMvG,IAAO,MAAMS,EAAI,KAAK;AAAA,UAC1B,OAAOF,EAAM,MAAM;AAAA,UACnB,SAAS6F,EAAQ;AAAA,UACjB,QAAQC,EAAO;AAAA,QAAA,CAChB;AAED,QAAApC,EAAM,QAAQvD,EAAE,kBAAkB,CAAC,GACnCyE,EAAK,UAAUnF,CAAI,GACnBqF,EAAK,QAAQ;AAAA,MACf,SAASjE,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAmF,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAEA,WAAArC;AAAA,MACE,CAACmB,GAAM,MAAM9E,EAAM,MAAM,EAAE;AAAA,MAC3B,CAAC,CAACsF,CAAG,MAAM;AACT,QAAKA,MAELO,EAAQ,QAAQK,EAAOlG,EAAM,MAAM,GAAG,GACtC8F,EAAO,QAAQ,IACfC,EAAM,QAAQ,MACdM,EAAA;AAAA,MACF;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpB1C,GAAMkC,GAAS,MAAM;AACnB,MAAIf,EAAK,SAAOuB,EAAA;AAAA,IAClB,CAAC,mBAICpF,EAwBYC,EAAAqE,EAAA,GAAA;AAAA,MAxBO,MAAMT,EAAA;AAAA,8CAAAA,EAAI,QAAAjC;AAAA,MAAG,OAAO3B,EAAAf,CAAA,EAAC,iBAAA;AAAA,MAAsB,OAAO;AAAA,IAAA;MAkBxD,UACT,MAAoE;AAAA,QAApEmB,EAAoEJ,EAAAa,CAAA,GAAA;AAAA,UAAxD,gCAAO+C,EAAA,QAAI;AAAA,QAAA;qBAAU,MAAuB;AAAA,gBAApB5D,EAAAf,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;QACrCmB,EAEcJ,EAAAa,CAAA,GAAA;AAAA,UAFH,MAAK;AAAA,UAAW,SAASiE,EAAA;AAAA,UAAS,WAAWI,EAAA;AAAA,UAAQ,SAAOE;AAAA,QAAA;qBAAM,MAE3E;AAAA,gBADApF,EAAAf,CAAA,EAAC,WAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;;iBApBL,MAeM;AAAA,QAfN+D,EAeM,OAfNlD,IAeM;AAAA,UAdJM,EAAsDJ,EAAAC,CAAA,GAAA,EAA7C,QAAO,cAAU;AAAA,uBAAC,MAAiB;AAAA,cAAdO,EAAAC,EAAA3B,EAAM,KAAK,GAAA,CAAA;AAAA,YAAA;;;UACzCsB,EAAmEJ,EAAAC,CAAA,GAAA;AAAA,YAA1D,MAAK;AAAA,YAAK,MAAK;AAAA,UAAA;uBAAQ,MAAyB;AAAA,kBAAtBD,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAEpCmB,EAEeJ,EAAAqF,EAAA,GAAA;AAAA,YAFA,OAAOrF,EAAAf,CAAA,EAAC,mBAAA;AAAA,YAAwB,MAAMe,EAAAf,CAAA,EAAC,wBAAA;AAAA,UAAA;uBACpD,MAAuD;AAAA,cAAvDmB,EAAuDJ,EAAAsF,EAAA,GAAA;AAAA,4BAApCX,EAAA;AAAA,8DAAAA,EAAO,QAAAhD;AAAA,gBAAE,aAAY;AAAA,cAAA;;;;UAG1CvB,EAEeJ,EAAAqF,EAAA,GAAA;AAAA,YAFA,OAAOrF,EAAAf,CAAA,EAAC,kBAAA;AAAA,YAAsB,UAAA;AAAA,UAAA;uBAC3C,MAA0C;AAAA,cAA1CmB,EAA0CJ,EAAAuF,EAAA,GAAA;AAAA,4BAApBX,EAAA;AAAA,8DAAAA,EAAM,QAAAjD;AAAA,gBAAG,MAAM;AAAA,cAAA;;;;UAGxBkD,EAAA,UAAK,aAApB9E,EAEYC,EAAAC,CAAA,GAAA;AAAA;YAFmB,MAAK;AAAA,YAAK,MAAK;AAAA,UAAA;uBAAQ,MAEpD;AAAA,cADAO,EAAAC,EAAAT,EAAAf,CAAA,8BAAuB4F,EAAA,MAAA,CAAK,CAAA,GAAA,CAAA;AAAA,YAAA;;;;;;;;;;;;;;;;;;AC3FpC,UAAM/F,IAAQC,GAQR2E,IAAOC,GAEP5C,IAAUlC,GAAA,GACVG,IAAM3B,GAAe0D,CAAO,GAE5ByE,IAAMzE,EAAQ,IAAI,cAAc;AACtC,IAAApC,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEVqG,IAASjG,EAAyB,IAAI,GACtCkG,IAAOlG,EAAI,EAAK,GAChBmG,IAAOnG,EAAI,CAAC,GACZC,IAAUD,EAAmB,IAAI,GACjCoG,IAASpG,EAAuB,IAAI,GACpCqG,IAASrG,EAAI,EAAK,GAClBsG,IAAStG,EAAuB,IAAI,GACpCuG,IAAavG,EAAI,EAAK;AAE5B,aAAS4F,EAAKlH,GAAyB;AACrC,MAAA4H,EAAO,QAAQ5H,GACf6H,EAAW,QAAQ;AAAA,IACrB;AAGA,aAASC,EAAOzH,GAA6B;AAC3C,MAAIkH,EAAO,SAAS,CAAClH,EAAK,UAASkH,EAAO,QAAQ,CAAA,IACzCA,EAAO,SAASK,EAAO,UAC9BL,EAAO,QAAQA,EAAO,MAAM,OAAO,CAACQ,MAAQA,EAAI,OAAOH,EAAO,OAAO,EAAE,IAEzEpC,EAAK,SAAS;AAAA,IAChB;AAEA,mBAAewC,EAAOhI,GAAkC;AACtD,UAAKA,EAAM;AAEX,YAAI;AACF,gBAAMc,EAAI,OAAOd,EAAM,OAAO,EAAE,GAChCsE,EAAM,QAAQvD,EAAE,eAAe,CAAC,GAChCyE,EAAK,SAAS;AAAA,QAChB,SAAS/D,GAAO;AACd,UAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,QAC7B;AAAA,IACF;AAEA,aAASwG,EAAIjI,GAA2B;AACtC,YAAMK,IAAOL,EAAM;AAEnB,aAAKK,IAEEA,EAAK,aACRU,EAAE,kBAAkB,EAAE,KAAKV,EAAK,YAAY,QAAQA,EAAK,OAAA,CAAQ,IACjEU,EAAE,sBAAsB,EAAE,QAAQV,EAAK,QAAQ,IAJjC;AAAA,IAKpB;AAEA,aAASJ,EAAID,GAAyB;AACpC,MAAA0H,EAAO,QAAQ1H,GACf2H,EAAO,QAAQ;AAAA,IACjB;AAEA,aAASO,EAAMzI,GAAkB;AAC/B,MAAIiI,EAAO,UAAOA,EAAO,MAAM,aAAajI;AAAA,IAC9C;AAEA,mBAAe4E,EAAKf,IAAO,GAAkB;AAC3C,UAAI;AACF,cAAMO,IAAS,MAAM/C,EAAI,OAAOF,EAAM,KAAK,EAAE,GAAGA,EAAM,OAAO,MAAM0C,GAAM,UAAU,IAAI;AAEvF,QAAAiE,EAAO,QAAQjE,MAAS,IAAIO,EAAO,OAAO,CAAC,GAAI0D,EAAO,SAAS,CAAA,GAAK,GAAG1D,EAAO,IAAI,GAClF4D,EAAK,QAAQ5D,EAAO,cACpB2D,EAAK,QAAQ3D,EAAO,eAAeA,EAAO;AAAA,MAC5C,SAASpC,GAAO;AACd,QAAAF,EAAQ,QAAQN,EAAQQ,CAAK;AAAA,MAC/B;AAAA,IACF;AAEA,WAAAD,GAAU,MAAM6C,GAAM,cAIpB3C,EAAA,GAAAC,EAsEM,OAtENC,IAsEM;AAAA,MArEWL,EAAA,cAAfM,EAAuEC,EAAAC,CAAA,GAAA;AAAA;QAA/C,MAAK;AAAA,QAAK,MAAK;AAAA,MAAA;mBAAS,MAAa;AAAA,cAAVR,EAAA,KAAO,GAAA,CAAA;AAAA,QAAA;;YACjCgG,EAAA,cAEzB5F,EAiDWK,GAAA,EAAA,KAAA,KAAA;AAAA,gBAhDTL,EA6CMK,GAAA,MAAAuD,EA7CegC,EAAA,OAAM,CAAfvH,YAAZ2B,EA6CM,OAAA;AAAA,UA7CwB,KAAK3B,EAAM;AAAA,UAAI,OAAM;AAAA,QAAA;UACjD8E,EAyCM,OAzCN7C,IAyCM;AAAA,YAvCIjC,EAAM,YADd6B,EAMCC,EAAAO,EAAA,GAAA;AAAA;cAJE,MAAMrC,EAAM;AAAA,cACb,QAAO;AAAA,cACP,OAAM;AAAA,YAAA;yBACL,MAAe;AAAA,gBAAZsC,EAAAC,EAAAvC,EAAM,GAAG,GAAA,CAAA;AAAA,cAAA;;;YAECA,EAAM,UAAK,cAA3B6B,EAEaC,EAAAU,CAAA,GAAA;AAAA;cAF0B,MAAK;AAAA,cAAU,MAAK;AAAA,YAAA;yBAAK,MAE9D;AAAA,oBADAV,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAEaf,EAAM,mBAAtB6B,EAEaC,EAAAU,CAAA,GAAA;AAAA;cAFqB,MAAK;AAAA,cAAU,MAAK;AAAA,YAAA;yBAAK,MAEzD;AAAA,oBADAV,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;kBAGUF,EAAA,WAAWiB,EAAAwF,CAAA,KAAG,CAAKtH,EAAM,gBADtC6B,EAQCC,EAAAa,CAAA,GAAA;AAAA;cANC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAK,CAAAc,OAAExD,EAAID,CAAK;AAAA,YAAA;yBAChB,MAA0B;AAAA,oBAAvB8B,EAAAf,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;YAGCe,EAAAwF,CAAA,KAAOtH,EAAM,WAAWA,EAAM,eADtC6B,EAQCC,EAAAa,CAAA,GAAA;AAAA;cANC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,OAAM;AAAA,cACL,SAAK,CAAAc,OAAEuE,EAAOhI,CAAK;AAAA,YAAA;yBACnB,MAAsB;AAAA,oBAAnB8B,EAAAf,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;kCAGMe,EAAAwF,CAAA,KAAG,CAAKtH,EAAM,gBAD3B6B,EAQCC,EAAAa,CAAA,GAAA;AAAA;cANC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACJ,OAAKwF,GAAA,EAAA,wBAAA,CAA6BtH,EAAA,WAAWb,EAAM,YAAU;AAAA,cAC7D,SAAK,CAAAyD,OAAEyD,EAAKlH,CAAK;AAAA,YAAA;yBACjB,MAAoB;AAAA,oBAAjB8B,EAAAf,CAAA,EAAC,WAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAGMf,EAAM,eAArB6B,EAA8EC,EAAAC,CAAA,GAAA;AAAA;YAAjD,MAAK;AAAA,YAAK,MAAK;AAAA,UAAA;uBAAQ,MAAgB;AAAA,cAAbO,EAAAC,EAAA0F,EAAIjI,CAAK,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAChEkC,EAA0CkG,IAAA;AAAA,YAA1B,SAASpI,EAAM;AAAA,UAAA;;QAGhBwH,EAAA,cAAjB3F,EAAqFC,EAAAa,CAAA,GAAA;AAAA;UAA9D,MAAK;AAAA,UAAK,SAAQ;AAAA,UAAQ,SAAKiC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAEY,EAAKoD,EAAA,QAAI,CAAA;AAAA,QAAA;qBAAO,MAAC,CAAA,GAAA7C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAAD,KAAC,EAAA;AAAA,UAAA;;;sBAlD3E/C,EAA6CC,EAAAc,EAAA,GAAA;AAAA;QAAX,MAAM;AAAA,MAAA;MAsDhC8E,EAAA,cADR7F,EAMEwG,IAAA;AAAA;QAJQ,MAAMV,EAAA;AAAA,gDAAAA,EAAM,QAAAlE;AAAA,QACnB,KAAK5C,EAAA;AAAA,QACL,OAAO6G,EAAA;AAAA,QACP,SAAOQ;AAAA,MAAA;MAIFN,EAAA,cADR/F,EAMEyG,IAAA;AAAA;QAJQ,MAAMT,EAAA;AAAA,gDAAAA,EAAU,QAAApE;AAAA,QACvB,OAAOmE,EAAA;AAAA,QACP,OAAOhH,EAAM,SAASgH,EAAA,MAAO;AAAA,QAC7B,UAAQE;AAAA,MAAA;;;;;;;;;ACpJf,UAAMlH,IAAQC,GAERC,IAAM3B,GAAewB,IAAU;AACrC,IAAAF,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7B4C,IAAQ5C,GAAa,YAAY,GACjCC,IAAUC,GAAA,GAEVtB,IAAM0B,EAAmB,IAAI,GAC7BiH,IAASjH,EAA4B,IAAI,GACzCwC,IAAUxC,EAAI,EAAK,GACnB2C,IAAW3C,EAAyB,EAAE,GAEtCkH,IAAWlH,EAA0B,IAAI,GACzCmH,IAAQnH,EAAmB,IAAI,GAG/BoH,IAAQpH,EAAkB,IAAI,GAE9BtC,IAAQiE,EAAS,OAAO,EAAE,UAAUuF,EAAS,OAAO,OAAOC,EAAM,OAAO,OAAOC,EAAM,QAAQ,GAC7FC,IAAe1F;AAAA,MACnB,MAAM,CAACuF,EAAS,OAAOC,EAAM,OAAOC,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE;AAAA,IAAA,GAG7DE,IAA0C;AAAA,MAC9C,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,IAAA,GAGJ/I,IAAUoD,EAAuC,MAAM;AAAA,MAC3D,EAAE,KAAK,YAAY,OAAOlC,EAAE,eAAe,GAAG,OAAO,IAAA;AAAA,MACrD,EAAE,KAAK,SAAS,OAAOA,EAAE,YAAY,EAAA;AAAA,MACrC,EAAE,KAAK,SAAS,OAAOA,EAAE,YAAY,GAAG,OAAO,KAAK,OAAO,QAAA;AAAA,IAAQ,CACpE,GAEK8H,IAAkB5F;AAAA,MAAS,MAC9B,CAAC,SAAS,WAAW,QAAQ,EAAY,IAAI,CAAClD,OAAW;AAAA,QACxD,OAAAA;AAAA,QACA,OAAOgB,EAAE,iBAAiBhB,CAAK,EAAE;AAAA,MAAA,EACjC;AAAA,IAAA,GAGE+I,IAAe7F;AAAA,MAAS,MAC5B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EACA,IAAI,CAAClD,OAAW,EAAE,OAAAA,GAAO,OAAOgB,EAAE,cAAchB,CAAK,EAAE,EAAA,EAAI;AAAA,IAAA,GAGzDgJ,IAAe9F;AAAA,MAAS,MAC3B,CAAC,OAAO,cAAc,QAAQ,EAAY,IAAI,CAAClD,OAAW;AAAA,QACzD,OAAAA;AAAA,QACA,OAAOgB,EAAE,cAAchB,CAAK,EAAE;AAAA,MAAA,EAC9B;AAAA,IAAA;AAIJ,aAASqE,EAAuBrE,GAAiE;AAC/F,aAAO,OAAOA,KAAU,YAAYA,MAAU,KAAMA,IAAc;AAAA,IACpE;AAEA,mBAAesE,IAAsB;AACnC,MAAAP,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAIlE,EAAI,UAAU,SAChBA,EAAI,SAAS,MAAMkB,EAAI,UAAU,MAAM,MAAM,OAG/CyH,EAAO,QAAQ3I,EAAI,UAAU,OAAO,CAAA,IAAK,MAAMkB,EAAI,OAAOlB,EAAI,OAAOZ,EAAM,KAAK,GAChFiF,EAAS,QAAQ,CAAA;AAAA,MACnB,SAASxC,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAqC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,WAAAS,GAAMvF,GAAO;AAAM,MAAKqF;KAAM,GAE9B7C,GAAU6C,CAAI,mBAIZxC,EAkFe2C,IAAA;AAAA,MAlFA,MAAM5D,EAAM;AAAA,MAAM,SAAQ;AAAA,IAAA;iBACvC,MAgFW;AAAA,QAhFXsB,EAgFWJ,EAAA2C,EAAA,GAAA;AAAA,UA/ED,UAAUR,EAAA;AAAA,sDAAAA,EAAQ,QAAAR;AAAA,UACzB,MAAM8E,EAAA,SAAM,CAAA;AAAA,UACZ,SAAS1I,EAAA;AAAA,UACV,WAAQ;AAAA,UACR,YAAA;AAAA,UACA,OAAA;AAAA,UACC,SAASiE,EAAA;AAAA,UACT,iBAAe6E,EAAA;AAAA,UACf,iBAAe7G,EAAA8B,CAAA,EAAK,eAAA;AAAA,UACpB,cAAYhE,EAAA,UAAG,OAAYkC,EAAAf,CAAA,kBAAkBe,EAAAf,CAAA,EAAC,YAAA;AAAA,QAAA;UAEpC,WACT,MAsBM;AAAA,YAtBN+D,EAsBM,OAtBNlD,IAsBM;AAAA,cArBJM,EAMEJ,EAAA6C,EAAA,GAAA;AAAA,gBALC,eAAa6D,EAAA;AAAA,gBACb,SAASK,EAAA;AAAA,gBACT,aAAa/G,EAAAf,CAAA,EAAC,mBAAA;AAAA,gBACf,WAAA;AAAA,gBACC,uBAAkB6D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAE+E,EAAA,QAAWpE,EAAoBX,CAAM;AAAA,cAAA;cAE5DvB,EAMEJ,EAAA6C,EAAA,GAAA;AAAA,gBALC,eAAa8D,EAAA;AAAA,gBACb,SAASK,EAAA;AAAA,gBACT,aAAahH,EAAAf,CAAA,EAAC,gBAAA;AAAA,gBACf,WAAA;AAAA,gBACC,uBAAkB6D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAEgF,EAAA,QAAQrE,EAAKX,CAAM;AAAA,cAAA;cAE1CvB,EAMEJ,EAAA6C,EAAA,GAAA;AAAA,gBALC,eAAa+D,EAAA;AAAA,gBACb,SAASK,EAAA;AAAA,gBACT,aAAajH,EAAAf,CAAA,EAAC,gBAAA;AAAA,gBACf,WAAA;AAAA,gBACC,uBAAkB6D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAEiF,EAAA,QAAQtE,EAAYX,CAAM;AAAA,cAAA;;;UAK1C,iBAAaoB,EACtB,CAEa,EAHa,KAAAH,QAAG;AAAA,YAC7BxC,EAEaJ,EAAAU,CAAA,GAAA;AAAA,cAFF,MAAMoG,EAAMlE,EAAI,QAAQ;AAAA,cAAG,KAAA;AAAA,YAAA;yBAAI,MAExC;AAAA,oBADA5C,EAAAf,CAAA,EAAC,iBAAkB2D,EAAI,QAAQ,EAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAIxB,cAAUG,EACnB,CAsBO,EAvBgB,KAAAH,QAAG;AAAA,YAC1BI,EAsBO,QAtBP7C,IAsBO;AAAA,cArBLC,EAA4CJ,EAAAC,CAAA,GAAA,EAAnC,MAAK,QAAI;AAAA,2BAAC,MAAe;AAAA,kBAAZO,EAAAC,EAAAmC,EAAI,KAAK,GAAA,CAAA;AAAA,gBAAA;;;cACfA,EAAI,MAAG,UAAvB7C,EAA0FC,EAAAU,CAAA,GAAA;AAAA;gBAA7D,MAAK;AAAA,gBAAU,MAAK;AAAA,cAAA;2BAAK,MAAyB;AAAA,sBAAtBV,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;cAC1DmB,EAkBaJ,EAAAkH,EAAA,GAAA;AAAA,gBAlBA,OAAOtE,EAAI;AAAA,gBAAO,OAAM;AAAA,cAAA;gBACxB,WACT,MAME;AAAA,kBANFxC,EAMEJ,EAAAa,CAAA,GAAA;AAAA,oBALA,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACJ,cAAYb,EAAAf,CAAA,EAAC,cAAA;AAAA,oBACb,4BAAD,MAAA;AAAA,oBAAA,GAAW,CAAA,MAAA,CAAA;AAAA,kBAAA;;2BAGf,MAOK;AAAA,kBAPL+D,EAOK,MAPLrC,IAOK;AAAA,oBANHqC,EAA8B,cAAvBhD,EAAAf,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,oBACR+D,EAAwB,MAAA,MAAAvC,EAAjBmC,EAAI,KAAK,GAAA,CAAA;AAAA,oBAChBI,EAA4B,cAArBhD,EAAAf,CAAA,EAAC,UAAA,CAAA,GAAA,CAAA;AAAA,oBACR+D,EAAsB,MAAA,MAAAvC,EAAfmC,EAAI,GAAG,GAAA,CAAA;AAAA,oBACdI,EAA4B,cAArBhD,EAAAf,CAAA,EAAC,UAAA,CAAA,GAAA,CAAA;AAAA,oBACR+D,EAAsB,MAAA,MAAAvC,EAAfmC,EAAI,GAAG,GAAA,CAAA;AAAA,kBAAA;;;;;;UAMX,UAAQG,EACjB,CAOE,EARmB,KAAAH,QAAG;AAAA,YAEhB9E,EAAA,UAAG,aADXiC,EAOEoH,IAAA;AAAA;cALC,KAAKrJ,EAAA;AAAA,cACL,OAAK,EAAA,GAAOZ,EAAA,OAAK,OAAS0F,EAAI,GAAA;AAAA,cAC9B,UAAUA,EAAI,aAAa,SAAM;AAAA,cACjC,OAAOA,EAAI;AAAA,cACX,WAASL;AAAA,YAAA;;;;;;;;;;;GClKd6E,KAAU;;;;;;AAThB,UAAMtI,IAAQC,GAERgC,IAAUlC,GAAA,GACVG,IAAM3B,GAAe0D,CAAO;AAClC,IAAApC,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAIViI,IAAS7H,EAAwB,IAAI,GACrC5B,IAAQ4B,EAAgB,OAAO,GAC/B8H,IAAW9H,EAAI,EAAK;AAC1B,QAAIuF;AAEJ,UAAMwC,IAASxG,EAAQ,IAAI,WAAW,KAAKA,EAAQ,IAAI,cAAc,GAE/DyG,IAASrG,EAAS,MAAMkG,EAAO,OAAO,UAAU,IAAI,GACpDI,IAAOtG,EAAS,MAAMkG,EAAO,OAAO,QAAQ,IAAI,GAChDK,IAASvG,EAAS,MAAMsG,EAAK,OAAO,UAAU,IAAI,GAElDE,IAASxG,EAAS,MAAM;AAAA,MAC5B,EAAE,OAAO,SAAS,OAAOlC,EAAE,kBAAkB,EAAA;AAAA,MAC7C,EAAE,OAAO,QAAQ,OAAOA,EAAE,iBAAiB,EAAA;AAAA,IAAE,CAC9C,GAEK2I,IAA2F;AAAA,MAC/F,EAAE,KAAK,SAAS,OAAO,eAAe,MAAM,SAAA;AAAA,MAC5C,EAAE,KAAK,WAAW,OAAO,iBAAiB,MAAM,UAAA;AAAA,MAChD,EAAE,KAAK,UAAU,OAAO,gBAAgB,MAAM,OAAA;AAAA,IAAO,GAGjDC,IAAe1G,EAAyB,MAAM;AAClD,YAAM2G,IAASJ,EAAO,OAAO,UAAU;AAEvC,aAAII,KAAU,KAAW,YACrBA,KAAU,KAAW,YAElB;AAAA,IACT,CAAC,GAGKC,IAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,GAGIC,IAAS7G;AAAA,MAAS,MACtB,OAAO,QAAQuG,EAAO,OAAO,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC/J,GAAIsK,CAAU,OAAO;AAAA,QACpE,IAAAtK;AAAA,QACA,OAAOsB,EAAE,cAAc8I,EAAO,SAASpK,CAAE,IAAIA,IAAK,OAAO,EAAE;AAAA,QAC3D,YAAAsK;AAAA,MAAA,EACA;AAAA,IAAA;AAGJ,aAASC,EAAWpK,GAAuB;AACzC,aAAIA,EAAI,WAAW,WAAiBmB,EAAE,oBAAoB,IAEnDnB,EAAI,SAAS,QAAQmB,EAAE,cAAcnB,EAAI,SAAS,KAAK,EAAE,IAAImB,EAAE,qBAAqB;AAAA,IAC7F;AAEA,mBAAesD,IAAsB;AACnC,UAAI;AACF,QAAA8E,EAAO,QAAQ,MAAMrI,EAAI,OAAA;AAAA,MAC3B,SAASW,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B;AAEA,mBAAaoF,CAAK,GAEdsC,EAAO,OAAO,WAChBtC,IAAQ,WAAW,MAAA;AAAM,QAAKxC,EAAA;AAAA,SAAQ6E,EAAO;AAAA,IAEjD;AAEA,mBAAee,IAAuB;AACpC,MAAAb,EAAS,QAAQ;AAEjB,UAAI;AACF,cAAMtI,EAAI,MAAMpB,EAAM,KAAK,GAC3B4E,EAAM,QAAQvD,EAAE,cAAc,CAAC,GAC/B,MAAMsD,EAAA;AAAA,MACR,SAAS5C,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAA2H,EAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,mBAAec,EAAOtK,GAA8B;AAClD,UAAI;AACF,cAAMkB,EAAI,OAAOlB,EAAI,EAAE,GACvB,MAAMyE,EAAA;AAAA,MACR,SAAS5C,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B;AAAA,IACF;AAEA,WAAAD,GAAU6C,CAAI,GACd8F,GAAgB,MAAM,aAAatD,CAAK,CAAC,mBAIvChF,EA2Ie2C,IAAA;AAAA,MA3IA,MAAM5D,EAAM;AAAA,MAAM,SAAQ;AAAA,MAAY,MAAM;AAAA,IAAA;iBACzD,MAyIM;AAAA,QAzINkE,EAyIM,OAzINlD,IAyIM;AAAA,UAxIYuH,EAAA,cAEhBxH,EAqIWK,GAAA,EAAA,KAAA,KAAA;AAAA,YApIOmH,EAAA,MAAO,MAAM,aAA7BtH,EAAwFC,EAAAsI,EAAA,GAAA;AAAA;cAArD,MAAK;AAAA,cAAW,aAAatI,EAAAf,CAAA,EAAC,iBAAA;AAAA,YAAA;YAGzDoI,EAAA,MAAO,QAAQA,QAAO,KAAK,WAAM,iBADzCtH,EAIEC,EAAAsI,EAAA,GAAA;AAAA;cAFA,MAAK;AAAA,cACJ,aAAatI,EAAAf,CAAA,EAAC,oBAAA,EAAA,OAA8BoI,QAAO,KAAK,SAAK,GAAA,CAAA;AAAA,YAAA;YAGjDG,EAAA,cAAfzH,EA2BUC,EAAAuI,EAAA,GAAA;AAAA;cA3Ba,OAAM;AAAA,YAAA;yBAC3B,MAYM;AAAA,gBAZNvF,EAYM,OAZN7C,IAYM;AAAA,kBAXJC,EAA6DJ,EAAAC,CAAA,GAAA,EAApD,QAAO,cAAU;AAAA,+BAAC,MAAwB;AAAA,sBAArBO,EAAAC,EAAAyH,EAAWV,EAAA,KAAM,CAAA,GAAA,CAAA;AAAA,oBAAA;;;kBAC/CpH,EAEYJ,EAAAC,CAAA,GAAA;AAAA,oBAFH,MAAK;AAAA,oBAAK,MAAK;AAAA,oBAAQ,OAAM;AAAA,kBAAA;+BAAyB,MAE7D;AAAA,sBADAO,EAAAC,EAAA+G,EAAA,MAAO,QAAQ,GAAA,CAAA;AAAA,oBAAA;;;kBAGTxH,EAAAuH,CAAA,UADRxH,EAMCC,EAAAa,CAAA,GAAA;AAAA;oBAJC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACL,SAAKiC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAEyG,EAAOZ,EAAA,KAAM;AAAA,kBAAA;+BACpB,MAAsB;AAAA,0BAAnBxH,EAAAf,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;gBAGTmB,EAA8DJ,EAAAwI,EAAA,GAAA;AAAA,kBAAjD,eAAA;AAAA,kBAAe,cAAYN,EAAWV,EAAA,KAAM;AAAA,gBAAA;gBAC1CA,EAAA,MAAO,SAAS,kBAA/BzH,EAKYC,EAAAC,CAAA,GAAA;AAAA;kBAL8B,MAAK;AAAA,kBAAK,MAAK;AAAA,gBAAA;6BAAQ,MAK/D;AAAA,wBAJAD,EAAAf,CAAA,EAAC,2BAAA;AAAA,sBAAqD,SAAAuI,EAAA,MAAO,SAAS,UAAU;AAAA,sBAA8B,OAAAA,EAAA,MAAO,SAAS,UAAU;AAAA,oBAAA;;;sBAKtHA,EAAA,MAAO,SAAS,UAAK,gBAAzCzH,EAKYC,EAAAC,CAAA,GAAA;AAAA;kBAL2C,MAAK;AAAA,kBAAK,MAAK;AAAA,gBAAA;6BAAQ,MAK5E;AAAA,wBAJAD,EAAAf,CAAA,EAAC,uBAAA;AAAA,sBAAiD,SAAAuI,EAAA,MAAO,SAAS,MAAM;AAAA,sBAA8B,OAAAA,EAAA,MAAO,SAAS,MAAM;AAAA,oBAAA;;;;;;kBAO5GxH,EAAAuH,CAAA,KAAM,CAAKF,EAAA,MAAO,MAAM,aAA5CtH,EAeUC,EAAAuI,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,yBAdR,MAaM;AAAA,gBAbNvF,EAaM,OAbNrC,IAaM;AAAA,kBAZJP,EAAgFJ,EAAAyI,EAAA,GAAA;AAAA,gCAAzD7K,EAAA;AAAA,kEAAAA,EAAK,QAAA+D;AAAA,oBAAG,SAASgG,EAAA;AAAA,oBAAS,cAAY3H,EAAAf,CAAA,EAAC,YAAA;AAAA,kBAAA;kBAC9DmB,EAEYJ,EAAAC,CAAA,GAAA;AAAA,oBAFH,MAAK;AAAA,oBAAK,MAAK;AAAA,kBAAA;+BAAQ,MAE9B;AAAA,0BADArC,EAAA,UAAK,SAAcoC,EAAAf,CAAA,EAAC,sBAAA,IAA2Be,EAAAf,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;kBAElDmB,EAOCJ,EAAAa,CAAA,GAAA;AAAA,oBANC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACJ,SAASyG,EAAA;AAAA,oBACV,OAAM;AAAA,oBACL,SAAOa;AAAA,kBAAA;+BACP,MAAmB;AAAA,0BAAhBnI,EAAAf,CAAA,EAAC,UAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;;;;YAKK,CAAAwI,EAAA,UAASD,EAAA,cAAzBzH,EAMUC,EAAAuI,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,yBALR,MAIE;AAAA,gBAJFnI,EAIEJ,EAAA0I,EAAA,GAAA;AAAA,kBAHA,MAAK;AAAA,kBACJ,OAAO1I,EAAAf,CAAA,EAAC,YAAA;AAAA,kBACR,aAAae,EAAAf,CAAA,EAAC,iBAAA;AAAA,gBAAA;;;;YAIHwI,EAAA,SAAQC,EAAA,cAAxB7H,EAqEWK,GAAA,EAAA,KAAA,KAAA;AAAA,cApETE,EA+BUJ,EAAAuI,EAAA,GAAA,MAAA;AAAA,2BA9BR,MAoBM;AAAA,kBApBNvF,EAoBM,OApBNuB,IAoBM;AAAA,oBAnBJnE,EAOEJ,EAAAwI,EAAA,GAAA;AAAA,sBANA,MAAK;AAAA,sBACJ,OAAOd,EAAA,MAAO;AAAA,sBACd,QAAQG,EAAA;AAAA,sBACT,cAAA;AAAA,sBACC,WAAS,CAAG5J,MAAa,GAAQA,CAAK;AAAA,sBACtC,cAAY+B,EAAAf,CAAA,EAAC,aAAA;AAAA,oBAAA;oBAEhB+D,EAUM,OAVNwB,IAUM;AAAA,4BATJ3E,EAMEK,GAAA,MAAAuD,EALmBmE,GAAU,CAAtBlB,MADTtG,EAMEJ,EAAA2I,EAAA,GAAA;AAAA,wBAJC,KAAKjC,EAAS;AAAA,wBACd,OAAO1G,EAAAf,CAAA,EAAEyH,EAAS,KAAK;AAAA,wBACvB,OAAOgB,EAAA,MAAO,SAAShB,EAAS,GAAG,KAAA;AAAA,wBACnC,OAAOgB,EAAA,MAAO,SAAShB,EAAS,GAAG,KAAA,KAAA,IAAcA,EAAS,OAAI;AAAA,sBAAA;sBAEjEtG,EAA2DJ,EAAA2I,EAAA,GAAA;AAAA,wBAA5C,OAAO3I,EAAAf,CAAA,EAAC,UAAA;AAAA,wBAAe,OAAOyI,EAAA,MAAO;AAAA,sBAAA;sBACpDtH,EAA8EJ,EAAA2I,EAAA,GAAA;AAAA,wBAA/D,OAAO3I,EAAAf,CAAA,EAAC,YAAA;AAAA,wBAAiB,OAAOyI,EAAA,MAAO;AAAA,wBAAO,MAAK;AAAA,sBAAA;;;kBAGtE1E,EAQM,OARNyB,IAQM;AAAA,oBAPJrE,EAGUJ,EAAAC,CAAA,GAAA;AAAA,sBAHD,MAAK;AAAA,sBAAK,MAAK;AAAA,oBAAA;iCACtB,MAAwB;AAAA,wBAArBO,EAAAC,EAAAT,EAAAf,CAAA,sBAAqB,KAAC,CAAA;AAAA,wBAAAmB,EAAqCJ,EAAAiD,EAAA,GAAA;AAAA,0BAA3B,OAAOwE,EAAA,MAAK;AAAA,wBAAA;wBAAejH,EAAA,UAC3DR,EAAAf,CAAA,EAAC,cAAewI,QAAK,KAAK,OAAM,OACrC,CAAA;AAAA,sBAAA;;;oBACArH,EAEYJ,EAAAC,CAAA,GAAA;AAAA,sBAFH,MAAK;AAAA,sBAAK,MAAK;AAAA,sBAAQ,OAAM;AAAA,oBAAA;iCAAyB,MAE7D;AAAA,wBADAO,EAAAC,EAAAgH,EAAA,MAAK,QAAQ,GAAA,CAAA;AAAA,sBAAA;;;;;;;cAKJO,EAAA,MAAO,eAAtBjI,EAgBUC,EAAAuI,EAAA,GAAA;AAAA;gBAhBqB,OAAOvI,EAAAf,CAAA,EAAC,eAAA;AAAA,cAAA;2BACrC,MAcK;AAAA,kBAdL+D,EAcK,MAdL0B,IAcK;AAAA,4BAbH7E,EAYKK,GAAA,MAAAuD,EAZeuE,EAAA,OAAM,CAAfrB,YAAX9G,EAYK,MAAA;AAAA,sBAZwB,KAAK8G,EAAM;AAAA,oBAAA;sBACtCvG,EAA8CJ,EAAAC,CAAA,GAAA,EAArC,MAAK,QAAI;AAAA,mCAAC,MAAiB;AAAA,0BAAdO,EAAAC,EAAAkG,EAAM,KAAK,GAAA,CAAA;AAAA,wBAAA;;;sBACjC3D,EASO,QATP4F,IASO;AAAA,8BARL/I,EAOWK,GAAA,MAAAuD,EAPkBmE,GAAU,CAAtBlB;0BAA8B,KAAAA,EAAS;AAAA,wBAAA;2BAE7CC,EAAM,WAAWD,EAAS,GAAG,KAAA,KAAA,UADtC3G,EAKCC,EAAAU,CAAA,GAAA;AAAA;4BAHE,MAAMgG,EAAS;AAAA,4BAChB,MAAK;AAAA,0BAAA;uCACJ,MAAuB;AAAA,8BAApBlG,EAAAC,EAAAT,EAAAf,CAAA,EAAEyH,EAAS,KAAK,CAAA,IAAI,QAAGjG,EAAGkG,EAAM,WAAWD,EAAS,GAAG,CAAA,GAAA,CAAA;AAAA,4BAAA;;;;;;;;;wCAQvE3G,EAEUC,EAAAuI,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,2BADR,MAAmE;AAAA,kBAAnEnI,EAAmEJ,EAAA0I,EAAA,GAAA;AAAA,oBAAzD,MAAK;AAAA,oBAAgB,OAAO1I,EAAAf,CAAA,EAAC,YAAA;AAAA,oBAAgB,MAAK;AAAA,kBAAA;;;;cAG9DmB,EAYUJ,EAAAuI,EAAA,GAAA;AAAA,gBAZA,OAAOvI,EAAAf,CAAA,EAAC,cAAA;AAAA,cAAA;2BAChB,MAIM;AAAA,kBAJN+D,EAIM,OAJN6F,IAIM;AAAA,qBAHJjJ,EAAA,EAAA,GAAAC,EAEaK,WAFcwH,EAAA,MAAO,QAAQ,WAAzBoB,YAAjB/I,EAEaC,EAAAU,CAAA,GAAA;AAAA,sBAFwC,KAAKoI;AAAA,sBAAQ,MAAK;AAAA,oBAAA;iCAAU,MAE/E;AAAA,4BADAA,CAAM,GAAA,CAAA;AAAA,sBAAA;;;;kBAGCpB,EAAA,MAAO,QAAQ,QAAQ,UAAlC9H,KAAAC,EAKM,OALNkJ,IAKM;AAAA,oBAJJ3I,EAA2EJ,EAAAC,CAAA,GAAA;AAAA,sBAAlE,MAAK;AAAA,sBAAK,MAAK;AAAA,oBAAA;iCAAU,MAA+B;AAAA,4BAA5BD,EAAAf,CAAA,EAAC,sBAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;qBACtCW,EAAA,EAAA,GAAAC,EAEaK,WAFcwH,EAAA,MAAO,QAAQ,UAAzBoB,YAAjB/I,EAEaC,EAAAU,CAAA,GAAA;AAAA,sBAFuC,KAAKoI;AAAA,sBAAQ,MAAK;AAAA,oBAAA;iCAAU,MAE9E;AAAA,4BADAA,CAAM,GAAA,CAAA;AAAA,sBAAA;;;;;;;;0BAlIhB/I,EAA2DC,EAAAuI,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,uBAAnC,MAAyB;AAAA,cAAzBnI,EAAyBJ,EAAAc,EAAA,GAAA,EAAX,MAAM,GAAC;AAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCCtE7CsG,KAAU;;;;;;;;;;AA3BhB,UAAMtI,IAAQC,GAUR2E,IAAOC,GAOP5C,IAAUlC,GAAA,GACVG,IAAM3B,GAAe0D,CAAO,GAC5B1B,IAASC,GAAA;AACf,IAAAX,GAAA;AAEA,UAAM4I,IAASxG,EAAQ,IAAI,WAAW,KAAKA,EAAQ,IAAI,cAAc,GAC/DiI,IAAUxJ,EAAqB,IAAI,GACnCyJ,IAAazJ,EAAI,EAAK;AAC5B,QAAIuF;AAKJ,mBAAemE,IAA8B;AAC3C,UAAKC,EAAK,OAEV;AAAA,QAAAF,EAAW,QAAQ,IACnBD,EAAQ,QAAQ;AAEhB,YAAI;AACF,UAAAI,EAAO,MAAMpK,EAAI,MAAM,QAAQ,CAACmK,EAAK,MAAM,KAAK,GAAG,CAAC,CAAC;AAAA,QACvD,SAASxJ,GAAO;AACd,UAAAsJ,EAAW,QAAQ,IACnBzG,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,QAC7B;AAAA;AAAA,IACF;AAEA,aAASyJ,EAAOtL,GAAqB;AAGnC,UAFA,aAAaiH,CAAK,GAEdjH,EAAI,WAAW,YAAYA,EAAI,WAAW,WAAW;AACvD,QAAAiH,IAAQ,WAAW,YAAY;AAC7B,cAAI;AACF,YAAAqE,EAAO,MAAMpK,EAAI,IAAIlB,EAAI,EAAE,CAAC;AAAA,UAC9B,SAAS6B,GAAO;AACd,YAAAsJ,EAAW,QAAQ,IACnBzG,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,UAC7B;AAAA,QACF,GAAGyH,EAAO;AAEV;AAAA,MACF;AAEA,MAAA6B,EAAW,QAAQ,IACnBD,EAAQ,QAAQlL;AAAA,IAClB;AAEA,aAASuL,IAAuB;AAC9B,MAAIL,EAAQ,SAASlK,EAAM,QACpBO,EAAO,KAAK,EAAE,MAAM,GAAGP,EAAM,IAAI,SAAS,OAAO,EAAE,IAAI,OAAOkK,EAAQ,MAAM,EAAE,EAAA,GAAK;AAAA,IAE5F;AAEA,IAAAX,GAAgB,MAAM,aAAatD,CAAK,CAAC;AAEzC,UAAM9F,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEV+J,IAAO3J,EAA0B,IAAI,GACrCC,IAAUD,EAAmB,IAAI,GACjC8J,IAAM9J,EAAc,UAAU,GAC9B+J,IAAQ/J,EAAoC,IAAI,GAChDgK,IAAehK,EAAI,EAAK,GACxBiK,IAAYjK,EAAwC,IAAI,GACxDkK,IAAmBlK,EAAI,EAAK,GAE5BmK,IAAmC,CAAC,UAAU,OAAO,IAAI,GAEzD/F,IAAOzC,EAAS;AAAA,MACpB,KAAK,MAAMrC,EAAM,WAAW;AAAA,MAC5B,KAAK,CAACb,MAAU;AACd,QAAKA,KAAOyF,EAAK,OAAO;AAAA,MAC1B;AAAA,IAAA,CACD,GAEKkG,IAAOzI,EAAoB,MAAM;AAAA,MACrC,EAAE,OAAO,YAAY,OAAOlC,EAAE,oBAAoB,EAAA;AAAA,MAClD,EAAE,OAAO,UAAU,OAAOA,EAAE,kBAAkB,GAAG,OAAOkK,EAAK,OAAO,OAAO,UAAU,OAAA;AAAA,MACrF,EAAE,OAAO,MAAM,OAAOlK,EAAE,oBAAoB,GAAG,OAAOkK,EAAK,OAAO,OAAO,YAAY,OAAA;AAAA,MACrF,EAAE,OAAO,OAAO,OAAOlK,EAAE,oBAAoB,GAAG,OAAOkK,EAAK,OAAO,OAAO,YAAY,OAAA;AAAA,MACtF,EAAE,OAAO,UAAU,OAAOlK,EAAE,kBAAkB,GAAG,OAAOkK,EAAK,OAAO,OAAO,UAAU,OAAA;AAAA,MACrF,EAAE,OAAO,OAAO,OAAOlK,EAAE,eAAe,GAAG,OAAOkK,EAAK,OAAO,OAAO,OAAO,OAAA;AAAA,MAC5E,EAAE,OAAO,MAAM,OAAOlK,EAAE,cAAc,GAAG,OAAOkK,EAAK,OAAO,OAAO,MAAM,OAAA;AAAA,MACzE;AAAA,QACE,OAAO;AAAA,QACP,OAAOlK,EAAE,qBAAqB;AAAA,QAC9B,OAAOkK,EAAK,OAAO,OAAO,aAAa;AAAA,MAAA;AAAA,IACzC,CACD,GAEKU,IAAc1I;AAAA,MAAkC,MACpDwI,EAAa,SAASL,EAAI,KAAyB,IAAKA,EAAI,QAA6B;AAAA,IAAA,GAGrF1B,KAA+C;AAAA,MACnD,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,IAAA,GAGJkC,KAAuC;AAAA,MAC3C,KAAK;AAAA,MACL,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,UAAU;AAAA,IAAA,GAGNC,KAAc5I,EAAsC,MAAM;AAAA,MAC9D,EAAE,KAAK,OAAO,OAAOlC,EAAE,cAAc,GAAG,UAAU,IAAA;AAAA,MAClD,EAAE,KAAK,UAAU,OAAOA,EAAE,mBAAmB,GAAG,OAAO,GAAA;AAAA,MACvD,EAAE,KAAK,QAAQ,OAAOA,EAAE,WAAW,GAAG,OAAO,GAAA;AAAA,MAC7C,EAAE,KAAK,UAAU,OAAOA,EAAE,aAAa,GAAG,UAAU,IAAA;AAAA,MACpD,EAAE,KAAK,cAAc,OAAOA,EAAE,WAAW,GAAG,OAAO,IAAA;AAAA,IAAI,CACxD,GAGK+K,KAAkB7I,EAA0C,MAAM;AAAA,MACtE,EAAE,KAAK,OAAO,OAAOlC,EAAE,cAAc,GAAG,UAAU,IAAA;AAAA,MAClD,EAAE,KAAK,UAAU,OAAOA,EAAE,mBAAmB,GAAG,OAAO,GAAA;AAAA,MACvD,EAAE,KAAK,SAAS,OAAOA,EAAE,WAAW,GAAG,OAAO,IAAA;AAAA,MAC9C,GAAI4K,EAAY,UAAU,WACtB,CAAC,EAAE,KAAK,OAAO,OAAO5K,EAAE,UAAU,GAAG,UAAU,IAAA,CAAK,IACpD;AAAA,QACE,EAAE,KAAK,iBAAiB,OAAOA,EAAE,YAAY,GAAG,UAAU,IAAA;AAAA,QAC1D,EAAE,KAAK,eAAe,OAAOA,EAAE,wBAAwB,GAAG,OAAO,IAAA;AAAA,MAAI;AAAA,IACvE,CACL;AAMD,aAASgL,GAAOnB,GAAwB;AACtC,UAAI;AACF,eAAO,KAAK,UAAU,KAAK,MAAMA,CAAM,GAAG,MAAM,CAAC;AAAA,MACnD,QAAQ;AACN,eAAOA;AAAA,MACT;AAAA,IACF;AAEA,aAASoB,GAAKtH,GAA+B;AAC3C,UAAIA,EAAI,UAAU,KAAM,QAAO;AAE/B,YAAMuH,IAAKvH,EAAI,QAAQ,MACjBY,IAAO2G,KAAM,OAAO,IAAIA,IAAK,MAAM,QAAQ,CAAC,CAAC,QAAQ,GAAG,KAAK,MAAMA,CAAE,CAAC;AAE5E,aAAOvH,EAAI,SAASA,EAAI,SAAS,GAAGY,CAAI,MAAMZ,EAAI,KAAK,IAAIA,EAAI,MAAM,KAAKY;AAAA,IAC5E;AASA,UAAM4G,KAAQjJ,EAA2B,MAAM;AAC7C,YAAMwE,IAAOwD,EAAK,OAAO;AAEzB,aAAKxD,IAE6B;AAAA,QAChC,CAAC1G,EAAE,mBAAmB,GAAG0G,EAAK,UAAU1G,EAAE,kBAAkB,CAAC;AAAA,QAC7D,CAACA,EAAE,yBAAyB,GAAG0G,EAAK,cAAcA,EAAK,eAAe,IAAI;AAAA,QAC1E,CAAC1G,EAAE,wBAAwB,GAAG0G,EAAK,WAAW;AAAA,QAC9C,CAAC1G,EAAE,YAAY,GAAG0G,EAAK,KAAK;AAAA,QAC5B,CAAC1G,EAAE,yBAAyB,GAAG0G,EAAK,YAAY;AAAA,QAChD,CAAC1G,EAAE,kBAAkB,GAAG0G,EAAK,KAAK;AAAA,QAClC,CAAC1G,EAAE,oBAAoB,GAAG0G,EAAK,OAAO;AAAA,QACtC,CAAC1G,EAAE,qBAAqB,GAAG0G,EAAK,QAAQ;AAAA,QACxC,CAAC1G,EAAE,wBAAwB,GAAG0G,EAAK,WAAW;AAAA,QAC9C,CAAC1G,EAAE,mBAAmB,GAAGA,EAAE,eAAe0G,EAAK,MAAM,EAAE,CAAC;AAAA,QACxD,CAAC1G,EAAE,kBAAkB,GAAG0G,EAAK,KAAK;AAAA,QAClC,CAAC1G,EAAE,sBAAsB,GAAG0G,EAAK,YAAY1G,EAAE,UAAU,IAAIA,EAAE,SAAS,CAAC;AAAA,QACzE,CAACA,EAAE,8BAA8B,GAAG0G,EAAK,oBAAoB1G,EAAE,UAAU,IAAI,IAAI;AAAA,QACjF,CAACA,EAAE,kBAAkB,GAAG0G,EAAK,KAAK;AAAA,QAClC,CAAC1G,EAAE,wBAAwB,GAAG0G,EAAK,WAAW;AAAA,QAC9C,CAAC1G,EAAE,eAAe,GAAG0G,EAAK,GAAG,KAAK,KAAK,KAAK,IAAI;AAAA,QAChD,CAAC1G,EAAE,sBAAsB,GAAG0G,EAAK,SAAS;AAAA,QAC1C,CAAC1G,EAAE,wBAAwB,GAAG0G,EAAK,WAAW;AAAA,QAC9C,CAAC1G,EAAE,yBAAyB,GAAG0G,EAAK,YAAY;AAAA,QAChD,CAAC1G,EAAE,iBAAiB,GAAG0G,EAAK,IAAI;AAAA,QAChC;AAAA,UACE;AAAA,UACAA,EAAK,SAAS,SACV,EAAE,OAAOA,EAAK,SAAS,IAAI,CAAC0E,MAAc,CAACA,EAAU,MAAMA,EAAU,GAAG,CAAC,MACzE;AAAA,QAAA;AAAA,QAEN;AAAA,UACE;AAAA,UACA,OAAO,KAAK1E,EAAK,EAAE,EAAE,SACjB,EAAE,OAAO,OAAO,QAAQA,EAAK,EAAE,EAAE,IAAI,CAAC,CAAC3H,GAAKC,CAAK,MAAM,CAAC,MAAMD,CAAG,IAAI,OAAOC,CAAK,CAAC,CAAC,EAAA,IACnF;AAAA,QAAA;AAAA,QAEN;AAAA,UACE;AAAA,UACA,OAAO,KAAK0H,EAAK,OAAO,EAAE,SACtB;AAAA,YACE,OAAO,OAAO,QAAQA,EAAK,OAAO,EAAE,IAAI,CAAC,CAAC3H,GAAKC,CAAK,MAAM;AAAA,cACxD,WAAWD,CAAG;AAAA,cACd,OAAOC,CAAK;AAAA,YAAA,CACb;AAAA,UAAA,IAEH;AAAA,QAAA;AAAA,QAEN;AAAA,UACE;AAAA,UACA0H,EAAK,QAAQ,SACT;AAAA,YACE,MAAMA,EAAK,QAAQ,QAAQ,CAAC2E,MAAUA,EAAM,KAAK;AAAA,YACjD,OAAO3E,EAAK,QAAQ,KAAK,CAAC2E,MAAUA,EAAM,KAAK,GAAG,SAAS;AAAA,UAAA,IAE7D;AAAA,QAAA;AAAA,QAEN,CAACrL,EAAE,uBAAuB,GAAG0G,EAAK,UAAU;AAAA,QAC5C,CAAC1G,EAAE,qBAAqB,GAAG0G,EAAK,QAAQ;AAAA,QACxC,CAAC1G,EAAE,+BAA+B,GAAG0G,EAAK,kBAAkB;AAAA,QAC5D,CAAC1G,EAAE,+BAA+B,GAAG0G,EAAK,kBAAkB;AAAA,QAC5D,CAAC1G,EAAE,mBAAmB,GAAG0G,EAAK,MAAM;AAAA,QACpC,CAAC1G,EAAE,+BAA+B,GAAG0G,EAAK,sBAAsB,IAAI;AAAA,MAAA,EAInE,OAAO,CAAC,CAAA,EAAG1H,CAAK,MAAMA,KAAU,QAA+BA,MAAU,EAAE,EAC3E,IAAI,CAAC,CAACsM,GAAOtM,CAAK,MAAM,CAACsM,GAAO,OAAOtM,KAAU,WAAYA,IAAiB,OAAOA,CAAK,CAAC,CAAC,IAjE7E,CAAA;AAAA,IAkEpB,CAAC;AAED,aAASkF,GAAWlF,GAAiC;AAEnD,aADIA,MAAU,QACVA,KAAS,MAAY,WACrBA,KAAS,MAAY,YACrBA,KAAS,MAAY,SAElB;AAAA,IACT;AAEA,mBAAesE,GAAK5E,GAA2B;AAC7C,mBAAaoH,CAAK,GAClBkE,EAAW,QAAQ,IACnBD,EAAQ,QAAQ,MAChBG,EAAK,QAAQ,MACb1J,EAAQ,QAAQ,MAChB8J,EAAM,QAAQ,MACdE,EAAU,QAAQ,MAClBH,EAAI,QAAQ;AAEZ,UAAI;AACF,QAAAH,EAAK,QAAQ,MAAMnK,EAAI,KAAKF,EAAM,KAAKnB,CAAE;AAAA,MAC3C,SAASgC,GAAO;AACd,QAAAF,EAAQ,QAAQN,EAAQQ,CAAK;AAAA,MAC/B;AAAA,IACF;AAEA,mBAAe6K,GAAU5D,GAAkC;AACzD,UAAI,EAAA9H,EAAM,WAAW,QAASwK,EAAI,UAAU,QAAQA,EAAI,UAAU,QAElE;AAAA,QAAAE,EAAa,QAAQ;AAErB,YAAI;AACF,UAAAD,EAAM,QAAQ,MAAMvK,EAAI,MAAMF,EAAM,KAAKA,EAAM,QAAQ;AAAA,YACrD,WAAWwK,EAAI;AAAA,YACf,MAAM1C,EAAM;AAAA,YACZ,UAAUA,EAAM;AAAA,UAAA,CACjB;AAAA,QACH,SAASjH,GAAO;AACd,UAAAF,EAAQ,QAAQN,EAAQQ,CAAK;AAAA,QAC/B,UAAA;AACE,UAAA6J,EAAa,QAAQ;AAAA,QACvB;AAAA;AAAA,IACF;AAEA,mBAAeiB,GAAc7D,GAAkC;AAC7D,YAAM8D,IAAUb,EAAY;AAE5B,UAAI,EAAA/K,EAAM,WAAW,QAAQ4L,MAAY,OAEzC;AAAA,QAAAhB,EAAiB,QAAQ;AAEzB,YAAI;AACF,UAAAD,EAAU,QAAQ,MAAMzK,EAAI,UAAUF,EAAM,KAAKA,EAAM,QAAQ;AAAA,YAC7D,KAAK4L;AAAA,YACL,MAAM9D,EAAM;AAAA,YACZ,UAAUA,EAAM;AAAA,UAAA,CACjB;AAAA,QACH,SAASjH,GAAO;AACd,UAAAF,EAAQ,QAAQN,EAAQQ,CAAK;AAAA,QAC/B,UAAA;AACE,UAAA+J,EAAiB,QAAQ;AAAA,QAC3B;AAAA;AAAA,IACF;AAEA,WAAAjH;AAAA,MACE,MAAM3D,EAAM;AAAA,MACZ,CAACnB,MAAO;AACN,QAAIA,MAAO,QAAW4E,GAAK5E,CAAE;AAAA,MAC/B;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpB8E,GAAM6G,GAAK,MAAM;AACf,MAAAC,EAAM,QAAQ,MACdE,EAAU,QAAQ;AAAA,IACpB,CAAC,mBAIC1J,EA8NYC,EAAA2K,EAAA,GAAA;AAAA,MA7NF,MAAM/G,EAAA;AAAA,8CAAAA,EAAI,QAAAjC;AAAA,MAClB,MAAK;AAAA,MACJ,YAAU;AAAA,MACX,WAAA;AAAA,MACA,SAAQ;AAAA,IAAA;MAEG,SACT,MAKO;AAAA,QALPqB,EAKO,QALPlD,IAKO;AAAA,UAJWqJ,EAAA,cAAhBpJ,EAEaC,EAAAU,CAAA,GAAA;AAAA;YAFU,MAAMyC,GAAWgG,QAAK,KAAK,MAAM;AAAA,YAAG,MAAK;AAAA,UAAA;uBAAK,MAEnE;AAAA,kBADAA,EAAA,MAAK,KAAK,UAAM,GAAA,GAAA,CAAA;AAAA,YAAA;;;UAElBnG,EAAkE,QAAlE7C,IAAkEM,EAA9B0I,SAAM,KAAK,OAAG,EAAA,GAAA,CAAA;AAAA,QAAA;;MAI3C,SACT,MAiBO;AAAA,QAjBKA,EAAA,SAAZvJ,EAAA,GAAAC,EAiBO,QAjBPc,IAiBO;AAAA,UAfGX,EAAAuH,CAAA,UADRxH,EAOCC,EAAAa,CAAA,GAAA;AAAA;YALC,MAAK;AAAA,YACL,MAAK;AAAA,YACJ,SAASoI,EAAA;AAAA,YACT,SAAOC;AAAA,UAAA;uBACP,MAAuB;AAAA,kBAApBlJ,EAAAf,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAEPmB,EAMCJ,EAAAa,CAAA,GAAA;AAAA,YALC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACJ,MAAMb,EAAAhB,CAAA,EAAI,SAASF,EAAM,KAAKqK,EAAA,MAAK,KAAK,EAAE;AAAA,UAAA;uBAC1C,MAA2B;AAAA,kBAAxBnJ,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAEPmB,EAAkFJ,EAAAO,EAAA,GAAA;AAAA,YAAxE,MAAM4I,EAAA,MAAK,KAAK;AAAA,YAAK,QAAO;AAAA,UAAA;uBAAS,MAAyB;AAAA,kBAAtBnJ,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;;;iBAIvD,MAA6D;AAAA,QAA9CQ,EAAA,cAAfM,EAA6DC,EAAAC,CAAA,GAAA;AAAA;UAArC,MAAK;AAAA,QAAA;qBAAS,MAAa;AAAA,gBAAVR,EAAA,KAAO,GAAA,CAAA;AAAA,UAAA;;cACvB0J,EAAA,SAEzBvJ,EAAA,GAAAC,EAqLM,OArLN0E,IAqLM;AAAA,UApLY0E,EAAA,cAAhBlJ,EAAmFC,EAAAsI,EAAA,GAAA;AAAA;YAAvD,MAAK;AAAA,YAAQ,aAAatI,EAAAf,CAAA,EAAC,sBAAA;AAAA,UAAA,gCAE1C+J,EAAA,SAAWA,EAAA,MAAQ,WAAM,UAAeA,EAAA,MAAQ,eAD7DjJ,EAWWC,EAAAsI,EAAA,GAAA;AAAA;YATR,MAAMU,EAAA,MAAQ,OAAO,MAAG,IAAA,YAAA;AAAA,UAAA;uBAEzB,MAMM;AAAA,cANNhG,EAMM,OANNwB,IAMM;AAAA,gBALJxB,EAA2E,gBAAlEhD,EAAAf,CAAA,EAAC,sBAAA,EAAA,OAAgC+J,QAAQ,OAAO,OAAK,CAAA,GAAA,CAAA;AAAA,gBAC9DhG,EAAuE,gBAA9DhD,EAAAf,CAAA,EAAC,oBAAA,EAAA,OAA8B+J,QAAQ,OAAO,KAAG,CAAA,GAAA,CAAA;AAAA,gBACzClK,EAAM,aAAvBiB,EAEcC,EAAAa,CAAA,GAAA;AAAA;kBAFe,MAAK;AAAA,kBAAK,SAAQ;AAAA,kBAAQ,SAAOwI;AAAA,gBAAA;6BAAgB,MAE5E;AAAA,wBADArJ,EAAAf,CAAA,EAAC,sBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;6BAKM+J,EAAA,cADbjJ,EAIEC,EAAAsI,EAAA,GAAA;AAAA;YAFA,MAAK;AAAA,YACJ,aAAaU,QAAQ,SAAShJ,EAAAf,CAAA,EAAC,eAAgB+J,EAAA,MAAQ,MAAM,EAAA;AAAA,UAAA;UAEjDG,EAAA,MAAK,KAAK,cAAzBpJ,EAAiFC,EAAAC,CAAA,GAAA;AAAA;YAAjD,QAAO;AAAA,UAAA;uBAAW,MAAqB;AAAA,kBAAlBkJ,EAAA,MAAK,KAAK,KAAK,GAAA,CAAA;AAAA,YAAA;;;UAEpE/I,EA+JUJ,EAAA4K,EAAA,GAAA;AAAA,wBA/JQtB,EAAA;AAAA,0DAAAA,EAAG,QAAA3H;AAAA,YAAG,OAAOiI,EAAA;AAAA,UAAA;uBAC7B,MAyBK;AAAA,cAzBKN,EAAA,UAAG,cAAb1J,KAAAC,EAyBK,MAzBL4E,IAyBK;AAAA,iBAxBH7E,EAAA,EAAA,GAAAC,EAeWK,GAAA,MAAAuD,EAfwB2G,GAAA,OAAK,CAAA,CAAtBG,GAAOtM,CAAK,wBAAkBsM,KAAK;AAAA,kBACnDvH,EAAoB,cAAbuH,CAAK,GAAA,CAAA;AAAA,yBACKtM,KAAK,YAAtB2B,KAAAC,EAAqD,YAAb5B,CAAK,GAAA,CAAA,gBACnBA,KAA1B2B,KAAAC,EAKK,MALL+I,IAKK;AAAA,4BAJH/I,EAGWK,GAAA,MAAAuD,EAH8BxF,EAAM,SAA5BD,GAAKwF,CAAI,GAAGlD,wBAA6BA,KAAK;AAAA,sBAC/DF,EAAmEJ,EAAAU,CAAA,GAAA;AAAA,wBAAzD,MAAK;AAAA,wBAAK,OAAM;AAAA,sBAAA;mCAAqB,MAAS;AAAA,8BAAN1C,CAAG,GAAA,CAAA;AAAA,wBAAA;;;sBACrDgF,EAAuB,gBAAdQ,CAAI,GAAA,CAAA;AAAA,oBAAA;yBAGjB5D,EAAA,GAAAC,EAKK,MALLgJ,IAKK;AAAA,qBAJHjJ,EAAA,EAAA,GAAAC,EAEaK,WAFoBjC,EAAM,MAAI,CAAzB4M,GAAKvK,YAAvBP,EAEaC,EAAAU,CAAA,GAAA;AAAA,sBAFiC,KAAKJ;AAAA,sBAAO,MAAK;AAAA,sBAAO,MAAK;AAAA,oBAAA;iCAAK,MAE9E;AAAA,4BADAuK,CAAG,GAAA,CAAA;AAAA,sBAAA;;;oBAEU5M,EAAM,cAArB8B,EAA+EC,EAAAC,CAAA,GAAA;AAAA;sBAAnD,MAAK;AAAA,sBAAK,MAAK;AAAA,oBAAA;iCAAS,MAAiB;AAAA,wBAAdO,EAAAC,EAAAxC,EAAM,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;gBAGtD,OAAO,KAAKkL,EAAA,MAAK,KAAK,OAAO,EAAE,eAA/CtJ,EAOWK,GAAA,EAAA,KAAA,KAAA;AAAA,kBANT8C,EAA+D,MAA/D+F,IAA+DtI,EAAzBT,EAAAf,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,kCACvC+D,EAAM,MAAA,MAAA,MAAA,EAAA;AAAA,0BACNnD,EAGWK,GAAA,MAAAuD,EAHuB0F,QAAK,KAAK,SAAO,CAAjClL,GAAO6M,wBAAkCA,KAAI;AAAA,oBAC7D9H,EAA+C,MAA/C+H,IAA+CtK,EAAZqK,CAAI,GAAA,CAAA;AAAA,oBACvC9H,EAAgD,MAAhDgI,IAAgDvK,EAAbxC,CAAK,GAAA,CAAA;AAAA,kBAAA;;oBAK9BqL,EAAA,UAAG,YAAnB1J,EAAA,GAAAC,EAgBM,OAhBNoL,IAgBM;AAAA,gBAfY9B,EAAA,MAAK,OAAO,2BAA5BpJ,EAAoFC,EAAAC,CAAA,GAAA;AAAA;kBAAhD,MAAK;AAAA,gBAAA;6BAAQ,MAAyB;AAAA,wBAAtBD,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;iBACrDW,EAAA,EAAA,GAAAC,EAaMK,GAAA,MAAAuD,EAbe0F,EAAA,MAAK,SAAdjL,YAAZ2B,EAaM,OAAA;AAAA,kBAb6B,KAAK3B,EAAM;AAAA,kBAAI,OAAM;AAAA,gBAAA;kBACtD8E,EAUM,OAVNkI,IAUM;AAAA,oBATJ9K,EAEaJ,EAAAU,CAAA,GAAA;AAAA,sBAFF,MAAMkH,GAAW1J,EAAM,QAAQ;AAAA,sBAAG,KAAA;AAAA,oBAAA;iCAAI,MAE/C;AAAA,4BADA8B,EAAAf,CAAA,EAAC,iBAAkBf,EAAM,QAAQ,EAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;oBAEnCkC,EAEYJ,EAAAC,CAAA,GAAA;AAAA,sBAFH,MAAK;AAAA,sBAAK,QAAO;AAAA,oBAAA;iCAAW,MAEnC;AAAA,4BADAnB,EAAM,OAAOZ,EAAM,KAAK,KAAKA,EAAM,KAAK,GAAA,CAAA;AAAA,sBAAA;;;oBAE1BA,EAAM,UAAK,cAA3B6B,EAEaC,EAAAU,CAAA,GAAA;AAAA;sBAF0B,MAAK;AAAA,sBAAU,MAAK;AAAA,oBAAA;iCAAK,MAE9D;AAAA,4BADAV,EAAAf,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;;kBAGLmB,EAA0CkG,IAAA;AAAA,oBAA1B,SAASpI,EAAM;AAAA,kBAAA;;oBAKtB2L,EAAA,cADb9J,EA+CWC,EAAA2C,EAAA,GAAA;AAAA,gBA7CR,KAAG,aAAe,OAAO2G,EAAA,KAAG,CAAA;AAAA,gBAC5B,MAAMG,EAAA;AAAA,gBACN,SAASO,GAAA;AAAA,gBACV,WAAQ;AAAA,gBACR,OAAA;AAAA,gBACC,SAASN,EAAA;AAAA,gBACT,oBAAkB,CAAA;AAAA,gBAClB,cAAY1J,EAAAf,CAAA,EAAC,mBAAA;AAAA,gBACb,eAAcwL;AAAA,cAAA;gBAEJ,YAAQ1H,EACjB,CAaO,EAdc,KAAAH,QAAG;AAAA,kBACZiH,EAAA,UAAW,YAAvBjK,KAAAC,EAaO,QAbPsL,IAaO;AAAA,oBAZL/K,EAUEJ,EAAAoL,EAAA,GAAA;AAAA,sBATC,KAAKxI,EAAI;AAAA,sBACT,KAAKA,EAAI,OAAG;AAAA,sBACZ,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACT,KAAI;AAAA,sBACJ,QAAO;AAAA,sBACP,SAAA;AAAA,sBACC,iBAAe5C,EAAAf,CAAA,EAAC,gBAAA;AAAA,sBACjB,OAAM;AAAA,oBAAA;oBAER+D,EAAqD,QAArDqI,IAAqD5K,EAAjBmC,EAAI,GAAG,GAAA,CAAA;AAAA,kBAAA,OAE7ChD,EAAA,GAAAC,EAA4D,QAA5DyL,IAA4D7K,EAAjBmC,EAAI,GAAG,GAAA,CAAA;AAAA,kBACnCA,EAAI,iBAAnB7C,EAECC,EAAAC,CAAA,GAAA;AAAA;oBAF4B,MAAK;AAAA,oBAAK,MAAK;AAAA,oBAAQ,OAAM;AAAA,kBAAA;+BAAqB,MAC3E;AAAA,wBAD2E,QAC3EQ,EAAGmC,EAAI,QAAQ,GAAA,CAAA;AAAA,oBAAA;;;kBAEJA,EAAI,cAAnB7C,EAA2EC,EAAAC,CAAA,GAAA;AAAA;oBAAjD,MAAK;AAAA,oBAAK,MAAK;AAAA,kBAAA;+BAAS,MAAe;AAAA,sBAAZO,EAAAC,EAAAmC,EAAI,KAAK,GAAA,CAAA;AAAA,oBAAA;;;;gBAErD,eAAWG,EACpB,CAEa,EAHW,KAAAH,QAAG;AAAA,kBACXA,EAAI,WAAM,aAA1B7C,EAEaC,EAAAU,CAAA,GAAA;AAAA;oBAFyB,MAAMyC,GAAWP,EAAI,MAAM;AAAA,oBAAG,MAAK;AAAA,kBAAA;+BAAK,MAE5E;AAAA,sBADApC,EAAAC,EAAAmC,EAAI,MAAM,GAAA,CAAA;AAAA,oBAAA;;wCAESA,EAAI,gBAAzB7C,EAAsEC,EAAAU,CAAA,GAAA;AAAA;oBAApC,MAAK;AAAA,oBAAS,MAAK;AAAA,kBAAA;+BAAK,MAAC,CAAA,GAAAoC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,wBAAD,KAAC,EAAA;AAAA,oBAAA;;8BAC3D/C,EAA4EC,EAAAC,CAAA,GAAA;AAAA;oBAA5D,MAAK;AAAA,oBAAK,MAAK;AAAA,kBAAA;+BAAQ,MAA2B;AAAA,0BAAxBD,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;gBAElC,cAAU8D,EAAW,CAAe,EAAtB,KAAAH,QAAG;AAAA,kBAAOpC,EAAAC,EAAAyJ,GAAKtH,CAAG,CAAA,GAAA,CAAA;AAAA,gBAAA;gBAChC,YAAQG,EACjB,CAEY,EAHS,KAAAH,QAAG;AAAA,kBACTA,EAAI,QAAG,QAAaA,EAAI,SAAI,cAA3C7C,EAEYC,EAAAC,CAAA,GAAA;AAAA;oBAF2C,MAAK;AAAA,oBAAK,MAAK;AAAA,kBAAA;+BAAS,MAE7E;AAAA,0BADAD,EAAAf,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;8BAEHY,EAA+CK,GAAA,EAAA,KAAA,KAAA;AAAA,oBAA3BM,EAAAC,EAAAmC,EAAI,OAAG,EAAA,GAAA,CAAA;AAAA,kBAAA;;;qEAIf0G,EAAA,UAAG,eAAnB1J,EAAA,GAAAC,EAoCM,OApCN0L,IAoCM;AAAA,gBAnCYpC,EAAA,MAAK,KAAK,QAAQ,2BAAlCpJ,EAEYC,EAAAC,CAAA,GAAA;AAAA;kBAF8B,MAAK;AAAA,gBAAA;6BAAQ,MAErD;AAAA,wBADAD,EAAAf,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;wBAEHY,EA+BMK,GAAA,MAAAuD,EA9BqB0F,QAAK,KAAK,SAAO,CAAlCmB,GAAOhK,YADjBT,EA+BM,OAAA;AAAA,kBA7BH,KAAKS;AAAA,kBACN,OAAM;AAAA,gBAAA;kBAEN0C,EAKM,OALNwI,IAKM;AAAA,oBAJJpL,EAEYJ,EAAAC,CAAA,GAAA;AAAA,sBAFH,MAAK;AAAA,sBAAK,QAAO;AAAA,oBAAA;iCAAW,MAEnC;AAAA,wBADAO,EAAAC,EAAAT,EAAAf,CAAA,iCAAiCqB,IAAK,EAAA,CAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;qBAExCV,EAAA,EAAA,GAAAC,EAAiFK,GAAA,MAAAuD,EAAxD6G,EAAM,QAAdmB,YAAjB1L,EAAiFC,EAAAU,CAAA,GAAA;AAAA,sBAA1C,KAAK+K;AAAA,sBAAM,MAAK;AAAA,oBAAA;iCAAK,MAAU;AAAA,4BAAPA,CAAI,GAAA,CAAA;AAAA,sBAAA;;;;kBAEtDnB,EAAM,cAArBvK,EAECC,EAAAC,CAAA,GAAA;AAAA;oBAF2B,MAAK;AAAA,oBAAK,MAAK;AAAA,kBAAA;+BACxC,MAA4B;AAAA,sBAAzBO,EAAAC,EAAAT,EAAAf,CAAA,EAAC,mBAAA,CAAA,IAAwB,MAACwB,EAAG6J,EAAM,KAAK,GAAA,CAAA;AAAA,oBAAA;;;mBAE9C1K,EAAA,EAAA,GAAAC,EAeWK,WAf0BoK,EAAM,SAAK,CAAA,GAAA,CAA9BoB,GAAMC,wBAAsCA,KAAQ;AAAA,oBACrDD,EAAK,QAAQ,eAA5B3L,EAGCC,EAAAC,CAAA,GAAA;AAAA;sBAHmC,MAAK;AAAA,sBAAK,MAAK;AAAA,oBAAA;iCAChD,MAAe;AAAA,wBAAZO,EAAAC,EAAAiL,EAAK,IAAI,IAAG,QAAGjL,EAAGT,EAAAf,CAAA,EAAC,sBAAA,CAAA,IAA2B,MAClDwB,EAAGiL,EAAK,QAAQ,KAAI,IAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;oBAEPA,EAAK,YAAY,eAAhC3L,EAGCC,EAAAC,CAAA,GAAA;AAAA;sBAHuC,MAAK;AAAA,sBAAK,MAAK;AAAA,oBAAA;iCACpD,MAAe;AAAA,wBAAZO,EAAAC,EAAAiL,EAAK,IAAI,IAAG,QAAGjL,EAAGT,EAAAf,CAAA,EAAC,yBAAA,CAAA,IAA8B,MACrDwB,EAAGiL,EAAK,YAAY,KAAI,IAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;qBAGjBA,EAAK,QAAQ,WAAWA,EAAK,YAAY,eADlD3L,EAKCC,EAAAC,CAAA,GAAA;AAAA;sBAHC,MAAK;AAAA,sBACL,MAAK;AAAA,oBAAA;iCACJ,MAAe;AAAA,wBAAZO,EAAAC,EAAAiL,EAAK,IAAI,IAAG,UAAM1L,EAAAf,CAAA,EAAC,sBAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;;kBAGhBqL,EAAM,UAAjB1K,EAAA,GAAAC,EAAuF,OAAvF+L,IAAuFnL,EAA7BwJ,GAAOK,EAAM,MAAM,CAAA,GAAA,CAAA;;0BAIjFvK,EAyBWC,EAAA2C,EAAA,GAAA;AAAA,gBAvBR,KAAK,OAAO2G,EAAA,KAAG;AAAA,gBACf,MAAMC,EAAA;AAAA,gBACN,SAASQ,GAAA;AAAA,gBACV,WAAQ;AAAA,gBACR,OAAA;AAAA,gBACC,SAASP,EAAA;AAAA,gBACT,oBAAkB,CAAA;AAAA,gBAClB,cAAYxJ,EAAAf,CAAA,EAAC,eAAA;AAAA,gBACb,eAAcuL;AAAA,cAAA;gBAEJ,YAAQzH,EACjB,CAA4D,EADvC,KAAAH,QAAG;AAAA,kBACxBI,EAA4D,QAA5D6I,IAA4DpL,EAAxBmC,EAAI,OAAG,GAAA,GAAA,CAAA;AAAA,gBAAA;gBAElC,eAAWG,EACpB,CAEa,EAHW,KAAAH,QAAG;AAAA,kBACXA,EAAI,WAAM,aAA1B7C,EAEaC,EAAAU,CAAA,GAAA;AAAA;oBAFyB,MAAMyC,GAAWP,EAAI,MAAM;AAAA,oBAAG,MAAK;AAAA,kBAAA;+BAAK,MAE5E;AAAA,sBADApC,EAAAC,EAAAmC,EAAI,MAAM,GAAA,CAAA;AAAA,oBAAA;;;;gBAGH,mBAAeG,EACxB,CAEa,EAHe,KAAAH,QAAG;AAAA,kBACfA,EAAI,mBAApB7C,EAEaC,EAAAU,CAAA,GAAA;AAAA;oBAFoB,MAAMoJ,GAAUlH,EAAI,UAAU,KAAA;AAAA,oBAAa,MAAK;AAAA,kBAAA;+BAAK,MAEpF;AAAA,0BADA5C,EAAAf,CAAA,EAAC,aAAc2D,EAAI,UAAU,EAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;;;;;;oBAlLvC7C,EAA2CC,EAAAc,EAAA,GAAA;AAAA;UAAX,MAAM;AAAA,QAAA;;;;;qEC9Y7BgL,KAAsD;AAAA,EACjE,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa;AAAA,EACb,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,aAAa;AAAA,EACb,cAAc;AAAA,EACd,MAAM;AAAA,EACN,cAAc;AAAA,EACd,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,mBAAmB;AACrB,GAEaC,KAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAGaC,KAAoC,CAAC,IAAI,GAGzCC,KAAsD;AAAA,EACjE,KAAK,CAAC,YAAY,MAAM,SAAS,QAAQ;AAAA,EACzC,MAAM,CAAC,YAAY,MAAM,SAAS,QAAQ;AAAA,EAC1C,QAAQ,CAAC,MAAM,MAAM,MAAM,OAAO;AAAA,EAClC,QAAQ,CAAC,MAAM,MAAM,MAAM,OAAO;AAAA,EAClC,MAAM,CAAC,OAAO,IAAI;AAAA,EAClB,QAAQ,CAAC,IAAI;AACf,GAGaC,KAA8B,CAAC,YAAY,MAAM,MAAM,IAAI,GAE3DC,KAAU,CAAC,QAAQ,WAAW,YAAY,MAAM,8CCXvDC,KAAU;;;;;;AAVhB,UAAMtN,IAAQC,GAERC,IAAM3B,GAAewB,IAAU;AACrC,IAAAF,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7B4C,IAAQ5C,GAAa,YAAY,GACjCC,IAAUC,GAAA,GACViN,IAAQC,GAAA,GAIRxO,IAAM0B,EAAqB,IAAI,GAC/B0F,IAAQ1F,EAAI,EAAK,GACjBmG,IAAOnG,EAAoC,IAAI,GAC/CwC,IAAUxC,EAAI,EAAK,GACnB+M,IAAS/M,EAAmB,IAAI,GAChCgN,IAAShN,EAA4B,EAAE,GAEvCiN,IAASjN,EAAmB,IAAI,GAChCkN,IAAYlN,EAAmB,IAAI,GACnCmN,IAAQnN,EAAmB,IAAI,GAC/B9B,IAAU8B,EAAwB,EAAE;AAC1C,QAAIoN,IAAmB,EAAE,MAAM,GAAG,SAAS,IAAI,MAAM,MAAM,QAAQ,GAAA;AAEnE,UAAMC,IAAUrN,EAAsBsN,GAAS;AAE/C,aAASA,IAA4B;AACnC,UAAI;AACF,cAAMC,IAAiB,KAAK,MAAM,OAAO,aAAa,QAAQX,EAAO,KAAK,MAAM;AAEhF,YAAI,MAAM,QAAQW,CAAK,GAAG;AACxB,gBAAMC,IAAQD,EAAM,OAAO,CAAC/O,MAA+BA,KAAO8N,EAAW;AAE7E,cAAIkB,EAAM,OAAQ,QAAOA;AAAA,QAC3B;AAAA,MACF,QAAQ;AAAA,MAER;AAEA,aAAO,CAAC,GAAGjB,EAAe;AAAA,IAC5B;AAEA,IAAAtJ,GAAMoK,GAAS,CAACI,MAAS;AACvB,UAAI;AACF,eAAO,aAAa,QAAQb,IAAS,KAAK,UAAUa,CAAI,CAAC;AAAA,MAC3D,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAED,UAAMC,IAAS,OAAO,KAAKpB,EAAW,GAEhCqB,IAAgBhM;AAAA,MAAS,MAC7B+L,EAAO,IAAI,CAAClP,OAAS,EAAE,OAAOA,GAAK,OAAOiB,EAAE,cAAcjB,CAAG,EAAE,IAAI;AAAA,IAAA,GAG/DoP,IAAejM;AAAA,MAAS,MAC5B+L,EACG,OAAO,CAAClP,MAAQ,CAACgO,GAAgB,SAAShO,CAAG,CAAC,EAC9C,IAAI,CAACA,OAAS,EAAE,OAAOA,GAAK,OAAOiB,EAAE,cAAcjB,CAAG,EAAE,IAAI;AAAA,IAAA,GAG3DD,IAAUoD;AAAA,MAAsC;AAAA;AAAA,QAEpD+L,EACG,OAAO,CAAClP,MAAQ6O,EAAQ,MAAM,SAAS7O,CAAG,CAAC,EAC3C,IAAI,CAACA,OAAS;AAAA,UACb,KAAAA;AAAA,UACA,OAAOiB,EAAE,cAAcjB,CAAG,EAAE;AAAA,UAC5B,UAAU,CAACgO,GAAgB,SAAShO,CAAG;AAAA,UACvC,UAAU8N,GAAY9N,CAAG,MAAM,SAAS8N,GAAY9N,CAAG,MAAM,SAAS,MAAM;AAAA,UAC5E,OAAO8N,GAAY9N,CAAG,MAAM,WAAW,UAAU;AAAA,QAAA,EACjD;AAAA;AAAA,IAAA,GAGAqP,IAAgBlM,EAAS,MAAM;AAAA,MACnC,GAAG,CAAC,OAAO,OAAO,OAAO,KAAK,EAAE,IAAI,CAAClD,OAAW,EAAE,OAAAA,GAAO,OAAOA,IAAQ;AAAA,MACxE,EAAE,OAAO,QAAQ,OAAOgB,EAAE,kBAAkB,EAAA;AAAA,IAAE,CAC/C,GAEKqO,IAAmBnM,EAAS,MAAM;AAAA,MACtC,EAAE,OAAO,KAAK,OAAOlC,EAAE,oBAAoB,EAAA;AAAA,MAC3C,EAAE,OAAO,KAAK,OAAOA,EAAE,mBAAmB,EAAA;AAAA,IAAE,CAC7C,GAEKsO,IAAepM;AAAA,MAAS,MAC5B,OAAO,QAAQqL,EAAO,KAAK,EAAE,IAAI,CAAC,CAACvO,GAAOsM,CAAK,OAAO,EAAE,OAAAtM,GAAO,OAAAsM,IAAQ;AAAA,IAAA,GAGnE1D,KAAe1F;AAAA,MACnB,MACE,CAACsL,EAAO,OAAOC,EAAU,OAAOC,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,SAC7DjP,EAAQ,MAAM,OAAO8P,EAAQ,EAAE;AAAA,IAAA,GAG7BtQ,KAAQiE,EAAyB,OAAO;AAAA,MAC5C,QAAQsL,EAAO;AAAA,MACf,WAAWC,EAAU,UAAU,OAAO,OAAOA,EAAU,UAAU;AAAA,MACjE,OAAOC,EAAM;AAAA,MACb,SAASjP,EAAQ,MAAM,OAAO8P,EAAQ;AAAA,IAAA,EACtC;AAEF,aAASA,GAASpQ,GAAmC;AACnD,aAAO,CAAC8O,GAAW,SAAS9O,EAAO,EAAE,MAAMA,EAAO,SAAS,IAAI,KAAA,MAAW;AAAA,IAC5E;AAEA,aAASkF,GAAKrE,GAAsE;AAClF,aAAO,OAAOA,KAAU,YAAYA,MAAU,KAAKA,IAAQ;AAAA,IAC7D;AAEA,aAASwP,GAAW7M,GAAuB;AACzC,aAAOqL,GAAWH,GAAYlL,CAAK,CAAC,EAAE,IAAI,CAAC8M,OAAQ,EAAE,OAAOA,GAAI,OAAOzO,EAAE,WAAWyO,CAAE,EAAE,IAAI;AAAA,IAC9F;AAEA,aAASC,KAAkB;AACzB,MAAAjQ,EAAQ,QAAQ,CAAC,GAAGA,EAAQ,OAAO,EAAE,OAAO,SAAS,IAAI,SAAS;AAAA,IACpE;AAEA,aAASkQ,GAAStN,GAAerC,GAA6D;AAC5F,YAAM2C,IAAQ0B,GAAKrE,CAAK;AAExB,MAAK2C,MAELlD,EAAQ,QAAQA,EAAQ,MAAM;AAAA,QAAI,CAACN,GAAQyQ,OACzCA,OAAOvN,IAAQ,EAAE,OAAAM,GAAO,IAAIqL,GAAWH,GAAYlL,CAAK,CAAC,EAAE,CAAC,GAAI,OAAO,OAAOxD;AAAA,MAAA;AAAA,IAElF;AAEA,aAAS0Q,GAAMxN,GAAerC,GAA6D;AACzF,YAAMyP,IAAKpL,GAAKrE,CAAK;AAErB,MAAIyP,MACFhQ,EAAQ,QAAQA,EAAQ,MAAM,IAAI,CAACN,GAAQyQ,OAAQA,OAAOvN,IAAQ,EAAE,GAAGlD,GAAQ,IAAAsQ,EAAA,IAAOtQ,CAAO;AAAA,IACjG;AAEA,aAAS2Q,GAASzN,GAAerC,GAAqB;AACpD,MAAAP,EAAQ,QAAQA,EAAQ,MAAM,IAAI,CAACN,GAAQyQ,MAAQA,MAAOvN,IAAQ,EAAE,GAAGlD,GAAQ,OAAAa,EAAA,IAAUb,CAAO;AAAA,IAClG;AAEA,aAAS4Q,GAAa1N,GAAqB;AACzC,MAAA5C,EAAQ,QAAQA,EAAQ,MAAM,OAAO,CAACuQ,GAAGJ,MAAOA,MAAOvN,CAAK;AAAA,IAC9D;AAEA,aAAS4N,GAAWjB,GAAuB;AACzC,YAAMzL,IAAOyL,EAAK,OAAO,CAACjP,MAA+B,OAAOA,CAAG,KAAK8N,EAAW;AAGnF,MAAAe,EAAQ,QAAQrL,EAAK,SAASA,IAAO,CAAC,KAAK;AAAA,IAC7C;AAEA,UAAMsF,IAAmC;AAAA,MACvC,GAAK;AAAA,MACL,GAAK;AAAA,MACL,GAAK;AAAA,MACL,GAAK;AAAA,IAAA;AAGP,aAAS3D,EAAWlF,GAA2B;AAC7C,aAAO6I,EAAM,OAAO7I,KAAS,EAAE,EAAE,OAAO,CAAC,CAAC,KAAK;AAAA,IACjD;AAEA,aAASuF,EAAKvF,GAAwB;AACpC,aAAOA,KAAU,QAA+BA,MAAU,KAAK,MAAM,OAAOA,CAAK;AAAA,IACnF;AAEA,mBAAesE,EAAKqE,IAAoBgG,GAAqB;AAG3D,UAFAA,IAAOhG,GAEH9I,EAAI,UAAU,MAElB;AAAA,QAAAkE,EAAQ,QAAQ;AAEhB,YAAI;AACF,UAAA2D,EAAK,QAAQ,MAAM3G,EAAI,MAAMlB,EAAI,MAAM,IAAI;AAAA,YACzC,GAAGZ,GAAM;AAAA,YACT,QAAQ0J,EAAM;AAAA,YACd,MAAMA,EAAM,OAAO,GAAGA,EAAM,KAAK,UAAU,SAAS,MAAM,EAAE,GAAGA,EAAM,KAAK,GAAG,KAAK;AAAA,YAClF,MAAMA,EAAM;AAAA,YACZ,UAAUA,EAAM;AAAA,UAAA,CACjB;AAAA,QACH,SAASjH,GAAO;AACd,UAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,QAC7B,UAAA;AACE,UAAAqC,EAAQ,QAAQ;AAAA,QAClB;AAAA;AAAA,IACF;AAEA,aAASmM,IAAiB;AACxB,MAAIrQ,EAAI,UAAU,QAElB,OAAO,SAAS;AAAA,QACdkB,EAAI;AAAA,UACFlB,EAAI,MAAM;AAAA,UACV,EAAE,GAAGZ,GAAM,OAAO,QAAQ0P,EAAK,OAAA;AAAA,UAC/B7O,EAAQ,MAAM,IAAI,CAACuF,MAAWA,EAAO,GAAG;AAAA,QAAA;AAAA,MAC1C;AAAA,IAEJ;AAEA,WAAAb,GAAMvF,IAAO;AAAM,MAAKqF,EAAK,EAAE,GAAGqK,GAAM,MAAM,EAAA,CAAG;AAAA,OAAG,EAAE,MAAM,IAAM,GAElElN,GAAU,YAAY;AACpB,UAAI;AAGF,YAFA5B,EAAI,SAAS,MAAMkB,EAAI,OAAA,GAAU,SAE7BlB,EAAI,UAAU,MAAM;AACtB,gBAAM2I,IAAS,MAAMzH,EAAI,OAAOlB,EAAI,MAAM,EAAE;AAC5C,UAAA0O,EAAO,QAAQ,OAAO,YAAY/F,EAAO,IAAI,CAAC7D,MAAQ,CAACA,EAAI,IAAIA,EAAI,KAAK,CAAC,CAAC;AAAA,QAC5E;AAAA,MACF,SAASjD,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAuF,EAAM,QAAQ;AAAA,MAChB;AAEA,MAAK3C,EAAA;AAAA,IACP,CAAC,mBAICxC,EAqJe2C,IAAA;AAAA,MArJA,MAAM5D,EAAM;AAAA,MAAM,SAAQ;AAAA,IAAA;iBACvC,MAEY;AAAA,QAFGoG,EAAA,SAASpH,EAAA,UAAG,aAA3BiC,EAEYC,EAAAC,CAAA,GAAA;AAAA;UAF0B,MAAK;AAAA,UAAQ,OAAM;AAAA,QAAA;qBAAuB,MAE9E;AAAA,gBADAD,EAAAf,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;oBAGHc,EAsIWC,EAAA2C,EAAA,GAAA;AAAA;UApIR,MAAMgD,EAAA;AAAA,UACN,SAAS5H,EAAA;AAAA,UACV,WAAQ;AAAA,UACR,YAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACC,SAASiE,EAAA,SAAO,CAAKkD,EAAA;AAAA,UACrB,oBAAkB,CAAA,IAAA,KAAA,GAAA;AAAA,UAClB,sBAAoBlF,EAAAf,CAAA,EAAC,iBAAA;AAAA,UACrB,iBAAe4H,GAAA;AAAA,UACf,iBAAe7G,EAAA8B,CAAA,EAAK,eAAA;AAAA,UACpB,iBAAe;AAAA,UACf,cAAY9B,EAAAf,CAAA,EAAC,YAAA;AAAA,UACb,eAAcsD;AAAA,UACd,6BAAYK,MAAS2J,UAAS3J,EAAI;AAAA,QAAA;UAExB,SACT,MAEY;AAAA,YAFG9E,EAAA,cAAfiC,EAEYC,EAAAC,CAAA,GAAA;AAAA;cAFQ,MAAK;AAAA,cAAK,MAAK;AAAA,YAAA;yBAAQ,MAEzC;AAAA,gBADAO,EAAAC,EAAAT,EAAAf,CAAA,4BAA4Be,EAAAqM,CAAA,EAAM,MAAMvO,EAAA,MAAI,WAAW,GAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAIhD,WACT,MAWa;AAAA,YAXbsC,EAWaJ,EAAAkH,EAAA,GAAA;AAAA,cAXA,OAAOlH,EAAAf,CAAA,EAAC,cAAA;AAAA,cAAkB,OAAM;AAAA,YAAA;cAChC,WACT,MAAsF;AAAA,gBAAtFmB,EAAsFJ,EAAAa,CAAA,GAAA;AAAA,kBAA3E,MAAK;AAAA,kBAAK,SAAQ;AAAA,kBAAO,MAAK;AAAA,gBAAA;6BAAU,MAAuB;AAAA,wBAApBb,EAAAf,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;yBAEzD,MAME;AAAA,gBANFmB,EAMEJ,EAAAoO,EAAA,GAAA;AAAA,kBALC,eAAavB,EAAA;AAAA,kBACb,SAASM,EAAA;AAAA,kBACV,MAAK;AAAA,kBACL,OAAM;AAAA,kBACL,uBAAoBe;AAAA,gBAAA;;;;YAGzB9N,EAEcJ,EAAAa,CAAA,GAAA;AAAA,cAFH,MAAK;AAAA,cAAK,SAAQ;AAAA,cAAO,MAAK;AAAA,cAAY,WAAW/C,EAAA;AAAA,cAAM,SAAOqQ;AAAA,YAAA;yBAAU,MAErF;AAAA,oBADAnO,EAAAf,CAAA,EAAC,aAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAIM,WACT,MAgEM;AAAA,YAhEN+D,EAgEM,OAhENlD,IAgEM;AAAA,cA/DJM,EAMEJ,EAAA6C,EAAA,GAAA;AAAA,gBALC,eAAa4J,EAAA;AAAA,gBACb,SAASY,EAAA;AAAA,gBACT,aAAarN,EAAAf,CAAA,EAAC,iBAAA;AAAA,gBACf,WAAA;AAAA,gBACC,uBAAkB6D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAE8K,EAAA,QAASnK,GAAKX,CAAM;AAAA,cAAA;cAE3CvB,EAMEJ,EAAA6C,EAAA,GAAA;AAAA,gBALC,eAAa6J,EAAA;AAAA,gBACb,SAASY,EAAA;AAAA,gBACT,aAAatN,EAAAf,CAAA,EAAC,oBAAA;AAAA,gBACf,WAAA;AAAA,gBACC,uBAAkB6D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAE+K,EAAA,QAAYpK,GAAKX,CAAM;AAAA,cAAA;cAE9CvB,EAOEJ,EAAA6C,EAAA,GAAA;AAAA,gBANC,eAAa8J,EAAA;AAAA,gBACb,SAASY,EAAA;AAAA,gBACT,aAAavN,EAAAf,CAAA,EAAC,gBAAA;AAAA,gBACf,WAAA;AAAA,gBACA,YAAA;AAAA,gBACC,uBAAkB6D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAEgL,EAAA,QAAQrK,GAAKX,CAAM;AAAA,cAAA;eAG1C/B,EAAA,EAAA,GAAAC,EAmCMK,GAAA,MAAAuD,EAnCyB/F,EAAA,OAAO,CAAzBN,GAAQkD,YAArBT,EAmCM,OAAA;AAAA,gBAnCmC,KAAKS;AAAA,gBAAO,OAAM;AAAA,cAAA;gBACzDF,EAMEJ,EAAA6C,EAAA,GAAA;AAAA,kBALC,eAAazF,EAAO;AAAA,kBACpB,SAASgQ,EAAA;AAAA,kBACV,YAAA;AAAA,kBACA,MAAK;AAAA,kBACJ,uBAAkB,CAAAzL,OAAEiM,GAAStN,GAAOqB,EAAM;AAAA,gBAAA;gBAE7CvB,EAKEJ,EAAA6C,EAAA,GAAA;AAAA,kBAJC,eAAazF,EAAO;AAAA,kBACpB,SAASqQ,GAAWrQ,EAAO,KAAK;AAAA,kBACjC,MAAK;AAAA,kBACJ,uBAAkB,CAAAuE,OAAEmM,GAAMxN,GAAOqB,EAAM;AAAA,gBAAA;gBAGlC3B,EAAAkM,EAAA,EAAW,SAAS9O,EAAO,EAAE,KAAK4C,EAAA8L,EAAA,EAAY1O,EAAO,KAAK,MAAA,iBADlE2C,EAMEC,EAAA6C,EAAA,GAAA;AAAA;kBAJC,eAAazF,EAAO,SAAK;AAAA,kBACzB,SAAS4C,EAAAmM,EAAA,EAAQ,IAAG,CAAElO,QAAK,EAAQ,OAAAA,IAAK,OAAS+B,EAAAf,CAAA,EAAC,eAAgBhB,EAAK,EAAA,IAAA;AAAA,kBACxE,MAAK;AAAA,kBACJ,+BAAoB8P,GAASzN,GAAOgC,GAAKX,EAAM,KAAA,EAAA;AAAA,gBAAA,kEAGrC3B,EAAAkM,EAAA,EAAW,SAAS9O,EAAO,EAAE,UAD1C2C,EAMEC,EAAAsF,EAAA,GAAA;AAAA;kBAJC,eAAalI,EAAO,SAAK;AAAA,kBACzB,aAAa4C,EAAAf,CAAA,EAAC,YAAA;AAAA,kBACf,MAAK;AAAA,kBACJ,+BAAoB8O,GAASzN,GAAO,OAAOqB,MAAM,EAAA,CAAA;AAAA,gBAAA;gBAEpDvB,EAMEJ,EAAAa,CAAA,GAAA;AAAA,kBALA,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACJ,cAAYb,EAAAf,CAAA,EAAC,oBAAA;AAAA,kBACb,SAAK,CAAA0C,OAAEqM,GAAa1N,CAAK;AAAA,gBAAA;;cAI9BF,EAEcJ,EAAAa,CAAA,GAAA;AAAA,gBAFH,MAAK;AAAA,gBAAK,SAAQ;AAAA,gBAAO,MAAK;AAAA,gBAAQ,SAAO8M;AAAA,cAAA;2BAAW,MAEjE;AAAA,sBADA3N,EAAAf,CAAA,EAAC,iBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;UAKiBwE,EAAAoJ,EAAA,QAAP7O;0BAAoCA,CAAG;AAAA,YACtD,IAAA+E,EAAA,CAKC,EAN6D,KAAAH,QAAG;AAAA,cAEzD5C,EAAA8L,EAAA,EAAY9N,CAAG,MAAA,YAAkB4E,EAAI5E,CAAG,MAAA,aADhD+B,EAKCC,EAAAU,CAAA,GAAA;AAAA;gBAHE,MAAMyC,EAAWP,EAAI5E,CAAG,CAAA;AAAA,gBACzB,MAAK;AAAA,cAAA;2BACJ,MAAc;AAAA,kBAAXwC,EAAAC,EAAAmC,EAAI5E,CAAG,CAAA,GAAA,CAAA;AAAA,gBAAA;;oCAEOgC,EAAA8L,EAAA,EAAY9N,CAAG,MAAA,iBAAnC+B,EAEYC,EAAAC,CAAA,GAAA;AAAA;gBAFuC,MAAK;AAAA,gBAAK,MAAK;AAAA,cAAA;2BAAS,MAEzE;AAAA,sBADAD,EAAAf,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;oBAEkBe,EAAA8L,EAAA,EAAY9N,CAAG,MAAA,eAApC6B,EAEaK,GAAA,EAAA,KAAA,KAAA;AAAA,gBADXM,EAAAC,EAAAmC,EAAI5E,CAAG,IAAIgC,EAAAf,CAAA,gBAAgBe,EAAAf,CAAA,EAAC,SAAA,CAAA,GAAA,CAAA;AAAA,cAAA,UAETe,EAAA8L,EAAA,EAAY9N,CAAG,MAAA,iBAApC6B,EAEaK,GAAA,EAAA,KAAA,KAAA;AAAA,oBADXF,EAAAf,CAAA,EAAC,eAAgB2D,EAAI5E,CAAG,CAAA,EAAA,CAAA,GAAA,CAAA;AAAA,cAAA,UAELA,MAAG,YAAiB4E,EAAI,SAAM,UAAnD7C,EAEaC,EAAAU,CAAA,GAAA;AAAA;gBAF4C,MAAK;AAAA,gBAAU,MAAK;AAAA,cAAA;2BAAK,MAEhF;AAAA,kBADAF,EAAAC,EAAAmC,EAAI,MAAM,GAAA,CAAA;AAAA,gBAAA;;gCAEZ/C,EAES,QAAA;AAAA;gBAFK,OAAKwG,GAAA,EAAA,wBAA4BrG,EAAA8L,EAAA,EAAY9N,CAAG,MAAA,MAAA,CAAA;AAAA,cAAA,KAC5DwF,EAAKZ,EAAI5E,CAAG,CAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;QAMVF,EAAA,cADRiC,EAOEsO,IAAA;AAAA;UALC,KAAKvQ,EAAA,MAAI;AAAA,UACT,MAAMgB,EAAM;AAAA,UACZ,WAASyN,EAAA;AAAA,UACT,QAAQC,EAAA;AAAA,UACR,gCAAOD,EAAA,QAAM;AAAA,QAAA;;;;;;;;;;;;;AC/YpB,UAAMzN,IAAQC,GAERC,IAAM3B,GAAewB,IAAU;AACrC,IAAAF,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEVkP,IAA+B,CAAC,OAAO,SAAS,YAAY,GAG5DC,IAAO/O,EAAyB8O,EAAM,KAAK,CAACrI,MAAQnH,EAAM,IAAImH,CAAG,IAAI,CAAC,KAAK,KAAK,GAChFR,IAASjG,EAAyB,IAAI,GACtCmG,IAAOnG,EAAI,CAAC,GACZkG,IAAOlG,EAAI,EAAK,GAChBC,IAAUD,EAAmB,IAAI,GAEjCgP,IAAUrN;AAAA,MAAS,MACvBmN,EAAM,IAAI,CAACrQ,OAAW;AAAA,QACpB,OAAAA;AAAA,QACA,OAAO,GAAGgB,EAAE,aAAahB,CAAK,EAAE,CAAC,MAAMa,EAAM,IAAIb,CAAK,CAAC;AAAA,QACvD,UAAUa,EAAM,IAAIb,CAAK,MAAM;AAAA,MAAA,EAC/B;AAAA,IAAA;AAGJ,mBAAesE,EAAKf,IAAO,GAAkB;AAC3C,MAAA/B,EAAQ,QAAQ;AAEhB,UAAI;AACF,cAAMsC,IAAS,MAAM/C,EAAI,cAAc;AAAA,UACrC,MAAMF,EAAM;AAAA,UACZ,IAAIA,EAAM;AAAA,UACV,MAAMyP,EAAK;AAAA,UACX,OAAOzP,EAAM,IAAI;AAAA,UACjB,MAAM0C;AAAA,UACN,UAAU;AAAA,QAAA,CACX;AAED,QAAAiE,EAAO,QAAQjE,MAAS,IAAIO,EAAO,OAAO,CAAC,GAAI0D,EAAO,SAAS,CAAA,GAAK,GAAG1D,EAAO,IAAI,GAClF4D,EAAK,QAAQ5D,EAAO,cACpB2D,EAAK,QAAQ3D,EAAO,eAAeA,EAAO;AAAA,MAC5C,SAASpC,GAAO;AACd,QAAAF,EAAQ,QAAQN,EAAQQ,CAAK;AAAA,MAC/B;AAAA,IACF;AAEA,WAAA8C;AAAA,MACE8L;AAAA,MACA,MAAM;AACJ,QAAA9I,EAAO,QAAQ,MACVlD,EAAA;AAAA,MACP;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,cAKlB3C,EAAA,GAAAC,EAgBM,OAhBNC,IAgBM;AAAA,MAfJM,EAA4FJ,EAAAyI,EAAA,GAAA;AAAA,oBAArE8F,EAAA;AAAA,sDAAAA,EAAI,QAAA5M;AAAA,QAAG,SAAS6M,EAAA;AAAA,QAAS,MAAK;AAAA,QAAM,cAAYxO,EAAAf,CAAA,EAAC,cAAA;AAAA,MAAA;MAEzDQ,EAAA,cAAfM,EAAuEC,EAAAC,CAAA,GAAA;AAAA;QAA/C,MAAK;AAAA,QAAK,MAAK;AAAA,MAAA;mBAAS,MAAa;AAAA,cAAVR,EAAA,KAAO,GAAA,CAAA;AAAA,QAAA;;YACjCgG,EAAA,cAEzB5F,EASWK,GAAA,EAAA,KAAA,KAAA;AAAA,gBARTL,EAKMK,GAAA,MAAAuD,EALegC,EAAA,OAAM,CAAfvH,YAAZ2B,EAKM,OAAA;AAAA,UALwB,KAAK3B,EAAM;AAAA,UAAI,OAAM;AAAA,QAAA;UAClCA,EAAM,YAArB6B,EAEYC,EAAAO,EAAA,GAAA;AAAA;YAFe,MAAMrC,EAAM;AAAA,YAAK,QAAO;AAAA,YAAS,OAAM;AAAA,UAAA;uBAAwB,MAExF;AAAA,cADAsC,EAAAC,EAAAvC,EAAM,GAAG,GAAA,CAAA;AAAA,YAAA;;;UAEXkC,EAA0CkG,IAAA;AAAA,YAA1B,SAASpI,EAAM;AAAA,UAAA;;QAGhBwH,EAAA,cAAjB3F,EAAqFC,EAAAa,CAAA,GAAA;AAAA;UAA9D,MAAK;AAAA,UAAK,SAAQ;AAAA,UAAQ,SAAKiC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAnB,MAAEY,EAAKoD,EAAA,QAAI,CAAA;AAAA,QAAA;qBAAO,MAAC,CAAA,GAAA7C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA,cAAD,KAAC,EAAA;AAAA,UAAA;;;sBAV3E/C,EAA6CC,EAAAc,EAAA,GAAA;AAAA;QAAX,MAAM;AAAA,MAAA;;;;;;;;;;;;ACvC5C,UAAMhC,IAAQC,GAERC,IAAM3B,GAAewB,IAAU,GAC/BmC,IAAQC,GAAA;AACd,IAAAtC,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEVqP,IAAOjP,EAAgC,IAAI,GAC3CwC,IAAUxC,EAAI,EAAK,GACnBkP,IAAWlP,EAAc,EAAE,GAC3BmP,IAAanP,EAA4B,IAAI,GAC7CoP,IAAYpP,EAAI,EAAK,GACrB2C,IAAW3C,EAAc,EAAE,GAE3BqP,IAA8C;AAAA,MAClD,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,IAAA,GAGPjH,IAA+C;AAAA,MACnD,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,IAAA,GAGJ7J,IAAUoD,EAAkC,MAAM;AAAA,MACtD,EAAE,KAAK,MAAM,OAAOlC,EAAE,aAAa,GAAG,OAAO,GAAA;AAAA,MAC7C,EAAE,KAAK,cAAc,OAAOA,EAAE,iBAAiB,GAAG,UAAU,IAAA;AAAA,MAC5D,EAAE,KAAK,SAAS,OAAOA,EAAE,YAAY,GAAG,OAAO,IAAA;AAAA,MAC/C,EAAE,KAAK,UAAU,OAAOA,EAAE,aAAa,GAAG,OAAO,IAAA;AAAA,MACjD,EAAE,KAAK,UAAU,OAAOA,EAAE,aAAa,GAAG,OAAO,KAAK,OAAO,QAAA;AAAA,MAC7D,EAAE,KAAK,YAAY,OAAOA,EAAE,eAAe,GAAG,UAAU,KAAK,WAAW,IAAA;AAAA,MACxE,EAAE,KAAK,cAAc,OAAOA,EAAE,iBAAiB,GAAG,UAAU,KAAK,WAAW,IAAA;AAAA,IAAI,CACjF,GAEK6P,IAAiB3N,EAA4C,MAAM;AAAA,MACvE,EAAE,KAAK,YAAY,OAAOlC,EAAE,eAAe,GAAG,OAAO,IAAA;AAAA,MACrD,EAAE,KAAK,SAAS,OAAOA,EAAE,YAAY,EAAA;AAAA,MACrC,EAAE,KAAK,OAAO,OAAOA,EAAE,eAAe,GAAG,OAAO,IAAI,OAAO,QAAA;AAAA,MAC3D,EAAE,KAAK,SAAS,OAAOA,EAAE,iBAAiB,GAAG,OAAO,KAAK,OAAO,QAAA;AAAA,MAChE,EAAE,KAAK,cAAc,OAAOA,EAAE,sBAAsB,GAAG,OAAO,KAAK,OAAO,QAAA;AAAA,IAAQ,CACnF,GAGK8P,IAAO5N,EAAqD,MAAM;AACtE,YAAM6N,IAAMN,EAAS,MAAM,IAAI,MAAM,EAAE,KAAK,CAACO,GAAGC,MAAMD,IAAIC,CAAC;AAE3D,aAAIF,EAAI,WAAW,IAAU,OAEtBA,EAAI,WAAW,IAClB,EAAE,IAAIA,EAAI,CAAC,GAAI,MAAM,KAAA,IACrB,EAAE,IAAIA,EAAIA,EAAI,SAAS,CAAC,GAAI,MAAMA,EAAI,CAAC,EAAA;AAAA,IAC7C,CAAC,GAEKG,IAAehO;AAAA,MACnB,MAAMwN,EAAW,UAAU,QAAQA,EAAW,MAAM,KAAK,UAAUA,EAAW,MAAM,GAAG;AAAA,IAAA;AAGzF,aAASS,EAAItR,GAAuB;AAClC,aAAIA,EAAI,eAAe,aAAmBmB,EAAE,kBAAkB,IAC1DnB,EAAI,eAAe,QAAcmB,EAAE,aAAa,IAChDnB,EAAI,eAAe,YAAkBmB,EAAE,iBAAiB,IAErDnB,EAAI,aAAamB,EAAE,gBAAgB,IAAI;AAAA,IAChD;AAEA,mBAAesD,EAAKqE,GAAmC;AACrD,MAAA5E,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAyM,EAAK,QAAQ,MAAMzP,EAAI,KAAK,EAAE,MAAM4H,GAAO,QAAQ,GAAG,UAAUA,GAAO,WAAW,IAAI;AAAA,MACxF,SAASjH,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAqC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,mBAAeqN,IAAyB;AACtC,YAAM3E,IAAUqE,EAAK;AAKrB,UAHAJ,EAAW,QAAQ,MACnBxM,EAAS,QAAQ,CAAA,GAEb,EAACuI,GAEL;AAAA,QAAAkE,EAAU,QAAQ;AAElB,YAAI;AACF,UAAAD,EAAW,QAAQ,MAAM3P,EAAI,QAAQ0L,EAAQ,IAAIA,EAAQ,IAAI;AAAA,QAC/D,SAAS/K,GAAO;AACd,UAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,QAC7B,UAAA;AACE,UAAAiP,EAAU,QAAQ;AAAA,QACpB;AAAA;AAAA,IACF;AAEA,WAAAlP,GAAU,MAAM;AACd,YAAMrB,IAAK,OAAO2C,EAAM,MAAM,EAAE;AAEhC,MAAI,OAAO,UAAU3C,CAAE,KAAKA,IAAK,MAAGqQ,EAAS,QAAQ,CAACrQ,CAAE;AAAA,IAC1D,CAAC,GAEDoE,GAAMiM,GAAU,CAACzB,MAAS;AAExB,MAAIA,EAAK,SAAS,MAAY,QAAQA,EAAK,MAAM,EAAE,IACzCoC,EAAA;AAAA,IACZ,CAAC,mBAICtP,EAyFe2C,IAAA;AAAA,MAzFA,MAAM5D,EAAM;AAAA,MAAM,SAAQ;AAAA,MAAQ,MAAM;AAAA,IAAA;iBACrD,MAuFM;AAAA,QAvFNkE,EAuFM,OAvFNlD,IAuFM;AAAA,UAtFJM,EAkCUJ,EAAAuI,EAAA,GAAA,MAAA;AAAA,uBAjCR,MAgCW;AAAA,cAhCXnI,EAgCWJ,EAAA2C,EAAA,GAAA;AAAA,gBA/BD,UAAU+L,EAAA;AAAA,4DAAAA,EAAQ,QAAA/M;AAAA,gBACzB,MAAM8M,EAAA;AAAA,gBACN,SAAS1Q,EAAA;AAAA,gBACV,WAAQ;AAAA,gBACR,YAAA;AAAA,gBACC,iBAAa,CAAG6E,MAAkBA,EAAI,WAAM;AAAA,gBAC7C,OAAA;AAAA,gBACC,SAASZ,EAAA;AAAA,gBACT,cAAYhC,EAAAf,CAAA,EAAC,iBAAA;AAAA,gBACb,eAAcsD;AAAA,cAAA;gBAEJ,mBAAeQ,EAAW,CAAmC,EAA1C,KAAAH,QAAG;AAAA,kBAAIxC,EAAmCJ,EAAAiD,EAAA,GAAA;AAAA,oBAAzB,OAAOL,EAAI;AAAA,kBAAA;;gBAC/C,cAAUG,EAAW,CAAkC,EAAzC,KAAAH,QAAG;AAAA,sBAAO5C,EAAAf,CAAA,EAAC,cAAe2D,EAAI,KAAK,EAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;gBACjD,eAAWG,EACpB,CAEa,EAHW,KAAAH,QAAG;AAAA,kBAC3BxC,EAEaJ,EAAAU,CAAA,GAAA;AAAA,oBAFF,MAAMmO,EAASjM,EAAI,MAAM;AAAA,oBAAG,KAAA;AAAA,kBAAA;+BAAI,MAEzC;AAAA,0BADA5C,EAAAf,CAAA,EAAC,eAAgB2D,EAAI,MAAM,EAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;gBAGpB,eAAWG,EAAW,CAE/B,EAFwB,KAAAH,QAAG;AAAA,kBAC3BpC,EAAAC,EAAAmC,EAAI,SAAM,GAAMA,EAAI,OAAO,MAAM,MAAA,EAAA,GAAA,CAAA;AAAA,gBAAA;gBAExB,iBAAaG,EACtB,CAMO,EAPmB,KAAAH,QAAG;AAAA,kBACjBA,EAAI,UAAhBhD,EAAA,GAAAC,EAMO,QANPM,IAMO;AAAA,qBALLP,EAAA,GAAAC,EAIWK,GAAA,MAAAuD,EAJqBmE,GAAU,CAAxB6D,GAAMzN,6BAA6B;AAAA,sBACnC4E,EAAI,OAAO,SAAS5E,CAAG,UAAvC+B,EAEaC,EAAAU,CAAA,GAAA;AAAA;wBAF8B,MAAA+K;AAAA,wBAAY,MAAK;AAAA,sBAAA;mCAAK,MAE/D;AAAA,0BADAjL,EAAAC,EAAAmC,EAAI,OAAO,SAAS5E,CAAG,CAAA,GAAA,CAAA;AAAA,wBAAA;;;;;;gBAKpB,mBAAe+E,EAAW,CAAc,EAArB,KAAAH,QAAG;AAAA,kBAAOpC,EAAAC,EAAA2O,EAAIxM,CAAG,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;UAInCmM,EAAA,cAEhBhP,EA+CUC,EAAAuI,EAAA,GAAA;AAAA;YA/CO,OAAOvI,EAAAf,CAAA,EAAC,cAAA;AAAA,UAAA;uBACvB,MAMU;AAAA,cANK0P,EAAA,cAAf5O,EAMUC,EAAAC,CAAA,GAAA;AAAA;gBANiB,MAAK;AAAA,gBAAK,MAAK;AAAA,gBAAQ,OAAM;AAAA,cAAA;2BACtD,MAA4B;AAAA,sBAAzBD,EAAAf,CAAA,EAAC,mBAAA,CAAA,IAAwB,OAAEwB,EAAGkO,EAAA,MAAW,KAAK,EAAE,IAAG,OACtD,CAAA;AAAA,kBAAAvO,EAA+CJ,EAAAiD,EAAA,GAAA;AAAA,oBAArC,OAAO0L,EAAA,MAAW,KAAK;AAAA,kBAAA;oBAAc,QAAGlO,EAAGT,EAAAf,CAAA,EAAC,iBAAA,CAAA,IAAsB,OAAEwB,EAC5EkO,EAAA,MAAW,GAAG,EAAE,IAChB,OACA,CAAA;AAAA,kBAAAvO,EAA6CJ,EAAAiD,EAAA,GAAA;AAAA,oBAAnC,OAAO0L,EAAA,MAAW,GAAG;AAAA,kBAAA;;;;cAI3BQ,EAAA,cADRpP,EAKEC,EAAAsI,EAAA,GAAA;AAAA;gBAHA,MAAK;AAAA,gBACJ,aAAatI,EAAAf,CAAA,EAAC,qBAAA;AAAA,gBACf,OAAM;AAAA,cAAA;cAGRmB,EA8BWJ,EAAA2C,EAAA,GAAA;AAAA,gBA7BD,UAAUR,EAAA;AAAA,4DAAAA,EAAQ,QAAAR;AAAA,gBACzB,MAAMgN,EAAA,OAAY,UAAM,CAAA;AAAA,gBACxB,SAASG,EAAA;AAAA,gBACV,WAAQ;AAAA,gBACR,YAAA;AAAA,gBACA,OAAA;AAAA,gBACC,YAAY;AAAA,gBACZ,SAASF,EAAA;AAAA,gBACT,cAAY5O,EAAAf,CAAA,EAAC,mBAAA;AAAA,cAAA;gBAEH,iBAAa8D,EACtB,CAEa,EAHa,KAAAH,QAAG;AAAA,kBAC7BxC,EAEaJ,EAAAU,CAAA,GAAA;AAAA,oBAFF,MAAMkH,EAAWhF,EAAI,QAAQ;AAAA,oBAAG,KAAA;AAAA,kBAAA;+BAAI,MAE7C;AAAA,0BADA5C,EAAAf,CAAA,EAAC,iBAAkB2D,EAAI,QAAQ,EAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;gBAGxB,YAAQG,EACjB,CAA+E,EAD1D,KAAAH,QAAG;AAAA,kBACxBxC,EAA+EJ,EAAAC,CAAA,GAAA;AAAA,oBAArE,MAAM2C,EAAI,MAAG,WAAA;AAAA,oBAAuB,MAAK;AAAA,kBAAA;+BAAK,MAAa;AAAA,sBAAVpC,EAAAC,EAAAmC,EAAI,GAAG,GAAA,CAAA;AAAA,oBAAA;;;;gBAEzD,cAAUG,EACnB,CAAoF,EAD7D,KAAAH,QAAG;AAAA,kBAC1BxC,EAAoFJ,EAAAC,CAAA,GAAA;AAAA,oBAA1E,MAAM2C,EAAI,QAAK,YAAA;AAAA,oBAAwB,MAAK;AAAA,kBAAA;+BAAK,MAAe;AAAA,sBAAZpC,EAAAC,EAAAmC,EAAI,KAAK,GAAA,CAAA;AAAA,oBAAA;;;;gBAE9D,UAAQG,EACjB,CAKE,EANmB,KAAAH,QAAG;AAAA,kBAEhB+L,EAAA,cADR5O,EAKEuP,IAAA;AAAA;oBAHC,MAAMX,EAAA,MAAW,KAAK;AAAA,oBACtB,IAAIA,EAAA,MAAW,GAAG;AAAA,oBAClB,KAAA/L;AAAA,kBAAA;;;;;;oCA7CT7C,EAAmFC,EAAAC,CAAA,GAAA;AAAA;YAA7D,MAAK;AAAA,YAAK,MAAK;AAAA,UAAA;uBAAQ,MAA4B;AAAA,kBAAzBD,EAAAf,CAAA,EAAC,mBAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;;;;;;;;;;;;AC9KvD,UAAMH,IAAQC,GAERgC,IAAUlC,GAAA,GACVG,IAAM3B,GAAe0D,CAAO;AAClC,IAAApC,GAAA;AAEA,UAAMM,IAAIC,GAAa,YAAY,GAC7BC,IAAUC,GAAA,GAEVZ,IAASgB,EAAiB,EAAE,GAC5B+P,IAAS/P,EAA8B,EAAE,GACzCwC,IAAUxC,EAAI,EAAI,GAClBsF,IAAStF,EAAI,EAAK,GAGlBgQ,IAAYzO,EAAQ,IAAI,cAAc;AAE5C,IAAArB,GAAU,YAAY;AACpB,UAAI;AACF,QAAAlB,EAAO,QAAS,MAAMQ,EAAI,SAAA;AAAA,MAC5B,SAASW,GAAO;AACd,QAAA6C,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAqC,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAED,mBAAeyN,IAAsB;AACnC,MAAA3K,EAAO,QAAQ,IACfyK,EAAO,QAAQ,CAAA;AAEf,UAAI;AACF,QAAA/Q,EAAO,QAAS,MAAMQ,EAAI,aAAaR,EAAO,KAAK,GACnDgE,EAAM,QAAQvD,EAAE,YAAY,CAAC;AAAA,MAC/B,SAASU,GAAO;AACd,cAAMlC,IAAQkC,EAA2D;AAEzE,QAAIlC,GAAM,WAAQ8R,EAAO,QAAQ9R,EAAK,SAEtC+E,EAAM,OAAOrD,EAAQQ,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAmF,EAAO,QAAQ;AAAA,MACjB;AAAA,IACF;2BAIE/E,EAee2C,IAAA;AAAA,MAfA,MAAM5D,EAAM;AAAA,MAAM,SAAQ;AAAA,MAAY,MAAM;AAAA,IAAA;iBACzD,MAaM;AAAA,QAbNkE,EAaM,OAbNlD,IAaM;AAAA,UAZekC,EAAA,cAAnBjC,EAAwCC,EAAAc,EAAA,GAAA;AAAA;YAAX,MAAM;AAAA,UAAA,YACnCf,EAMEC,EAAA0P,EAAA,GAAA;AAAA;wBAJSlR,EAAA;AAAA,0DAAAA,EAAM,QAAAmD;AAAA,YACf,MAAK;AAAA,YACJ,QAAQ4N,EAAA;AAAA,YACR,WAAWvP,EAAAwP,CAAA;AAAA,UAAA;UAGOxP,EAAAwP,CAAA,MAAcxN,EAAA,cAAnCjC,EAEgBC,EAAA2P,EAAA,GAAA,EAAA,KAAA,KAAA;AAAA,uBADd,MAA0F;AAAA,cAA1FvP,EAA0FJ,EAAAa,CAAA,GAAA;AAAA,gBAA/E,MAAK;AAAA,gBAAW,SAASiE,EAAA;AAAA,gBAAS,SAAO2K;AAAA,cAAA;2BAAM,MAAoB;AAAA,sBAAjBzP,EAAAf,CAAA,EAAC,WAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;AChD/D,SAAS2Q,GAAMpB,IAAwB,IAAiB;AAC7D,QAAM/M,IAAO+M,EAAQ,QAAQ,UACvB1P,IAAQ,EAAE,MAAM2C,EAAA;AAEtB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAAA;AAAA,IACA,QAAQ;AAAA,MACN,EAAE,MAAAA,GAAM,MAAM,cAAc,WAAWoO,IAAmB,OAAA/Q,EAAA;AAAA,MAC1D,EAAE,MAAM,GAAG2C,CAAI,WAAW,MAAM,qBAAqB,WAAWqO,IAAiB,OAAAhR,EAAA;AAAA,MACjF,EAAE,MAAM,GAAG2C,CAAI,UAAU,MAAM,oBAAoB,WAAWsO,IAAgB,OAAAjR,EAAA;AAAA,MAC9E,EAAE,MAAM,GAAG2C,CAAI,UAAU,MAAM,oBAAoB,WAAWuO,IAAgB,OAAAlR,EAAA;AAAA,MAC9E,EAAE,MAAM,GAAG2C,CAAI,SAAS,MAAM,mBAAmB,WAAWwO,IAAe,OAAAnR,EAAA;AAAA,MAC3E;AAAA,QACE,MAAM,GAAG2C,CAAI;AAAA,QACb,MAAM;AAAA,QACN,WAAWyO;AAAA,QACX,OAAApR;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../src/api.ts","../src/messages.ts","../src/i18n.ts","../src/AuditHostPlaces.vue","../src/AuditLayout.vue","../src/AuditHostsPage.vue","../src/AuditDetails.vue","../src/AuditFixDialog.vue","../src/AuditHideDialog.vue","../src/AuditIssueList.vue","../src/AuditIssuesPage.vue","../src/AuditOverviewPage.vue","../src/resources.ts","../src/AuditPageCard.vue","../src/fields.ts","../src/AuditPagesPage.vue","../src/AuditCompareIssues.vue","../src/AuditRunsPage.vue","../src/AuditSettingsPage.vue","../src/module.ts"],"sourcesContent":["import type { AdminContext } from '@webx-ui/module-admin'\nimport type {\n AuditCheckRow,\n AuditComparison,\n AuditComparisonKind,\n AuditFixOffer,\n AuditFixResult,\n AuditHosts,\n AuditHostClass,\n AuditIgnoreRule,\n AuditIssue,\n AuditIssueQuery,\n AuditLatest,\n AuditLinkRow,\n AuditPage,\n AuditPageCard,\n AuditPageQuery,\n AuditPageRow,\n AuditResourceRow,\n AuditResourceTab,\n AuditRun,\n AuditScope,\n} from './types'\n\nexport interface AuditApi {\n /** The run that is going, the last one that finished, and whether the queue can take one. */\n latest(): Promise<AuditLatest>\n run(id: number): Promise<AuditRun>\n /** Every run, newest first — the history. */\n runs(query?: { page?: number; per_page?: number }): Promise<AuditPage<AuditRun>>\n /**\n * Queues a run; refused with 409 on a `sync` queue or while another one is going. A `urls` run\n * is a recheck of the addresses given.\n */\n start(scope: AuditScope, urls?: string[]): Promise<AuditRun>\n cancel(id: number): Promise<AuditRun>\n /** The checks of a run that found something, worst first. */\n checks(run: number, query?: AuditIssueQuery): Promise<AuditCheckRow[]>\n /** The findings of a run — of one check when `check` is given. */\n issues(run: number, query?: AuditIssueQuery): Promise<AuditPage<AuditIssue>>\n /** The crawled pages of a run under the screen's filters. */\n pages(run: number, query?: AuditPageQuery): Promise<AuditPage<AuditPageRow>>\n /** Where the browser downloads the same list as CSV, under the panel's session. */\n pagesFile(run: number, query: AuditPageQuery, columns: string[]): string\n page(run: number, id: number): Promise<AuditPageCard>\n /** The links of a page: `out` — what it points at, `in` — what points at it. */\n links(\n run: number,\n id: number,\n query?: { direction?: 'in' | 'out'; kind?: string; page?: number; per_page?: number },\n ): Promise<AuditPage<AuditLinkRow>>\n /** What a page loads, a tab of the card at a time. */\n resources(\n run: number,\n id: number,\n query: { tab: AuditResourceTab; page?: number; per_page?: number },\n ): Promise<AuditPage<AuditResourceRow>>\n /** The fixes that can close a finding now, each with what it would change. */\n fixes(run: number, issue: number): Promise<AuditFixOffer[]>\n /** Presses a fix — or, with `dryRun`, only asks again what it would change. */\n fix(run: number, issue: number, fix: string, dryRun?: boolean): Promise<AuditFixResult>\n /** Where the browser downloads one page of a run — its snapshot, findings and links. */\n pageFile(run: number, id: number): string\n /** Two runs by fingerprint; without `from`, `to` against the run it was analysed against. */\n compare(to: number, from?: number | null): Promise<AuditComparison>\n /** The findings of one kind of a comparison, of one check when given. */\n compareIssues(query: {\n to: number\n from?: number | null\n kind: AuditComparisonKind\n check?: string\n page?: number\n per_page?: number\n }): Promise<AuditPage<AuditIssue>>\n /** Every host the site points at, by class — stands first; with `host`, where it stands. */\n hosts(query?: {\n class?: AuditHostClass | null\n search?: string\n host?: string\n }): Promise<AuditHosts>\n /** The hiding rules. */\n ignores(): Promise<AuditIgnoreRule[]>\n /** Hides what a rule matches, with the reason. */\n hide(rule: { check: string; pattern: string; reason: string }): Promise<AuditIgnoreRule>\n /** How many findings of the last run a rule would hide — nothing is hidden. */\n hidePreview(rule: { check: string; pattern: string }): Promise<number>\n /** Removes a rule: its findings count again. */\n unhide(id: number): Promise<void>\n /** The section's settings, keyed as the screen names them. */\n settings(): Promise<Record<string, unknown>>\n saveSettings(values: Record<string, unknown>): Promise<Record<string, unknown>>\n}\n\n/** The query of the pages screen as the API reads it: `f[field]=op:value` for each filter. */\nexport function pageParams(query: AuditPageQuery): Record<string, string | number | undefined> {\n const params: Record<string, string | number | undefined> = {\n search: query.search || undefined,\n status: query.status || undefined,\n indexable:\n query.indexable === null || query.indexable === undefined\n ? undefined\n : query.indexable\n ? 1\n : 0,\n check: query.check || undefined,\n sort: query.sort || undefined,\n page: query.page,\n per_page: query.per_page,\n }\n\n for (const filter of query.filters ?? []) {\n params[`f[${filter.field}]`] =\n filter.value === undefined || filter.value === '' ? filter.op : `${filter.op}:${filter.value}`\n }\n\n return params\n}\n\n/** Everything under `/audit`, below the panel's API path. */\nexport function createAuditApi(admin: AdminContext): AuditApi {\n const base = `${admin.apiPath}/audit`\n const data = <T>(body: { data: T }): T => body.data\n\n /* `undefined` drops a parameter; `null` and `''` would be sent as words. */\n const filters = (query: AuditIssueQuery) => ({\n check: query.check || undefined,\n severity: query.severity || undefined,\n group: query.group || undefined,\n state: query.state || undefined,\n page: query.page,\n per_page: query.per_page,\n })\n\n return {\n latest: () => admin.http.get<{ data: AuditLatest }>(`${base}/runs/latest`).then(data),\n\n run: (id) => admin.http.get<{ data: AuditRun }>(`${base}/runs/${id}`).then(data),\n\n runs: (query = {}) =>\n admin.http\n .get<{\n data: AuditRun[]\n meta: Omit<AuditPage<AuditRun>, 'data'>\n }>(`${base}/runs`, { query })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n start: (scope, urls) =>\n admin.http\n .post<{ data: AuditRun }>(`${base}/runs`, scope === 'urls' ? { scope, urls } : { scope })\n .then(data),\n\n cancel: (id) => admin.http.post<{ data: AuditRun }>(`${base}/runs/${id}/cancel`, {}).then(data),\n\n checks: (run, query = {}) =>\n admin.http\n .get<{ data: AuditCheckRow[] }>(`${base}/runs/${run}/checks`, { query: filters(query) })\n .then(data),\n\n issues: (run, query = {}) =>\n admin.http\n .get<{\n data: AuditIssue[]\n meta: Omit<AuditPage<AuditIssue>, 'data'>\n }>(`${base}/runs/${run}/issues`, { query: filters(query) })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n pages: (run, query = {}) =>\n admin.http\n .get<{\n data: AuditPageRow[]\n meta: Omit<AuditPage<AuditPageRow>, 'data'>\n }>(`${base}/runs/${run}/pages`, { query: pageParams(query) })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n pagesFile: (run, query, columns) => {\n const params = new URLSearchParams()\n\n for (const [key, value] of Object.entries({\n ...pageParams(query),\n page: undefined,\n per_page: undefined,\n })) {\n if (value !== undefined) params.set(key, String(value))\n }\n\n params.set('columns', columns.join(','))\n\n return `${base}/runs/${run}/pages/export?${params.toString()}`\n },\n\n page: (run, id) =>\n admin.http.get<{ data: AuditPageCard }>(`${base}/runs/${run}/pages/${id}`).then(data),\n\n links: (run, id, query = {}) =>\n admin.http\n .get<{\n data: AuditLinkRow[]\n meta: Omit<AuditPage<AuditLinkRow>, 'data'>\n }>(`${base}/runs/${run}/pages/${id}/links`, { query })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n resources: (run, id, query) =>\n admin.http\n .get<{\n data: AuditResourceRow[]\n meta: Omit<AuditPage<AuditResourceRow>, 'data'>\n }>(`${base}/runs/${run}/pages/${id}/resources`, { query })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n fixes: (run, issue) =>\n admin.http\n .get<{ data: AuditFixOffer[] }>(`${base}/runs/${run}/issues/${issue}/fixes`)\n .then(data),\n\n fix: (run, issue, fix, dryRun = false) =>\n admin.http\n .post<{\n data: AuditFixResult\n }>(`${base}/runs/${run}/issues/${issue}/fixes/${encodeURIComponent(fix)}`, {\n dry_run: dryRun,\n })\n .then(data),\n\n pageFile: (run, id) => `${base}/runs/${run}/pages/${id}/export`,\n\n compare: (to, from) =>\n admin.http\n .get<{\n data: AuditComparison\n }>(`${base}/runs/compare`, { query: { to, from: from ?? undefined } })\n .then(data),\n\n compareIssues: (query) =>\n admin.http\n .get<{\n data: AuditIssue[]\n meta: Omit<AuditPage<AuditIssue>, 'data'>\n }>(`${base}/runs/compare/issues`, {\n query: { ...query, from: query.from ?? undefined, check: query.check || undefined },\n })\n .then((body) => ({ ...body.meta, data: body.data })),\n\n hosts: (query = {}) =>\n admin.http\n .get<{ data: AuditHosts }>(`${base}/hosts`, {\n query: {\n class: query.class || undefined,\n search: query.search || undefined,\n host: query.host || undefined,\n },\n })\n .then(data),\n\n ignores: () => admin.http.get<{ data: AuditIgnoreRule[] }>(`${base}/ignores`).then(data),\n\n hide: (rule) => admin.http.post<{ data: AuditIgnoreRule }>(`${base}/ignores`, rule).then(data),\n\n hidePreview: (rule) =>\n admin.http\n .post<{ data: { hidden: number } }>(`${base}/ignores`, { ...rule, dry_run: true })\n .then((body) => body.data.hidden),\n\n unhide: (id) => admin.http.delete(`${base}/ignores/${id}`).then(() => undefined),\n\n settings: () =>\n admin.http\n .get<{ data: { values: Record<string, unknown> } }>(`${base}/settings`)\n .then((body) => body.data.values),\n\n saveSettings: (values) =>\n admin.http\n .put<{ data: { values: Record<string, unknown> } }>(`${base}/settings`, { values })\n .then((body) => body.data.values),\n }\n}\n","import type { Messages } from '@webx-ui/module-admin'\n\n/**\n * What this package says, in English — the same keys `webx-ui/module-audit` ships as\n * `lang/en/*.php`, so a key never reaches the screen while the dictionary is on its way. The\n * server's dictionary wins; the check texts and the details arrive translated from the server and\n * are not repeated here.\n */\nexport const auditMessages: Record<string, Messages> = {\n module: {\n title: 'Audit',\n },\n\n page: {\n overview: 'Overview',\n issues: 'Findings',\n settings: 'Settings',\n run: 'Run the audit',\n scope: 'Scope',\n 'scope-full': 'Full',\n 'scope-full-help': 'Everything the audit can check.',\n 'scope-quick': 'Quick',\n 'scope-quick-help': 'The config, the host and the database — takes seconds.',\n start: 'Start',\n started: 'The audit has started.',\n cancel: 'Cancel the run',\n never: 'No audit has been run yet.',\n 'never-help':\n 'Run the first one to see how the site looks to a visitor and to a search engine.',\n health: 'Health',\n errors: 'Errors',\n warnings: 'Warnings',\n notices: 'Notices',\n new: 'New',\n fixed: 'Fixed',\n 'health-pages': 'Pages without errors: :clean of :pages',\n 'health-site': 'Errors of the whole site: :count',\n 'health-warnings': 'Checks with warnings: :count',\n 'health-help':\n 'The share of pages without errors, minus 10 points for each error of the whole site and 2 for each check with warnings — the warnings take 20 at most.',\n 'last-run': 'Last run',\n 'base-url': 'Address',\n 'status-queued': 'Waiting in the queue',\n 'status-running': 'Running',\n 'status-done': 'Done',\n 'status-failed': 'Failed',\n 'status-cancelled': 'Cancelled',\n 'stage-probes': 'Config and host',\n 'stage-database': 'Database',\n 'stage-crawl': 'Pages',\n 'stage-analyse': 'Analysis',\n 'last-failed': 'The last run did not finish: :error',\n 'by-group': 'By group',\n 'group-config': 'Configuration',\n 'group-host': 'Host and addresses',\n 'group-hosts': 'Outgoing addresses',\n 'group-other': 'Other',\n sources: 'Content searched',\n 'sources-missing': 'Installed, but not searched:',\n 'sync-queue':\n 'The queue runs jobs inside the request (sync), so the panel cannot start a run. Run php artisan webx:audit:run from the terminal or cron.',\n 'already-running': 'An audit is already running.',\n check: 'Check',\n count: 'Found',\n severity: 'Severity',\n 'severity-error': 'Error',\n 'severity-warning': 'Warning',\n 'severity-notice': 'Notice',\n 'any-severity': 'Any severity',\n 'any-group': 'Any group',\n 'any-state': 'New and persisting',\n 'state-new': 'New',\n 'state-persisting': 'Persisting',\n address: 'Address',\n empty: 'Nothing found.',\n clean: 'The last run found nothing.',\n found: 'What was found',\n why: 'Why it matters',\n fix: 'How to fix it',\n explain: 'What this check means',\n 'open-editor': 'Open in the editor',\n 'fix-button': 'Fix',\n 'fix-apply': 'Apply',\n 'fix-applied': 'Done. Run the audit again to see the finding go.',\n 'fix-none': 'Nothing left to change: no fix can close this finding now.',\n 'fix-pressed': 'Fixed — waiting for the next run',\n 'fix-changes': 'Changes',\n 'fix-before': 'Now',\n 'fix-after': 'After',\n yes: 'Yes',\n no: 'No',\n missing: 'Missing',\n pages: 'Pages',\n 'pages-progress': 'Pages crawled: :crawled of at most :limit',\n 'resources-progress':\n 'Pictures, styles, scripts and external links checked: :checked of :total',\n 'pages-none': 'No full run has crawled the site yet. Start a full audit to see every page.',\n 'pages-run': 'Full run of :date',\n 'group-indexing': 'Indexing',\n 'group-redirects': 'Redirects',\n 'group-page': 'Page',\n 'group-content': 'Content and speed',\n 'group-links': 'Links',\n 'group-images': 'Pictures',\n 'group-a11y': 'Accessibility',\n 'group-structure': 'Structure',\n columns: 'Columns',\n export: 'Export CSV',\n 'search-url': 'Search by address',\n 'any-status': 'Any answer',\n 'status-none': 'No answer',\n 'any-indexable': 'Indexable or not',\n 'indexable-yes': 'Indexable',\n 'indexable-no': 'Not indexable',\n 'any-check': 'With any findings or none',\n 'add-filter': 'Add a filter',\n 'remove-filter': 'Remove the filter',\n 'op-contains': 'contains',\n 'op-eq': 'is',\n 'op-empty': 'is empty',\n 'op-filled': 'is not empty',\n 'op-gt': 'more than',\n 'op-lt': 'less than',\n 'op-yes': 'yes',\n 'op-no': 'no',\n value: 'Value',\n 'field-url': 'Address',\n 'field-status': 'Code',\n 'field-final_status': 'Final code',\n 'field-redirect_to': 'Redirects to',\n 'field-source': 'Found through',\n 'field-depth': 'Depth',\n 'field-indexable': 'Indexable',\n 'field-issues': 'Findings',\n 'field-title': 'Title',\n 'field-description': 'Description',\n 'field-h1': 'H1',\n 'field-canonical': 'Canonical',\n 'field-robots_meta': 'Meta robots',\n 'field-x_robots_tag': 'X-Robots-Tag',\n 'field-lang': 'Language',\n 'field-content_type': 'Content type',\n 'field-bytes': 'Size, bytes',\n 'field-ttfb_ms': 'First byte, ms',\n 'field-total_ms': 'Answer, ms',\n 'field-compression': 'Compression',\n 'field-word_count': 'Words',\n 'field-links_in': 'Links in',\n 'field-links_out_internal': 'Internal links out',\n 'field-links_out_external': 'External links out',\n 'field-images': 'Pictures',\n 'field-images_without_alt': 'Pictures without alt',\n 'field-in_sitemap': 'In the sitemap',\n 'field-in_registry': 'In the registry',\n 'field-blocked_by_robots': 'Closed in robots.txt',\n 'source-home': 'Home page',\n 'source-sitemap': 'Sitemap',\n 'source-registry': 'Address registry',\n 'source-link': 'Link',\n 'card-overview': 'Overview',\n 'card-issues': 'Problems',\n 'card-incoming': 'Incoming',\n 'card-outgoing': 'Outgoing',\n 'card-images': 'Pictures',\n 'card-css': 'CSS',\n 'card-js': 'JS',\n 'card-microdata': 'Structured data',\n response: 'Response',\n headers: 'Headers',\n markup: 'Markup',\n 'open-page': 'Open the page',\n 'no-issues': 'No problems on this page.',\n 'no-links': 'No links.',\n kind: 'Kind',\n anchor: 'Anchor',\n host: 'Host',\n size: 'Size',\n cache: 'Cache',\n alt: 'Alt',\n 'not-checked': 'Not checked',\n 'no-resources': 'Nothing of this kind on the page.',\n 'no-json-ld': 'The page has no structured data.',\n 'jsonld-block': 'Block :number',\n 'jsonld-error': 'Does not parse:',\n 'jsonld-required': 'Required fields missing:',\n 'jsonld-recommended': 'Recommended fields missing:',\n 'jsonld-complete': 'Every field search engines ask for is there.',\n 'host-own': 'Own',\n 'host-own_mirror': 'Other mirror',\n 'host-dev': 'Stand',\n 'host-external': 'External',\n error: 'Error',\n 'source-list': 'Recheck list',\n hosts: 'Outgoing',\n runs: 'Runs',\n 'scope-urls': 'Recheck',\n 'urls-foreign': 'None of these addresses is on the audited site.',\n 'state-hidden': 'Hidden',\n hide: 'Hide',\n 'hide-title': 'Hide this finding',\n 'hide-help':\n 'Hidden findings stop counting, in this run and in every later one. Nothing is deleted: the hidden list shows them again.',\n 'hide-pattern': 'Addresses',\n 'hide-pattern-help':\n 'This address, or a mask of them: * is a stretch without a slash, ** one with slashes (/search/**). Empty hides every finding of the check.',\n 'hide-reason': 'Why it is all right',\n 'hide-count': 'Findings of the last run it would hide: :count',\n 'hidden-done': 'Hidden.',\n 'hidden-reason': 'Hidden: :reason',\n 'hidden-by': 'Hidden by :who: :reason',\n unhide: 'Show again',\n unhidden: 'Shown again.',\n recheck: 'Recheck',\n 'recheck-running': 'Rechecking the page…',\n 'recheck-fixed': 'Fixed since the last full run: :count',\n 'recheck-new': 'New since the last full run: :count',\n 'recheck-compare': 'Compare the runs',\n 'export-page': 'Export',\n 'runs-empty': 'No runs yet.',\n 'run-id': 'Run',\n status: 'Status',\n 'started-at': 'Started',\n 'started-by': 'Started by',\n 'by-schedule': 'Schedule',\n 'by-mcp': 'Agent',\n 'by-console': 'Console',\n 'by-person': 'Administrator',\n compare: 'Compare',\n 'compare-help':\n 'Pick two runs: what the later one found that the earlier did not, what both found, and what is gone.',\n 'compare-from': 'Earlier run',\n 'compare-to': 'Later run',\n 'compare-none': 'Both runs found the same.',\n 'compare-scopes':\n 'The runs differ in scope: only the checks the later run ran can count as fixed.',\n 'kind-new': 'New',\n 'kind-persisting': 'Persisting',\n 'kind-fixed': 'Fixed',\n 'hosts-empty': 'No run has seen a link or an address in the database yet.',\n 'search-host': 'Search by host',\n 'any-class': 'Any class',\n links: 'Links',\n fields: 'Fields in the database',\n broken: 'Broken',\n 'first-seen': 'First seen',\n 'host-pages': 'On pages',\n 'host-fields': 'In the database',\n record: 'Record',\n field: 'Field',\n unpublished: 'Not published',\n save: 'Save',\n saved: 'Saved.',\n dismiss: 'Cancel',\n 'view-full': 'View full size',\n },\n}\n","import { useAdmin } from '@webx-ui/module-admin'\nimport { auditMessages } from './messages'\n\nconst seeded = new WeakSet<object>()\n\n/** Puts this package's English under the panel's dictionary, once per panel. */\nexport function useAuditMessages(): void {\n try {\n const { i18n } = useAdmin()\n\n if (!seeded.has(i18n)) {\n i18n.defaults('webx-audit', auditMessages)\n seeded.add(i18n)\n }\n } catch {\n // Outside a panel there is no dictionary to seed, and `useTranslate` falls back on its own.\n }\n}\n","<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxBadge, WxButton, WxLink, WxSkeleton, WxText } from '@webx-ui/core'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHosts } from './types'\n\n/**\n * Where one host stands, under its row on «Outgoing»: the pages that link to it with the anchor\n * and what it answered, and the fields of the database that hold it, with «Open in the editor».\n * Fifty of each — enough to see the pattern, and the findings list the rest.\n */\nconst props = defineProps<{ host: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\nconst router = useRouter()\n\nconst places = ref<AuditHosts | null>(null)\nconst failure = ref<string | null>(null)\n\nonMounted(async () => {\n try {\n places.value = await api.hosts({ host: props.host })\n } catch (error) {\n failure.value = message(error)\n }\n})\n</script>\n\n<template>\n <div class=\"wx-audit-places\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!places\" :rows=\"2\" />\n\n <template v-else>\n <section v-if=\"places.pages?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-pages') }}</wx-text>\n <div v-for=\"(place, index) in places.pages\" :key=\"index\" class=\"wx-audit-places__row\">\n <wx-link :href=\"place.page\" target=\"_blank\" class=\"wx-audit-places__url\">{{\n place.page\n }}</wx-link>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-places__url\"\n >{{ place.kind }} → {{ place.url }}</wx-text\n >\n <wx-text v-if=\"place.anchor\" size=\"sm\">«{{ place.anchor }}»</wx-text>\n <wx-badge v-if=\"place.status && place.status >= 400\" type=\"danger\" size=\"sm\">{{\n place.status\n }}</wx-badge>\n </div>\n </section>\n\n <section v-if=\"places.fields?.length\" class=\"wx-audit-places__group\">\n <wx-text size=\"sm\" weight=\"semibold\">{{ t('page.host-fields') }}</wx-text>\n <div v-for=\"(field, index) in places.fields\" :key=\"index\" class=\"wx-audit-places__row\">\n <wx-text size=\"sm\">{{ field.record_label }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\"\n >{{ field.source }} · {{ field.field\n }}{{ field.locale ? ` · ${field.locale}` : '' }}</wx-text\n >\n <wx-badge v-if=\"!field.published\" size=\"sm\">{{ t('page.unpublished') }}</wx-badge>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-places__url\">{{ field.url }}</wx-text>\n <wx-button\n v-if=\"field.edit_url\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n @click=\"router.push(field.edit_url)\"\n >{{ t('page.open-editor') }}</wx-button\n >\n </div>\n </section>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-places {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-places__group {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-places__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { useAdmin, useTranslate, WxListScreen, type ScreenAction } from '@webx-ui/module-admin'\nimport type { TabItem, TabValue } from '@webx-ui/core'\nimport { useAuditMessages } from './i18n'\n\n/**\n * The head of the section: its name, its views — the overview, the findings, the pages, the\n * hosts the site points at and the runs — and the way to the section's own settings.\n */\n/*\n * `card` has its default here and not as `?? true` below: Vue turns a Boolean prop nobody passed\n * into `false`, so the coalescing never fired and every table stood without its card.\n */\nconst props = withDefaults(\n defineProps<{\n base: string\n current: 'overview' | 'issues' | 'pages' | 'hosts' | 'runs' | 'settings'\n /** A card around the slot — the tables want one, the overview draws its own. */\n card?: boolean\n }>(),\n { card: true },\n)\n\ndefineSlots<{ default?: () => unknown }>()\n\nconst context = useAdmin()\nconst router = useRouter()\nconst route = useRoute()\n\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'audit')?.title ??\n t('module.title'),\n)\n\nconst views = computed<TabItem[]>(() => [\n { value: 'overview', label: t('page.overview') },\n { value: 'issues', label: t('page.issues') },\n { value: 'pages', label: t('page.pages') },\n { value: 'hosts', label: t('page.hosts') },\n { value: 'runs', label: t('page.runs') },\n])\n\n/* The settings are a view of their own, out of the tabs: opened now and then, not every day. */\nconst actions = computed<ScreenAction[]>(() =>\n props.current === 'settings'\n ? []\n : [\n {\n key: 'settings',\n label: t('page.settings'),\n icon: 'settings',\n run: () => void router.push(`${props.base}/settings`),\n },\n ],\n)\n\nconst where = computed<TabValue>({\n /* The settings belong to no tab; the overview's stays lit as the way back. */\n get: () => (props.current === 'settings' ? 'overview' : props.current),\n set: (next) => {\n const path = next === 'overview' ? props.base : `${props.base}/${String(next)}`\n\n if (path !== route.path) void router.push(path)\n },\n})\n</script>\n\n<template>\n <wx-list-screen\n v-model:view=\"where\"\n :title=\"title\"\n :views=\"views\"\n :actions=\"actions\"\n :card=\"props.card\"\n >\n <slot />\n </wx-list-screen>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type RowKey,\n type SelectValue,\n type TableColumn,\n} from '@webx-ui/core'\nimport AuditHostPlaces from './AuditHostPlaces.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditHostClass, AuditHostRow, AuditHosts } from './types'\n\n/**\n * «Outgoing» (§8): every host the site points at — in the pages of the last full run and in the\n * fields of the database — by class, development stands on top and in red. A row opens into\n * where the host stands: the pages with their anchors, the records with the field and the way to\n * the editor.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst answer = ref<AuditHosts | null>(null)\nconst loading = ref(false)\nconst search = ref('')\nconst hostClass = ref<AuditHostClass | null>(null)\nconst expanded = ref<RowKey[]>([])\n\nconst classes: Record<AuditHostClass, BadgeType> = {\n dev: 'danger',\n own_mirror: 'warning',\n external: 'info',\n own: 'success',\n}\n\nconst columns = computed<TableColumn<AuditHostRow>[]>(() => [\n { key: 'host', label: t('page.host'), minWidth: 220 },\n { key: 'links', label: t('page.links'), width: 90, align: 'right' },\n { key: 'pages', label: t('page.pages'), width: 90, align: 'right', hideBelow: 560 },\n { key: 'broken', label: t('page.broken'), width: 100, align: 'right', hideBelow: 640 },\n { key: 'fields', label: t('page.fields'), width: 120, align: 'right' },\n { key: 'first_seen', label: t('page.first-seen'), minWidth: 140, hideBelow: 760 },\n])\n\nconst classOptions = computed(() =>\n (Object.keys(classes) as AuditHostClass[]).map((value) => ({\n value,\n label: `${t(`page.host-${value}`)}${answer.value?.classes[value] ? ` · ${answer.value.classes[value]}` : ''}`,\n })),\n)\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): AuditHostClass | null {\n return typeof value === 'string' && value in classes ? (value as AuditHostClass) : null\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n answer.value = await api.hosts({ class: hostClass.value, search: search.value })\n expanded.value = []\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([hostClass, search], () => void load())\n\nonMounted(load)\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"hosts\">\n <wx-table\n v-model:expanded=\"expanded\"\n v-model:search=\"search\"\n :data=\"answer?.hosts ?? []\"\n :columns=\"columns\"\n row-key=\"host\"\n expandable\n flush\n searchable\n :search-placeholder=\"t('page.search-host')\"\n :loading=\"loading\"\n :filters-count=\"hostClass ? 1 : 0\"\n :filters-label=\"panel('filters.title')\"\n :row-class=\"(row: AuditHostRow) => (row.class === 'dev' ? 'is-stand' : undefined)\"\n :empty-text=\"t('page.hosts-empty')\"\n >\n <template #filters>\n <wx-select\n :model-value=\"hostClass\"\n :options=\"classOptions\"\n :placeholder=\"t('page.any-class')\"\n clearable\n @update:model-value=\"hostClass = pick($event)\"\n />\n </template>\n\n <template #cell-host=\"{ row }\">\n <span class=\"wx-audit-hosts__host\">\n <wx-badge :type=\"classes[row.class]\" size=\"sm\">{{\n t(`page.host-${row.class}`)\n }}</wx-badge>\n <wx-text size=\"sm\" :tone=\"row.class === 'dev' ? 'danger' : undefined\" weight=\"medium\">{{\n row.host\n }}</wx-text>\n </span>\n </template>\n <template #cell-broken=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.broken ? 'danger' : 'muted'\">{{ row.broken }}</wx-text>\n </template>\n <template #cell-fields=\"{ row }\">\n <wx-text size=\"sm\" :tone=\"row.fields && row.class === 'dev' ? 'danger' : undefined\">{{\n row.fields\n }}</wx-text>\n </template>\n <template #cell-first_seen=\"{ row }\">\n <wx-date v-if=\"row.first_seen\" :value=\"row.first_seen\" />\n </template>\n\n <template #expanded=\"{ row }\">\n <audit-host-places :host=\"row.host\" />\n </template>\n </wx-table>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-hosts__host {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n/* A stand is the one class that is always a mistake: a red edge, like an error in a list. */\n:deep(.is-stand > td:first-child) {\n box-shadow: inset 3px 0 0 var(--wx-color-danger);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router'\nimport { useTranslate } from '@webx-ui/module-admin'\nimport { WxBadge, WxButton, WxLink, WxText, type BadgeType } from '@webx-ui/core'\nimport { useAuditMessages } from './i18n'\nimport type { AuditDetails, AuditDetailsColumn } from './types'\n\n/**\n * The expansion of a finding, for every check alike (§4 of the spec): a summary line and, when\n * the check gave one, a table whose cells are drawn by their type — an address opens, a code is\n * coloured, a missing value is said in red, an editor link goes to the record in the panel, and\n * markup quoted from the page is shown as code.\n */\nconst props = defineProps<{ details: AuditDetails }>()\n\nconst router = useRouter()\n\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\n\nfunction statusType(value: unknown): BadgeType {\n const code = Number(value)\n\n if (code >= 500 || code === 0) return 'danger'\n if (code >= 400) return 'warning'\n if (code >= 300) return 'info'\n\n return 'success'\n}\n\nfunction cell(row: Record<string, unknown>, column: AuditDetailsColumn): unknown {\n return row[column.key]\n}\n\n/** Yes, no — or nothing, when the check could not tell (the other page was not crawled). */\nfunction yesNo(value: unknown): string {\n if (value === null || value === undefined) return ''\n\n return value ? t('page.yes') : t('page.no')\n}\n\nfunction text(value: unknown): string {\n return value === null || value === undefined ? '' : String(value)\n}\n</script>\n\n<template>\n <div class=\"wx-audit-details\">\n <wx-text v-if=\"props.details.summary\" size=\"sm\">{{ props.details.summary }}</wx-text>\n\n <div\n v-if=\"props.details.table && props.details.table.rows.length\"\n class=\"wx-audit-details__scroll\"\n >\n <table class=\"wx-audit-details__table\">\n <thead>\n <tr>\n <th v-for=\"column in props.details.table.columns\" :key=\"column.key\">\n {{ column.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, index) in props.details.table.rows\" :key=\"index\">\n <td v-for=\"column in props.details.table.columns\" :key=\"column.key\">\n <template v-if=\"column.type === 'url' && text(cell(row, column))\">\n <wx-link\n :href=\"text(cell(row, column))\"\n target=\"_blank\"\n class=\"wx-audit-details__url\"\n >{{ text(cell(row, column)) }}</wx-link\n >\n </template>\n <wx-badge\n v-else-if=\"column.type === 'status' && cell(row, column) !== null\"\n :type=\"statusType(cell(row, column))\"\n size=\"sm\"\n >{{ text(cell(row, column)) }}</wx-badge\n >\n <template v-else-if=\"column.type === 'bool'\">\n {{ yesNo(cell(row, column)) }}\n </template>\n <wx-text\n v-else-if=\"column.type === 'missing' && !text(cell(row, column))\"\n size=\"sm\"\n tone=\"danger\"\n >{{ t('page.missing') }}</wx-text\n >\n <wx-button\n v-else-if=\"column.type === 'edit' && text(cell(row, column))\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n @click=\"router.push(text(cell(row, column)))\"\n >{{ t('page.open-editor') }}</wx-button\n >\n <code v-else-if=\"column.type === 'code'\" class=\"wx-audit-details__code\">{{\n text(cell(row, column))\n }}</code>\n <template v-else>{{ text(cell(row, column)) }}</template>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-details {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n/* A wide table scrolls inside itself rather than pushing the panel sideways on a phone. */\n.wx-audit-details__scroll {\n overflow-x: auto;\n}\n\n.wx-audit-details__table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-details__table th {\n color: var(--wx-text-muted);\n font-weight: normal;\n text-align: left;\n white-space: nowrap;\n}\n\n.wx-audit-details__table th,\n.wx-audit-details__table td {\n padding: var(--wx-space-4) var(--wx-space-8);\n border-bottom: 1px solid var(--wx-border-muted);\n vertical-align: top;\n}\n\n/* Quoted markup is one long line more often than not; it wraps anywhere rather than scrolling. */\n.wx-audit-details__code {\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-xs);\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n}\n\n.wx-audit-details__url {\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxButton, WxDialog, WxSkeleton, WxText, toast } from '@webx-ui/core'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditFixOffer, AuditIssue } from './types'\n\n/**\n * The fix button's dialog (§8, decision 4): the fixes that can close one finding, each with what\n * it would change — the records and fields with their counts, or a setting before and after —\n * and \"Apply\" under each. Nothing changes until it is pressed; the finding then waits for the\n * next run, which is the only thing that says it is gone.\n */\nconst props = defineProps<{ run: number; issue: AuditIssue }>()\nconst emit = defineEmits<{ fixed: [fix: string] }>()\nconst open = defineModel<boolean>('open', { default: false })\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\nconst router = useRouter()\n\nconst offers = ref<AuditFixOffer[] | null>(null)\nconst failure = ref<string | null>(null)\nconst applying = ref<string | null>(null)\n\nasync function load(): Promise<void> {\n offers.value = null\n failure.value = null\n\n try {\n offers.value = await api.fixes(props.run, props.issue.id)\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nasync function apply(offer: AuditFixOffer): Promise<void> {\n applying.value = offer.id\n\n try {\n await api.fix(props.run, props.issue.id, offer.id)\n toast.success(t('page.fix-applied'))\n emit('fixed', offer.id)\n open.value = false\n } catch (error) {\n toast.danger(message(error))\n } finally {\n applying.value = null\n }\n}\n\nfunction edit(url: string): void {\n open.value = false\n void router.push(url)\n}\n\n// Immediate: the list mounts the dialog already open, the first time a button is pressed.\nwatch(\n [open, () => props.issue.id],\n ([now]) => {\n if (now) void load()\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('page.fix-button')\" :width=\"640\">\n <div class=\"wx-audit-fix\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!offers\" :rows=\"3\" />\n <wx-text v-else-if=\"offers.length === 0\" size=\"sm\" tone=\"muted\">{{\n t('page.fix-none')\n }}</wx-text>\n\n <section v-for=\"offer in offers ?? []\" :key=\"offer.id\" class=\"wx-audit-fix__offer\">\n <wx-text weight=\"semibold\">{{ offer.title }}</wx-text>\n <wx-text v-if=\"offer.description\" size=\"sm\" tone=\"muted\">{{ offer.description }}</wx-text>\n\n <table class=\"wx-audit-fix__changes\">\n <thead>\n <tr>\n <th>{{ t('page.fix-changes') }}</th>\n <th>{{ t('page.fix-before') }}</th>\n <th>{{ t('page.fix-after') }}</th>\n <th />\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(change, index) in offer.changes\" :key=\"index\">\n <td>\n <div>{{ change.label }}</div>\n <div v-if=\"change.field\" class=\"wx-audit-fix__field\">{{ change.field }}</div>\n </td>\n <td class=\"wx-audit-fix__value\">\n {{ change.before ?? '' }}\n <span v-if=\"change.count\" class=\"wx-audit-fix__count\">× {{ change.count }}</span>\n </td>\n <td class=\"wx-audit-fix__value\">{{ change.after ?? '' }}</td>\n <td>\n <wx-button\n v-if=\"change.edit_url\"\n size=\"sm\"\n variant=\"text\"\n icon=\"edit\"\n :aria-label=\"t('page.open-editor')\"\n @click=\"edit(change.edit_url)\"\n />\n </td>\n </tr>\n </tbody>\n </table>\n\n <wx-text v-if=\"offer.note\" size=\"sm\" tone=\"muted\">{{ offer.note }}</wx-text>\n\n <div class=\"wx-audit-fix__actions\">\n <wx-button\n type=\"primary\"\n size=\"sm\"\n :loading=\"applying === offer.id\"\n :disabled=\"applying !== null\"\n @click=\"apply(offer)\"\n >{{ t('page.fix-apply') }}</wx-button\n >\n </div>\n </section>\n </div>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-audit-fix {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-fix__offer {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-fix__changes {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-fix__changes th {\n padding: var(--wx-space-4) var(--wx-space-8);\n color: var(--wx-text-muted);\n font-weight: var(--wx-font-weight-medium);\n text-align: start;\n border-bottom: 1px solid var(--wx-border-default);\n}\n\n.wx-audit-fix__changes td {\n padding: var(--wx-space-6) var(--wx-space-8);\n vertical-align: top;\n border-bottom: 1px solid var(--wx-border-default);\n overflow-wrap: anywhere;\n}\n\n.wx-audit-fix__field,\n.wx-audit-fix__count {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-fix__value {\n white-space: pre-line;\n}\n\n.wx-audit-fix__actions {\n display: flex;\n justify-content: flex-end;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxButton, WxDialog, WxFormItem, WxInput, WxText, WxTextarea, toast } from '@webx-ui/core'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditIgnoreRule, AuditIssue } from './types'\n\n/**\n * «Hide» on a finding (decision 9): which addresses — this one, a mask of them, or the whole\n * check — and why. While the mask is typed the dialog says how many findings of the last run it\n * would hide; nothing is hidden until the button is pressed, and nothing is ever deleted.\n */\nconst props = defineProps<{ issue: AuditIssue; title: string }>()\nconst emit = defineEmits<{ hidden: [rule: AuditIgnoreRule] }>()\nconst open = defineModel<boolean>('open', { default: false })\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst pattern = ref('')\nconst reason = ref('')\nconst count = ref<number | null>(null)\nconst saving = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\n/* The path, not the whole address: a mask of the path hides it on every mirror a run opened. */\nfunction pathOf(url: string | null): string {\n if (!url) return ''\n\n try {\n const parsed = new URL(url)\n\n return parsed.pathname + parsed.search\n } catch {\n return url\n }\n}\n\nconst ready = computed(() => reason.value.trim() !== '')\n\nfunction preview(): void {\n clearTimeout(timer)\n timer = setTimeout(async () => {\n try {\n count.value = await api.hidePreview({ check: props.issue.check, pattern: pattern.value })\n } catch {\n count.value = null\n }\n }, 300)\n}\n\nasync function hide(): Promise<void> {\n saving.value = true\n\n try {\n const rule = await api.hide({\n check: props.issue.check,\n pattern: pattern.value,\n reason: reason.value,\n })\n\n toast.success(t('page.hidden-done'))\n emit('hidden', rule)\n open.value = false\n } catch (error) {\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n\nwatch(\n [open, () => props.issue.id],\n ([now]) => {\n if (!now) return\n\n pattern.value = pathOf(props.issue.url)\n reason.value = ''\n count.value = null\n preview()\n },\n { immediate: true },\n)\n\nwatch(pattern, () => {\n if (open.value) preview()\n})\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('page.hide-title')\" :width=\"560\">\n <div class=\"wx-audit-hide\">\n <wx-text weight=\"semibold\">{{ props.title }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\">{{ t('page.hide-help') }}</wx-text>\n\n <wx-form-item :label=\"t('page.hide-pattern')\" :help=\"t('page.hide-pattern-help')\">\n <wx-input v-model=\"pattern\" placeholder=\"/search/**\" />\n </wx-form-item>\n\n <wx-form-item :label=\"t('page.hide-reason')\" required>\n <wx-textarea v-model=\"reason\" :rows=\"3\" />\n </wx-form-item>\n\n <wx-text v-if=\"count !== null\" size=\"sm\" tone=\"muted\">{{\n t('page.hide-count', { count })\n }}</wx-text>\n </div>\n\n <template #footer>\n <wx-button @click=\"open = false\">{{ t('page.dismiss') }}</wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" :disabled=\"!ready\" @click=\"hide\">{{\n t('page.hide')\n }}</wx-button>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-audit-hide {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { toast, WxBadge, WxButton, WxLink, WxSkeleton, WxText } from '@webx-ui/core'\nimport AuditDetails from './AuditDetails.vue'\nimport AuditFixDialog from './AuditFixDialog.vue'\nimport AuditHideDialog from './AuditHideDialog.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditIgnoreRule, AuditIssue, AuditIssueQuery } from './types'\n\n/**\n * The addresses of one check, under its row in the findings table: loaded when the row opens,\n * fifty at a time. A check that has fixes gets a button on each address; the dialog shows what\n * it would change before anything does. «Hide» asks for the reason; on the list of hidden ones\n * each says why, and «Show again» removes the rule.\n */\nconst props = defineProps<{\n run: number\n query: AuditIssueQuery\n fixable?: boolean\n /** The check's title, for the hiding dialog. */\n title?: string\n}>()\n\nconst emit = defineEmits<{ changed: [] }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\n// A boolean, not a computed: the permissions do not change while the screen is open.\nconst can = context.can('audit.manage')\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst issues = ref<AuditIssue[] | null>(null)\nconst more = ref(false)\nconst page = ref(1)\nconst failure = ref<string | null>(null)\nconst fixing = ref<AuditIssue | null>(null)\nconst dialog = ref(false)\nconst hiding = ref<AuditIssue | null>(null)\nconst hideDialog = ref(false)\n\nfunction hide(issue: AuditIssue): void {\n hiding.value = issue\n hideDialog.value = true\n}\n\n/* What the rule hid leaves this list at once; the table above counts again. */\nfunction hidden(rule: AuditIgnoreRule): void {\n if (issues.value && !rule.pattern) issues.value = []\n else if (issues.value && hiding.value)\n issues.value = issues.value.filter((one) => one.id !== hiding.value?.id)\n\n emit('changed')\n}\n\nasync function unhide(issue: AuditIssue): Promise<void> {\n if (!issue.ignore) return\n\n try {\n await api.unhide(issue.ignore.id)\n toast.success(t('page.unhidden'))\n emit('changed')\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction why(issue: AuditIssue): string {\n const rule = issue.ignore\n\n if (!rule) return ''\n\n return rule.created_by\n ? t('page.hidden-by', { who: rule.created_by, reason: rule.reason })\n : t('page.hidden-reason', { reason: rule.reason })\n}\n\nfunction fix(issue: AuditIssue): void {\n fixing.value = issue\n dialog.value = true\n}\n\nfunction fixed(id: string): void {\n if (fixing.value) fixing.value.fixed_with = id\n}\n\nasync function load(next = 1): Promise<void> {\n try {\n const answer = await api.issues(props.run, { ...props.query, page: next, per_page: 50 })\n\n issues.value = next === 1 ? answer.data : [...(issues.value ?? []), ...answer.data]\n page.value = answer.current_page\n more.value = answer.current_page < answer.last_page\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nonMounted(() => load())\n</script>\n\n<template>\n <div class=\"wx-audit-issues\">\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!issues\" :rows=\"2\" />\n\n <template v-else>\n <div v-for=\"issue in issues\" :key=\"issue.id\" class=\"wx-audit-issues__item\">\n <div class=\"wx-audit-issues__head\">\n <wx-link\n v-if=\"issue.url\"\n :href=\"issue.url\"\n target=\"_blank\"\n class=\"wx-audit-issues__url\"\n >{{ issue.url }}</wx-link\n >\n <wx-badge v-if=\"issue.state === 'new'\" type=\"primary\" size=\"sm\">{{\n t('page.state-new')\n }}</wx-badge>\n <wx-badge v-if=\"issue.fixed_with\" type=\"success\" size=\"sm\">{{\n t('page.fix-pressed')\n }}</wx-badge>\n <wx-button\n v-else-if=\"fixable && can && !issue.ignored\"\n size=\"sm\"\n variant=\"outline\"\n icon=\"check\"\n class=\"wx-audit-issues__fix\"\n @click=\"fix(issue)\"\n >{{ t('page.fix-button') }}</wx-button\n >\n <wx-button\n v-if=\"can && issue.ignored && issue.ignore\"\n size=\"sm\"\n variant=\"text\"\n icon=\"eye\"\n class=\"wx-audit-issues__end\"\n @click=\"unhide(issue)\"\n >{{ t('page.unhide') }}</wx-button\n >\n <wx-button\n v-else-if=\"can && !issue.ignored\"\n size=\"sm\"\n variant=\"text\"\n icon=\"eye-off\"\n :class=\"{ 'wx-audit-issues__end': !fixable || issue.fixed_with }\"\n @click=\"hide(issue)\"\n >{{ t('page.hide') }}</wx-button\n >\n </div>\n <wx-text v-if=\"issue.ignore\" size=\"sm\" tone=\"muted\">{{ why(issue) }}</wx-text>\n <audit-details :details=\"issue.details\" />\n </div>\n\n <wx-button v-if=\"more\" size=\"sm\" variant=\"text\" @click=\"load(page + 1)\">…</wx-button>\n </template>\n\n <audit-fix-dialog\n v-if=\"fixing\"\n v-model:open=\"dialog\"\n :run=\"run\"\n :issue=\"fixing\"\n @fixed=\"fixed\"\n />\n\n <audit-hide-dialog\n v-if=\"hiding\"\n v-model:open=\"hideDialog\"\n :issue=\"hiding\"\n :title=\"props.title ?? hiding.check\"\n @hidden=\"hidden\"\n />\n </div>\n</template>\n\n<style scoped>\n.wx-audit-issues {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-issues__item {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-audit-issues__head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-issues__fix,\n.wx-audit-issues__end {\n margin-inline-start: auto;\n}\n\n.wx-audit-issues__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxPopover,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type SelectValue,\n type TableColumn,\n} from '@webx-ui/core'\nimport AuditIssueList from './AuditIssueList.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditCheckRow, AuditSeverity } from './types'\n\n/**\n * The findings of the last finished run (§8): one row per check, worst first; a row opens into\n * its addresses. «Hidden» in the state filter lists what the rules hide, each with its reason. The «?» beside a check says what was found, why it matters and how to fix it —\n * the three texts every check carries.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst run = ref<number | null>(null)\nconst checks = ref<AuditCheckRow[] | null>(null)\nconst loading = ref(false)\nconst expanded = ref<(string | number)[]>([])\n\nconst severity = ref<AuditSeverity | null>(null)\nconst group = ref<string | null>(null)\ntype State = 'new' | 'persisting' | 'hidden'\n\nconst state = ref<State | null>(null)\n\nconst query = computed(() => ({ severity: severity.value, group: group.value, state: state.value }))\nconst filtersCount = computed(\n () => [severity.value, group.value, state.value].filter(Boolean).length,\n)\n\nconst types: Record<AuditSeverity, BadgeType> = {\n error: 'danger',\n warning: 'warning',\n notice: 'info',\n}\n\nconst columns = computed<TableColumn<AuditCheckRow>[]>(() => [\n { key: 'severity', label: t('page.severity'), width: 130 },\n { key: 'title', label: t('page.check') },\n { key: 'count', label: t('page.count'), width: 110, align: 'right' },\n])\n\nconst severityOptions = computed(() =>\n (['error', 'warning', 'notice'] as const).map((value) => ({\n value,\n label: t(`page.severity-${value}`),\n })),\n)\n\nconst groupOptions = computed(() =>\n [\n 'config',\n 'host',\n 'hosts',\n 'indexing',\n 'page',\n 'content',\n 'links',\n 'images',\n 'a11y',\n 'structure',\n ].map((value) => ({ value, label: t(`page.group-${value}`) })),\n)\n\nconst stateOptions = computed(() =>\n (['new', 'persisting', 'hidden'] as const).map((value) => ({\n value,\n label: t(`page.state-${value}`),\n })),\n)\n\n/* The selects hand back `string | number`; the filters only ever hold the values offered. */\nfunction pick<T extends string>(value: SelectValue | SelectValue[] | null | undefined): T | null {\n return typeof value === 'string' && value !== '' ? (value as T) : null\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n if (run.value === null) {\n run.value = (await api.latest()).done?.id ?? null\n }\n\n checks.value = run.value === null ? [] : await api.checks(run.value, query.value)\n expanded.value = []\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch(query, () => void load())\n\nonMounted(load)\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"issues\">\n <wx-table\n v-model:expanded=\"expanded\"\n :data=\"checks ?? []\"\n :columns=\"columns\"\n row-key=\"id\"\n expandable\n flush\n :loading=\"loading\"\n :filters-count=\"filtersCount\"\n :filters-label=\"panel('filters.title')\"\n :empty-text=\"run === null ? t('page.never') : t('page.empty')\"\n >\n <template #filters>\n <div class=\"wx-audit-findings__filters\">\n <wx-select\n :model-value=\"severity\"\n :options=\"severityOptions\"\n :placeholder=\"t('page.any-severity')\"\n clearable\n @update:model-value=\"severity = pick<AuditSeverity>($event)\"\n />\n <wx-select\n :model-value=\"group\"\n :options=\"groupOptions\"\n :placeholder=\"t('page.any-group')\"\n clearable\n @update:model-value=\"group = pick($event)\"\n />\n <wx-select\n :model-value=\"state\"\n :options=\"stateOptions\"\n :placeholder=\"t('page.any-state')\"\n clearable\n @update:model-value=\"state = pick<State>($event)\"\n />\n </div>\n </template>\n\n <template #cell-severity=\"{ row }\">\n <wx-badge :type=\"types[row.severity]\" dot>{{\n t(`page.severity-${row.severity}`)\n }}</wx-badge>\n </template>\n\n <template #cell-title=\"{ row }\">\n <span class=\"wx-audit-findings__title\">\n <wx-text size=\"sm\">{{ row.title }}</wx-text>\n <wx-badge v-if=\"row.new > 0\" type=\"primary\" size=\"sm\">{{ t('page.state-new') }}</wx-badge>\n <wx-popover :title=\"row.title\" width=\"360\">\n <template #trigger>\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"question\"\n :aria-label=\"t('page.explain')\"\n @click.stop\n />\n </template>\n <dl class=\"wx-audit-findings__texts\">\n <dt>{{ t('page.found') }}</dt>\n <dd>{{ row.found }}</dd>\n <dt>{{ t('page.why') }}</dt>\n <dd>{{ row.why }}</dd>\n <dt>{{ t('page.fix') }}</dt>\n <dd>{{ row.fix }}</dd>\n </dl>\n </wx-popover>\n </span>\n </template>\n\n <template #expanded=\"{ row }\">\n <audit-issue-list\n v-if=\"run !== null\"\n :run=\"run\"\n :query=\"{ ...query, check: row.id }\"\n :fixable=\"(row.fixes ?? []).length > 0\"\n :title=\"row.title\"\n @changed=\"load\"\n />\n </template>\n </wx-table>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-findings__filters {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-findings__title {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-findings__texts {\n display: grid;\n gap: var(--wx-space-4);\n margin: 0;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-findings__texts dt {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-findings__texts dd {\n margin: 0 0 var(--wx-space-8);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxEmpty,\n WxProgress,\n WxSegmented,\n WxSkeleton,\n WxStatistic,\n WxText,\n type ProgressStatus,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditLatest, AuditRun, AuditScope, AuditSeverity } from './types'\n\n/**\n * The last run at a glance (§8): health and what it is made of, the counts by severity and by\n * group, what is new and what got fixed since the run before, and the button that starts the next one. While a run is\n * going the page asks for it every couple of seconds and shows the stage it is in.\n */\nconst props = defineProps<{ base: string }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst POLL_MS = 2000\n\nconst latest = ref<AuditLatest | null>(null)\nconst scope = ref<AuditScope>('quick')\nconst starting = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nconst canRun = context.can('audit.run') || context.can('audit.manage')\n\nconst active = computed(() => latest.value?.active ?? null)\nconst done = computed(() => latest.value?.done ?? null)\nconst counts = computed(() => done.value?.counts ?? null)\n\nconst scopes = computed(() => [\n { value: 'quick', label: t('page.scope-quick') },\n { value: 'full', label: t('page.scope-full') },\n])\n\nconst severities: { key: AuditSeverity; label: string; tone: 'danger' | 'warning' | 'info' }[] = [\n { key: 'error', label: 'page.errors', tone: 'danger' },\n { key: 'warning', label: 'page.warnings', tone: 'warning' },\n { key: 'notice', label: 'page.notices', tone: 'info' },\n]\n\nconst parts = computed(() => counts.value?.health_parts ?? null)\n\nconst healthStatus = computed<ProgressStatus>(() => {\n const health = counts.value?.health ?? 0\n\n if (health >= 90) return 'success'\n if (health >= 60) return 'warning'\n\n return 'danger'\n})\n\n/* The groups this package has words for; a module's own group reads as «Other». */\nconst GROUPS = [\n 'config',\n 'host',\n 'hosts',\n 'indexing',\n 'page',\n 'content',\n 'links',\n 'images',\n 'a11y',\n 'structure',\n]\n\nconst groups = computed(() =>\n Object.entries(counts.value?.groups ?? {}).map(([id, bySeverity]) => ({\n id,\n label: t(`page.group-${GROUPS.includes(id) ? id : 'other'}`),\n bySeverity,\n })),\n)\n\nfunction stageLabel(run: AuditRun): string {\n if (run.status === 'queued') return t('page.status-queued')\n\n return run.progress.stage ? t(`page.stage-${run.progress.stage}`) : t('page.status-running')\n}\n\nasync function load(): Promise<void> {\n try {\n latest.value = await api.latest()\n } catch (error) {\n toast.danger(message(error))\n }\n\n clearTimeout(timer)\n\n if (latest.value?.active) {\n timer = setTimeout(() => void load(), POLL_MS)\n }\n}\n\nasync function start(): Promise<void> {\n starting.value = true\n\n try {\n await api.start(scope.value)\n toast.success(t('page.started'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n starting.value = false\n }\n}\n\nasync function cancel(run: AuditRun): Promise<void> {\n try {\n await api.cancel(run.id)\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nonMounted(load)\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"overview\" :card=\"false\">\n <div class=\"wx-audit-overview\">\n <wx-card v-if=\"!latest\"><wx-skeleton :rows=\"4\" /></wx-card>\n\n <template v-else>\n <wx-alert v-if=\"latest.queue.sync\" type=\"warning\" :description=\"t('page.sync-queue')\" />\n\n <wx-alert\n v-if=\"latest.last && latest.last.status === 'failed'\"\n type=\"danger\"\n :description=\"t('page.last-failed', { error: latest.last.error ?? '' })\"\n />\n\n <wx-card v-if=\"active\" class=\"wx-audit-overview__active\">\n <div class=\"wx-audit-overview__row\">\n <wx-text weight=\"semibold\">{{ stageLabel(active) }}</wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n active.base_url\n }}</wx-text>\n <wx-button\n v-if=\"canRun\"\n size=\"sm\"\n class=\"wx-audit-overview__end\"\n @click=\"cancel(active)\"\n >{{ t('page.cancel') }}</wx-button\n >\n </div>\n <wx-progress indeterminate :aria-label=\"stageLabel(active)\" />\n <wx-text v-if=\"active.progress.resources\" size=\"sm\" tone=\"muted\">{{\n t('page.resources-progress', {\n checked: active.progress.resources.checked,\n total: active.progress.resources.total,\n })\n }}</wx-text>\n <wx-text v-else-if=\"active.progress.stage === 'crawl'\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-progress', {\n crawled: active.progress.pages.crawled,\n limit: active.progress.pages.limit,\n })\n }}</wx-text>\n </wx-card>\n\n <wx-card v-else-if=\"canRun && !latest.queue.sync\">\n <div class=\"wx-audit-overview__row\">\n <wx-segmented v-model=\"scope\" :options=\"scopes\" :aria-label=\"t('page.scope')\" />\n <wx-text size=\"sm\" tone=\"muted\">{{\n scope === 'full' ? t('page.scope-full-help') : t('page.scope-quick-help')\n }}</wx-text>\n <wx-button\n type=\"primary\"\n icon=\"refresh\"\n :loading=\"starting\"\n class=\"wx-audit-overview__end\"\n @click=\"start\"\n >{{ t('page.run') }}</wx-button\n >\n </div>\n </wx-card>\n\n <wx-card v-if=\"!done && !active\">\n <wx-empty\n icon=\"check-circle\"\n :title=\"t('page.never')\"\n :description=\"t('page.never-help')\"\n />\n </wx-card>\n\n <template v-if=\"done && counts\">\n <wx-card>\n <div class=\"wx-audit-overview__summary\">\n <div class=\"wx-audit-overview__health\">\n <wx-progress\n type=\"circle\"\n :value=\"counts.health\"\n :status=\"healthStatus\"\n show-value\n :formatter=\"(value: number) => `${value}%`\"\n :aria-label=\"t('page.health')\"\n />\n <div v-if=\"parts\" class=\"wx-audit-overview__parts\">\n <wx-text v-if=\"parts.pages > 0\" size=\"sm\">{{\n t('page.health-pages', { clean: parts.clean, pages: parts.pages })\n }}</wx-text>\n <wx-text v-if=\"parts.site_errors > 0\" size=\"sm\" tone=\"danger\">{{\n t('page.health-site', { count: parts.site_errors })\n }}</wx-text>\n <wx-text v-if=\"parts.warnings > 0\" size=\"sm\" tone=\"warning\">{{\n t('page.health-warnings', { count: parts.warnings })\n }}</wx-text>\n <wx-text size=\"xs\" tone=\"muted\">{{ t('page.health-help') }}</wx-text>\n </div>\n </div>\n <div class=\"wx-audit-overview__stats\">\n <wx-statistic\n v-for=\"severity in severities\"\n :key=\"severity.key\"\n :title=\"t(severity.label)\"\n :value=\"counts.severity[severity.key] ?? 0\"\n :tone=\"(counts.severity[severity.key] ?? 0) > 0 ? severity.tone : 'muted'\"\n />\n <wx-statistic :title=\"t('page.new')\" :value=\"counts.new\" />\n <wx-statistic :title=\"t('page.fixed')\" :value=\"counts.fixed\" tone=\"success\" />\n </div>\n </div>\n <div class=\"wx-audit-overview__meta\">\n <wx-text size=\"sm\" tone=\"muted\">\n {{ t('page.last-run') }} <wx-date :value=\"done.finished_at\" /> ·\n {{ t(`page.scope-${done.scope}`) }} ·\n </wx-text>\n <wx-text size=\"sm\" tone=\"muted\" class=\"wx-audit-overview__url\">{{\n done.base_url\n }}</wx-text>\n </div>\n </wx-card>\n\n <wx-card v-if=\"groups.length\" :title=\"t('page.by-group')\">\n <ul class=\"wx-audit-overview__groups\">\n <li v-for=\"group in groups\" :key=\"group.id\">\n <wx-text size=\"sm\">{{ group.label }}</wx-text>\n <span class=\"wx-audit-overview__badges\">\n <template v-for=\"severity in severities\" :key=\"severity.key\">\n <wx-badge\n v-if=\"(group.bySeverity[severity.key] ?? 0) > 0\"\n :type=\"severity.tone\"\n size=\"sm\"\n >{{ t(severity.label) }} · {{ group.bySeverity[severity.key] }}</wx-badge\n >\n </template>\n </span>\n </li>\n </ul>\n </wx-card>\n\n <wx-card v-else>\n <wx-empty icon=\"check-circle\" :title=\"t('page.clean')\" size=\"sm\" />\n </wx-card>\n\n <wx-card :title=\"t('page.sources')\">\n <div class=\"wx-audit-overview__badges\">\n <wx-badge v-for=\"source in counts.sources.searched\" :key=\"source\" type=\"success\">{{\n source\n }}</wx-badge>\n </div>\n <div v-if=\"counts.sources.missing.length\" class=\"wx-audit-overview__missing\">\n <wx-text size=\"sm\" tone=\"warning\">{{ t('page.sources-missing') }}</wx-text>\n <wx-badge v-for=\"source in counts.sources.missing\" :key=\"source\" type=\"warning\">{{\n source\n }}</wx-badge>\n </div>\n </wx-card>\n </template>\n </template>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-overview {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n container-type: inline-size;\n}\n\n.wx-audit-overview__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-12);\n margin-bottom: var(--wx-space-8);\n}\n\n.wx-audit-overview__end {\n margin-left: auto;\n}\n\n.wx-audit-overview__summary {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-24);\n}\n\n.wx-audit-overview__health {\n display: flex;\n flex: 1 1 20rem;\n align-items: center;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n/* The help is a sentence; it wraps beside the circle rather than stretching the card. */\n.wx-audit-overview__parts {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n max-width: 36ch;\n min-width: 0;\n}\n\n.wx-audit-overview__stats {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n gap: var(--wx-space-16) var(--wx-space-32);\n}\n\n.wx-audit-overview__meta {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n margin-top: var(--wx-space-16);\n}\n\n/* A long domain breaks rather than pushing the card sideways on a phone. */\n.wx-audit-overview__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-overview__groups {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-audit-overview__groups li {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-overview__badges,\n.wx-audit-overview__missing {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-overview__missing {\n margin-top: var(--wx-space-12);\n}\n</style>\n","import type { AuditResourceRow } from './types'\n\n/**\n * Whether the browser is worth asking for a picture of the page: the run reached it and it\n * answered. One past the run's limit or on the stand was never asked, and one that failed for the\n * run would fail here too — the card keeps the placeholder for those, with nothing to open.\n */\nexport function viewable(row: AuditResourceRow): boolean {\n return row.checked && row.status !== null && row.status < 400 && row.error === null\n}\n","<script setup lang=\"ts\">\nimport { computed, onBeforeUnmount, ref, watch } from 'vue'\nimport { useRouter } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxDrawer,\n WxIcon,\n WxImage,\n WxLink,\n WxSkeleton,\n WxTable,\n WxTabs,\n WxText,\n type BadgeType,\n type TabItem,\n type TabValue,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditDetails from './AuditDetails.vue'\nimport { createAuditApi } from './api'\nimport { viewable } from './resources'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditLinkRow,\n AuditPage,\n AuditPageCard,\n AuditResourceRow,\n AuditResourceTab,\n AuditRun,\n AuditSeverity,\n} from './types'\n\n/**\n * One page of the snapshot, sliding in from the right (§8): what it answered and what its head\n * says, its findings, the links that lead in and out of it — with the answer of each own page\n * and the class of each host — what it loads (pictures, CSS, JS) with what each answered, and\n * its structured data with what the types lack.\n *\n * «Recheck» asks this one address again (a run of the `urls` scope) and says what of its findings\n * in the last full run are fixed; «Export» downloads the page — snapshot, findings and links.\n */\nconst props = defineProps<{\n run: number\n /** Where the section lives — the recheck's comparison opens on its runs. */\n base?: string\n /** The page to show; null keeps the card closed. */\n pageId: number | null\n /** Check ids and their titles in the reader's language, for the findings tab. */\n titles: Record<string, string>\n}>()\n\nconst emit = defineEmits<{ close: [] }>()\n\n/*\n * The card is wide: a page has long addresses, headers and hreflang lists. Its width is kept under\n * a key of its own, so one remembered from the narrow card of before does not keep it narrow.\n */\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nconst router = useRouter()\nuseAuditMessages()\n\nconst canRun = context.can('audit.run') || context.can('audit.manage')\nconst recheck = ref<AuditRun | null>(null)\nconst rechecking = ref(false)\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nconst POLL_MS = 2000\n\n/* The page in its own words: the run it was crawled in, then one more, of just this address. */\nasync function startRecheck(): Promise<void> {\n if (!card.value) return\n\n rechecking.value = true\n recheck.value = null\n\n try {\n follow(await api.start('urls', [card.value.page.url]))\n } catch (error) {\n rechecking.value = false\n toast.danger(message(error))\n }\n}\n\nfunction follow(run: AuditRun): void {\n clearTimeout(timer)\n\n if (run.status === 'queued' || run.status === 'running') {\n timer = setTimeout(async () => {\n try {\n follow(await api.run(run.id))\n } catch (error) {\n rechecking.value = false\n toast.danger(message(error))\n }\n }, POLL_MS)\n\n return\n }\n\n rechecking.value = false\n recheck.value = run\n}\n\nfunction compareRecheck(): void {\n if (recheck.value && props.base) {\n void router.push({ path: `${props.base}/runs`, query: { to: String(recheck.value.id) } })\n }\n}\n\nonBeforeUnmount(() => clearTimeout(timer))\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst card = ref<AuditPageCard | null>(null)\nconst failure = ref<string | null>(null)\nconst tab = ref<TabValue>('overview')\nconst links = ref<AuditPage<AuditLinkRow> | null>(null)\nconst linksLoading = ref(false)\nconst resources = ref<AuditPage<AuditResourceRow> | null>(null)\nconst resourcesLoading = ref(false)\n\nconst resourceTabs: AuditResourceTab[] = ['images', 'css', 'js']\n\nconst open = computed({\n get: () => props.pageId !== null,\n set: (value) => {\n if (!value) emit('close')\n },\n})\n\nconst tabs = computed<TabItem[]>(() => [\n { value: 'overview', label: t('page.card-overview') },\n { value: 'issues', label: t('page.card-issues'), badge: card.value?.counts.issues || undefined },\n { value: 'in', label: t('page.card-incoming'), badge: card.value?.counts.incoming || undefined },\n { value: 'out', label: t('page.card-outgoing'), badge: card.value?.counts.outgoing || undefined },\n { value: 'images', label: t('page.card-images'), badge: card.value?.counts.images || undefined },\n { value: 'css', label: t('page.card-css'), badge: card.value?.counts.css || undefined },\n { value: 'js', label: t('page.card-js'), badge: card.value?.counts.js || undefined },\n {\n value: 'microdata',\n label: t('page.card-microdata'),\n badge: card.value?.counts.microdata || undefined,\n },\n])\n\nconst resourceTab = computed<AuditResourceTab | null>(() =>\n resourceTabs.includes(tab.value as AuditResourceTab) ? (tab.value as AuditResourceTab) : null,\n)\n\nconst severities: Record<AuditSeverity, BadgeType> = {\n error: 'danger',\n warning: 'warning',\n notice: 'info',\n}\n\nconst hostTypes: Record<string, BadgeType> = {\n own: 'success',\n own_mirror: 'warning',\n dev: 'danger',\n external: 'info',\n}\n\nconst linkColumns = computed<TableColumn<AuditLinkRow>[]>(() => [\n { key: 'url', label: t('page.address'), minWidth: 220 },\n { key: 'status', label: t('page.field-status'), width: 80 },\n { key: 'kind', label: t('page.kind'), width: 90 },\n { key: 'anchor', label: t('page.anchor'), minWidth: 140 },\n { key: 'host_class', label: t('page.host'), width: 120 },\n])\n\n/** Pictures show their alt; stylesheets and scripts how they are cached and compressed. */\nconst resourceColumns = computed<TableColumn<AuditResourceRow>[]>(() => [\n { key: 'url', label: t('page.address'), minWidth: 220 },\n { key: 'status', label: t('page.field-status'), width: 80 },\n { key: 'bytes', label: t('page.size'), width: 110 },\n ...(resourceTab.value === 'images'\n ? [{ key: 'alt', label: t('page.alt'), minWidth: 120 }]\n : [\n { key: 'cache_control', label: t('page.cache'), minWidth: 120 },\n { key: 'compression', label: t('page.field-compression'), width: 100 },\n ]),\n])\n\n/*\n * The block indented, the way a person reads JSON. One the server cut at its length limit does not\n * parse, and is shown as the page printed it rather than not at all.\n */\nfunction pretty(source: string): string {\n try {\n return JSON.stringify(JSON.parse(source), null, 2)\n } catch {\n return source\n }\n}\n\nfunction size(row: AuditResourceRow): string {\n if (row.bytes === null) return ''\n\n const kb = row.bytes / 1024\n const text = kb >= 1024 ? `${(kb / 1024).toFixed(1)} MB` : `${Math.round(kb)} KB`\n\n return row.width && row.height ? `${text} · ${row.width}×${row.height}` : text\n}\n\n/** The answer, the markup and where the page came from — label and value, in reading order. */\n/*\n * A fact is a line, or a list: hreflang and Open Graph are key and value per row, the key set apart\n * as a tag so the eye does not run it into the address after it; JSON-LD is the types as tags.\n */\ntype Fact = string | { pairs: [string, string][] } | { tags: string[]; error?: string | null }\n\nconst facts = computed<[string, Fact][]>(() => {\n const page = card.value?.page\n\n if (!page) return []\n\n const rows: [string, unknown][] = [\n [t('page.field-status'), page.status ?? t('page.status-none')],\n [t('page.field-final_status'), page.redirect_to ? page.final_status : null],\n [t('page.field-redirect_to'), page.redirect_to],\n [t('page.error'), page.error],\n [t('page.field-content_type'), page.content_type],\n [t('page.field-bytes'), page.bytes],\n [t('page.field-ttfb_ms'), page.ttfb_ms],\n [t('page.field-total_ms'), page.total_ms],\n [t('page.field-compression'), page.compression],\n [t('page.field-source'), t(`page.source-${page.source}`)],\n [t('page.field-depth'), page.depth],\n [t('page.field-indexable'), page.indexable ? t('page.yes') : t('page.no')],\n [t('page.field-blocked_by_robots'), page.blocked_by_robots ? t('page.yes') : null],\n [t('page.field-title'), page.title],\n [t('page.field-description'), page.description],\n [t('page.field-h1'), page.h1.join(' · ') || null],\n [t('page.field-canonical'), page.canonical],\n [t('page.field-robots_meta'), page.robots_meta],\n [t('page.field-x_robots_tag'), page.x_robots_tag],\n [t('page.field-lang'), page.lang],\n [\n 'hreflang',\n page.hreflang.length\n ? { pairs: page.hreflang.map((alternate) => [alternate.lang, alternate.url]) }\n : null,\n ],\n [\n 'Open Graph',\n Object.keys(page.og).length\n ? { pairs: Object.entries(page.og).map(([key, value]) => [`og:${key}`, String(value)]) }\n : null,\n ],\n [\n 'Twitter',\n Object.keys(page.twitter).length\n ? {\n pairs: Object.entries(page.twitter).map(([key, value]) => [\n `twitter:${key}`,\n String(value),\n ]),\n }\n : null,\n ],\n [\n 'JSON-LD',\n page.json_ld.length\n ? {\n tags: page.json_ld.flatMap((block) => block.types),\n error: page.json_ld.find((block) => block.error)?.error ?? null,\n }\n : null,\n ],\n [t('page.field-word_count'), page.word_count],\n [t('page.field-links_in'), page.links_in],\n [t('page.field-links_out_internal'), page.links_out_internal],\n [t('page.field-links_out_external'), page.links_out_external],\n [t('page.field-images'), page.images],\n [t('page.field-images_without_alt'), page.images_without_alt || null],\n ]\n\n return rows\n .filter(([, value]) => value !== null && value !== undefined && value !== '')\n .map(([label, value]) => [label, typeof value === 'object' ? (value as Fact) : String(value)])\n})\n\nfunction statusType(value: number | null): BadgeType {\n if (value === null) return 'danger'\n if (value >= 500) return 'danger'\n if (value >= 400) return 'warning'\n if (value >= 300) return 'info'\n\n return 'success'\n}\n\nasync function load(id: number): Promise<void> {\n clearTimeout(timer)\n rechecking.value = false\n recheck.value = null\n card.value = null\n failure.value = null\n links.value = null\n resources.value = null\n tab.value = 'overview'\n\n try {\n card.value = await api.page(props.run, id)\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nasync function loadLinks(state: TableState): Promise<void> {\n if (props.pageId === null || (tab.value !== 'in' && tab.value !== 'out')) return\n\n linksLoading.value = true\n\n try {\n links.value = await api.links(props.run, props.pageId, {\n direction: tab.value,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n failure.value = message(error)\n } finally {\n linksLoading.value = false\n }\n}\n\nasync function loadResources(state: TableState): Promise<void> {\n const current = resourceTab.value\n\n if (props.pageId === null || current === null) return\n\n resourcesLoading.value = true\n\n try {\n resources.value = await api.resources(props.run, props.pageId, {\n tab: current,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n failure.value = message(error)\n } finally {\n resourcesLoading.value = false\n }\n}\n\nwatch(\n () => props.pageId,\n (id) => {\n if (id !== null) void load(id)\n },\n { immediate: true },\n)\n\nwatch(tab, () => {\n links.value = null\n resources.value = null\n})\n</script>\n\n<template>\n <wx-drawer\n v-model:open=\"open\"\n size=\"min(1100px, 75vw)\"\n :min-size=\"480\"\n resizable\n persist=\"webx-audit.page-card-wide\"\n >\n <template #title>\n <span class=\"wx-audit-card__title\">\n <wx-badge v-if=\"card\" :type=\"statusType(card.page.status)\" size=\"sm\">{{\n card.page.status ?? '—'\n }}</wx-badge>\n <span class=\"wx-audit-card__url\">{{ card?.page.url ?? '' }}</span>\n </span>\n </template>\n\n <template #extra>\n <span v-if=\"card\" class=\"wx-audit-card__extra\">\n <wx-button\n v-if=\"canRun\"\n size=\"sm\"\n icon=\"refresh\"\n :loading=\"rechecking\"\n @click=\"startRecheck\"\n >{{ t('page.recheck') }}</wx-button\n >\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"download\"\n :href=\"api.pageFile(props.run, card.page.id)\"\n >{{ t('page.export-page') }}</wx-button\n >\n <wx-link :href=\"card.page.url\" target=\"_blank\">{{ t('page.open-page') }}</wx-link>\n </span>\n </template>\n\n <wx-text v-if=\"failure\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!card\" :rows=\"6\" />\n\n <div v-else class=\"wx-audit-card\">\n <wx-alert v-if=\"rechecking\" type=\"info\" :description=\"t('page.recheck-running')\" />\n <wx-alert\n v-else-if=\"recheck && recheck.status === 'done' && recheck.counts\"\n :type=\"recheck.counts.new > 0 ? 'warning' : 'success'\"\n >\n <div class=\"wx-audit-card__recheck\">\n <span>{{ t('page.recheck-fixed', { count: recheck.counts.fixed }) }}</span>\n <span>{{ t('page.recheck-new', { count: recheck.counts.new }) }}</span>\n <wx-button v-if=\"props.base\" size=\"sm\" variant=\"text\" @click=\"compareRecheck\">{{\n t('page.recheck-compare')\n }}</wx-button>\n </div>\n </wx-alert>\n <wx-alert\n v-else-if=\"recheck\"\n type=\"danger\"\n :description=\"recheck.error ?? t(`page.status-${recheck.status}`)\"\n />\n <wx-text v-if=\"card.page.title\" weight=\"semibold\">{{ card.page.title }}</wx-text>\n\n <wx-tabs v-model=\"tab\" :items=\"tabs\">\n <dl v-if=\"tab === 'overview'\" class=\"wx-audit-card__facts\">\n <template v-for=\"[label, value] in facts\" :key=\"label\">\n <dt>{{ label }}</dt>\n <dd v-if=\"typeof value === 'string'\">{{ value }}</dd>\n <dd v-else-if=\"'pairs' in value\" class=\"wx-audit-card__pairs\">\n <template v-for=\"([key, text], index) in value.pairs\" :key=\"index\">\n <wx-badge size=\"sm\" class=\"wx-audit-card__key\">{{ key }}</wx-badge>\n <span>{{ text }}</span>\n </template>\n </dd>\n <dd v-else class=\"wx-audit-card__tags\">\n <wx-badge v-for=\"(tag, index) in value.tags\" :key=\"index\" type=\"info\" size=\"sm\">{{\n tag\n }}</wx-badge>\n <wx-text v-if=\"value.error\" size=\"sm\" tone=\"danger\">{{ value.error }}</wx-text>\n </dd>\n </template>\n <template v-if=\"Object.keys(card.page.headers).length\">\n <dt class=\"wx-audit-card__section\">{{ t('page.headers') }}</dt>\n <dd />\n <template v-for=\"(value, name) in card.page.headers\" :key=\"name\">\n <dt class=\"wx-audit-card__code\">{{ name }}</dt>\n <dd class=\"wx-audit-card__code\">{{ value }}</dd>\n </template>\n </template>\n </dl>\n\n <div v-else-if=\"tab === 'issues'\" class=\"wx-audit-card__issues\">\n <wx-text v-if=\"!card.issues.length\" tone=\"muted\">{{ t('page.no-issues') }}</wx-text>\n <div v-for=\"issue in card.issues\" :key=\"issue.id\" class=\"wx-audit-card__issue\">\n <div class=\"wx-audit-card__issue-head\">\n <wx-badge :type=\"severities[issue.severity]\" dot>{{\n t(`page.severity-${issue.severity}`)\n }}</wx-badge>\n <wx-text size=\"sm\" weight=\"semibold\">{{\n props.titles[issue.check] ?? issue.check\n }}</wx-text>\n <wx-badge v-if=\"issue.state === 'new'\" type=\"primary\" size=\"sm\">{{\n t('page.state-new')\n }}</wx-badge>\n </div>\n <audit-details :details=\"issue.details\" />\n </div>\n </div>\n\n <wx-table\n v-else-if=\"resourceTab\"\n :key=\"`resources-${String(tab)}`\"\n :data=\"resources\"\n :columns=\"resourceColumns\"\n row-key=\"id\"\n flush\n :loading=\"resourcesLoading\"\n :per-page-options=\"[]\"\n :empty-text=\"t('page.no-resources')\"\n @state-change=\"loadResources\"\n >\n <template #cell-url=\"{ row }\">\n <span v-if=\"resourceTab === 'images'\" class=\"wx-audit-card__picture\">\n <!-- Only a picture that answered is fetched: the stand's and a broken one keep the\n placeholder rather than a request the browser is sure to lose. -->\n <wx-image\n :src=\"viewable(row) ? row.url : undefined\"\n :alt=\"row.alt ?? ''\"\n :width=\"48\"\n :height=\"48\"\n fit=\"cover\"\n radius=\"var(--wx-radius-sm)\"\n preview\n :preview-label=\"t('page.view-full')\"\n class=\"wx-audit-card__thumb\"\n :class=\"{ 'is-unviewable': !viewable(row) }\"\n >\n <template v-if=\"!viewable(row)\" #placeholder>\n <wx-icon name=\"image\" />\n </template>\n </wx-image>\n <span class=\"wx-audit-card__url\">{{ row.url }}</span>\n </span>\n <span v-else class=\"wx-audit-card__url\">{{ row.url }}</span>\n <wx-text v-if=\"row.location\" size=\"sm\" tone=\"muted\" class=\"wx-audit-card__url\">\n → {{ row.location }}</wx-text\n >\n <wx-text v-if=\"row.error\" size=\"sm\" tone=\"danger\">{{ row.error }}</wx-text>\n </template>\n <template #cell-status=\"{ row }\">\n <wx-badge v-if=\"row.status !== null\" :type=\"statusType(row.status)\" size=\"sm\">{{\n row.status\n }}</wx-badge>\n <wx-badge v-else-if=\"row.checked\" type=\"danger\" size=\"sm\">—</wx-badge>\n <wx-text v-else size=\"sm\" tone=\"muted\">{{ t('page.not-checked') }}</wx-text>\n </template>\n <template #cell-bytes=\"{ row }\">{{ size(row) }}</template>\n <template #cell-alt=\"{ row }\">\n <wx-text v-if=\"row.alt === null && row.kind === 'img'\" size=\"sm\" tone=\"danger\">{{\n t('page.missing')\n }}</wx-text>\n <template v-else>{{ row.alt ?? '' }}</template>\n </template>\n </wx-table>\n\n <div v-else-if=\"tab === 'microdata'\" class=\"wx-audit-card__issues\">\n <wx-text v-if=\"!card.page.json_ld.length\" tone=\"muted\">{{\n t('page.no-json-ld')\n }}</wx-text>\n <div\n v-for=\"(block, index) in card.page.json_ld\"\n :key=\"index\"\n class=\"wx-audit-card__issue\"\n >\n <div class=\"wx-audit-card__issue-head\">\n <wx-text size=\"sm\" weight=\"semibold\">{{\n t('page.jsonld-block', { number: index + 1 })\n }}</wx-text>\n <wx-badge v-for=\"type in block.types\" :key=\"type\" size=\"sm\">{{ type }}</wx-badge>\n </div>\n <wx-text v-if=\"block.error\" size=\"sm\" tone=\"danger\"\n >{{ t('page.jsonld-error') }} {{ block.error }}</wx-text\n >\n <template v-for=\"(item, position) in block.items ?? []\" :key=\"position\">\n <wx-text v-if=\"item.missing.length\" size=\"sm\" tone=\"danger\"\n >{{ item.type }} — {{ t('page.jsonld-required') }}\n {{ item.missing.join(', ') }}</wx-text\n >\n <wx-text v-if=\"item.recommended.length\" size=\"sm\" tone=\"muted\"\n >{{ item.type }} — {{ t('page.jsonld-recommended') }}\n {{ item.recommended.join(', ') }}</wx-text\n >\n <wx-text\n v-if=\"!item.missing.length && !item.recommended.length\"\n size=\"sm\"\n tone=\"success\"\n >{{ item.type }} — {{ t('page.jsonld-complete') }}</wx-text\n >\n </template>\n <pre v-if=\"block.source\" class=\"wx-audit-card__source\">{{ pretty(block.source) }}</pre>\n </div>\n </div>\n\n <wx-table\n v-else\n :key=\"String(tab)\"\n :data=\"links\"\n :columns=\"linkColumns\"\n row-key=\"id\"\n flush\n :loading=\"linksLoading\"\n :per-page-options=\"[]\"\n :empty-text=\"t('page.no-links')\"\n @state-change=\"loadLinks\"\n >\n <template #cell-url=\"{ row }\">\n <span class=\"wx-audit-card__url\">{{ row.url ?? '—' }}</span>\n </template>\n <template #cell-status=\"{ row }\">\n <wx-badge v-if=\"row.status !== null\" :type=\"statusType(row.status)\" size=\"sm\">{{\n row.status\n }}</wx-badge>\n </template>\n <template #cell-host_class=\"{ row }\">\n <wx-badge v-if=\"row.host_class\" :type=\"hostTypes[row.host_class] ?? 'info'\" size=\"sm\">{{\n t(`page.host-${row.host_class}`)\n }}</wx-badge>\n </template>\n </wx-table>\n </wx-tabs>\n </div>\n </wx-drawer>\n</template>\n\n<style scoped>\n.wx-audit-card {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-card__title {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n min-width: 0;\n}\n\n.wx-audit-card__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-card__facts {\n display: grid;\n grid-template-columns: minmax(120px, max-content) minmax(0, 1fr);\n gap: var(--wx-space-6) var(--wx-space-16);\n margin: var(--wx-space-12) 0 0;\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-audit-card__facts dt {\n color: var(--wx-text-muted);\n}\n\n.wx-audit-card__facts dd {\n margin: 0;\n overflow-wrap: anywhere;\n white-space: pre-line;\n}\n\n/* Key and value in two columns of their own, the key against its value, a row apart from the next pair. */\n.wx-audit-card__pairs {\n display: grid;\n grid-template-columns: max-content minmax(0, 1fr);\n gap: var(--wx-space-6) var(--wx-space-8);\n align-items: baseline;\n}\n\n.wx-audit-card__key {\n justify-self: end;\n font-family: var(--wx-font-family-mono);\n}\n\n.wx-audit-card__tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-6);\n}\n\n.wx-audit-card__section {\n margin-top: var(--wx-space-12);\n font-weight: var(--wx-font-weight-semibold);\n}\n\n.wx-audit-card__code {\n font-family: var(--wx-font-family-mono);\n}\n\n.wx-audit-card__issues {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n margin-top: var(--wx-space-12);\n}\n\n.wx-audit-card__issue {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n/* A picture is recognised by sight faster than by its hashed file name. */\n.wx-audit-card__picture {\n display: flex;\n align-items: center;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-card__thumb {\n flex: none;\n}\n\n/* The same box as a picture that would not load, with the same mark — nothing here to open. */\n.wx-audit-card__thumb.is-unviewable :deep(.wx-image__placeholder .wx-icon) {\n width: 32px;\n height: 32px;\n}\n\n.wx-audit-card__source {\n max-height: 480px;\n margin: 0;\n padding: var(--wx-space-8);\n overflow: auto;\n border-radius: var(--wx-radius-sm);\n background: var(--wx-bg-muted);\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-xs);\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n.wx-audit-card__issue-head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-card__extra {\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-card__recheck {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-12);\n}\n</style>\n","import type { AuditFieldType, AuditFilterOp, AuditPageField } from './types'\n\n/**\n * The fields of the snapshot, as `PageColumns` lists them on the server: what the pages screen\n * can show, filter on, sort by and export. Kept in the same order, so the column picker reads\n * like the page's card — address and answer first, markup, then speed and links.\n */\nexport const PAGE_FIELDS: Record<AuditPageField, AuditFieldType> = {\n url: 'url',\n status: 'status',\n final_status: 'status',\n redirect_to: 'url',\n source: 'source',\n depth: 'number',\n indexable: 'bool',\n issues: 'number',\n title: 'text',\n description: 'text',\n h1: 'text',\n canonical: 'url',\n robots_meta: 'text',\n x_robots_tag: 'text',\n lang: 'text',\n content_type: 'text',\n bytes: 'number',\n ttfb_ms: 'number',\n total_ms: 'number',\n compression: 'text',\n word_count: 'number',\n links_in: 'number',\n links_out_internal: 'number',\n links_out_external: 'number',\n images: 'number',\n images_without_alt: 'number',\n in_sitemap: 'bool',\n in_registry: 'bool',\n blocked_by_robots: 'bool',\n}\n\nexport const DEFAULT_COLUMNS: AuditPageField[] = [\n 'url',\n 'status',\n 'indexable',\n 'title',\n 'word_count',\n 'links_in',\n 'issues',\n]\n\n/** `h1` is read out of a JSON list: shown and exported, not filtered or sorted on. */\nexport const COMPUTED_FIELDS: AuditPageField[] = ['h1']\n\n/** What can be asked of a field of each type. */\nexport const OPERATIONS: Record<AuditFieldType, AuditFilterOp[]> = {\n url: ['contains', 'eq', 'empty', 'filled'],\n text: ['contains', 'eq', 'empty', 'filled'],\n number: ['gt', 'lt', 'eq', 'empty'],\n status: ['eq', 'gt', 'lt', 'empty'],\n bool: ['yes', 'no'],\n source: ['eq'],\n}\n\n/** The operations that need a value typed beside them. */\nexport const WITH_VALUE: AuditFilterOp[] = ['contains', 'eq', 'gt', 'lt']\n\nexport const SOURCES = ['home', 'sitemap', 'registry', 'link'] as const\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useAdmin, useDates, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxCheckboxGroup,\n WxInput,\n WxPopover,\n WxSelect,\n WxTable,\n WxText,\n type BadgeType,\n type SelectValue,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditLayout from './AuditLayout.vue'\nimport AuditPageCard from './AuditPageCard.vue'\nimport { createAuditApi } from './api'\nimport {\n COMPUTED_FIELDS,\n DEFAULT_COLUMNS,\n OPERATIONS,\n PAGE_FIELDS,\n SOURCES,\n WITH_VALUE,\n} from './fields'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditFieldFilter,\n AuditFilterOp,\n AuditPage,\n AuditPageField,\n AuditPageQuery,\n AuditPageRow,\n AuditRun,\n} from './types'\n\n/**\n * Every address the last full run crawled (§8, «Pages»): any field of the snapshot as a column,\n * a filter on any of them, the list as CSV, and a row that opens the page's card.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\nconst dates = useDates()\n\nconst STORAGE = 'webx-audit.pages.columns'\n\nconst run = ref<AuditRun | null>(null)\nconst ready = ref(false)\nconst page = ref<AuditPage<AuditPageRow> | null>(null)\nconst loading = ref(false)\nconst opened = ref<number | null>(null)\nconst titles = ref<Record<string, string>>({})\n\nconst status = ref<string | null>(null)\nconst indexable = ref<string | null>(null)\nconst check = ref<string | null>(null)\nconst filters = ref<AuditFieldFilter[]>([])\nlet last: TableState = { page: 1, perPage: 50, sort: null, search: '' }\n\nconst visible = ref<AuditPageField[]>(restore())\n\nfunction restore(): AuditPageField[] {\n try {\n const saved: unknown = JSON.parse(window.localStorage.getItem(STORAGE) ?? 'null')\n\n if (Array.isArray(saved)) {\n const known = saved.filter((key): key is AuditPageField => key in PAGE_FIELDS)\n\n if (known.length) return known\n }\n } catch {\n // A private window or a broken value: the default columns, as for anyone else.\n }\n\n return [...DEFAULT_COLUMNS]\n}\n\nwatch(visible, (keys) => {\n try {\n window.localStorage.setItem(STORAGE, JSON.stringify(keys))\n } catch {\n // Not remembered — still shown.\n }\n})\n\nconst fields = Object.keys(PAGE_FIELDS) as AuditPageField[]\n\nconst columnOptions = computed(() =>\n fields.map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst filterFields = computed(() =>\n fields\n .filter((key) => !COMPUTED_FIELDS.includes(key))\n .map((key) => ({ value: key, label: t(`page.field-${key}`) })),\n)\n\nconst columns = computed<TableColumn<AuditPageRow>[]>(() =>\n /* The picker keeps the order things were ticked in; the table keeps the card's order. */\n fields\n .filter((key) => visible.value.includes(key))\n .map((key) => ({\n key,\n label: t(`page.field-${key}`),\n sortable: !COMPUTED_FIELDS.includes(key),\n minWidth: PAGE_FIELDS[key] === 'url' || PAGE_FIELDS[key] === 'text' ? 220 : undefined,\n align: PAGE_FIELDS[key] === 'number' ? 'right' : undefined,\n })),\n)\n\nconst statusOptions = computed(() => [\n ...['2xx', '3xx', '4xx', '5xx'].map((value) => ({ value, label: value })),\n { value: 'none', label: t('page.status-none') },\n])\n\nconst indexableOptions = computed(() => [\n { value: '1', label: t('page.indexable-yes') },\n { value: '0', label: t('page.indexable-no') },\n])\n\nconst checkOptions = computed(() =>\n Object.entries(titles.value).map(([value, label]) => ({ value, label })),\n)\n\nconst filtersCount = computed(\n () =>\n [status.value, indexable.value, check.value].filter(Boolean).length +\n filters.value.filter(complete).length,\n)\n\nconst query = computed<AuditPageQuery>(() => ({\n status: status.value,\n indexable: indexable.value === null ? null : indexable.value === '1',\n check: check.value,\n filters: filters.value.filter(complete),\n}))\n\nfunction complete(filter: AuditFieldFilter): boolean {\n return !WITH_VALUE.includes(filter.op) || (filter.value ?? '').trim() !== ''\n}\n\nfunction pick(value: SelectValue | SelectValue[] | null | undefined): string | null {\n return typeof value === 'string' && value !== '' ? value : null\n}\n\nfunction operations(field: AuditPageField) {\n return OPERATIONS[PAGE_FIELDS[field]].map((op) => ({ value: op, label: t(`page.op-${op}`) }))\n}\n\nfunction addFilter(): void {\n filters.value = [...filters.value, { field: 'title', op: 'empty' }]\n}\n\nfunction setField(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const field = pick(value) as AuditPageField | null\n\n if (!field) return\n\n filters.value = filters.value.map((filter, at) =>\n at === index ? { field, op: OPERATIONS[PAGE_FIELDS[field]][0]!, value: '' } : filter,\n )\n}\n\nfunction setOp(index: number, value: SelectValue | SelectValue[] | null | undefined): void {\n const op = pick(value) as AuditFilterOp | null\n\n if (op)\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, op } : filter))\n}\n\nfunction setValue(index: number, value: string): void {\n filters.value = filters.value.map((filter, at) => (at === index ? { ...filter, value } : filter))\n}\n\nfunction removeFilter(index: number): void {\n filters.value = filters.value.filter((_, at) => at !== index)\n}\n\nfunction setColumns(keys: unknown[]): void {\n const next = keys.filter((key): key is AuditPageField => String(key) in PAGE_FIELDS)\n\n /* A table without columns is a blank card; the address stays at least. */\n visible.value = next.length ? next : ['url']\n}\n\nconst types: Record<string, BadgeType> = {\n '2': 'success',\n '3': 'info',\n '4': 'warning',\n '5': 'danger',\n}\n\nfunction statusType(value: unknown): BadgeType {\n return types[String(value ?? '').charAt(0)] ?? 'danger'\n}\n\nfunction text(value: unknown): string {\n return value === null || value === undefined || value === '' ? '—' : String(value)\n}\n\nasync function load(state: TableState = last): Promise<void> {\n last = state\n\n if (run.value === null) return\n\n loading.value = true\n\n try {\n page.value = await api.pages(run.value.id, {\n ...query.value,\n search: state.search,\n sort: state.sort ? `${state.sort.order === 'desc' ? '-' : ''}${state.sort.key}` : null,\n page: state.page,\n per_page: state.perPage,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nfunction download(): void {\n if (run.value === null) return\n\n window.location.assign(\n api.pagesFile(\n run.value.id,\n { ...query.value, search: last.search },\n columns.value.map((column) => column.key),\n ),\n )\n}\n\nwatch(query, () => void load({ ...last, page: 1 }), { deep: true })\n\nonMounted(async () => {\n try {\n run.value = (await api.latest()).crawled\n\n if (run.value !== null) {\n const checks = await api.checks(run.value.id)\n titles.value = Object.fromEntries(checks.map((row) => [row.id, row.title]))\n }\n } catch (error) {\n toast.danger(message(error))\n } finally {\n ready.value = true\n }\n\n void load()\n})\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"pages\">\n <wx-text v-if=\"ready && run === null\" tone=\"muted\" class=\"wx-audit-pages__none\">{{\n t('page.pages-none')\n }}</wx-text>\n\n <wx-table\n v-else\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loading || !ready\"\n :per-page-options=\"[50, 100, 200]\"\n :search-placeholder=\"t('page.search-url')\"\n :filters-count=\"filtersCount\"\n :filters-label=\"panel('filters.title')\"\n :filters-width=\"420\"\n :empty-text=\"t('page.empty')\"\n @state-change=\"load\"\n @row-click=\"(row) => (opened = row.id)\"\n >\n <template #title>\n <wx-text v-if=\"run\" size=\"sm\" tone=\"muted\">{{\n t('page.pages-run', { date: dates.short(run.finished_at) })\n }}</wx-text>\n </template>\n\n <template #actions>\n <wx-popover :title=\"t('page.columns')\" width=\"300\">\n <template #trigger>\n <wx-button size=\"sm\" variant=\"text\" icon=\"sliders\">{{ t('page.columns') }}</wx-button>\n </template>\n <wx-checkbox-group\n :model-value=\"visible\"\n :options=\"columnOptions\"\n size=\"sm\"\n class=\"wx-audit-pages__picker\"\n @update:model-value=\"setColumns\"\n />\n </wx-popover>\n <wx-button size=\"sm\" variant=\"text\" icon=\"download\" :disabled=\"!run\" @click=\"download\">{{\n t('page.export')\n }}</wx-button>\n </template>\n\n <template #filters>\n <div class=\"wx-audit-pages__filters\">\n <wx-select\n :model-value=\"status\"\n :options=\"statusOptions\"\n :placeholder=\"t('page.any-status')\"\n clearable\n @update:model-value=\"status = pick($event)\"\n />\n <wx-select\n :model-value=\"indexable\"\n :options=\"indexableOptions\"\n :placeholder=\"t('page.any-indexable')\"\n clearable\n @update:model-value=\"indexable = pick($event)\"\n />\n <wx-select\n :model-value=\"check\"\n :options=\"checkOptions\"\n :placeholder=\"t('page.any-check')\"\n clearable\n filterable\n @update:model-value=\"check = pick($event)\"\n />\n\n <div v-for=\"(filter, index) in filters\" :key=\"index\" class=\"wx-audit-pages__filter\">\n <wx-select\n :model-value=\"filter.field\"\n :options=\"filterFields\"\n filterable\n size=\"sm\"\n @update:model-value=\"setField(index, $event)\"\n />\n <wx-select\n :model-value=\"filter.op\"\n :options=\"operations(filter.field)\"\n size=\"sm\"\n @update:model-value=\"setOp(index, $event)\"\n />\n <wx-select\n v-if=\"WITH_VALUE.includes(filter.op) && PAGE_FIELDS[filter.field] === 'source'\"\n :model-value=\"filter.value ?? null\"\n :options=\"SOURCES.map((value) => ({ value, label: t(`page.source-${value}`) }))\"\n size=\"sm\"\n @update:model-value=\"setValue(index, pick($event) ?? '')\"\n />\n <wx-input\n v-else-if=\"WITH_VALUE.includes(filter.op)\"\n :model-value=\"filter.value ?? ''\"\n :placeholder=\"t('page.value')\"\n size=\"sm\"\n @update:model-value=\"setValue(index, String($event ?? ''))\"\n />\n <wx-button\n size=\"sm\"\n variant=\"text\"\n icon=\"close\"\n :aria-label=\"t('page.remove-filter')\"\n @click=\"removeFilter(index)\"\n />\n </div>\n\n <wx-button size=\"sm\" variant=\"text\" icon=\"plus\" @click=\"addFilter\">{{\n t('page.add-filter')\n }}</wx-button>\n </div>\n </template>\n\n <template v-for=\"key in visible\" :key=\"key\" #[`cell-${key}`]=\"{ row }\">\n <wx-badge\n v-if=\"PAGE_FIELDS[key] === 'status' && row[key] !== null\"\n :type=\"statusType(row[key])\"\n size=\"sm\"\n >{{ row[key] }}</wx-badge\n >\n <wx-text v-else-if=\"PAGE_FIELDS[key] === 'status'\" size=\"sm\" tone=\"danger\">{{\n t('page.status-none')\n }}</wx-text>\n <template v-else-if=\"PAGE_FIELDS[key] === 'bool'\">{{\n row[key] ? t('page.yes') : t('page.no')\n }}</template>\n <template v-else-if=\"PAGE_FIELDS[key] === 'source'\">{{\n t(`page.source-${row[key]}`)\n }}</template>\n <wx-badge v-else-if=\"key === 'issues' && row.issues > 0\" type=\"warning\" size=\"sm\">{{\n row.issues\n }}</wx-badge>\n <span v-else :class=\"{ 'wx-audit-pages__long': PAGE_FIELDS[key] === 'url' }\">{{\n text(row[key])\n }}</span>\n </template>\n </wx-table>\n\n <audit-page-card\n v-if=\"run\"\n :run=\"run.id\"\n :base=\"props.base\"\n :page-id=\"opened\"\n :titles=\"titles\"\n @close=\"opened = null\"\n />\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-pages__none {\n display: block;\n padding: var(--wx-space-24);\n}\n\n.wx-audit-pages__filters {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n}\n\n.wx-audit-pages__filter {\n display: grid;\n grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr) auto;\n gap: var(--wx-space-4);\n align-items: center;\n}\n\n.wx-audit-pages__picker {\n max-height: 360px;\n overflow-y: auto;\n}\n\n.wx-audit-pages__long {\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport { WxButton, WxLink, WxSegmented, WxSkeleton, WxText } from '@webx-ui/core'\nimport AuditDetails from './AuditDetails.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type { AuditComparisonKind, AuditComparisonRow, AuditIssue } from './types'\n\n/**\n * One check of a comparison opened: its new, fixed or persisting findings, fifty at a time —\n * fixed ones as the earlier run stored them, the others from the later run.\n */\nconst props = defineProps<{ from: number; to: number; row: AuditComparisonRow }>()\n\nconst api = createAuditApi(useAdmin())\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst KINDS: AuditComparisonKind[] = ['new', 'fixed', 'persisting']\n\n/* Open on what changed: new first, then fixed — persisting only when nothing else is there. */\nconst kind = ref<AuditComparisonKind>(KINDS.find((one) => props.row[one] > 0) ?? 'new')\nconst issues = ref<AuditIssue[] | null>(null)\nconst page = ref(1)\nconst more = ref(false)\nconst failure = ref<string | null>(null)\n\nconst options = computed(() =>\n KINDS.map((value) => ({\n value,\n label: `${t(`page.kind-${value}`)} · ${props.row[value]}`,\n disabled: props.row[value] === 0,\n })),\n)\n\nasync function load(next = 1): Promise<void> {\n failure.value = null\n\n try {\n const answer = await api.compareIssues({\n from: props.from,\n to: props.to,\n kind: kind.value,\n check: props.row.check,\n page: next,\n per_page: 50,\n })\n\n issues.value = next === 1 ? answer.data : [...(issues.value ?? []), ...answer.data]\n page.value = answer.current_page\n more.value = answer.current_page < answer.last_page\n } catch (error) {\n failure.value = message(error)\n }\n}\n\nwatch(\n kind,\n () => {\n issues.value = null\n void load()\n },\n { immediate: true },\n)\n</script>\n\n<template>\n <div class=\"wx-audit-compare\">\n <wx-segmented v-model=\"kind\" :options=\"options\" size=\"sm\" :aria-label=\"t('page.compare')\" />\n\n <wx-text v-if=\"failure\" size=\"sm\" tone=\"danger\">{{ failure }}</wx-text>\n <wx-skeleton v-else-if=\"!issues\" :rows=\"2\" />\n\n <template v-else>\n <div v-for=\"issue in issues\" :key=\"issue.id\" class=\"wx-audit-compare__item\">\n <wx-link v-if=\"issue.url\" :href=\"issue.url\" target=\"_blank\" class=\"wx-audit-compare__url\">{{\n issue.url\n }}</wx-link>\n <audit-details :details=\"issue.details\" />\n </div>\n\n <wx-button v-if=\"more\" size=\"sm\" variant=\"text\" @click=\"load(page + 1)\">…</wx-button>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-audit-compare {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-audit-compare__item {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n min-width: 0;\n}\n\n.wx-audit-compare__url {\n min-width: 0;\n overflow-wrap: anywhere;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, onMounted, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport { useAdmin, useErrorText, useTranslate, WxDate } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxCard,\n WxTable,\n WxText,\n type BadgeType,\n type RowKey,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport AuditCompareIssues from './AuditCompareIssues.vue'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\nimport type {\n AuditComparison,\n AuditComparisonRow,\n AuditPage,\n AuditRun,\n AuditRunStatus,\n AuditSeverity,\n} from './types'\n\n/**\n * The history (§8 «Runs»): every run kept, newest first, with its health and counts. Ticking a\n * run compares it with the one it was analysed against; ticking two compares those two — by\n * fingerprint (decision 8): what is new in the later one, what both have, what is gone. `?to=`\n * opens on one run already ticked — the way the page card's recheck leads here.\n */\nconst props = defineProps<{ base: string }>()\n\nconst api = createAuditApi(useAdmin())\nconst route = useRoute()\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst runs = ref<AuditPage<AuditRun> | null>(null)\nconst loading = ref(false)\nconst selected = ref<RowKey[]>([])\nconst comparison = ref<AuditComparison | null>(null)\nconst comparing = ref(false)\nconst expanded = ref<RowKey[]>([])\n\nconst statuses: Record<AuditRunStatus, BadgeType> = {\n queued: 'info',\n running: 'primary',\n done: 'success',\n failed: 'danger',\n cancelled: 'warning',\n}\n\nconst severities: Record<AuditSeverity, BadgeType> = {\n error: 'danger',\n warning: 'warning',\n notice: 'info',\n}\n\nconst columns = computed<TableColumn<AuditRun>[]>(() => [\n { key: 'id', label: t('page.run-id'), width: 90 },\n { key: 'created_at', label: t('page.started-at'), minWidth: 160 },\n { key: 'scope', label: t('page.scope'), width: 120 },\n { key: 'status', label: t('page.status'), width: 130 },\n { key: 'health', label: t('page.health'), width: 100, align: 'right' },\n { key: 'severity', label: t('page.severity'), minWidth: 170, hideBelow: 640 },\n { key: 'started_by', label: t('page.started-by'), minWidth: 130, hideBelow: 760 },\n])\n\nconst compareColumns = computed<TableColumn<AuditComparisonRow>[]>(() => [\n { key: 'severity', label: t('page.severity'), width: 130 },\n { key: 'title', label: t('page.check') },\n { key: 'new', label: t('page.kind-new'), width: 90, align: 'right' },\n { key: 'fixed', label: t('page.kind-fixed'), width: 100, align: 'right' },\n { key: 'persisting', label: t('page.kind-persisting'), width: 120, align: 'right' },\n])\n\n/* What the selection means: one run against its own previous, or two against each other. */\nconst pair = computed<{ to: number; from: number | null } | null>(() => {\n const ids = selected.value.map(Number).sort((a, b) => a - b)\n\n if (ids.length === 0) return null\n\n return ids.length === 1\n ? { to: ids[0]!, from: null }\n : { to: ids[ids.length - 1]!, from: ids[0]! }\n})\n\nconst scopesDiffer = computed(\n () => comparison.value !== null && comparison.value.from.scope !== comparison.value.to.scope,\n)\n\nfunction who(run: AuditRun): string {\n if (run.started_by === 'schedule') return t('page.by-schedule')\n if (run.started_by === 'mcp') return t('page.by-mcp')\n if (run.started_by === 'console') return t('page.by-console')\n\n return run.started_by ? t('page.by-person') : ''\n}\n\nasync function load(state?: TableState): Promise<void> {\n loading.value = true\n\n try {\n runs.value = await api.runs({ page: state?.page ?? 1, per_page: state?.perPage ?? 20 })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nasync function compare(): Promise<void> {\n const current = pair.value\n\n comparison.value = null\n expanded.value = []\n\n if (!current) return\n\n comparing.value = true\n\n try {\n comparison.value = await api.compare(current.to, current.from)\n } catch (error) {\n toast.danger(message(error))\n } finally {\n comparing.value = false\n }\n}\n\nonMounted(() => {\n const to = Number(route.query.to)\n\n if (Number.isInteger(to) && to > 0) selected.value = [to]\n})\n\nwatch(selected, (keys) => {\n /* Two at most: a third tick replaces the oldest one. */\n if (keys.length > 2) selected.value = keys.slice(-2)\n else void compare()\n})\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"runs\" :card=\"false\">\n <div class=\"wx-audit-runs\">\n <wx-card>\n <wx-table\n v-model:selected=\"selected\"\n :data=\"runs\"\n :columns=\"columns\"\n row-key=\"id\"\n selectable\n :selectable-if=\"(row: AuditRun) => row.status === 'done'\"\n flush\n :loading=\"loading\"\n :empty-text=\"t('page.runs-empty')\"\n @state-change=\"load\"\n >\n <template #cell-created_at=\"{ row }\"><wx-date :value=\"row.created_at\" /></template>\n <template #cell-scope=\"{ row }\">{{ t(`page.scope-${row.scope}`) }}</template>\n <template #cell-status=\"{ row }\">\n <wx-badge :type=\"statuses[row.status]\" dot>{{\n t(`page.status-${row.status}`)\n }}</wx-badge>\n </template>\n <template #cell-health=\"{ row }\">{{\n row.counts ? `${row.counts.health}%` : ''\n }}</template>\n <template #cell-severity=\"{ row }\">\n <span v-if=\"row.counts\" class=\"wx-audit-runs__counts\">\n <template v-for=\"(type, key) in severities\" :key=\"key\">\n <wx-badge v-if=\"row.counts.severity[key]\" :type=\"type\" size=\"sm\">{{\n row.counts.severity[key]\n }}</wx-badge>\n </template>\n </span>\n </template>\n <template #cell-started_by=\"{ row }\">{{ who(row) }}</template>\n </wx-table>\n </wx-card>\n\n <wx-text v-if=\"!pair\" size=\"sm\" tone=\"muted\">{{ t('page.compare-help') }}</wx-text>\n\n <wx-card v-else :title=\"t('page.compare')\">\n <wx-text v-if=\"comparison\" size=\"sm\" tone=\"muted\" class=\"wx-audit-runs__pair\">\n {{ t('page.compare-from') }} #{{ comparison.from.id }} ·\n <wx-date :value=\"comparison.from.created_at\" /> → {{ t('page.compare-to') }} #{{\n comparison.to.id\n }}\n · <wx-date :value=\"comparison.to.created_at\" />\n </wx-text>\n\n <wx-alert\n v-if=\"scopesDiffer\"\n type=\"info\"\n :description=\"t('page.compare-scopes')\"\n class=\"wx-audit-runs__note\"\n />\n\n <wx-table\n v-model:expanded=\"expanded\"\n :data=\"comparison?.checks ?? []\"\n :columns=\"compareColumns\"\n row-key=\"check\"\n expandable\n flush\n :pagination=\"false\"\n :loading=\"comparing\"\n :empty-text=\"t('page.compare-none')\"\n >\n <template #cell-severity=\"{ row }\">\n <wx-badge :type=\"severities[row.severity]\" dot>{{\n t(`page.severity-${row.severity}`)\n }}</wx-badge>\n </template>\n <template #cell-new=\"{ row }\">\n <wx-text :tone=\"row.new ? 'danger' : 'muted'\" size=\"sm\">{{ row.new }}</wx-text>\n </template>\n <template #cell-fixed=\"{ row }\">\n <wx-text :tone=\"row.fixed ? 'success' : 'muted'\" size=\"sm\">{{ row.fixed }}</wx-text>\n </template>\n <template #expanded=\"{ row }\">\n <audit-compare-issues\n v-if=\"comparison\"\n :from=\"comparison.from.id\"\n :to=\"comparison.to.id\"\n :row=\"row\"\n />\n </template>\n </wx-table>\n </wx-card>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-runs {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n min-width: 0;\n}\n\n.wx-audit-runs__counts {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--wx-space-4);\n}\n\n.wx-audit-runs__pair {\n display: block;\n margin-bottom: var(--wx-space-12);\n}\n\n.wx-audit-runs__note {\n margin-bottom: var(--wx-space-12);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxScreen } from '@webx-ui/module-admin'\nimport { toast, WxActionBar, WxButton, WxSkeleton } from '@webx-ui/core'\nimport type { ScreenModel } from '@webx-ui/schema'\nimport AuditLayout from './AuditLayout.vue'\nimport { createAuditApi } from './api'\nimport { useAuditMessages } from './i18n'\n\n/**\n * The section's settings (§8): where the site is and which hosts are its stands, the limits of\n * the crawl and the paths it leaves out, the thresholds, the nightly run and how much history\n * to keep. The form is the screen the server describes (`audit.settings`), so a project patches\n * a field in the way it does everywhere else; saving is this page's own.\n */\nconst props = defineProps<{ base: string }>()\n\nconst context = useAdmin()\nconst api = createAuditApi(context)\nuseAuditMessages()\n\nconst t = useTranslate('webx-audit')\nconst message = useErrorText()\n\nconst values = ref<ScreenModel>({})\nconst errors = ref<Record<string, string[]>>({})\nconst loading = ref(true)\nconst saving = ref(false)\n\n// A boolean, not a computed: the permissions do not change while the screen is open.\nconst canManage = context.can('audit.manage')\n\nonMounted(async () => {\n try {\n values.value = (await api.settings()) as ScreenModel\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n})\n\nasync function save(): Promise<void> {\n saving.value = true\n errors.value = {}\n\n try {\n values.value = (await api.saveSettings(values.value)) as ScreenModel\n toast.success(t('page.saved'))\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) errors.value = body.errors\n\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <audit-layout :base=\"props.base\" current=\"settings\" :card=\"false\">\n <div class=\"wx-audit-settings\">\n <wx-skeleton v-if=\"loading\" :rows=\"6\" />\n <wx-screen\n v-else\n v-model=\"values\"\n name=\"audit.settings\"\n :errors=\"errors\"\n :disabled=\"!canManage\"\n />\n\n <wx-action-bar v-if=\"canManage && !loading\">\n <wx-button type=\"primary\" :loading=\"saving\" @click=\"save\">{{ t('page.save') }}</wx-button>\n </wx-action-bar>\n </div>\n </audit-layout>\n</template>\n\n<style scoped>\n.wx-audit-settings {\n display: flex;\n flex-direction: column;\n gap: var(--wx-gap, var(--wx-space-16));\n}\n</style>\n","import type { AdminModule } from '@webx-ui/module-admin'\nimport AuditHostsPage from './AuditHostsPage.vue'\nimport AuditIssuesPage from './AuditIssuesPage.vue'\nimport AuditOverviewPage from './AuditOverviewPage.vue'\nimport AuditPagesPage from './AuditPagesPage.vue'\nimport AuditRunsPage from './AuditRunsPage.vue'\nimport AuditSettingsPage from './AuditSettingsPage.vue'\n\nexport interface AuditOptions {\n /** Where the section lives inside the panel. */\n path?: string\n /**\n * @deprecated The audit's settings are a view of the section itself (`<path>/settings`); the\n * option is read by nothing and stays only so that a panel which passed it still compiles.\n */\n settingsPath?: string\n}\n\n/**\n * «System → Audit» as a section of the panel: the overview of the last run, its findings, the\n * pages the last full run crawled, the hosts the site points at, the history of runs with two of\n * them compared, and the section's settings.\n *\n * The id matches the module the server reports, which is what makes the entry appear in the\n * navigation: the section shows up when both halves are installed.\n */\nexport function audit(options: AuditOptions = {}): AdminModule {\n const path = options.path ?? '/audit'\n const props = { base: path }\n\n return {\n id: 'audit',\n path,\n routes: [\n { path, name: 'webx.audit', component: AuditOverviewPage, props },\n { path: `${path}/issues`, name: 'webx.audit.issues', component: AuditIssuesPage, props },\n { path: `${path}/pages`, name: 'webx.audit.pages', component: AuditPagesPage, props },\n { path: `${path}/hosts`, name: 'webx.audit.hosts', component: AuditHostsPage, props },\n { path: `${path}/runs`, name: 'webx.audit.runs', component: AuditRunsPage, props },\n {\n path: `${path}/settings`,\n name: 'webx.audit.settings',\n component: AuditSettingsPage,\n props,\n },\n ],\n }\n}\n"],"names":["pageParams","query","params","filter","createAuditApi","admin","base","data","body","filters","id","scope","urls","run","columns","key","value","issue","fix","dryRun","to","from","rule","values","auditMessages","seeded","useAuditMessages","i18n","useAdmin","props","__props","api","t","useTranslate","message","useErrorText","router","useRouter","places","ref","failure","onMounted","error","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_unref","WxText","_Fragment","_hoisted_2","_createVNode","place","index","WxLink","_createTextVNode","_toDisplayString","WxBadge","_hoisted_3","field","WxButton","WxSkeleton","context","route","useRoute","title","computed","module","views","actions","where","next","path","WxListScreen","$event","_renderSlot","_ctx","panel","answer","loading","search","hostClass","expanded","classes","classOptions","pick","load","toast","watch","AuditLayout","WxTable","row","WxSelect","_cache","_withCtx","_createElementVNode","WxDate","AuditHostPlaces","statusType","code","cell","column","yesNo","text","_renderList","_hoisted_4","emit","__emit","open","_useModel","offers","applying","apply","offer","edit","url","now","WxDialog","change","_hoisted_5","_hoisted_6","_hoisted_7","pattern","reason","count","saving","timer","pathOf","parsed","ready","preview","hide","WxFormItem","WxInput","WxTextarea","can","issues","more","page","fixing","dialog","hiding","hideDialog","hidden","one","unhide","why","fixed","_normalizeClass","AuditDetails","AuditFixDialog","AuditHideDialog","checks","severity","group","state","filtersCount","types","severityOptions","groupOptions","stateOptions","WxPopover","AuditIssueList","POLL_MS","latest","starting","canRun","active","done","counts","scopes","severities","parts","healthStatus","health","GROUPS","groups","bySeverity","stageLabel","start","cancel","onBeforeUnmount","WxAlert","WxCard","WxProgress","WxSegmented","WxEmpty","WxStatistic","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","source","_hoisted_12","viewable","recheck","rechecking","startRecheck","card","follow","compareRecheck","tab","links","linksLoading","resources","resourcesLoading","resourceTabs","tabs","resourceTab","hostTypes","linkColumns","resourceColumns","pretty","size","kb","facts","alternate","block","label","loadLinks","loadResources","current","WxDrawer","WxTabs","tag","name","_hoisted_13","_hoisted_14","_hoisted_15","WxImage","WxIcon","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","type","item","position","_hoisted_20","_hoisted_21","PAGE_FIELDS","DEFAULT_COLUMNS","COMPUTED_FIELDS","OPERATIONS","WITH_VALUE","SOURCES","STORAGE","dates","useDates","opened","titles","status","indexable","check","last","visible","restore","saved","known","keys","fields","columnOptions","filterFields","statusOptions","indexableOptions","checkOptions","complete","operations","op","addFilter","setField","at","setOp","setValue","removeFilter","_","setColumns","download","WxCheckboxGroup","AuditPageCard","KINDS","kind","options","runs","selected","comparison","comparing","statuses","compareColumns","pair","ids","a","b","scopesDiffer","who","compare","AuditCompareIssues","errors","canManage","save","WxScreen","WxActionBar","audit","AuditOverviewPage","AuditIssuesPage","AuditPagesPage","AuditHostsPage","AuditRunsPage","AuditSettingsPage"],"mappings":"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"}