/* ai-export.jsx — Phase-0 AI integration layer (client-side, pure functions on window).
   Generates the machine-readable design-system bundle entirely in the browser from the
   in-memory globals (TOKENS / COMPONENTS / COPY / GLOSSARY / ASSETS …) as STRINGS — no
   server. Reuses ioBuildTree / ioDownload from token-io.jsx for the canonical tokens.json.

   Every export fn takes an `opts` scope object:
     { publishedOnly:bool, includeDrafts:bool, themes:[themeIds] }
   • publishedOnly  → drop draft/deprecated records (tokens not 'published'/'modified'/'renamed';
                      components that are 'deprecated'; copy/assets that aren't 'published').
   • includeDrafts  → keep component records whose hasDraft===true (otherwise they're filtered
                      when publishedOnly is on).
   • themes         → which theme ids appear in the resolved table (default: all). */

/* ---------- scope helpers ---------- */
function aiOpts(opts) {
  const o = opts || {};
  const allThemes = (typeof THEMES !== 'undefined' ? THEMES : []).map(t => t.id);
  return {
    publishedOnly: !!o.publishedOnly,
    includeDrafts: o.includeDrafts !== false, // default true (drafts visible unless turned off)
    themes: (o.themes && o.themes.length) ? o.themes.filter(id => allThemes.includes(id)) : allThemes,
  };
}
/* a token is "shippable" unless deprecated; under publishedOnly we keep only settled tokens */
function aiTokenOk(tk, o) {
  if (!o.publishedOnly) return tk.status !== 'deprecated' ? true : o.includeDrafts;
  return tk.status === 'published' || tk.status === 'modified' || tk.status === 'renamed';
}
function aiScopedTokens(o) { return (typeof TOKENS !== 'undefined' ? TOKENS : []).filter(tk => aiTokenOk(tk, o)); }
function aiScopedThemes(o) { return (typeof THEMES !== 'undefined' ? THEMES : []).filter(t => o.themes.includes(t.id)); }

/* ---------- 1. tokens.json (canonical DTCG via ioBuildTree) ---------- */
function aiTokensJSON(opts) {
  const o = aiOpts(opts);
  const tokens = aiScopedTokens(o);
  const themes = aiScopedThemes(o);
  const baseTheme = themes[0] || (typeof THEMES !== 'undefined' ? THEMES[0] : { id: 'base', accent: {} });
  /* canonical tree from the shared exporter — light mode, first in-scope theme */
  const tree = ioBuildTree(tokens, { theme: baseTheme, mode: 'light' });

  /* top-level $themes list (DTCG-flavored brand themes) — carries each brand's sparse
     per-token override map so AI consumers / the MCP can resolve brand-pinned values. */
  tree.$themes = themes.map(t => ({ id: t.id, name: t.name, line: t.line, accent: t.accent, overrides: t.overrides || {} }));

  /* resolved map per theme/mode for theme-variant tokens (accent-derived + mode-aware).
     We only include tokens whose concrete value actually changes across theme/mode so the
     table stays small and useful to an agent. */
  /* token ids pinned by ANY brand's override map — these diverge across themes too,
     even if their base source is theme-invariant, so include them in the resolved table. */
  const ovIds = new Set();
  (typeof THEMES !== 'undefined' ? THEMES : []).forEach(t => { if (t.overrides) Object.keys(t.overrides).forEach(id => ovIds.add(id)); });
  const variant = tokens.filter(tk => {
    const s = tk.source || {};
    return s.type === 'themeAccent' || s.type === 'modeRef' || aiResolvesToVariant(tk) || ovIds.has(tk.id);
  });
  const resolved = {};
  themes.forEach(t => {
    resolved[t.id] = {};
    ['light', 'dark'].forEach(mode => {
      const m = {};
      variant.forEach(tk => { const r = resolve(tk.id, { theme: t, mode }); if (r.value != null) m[tk.id] = r.value; });
      resolved[t.id][mode] = m;
    });
  });
  tree.resolved = resolved;

  return JSON.stringify(tree, null, 2);
}
/* does this token transitively depend on a themeAccent / modeRef source? (so it varies) */
function aiResolvesToVariant(tk, _seen) {
  const seen = _seen || [];
  const s = tk.source; if (!s || seen.includes(tk.id)) return false;
  if (s.type === 'themeAccent' || s.type === 'modeRef') return true;
  if (s.type === 'ref') { const nx = TOKEN_MAP[s.ref]; return nx ? aiResolvesToVariant(nx, seen.concat(tk.id)) : false; }
  return false;
}

/* ---------- 2. components.json ---------- */
function aiComponentOk(c, o) {
  if (!o.publishedOnly) return o.includeDrafts || !c.hasDraft;
  return c.status !== 'deprecated';
}
function aiComponentsJSON(opts) {
  const o = aiOpts(opts);
  const list = (typeof COMPONENTS !== 'undefined' ? COMPONENTS : []).filter(c => aiComponentOk(c, o)).map(c => ({
    id: c.id,
    name: c.name,
    nameZh: c.nameZh,
    category: c.category,
    status: c.status,
    caution: !!c.caution,
    cautionReason: c.caution ? c.cautionReason : undefined,
    summary: c.summary,
    summaryZh: c.summaryZh,
    overview: c.overview,
    usage: { do: c.dos || [], dont: c.donts || [] },
    tags: c.tags || [],
    tokensUsed: (typeof COMPONENT_CONSUMES !== 'undefined' ? COMPONENT_CONSUMES[c.id] : undefined) || undefined,
    version: c.version,
  }));
  return JSON.stringify(list, null, 2);
}

/* ---------- 3. copy.json ---------- */
function aiCopyOk(c, o) { return o.publishedOnly ? c.status === 'published' : (o.includeDrafts || c.status === 'published'); }
function aiCopyJSON(opts) {
  const o = aiOpts(opts);
  const list = (typeof COPY !== 'undefined' ? COPY : []).filter(c => aiCopyOk(c, o)).map(c => ({
    key: c.key, surface: c.surface, en: c.en, zh: c.zh,
    context: c.context || '', contextZh: c.contextZh || '',
    componentId: c.componentId || null, iconId: c.iconId || null,
    themes: c.themes || ['all'],
    good: c.good || '', bad: c.bad || '', status: c.status,
  }));
  return JSON.stringify(list, null, 2);
}

/* ---------- 4. glossary.json ---------- */
function aiGlossaryJSON(opts) {
  const o = aiOpts(opts);
  const list = (typeof GLOSSARY !== 'undefined' ? GLOSSARY : []).filter(g => !o.publishedOnly || g.status === 'published').map(g => ({
    id: g.id, term: g.term, termZh: g.termZh,
    def: g.def || '', defZh: g.defZh || '',
    category: g.category, preferred: g.preferred !== false,
    avoid: g.avoid || [], themes: g.themes || ['all'],
  }));
  return JSON.stringify(list, null, 2);
}

/* ---------- 5. icons.json (built-in glyphs have no raw SVG; note that) ---------- */
function aiIconsJSON(opts) {
  const o = aiOpts(opts);
  const list = (typeof ASSETS !== 'undefined' ? ASSETS : [])
    .filter(a => a.type === 'icon')
    .filter(a => !o.publishedOnly || a.status === 'published')
    .map(a => {
      const lbl = (typeof copyForIcon !== 'undefined') ? copyForIcon(a.id) : null;
      return {
        id: a.id, type: 'icon', category: a.category,
        glyph: a.icon, keywords: a.keywords || [],
        label: lbl ? lbl.en : undefined, labelZh: lbl ? lbl.zh : undefined,
        usage: lbl ? lbl.context : (a.desc || ''),
        usedBy: a.usedBy || [], status: a.status,
        note: a.uploaded ? undefined : 'Built-in React glyph — raw SVG not in bundle; render via <Icon name="' + a.icon + '"/> or the icon library.',
      };
    });
  return JSON.stringify(list, null, 2);
}

/* ---------- bundle version stamp ---------- */
function aiVersion() {
  const cycle = (typeof SESSION !== 'undefined' && SESSION.cycle) || '—';
  const hist = (typeof CHANGE_HISTORY !== 'undefined' ? CHANGE_HISTORY : []);
  const latest = hist.length ? hist[0].date : null;
  return { cycle, date: latest, branch: (typeof SESSION !== 'undefined' ? SESSION.branch : '') };
}

/* ---------- 6. AGENTS.md ---------- */
function aiAgentsMd(opts) {
  const o = aiOpts(opts);
  const v = aiVersion();
  const nTokens = aiScopedTokens(o).length;
  const nComps = (typeof COMPONENTS !== 'undefined' ? COMPONENTS : []).filter(c => aiComponentOk(c, o)).length;
  const nCopy = (typeof COPY !== 'undefined' ? COPY : []).filter(c => aiCopyOk(c, o)).length;
  const nTerms = (typeof GLOSSARY !== 'undefined' ? GLOSSARY : []).filter(g => !o.publishedOnly || g.status === 'published').length;
  const nIcons = (typeof ASSETS !== 'undefined' ? ASSETS : []).filter(a => a.type === 'icon' && (!o.publishedOnly || a.status === 'published')).length;
  const product = (typeof SESSION !== 'undefined' ? SESSION.product : 'SiCARRIER UI');
  const themeNames = aiScopedThemes(o).map(t => t.name).join(', ');

  return `# AGENTS.md — ${product} Design System

> Machine-readable contract for AI coding agents building on the **${product}** design system.
> Bundle version: **${v.cycle}** · latest release ${v.date || 'n/a'} · scope: ${o.publishedOnly ? 'published only' : 'all (incl. drafts)'}.

## What this is

${product} is a three-tier design system: **primitive → semantic → component** tokens, a documented
bilingual (EN / 中文) component catalog, a controlled UX-writing vocabulary, and an icon library.
This bundle is the source of truth an agent should consult **before** writing UI code, so the output
matches the system instead of inventing one-off values.

This bundle contains:

| File | What it holds |
| --- | --- |
| \`tokens.json\` | Canonical **DTCG** token tree (\`$type\`/\`$value\`/\`$extensions\`). Includes a top-level \`$themes\` list (${themeNames || 'brand themes'}) and a \`resolved\` map of theme/mode → token → concrete value for theme-variant tokens. ${nTokens} tokens. |
| \`components.json\` | ${nComps} components: \`{ id, name, status, caution, summary, overview, usage:{do,dont}, tokensUsed }\`. |
| \`copy.json\` | ${nCopy} canonical UI strings (EN + 中文) with surface, context, and good/avoid examples. |
| \`glossary.json\` | ${nTerms} controlled-vocabulary terms — preferred form + synonyms to avoid. |
| \`icons.json\` | ${nIcons} icons with glyph name + keywords + standard label. Pick by keyword/meaning. |
| \`AGENTS.md\` | This file. |
| \`llms.txt\` | A short index of the above. |

## Rules an agent MUST follow

1. **Use semantic tokens, never raw hex.** Reference tokens like \`color.accent.default\`,
   \`color.text.primary\`, \`spacing.inset.md\`, \`radius.control\`. Do not paste hex colors,
   pixel literals, or shadow strings that duplicate a token. If you need a value, look it up in
   \`tokens.json\` (or resolve it via the \`resolve_token\` MCP tool).
2. **Prefer semantic over primitive.** Primitives (\`color.gray.500\`, \`space.400\`) exist to feed
   semantics. Consume the semantic/component layer; reach for a primitive only when no semantic fits.
3. **Respect component status.** Use \`stable\` components freely; treat \`beta\` as subject to change;
   **never introduce a \`deprecated\` component** into new code.
4. **Heed \`caution\` components.** A component flagged \`caution:true\` has a high blast radius
   (e.g. Button, Modal). Changing its API/tokens ripples across products — don't.
5. **Use the canonical copy strings.** When a UI string exists in \`copy.json\` for the surface you're
   building (button, empty-state, error, toast…), use that exact EN/中文 text — don't paraphrase.
6. **Follow the glossary.** Use each term's **preferred** form and never the strings in its \`avoid\`
   list (e.g. "Allowlist" not "Whitelist", "Discard" not "Cancel", "Run" not "Start").
7. **Pick icons by keyword.** Search \`icons.json\` by \`keywords\` for the meaning you need; reference
   the \`glyph\` name. Built-in glyphs have no raw SVG in the bundle — render them via the icon library.
8. **Theme awareness.** Token values that derive from a brand accent or from light/dark mode appear in
   \`tokens.json → resolved[theme][mode]\`. Resolve against the active theme + mode; don't hardcode.

## How to consume this bundle

**Route A — files in your repo.** Drop this folder (e.g. \`design-system/\`) into your project and add
\`AGENTS.md\` at the root (or point your agent's instructions at it). The agent reads the JSON files
directly to look up tokens, components, copy, vocabulary, and icons.

**Route B — MCP server (live tools).** Run the bundled \`sicarrier-mcp.js\` over stdio and register it:

\`\`\`bash
npm i @modelcontextprotocol/sdk zod
claude mcp add sicarrier --env SICARRIER_DIR=/abs/path/to/design-system -- node /abs/path/to/sicarrier-mcp.js
\`\`\`

It reads this same bundle directory and exposes tools: \`resolve_token\`, \`get_component\`,
\`search_components\`, \`get_copy\`, \`search_glossary\`, \`find_icon\`, and \`lint_against_system\`
(flags raw hex + deprecated components). A hosted/URL variant follows once the system has server-side
persistence.

---
*Generated client-side from the live design-system data. Re-export after any change to refresh.*
`;
}

/* ---------- 7. llms.txt ---------- */
function aiLlmsTxt(opts) {
  const o = aiOpts(opts);
  const v = aiVersion();
  const product = (typeof SESSION !== 'undefined' ? SESSION.product : 'SiCARRIER UI');
  return `# ${product} Design System

> Three-tier design tokens, a bilingual component catalog, a controlled UX-writing vocabulary,
> and an icon library. Bundle version ${v.cycle}${v.date ? ' (' + v.date + ')' : ''}.
> Read AGENTS.md first — it lists the rules for building on this system.

## Files
- [AGENTS.md](AGENTS.md): rules + how-to-consume contract for coding agents (start here).
- [tokens.json](tokens.json): canonical DTCG tokens + $themes + resolved theme/mode map.
- [components.json](components.json): component catalog (status, caution, do/dont, tokensUsed).
- [copy.json](copy.json): canonical UI strings (EN/中文) with context and good/avoid examples.
- [glossary.json](glossary.json): controlled vocabulary (preferred terms + synonyms to avoid).
- [icons.json](icons.json): icon library (glyph name + keywords + standard label).

## MCP
- sicarrier-mcp.js: stdio MCP server exposing resolve_token, get_component, search_components,
  get_copy, search_glossary, find_icon, lint_against_system. Reads this bundle via SICARRIER_DIR.
`;
}

/* ---------- 8. bundle object ---------- */
function aiBundle(opts) {
  return {
    'tokens.json': aiTokensJSON(opts),
    'components.json': aiComponentsJSON(opts),
    'copy.json': aiCopyJSON(opts),
    'glossary.json': aiGlossaryJSON(opts),
    'icons.json': aiIconsJSON(opts),
    'AGENTS.md': aiAgentsMd(opts),
    'llms.txt': aiLlmsTxt(opts),
  };
}

/* ---------- live counts (for the UI) ---------- */
function aiCounts(opts) {
  const o = aiOpts(opts);
  return {
    tokens: aiScopedTokens(o).length,
    components: (typeof COMPONENTS !== 'undefined' ? COMPONENTS : []).filter(c => aiComponentOk(c, o)).length,
    copy: (typeof COPY !== 'undefined' ? COPY : []).filter(c => aiCopyOk(c, o)).length,
    glossary: (typeof GLOSSARY !== 'undefined' ? GLOSSARY : []).filter(g => !o.publishedOnly || g.status === 'published').length,
    icons: (typeof ASSETS !== 'undefined' ? ASSETS : []).filter(a => a.type === 'icon' && (!o.publishedOnly || a.status === 'published')).length,
    themes: aiScopedThemes(o).length,
  };
}

/* ---------- download helpers (reuse the token-io ioDownload pattern) ---------- */
function downloadText(name, text, mime) {
  const blob = new Blob([text], { type: mime || 'text/plain;charset=utf-8' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url; a.download = name; document.body.appendChild(a); a.click();
  setTimeout(() => { URL.revokeObjectURL(url); a.remove(); }, 0);
}
const AI_MIME = {
  'tokens.json': 'application/json;charset=utf-8',
  'components.json': 'application/json;charset=utf-8',
  'copy.json': 'application/json;charset=utf-8',
  'glossary.json': 'application/json;charset=utf-8',
  'icons.json': 'application/json;charset=utf-8',
  'AGENTS.md': 'text/markdown;charset=utf-8',
  'llms.txt': 'text/plain;charset=utf-8',
};
/* download one named bundle file */
function downloadBundleFile(name, opts) {
  const bundle = aiBundle(opts);
  const text = name === 'sicarrier-mcp.js' ? SICARRIER_MCP_SOURCE : bundle[name];
  if (text == null) return;
  downloadText(name, text, name === 'sicarrier-mcp.js' ? 'text/javascript;charset=utf-8' : AI_MIME[name]);
}
/* download every bundle file sequentially, plus a combined single-file JSON */
function downloadAIBundle(opts) {
  const bundle = aiBundle(opts);
  const names = Object.keys(bundle);
  let i = 0;
  (function step() {
    if (i >= names.length) {
      // combined single-file JSON (json files parsed back to objects, md/txt kept as strings)
      const combined = {};
      names.forEach(n => { combined[n] = /\.json$/.test(n) ? JSON.parse(bundle[n]) : bundle[n]; });
      combined['_meta'] = { generatedAt: new Date().toISOString(), version: aiVersion() };
      downloadText('sicarrier-design-system.json', JSON.stringify(combined, null, 2), 'application/json;charset=utf-8');
      return;
    }
    const n = names[i++];
    downloadText(n, bundle[n], AI_MIME[n]);
    setTimeout(step, 120); // sequential a.click() so browsers don't drop downloads
  })();
}


/* ---------- the MCP server source, embedded (base64) so it survives as a string ----------
   Decoded at load time. Kept byte-identical to the standalone sicarrier-mcp.js file. */
const SICARRIER_MCP_B64 = [
  'IyEvdXNyL2Jpbi9lbnYgbm9kZQovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09',
  'PT09PT09PT09CiAqIHNpY2Fycmllci1tY3AuanMg4oCUIE1vZGVsIENvbnRleHQgUHJvdG9jb2wgc2VydmVyIGZvciB0aGUgU2lDQVJSSUVSIGRlc2lnbiBz',
  'eXN0ZW0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBB',
  'IHN0YW5kYWxvbmUgTm9kZSBwcm9ncmFtIChOT1QgYSBicm93c2VyL2JhYmVsIHNjcmlwdCkuIEl0IHJlYWRzIHRoZSBleHBvcnRlZAogKiBkZXNpZ24tc3lz',
  'dGVtIGJ1bmRsZSAodGhlIGZpbGVzIHRoZSBhZG1pbiAiQUkgaW50ZWdyYXRpb24iIHBhZ2UgZG93bmxvYWRzKSBmcm9tCiAqIGEgZGlyZWN0b3J5IGFuZCBl',
  'eHBvc2VzIHRoZW0gdG8gY29kaW5nIGFnZW50cyBhcyBNQ1AgdG9vbHMgb3ZlciBzdGRpby4KICoKICogSU5TVEFMTAogKiAgIG5wbSBpIEBtb2RlbGNvbnRl',
  'eHRwcm90b2NvbC9zZGsgem9kCiAqCiAqIFJVTiAocG9pbnQgaXQgYXQgdGhlIGZvbGRlciBob2xkaW5nIHRoZSBleHBvcnRlZCBidW5kbGUgSlNPTiBmaWxl',
  'cykKICogICBTSUNBUlJJRVJfRElSPS4vZGVzaWduLXN5c3RlbSBub2RlIHNpY2Fycmllci1tY3AuanMKICoKICogUkVHSVNURVIgV0lUSCBDTEFVREUgQ09E',
  'RQogKiAgIGNsYXVkZSBtY3AgYWRkIHNpY2FycmllciAtLWVudiBTSUNBUlJJRVJfRElSPS9hYnMvcGF0aC90by9kZXNpZ24tc3lzdGVtIC0tIG5vZGUgL2Fi',
  'cy9wYXRoL3RvL3NpY2Fycmllci1tY3AuanMKICoKICogRVhQRUNURUQgRklMRVMgSU4gU0lDQVJSSUVSX0RJUiAoZG93bmxvYWQgdGhlbSBmcm9tIHRoZSBh',
  'ZG1pbiBwYWdlKQogKiAgIHRva2Vucy5qc29uIMK3IGNvbXBvbmVudHMuanNvbiDCtyBjb3B5Lmpzb24gwrcgZ2xvc3NhcnkuanNvbiDCtyBpY29ucy5qc29u',
  'CiAqICAgKEFHRU5UUy5tZCBhbmQgbGxtcy50eHQgYXJlIGFsc28gd3JpdHRlbiB0aGVyZSBidXQgYXJlIHJlYWQgYnkgdGhlIGFnZW50LCBub3QgdGhpcyBz',
  'ZXJ2ZXIuKQogKgogKiBUT09MUwogKiAgIHJlc29sdmVfdG9rZW4gICAgICAgIOKAlCByZXNvbHZlIGEgdG9rZW4gaWQgdG8gYSBjb25jcmV0ZSB2YWx1ZSAo',
  'dGhlbWUgKyBtb2RlIGF3YXJlKQogKiAgIGdldF9jb21wb25lbnQgICAgICAgIOKAlCBmdWxsIHJlY29yZCBmb3Igb25lIGNvbXBvbmVudCBpZAogKiAgIHNl',
  'YXJjaF9jb21wb25lbnRzICAgIOKAlCBmdXp6eSBzZWFyY2ggY29tcG9uZW50cywgb3B0aW9uYWwgc3RhdHVzIGZpbHRlcgogKiAgIGdldF9jb3B5ICAgICAg',
  'ICAgICAgIOKAlCB0aGUgY2Fub25pY2FsIFVJIHN0cmluZyBmb3IgYSBjb3B5IGtleQogKiAgIHNlYXJjaF9nbG9zc2FyeSAgICAgIOKAlCBmaW5kIHByZWZl',
  'cnJlZCB2b2NhYnVsYXJ5IC8gYmFubmVkIHN5bm9ueW1zCiAqICAgZmluZF9pY29uICAgICAgICAgICAg4oCUIGZpbmQgYW4gaWNvbiBieSBrZXl3b3JkIC8g',
  'bmFtZQogKiAgIGxpbnRfYWdhaW5zdF9zeXN0ZW0gIOKAlCBzY2FuIGEgY29kZSBzbmlwcGV0IGZvciByYXcgaGV4ICsgZGVwcmVjYXRlZCBjb21wb25lbnQg',
  'aWRzCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCmltcG9y',
  'dCB7IE1jcFNlcnZlciB9IGZyb20gJ0Btb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL21jcC5qcyc7CmltcG9ydCB7IFN0ZGlvU2VydmVyVHJhbnNw',
  'b3J0IH0gZnJvbSAnQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvc3RkaW8uanMnOwppbXBvcnQgeyB6IH0gZnJvbSAnem9kJzsKaW1wb3J0IHsg',
  'cmVhZEZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7CmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnOwoKY29uc3QgRElSID0gcHJvY2Vzcy5lbnYu',
  'U0lDQVJSSUVSX0RJUiB8fCAnLi9kZXNpZ24tc3lzdGVtJzsKCi8qIC0tLS0gbG9hZCB0aGUgYnVuZGxlIChmYWlsIHNvZnQ6IGEgbWlzc2luZyBmaWxlIGp1',
  'c3QgeWllbGRzIGFuIGVtcHR5IHNldCkgLS0tLSAqLwpmdW5jdGlvbiBsb2FkKG5hbWUsIGZhbGxiYWNrKSB7CiAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2Uo',
  'cmVhZEZpbGVTeW5jKGpvaW4oRElSLCBuYW1lKSwgJ3V0ZjgnKSk7IH0KICBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKGBbc2ljYXJyaWVyLW1jcF0gY291',
  'bGQgbm90IHJlYWQgJHtuYW1lfSBmcm9tICR7RElSfTogJHtlLm1lc3NhZ2V9YCk7IHJldHVybiBmYWxsYmFjazsgfQp9CmNvbnN0IHRva2Vuc0RvYyA9IGxv',
  'YWQoJ3Rva2Vucy5qc29uJywge30pOyAgICAgICAgICAgLy8gY2Fub25pY2FsIERUQ0cgdHJlZSAoKyAkdGhlbWVzIC8gcmVzb2x2ZWQpCmNvbnN0IGNvbXBv',
  'bmVudHMgPSBsb2FkKCdjb21wb25lbnRzLmpzb24nLCBbXSk7CmNvbnN0IGNvcHkgPSBsb2FkKCdjb3B5Lmpzb24nLCBbXSk7CmNvbnN0IGdsb3NzYXJ5ID0g',
  'bG9hZCgnZ2xvc3NhcnkuanNvbicsIFtdKTsKY29uc3QgaWNvbnMgPSBsb2FkKCdpY29ucy5qc29uJywgW10pOwoKLyogLS0tLSBmbGF0dGVuIHRoZSBEVENH',
  'IHRva2VuIHRyZWUgaW50byB7IGlkIC0+IGxlYWYgfSAobGVhZiBoYXMgJHZhbHVlLyR0eXBlLyRleHRlbnNpb25zKSAtLS0tICovCmZ1bmN0aW9uIGZsYXR0',
  'ZW5Ub2tlbnModHJlZSkgewogIGNvbnN0IG91dCA9IHt9OwogIChmdW5jdGlvbiB3YWxrKG5vZGUsIHBhdGgpIHsKICAgIGlmICghbm9kZSB8fCB0eXBlb2Yg',
  'bm9kZSAhPT0gJ29iamVjdCcpIHJldHVybjsKICAgIGlmICgnJHZhbHVlJyBpbiBub2RlKSB7IG91dFtwYXRoLmpvaW4oJy4nKV0gPSBub2RlOyByZXR1cm47',
  'IH0KICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhub2RlKSkgeyBpZiAoa1swXSA9PT0gJyQnKSBjb250aW51ZTsgd2Fsayhub2RlW2tdLCBwYXRo',
  'LmNvbmNhdChrKSk7IH0KICB9KSh0cmVlLCBbXSk7CiAgcmV0dXJuIG91dDsKfQpjb25zdCBUT0tFTlMgPSBmbGF0dGVuVG9rZW5zKHRva2Vuc0RvYyk7CmNv',
  'bnN0IFRIRU1FUyA9IEFycmF5LmlzQXJyYXkodG9rZW5zRG9jLiR0aGVtZXMpID8gdG9rZW5zRG9jLiR0aGVtZXMgOiBbXTsKY29uc3QgUkVTT0xWRUQgPSAo',
  'dG9rZW5zRG9jLnJlc29sdmVkICYmIHR5cGVvZiB0b2tlbnNEb2MucmVzb2x2ZWQgPT09ICdvYmplY3QnKSA/IHRva2Vuc0RvYy5yZXNvbHZlZCA6IHt9OwoK',
  'LyogLS0tLSByZS1pbXBsZW1lbnQgdG9rZW4gcmVzb2x1dGlvbiBmcm9tIHRoZSBleHBvcnRlZCBEVENHIChubyBhcHAgY29kZSBhdmFpbGFibGUpIC0tLS0K',
  'ICAgQSAkdmFsdWUgb2YgIntzb21lLnRva2VuLmlkfSIgaXMgYSByZWZlcmVuY2U7IHJlc29sdmUgaXQgYnkgZm9sbG93aW5nIHRoZSBjaGFpbi4gVGhlCiAg',
  'IGV4cG9ydGVyIGFsc28gZW1iZWRzIHRoZSBvcmlnaW5hbCBzb3VyY2UgdW5kZXIgJGV4dGVuc2lvbnNbJ2Rlc2lnbi5zaWNhcnJpZXInXS5zb3VyY2UsCiAg',
  'IHdoaWNoIGxldHMgdXMgaG9ub3VyIG1vZGVSZWYgKGxpZ2h0L2RhcmspIGFuZCB0aGVtZUFjY2VudCAocGVyLXRoZW1lIGFjY2VudCkgZXhhY3RseS4gKi8K',
  'ZnVuY3Rpb24gZXh0KGxlYWYpIHsgcmV0dXJuIChsZWFmICYmIGxlYWYuJGV4dGVuc2lvbnMgJiYgbGVhZi4kZXh0ZW5zaW9uc1snZGVzaWduLnNpY2Fycmll',
  'ciddKSB8fCB7fTsgfQpmdW5jdGlvbiByZWZPZihzdHIpIHsgY29uc3QgbSA9IC9eXHsoLispXH0kLy5leGVjKFN0cmluZyhzdHIgfHwgJycpLnRyaW0oKSk7',
  'IHJldHVybiBtID8gbVsxXSA6IG51bGw7IH0KCmZ1bmN0aW9uIHJlc29sdmVUb2tlbihpZCwgdGhlbWUsIG1vZGUsIHNlZW4pIHsKICBzZWVuID0gc2VlbiB8',
  'fCBbXTsKICBjb25zdCBsZWFmID0gVE9LRU5TW2lkXTsKICBpZiAoIWxlYWYpIHJldHVybiB7IHZhbHVlOiBudWxsLCBtaXNzaW5nOiB0cnVlLCBjaGFpbjog',
  'c2Vlbi5jb25jYXQoaWQpIH07CiAgaWYgKHNlZW4uaW5jbHVkZXMoaWQpKSByZXR1cm4geyB2YWx1ZTogbnVsbCwgY3ljbGU6IHRydWUsIGNoYWluOiBzZWVu',
  'LmNvbmNhdChpZCkgfTsKICBjb25zdCBjaGFpbiA9IHNlZW4uY29uY2F0KGlkKTsKICBjb25zdCBzcmMgPSBleHQobGVhZikuc291cmNlOwogIC8vIDEpIGhv',
  'bm91ciB0aGUgb3JpZ2luYWwgc291cmNlIHNoYXBlIHdoZW4gcHJlc2VudCAobW9zdCBwcmVjaXNlKQogIGlmIChzcmMpIHsKICAgIGlmIChzcmMudHlwZSA9',
  'PT0gJ3ZhbHVlJykgcmV0dXJuIHsgdmFsdWU6IHNyYy52YWx1ZSwgdHlwZTogbGVhZi4kdHlwZSwgY2hhaW4gfTsKICAgIGlmIChzcmMudHlwZSA9PT0gJ3Ro',
  'ZW1lQWNjZW50JykgewogICAgICBjb25zdCB0aCA9IFRIRU1FUy5maW5kKHQgPT4gdC5pZCA9PT0gdGhlbWUpIHx8IFRIRU1FU1swXTsKICAgICAgY29uc3Qg',
  'YWNjZW50ID0gdGggJiYgdGguYWNjZW50ID8gdGguYWNjZW50W3NyYy5zaGFkZV0gOiBudWxsOwogICAgICByZXR1cm4geyB2YWx1ZTogYWNjZW50LCB0eXBl',
  'OiBsZWFmLiR0eXBlLCBjaGFpbiB9OwogICAgfQogICAgaWYgKHNyYy50eXBlID09PSAncmVmJykgcmV0dXJuIHJlc29sdmVUb2tlbihzcmMucmVmLCB0aGVt',
  'ZSwgbW9kZSwgY2hhaW4pOwogICAgaWYgKHNyYy50eXBlID09PSAnbW9kZVJlZicpIHJldHVybiByZXNvbHZlVG9rZW4obW9kZSA9PT0gJ2RhcmsnID8gc3Jj',
  'LmRhcmsgOiBzcmMubGlnaHQsIHRoZW1lLCBtb2RlLCBjaGFpbik7CiAgfQogIC8vIDIpIGZhbGwgYmFjayB0byB0aGUgJHZhbHVlIChjb3VsZCBiZSBhIHty',
  'ZWZ9IG9yIGEgbGl0ZXJhbCkKICBjb25zdCByID0gcmVmT2YobGVhZi4kdmFsdWUpOwogIGlmIChyKSByZXR1cm4gcmVzb2x2ZVRva2VuKHIsIHRoZW1lLCBt',
  'b2RlLCBjaGFpbik7CiAgcmV0dXJuIHsgdmFsdWU6IGxlYWYuJHZhbHVlLCB0eXBlOiBsZWFmLiR0eXBlLCBjaGFpbiB9Owp9CgovKiAtLS0tIGhlbHBlcnMg',
  'LS0tLSAqLwpjb25zdCBub3JtID0gKHMpID0+IFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpLnRvTG93ZXJDYXNlKCk7CmZ1bmN0aW9uIGpzb25Db250ZW50',
  'KG9iaikgeyByZXR1cm4geyBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMikgfV0gfTsgfQoKLyog',
  'LS0tLSBzZXJ2ZXIgKyB0b29scyAtLS0tICovCmNvbnN0IHNlcnZlciA9IG5ldyBNY3BTZXJ2ZXIoeyBuYW1lOiAnc2ljYXJyaWVyLWRlc2lnbi1zeXN0ZW0n',
  'LCB2ZXJzaW9uOiAnMS4wLjAnIH0pOwoKc2VydmVyLnRvb2woJ3Jlc29sdmVfdG9rZW4nLAogICdSZXNvbHZlIGEgU2lDQVJSSUVSIGRlc2lnbiB0b2tlbiBp',
  'ZCB0byBpdHMgY29uY3JldGUgdmFsdWUgZm9yIGEgZ2l2ZW4gdGhlbWUgKyBtb2RlIChmb2xsb3dzIHJlZmVyZW5jZSBjaGFpbnMpLicsCiAgeyBpZDogei5z',
  'dHJpbmcoKS5kZXNjcmliZSgnVG9rZW4gaWQsIGUuZy4gY29sb3IuYWNjZW50LmRlZmF1bHQnKSwKICAgIHRoZW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCku',
  'ZGVzY3JpYmUoJ1RoZW1lIGlkIChkZWZhdWx0OiBmaXJzdCB0aGVtZSwgdXN1YWxseSBhdGxhcyknKSwKICAgIG1vZGU6IHouZW51bShbJ2xpZ2h0JywgJ2Rh',
  'cmsnXSkub3B0aW9uYWwoKS5kZXNjcmliZSgnQ29sb3IgbW9kZSAoZGVmYXVsdDogbGlnaHQpJykgfSwKICBhc3luYyAoeyBpZCwgdGhlbWUsIG1vZGUgfSkg',
  'PT4gewogICAgY29uc3QgdGggPSB0aGVtZSB8fCAoVEhFTUVTWzBdICYmIFRIRU1FU1swXS5pZCkgfHwgJ2F0bGFzJzsKICAgIGNvbnN0IG1kID0gbW9kZSB8',
  'fCAnbGlnaHQnOwogICAgLy8gcHJlZmVyIHRoZSBwcmVjb21wdXRlZCByZXNvbHZlZCB0YWJsZSB3aGVuIGF2YWlsYWJsZSAoY292ZXJzIHRoZW1lIHZhcmlh',
  'bnRzKQogICAgY29uc3QgcHJlID0gUkVTT0xWRURbdGhdICYmIFJFU09MVkVEW3RoXVttZF0gJiYgUkVTT0xWRURbdGhdW21kXVtpZF07CiAgICBjb25zdCBy',
  'ID0gcHJlICE9IG51bGwgPyB7IHZhbHVlOiBwcmUgfSA6IHJlc29sdmVUb2tlbihpZCwgdGgsIG1kKTsKICAgIGNvbnN0IGxlYWYgPSBUT0tFTlNbaWRdOwog',
  'ICAgcmV0dXJuIGpzb25Db250ZW50KHsKICAgICAgaWQsIHRoZW1lOiB0aCwgbW9kZTogbWQsCiAgICAgIHZhbHVlOiByLnZhbHVlLCB0eXBlOiBsZWFmID8g',
  'bGVhZi4kdHlwZSA6IG51bGwsCiAgICAgIGRlc2NyaXB0aW9uOiBsZWFmID8gbGVhZi4kZGVzY3JpcHRpb24gOiB1bmRlZmluZWQsCiAgICAgIGV4dGVuc2lv',
  'bnM6IGxlYWYgPyBleHQobGVhZikgOiB1bmRlZmluZWQsCiAgICAgIGNoYWluOiByLmNoYWluLCBtaXNzaW5nOiByLm1pc3NpbmcgfHwgZmFsc2UsIGN5Y2xl',
  'OiByLmN5Y2xlIHx8IGZhbHNlLAogICAgfSk7CiAgfSk7CgpzZXJ2ZXIudG9vbCgnZ2V0X2NvbXBvbmVudCcsCiAgJ0dldCB0aGUgZnVsbCBkb2N1bWVudGF0',
  'aW9uIHJlY29yZCBmb3Igb25lIGNvbXBvbmVudCBieSBpZCAoc3RhdHVzLCBjYXV0aW9uLCBzdW1tYXJ5LCBkby9kb250LCBvdmVydmlldykuJywKICB7IGlk',
  'OiB6LnN0cmluZygpLmRlc2NyaWJlKCdDb21wb25lbnQgaWQsIGUuZy4gYnV0dG9uJykgfSwKICBhc3luYyAoeyBpZCB9KSA9PiB7CiAgICBjb25zdCBjID0g',
  'Y29tcG9uZW50cy5maW5kKHggPT4geC5pZCA9PT0gbm9ybShpZCkpIHx8IGNvbXBvbmVudHMuZmluZCh4ID0+IG5vcm0oeC5uYW1lKSA9PT0gbm9ybShpZCkp',
  'OwogICAgaWYgKCFjKSByZXR1cm4ganNvbkNvbnRlbnQoeyBlcnJvcjogYE5vIGNvbXBvbmVudCAiJHtpZH0iLiBUcnkgc2VhcmNoX2NvbXBvbmVudHMuYCB9',
  'KTsKICAgIHJldHVybiBqc29uQ29udGVudChjKTsKICB9KTsKCnNlcnZlci50b29sKCdzZWFyY2hfY29tcG9uZW50cycsCiAgJ1NlYXJjaCBjb21wb25lbnRz',
  'IGJ5IG5hbWUgLyBzdW1tYXJ5IC8gdGFncy4gT3B0aW9uYWxseSBmaWx0ZXIgYnkgc3RhdHVzIChzdGFibGUgfCBiZXRhIHwgZGVwcmVjYXRlZCkuJywKICB7',
  'IHF1ZXJ5OiB6LnN0cmluZygpLmRlc2NyaWJlKCdGcmVlLXRleHQgcXVlcnknKSwKICAgIHN0YXR1czogei5lbnVtKFsnc3RhYmxlJywgJ2JldGEnLCAnZGVw',
  'cmVjYXRlZCddKS5vcHRpb25hbCgpIH0sCiAgYXN5bmMgKHsgcXVlcnksIHN0YXR1cyB9KSA9PiB7CiAgICBjb25zdCBxID0gbm9ybShxdWVyeSk7CiAgICBj',
  'b25zdCBoaXRzID0gY29tcG9uZW50cy5maWx0ZXIoYyA9PiB7CiAgICAgIGlmIChzdGF0dXMgJiYgYy5zdGF0dXMgIT09IHN0YXR1cykgcmV0dXJuIGZhbHNl',
  'OwogICAgICBjb25zdCBoYXkgPSBub3JtKFtjLmlkLCBjLm5hbWUsIGMubmFtZVpoLCBjLnN1bW1hcnksIChjLnRhZ3MgfHwgW10pLmpvaW4oJyAnKV0uam9p',
  'bignICcpKTsKICAgICAgcmV0dXJuICFxIHx8IGhheS5pbmNsdWRlcyhxKTsKICAgIH0pLm1hcChjID0+ICh7IGlkOiBjLmlkLCBuYW1lOiBjLm5hbWUsIHN0',
  'YXR1czogYy5zdGF0dXMsIGNhdXRpb246ICEhYy5jYXV0aW9uLCBzdW1tYXJ5OiBjLnN1bW1hcnkgfSkpOwogICAgcmV0dXJuIGpzb25Db250ZW50KHsgY291',
  'bnQ6IGhpdHMubGVuZ3RoLCByZXN1bHRzOiBoaXRzIH0pOwogIH0pOwoKc2VydmVyLnRvb2woJ2dldF9jb3B5JywKICAnR2V0IHRoZSBjYW5vbmljYWwgVUkg',
  'c3RyaW5nIChFTiArIOS4reaWhykgZm9yIGEgY29weSBrZXksIHdpdGggdXNhZ2UgY29udGV4dCBhbmQgZ29vZC9hdm9pZCBleGFtcGxlcy4nLAogIHsga2V5',
  'OiB6LnN0cmluZygpLmRlc2NyaWJlKCdDb3B5IGtleSwgZS5nLiBidXR0b24uc2F2ZScpIH0sCiAgYXN5bmMgKHsga2V5IH0pID0+IHsKICAgIGNvbnN0IGMg',
  'PSBjb3B5LmZpbmQoeCA9PiB4LmtleSA9PT0ga2V5KTsKICAgIGlmICghYykgcmV0dXJuIGpzb25Db250ZW50KHsgZXJyb3I6IGBObyBjb3B5IGtleSAiJHtr',
  'ZXl9Ii4gVHJ5IHNlYXJjaCBrZXlzIHZpYSB0aGUgY29weS5qc29uIGZpbGUuYCB9KTsKICAgIHJldHVybiBqc29uQ29udGVudChjKTsKICB9KTsKCnNlcnZl',
  'ci50b29sKCdzZWFyY2hfZ2xvc3NhcnknLAogICdTZWFyY2ggdGhlIGNvbnRyb2xsZWQgdm9jYWJ1bGFyeS4gUmV0dXJucyBwcmVmZXJyZWQgdGVybXMgYW5k',
  'IHRoZSBzeW5vbnltcyB0byBhdm9pZCAoYWxsb3dsaXN0IG5vdCB3aGl0ZWxpc3QsIGV0Yy4pLicsCiAgeyBxdWVyeTogei5zdHJpbmcoKS5kZXNjcmliZSgn',
  'RnJlZS10ZXh0IHF1ZXJ5ICh0ZXJtIG9yIG1lYW5pbmcpJykgfSwKICBhc3luYyAoeyBxdWVyeSB9KSA9PiB7CiAgICBjb25zdCBxID0gbm9ybShxdWVyeSk7',
  'CiAgICBjb25zdCBoaXRzID0gZ2xvc3NhcnkuZmlsdGVyKGcgPT4gewogICAgICBjb25zdCBoYXkgPSBub3JtKFtnLnRlcm0sIGcudGVybVpoLCBnLmRlZiwg',
  'Zy5kZWZaaCwgKGcuYXZvaWQgfHwgW10pLmpvaW4oJyAnKV0uam9pbignICcpKTsKICAgICAgcmV0dXJuICFxIHx8IGhheS5pbmNsdWRlcyhxKTsKICAgIH0p',
  'OwogICAgcmV0dXJuIGpzb25Db250ZW50KHsgY291bnQ6IGhpdHMubGVuZ3RoLCByZXN1bHRzOiBoaXRzIH0pOwogIH0pOwoKc2VydmVyLnRvb2woJ2ZpbmRf',
  'aWNvbicsCiAgJ0ZpbmQgYSBzeXN0ZW0gaWNvbiBieSBrZXl3b3JkLCBuYW1lLCBvciBjYXRlZ29yeS4gUmV0dXJucyB0aGUgZ2x5cGggbmFtZSArIGtleXdv',
  'cmRzIHNvIHlvdSBwaWNrIGJ5IG1lYW5pbmcuJywKICB7IHF1ZXJ5OiB6LnN0cmluZygpLmRlc2NyaWJlKCdLZXl3b3JkLCBlLmcuICJleHBvcnQiIG9yICJ0',
  'ZW1wZXJhdHVyZSInKSB9LAogIGFzeW5jICh7IHF1ZXJ5IH0pID0+IHsKICAgIGNvbnN0IHEgPSBub3JtKHF1ZXJ5KTsKICAgIGNvbnN0IGhpdHMgPSBpY29u',
  'cy5maWx0ZXIoaSA9PiB7CiAgICAgIGNvbnN0IGhheSA9IG5vcm0oW2kuaWQsIGkuaWNvbiwgaS5jYXRlZ29yeSwgKGkua2V5d29yZHMgfHwgW10pLmpvaW4o',
  'JyAnKV0uam9pbignICcpKTsKICAgICAgcmV0dXJuICFxIHx8IGhheS5pbmNsdWRlcyhxKTsKICAgIH0pLm1hcChpID0+ICh7IGlkOiBpLmlkLCBnbHlwaDog',
  'aS5pY29uLCBjYXRlZ29yeTogaS5jYXRlZ29yeSwga2V5d29yZHM6IGkua2V5d29yZHMsIGxhYmVsOiBpLmxhYmVsIH0pKTsKICAgIHJldHVybiBqc29uQ29u',
  'dGVudCh7IGNvdW50OiBoaXRzLmxlbmd0aCwgcmVzdWx0czogaGl0cyB9KTsKICB9KTsKCnNlcnZlci50b29sKCdsaW50X2FnYWluc3Rfc3lzdGVtJywKICAn',
  'U2NhbiBhIGNvZGUgc25pcHBldCBmb3IgZGVzaWduLXN5c3RlbSB2aW9sYXRpb25zOiByYXcgaGV4IGNvbG9ycyB0aGF0IGFyZSBub3QgaW4gdGhlIHRva2Vu',
  'IHNldCwgYW5kIHJlZmVyZW5jZXMgdG8gZGVwcmVjYXRlZCBjb21wb25lbnQgaWRzLiBSZXR1cm5zIGEgbGlzdCBvZiBmaW5kaW5ncy4nLAogIHsgY29kZTog',
  'ei5zdHJpbmcoKS5kZXNjcmliZSgnU291cmNlIGNvZGUgdG8gbGludCcpIH0sCiAgYXN5bmMgKHsgY29kZSB9KSA9PiB7CiAgICBjb25zdCBmaW5kaW5ncyA9',
  'IFtdOwogICAgLy8ga25vd24gY29uY3JldGUgdmFsdWVzIChyZXNvbHZlZCwgbGlnaHQsIGZpcnN0IHRoZW1lKSBzbyB3ZSBjYW4gc3VnZ2VzdCBhIHRva2Vu',
  'IGZvciBhIHJhdyBoZXgKICAgIGNvbnN0IHRoID0gKFRIRU1FU1swXSAmJiBUSEVNRVNbMF0uaWQpIHx8ICdhdGxhcyc7CiAgICBjb25zdCB2YWx1ZVRvVG9r',
  'ZW4gPSB7fTsKICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXMoVE9LRU5TKSkgewogICAgICBpZiAoVE9LRU5TW2lkXS4kdHlwZSAhPT0gJ2NvbG9y',
  'JykgY29udGludWU7CiAgICAgIGNvbnN0IHYgPSAoUkVTT0xWRURbdGhdICYmIFJFU09MVkVEW3RoXS5saWdodCAmJiBSRVNPTFZFRFt0aF0ubGlnaHRbaWRd',
  'KSB8fCByZXNvbHZlVG9rZW4oaWQsIHRoLCAnbGlnaHQnKS52YWx1ZTsKICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgdmFsdWVUb1Rva2VuW3Yu',
  'dG9Mb3dlckNhc2UoKV0gPSBpZDsKICAgIH0KICAgIC8vIDEpIHJhdyBoZXggY29sb3JzCiAgICBjb25zdCBoZXhSZSA9IC8jWzAtOWEtZkEtRl17Myw4fVxi',
  'L2c7CiAgICBsZXQgbTsKICAgIHdoaWxlICgobSA9IGhleFJlLmV4ZWMoY29kZSkpKSB7CiAgICAgIGNvbnN0IGhleCA9IG1bMF07CiAgICAgIGNvbnN0IHN1',
  'Z2dlc3Rpb24gPSB2YWx1ZVRvVG9rZW5baGV4LnRvTG93ZXJDYXNlKCldOwogICAgICBmaW5kaW5ncy5wdXNoKHsKICAgICAgICBydWxlOiAnbm8tcmF3LWhl',
  'eCcsIHNldmVyaXR5OiAnd2FybicsIG1hdGNoOiBoZXgsIGluZGV4OiBtLmluZGV4LAogICAgICAgIG1lc3NhZ2U6IHN1Z2dlc3Rpb24KICAgICAgICAgID8g',
  'YFJhdyBoZXggJHtoZXh9IGVxdWFscyB0b2tlbiB7JHtzdWdnZXN0aW9ufX0g4oCUIHVzZSB0aGUgc2VtYW50aWMgdG9rZW4gaW5zdGVhZC5gCiAgICAgICAg',
  'ICA6IGBSYXcgaGV4ICR7aGV4fSDigJQgcmVwbGFjZSB3aXRoIGEgc2VtYW50aWMgY29sb3IgdG9rZW4gKHNlZSB0b2tlbnMuanNvbikuYCwKICAgICAgfSk7',
  'CiAgICB9CiAgICAvLyAyKSBkZXByZWNhdGVkIGNvbXBvbmVudCBpZHMgKGJ5IGlkIG9yIGRpc3BsYXkgbmFtZSwgd29yZC1ib3VuZGFyeSBtYXRjaCkKICAg',
  'IGNvbnN0IGRlcHJlY2F0ZWQgPSBjb21wb25lbnRzLmZpbHRlcihjID0+IGMuc3RhdHVzID09PSAnZGVwcmVjYXRlZCcpOwogICAgZm9yIChjb25zdCBjIG9m',
  'IGRlcHJlY2F0ZWQpIHsKICAgICAgY29uc3QgbmFtZXMgPSBbYy5pZCwgYy5uYW1lXS5maWx0ZXIoQm9vbGVhbik7CiAgICAgIGZvciAoY29uc3QgbiBvZiBu',
  'YW1lcykgewogICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXFxiJyArIG4ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJykgKyAn',
  'XFxiJywgJ2dpJyk7CiAgICAgICAgaWYgKHJlLnRlc3QoY29kZSkpIHsKICAgICAgICAgIGZpbmRpbmdzLnB1c2goeyBydWxlOiAnbm8tZGVwcmVjYXRlZC1j',
  'b21wb25lbnQnLCBzZXZlcml0eTogJ2Vycm9yJywgbWF0Y2g6IG4sCiAgICAgICAgICAgIG1lc3NhZ2U6IGBDb21wb25lbnQgIiR7Yy5uYW1lfSIgaXMgZGVw',
  'cmVjYXRlZCDigJQgZG8gbm90IHVzZSBpdC5gIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4ganNvbkNv',
  'bnRlbnQoeyBvazogZmluZGluZ3MubGVuZ3RoID09PSAwLCBmaW5kaW5nQ291bnQ6IGZpbmRpbmdzLmxlbmd0aCwgZmluZGluZ3MgfSk7CiAgfSk7CgovKiAt',
  'LS0tIGJvb3QgLS0tLSAqLwpjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQoKTsKYXdhaXQgc2VydmVyLmNvbm5lY3QodHJhbnNw',
  'b3J0KTsKY29uc29sZS5lcnJvcihgW3NpY2Fycmllci1tY3BdIHJlYWR5IMK3IGRpcj0ke0RJUn0gwrcgJHtPYmplY3Qua2V5cyhUT0tFTlMpLmxlbmd0aH0g',
  'dG9rZW5zIMK3ICR7Y29tcG9uZW50cy5sZW5ndGh9IGNvbXBvbmVudHNgKTsK'
].join('');
function aiDecodeB64(b64) {
  // browser-safe UTF-8 base64 decode (atob → bytes → UTF-8 string)
  const bin = atob(b64);
  const bytes = new Uint8Array(bin.length);
  for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);
  return new TextDecoder("utf-8").decode(bytes);
}
const SICARRIER_MCP_SOURCE = aiDecodeB64(SICARRIER_MCP_B64);

Object.assign(window, {
  aiOpts, aiCounts, aiVersion,
  aiTokensJSON, aiComponentsJSON, aiCopyJSON, aiGlossaryJSON, aiIconsJSON,
  aiAgentsMd, aiLlmsTxt, aiBundle,
  downloadText, downloadBundleFile, downloadAIBundle,
  SICARRIER_MCP_SOURCE,
});
